『7x24小时有问必答』
嵌入式Linux开发中,WiFi和蓝牙调试是绕不过去的坎。SDIO怎么接?驱动怎么配?固件往哪放?本文以RK平台为例,用通俗语言讲原理、硬件框图理关系、架构图理层次、实战命令解决80%常见问题,让你的板子快速联网。

---

一、原理简析

WiFi模块是什么?

WiFi模块本质上是一个自带CPU和RAM的小电脑,它运行固件(Firmware),通过SDIO/USB/PCIe与主控通信。CPU只负责发命令,WiFi模块自己处理802.11协议。
举个例子:你对手机说"帮我连上那个WiFi",手机里的WiFi模块自己去谈判、握手、收发数据,最后告诉你连上了。CPU就像发号施令的老板,WiFi模块就是埋头干活的秘书。

三种接口怎么选?

接口
速度
接线复杂度
适用场景
SDIO
最大208MHz(SDIO3.0)/ 实际常用150MHz
复杂(CMD+DAT0-3)
主流模组首选
USB
480Mbps
简单(4根线)
免驱模组
PCIe
最高
中等
高性能AP模组
️  SDIO降频说明:SDIO 3.0规范定义最大时钟208MHz(SDR104模式),但实际嵌入式模组通常工作在150MHz以下。降频成功往往说明信号完整性不足。

Combo模组是怎么回事?

市面上绝大多数WiFi/BT模组是二合一Combo方案——WiFi和蓝牙共用供电和32K时钟,仅通信接口分离:
共享资源
说明
供电
共用VDDIO(1.8V/3.3V),部分模组支持WiFi和BT独立使能
32K时钟
共用32.768K晶振,WiFi和BT都依赖这个参考时钟
天线
共用射频电路,部分模组支持分集天线
部分模组(如部分Realtek方案)支持WiFi和BT独立REG_ON控制,需要分别配置GPIO。

蓝牙为什么用UART?

蓝牙数据传输量小,UART足够用。更重要的是,HCI(Host Controller Interface)协议天生就是串口协议——简单可靠。
可以这样理解:WiFi要传视频、传文件,数据量大,需要SDIO/USB这种高速通道;蓝牙只是传传控制命令,UART这根"电话线"就够用了。

firmware是什么?

固件就是WiFi/BT模块的"操作系统"。没有它,模块就是一块废铁。主控开机后,把固件下载到模块的RAM里,模块才能工作。
这东西就像BIOS——没有BIOS,电脑就是一堆零件;没有固件,WiFi模组也是一堆零件。

---

二、硬件框图与架构图

2.1 硬件连接框图

2.2 软件架构图

2.3 启动流程图

三、实战步骤

3.1 环境配置三板斧

第一步:SDK配置
# 在BoardConfig.mk中指定模组型号

RK_WIFIBT_CHIP="RTL8723DS"# 或 AP6255 / CYW43438 等

第二步:DTS配置(SDIO为例)
/* 电源控制:由MMC框架统一管理,开机前先拉低复位WiFi模组 */

sdio_pwrseq: sdio-pwrseq {

      compatible = "mmc-pwrseq-simple";

      pinctrl-0 = <&wifi_enable_h>;

      reset-gpios = <&gpio0 RK_PA2 GPIO_ACTIVE_LOW>;   /* WiFi模组复位脚,低有效 */

};

/* SDIO控制器 */

&sdio {

      max-frequency = <150000000>;   /* SDIO3.0最大150MHz,降频可解决信号完整性问题 */

      bus-width = <4>;

      cap-sdio-irq;                         /* 启用SDIO中断,支持休眠唤醒 */

      keep-power-in-suspend;            /* 休眠时保持电源 */

      mmc-pwrseq = <&sdio_pwrseq>;

      status = "okay";

};

/* WiFi节点 */

wireless-wlan {

      compatible = "wlan-platdata";

      wifi_chip_type = "rtl8723ds";   /* 必须与SDK配置一致 */

      WIFI,host_wake_irq = <&gpio0 RK_PA0 GPIO_ACTIVE_HIGH>;   /* WiFi唤醒CPU的中断脚 */

      status = "okay";

};

/* 蓝牙节点(UART) */

wireless-bluetooth {

      compatible = "bluetooth-platdata";

      BT,power_gpio = <&gpio4 RK_PB3 GPIO_ACTIVE_HIGH>;   /* BT电源使能脚 */

      uart_rts_gpios = <&gpio4 RK_PA7 GPIO_ACTIVE_LOW>;   /* 蓝牙UART流控(可省但建议接) */

      status = "okay";

};

/* UART配置 */

&uart4 {

      pinctrl-0 = <&uart4_xfer &uart4_ctsn>;

      status = "okay";

};

GPIO速查:reset-gpios(复位)、host_wake_irq(唤醒)、uart_rts_gpios(流控)
第三步:内核配置
# ===== 必选配置 =====

CONFIG_RFKILL=y                     # 无线电源管理框架

CONFIG_RFKILL_RK=y                 # RK平台rfkill扩展

CONFIG_MMC=y                          # MMC/SDIO控制器框架

CONFIG_MMC_DW=y                    # DesignWare SD/MMC控制器

CONFIG_MMC_DW_ROCKCHIP=y     # RK平台DW控制器特定支持

CONFIG_WIRELESS=y                 # 通用无线支持

CONFIG_CFG80211=y                  # 无线配置接口

CONFIG_MAC80211=y                  # 802.11协议栈

CONFIG_BT=y                           # 蓝牙支持

CONFIG_BT_HCIUART=y              # 蓝牙UART传输层

# ===== 模组专属驱动(按需选一)=====

CONFIG_RTL8723DS=m                 # Realtek RTL8723DS

CONFIG_RTL8822CS=m                 # Realtek RTL8822CS

CONFIG_BCMDHD=m                     # 正基AP模组

CONFIG_CYWDHD=m                     # 英飞凌/Cypress模组

# ===== 休眠唤醒(WiFi省电相关)=====

CONFIG_PM=y                             # 电源管理框架

CONFIG_PM_GENERIC_DOMAINS=y   # Generic PM domains

# CONFIG_CFG80211_WOWLAN=y    # WoWLAN支持(连接断开时唤醒,参考下期预告)

️  RK平台注意:CONFIG_MMC_DW_ROCKCHIP=y  是 RK 平台必须项,否则 SDIO 控制器无法正确识别模组
️  insmod vs modprobe vs 编入内核:调试阶段用  insmod  手动加载;量产可写入  /etc/modules/  开机自启,或直接将驱动编入内核(=y)省去加载步骤

3.2 固件文件放哪里?

️  路径区分:以下路径为  Android系统(如RK平台)  常见布局;纯嵌入式Linux(Buildroot/Debian)的固件和驱动通常在  /lib/firmware/  和  /lib/modules/  下。
# 固件目录结构(Android RK系统,烧录后在板子上查看)

/

├── /system/vendor/lib/modules/        # WiFi驱动ko(Android)

│    ├── bcmdhd.ko                           # 正基模组

│    └── rtl8723ds.ko                     # Realtek模组

│

├── /system/vendor/etc/firmware/     # WiFi固件+NVRAM(Android)

│    ├── fw_bcm43455c0_ag.bin         # 正基WiFi固件

│    └── nvram_ap6255.txt               # NVRAM配置(功率/天线参数)

│

├── /lib/firmware/rtlbt/                 # 蓝牙固件(Realtek,Linux/Android通用)

│    ├── rtl8723d_fw                       # 蓝牙固件

│    └── rtl8723d_config                 # 蓝牙配置

│

├── /lib/firmware/rtlbt/                 # 蓝牙固件(Realtek USB方案)

│    ├── rtl8821cu_fw

│    └── rtl8821cu_config

│

└── /lib/firmware/brcm/                  # 蓝牙固件(正基/英飞凌,.hcd格式)

      └── BCM4345C0.hcd                     # Broadcom蓝牙固件

️  驱动加载方式:调试用  insmod;量产建议将驱动编入内核(CONFIG_xxx=y)或写入  /etc/modules/  开机自启。

3.3 功能验证命令

WiFi连接三步走:
# ===== 第一步:加载驱动 =====

insmod /system/vendor/lib/modules/bcmdhd.ko

# 或

insmod /system/vendor/lib/modules/rtl8723ds.ko

# ===== 第二步:启动WiFi =====

ifconfig wlan0 up

# ===== 第三步:连接热点 =====

wpa_supplicant -B -i wlan0 -c /data/cfg/wpa_supplicant.conf

wpa_cli -i wlan0 scan

wpa_cli -i wlan0 scan_results

wpa_cli -i wlan0 reconnect

# ===== 第四步:获取IP =====

udhcpc -i wlan0

# 或

dhcpcd wlan0

wpa_supplicant.conf配置:
cat  > /data/cfg/wpa_supplicant.conf <<  'EOF'

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev

ap_scan=1

update_config=1

network={

      ssid="YourSSID"

      psk="YourPassword"

      key_mgmt=WPA-PSK

}

EOF

️  语法注意:ctrl_interface  必须写成  DIR=/path GROUP=xxx  格式,缺少 DIR= 会导致 wpa_supplicant 启动失败
进阶配置示例:
# ===== 隐藏SSID连接 =====

network={

      ssid="MyHiddenNetwork"

      scan_ssid=1

      psk="password"

      key_mgmt=WPA-PSK

}

# ===== 多个WiFi优先级(按顺序匹配)=====

network={

      ssid="Office"

      psk="office123"

      key_mgmt=WPA-PSK

      priority=2         # 优先级高,优先连接

}

network={

      ssid="Home"

      psk="home123"

      key_mgmt=WPA-PSK

      priority=1

}

# ===== 静态IP配置 =====

network={

      ssid="StaticIP"

      psk="password"

      key_mgmt=WPA-PSK

      ip_address=192.168.1.100

      gateway=192.168.1.1

      dns=8.8.8.8

}

蓝牙验证:
# ===== Realtek UART蓝牙 =====

echo  0 > /sys/class/rfkill/rfkill0/state

sleep  1

echo  1 > /sys/class/rfkill/rfkill0/state

hciattach -n -s 115200 /dev/ttyS4 rtk_h5 &

# ===== 正基/英飞凌蓝牙 =====

echo  0 > /sys/class/rfkill/rfkill0/state

sleep  1

echo  1 > /sys/class/rfkill/rfkill0/state

brcm_patchram_plus1 --enable_hci --baudrate 1500000 \

      --patchram /system/vendor/etc/firmware/BCM4345C0.hcd /dev/ttyS4 &

# ===== 验证 =====

hciconfig hci0 up

hciconfig -a

hcitool scan

# ===== rfkill说明 =====

# rfkill是无线设备的通用电源管理

# echo 0/1 是软开关(软件层面阻止无线)

# ️ 优先级低于硬件REG_ON引脚:硬件关了,软件开不了

rfkill list

rfkill block wifi

rfkill unblock wifi

热点模式(AP)补充:
# ===== hostapd配置 =====

cat  > /data/cfg/hostapd.conf <<  'EOF'

interface=wlan0

driver=nl80211

ssid=MyAP

hw_mode=g

channel=6

wpa=2

wpa_passphrase=12345678

wpa_key_mgmt=WPA-PSK

rsn_pairwise=CCMP

auth_algs=1

macaddr_acl=0

wmm_enabled=1

EOF

# ===== 启动热点 =====

# 先给wlan0配静态IP

ifconfig wlan0 192.168.10.1 up

# 启动hostapd

hostapd /data/cfg/hostapd.conf -B

# 启动DHCP服务(可选)

dnsmasq -i wlan0 --dhcp-range=192.168.10.100,192.168.10.200,12h

️  hostapd关键参数说明:
wpa=2  表示 WPA2(wpa=1 是 WPA1)
rsn_pairwise=CCMP  是 WPA2 加密(WPA2 不支持 TKIP,wpa_pairwise=TKIP  是 WPA1 的错误参数)
auth_algs=1  表示开放认证(1=开放,3=开放+WEP)

3.4 性能测试

# ===== iperf吞吐率测试 =====

# 板子作为Server

iperf -s -i 1

# PC作为Server,测试下行

iperf -c 192.168.x.x -i 1 -w 2M -t 120

# UDP测试

iperf -c 192.168.x.x -u -i 1 -b 100M -t 120

3.5 RF指标测试(模组厂协助)

# ===== 进入测试模式 =====

# 正基/英飞凌模组

wl ver   # 显示WL_TEST表示进入测试模式

wl txchain 1

wl rxchain 1

wl channels   # 查看可用信道

# Realtek模组

rtlpriv wlan0 set_band 0         # 2.4G

rtlpriv wlan0 set_band 1         # 5G

rtlpriv wlan0 mp_txpower 50     # 设置功率

rtlpriv wlan0 mp_channel 6      # 设置信道

---

四、常见问题速查

问题对照表

现象
根因
解决
SDIO识别不到
WL_REG_ON配置错误/电压不对
测GPIO波形,确认1.8V/3.3V
wlan0没有
固件路径不对/文件名不匹配
检查firmware目录
扫描不到AP
晶振频率不对/天线未接
确认24M晶振,检查天线
连接后断线
RF指标不合格/干扰大
降频测试,换屏蔽环境
蓝牙初始化失败
UART配置错误/RTS/CTS未接
检查DTS UART配置
能扫描WiFi,连接超时
密码错误/加密方式不匹配/路由限制
确认密码,检查路由MAC过滤
能扫描WiFi,认证失败
加密方式(WPA2 vs WPA3)/路由器策略
确认加密方式,尝试WPA2
能搜到蓝牙设备,配对失败
BlueZ权限/波特率不匹配/HCI版本
检查hciattach波特率,确认HCI版本兼容
驱动加载成功,但无wlan0
MAC地址缺失/NVRAM配置错误
检查nvram txt文件是否存在且格式正确
蓝牙能搜到但传输数据失败
SPP/ble profile未加载/服务未启动
sdptool browse hci0
  查看支持的服务

调试命令速查

# ===== 看识别log =====

dmesg | grep -E  "mmc|wl|sdio|wlan"

# ===== 看固件加载log =====

dmesg | grep -E  "firmware|download"

# ===== 看蓝牙log =====

dmesg | grep -E  "hci|bt|uart"

# ===== 看中断情况 =====

cat  /proc/interrupts | grep -E  "mmc|wl|sdio"

# ===== 测GPIO电平 =====

cat  /sys/class/gpio/gpioN/value

# ===== 关闭WiFi(重置前常用)=====

ifconfig wlan0 down

# ===== 终止wpa_supplicant(重新配置前)=====

killall wpa_supplicant

# ===== 查看蓝牙适配器状态 =====

hciconfig -a

hciconfig hci0 status

# ===== 查看rfkill状态 =====

rfkill list

降频调试技巧

# ===== SDIO降频(解决初始化失败) =====

&sdio {

      max-frequency = <10000000>;   # 从150M降到10M测试

};

# ===== CPU定频(排除性能问题) =====

echo  performance > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

# ===== DDR定频 =====

echo  userspace > /sys/devices/platform/dmc/devfreq/dmc/governor

echo  1560000000 > /sys/devices/platform/dmc/devfreq/dmc/min_freq

---

五、总结

核心要点

硬件连接:WiFi走SDIO/USB/PCIe,蓝牙走UART;SDIO必须接CLK/CMD/DAT0-3四根线
固件是灵魂:没有固件,模组就是废铁;固件路径和文件名必须与模组型号匹配
电源是根本:WL_REG_ON、32.768K时钟、IO电压(1.8V/3.3V)缺一不可
三步验证:识别→驱动加载→固件下载,逐层排查

调试经验总结

调试WiFi/BT问题,我总结了一套排查顺序:
识别不到先测电  — 电没供上,后面的都白搭。先用万用表量电压,用示波器看GPIO波形
电压对了查IO域  — 1.8V和3.3V搞混了,模组也起不来
固件下载看log  — dmesg里firmware download失败,十有八九是文件名不对或者路径不对
连接不稳降频测  — SDIO时钟降下来试试,如果降频就稳定了,说明信号完整性有问题
性能不行先定频  — CPU降频、DDR降频都会影响吞吐率,先把这些锁死再测
蓝牙不通查UART  — 波特率对不对?RTS/CTS接了没有?这些低级问题最容易被忽略

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码