
OpenHarmony HDF WIFI之WLAN_Core 原创 精华
Table of Contents
WIFI Core
在WLAN HDI 的那篇文章中,命令最终被发送到HDF WIFI驱动模块,该驱动的实现就在hdf_wifi_core.c中:
WIFI Core 驱动对消息的处理流程如图:
由于WIFI Core所涉及的对象多且复杂,最好先来了解这些对象是如何生成的,再看他们是如何使用。
一、LocalNodeService
展开宏定义后的LocalNodeService,根据上图可了解到LocalNodeService有三个,分别用于响应base、sta、ap消息,于是就有三个文件对应实现。
以sta.c为例子,学习LocalNodeService是如何被创建的:
sta.c中定义了三个MessageDef数组,分别用于处理三种类型的HDI message。例如sta.c中定义了5个成员的数组,用于处理5个具体的sta命令,例如WifiCmdAssoc()是用于响应wifi连接命令的。
同时还要注意到g_wifiStaFeatureCmds下方有一句宏定义:将该宏定义展开,可得到函数CreateServiceSTAService(),该函数创建了一个ServiceDef结构体,并调用InitService()函数.同时在StaInit()在调用该函数:
InitService()函数在sidecar.c中,其最重要的部分是调用RegistLocalService(),而RegistLocalService简单的调用RegistServiceInner():
该函数的目的是创建LocalNodeService,但创建LocalNodeServic需要使用到MessageNode,这里先暂时不管。
CreateLocalNodeService() 创建了LocalNodeService对象。
总结一下,调用sta.c,ap.c,wifi_base.c中的初始化函数,就能创建上图所示的LocalNodeService。
二、消息传递流程
了解了LocalNodeService是如何创建的,我们就能轻松的了解消息的传递流程。
在hdf_wifi_core.c中的HdfWifiDriverBind函数定义了HDF_WIFI驱动所提供的服务,并启动MessageRouter来创建MessageNode,创建dispatch,MessageNode和Dispatch正是我们前面创建LocalNodeService所需要的。
这里我们重点关注DispatchToMessage():
该函数定义在sidecar.c中。sidecar.c封装了LocalNodeService,提供接口给HDF_WIFI驱动使用,起到中介的作用。要注意到,驱动的命令是以id+HdfSBuf的形式传递进来的,需要转换成messagecontext。
SendMessage()根据message类型作不同的处理:
- sync:同步类消息需要马上处理
- async:异步类消息由RunDispatcher线程稍后处理
HandleRequestMessage()获取定义在sta.c、wifi_base.c、ap.c的messageDef,然后指定handler函数,例如:WifiCmdAssoc()
让我们重新回到sta.c中,看看messageDef[]中的handler函数是如何处理消息的。还是以WifiCmdAssoc()为线索:
Connect()使用 chipDriver 对象提供的接口进行连接:
至此 WIFI Core 的任务就完成了。
三、HDF WIFI 初始化
首先来看HdfWlanMainInit函数,这是驱动的初始化函数,负责生成上图所用到的所有对象。
HDF_WIFI的初始化分为三个部分:
- HdfWlanGetConfig是获取配置文件的配置信息,暂不分析。
- HdfWlanInitProduct:调用InitWifiModule 初始化wifi module(本质是初始化三个LocalNodeService)
- HdfWlanScanAndInitThread:初始化硬件
3.1、HdfWlanInitProduct
初始化WIFI Module,其根本目的是为了创建三个LocalNodeService,分别是:BASE、STA、AP LocalNodeService
函数调用流程是:InitWifiModule()->InitFeatures(),其中分别调用BaseInit()、StaInit()、ApInit()来创建LocalNodeService
3.2、HdfWlanScanAndInitThread
HdfWlanScanAndInitThread会回调HdfWlanInitThread函数,在其中初始化硬件,如sdio控制器,芯片电源引脚,复位引脚,驱动程序。
HdfWlanInitThread也分为三个部分:
- HdfWlanConfigSDIO:由驱动开发者实现,配置sdio控制器外设
- ProbeDevice:初始化硬件
- HdfWifiInitDevice:初始化硬件驱动程序
3.2.1、HdfWlanConfigSDIO
由驱动开发者实现,配置sdio控制器外设,以海思的芯片为例:
3.2.2、ProbeDevice()
初始化 HdfWlanDevice结构体,并调用HdfWlanDevice的方法初始化 硬件wifi芯片,如上电、复位、连接总线。
HdfWlanDevice 是来描述所有wlan设备的硬件属性:例如驱动名称,芯片名称、电源、复位、连接到主控的总线
调用HdfWlanCreatePowerManager()会初始化PowerManager,HdfWlanPowerOnProcess 会调用PowerManager->on(),即HdfWlanChipPowerOn(),通过设置gpio引脚来使能wlan芯片。
ResetManager的实现也是类似的
3.2.3、HdfWifiInitDevice()
获取 HdfChipDriverFactory,并调用其InitChip()方法来初始化芯片硬件,调用HdfWlanInitInterfaces()初始化HdfChipDriver ;
HdfChipDriverFactory结构体由硬件厂商实现,其最终目的是为了创建chip driver.
chip driver
HdfWlanInitInterfaces 创建对应芯片的HdfChipDriver ,创建netdevice,调用chipDriver->init()初始化芯片驱动程序(即由驱动开发者根据具体芯片实现的)
HdfChipDriver 是直接操作wifi 芯片硬件的驱动,也必须由驱动厂商实现,其中HdfMac80211BaseOps、HdfMac80211STAOps、HdfMac80211STAOps都需要实现具体的硬件操作。
