
OpenHarmony HDF WIFI之WLAN_HDI(中) 原创 精华
下面就以createFeature()为例,学习feature的函数是如何发送命令到wifi驱动的。
首先调用InitBaseFeature()来初始化basefeature,再添加IWiFiSta独有的函数。
创建完成IWiFiSta,就可以使用其接口来发送WIFI命令。
下面就以startScan命令为例子,加上互斥锁是因为wifi芯片同一时间只能响应一个命令。
StartScanInner()最终调用sbuf_cmd_adapter.c中的WifiCmdScan():
sbuf_cmd_adapter.c中的函数把所有的WIFI命令封装成sbuf类型,并调用 HDF 驱动的消息机制给 HDF_WIFI驱动发送命令。
1.3、Client
SendCmdSync()函数中使用了 g_wifiService 变量,该变量是 HdfIoService类型,在调用IWiFi的start方法时,会初始化该变量:
除了绑定服务,向服务发送消息外,还注册了回调函数OnWiFiEvents(),在该函数中,根据eventId调用不同的函数来处理驱动上报的消息,把消息从sbuf转换成普通的类型数据。(如何注册回调函数看最后)
WifiEventReport()调用HAL 层注册的回调函数:
二、HDI Service
HAL层的上一层是HDI Service,他将WLAN HAL层的IWiFiSta、IWiFiAp、IWiFiBaseFeature封装到一个对象 IWifiInterface 中,使其更方便用户使用。
HDI Service 分为两个部分:
- Services:作为HDF驱动模块,调用WLAN HAL 提供的对象,并提供服务给IWifiInterface。
- IWifiInterface:订阅 HDI Service驱动服务,提供统一接口给用户。
2.1、Service
作为一个HDF驱动模块,他必须有初始化函数,bind函数:
重点是dispatch()函数的实现:WlanHdiServiceDispatch()
在WlanHdiServiceOnRemoteRequest()中根据命令id调用不同的函数,这些函数最终都会调用WLAN HAL层提供的接口。
例如:WlanServiceStubStart()
2.2、IWifiInterface
IWifiInterface对象通过订阅HDI Service驱动服务,把所有的WIFI命令整合到一起,相比直接使用HAL 层接口更加简单方便。
调用HdIWifiInterfaceGet会帮我们创建IWifiInterface对象:
IWifiInterface 使用HDF 驱动消息机制 来和service通信,以WlanStart命令为例子:
三、注册WLAN回调函数
HAL 层提供了回调函数来监听wifi event。具体的实现是在wifi_driver_client.c
HalRegisterEventCallback()实现将onRecFunc函数赋值到全局变量g_callbackEventMap[];
g_callbackEventMap[]是固定长度的数组,其中存放所有wifi事件的回调函数,wifi event的类型定义在wifi_common_cmd.h中。
