UCOS + LWIP + USB WIFI(rtl8188eu) <三>

来源:互联网 发布:免费下载源码的网站 编辑:程序博客网 时间:2024/05/24 04:49

回来了,掌声在那里...... 估计也没有多少人看了, 呵呵!自娱自乐,把自己收获的写下来,老来能回首看看。

上章节中重点讲到rtw_usb_if1_init()函数, 该函数在这个WIFI驱动中扮演的角色是,初始化WIFI芯片驱动, 注册网络设备(就是告诉TCPIP链路层已经准备OK)。在这个函数里面会经历怎么样的过程呢, 下面展开分解下:


1.

hal_set_hal_ops()宏定义对应不同的WIFI芯片组的功能函数,我们驱动里面指向rtl8188eu_set_hal_ops(),可以看usb_hal.h文件不同芯片对应的函数不一样哦,最终我来看看这个函数其实就是一个生成回调函数的老巢, 我来对各个回调做注释说明,这样大家就能了解大概了。


void rtl8188eu_set_hal_ops(_adapter * padapter){struct hal_ops*pHalFunc = &padapter->HalFunc;_func_enter_;padapter->HalData = rtw_zmalloc(sizeof(HAL_DATA_TYPE));if(padapter->HalData == NULL){DBG_8192C("cant not alloc memory for HAL DATA \n");}//_rtw_memset(padapter->HalData, 0, sizeof(HAL_DATA_TYPE));padapter->hal_data_sz = sizeof(HAL_DATA_TYPE);pHalFunc->hal_power_on = rtl8188eu_InitPowerOn;//顾名思义电源,有电才能工作,pHalFunc->hal_init = &rtl8188eu_hal_init;//有电之后就开始做些芯片的初始化工作了, rtl8188eu_InitPowerOn()在里面被调用                                                                //该函数负责烧写芯片的程序,获得MAC地址,判断版本号,和芯片初始化工作,都是很芯片相关的pHalFunc->hal_deinit = &rtl8188eu_hal_deinit;//和上面回调对照,顾名思义就是退出的工作了//pHalFunc->free_hal_data = &rtl8192c_free_hal_data;pHalFunc->inirp_init = &rtl8188eu_inirp_init;//重点关注函数, 这是一个累不死的搬运工, 不停的读无线数据,大家可以展开这个函数看看pHalFunc->inirp_deinit = &rtl8188eu_inirp_deinit;//和上面的回调对照,顾名思义就是退出哦pHalFunc->init_xmit_priv = &rtl8188eu_init_xmit_priv;//提交网路数据的一些变量的初始化pHalFunc->free_xmit_priv = &rtl8188eu_free_xmit_priv;//释放变量pHalFunc->init_recv_priv = &rtl8188eu_init_recv_priv;//接收网络数据的一些变量的初始化pHalFunc->free_recv_priv = &rtl8188eu_free_recv_priv;//释放变量#ifdef CONFIG_SW_LEDpHalFunc->InitSwLeds = &rtl8188eu_InitSwLeds;pHalFunc->DeInitSwLeds = &rtl8188eu_DeInitSwLeds;#else //case of hw led or no ledpHalFunc->InitSwLeds = NULL;pHalFunc->DeInitSwLeds = NULL;#endif//CONFIG_SW_LEDpHalFunc->init_default_value = &rtl8188eu_init_default_value;//和WIFI芯片相关的设置,可以忽略,研发芯片的可以看看pHalFunc->intf_chip_configure = &rtl8188eu_interface_configure;//和WIFI芯片相关的设置,可以忽略,研发芯片的可以看看pHalFunc->read_adapter_info = &ReadAdapterInfo8188EU;//和WIFI芯片相关的设置,可以忽略,研发芯片的可以看看//pHalFunc->set_bwmode_handler = &PHY_SetBWMode8192C;//pHalFunc->set_channel_handler = &PHY_SwChnl8192C;//pHalFunc->hal_dm_watchdog = &rtl8192c_HalDmWatchDog;pHalFunc->SetHwRegHandler = &SetHwReg8188EU;//和WIFI芯片相关的设置,可以忽略,研发芯片的可以看看pHalFunc->GetHwRegHandler = &GetHwReg8188EU;//和WIFI芯片相关的设置,可以忽略,研发芯片的可以看看  pHalFunc->GetHalDefVarHandler = &GetHalDefVar8188EUsb;//和WIFI芯片相关的设置,可以忽略,研发芯片的可以看看 pHalFunc->SetHalDefVarHandler = &SetHalDefVar8188EUsb;//和WIFI芯片相关的设置,可以忽略,研发芯片的可以看看pHalFunc->UpdateRAMaskHandler = &UpdateHalRAMask8188EUsb;//和WIFI芯片相关的设置,可以忽略,研发芯片的可以看看pHalFunc->SetBeaconRelatedRegistersHandler = &SetBeaconRelatedRegisters8188EUsb;//和WIFI芯片相关的设置,可以忽略,研发芯片的可以看看//pHalFunc->Add_RateATid = &rtl8192c_Add_RateATid;pHalFunc->hal_xmit = &rtl8188eu_hal_xmit;//重点关注,该函数是提交网络数据进入的函数pHalFunc->mgnt_xmit = &rtl8188eu_mgnt_xmit;//重点关注,该函数在做802.11协议时候,提交的函数#ifdef CONFIG_HOSTAPD_MLMEpHalFunc->hostap_mgnt_xmit_entry = &rtl8188eu_hostap_mgnt_xmit_entry;#endifpHalFunc->interface_ps_func = &rtl8188eu_ps_func;rtl8188e_set_hal_ops(pHalFunc);//该函数又是一个回调函数的巢穴_func_exit_;}



在上面函数里面,我们一一分析了各个回调函数的功能及其作用。这些回调函数被注册到Adapter变量里面, 这里我们也要重点关注Adapter变量, 它包含这个WIFI芯片驱动的整个内容,大家可以查看器结构体架构。我们调用这些回调函数是通过同在hal_intf.c文件里面对应的函数, 只要知道Adapter变量就可以调用了。在rtl8188eu_set_hal_ops()里面有函数rtl8188e_set_hal_ops()被调用, 其实就是干的一样一样的事情, 把芯片相关的回调函数放在另外一个函数里面赋值,都是给变量 Adapter->HalFunc赋值,但是我们需要注意一个赋值pHalFunc->run_thread= &rtl8188e_start_thread(这个线程承载了WIFI驱动的状态控制和802.11一些操作)。HalFunc对应的结构体struct hal_ops是一个很壮观的回调函数结构图,但是外部就不要调用这些回调函数变量了, 因为在hal_intf.c文件里面都有对应的封装函数,毕竟驱动复杂度高,这样更明了化。


2.

rtw_init_io_priv(padapter, usb_set_intf_ops)接下来再来展开这个函数,大家可以理解该函数是硬件I/O,所有通讯都得靠它了。 展开函数,其实该函数是调用宏usb_set_intf_ops,这个宏又对应rtl8188eu_set_intf_ops()函数。欢迎光临,又来到一个回调函数老巢了,呵呵!!这个函数很简单的告诉你,其实就是调用了USB的两个最基本的通讯传输“控制传输”和“块传输”,关于这两个传输可以网上查下他们的特性,不想在这里做USB知识培训了。

大家发现了没有,在这份驱动里面有两份usb_ops_linux.c文件,其实里面就是实现了,USB通讯的控制传输,进行WIFI控制命令的传输和接收命令;和USB通讯的块传输,进行网络数据的读和写数据(其实就是数据的搬运了),注意写被分配带另外一个usb_ops_linux.c文件里面。

需要说明的是如果你的USB内核写得够好,够接近LINUX那就移植这部分了的工作量就很小了,如果不好,需要做小修改。具体怎么修改看你们的驱动了,调试这块需要借助USB协议分析仪,这是必不可少的USB调试工具,靠打印基本就解决不了大问题。这里说一下USB协议分析仪, 我使用的是ellisys公司的, 大概3万天朝币,它能抓到总线上的数据,并且按照协议分类,看数据一目了然,出错了也知道在什么地方。很好的东西,为什么中国就生产不出来这么好的仪器呢?靠下一代了!


3.

下面还有几个简单的函数接不一一展开讲了,大家通过函数名就可以知道一二了。


总结

这里讲的展开内容,重点,一共三大回调函数巢穴,每个巢穴基本贯穿整个驱动的功能,理解掌握这些函数调用时机就是这份驱动成功的关键。



下章我们将讲解WIFI是怎么开始工作的,所有初始化都已经OK, 机器要动起来了。机油都准备好了,发动机也需要工作了,是不是,亲!



0 0
原创粉丝点击