4.3.22. Wi-Fi 驱动调试指南
4.3.22.1. 概述
本章主要讲述 Wi-Fi 的适配和使用方法,以 RealTek(瑞昱)系列的 SDIO WiFi RTL8852BS ,移远 的 FCS960K 为例。
主要内容包含: 原理图确认、添加源码、内核配置、DTS 配置、驱动加载调试和 Wi-Fi 使用以及常见问题。
4.3.22.2. RealTek RTL8852bs 移植
X5 EVB V1开发板使用 RTL8852BS 模组,支持 Wi-Fi 和 Bluetooth 功能。
Wi-Fi 使用 SDIO 接口,支持2.4G 频段和5G 频段,支持 IEEE802.11a/b/g/n/ac/axWLAN 标准。
X5 系统启动时自动加载 Wi-Fi 驱动。
RTL8852BS 模组的 Bluetooth 功能调试请参考 蓝牙驱动调试指南。
原理图确认
X5 RTL8852bs 的部分原理图如下:

RTL8852BS Wi-Fi 模组工作的条件,需要硬件满足以下几个条件:
供电:模组有两路供电,其中
VDD_3V3为主电源,VDD_1V8为 IO 上拉电源。使能:要能正常工作,需要
WL_REG_ON和SDIO_RESET给高电平,目前硬件上电上拉为高电平,故设备树中不需要配置。时钟:40MHZ 的时钟输入模组可以内部生成,不需要外部单独输入该信号。
通信:模组 SOC 的通信通过 SDIO ,其中
SDIO_DATA_0SDIO_DATA_1SDIO_DATA_2SDIO_DATA_3为 SDIO 的 4 条数据线。SDIO_CMD和SDIO_CLK分别为 命令信号线和时钟线。
添加源码
步骤1:获取驱动源码
X5 Kernel 版本为 6.1.83,建议使用厂商提供的适配好的内核版本驱动。
步骤2:创建驱动目录
在
kernel/drivers/staging下创建rtl8852bs目录,并复制驱动源码。步骤3:配置 Kconfig 和 Makefile
在
kernel/drivers/staging/Kconfig中添加以下内容:source "drivers/staging/rtl8852bs/Kconfig"
在
kernel/drivers/staging/Makefile中添加编译支持:obj-$(CONFIG_RTL8852BS) += rtl8852bs/
步骤4:调整 Kconfig 配置
在
kernel/drivers/staging/rtl8852bs/Kconfig修正帮助信息的语法解析:config RTL8852BS tristate "Realtek 8852B SDIO WiFi" - ---help--- + help Help message of RTL8852BS
在
kernel/drivers/staging/rtl8852bs/Makefile修改平台相关配置:###################### Platform Related ####################### -CONFIG_PLATFORM_I386_PC = y +CONFIG_PLATFORM_I386_PC = n +CONFIG_PLATFORM_ARM_HOBOT = y ########### CUSTOMER ################################ CONFIG_DRVEXT_MODULE = n @@ -240,6 +240,8 @@ endif ifeq ($(CONFIG_PLATFORM_RTL8198D), y) DRV_PATH = $(src) +else ifeq ($(CONFIG_PLATFORM_ARM_HOBOT), y) +DRV_PATH = $(srctree)/$(src) else DRV_PATH = $(TopDIR) endif
步骤5:新建平台编译选项
根据 RealTek 移植文档新建
kernel/drivers/staging/rtl8852bs/platform/arm_hb.mk并添加 HOBOT 平台配置编译选项ifeq ($(CONFIG_PLATFORM_ARM_HOBOT), y) EXTRA_CFLAGS += -DCONFIG_PLATFORM_ARM_HOBOT EXTRA_CFLAGS += -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS += -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT EXTRA_CFLAGS += -DCONFIG_RADIO_WORK EXTRA_CFLAGS += -DCONFIG_CONCURRENT_MODE ifeq ($(CONFIG_PCI_HCI), y) EXTRA_CFLAGS += -DCONFIG_PLATFORM_OPS _PLATFORM_FILES := platform/platform_linux_HB_pci.o \ platform/platform_ARM_HB_pci.o OBJS += $(_PLATFORM_FILES) # Core Config # CONFIG_RTKM - n/m/y for not support / standalone / built-in CONFIG_RTKM = m EXTRA_CFLAGS += -DCONFIG_TX_SKB_ORPHAN # PHL Config EXTRA_CFLAGS += -DRTW_WKARD_98D_RXTAG endif ifeq ($(CONFIG_SDIO_HCI), y) _PLATFORM_FILES = platform/platform_ARM_HB_sdio.o endif endif # CONFIG_PLATFORM_ARM_HOBOT
然后执行
./bd.sh boot menuconfig检查是否能看到 rtl8852bs 模块,勾选后解决编译错误。
功能测试和调试
WIFI 模组驱动日志配置方法如下,Makefile 中:
调试过程中建议配置
CONFIG_RTW_DEBUG = y,调试结束后配置CONFIG_RTW_DEBUG = n。CONFIG_RTW_LOG_LEVEL可以配置为 2 或者 4。配置为 2 时 仅输出 error 信息。
配置为 4 时 输出包括 warning 和 debug 和 error 信息。
CONFIG_RTW_DEBUG = n #debug 开关
CONFIG_RTW_LOG_LEVEL = 4 #debug level
内核配置
进入到 BSP 的build目录下,执行 ./xbuild.sh boot menuconfig 进行内核功能配置。
配置命令
执行 ./xbuild.sh boot menuconfig 会启动一个基于文本的菜单界面。使用键盘上的方向键导航菜单。按 Enter 键进入子菜单或修改配置选项。完成配置后,选择“Save”菜单项来保存你的配置。
配置选项
1.配置内核选项CONFIG_RTL8852BS=m

2.配置内核选项CONFIG_CFG80211=m
WiFi 的使用必须要在 kernel 中打开 cfg80211 和 mac80211 的支持

3.配置内核选项CONFIG_RFKILL=m

DTS 配置
控制器确认
X5上有3个 MMC 控制器,需要先确认 RTL8852BS 使用的是哪一个控制器,方法如下:
根据原理图连接和设备树
pinmux-func.dtsi可知,管脚HSIO_SDIO_CMD对应的管脚复用配置为pinctrl_sdio。pinctrl_sdio: sdiogrp { horizon,pins = < HSIO_SDIO_WP HSIO_PINMUX_2 BIT_OFFSET8 MUX_ALT0 &pconf_sd_sdio_pu_ds3_ipctrl HSIO_SDIO_CLK HSIO_PINMUX_0 BIT_OFFSET30 MUX_ALT0 &pconf_sd_sdio_pu_ds5_ipctrl HSIO_SDIO_CMD HSIO_PINMUX_0 BIT_OFFSET28 MUX_ALT0 &pconf_sd_sdio_pu_ds3_ipctrl HSIO_SDIO_DATA0 HSIO_PINMUX_1 BIT_OFFSET0 MUX_ALT0 &pconf_sd_sdio_pu_ds3_ipctrl HSIO_SDIO_DATA1 HSIO_PINMUX_2 BIT_OFFSET30 MUX_ALT0 &pconf_sd_sdio_pu_ds3_ipctrl HSIO_SDIO_DATA2 HSIO_PINMUX_2 BIT_OFFSET28 MUX_ALT0 &pconf_sd_sdio_pu_ds3_ipctrl HSIO_SDIO_DATA3 HSIO_PINMUX_2 BIT_OFFSET26 MUX_ALT0 &pconf_sd_sdio_pu_ds3_ipctrl >; };
pinctrl_sdio配置由板级配置设备树中的sdio_1节点引用。/* SDIO */ &sdio_1 { status = "okay"; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_sdio>; };
进一步查看
x5.dtsi文件中sdio_1节点的配置,确认其使用的控制器为sdhci@35030000。sdio_1: sdhci@35030000 { compatible = "horizon,x5-dwcmshc-sd"; status = "disabled"; reg = <0x35030000 0x10000>, <0x3505008c 0x10>; /* ctrler, dll_ctrl */ interrupt-parent = <&gic>; interrupts = <GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>; max-frequency = <200000000>; clocks = <&hpsclks X5_HSIO_SDIO1_BCLK>, <&hpsclks X5_HSIO_SDIO1_HCLK>, <&hpsclks X5_HSIO_SDIO1_ACLK>, <&hpsclks X5_HSIO_SDIO1_CCLK>, <&hpsclks X5_HSIO_SDIO1_TCLK>; clock-names = "core", "bus", "axi", "card", "timer"; bus-width = <4>; non-removable; no-sd; no-mmc; cap-sdio-irq; cap-sd-highspeed; sd-uhs-sdr50; sd-uhs-sdr104; mmc-fixed-voltage = <1800>; disable-wp; resets = <&socrst HSIO_SDIO_RESET>; reset-names = "sd_rst"; };
确认 DTS 配置
关于 dts 的配置解析,请查看 适配外设注意事项。
确认
sdio_1节点的 status = “okay”。EVB X5 上 WIFI RTL8852BS 是随系统上电的,设备树中默认使用
non-removable的配置,根据硬件设计,如需手动控制上电时序,可以去除配置non-removable。
在 x5-evb.dtsi 中实际使用的 sdio 节点配置:
```dts
/* SDIO */
&sdio_1 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sdio>;
};
```
编译烧录
保存配置后,需要重新编译
./mk_boot.sh编译内核镜像,fastboot.exe flash boot boot.img烧录 boot.img 。然后使用 adb 将
rfkill.ko、cfg80211.ko和8852bs.ko上传到文件系统,adb的使用请参考 使用 adb。
驱动加载调试
使用示波器测量供电、使能和时钟是否符合要求,可以和硬件共同配合确认。
进入系统后使用以下命令确认设备树 sdio 节点配置是否生效,显示
okay即可。#cat /sys/firmware/devicetree/base/soc/hsio_apb/sdhci@35030000/status okaySDIO 控制器在初始化后,可以使用下面命令可以查看到 SDIO 控制器和 mmc index的对应关系。
#ls /sys/devices/platform/soc/35000000.hsio_apb/35030000.sdhci/mmc_host mmc2使用以下命令查看 SDIO 控制器的配置和运行参数是否正确。
#cat /sys/kernel/debug/mmc2/ios clock: 200000000 Hz actual clock: 200000000 Hz vdd: 21 (3.3 ~ 3.4 V) bus mode: 2 (push-pull) chip select: 0 (don't care) power mode: 2 (on) bus width: 2 (4 bits) timing spec: 6 (sd uhs SDR104) signal voltage: 1 (1.80 V) driver type: 0 (driver type B)
使用 insmod 分别加载 WiFi 所需的驱动。
使用
insmod rfkill.ko加载无线设备的管理模块。使用
insmod cfg80211.ko加载无线设备的配置接口模块。使用
insmod 8852bs.ko加载 RTL8852bs 驱动模块。
驱动加载时,SDIO 控制器会尝试与挂载的设备进行通信,通信失败时需要检查设备树配置并使用Ftrace Debug进行调试,详细请参考Ftrace 使用指南。
驱动加载通信成功后,可以通过
ifconfig wlan0检查是否有 wlan0 网络节点产生。wlan0: flags=4098<BROADCAST,MULTICAST> mtu 1500 ether 5c:8a:ae:34:db:ec txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
4.3.22.3. FCS960K 移植
X5 EVB V2开发板使用 FCS960K 模组,支持 Wi-Fi 和 Bluetooth 功能。
Wi-Fi 使用 SDIO 接口,支持2.4G 频段和5G 频段,支持 IEEE802.11a/b/g/n/ac/axWLAN 标准。
X5 系统启动时自动加载 Wi-Fi 驱动。
FCS960K 模组的 Bluetooth 功能调试请参考 蓝牙驱动调试指南。
原理图确认
X5 FCS960K 的部分原理图如下:

FCS960K 能够正常工作,需要满足以下几个硬件条件:
供电:模组有两路供电,其中
VDD_3V3为主电源,VDD_1V8为 IO 上拉电源。使能:要能正常工作,需要
RF_PWR_EN给高电平。天线:WIFI/蓝牙天线接口,
ANT_WIFI/BT,EVB板同时提供板载天线和外置天线的切换,并支持自由切换通信接口配置
Wi-Fi子系统(SDIO接口)
SDIO_DATA_0SDIO_DATA_1SDIO_DATA_2SDIO_DATA_3为 SDIO 的 4 条数据线。SDIO_CMD和SDIO_CLK分别为 命令信号线和时钟线。
蓝牙子系统(多模式可扩展接口)
基础通信模式(UART Only)
接口引脚:
BT_RXBT_TX
功能特性:基于UART的异步串行数据通信(如AT指令交互、低速率数据传输),无流控机制,在波特率超载或持续大数据量传输时,存在数据包丢失及缓冲区溢出风险。
增强型传输模式(增加硬件流控)
接口引脚:
BT_RXBT_TXBT_CTSBT_RTS
功能特性:可有效避免数据包丢失及缓冲区溢出风险,支持A2DP高保真单向音频流传输。
语音通信模式(PCM同步接口)
接口引脚:
PCM_SYNCPCM_DINPCM_CLKPCM_DOUT
功能特性:支持基于SCO链路的实时双向音频传输,比如HPF/HSP。
注意事项 为充分发挥EVB板卡的扩展能力,当前硬件设计已集成多样化的硬件接口及外设资源。受限于接口布局与硬件资源分配,EVB板卡未完全复现蓝牙模组的所有通信接口。 若您的项目需要实现更完整的蓝牙协议栈功能(如PCM音频传输、硬件流控等),建议直接联系蓝牙模组供应商,获取针对特定应用场景的定制化选型建议、接口扩展方案及深度固件支持。
驱动移植
X5 EVB V2已经完成FCS960K Wi-Fi模块的移植,您可以在V1.0.20以及后续版本中直接使用WIFI和蓝牙
如果您有定制或开发需求,可以阅读下面的章节,了解详细的移植过程
添加源码
步骤1:获取驱动源码
X5 Kernel 版本为 6.1.83,建议使用厂商提供的适配好的内核版本驱动。
步骤2:创建驱动目录
在
kernel/drivers/net/wireless/下创建aic8800目录,并复制驱动源码。步骤3:配置 Kconfig 和 Makefile
在
kernel/net/wireless/Kconfig中添加以下内容:source "drivers/net/wireless/aic8800/Kconfig"
在
kernel/net/wireless/Makefile中添加编译支持:obj-$(CONFIG_AIC_WLAN_SUPPORT) += aic8800/
内核配置
进入到 SDK 的根目录下,执行 ./bd.sh boot menuconfig 进行内核功能配置,配置完成后,保存并退出。
```kconfig
CONFIG_AIC_WLAN_SUPPORT=y
CONFIG_AIC8800_WLAN_SUPPORT=m
CONFIG_BT_HCIUART_H4=y
```
DTS 配置
FC960K 模组的 DTS 配置都可以在V2P0的dts文件中找到,kernel/arch/arm64/boot/dts/hobot/x5-evb-lp4-v2p0.dts,具体内容如下:
```dts
/* ANT_CTRL1 */
&hsio_iomuxc {
hsio_gpio0_23: hsio_gpio0_23 {
horizon,pins = <
HSIO_SDIO_WP HSIO_PINMUX_2 BIT_OFFSET8 MUX_ALT2 &pconf_output_high
>;
};
pinctrl_sdio: sdiogrp {
horizon,pins = <
HSIO_SDIO_CLK HSIO_PINMUX_0 BIT_OFFSET30 MUX_ALT0 &pconf_sd_sdio_pu_ds5_ipctrl
HSIO_SDIO_CMD HSIO_PINMUX_0 BIT_OFFSET28 MUX_ALT0 &pconf_sd_sdio_pu_ds3_ipctrl
HSIO_SDIO_DATA0 HSIO_PINMUX_1 BIT_OFFSET0 MUX_ALT0 &pconf_sd_sdio_pu_ds3_ipctrl
HSIO_SDIO_DATA1 HSIO_PINMUX_2 BIT_OFFSET30 MUX_ALT0 &pconf_sd_sdio_pu_ds3_ipctrl
HSIO_SDIO_DATA2 HSIO_PINMUX_2 BIT_OFFSET28 MUX_ALT0 &pconf_sd_sdio_pu_ds3_ipctrl
HSIO_SDIO_DATA3 HSIO_PINMUX_2 BIT_OFFSET26 MUX_ALT0 &pconf_sd_sdio_pu_ds3_ipctrl
>;
};
};
/* ANT_CTRL2 */
&lsio_iomuxc {
lsio_gpio1_4: lsio_gpio1_4 {
horizon,pins = <
LSIO_SPI0_SSN LSIO_PINMUX_1 BIT_OFFSET2 MUX_ALT2 &pconf_output_low
>;
};
};
/* RF_PWR_EN */
&aon_iomuxc {
aon_gpio_3: aon_gpio_3 {
horizon,pins = <
AON_GPIO0_PIN3 INVALID_PINMUX BIT_OFFSET0 MUX_ALT0 &pconf_output_high
>;
};
};
&sdio_1 {
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_sdio &aon_gpio_3 &hsio_gpio0_23 &lsio_gpio1_4>;
power-gpios = <&aon_gpio_porta 3 GPIO_ACTIVE_HIGH>;
toggle_interval_us = <100000>;
};
```
pinctrl_sdio是sdio管脚复用。hsio_gpio0_23,lsio_gpio1_4是切换天线的gpio引脚。aon_gpio_3是RF_PWR_EN的引脚,需要配置为高电平才能使能模组。sdio_1是wifi模块的对应的sdio节点的配置,其中status字段表示该节点的状态,pinctrl-names字段表示复用配置,pinctrl-0字段表示复用配置,power-gpios字段表示RF_PWR_EN的gpio引脚,toggle_interval_us字段表示RF_PWR_EN的切换间隔。
添加固件
在系统中添加FCS960K的固件
需要将以下文件拷贝到 system/buildroot/prebuilt/boot-utils-runtime/vendor/etc/firmware 目录下:
```bash
/vendor/etc/firmware/aic_userconfig_8800d80.txt
/vendor/etc/firmware/fmacfw_8800d80_u02.bin
/vendor/etc/firmware/fmacfwbt_8800d80_u02.bin
/vendor/etc/firmware/fw_adid_8800d80_u02.bin
/vendor/etc/firmware/fw_patch_8800d80_u02.bin
/vendor/etc/firmware/fw_patch_table_8800d80_u02.bin
/vendor/etc/firmware/lmacfw_rf_8800d80_u02.bin
```
如果您编译的Ubuntu系统,需要拷贝到 system/ubuntu/prebuilt/boot-utils-runtime/vendor/etc/firmware 目录下。
编译烧录
保存配置后,执行
./bd.sh重新编译内核镜像和系统镜像;编译脚本会自动拷贝驱动到系统中
/lib/modules/$(uname -r)/kernel/drivers/net/wireless/aic8800SDIO接口的wifi驱动会通过udev规则进行加载。
驱动调试
使用示波器测量供电、使能和时钟是否符合要求,可以和硬件共同配合确认。
进入系统后使用以下命令确认设备树 sdio 节点配置是否生效,显示
okay即可。#cat /sys/firmware/devicetree/base/soc/hsio_apb/sdhci@35030000/status okaySDIO 控制器在初始化后,可以使用下面命令可以查看到 SDIO 控制器和 mmc index的对应关系。
#ls /sys/devices/platform/soc/35000000.hsio_apb/35030000.sdhci/mmc_host mmc2使用以下命令查看 SDIO 控制器的配置和运行参数是否正确。
#cat /sys/kernel/debug/mmc2/ios clock: 200000000 Hz actual clock: 200000000 Hz vdd: 21 (3.3 ~ 3.4 V) bus mode: 2 (push-pull) chip select: 0 (don't care) power mode: 2 (on) bus width: 2 (4 bits) timing spec: 6 (sd uhs SDR104) signal voltage: 1 (1.80 V) driver type: 0 (driver type B)
驱动加载通信成功后,可以通过
ifconfig wlan0检查是否有 wlan0 网络节点产生。wlan0: flags=4098<BROADCAST,MULTICAST> mtu 1500 ether 5c:8a:ae:34:db:ec txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
4.3.22.4. Wi-Fi 使用
Wi-Fi 的使用分为两种主要模式:STA 模式和 AP 模式。
STA 模式(Station 模式):设备作为客户端连接到无线热点,从而接入局域网或互联网。
AP 模式(Access Point 模式):设备作为无线热点供其他设备连接,形成局域网络。
两种模式适用于不同场景,STA 模式通常用于联网测试,AP 模式适用于设备组网和调试。
Wi-Fi STA 模式测试
状态确认
开发板上电后默认工作在
STA模式。可以通过iw dev wlan0 info命令查看wlan0的网络节点信息:网络节点信息的 type 字段:AP 表示
AP模式,managed 表示STA模式。
运行结果:
```bash
Interface wlan0
ifindex 3
wdev 0x1
addr 5c:8a:ae:34:db:ec
type managed
wiphy 0
channel 36 (5180 MHz), width: 20 MHz (no HT), center1: 5180 MHz
txpower 12.00 dBm
```
联网测试
运行
wifi_connect [ssid] [password]连接热点联网。[ssid]和[password]需要替换为实际的热点名称和密码。
示例:
```bash
wifi_connect "WiFi-Test" "12345678"
```
运行结果:
```bash
Successfully initialized wpa_supplicant
[ 3079.230115] [BB][halbb_la_bb_set_smp_rate] smp_rate_tmp=7, la_smp_rate_log=160 M
udhcpc: started, v1.35.0
udhcpc: broadcasting discover
udhcpc: broadcasting select for 192.168.43.207, server 192.168.43.1
udhcpc: lease of 192.168.43.207 obtained from 192.168.43.1, lease time 3600
deleting routers
adding dns 192.168.43.1
default via 192.168.43.1 dev wlan0
default via 192.168.1.1 dev eth0 metric 700 linkdown
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10 linkdown
192.168.43.0/24 dev wlan0 proto kernel scope link src 192.168.43.207
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
local 192.168.1.10 dev eth0 table local proto kernel scope host src 192.168.1.10
broadcast 192.168.1.255 dev eth0 table local proto kernel scope link src 192.168.1.10 linkdown
local 192.168.43.207 dev wlan0 table local proto kernel scope host src 192.168.43.207
broadcast 192.168.43.255 dev wlan0 table local proto kernel scope link src 192.168.43.207
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=1 ttl=50 time=65.481 ms
64 bytes from 8.8.8.8: seq=2 ttl=50 time=70.789 ms
64 bytes from 8.8.8.8: seq=3 ttl=50 time=71.112 ms
```
Wi-Fi AP 模式测试
切换 AP 模式
执行以下命令将 Wi-Fi 切换为 AP 模式:
```bash
/etc/init.d/wifi_init.sh ap
```
运行结果:
```bash
Initialize wlan0 to ap mode
wlan0: interface state UNINITIALIZED->ENABLED
wlan0: AP-ENABLED
Finish initialize wlan0 to ap mode
dnsmasq: started, version 2.86 cachesize 150
root@buildroot:~# dnsmasq: compile time options: IPv6 GNU-getopt DBus no-UBus no-i18n no-IDN DHCP DHCPv6 no-Lua TFTP no-conntrack ipset auth no-cryptohash no-DNSSEC loop-detect inotify dumpfile
dnsmasq: warning: no upstream servers configured
dnsmasq-dhcp: DHCP, IP range 192.168.5.2 -- 192.168.5.254, lease time 12h
dnsmasq: read /etc/hosts - 2 addresses
```
状态确认
切换后 WIFI 工作在
AP模式。通过iw dev wlan0 info命令查看wlan0的网络节点信息:网络节点信息的 type 字段:AP 表示
AP模式,managed 表示STA模式。网络节点信息的 ssid 字段表示热点的名字。
运行结果:
```bash
Interface wlan0
ifindex 3
wdev 0x1
addr 5c:8a:ae:34:db:ec
ssid test
type AP
wiphy 0
channel 1 (2412 MHz), width: 20 MHz (no HT), center1: 2412 MHz
txpower 12.00 dBm
```
连接 AP 热点
使用手机连接 SSID 为
test的热点。

连接成功后,开发板会显示设备 HONOR_30 使用 IP
192.168.5.153接入了 wlan0 。dnsmasq-dhcp: DHCPREQUEST(wlan0) 192.168.5.153 c2:31:4e:29:d5:6a dnsmasq-dhcp: DHCPACK(wlan0) 192.168.5.153 c2:31:4e:29:d5:6a HONOR_30-bffd2df053010722
测试设备连通性
测试开发板与接入设备的网络连通性:
```bash
# ping 192.168.5.153
PING 192.168.5.153 (192.168.5.153): 56 data bytes
64 bytes from 192.168.5.153: seq=0 ttl=64 time=8.818 ms
64 bytes from 192.168.5.153: seq=1 ttl=64 time=10.939 ms
64 bytes from 192.168.5.153: seq=2 ttl=64 time=15.955 ms
64 bytes from 192.168.5.153: seq=3 ttl=64 time=6.316 ms
```
4.3.22.5. WIFI 性能测试
关于 WIFI 性能测试,请查阅 Wi-Fi 性能测试。
4.3.22.6. 常见问题
wifi 名字变更
现象:网卡接口名称发生变更(如从
wlan0变为其他名称),导致配置文件中定义的网络接口名称失效,影响网络功能。分析:系统中启用了 udev 规则自动为网卡分配名称,可能会修改默认名称
wlan0,尤其在驱动或硬件初始化时触发此行为。解决方法:
使用
ethtool -i wlan0命令查看网卡接口wlan0的驱动和固件信息:# ethtool -i wlan0 driver: rtl8852bs version: v1.19.7.1-91-gcb07686050.202404 firmware-version: N/A expansion-rom-version: bus-info: mmc2:0001:1 supports-statistics: yes supports-test: no supports-eeprom-access: no supports-register-dump: no supports-priv-flags: no
删除生成的临时的规则文件
/etc/udev/rules.d/70-persistent-net.rules。添加以下 udev 规则,限制 udev 对驱动 rtl8852bs 的 wlan0 节点的修改:
echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="rtl8852bs", KERNEL=="wlan*", NAME="wlan0"'> /etc/udev/rules.d/99-disable-netname.rules
重启 udev 服务或系统以使规则生效:
/etc/init.d/S10udev start
通信失败错误码
出现以下通信失败日志:mmc2:0001:1: rtw_sdio_raw_read: sdio read failed (-110)
CMD52 导致的 -110 错误
现象:CMD52 命令超时。
分析:CMD52 是单字节寄存器操作命令,纯硬件实现。
解决方法:
SDIO 设备未正常供电,检查电源状态。
时钟信号异常,确保时钟输入完整。
CMD53 导致的 -110 错误
现象:CMD53 命令超时。
分析:CMD53 用于多块数据的读写操作。
解决方法:
确认驱动和设备树配置是否与硬件匹配,比如使用的 SDIO 控制器是否一致。
数据线信号质量问题,检查 DATA0~DATA3 连线,一般飞线可能导致相关情况的发生。
时钟频率过高,尝试降低 SDIO 时钟频率(如从 50 MHz 降到 25 MHz)。
修改设备树中 SDIO 节点的
bus-width配置为 1,仅使用单条数据线 DATA0 进行通信。
SDIO 枚举失败
现象:示波器测量不到 CMD 命令或者 Dynamic Debug 没有 CMD 打印。
分析:确认模组硬件上 Card Detect 管脚是否存在和设备树配置。
解决方法:
如果 WIFI 模组没有 Card Detect 管脚,必须将”broken-cd”加上。
如果需要对WiFi进行上下电,需要将”non-removable”字段删除,host端才会进行多次探测;否则的话WiFi模组不会被二次探测。