WIFI之三:WIN MOBILE平台上的88W8688驱动

来源:互联网 发布:ubuntu恢复删除的文件 编辑:程序博客网 时间:2024/05/02 06:12
 

(1)缩写术语

OID-object identifier

SSID-service set identifier

BSS-basic service set

ESS-extended service set

RSSI-received signal strength indication

NIC-Network Interface Cards

NDIS-Network Driver Interface Specification

(2)WLAN接口层

      网络的驱动,无线和有线都是去填充NDIS的预留接口。关键函数如下:

(A),DriverEntry

      在wince下的任何网络驱动都要实现的函数有DriverEntry。在该函数中初始化一个NDIS_MINIPORT_CHARACTERISTICS变量。这是一个关键的变量,它的类型是一个结构体,并且具有很多函数指针的元素,几乎所有的adapter的功能函数都是通过这个变量来开放给NDIS来调用。接着就是用NdisMRegisterMiniport这个NDIS提供的函数来注册这个变量,其实就是相当于注册了一个adapter的driver了,在这个函数返回之前,上述结构体变量中的InitializeHandler函数指针(被赋值为MrvDrvInitialize)被调用,以用来初始化adapter设备(This routine will check medium support and call resource allocation and HW initialization routines to set up the staion.)

      DriverEntry只做了两件事:NdisMInitializeWrapper和NdisMRegisterMiniport。

      NdisMInitializeWrapper通知NDIS一个新的miniport正在初始化。NIC(网络接口卡)驱动在调用其他NdisXXX函数之前必须要先调用该函数。在这个函数中有一个out参数NdisWrapperHandle:in which NDIS returns a handle that represents itself。根据MS的操作习惯,可以知道这个HANDLE是要用来指示下面很多操作的。

      NdisMRegisterMiniport:每一个网卡驱动都必须用它自己提供的MiniportXXX函数来填充一个NDIS_MINIPORT_CHARACTERISTICS结构体变量。这个变量在注册的时候被拷贝到NDIS库的内部以存储,所以在注册以后,miniport driver不能改变它的handler函数。在注册完成,该函数返回之前会调用MiniportInitialize函数,也就是这里的MrvDrvInitialize,它的调用是在ndis库中被间接调用的。
(B),InitializeHandler

      InitializeHandler函数中最重要的就是分配一个Adapter变量的空间,并初始化该结构变量的元素,以后的操作几乎都是基于该变量进行的。

      MrvDrvInitialize:在这里第一个重要的函数就是If_Initialize【sdio_Initialization】,接口配置初始化函数,这里也就是对SDIO的配置与初始化。

      If_FirmwareDownload,这个就是要说的第二个重要的函数,从名字可以看出也是接口函数,这个就是SDIO的sdio_FirmwareDownload:通过SDIO接口下载了image到device。

      InitializeWirelessConfig:这个函数就不得不说了,从名字知道,这是对无线的初始配置。首先通过SDIO发送HostCmd_CMD_GET_HW_SPEC命令,并等待device的响应。这个命令应该是获取填充Adapter->PermanentAddr的值。接着是通过PrepareAndSendCommand来设置fragmentation threshold和RTS threshold。最后是通过PrepareAndSendCommand来设置对Mac的控制值,值为Adapter->CurrentMacControl(接收、发送、广播、多播)。

(C),InitSyncObjects

      这个函数进一步初始化了Adapter的元素,创建了一系列的事件和时间变量。最后创建了一个Adapter->hControllerInterruptThread控制器中断线程,该线程的主体是MrvIstThread函数。在此函数体中可以看到它等待的事件是pAdapter->hControllerInterruptEvent。这个事件是在多个地方被Set的,不过主要是在SDNdisInterruptCallback中。

      SDNdisInterruptCallback是在SDIOInitialization的时候被设置用来关联某个设备的:

sdStatus=SDIOConnectInterrupt(pAdapter->hDevice,(PSD_INTERRUPT_CALLBACK)SDNdisInterruptCallback);

SDIOConnectInterrupt函数是一个系统函数,它的解释是:This function specifies a function to be called when an SDIO card interrupt occurs.

      MrvIstThread中处理两类中断:soft_int和host_int。soft中断包括:chipreset、auto_deep_sleep和tx_request。Host中断包括:upload和download两类。Upload包括:接收的数据包、命令包以及各事件;download包括:数据包和命令包的发送。

 

参考原文:http://bluefish.blog.51cto.com/214870/474656

原创粉丝点击