Wi-Fi - 无线保真组件
Wi-Fi(无线保真)是一种允许设备通过无线信号进行网络连接的技术。它基于 IEEE 802.11 系列标准,广泛应用于家庭、办公、公共场所等环境中,用于实现设备与互联网或局域网之间的无线通信。Wi-Fi 技术通过无线电波传输数据。
V821 是一款内置WIFI的多核芯片平台,其中 CPU0 运行Linux系统,CPU1 运行 RTOS 系统。V821 在 Linux 和 RTOS 平台上实现 TCP/IP 双栈,Linux 系统运行内核 TCP/IP Stack,RTOS系统运行 LWIP TCP/IP Stack和 WIFI HOST 协议栈,基于 MSGBOX 和共享内存进行异构通信,其大致层次关系如下图所示。
芯片内置 Wi-FI 支持 2.4G 802.11b/g/n-HT20。目前内置 WIFI 可处于 3 种工作模式,分别是 STATION,AP,MONITOR。也支持扩展复合模式,例如 STA-AP
- STATION:连接无线网络的终端,大部分无线网卡默认都处于该模式,也是常用的一种模式。
- AP:无线接入点,常称热点,比如路由器功能。
- MONITOR:也称为混杂设备监听模式,所有数据包无过滤传输到主机。
- STA-AP:STATION 模式与 AP 模式共存
Wi-Fi 软件结构
wifimanger
: 主要用于STATION模式,提供Wi-Fi连接扫描等功能。softap manager
:提供启动AP的功能。smartlink
: 对于NoInput
的设备,通过借助第三方设备(如手机)实现透传配网的功能,包括softap/soundwave/xconfig/airkiss/
等多种配网方式。wpa_supplicant
: 开源的无线网络配置工具,主要用来支持WEP,WPA/WPA2和WAPI无线协议和加密认证的,实际上的工作内容是通过socket
与驱动交互上报数据给用户。hostapd
: 是一个用户态用于AP和认证服务器的守护进程。monitor
: Wi-Fi处于混杂设备监听模式的处理应用。
Wi-Fi 驱动配置
由于 V821 是内置双栈 Wi-Fi, 所以驱动分为 Linux 端与 RTOS 端。在此需要分别配置(默认SDK已经配置完成,无需修改)
Linux 内核驱动配置
使用 make kernel_menuconfig
进入内核配置界面
Allwinner BSP --->
Device Drivers --->
Network Device Drivers --->
Wireless LAN --->
<M> v821 dual protocol stack support
<M> Support RPMSG platforms
RTOS 双栈配置
使用 mrtos menuconfig
进入内核配置界面
Drivers Options --->
other drivers --->
-*- rfkill drivers
[*] wireless devices --->
[*] XRADIO driver --->
[*] Enable xradio test cmd
Xradio chip (Enable v821 driver) --->
[*] Wi-Fi Certification of WFA
[*] v821 wlan dual core
[*] default init xradio dual net stack
[*] wlan station mode
[*] wlan monitor mode
[*] wlan ap mode
如果需要 STA+AP 共存模式,还需要打开以下配置,开启后会影响吞吐,仅有特殊需求时使用
Drivers Options --->
other drivers --->
[*] wireless devices --->
[*] XRADIO driver --->
[*] wlan STA and SoftAp coexist
Wi‑Fi 中间件介绍
wpa_supplicant
wpa_supplicant
是一个开源项目,主要用于支持 WEP
、WPA/WPA2
和 WAPI
无线协议的加密与认证。它的核心功能是通过 socket
与无线驱动程序进行交互,将数据上报给用户。用户可以通过 socket
向 wpa_supplicant
发送命令,进而控制驱动程序操作 Wi-Fi 芯片。简而言之,wpa_supplicant
充当了 Wi-Fi 驱动与用户之间的中介,同时提供协议和加密认证的支持。
hostapd
hostapd
能够将无线网卡切换为 master
模式,从而模拟接入点(AP)的功能,也就是我们所说的软 AP(Soft AP)。hostapd
的主要功能是作为 AP 的认证服务器,负责控制和管理接入的 stations
(通常指带有无线网卡的设备,如 PC)的接入和认证。通过 hostapd
,可以将无线网卡切换为 AP/master
模式,并通过修改配置文件,设置一个开放式(不加密)、WEP
、WPA
、WPA2
或 WPA3
加密方式的无线网络。此外,配置文件还可以用来调整无线网卡的各种参数,包括频率、信号强度、beacon
包的时间间隔、是否发送 beacon
包以及如何响应探针请求等。
WiFiManager
WiFiManager
是一个用于 Wi-Fi 连接管理、通信以及提供一些附加功能的工具。它支持 STA
、AP
、monitor
和 P2P
模式,并集成了配网模式和其他功能。WiFiManager
屏蔽了底层系统的具体实现,使其能够适配各种差异化的系统平台,如 Linux
、RTOS
和 xrLink
(Linux 系统 + MCU 模组)。
WiFiManager
兼容 Linux
、XrLink
、FreeRTOS
等系统,支持 STA
、AP
、monitor
和 P2P
等模式,并集成了 SoftAP
、BLE
、XConfig
、Soundwave
等配网功能。它提供了完善的 API 接口,方便用户进行调用,同时还提供了一个功能完整的 Demo,便于用户直接使用和测试。
WiFiManager
的软件结构整体分为三部分:
- 应用层:提供用户与系统交互的接口。
- lib 层:包含接口抽象层、模式抽象层和 OS 抽象层,用于屏蔽底层的具体实现。
- OS 具体实现层:负责操作系统相关的具体实现,确保跨平台兼容性。
该结构使得 WiFiManager
易于移植和扩展,同时为不同平台提供了统一的开发接口。
配置 WiFiManager
WiFiManager 软件包配置位于 RTOS 软件包配置内,执行 make menuconfig
,配置 WiFiManager 为 XRLINK 模式。并且勾选 DEMO_TEST_TOOL
作为 DEMO 测试应用。 默认SDK已经配置完成,无需修改
Allwinner --->
Wireless --->
<*> wifimanager-v2.0 --->
--- wifimanager-v2.0
Wifimanager-v2.0 Configuration --->
Wifimanager support platform (XRLINK PLATFORM OS)
Wifimanager support mode Configuration --->
[*] Wifimanager support sta mode enable
[*] Wifimanager support ap mode enable
(/etc/wifi) Wifimanager config file path
[*] Wifimanager unregister callback function
<*> wifimanager-v2.0-lib
<*> wifimanager-v2.0-demo
Wifimanager demo choice (DEMO_TEST_TOOL) --->
(X) DEMO_TEST_TOOL
-*- wirelesscommon
内置 SIP Wi-Fi 双栈模式无需配置设备树。
WiFiManager Demo 功能命令
系统启动之后,会显示 Wi-Fi 相关的日志,示例如下:
STA模式命令
打开STA模式,使WiFi模块进入客户端模式,可以连接到无线接入点(AP)。
wifi -o sta
扫描可用的WiFi网络,列出周围的所有无线网络(SSID)。
wifi -s
连接到指定的WiFi接入点(SSID),如果该接入点有密码,需提供密码。如果没有密码,直接连接。
wifi -c ssid [passwd]
尝试重新连接到之前已经连接过的指定SSID的网络,无需提供密码。
wifi -t ssid
使用BSSID(即AP的硬件地址)连接到指定的接入点,无论该AP是否加密,都可以连接。如果AP有密码,需提供密码。
wifi -M bssid [passwd]
启用或禁用自动重连功能。当设置为“enable”时,WiFi模块会在断开连接时自动尝试重新连接到之前连接的AP。
wifi -a [enable/disable]
列出已连接的或保存的AP的详细信息。若指定“all”,则列出所有已保存的网络信息。
wifi -l [all]
移除指定的WiFi网络(通过SSID指定)。如果指定“all”,则移除所有已保存的网络配置。
wifi -r [ssid/all]
断开当前连接的WiFi网络。
wifi -d
关闭STA模式,停止WiFi模块作为客户端工作。
wifi -f sta
AP模式命令
启动AP模式,创建一个无线接入点。
-
ssid
:设置AP的SSID(即网络名称) -
passwd
:设置接入点的密码(可选,若未设置则默认无密码) -
channel
:设置无线频道(可选,若未设置,则使用默认频道6) -
wep/wpa/wpa2
:设置加密类型(可选,默认使用WPA2加密)
wifi -o ap [ssid] [passwd] [channel] [wep/wpa/wpa2]
在AP模式下扫描周围的WiFi网络。
wifi -s ap
列出当前AP模式的配置信息,如SSID、密码、加密类型等。
wifi -l ap
关闭AP模式,停止WiFi模块作为接入点工作。
wifi -d ap
强制关闭AP模式,停止当前的接入点广播。
wifi -f ap
其他命令
设置调试级别。
error
:仅输出错误信息。warn
:输出警告信息。info
:输出信息级别日志。debug
:输出调试级别日志,包含更多调试信息。dump
:转储日志信息。exce
、exce-mid
、exce-max
:分别输出不同等级的异常日志。open
:开启详细的路径、文件、函数、行号信息。close
:关闭详细日志输出。
wifi -D [error/warn/info/debug/dump/exce/exce-mid/exce-max/open/close]
获取系统的MAC地址。
wifi -g
设置WiFi模块的MAC地址,可以通过此命令修改系统的WiFi硬件地址。
wifi -m [macaddr]
获取WiFi管理器的状态信息,查看当前WiFi模块的运行状态。
wifi -i
进行WiFi用户厂商消息测试,length
指定测试消息的长度。
wifi -v [length]
关闭WiFi管理器,不再进行WiFi管理操作。
wifi -f
显示帮助信息,列出所有可用的WiFi命令及其简要说明。
wifi -h
SIP Wi-FI 配置单栈驱动
V821 还支持使用单网络栈的 Wi-Fi 模式,此时全套 Wi-Fi 驱动,协议栈都运行在 CPU0 的 Linux 系统内,若配置这样的模式,Wi-Fi 将不支持低功耗保活。一般作为调试使用。
(1)使用 quick_config 切换单栈驱动
选择选项 13,V821_SMAC 即可切换到单栈驱动,之后编译烧写即可。
(2)重新编译 WiFiManager
在切换后,需要重新单独编译 WIFIManager 来支持单网络栈模式,命令如下
cwifimgm && mm -B && cd -
(3)编译固件
使用 mp
命令编译打包固件
(4)启动使用
启动后可以看到使用的是单栈驱动,其余使用均与双栈驱动一致
SIP Wi-FI 配置STA+AP模式
在某些场景下,需要配置 Wi-Fi 作 STA + AP 模式运行,例如配网的时候启动 AP 和 STA, 通过 AP 与手机APP通讯获取需要连接 Wi-Fi 的 SSID,密码后, 直接STA链接, 连接识别, 直接通过 AP 反馈给手机APP,进行下一次操作。启用这样的模式需要单独配置下驱动。STA+AP会影响吞吐性能,仅在特殊需求下使用
(1)配置 RTOS 小核驱动
运行 mrtos menuconfig
,开启配置项:
Drivers Options --->
other drivers --->
[*] wireless devices --->
[*] XRADIO driver --->
[*] wlan STA and SoftAp coexist
然后重新编译小核固件
mrtos clean && mrtos
(2)配置 WIFIManager 模式
运行 m menuconfig
,开启配置项 Wifimanager support sta + ap coexist mode enable
Allwinner --->
Wireless --->
<*> wifimanager-v2.0 --->
Wifimanager-v2.0 Configuration --->
Wifimanager support platform (XRLINK PLATFORM OS)
Wifimanager support mode Configuration --->
[*] Wifimanager support sta mode enable
[*] Wifimanager support ap mode enable
[*] Wifimanager support sta + ap coexist mode enable
然后重新编译 WIFIManager
cwifimgm && mm -B && cd -
(3)编译固件,验证功能
启动的时候可以看到 sta-ap
功能支持上了
首先以 STA 模式联网,联网后使用 ifconfig
查看配置
wifi -o sta
wifi -c ssid [passwd]
然后配置 AP 模式,启用 AP,此时使用 ifconfig
可以看到生成了两个 wlan 节点,一个是 STA 一个是 AP
wifi -o ap
外置 Wi-FI 配置
针对没有内置 Wi-Fi 的 V821 型号,若使用外挂 Wi-Fi 就需要适配外置模组。这里将演示适配的 Wi-Fi 模组是 XradioTech 所设计的 XR819s Wi-Fi 模组。在 SDK 中已经内置了 XR819s 的驱动,在这里我们简单说明如何配置驱动。
设备树配置
找到设备树中的 SDC1,配置启用他。
&sdc1 {
bus-width = <4>;
no-mmc;
no-sd;
cap-sd-highspeed;
/*sd-uhs-sdr12*/
/*sd-uhs-sdr25;*/
/*sd-uhs-sdr50;*/
/*sd-uhs-ddr50;*/
/*sd-uhs-sdr104;*/
/*sunxi-power-save-mode;*/
sunxi-dis-signal-vol-sw;
cap-sdio-irq;
keep-power-in-suspend;
ignore-pm-notify;
max-frequency = <50000000>;
ctl-spec-caps = <0x428>;
status = "okay";
};
然后新增 rfkill
节点,用于管理 Wi-Fi 模组的供电,唤醒等功能。
&soc {
rfkill: rfkill@0 {
compatible = "allwinner,sunxi-rfkill";
chip_en;
power_en;
pinctrl-0;
pinctrl-names;
status = "okay";
/* wlan session */
wlan: wlan@0 {
compatible = "allwinner,sunxi-wlan";
/*clocks = <&rtc_ccu CLK_DCXO24M_OUT>, <&rtc_ccu CLK_OSC32K_OUT>;*/
/*clock-names = "dcxo24M-out", "osc32k-out";*/
/*wlan_power = "axp803-dldo1";*/
/*wlan_power_vol= <3300000>;*/
wlan_busnum = <0x1>;
wlan_regon = <&pio PD 11 GPIO_ACTIVE_HIGH>;
wlan_hostwake = <&pio PD 12 GPIO_ACTIVE_HIGH>;
wakeup-source;
//regulator-boot-on;
//regulator-always-on;
};
};
};
需要关注的配置如下:
wlan_regon = <&pio PD 11 GPIO_ACTIVE_HIGH>;
:表示 PD 11 为模块的 REGON 控制脚wlan_hostwake = <&pio PD 12 GPIO_ACTIVE_HIGH>;
:表示 PD 12 为模块的 HOSTWAKE 控制脚
内核驱动配置
进入内核驱动配置页 make kernel_menuconfig
,选择驱动 <M> XR819S WLAN support
Allwinner BSP --->
Device Drivers --->
Network Device Drivers --->
Wireless LAN --->
<M> XR819S WLAN support
用户层固件配置
进入 ROOTFS 配置界面 make menuconfig
,配置固件和驱动,由于使用的是40M晶振的 xr819s 模块,所以这里需要勾选 xr819s with 40M sdd
Firmware --->
<*> wireless-regdb
-*- xr819s-firmware
[*] xr819s with 40M sdd
Kernel modules --->
Wireless Drivers --->
<*> kmod-cfg80211
<*> kmod-net-xr819s
上电启动
配置完成之后,编译烧录固件,上电启动后可以看到 Wi-Fi 相关的日志
可以使用 wifi -s
搜索 Wi-Fi
其他操作与【WiFiManager Demo 功能命令】中描述的一致,在此不过多赘述。
FAQ
SIP Wi-Fi 相关 FAQ
获取SIP WIFI驱动版本
在调试过程中如果出现问题,需要查看 WIFI 驱动版本。由于实际的 Wi-Fi 驱动是在 RTOS 上,所以需要查看 RTOS 的打印,在 Linux 中查看 RTOS 打印命令如下
cat /sys/kernel/debug/remoteproc/remoteproc0/aw_trace_log
报错WERR: NLMSG bind failed.
这样的错误是 RTOS 相关问题,Linux端无法连接小核驱动导致,请检查小核是否正确运行。
外置 Wi-Fi 相关 FAQ
编译问题
找不到wowlan变量
(1)现象:
drivers/net/wireless/xr819/umac/main.c:870:17: error: 'struct wiphy' has no member named 'wowlan'
if ((hw->wiphy->wowlan->flags || hw->wiphy->wowlan->n_patterns)
(2)原因:
wowlan成员变量受CONFIG_PM控制,没有打开导致的.休眠唤醒的依赖。
(3)解决方案:
在内核配置
-Power management options --->
Device power management core functionality
找不到 xxx.ko
(1)现象:
sunxi_wlan_get_bus_index...xr819s.ko undefined!
(2)原因:
缺少配置misc。
(3)解决方案:
在内核配置
Device drivers-->
Misc Devices Drivers --->
<*> Allwinner rfkill driver
<*> Allwinner Network MAC Addess Manager
mmc_xxx undefined
(1)现象:
drivers/built-in.o: In function scan_device_store':
drivers/misc/sunxi-rf/sunxi-wlan.c:309: undefined reference tosunxi_mmc_rescan_card'
drivers/misc/sunxi-rf/sunxi-wlan.c:309:(.text+0x5fc40): relocation truncated to fit:
R_AARCH64_CALL26 against undefined symbol `sunxi_mmc_rescan_card'
(2)原因:
没有配置mmc。
(3)解决方案:
Device Drivers --->
SD/MMC Drivers --->
<*> Allwinner sunxi SD/MMC Host Controller support
缺少依赖库
(1)现象:
Package kmod-net-xr819 is missing dependencies for the following libraries:
cfg80211.ko
(2)原因:
依赖库需要编译进内核,不能以模块方式编译进去。
(3)解决方案:
在内核配置如下模块时,配置成 y
CONFIG_RFKILL=y
CONFIG_CFG80211=y
CONFIG_MMC=y
CONFIG_MAC80211=y
驱动加载问题
博通模组联网时提示:No such device.
(1)现象:
root@TinaLinux:/# wifi_add_network_test ssid passwd 1
*********************************
***Start wifi connect ap test!***
*********************************
wpa_suppplicant not running!
Cannot create "/data/misc/wifi/entropy.bin": No such file or directory
Wi-Fi entropy file was not created
ifconfig: SIOCGIFFLAGS: No such device
event_label 0x0
wifi on failed!
wifi on failed event 0xf001
(2)原因:
firmware选择不匹配,导致驱动加载时下载失败.
- lsmod查看驱动已经正常加载
- dmesg 查看加载log发现:
[ 22.336336] dhdsdio_download_code_file: Open firmware file failed /lib/firmware/fw_bcm43438a1.bin
[ 22.346331] _dhdsdio_download_firmware: dongle image file download failed
表示firmware固件缺失(这里表示缺失fw_bcm43438a1.bin)
最后发现是在配置firmware时选择了ap6212,正常应该用ap6212a
(3)解决方案
tina配置正确的firmware
firmware --->
└─> <*> ap6212a-firmware............................... Broadcom AP6212A firmware
XR819模组ifconfig显示:No such device
(1)现象:
ifconfig: SIOCGIFFLAGS: No such device
(2)原因:
firmware选择不匹配。
- lsmod查看驱动已经正常加载。
- dmesg 查看加载log发现:
[ 195.966066] [XRADIO_ERR] xradio_load_firmware: Wait for wakeup:device is not responding.
XR819s是40M晶振。
(3)解决方案
配置选择40M晶振的firmware
firmware --->
[*] xr819s with 40M sdd
XR819s can't open /etc/wifi/xr_wifi.conf, failed
(1)现象:
lsmod驱动没有正常加载。
(2)原因:
- dmesg查看log:
[ 6.802331] [XRADIO_ERR] can't open /etc/wifi/xr_wifi.conf, failed(-30)
[ 6.802338] [XRADIO_ERR] Access_file failed, path:/etc/wifi/xr_wifi.conf!
[ 6.914044] sunxi-mmc sdc1: no vqmmc,Check if there is regulator
[ 7.028376] [XRADIO_ERR] xradio_load_firmware: Wait_for_wakeup: can't read control register.
busnum配置错误,原理图上使用的是sdc0.
(3)解决方案
board.dts中配置wlan时
busnum = 0;
驱动加载问题总结
配置问题
1.内核驱动,Tina modules, Tina firmware三者必须正确对应同一个模组。
2.注意common下的modules.mk的编写。
3.Sdio的配置一定要根据原理图选择对应busnum。
可能导致:
1.扫卡失败。
2.下载firmware失败。
最终导致驱动加载失败。
供电问题
检查VCC_WIFI和VCC_IO_WIFI两路电。
不同模组对供电时序有一定要求,比如RTL8723ds需要两路电同时供电,针对有AXP的方案,一定要注意供电的配置,
特别是enable的时间。
1.硬件方面:主要排查两路电的供电方案,是否是同一路供电,若是分开供电,要考虑两路供电的时序,
例如DCDC1--->VCC_WIFI,LDOA--->VCC_IO_WIFI,那么DCDC1和LDOA的时序就得考虑。
2.软件方面主要是sysconfig.fex或者boart.dts的配置,分开供电的是否需要单独配置。
如:R818硬件设计是两路电分开供电。
可能导致:
1.扫卡失败。
2.下载firmware失败。
3.sdio_clk没有时钟。
4.32k竞争不起振。
最终导致驱动加载失败。
SDIO问题
1.sdio busnum配置错误.
2.驱动WL-REG-ON的方式不对.例如:
XR819模块出现
[SBUS_ERR] sdio probe timeout!
[XRADIO_ERR] sbus_sdio_init_failed
这个问题主要是sdio扫卡失败,跟sdio上电时序有关,可在drivers/net/wireless/xradio/wlan/platform.c中
xradio_wlan_power函数sunxi_wlan_set_power(on)后面加上一段延时。
RLT8723ds需要先高-低-高的方式.
可能导致:
1.扫卡失败。
2.下载firmware失败。
3.sdio_clk没有时钟。
4.32k晶振不起振。
5.WL-REG-ON无法正常被拉高。
最终导致驱动加载失败。
起wlan0网卡问题
RTL8723DS ifconfig wlan0 up: No such device
(1)现象:
ifconfig: SIOCGIFFLAGS: No such device
(2)原因:
- lsmod查看驱动已经正常加载。
- dmesg查看log未发现异常。
- 排查sdio_clk, regon_on,32k,都正常。
- 两路供电都正常配置。
- 对比其他平台硬件发现,供电方式不一样,两路电采用了分开供电,咨询RTL需要同时上电。
(3)解决方案:
硬件更改,VCC_WIFI/VCC_IO_WIFI用同一路电供电。
RTL8723DS 无法自启动wlan0
(1)现象:
启动脚本/etc/init.d/wpa_supplicant中会自启动wlan0
但是每次启动启动都自启动失败,然后手动ifconfig wlan0 up正常。
(2)原因:
AP-WAKE_BT引脚被接了上拉电阻,进入测试模式了。
(3)解决方案:
硬件摘除上拉电阻。
起wlan0网卡问题总结
wlan0启动失败问题目前遇到的都是与硬件相关的,如果不能自加载一般采用ifconfig wlan0 up先手动加载看看打印提示。同时让硬件帮忙check一下供电和一些io的上下拉电阻。
wpa_supplicant服务问题
找不到wpa_suplicant.conf文件
(1)现象:
起supplicant失败
- ps发现没有supplicant进程.
- 于是手动执行wpa_supplicant -D nl80211 -i wlan0 -c /etc/wpa_supplicant.conf -B
提示:
Failed to open config file '/etc/wpa_supplicant.conf', error: No such file or directory
Failed to read or parse configuration '/etc/wpa_supplicant.conf'.
(2)原因:
路径错误。
(3)解决方案:
tina正常的路径一般在/etc/wifi/wpa_supplicant.conf
在wifimanage包下面配置正确的路径,保持和启动脚本一致.