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 的部分原理图如下:

image-20250116-151157.png image-20250121-110234.png

RTL8852BS Wi-Fi 模组工作的条件,需要硬件满足以下几个条件:

  • 供电:模组有两路供电,其中 VDD_3V3 为主电源,VDD_1V8 为 IO 上拉电源。

  • 使能:要能正常工作,需要 WL_REG_ONSDIO_RESET 给高电平,目前硬件上电上拉为高电平,故设备树中不需要配置。

  • 时钟:40MHZ 的时钟输入模组可以内部生成,不需要外部单独输入该信号。

  • 通信:模组 SOC 的通信通过 SDIO ,其中 SDIO_DATA_0 SDIO_DATA_1 SDIO_DATA_2 SDIO_DATA_3 为 SDIO 的 4 条数据线。SDIO_CMDSDIO_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

image-20240520-150948.png

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

image-20240520-151434.png

3.配置内核选项CONFIG_RFKILL=m

image-20240520-170735.png

DTS 配置

控制器确认

X5上有3个 MMC 控制器,需要先确认 RTL8852BS 使用的是哪一个控制器,方法如下:

  1. 根据原理图连接和设备树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
    		>;
    };
    
  2. pinctrl_sdio配置由板级配置设备树中的 sdio_1 节点引用。

    /* SDIO */
    &sdio_1 {
    	status = "okay";
    	pinctrl-names = "default";
    	pinctrl-0 = <&pinctrl_sdio>;
    };
    
  3. 进一步查看 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.kocfg80211.ko8852bs.ko上传到文件系统,adb的使用请参考 使用 adb

驱动加载调试

  • 使用示波器测量供电、使能和时钟是否符合要求,可以和硬件共同配合确认。

  • 进入系统后使用以下命令确认设备树 sdio 节点配置是否生效,显示 okay即可。

    #cat /sys/firmware/devicetree/base/soc/hsio_apb/sdhci@35030000/status
    okay
    
  • SDIO 控制器在初始化后,可以使用下面命令可以查看到 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 的部分原理图如下:

image-20250313-210808.png

FCS960K 能够正常工作,需要满足以下几个硬件条件:

  • 供电:模组有两路供电,其中 VDD_3V3 为主电源,VDD_1V8 为 IO 上拉电源。

  • 使能:要能正常工作,需要 RF_PWR_EN 给高电平。

  • 天线:WIFI/蓝牙天线接口,ANT_WIFI/BT,EVB板同时提供板载天线和外置天线的切换,并支持自由切换

  • 通信接口配置

  • Wi-Fi子系统(SDIO接口)

    • SDIO_DATA_0 SDIO_DATA_1 SDIO_DATA_2 SDIO_DATA_3 为 SDIO 的 4 条数据线。SDIO_CMDSDIO_CLK 分别为 命令信号线和时钟线。

  • 蓝牙子系统(多模式可扩展接口)

    • ‌基础通信模式(UART Only)‌

      • 接口引脚:BT_RX BT_TX

      • 功能特性:基于UART的异步串行数据通信(如AT指令交互、低速率数据传输),无流控机制,在波特率超载或持续大数据量传输时,存在数据包丢失及缓冲区溢出风险。

    • ‌增强型传输模式(增加硬件流控)‌

      • 接口引脚:BT_RX BT_TX BT_CTS BT_RTS

      • 功能特性:可有效避免数据包丢失及缓冲区溢出风险,支持A2DP高保真单向音频流传输。

    • 语音通信模式(PCM同步接口)

      • 接口引脚:PCM_SYNC PCM_DIN PCM_CLK PCM_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>;
};
```
  1. pinctrl_sdio是sdio管脚复用。

  2. hsio_gpio0_23lsio_gpio1_4是切换天线的gpio引脚。

  3. aon_gpio_3 是RF_PWR_EN的引脚,需要配置为高电平才能使能模组。

  4. 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/aic8800

  • SDIO接口的wifi驱动会通过udev规则进行加载。

驱动调试

  • 使用示波器测量供电、使能和时钟是否符合要求,可以和硬件共同配合确认。

  • 进入系统后使用以下命令确认设备树 sdio 节点配置是否生效,显示 okay即可。

    #cat /sys/firmware/devicetree/base/soc/hsio_apb/sdhci@35030000/status
    okay
    
  • SDIO 控制器在初始化后,可以使用下面命令可以查看到 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
```
注意: udhcpc 连接 Wi-Fi 时,如果设备没有天线,信号强度不好的情况下,需要花费比较长时间扫描 Wi-Fi 热点和连接 Wi-Fi。

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 的热点。

image-20250117-120355.png

  • 连接成功后,开发板会显示设备 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,尤其在驱动或硬件初始化时触发此行为。

  • 解决方法

  1. 使用 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
    
  2. 删除生成的临时的规则文件 /etc/udev/rules.d/70-persistent-net.rules

  3. 添加以下 udev 规则,限制 udev 对驱动 rtl8852bs 的 wlan0 节点的修改:

     echo 'SUBSYSTEM=="net", ACTION=="add", DRIVERS=="rtl8852bs", KERNEL=="wlan*", NAME="wlan0"'> /etc/udev/rules.d/99-disable-netname.rules
    
  4. 重启 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模组不会被二次探测。