OpenHarmony HDF WIFI之WLAN_HDI(上) 原创
杀手来过
发布于 2022-4-9 09:45
浏览
0收藏
@[toc]
WLAN_HDI
关于WLAN HDI的介绍,可见官网文档wlan · OpenHarmony/drivers_peripheral - 码云 - 开源中国 (gitee.com),其结构可如图所示:
WLAN HDI 目的是提供接口给 Wi-Fi Service调用,其提供的功能有:启动/关闭WLAN,查看连接状态,注册回调函数,启动wlan扫描等。
一、WILAN HAL
WLAN HAL模块作为HDI的中间层,提供给Wi-Fi service IWiFi 对象,以及IWiFiSta、IWiFiAp、IWiFiBaseFeature对象来发送和接受WLAN 命令。
struct IWiFi {
//打开hal层和driver的通道
int32_t (*start)(struct IWiFi *iwifi);
//关闭hal层和driver的通道
int32_t (*stop)(struct IWiFi *iwifi);
//获取wifi驱动支持的feature
int32_t (*getSupportFeature)(uint8_t *supType, uint32_t size);
//获取wifi驱动支持的feature组合
int32_t (*getSupportCombo)(uint64_t *combo, uint32_t size);
//创建一个feature
int32_t (*createFeature)(int32_t type, struct IWiFiBaseFeature **ifeature);
int32_t (*getFeatureByIfName)(const char *ifName, struct IWiFiBaseFeature **ifeature);
//注册回调函数监听 wifi event
int32_t (*registerEventCallback)(CallbackFunc cbFunc, const char *ifName);
int32_t (*unregisterEventCallback)(CallbackFunc cbFunc, const char *ifName);
int32_t (*destroyFeature)(struct IWiFiBaseFeature *ifeature);
//复位芯片驱动程序
int32_t (*resetDriver)(const uint8_t chipId, const char *ifName);
//get net device infos.
int32_t (*getNetDevInfo)(struct NetDeviceInfoResult *netDeviceInfoResult);
};
1.1、IWiFi
WifiConstruct用于创建 IWiFi 对象,并对其函数赋值。开发者就可以调用IWiFi对象的方法创建IWiFiSta、IWiFiAp、IWiFiBaseFeature对象。再通过这三个对象发送具体的WIFI命令
int32_t WifiConstruct(struct IWiFi **wifiInstance)
{
static bool isInited = false;
static struct IWiFi singleWifiInstance;
if (!isInited) {
if (HalMutexInit() != HDF_SUCCESS) {
HDF_LOGE("%s: HalMutexInit failed, line: %d\n", __FUNCTION__, __LINE__);
return HDF_FAILURE;
}
//给函数赋值
singleWifiInstance.start = Start;
singleWifiInstance.stop = Stop;
singleWifiInstance.getSupportFeature = GetSupportFeature;
singleWifiInstance.getSupportCombo = GetSupportCombo;
singleWifiInstance.createFeature = CreateFeature;
singleWifiInstance.getFeatureByIfName = GetFeatureByIfName;
singleWifiInstance.destroyFeature = DestroyFeature;
singleWifiInstance.registerEventCallback = HalRegisterEventCallback;
singleWifiInstance.unregisterEventCallback = HalUnregisterEventCallback;
singleWifiInstance.resetDriver = ResetDriver;
singleWifiInstance.getNetDevInfo = GetNetDevInfo;
InitIWiFiList();
isInited = true;
}
(*wifiInstance) = &singleWifiInstance;
return HDF_SUCCESS;
}
1.2、IWiFiBaseFeature
IWiFiSta、IWiFiAp都是基于IWiFiBaseFeature的扩展,我们以IWiFiSta 为例,了解HAL层是如何发送命令的。
struct IWiFiSta {
//继承了IWiFiBaseFeature
struct IWiFiBaseFeature baseFeature;
//扫描指定的mac地址
int32_t (*setScanningMacAddress)(const struct IWiFiSta *staFeature, unsigned char *scanMac, uint8_t len);
//开始扫描
int32_t (*startScan)(const char *ifName, WifiScan *scan);
};
struct IWiFiBaseFeature {
char ifName[IFNAME_MAX_LEN];
int32_t type;
//获取网卡名称
const char *(*getNetworkIfaceName)(const struct IWiFiBaseFeature *baseFeature);
//获取feature类型
int32_t (*getFeatureType)(const struct IWiFiBaseFeature *baseFeature);
//设置mac地址
int32_t (*setMacAddress)(const struct IWiFiBaseFeature *baseFeature, unsigned char *mac, uint8_t len);
//获取设备mac地址
int32_t (*getDeviceMacAddress)(const struct IWiFiBaseFeature *baseFeature, unsigned char *mac, uint8_t len);
//获取wifi带宽
int32_t (*getValidFreqsWithBand)(const struct IWiFiBaseFeature *baseFeature, int32_t band, int32_t *freqs,
uint32_t count, uint32_t *num);
//设置发送电源
int32_t (*setTxPower)(const struct IWiFiBaseFeature *baseFeature, int32_t power);
//获取芯片id
int32_t (*getChipId)(const struct IWiFiBaseFeature *baseFeature, uint8_t *chipId);
//获取网口名称
int32_t (*getIfNamesByChipId)(const uint8_t chipId, char **ifNames, uint32_t *num);
};
首先是创建IWiFiSta,需要调用 IWiFi 对象的createFeature()方法创建,具体的内容就是填充IWiFiSta对象中的方法。
下面就以createFeature()为例,学习feature的函数是如何发送命令到wifi驱动的。
©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
赞
2
收藏
回复
相关推荐
hdf 架构中,wifi service不再借助wpa和驱动交互了吗