1. WLAN 驱动框架概述
WLAN 是基于 HDF(Hardware Driver Foundation)驱动框架开发的模块,该模块可实现跨操作系统迁移、自适应器件差异、模块化拼装编译等功能。从而降低 WLAN 驱动开发的难度,减少 WLAN 驱动移植和开发的工作量。
本文主要分析 WLAN 驱动架构的组成和各部件的功能,以及快速适配方法。
2. WLAN 驱动框架
WLAN 驱动框架组成:
驱动架构主要由 Module、NetDevice、NetBuf、BUS、HAL、Client 和 Message 这七个部分组成。
Module
Module 基于 HDF 驱动框架实现 WLAN 框架的启动加载、配置文件的解析、设备驱动的初始化和芯片驱动的初始化等功能,根据 WLAN 的功能特性,划分 Base、AP、STA 等部件,对控制流的命令和事件进行统一管理。
NetDevice
NetDevice 用于建立专属网络设备,屏蔽不同 OS 的差异,对 WIFI 驱动提供统一接口,提供统一的 HDF NetDevice 数据结构,及其统一管理、注册、去注册能力;对接富设备上的 Linux 的网络设备层;对接轻设备上的 Linux 的网络设备层。
NetBuf
NetBuf 部件为 WLAN 驱动提供 Linux 或者 LiteOS 原生的网络数据缓冲的统一数据结构的封装以及对网络数据的操作接口的封装,框架如下图所示:
BUS
BUS 驱动模块向上提供统一的总线抽象接口。通过向下调用 Platform 层提供的 sdio 接口和封装适配 usb、pcie 接口,屏蔽不同操作系统的差异;通过对不同类型的总线操作进行统一封装,屏蔽不同芯片差异,能够对不同芯片厂商提供完备的总线驱动功能,不同厂商共用此模块接口,从而使厂商的开发更为便捷和统一,框架如下图所示:
HAL
HAL 部件对 WiFiService 模块提供标准的 WIFI-HDI 接口和数据格式定义,提供能力如下:设置 MAC 地址、设置发射功率、获取设备的 MAC 地址等。
Client
Client 部件实现用户态与内核态的交互,通过对 sbuf 及 nl80211 做不同适配,根据产品做配置化编译,从而实现对上提供统一的接口调用,框架如下图所示:
Message
Message 部件为每个服务单独提供业务接口,每个服务也可依赖其他服务形成组合业务接口,此模块支持在用户态、内核态和 MCU 环境运行,实现了组件间的充分解耦。
3. WLAN 驱动适配
目前快速适配 wlan 的方法都是基于 WPA 三方框架直接 CONFIG_DRIVER_NL80211 走的 nl80211 协议,直接连接到芯片驱动上,也就是 Client 流程中走的灰色流程。
3.1 WiFi 适配文件介绍
在 3.1beta 中 device\hihope\hardware\wifi 目录中可以看到 ap6xxx、bin、etc、lib、proc 和 BUILD.gn 文件
1)ap6xxx 文件中存放的是驱动相关的文件;
2)bin 文件中存放着 wpa_cli 和 wpa_supplicantion 二进制文件;(3.1release 版本中无此目录)
3) etc 中存放着 resolv.cof 文件;
4)lib 中存放着 libwpa_client.z.so 和 libwpa.z.so 文件;(3.1release 版本中无此目录)
5)proc 中存放着 ping_group_range 文件,定义着 ping 的变化范围;
6)Build.gn 为编译脚本文件;
3.2 WiFi 适配方法
以 Firefly 的 RK 系列为例,适配方法如下步骤
本方法已在以下 Firefly 产品验证,在 3.1beta 和 3.1release 上 WiFi 都能正常运行。
- ROC-RK3568-PC,芯片为 rk3568
- AIO-3399J,芯片为 rk3399
3.2.1 准备基础环境
下载 WiFi 芯片的驱动,从 Firefly 官网下载对应产品的 WiFi 驱动文件。
3.2.2 修改 WiFi 驱动文件
在 device\hihope\hardware\wifi\ap6xxx 中的驱动文件为润和 rk3568 开发板中的 WiFi 芯片的,存在与其他开发板不适配的情况,所以需要更改替换。
比如 ROC-RK3568-PC,修改如下
- 把 3.2.1 中下载的驱动文件,依次替换掉 device\hihope\hardware\wifi\ap6xxx 中 clm_bcm43752a2_ag.blob、fw_bcm43752a2_ag_apsta.bin、fw_bcm43752a2_ag.bin、nvram_ap6275s.txt
- AIO-3399J 同样的方法删除掉 device\hihope\hardware\wifi\ap6xxx 下的文件,拷贝相应的 4 个文件到此目录下;
- 修改 device\hihope\hardware\wifi\BUILD.gn 文件;
import("//build/ohos.gni")
AP6XXX_ETC_DIR = "//device/hihope/hardware/wifi/ap6xxx"
DNS_CONFIG_DIR = "//device/hihope/hardware/wifi"
WIFI_LIB_DIR = "//device/hihope/hardware/wifi/lib"
WIFI_BIN_DIR = "//device/hihope/hardware/wifi/bin"
ohos_prebuild_etc("fw_bcm4356a2_ag_mfg.bin") {
source = "$AP6XXX_ETC_DIR/fw_bcm4356a2_ag_mfg.bin"
install_images = ["vendor"]
relative_install_dir = "firmware"
part_name = "rockchip_products"
install_enable = true
}
ohos_prebuild_etc("fw_bcm4356a2_ag.bin") {
source = "$AP6XXX_ETC_DIR/fw_bcm4356a2_ag.bin"
install_images = ["vendor"]
relative_install_dir = "firmware"
part_name = "rockchip_products"
install_enable = true
}
ohos_prebuild_etc("nvram.txt") {
source = "$AP6XXX_ETC_DIR/nvram.tx"
install_images = ["vendor"]
relative_install_dir = "firmware"
part_name = "rockchip_products"
install_enable = true
}
ohos_prebuild_etc("resolv.conf") {
source = "$DNS_CONFIG_DIR/etc/resolv.conf"
install_images = ["system"]
part_name = "rockchip_products"
install_enable = true
}
ohos_prebuild_executable("wpa_cli") {
install_enable = true
source = "$WIFI_BIN_DIR/wpa_cli"
module_install_dir = "bin"
install_images = ["system"]
part_name = "rockchip_products"
}
ohos_prebuild_executable("wpa_supplicant") {
install_enable = true
source = "$WIFI_BIN_DIR/wpa_supplicant"
module_install_dir = "bin"
install_images = ["system"]
part_name = "rockchip_products"
}
ohos_prebuild_share_library("libwpa.z.so") {
source = "$WIFI_LIB_DIR/libwpa.z.so"
module_install_dir = "lib"
install_images = ["system"]
part_name = "rockchip_products"
}
ohos_prebuild_share_library("libwpa_client.z.so") {
source = "$WIFI_LIB_DIR/libwpa_client.z.so"
module_install_dir = "lib"
install_images = ["system"]
part_name = "rockchip_products"
}
group("ap6xxx") {
deps = [
":fw_bcm4356a2_ag_mfg.bin",
":fw_bcm4356a2_ag.bin",
":nvram.txt",
":resolv.conf",
":wpa_cli",
":wpa_supplicant",
":libwpa_client.z.so",
":libwpa.z.so",
]
}
上述 BUILD.gn 修改方法为 3.1beta 版本中的,在 3.1release 中则不需要 wpa_cli、wpa_supplicant、libwpa_client.z.so 和 libwpa.z.so 文件的配置。
3.3 WiFi 连网常用指令
WiFi 使能
$ ifconfig wlan0 up
成功后 ifconfig 能看到 wlan0 节点
启动 wpa_supplicant 进程
$ wpa_supplicant -i wlan0 -c /etc/wifi/wpa_supplicant -B
通过 wpa_cli 配置 WiFi
$ wpa_cli
localhost/wla0> scan
localhost/wla0> scan_result
添加网络
1)如果要连接加密方式是 WPA-PSK-CCMP+TKIP [ESS] (wpa 加密),wifi 名称是 name,wifi 密码是:psk。操作如下:
$ wpa_cli -i wlan0 set_network 0 ssid '"name"
$ wpa_cli -i wlan0 set_network 0 psk '"psk"'
$ wpa_cli -i wlan0 enable_network 0 //使能WiFi
2)如果要连接加密方式是 WEP (wep 加密),wifi 名称是 name,wifi 密码是 psk。操作如下:
$ wpa_cli -i wlan0 set_network 0 ssid '"name"'
$ wpa_cli -i wlan0 set_network 0 key_mgmt NONE
$ wpa_cli -i wlan0 set_network 0 wep_key0 '"psk"'
$ wpa_cli -i wlan0 enable_network 0
3)如果要连接加密方式是[ESS] (无加密),wifi 名称是 name。操作如下:
$ wpa_cli -i wlan0 set_network 0 ssid '"name"'
$ wpa_cli -i wlan0 set_network 0 key_mgmt NONE
$ wpa_cli -i wlan0 enable_network 0
保存 WIFI 连接信息
$ wpa_cli -i wlan0 save_config
连接已有的连接
$ wpa_cli -i wlan0 list_network // 列举所有保存的连接
$ wpa_cli -i wlan0 select_network 1 // 连接第1个保存的连接
$ wpa_cli -i wlan0 enable_network 1 // 使能第1个保存的连接
断开连接
$ wpa_cli -i wlan0 disable_network 0
关闭 WiFi
$ ifconfig wlan0 down
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.shuli.cc/?p=21689,转载请注明出处。
评论0