前言
RK3506 作为瑞芯微中低端 ARM64 芯片,常用于网关、盒子、IPC、工业控制,但部分方案不带原生 WiFi,使用 ESP32-SDIO 从机方案 成本低、带宽高、稳定性远超 USB WiFi。本文基于 esp-hosted NG(下一代) 完整实现:
- SDIO 4-bit 50MHz
- 虚拟网卡 wlan0 透传
- Linux 标准 netlink、iw/iwconfig/wpa_supplicant 通用
- 实测速率 25~30Mbps,7×24h 稳定
适用读者:RK3506/Linux 驱动工程师、嵌入式网关开发、固件开发。
一、方案整体架构
RK3506(主CPU) ←SDIO 4bit→ ESP32(从机WiFi/BT)
Linux SDIO Slave固件
esp-hosted驱动 ↓
虚拟网卡:wlan0 WiFi/蓝牙协议栈
优势:
- SDIO 比 USB 更稳定,无 USB 休眠问题
- ESP32 成本低、供货稳
- 支持 WiFi STA/AP/SNIFFER
- 标准 Linux net 接口,应用层无需修改
二、硬件接线(RK3506 ↔ ESP32)
2.1 必须信号(SDIO + 复位)
| RK3506 SDMMC1 | ESP32 引脚 | 功能 | 注意 |
|---|---|---|---|
| CLK | GPIO14 | SDIO_CLK | 串 22~33Ω 电阻 |
| CMD | GPIO15 | SDIO_CMD | 10K 上拉到 3.3V |
| D0 | GPIO2 | SDIO_D0 | 10K 上拉 |
| D1 | GPIO4 | SDIO_D1 | 10K 上拉 |
| D2 | GPIO12 | SDIO_D2 | 10K 上拉 |
| D3 | GPIO13 | SDIO_D3 | 10K 上拉 |
| GPIO518(GPIO0_B6) | EN | 复位 | 低电平复位 |
共地必须! 两地线直连。
2.2 电源
- ESP32:3.3V ≥300mA
- 不可与核心板噪声电源共用
三、ESP32 从机固件编译(SDIO Slave)
3.1 源码与分支(非常重要)
使用官方下一代:esp-hosted-FG(NextGen)
git clone https://github.com/espressif/esp-hosted.git
cd esp-hosted
git checkout esp_hosted_fg
3.2 IDF 版本
推荐:v5.1 / v5.2
3.3 工程路径
esp_hosted_fg/esp/esp_driver/network_adapter
3.4 MenuConfig 关键配置
idf.py menuconfig
- Component config → ESP Hosted Feature
- Transport Select: SDIO
- WiFi: Enable
- BT: Disable(如不需要)
- Component config → SDIO Slave
- Bus width: 4-bit
- Clock: 40MHz / 50MHz
- 关闭无用模块:OTA、JTAG、Console 等
3.5 编译下载
idf.py build flash monitor
成功日志:
I (xx) sdio_slave: Init done
I (xx) hosted: Hosted transport initialized
四、RK3506 Linux 内核配置(必选)
4.1 内核使能 SDIO
Device Drivers
→ MMC/SD/SDIO
→ MMC block device
→ SDIO interface
→ Rockchip SD/SDIO controller
CONFIG_MMC=y
CONFIG_MMC_BLOCK=y
CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_PLTFM=y
CONFIG_MMC_SDHCI_OF_ARASAN=y
CONFIG_MMC_SDIO=y
4.2 WiFi 子系统
CONFIG_WIRELESS=y
CONFIG_CFG80211=y
CONFIG_MAC80211=y
4.3 禁用冲突
关闭 USB WiFi 模块(如 RTL8188/8723)避免抢占资源。
五、设备树 DTS 完整配置(rk3506.dtsi & .dts)
5.1 SDMMC1 配置
dts
&sdmmc1 {
status = "okay";
max-frequency = <50000000>;
bus-width = <4>;
non-removable;
cap-sdio-irq;
keep-power-in-suspend;
mmc-pwrseq = <&sdio_pwrseq>;
pinctrl-names = "default";
pinctrl-0 = <&sdmmc1_pins>;
};
5.2 电源 / 复位序列(关键!)
dts
sdio_pwrseq: sdio-pwrseq {
compatible = "mmc-pwrseq-simple";
reset-gpios = <&gpio0 RK_PB6 GPIO_ACTIVE_LOW>; // ESP32 EN
post-power-on-delay-ms = <100>;
power-off-delay-us = <10>;
};
5.3 PinCtrl
dts
sdmmc1_pins: sdmmc1 {
mux {
rockchip,pins =
<0 RK_PA4 1 &pcfg_pull_up_drv_8ma>, /* CMD */
<0 RK_PA5 1 &pcfg_pull_up_drv_8ma>, /* CLK */
<0 RK_PA6 1 &pcfg_pull_up_drv_8ma>, /* D0 */
<0 RK_PA7 1 &pcfg_pull_up_drv_8ma>, /* D1 */
<0 RK_PB0 1 &pcfg_pull_up_drv_8ma>, /* D2 */
<0 RK_PB1 1 &pcfg_pull_up_drv_8ma>; /* D3 */
};
};
六、Linux 主机驱动编译(esp-hosted)
6.1 驱动路径
esp_hosted_fg/host/linux/host_driver/esp32
6.2 交叉编译
export ARCH=arm64
export CROSS_COMPILE=aarch64-linux-gnu-
export KERNEL_DIR=/home/rk3506/kernel
make
生成:
esp32_sdio.ko
6.3 加载命令
insmod esp32_sdio.ko resetpin=518 clockspeed=50
- resetpin:GPIO 编号(按芯片物理编号)
- clockspeed:40 / 50
6.4 成功标志
dmesg | grep esp
[ 123.456] esp_sdio: probe ok
[ 123.458] esp_sdio: wlan0 registered
ip link
wlan0: flags=4098<BROADCAST,MULTICAST> mtu 1500
七、WiFi 联网完整流程(STA 模式)
7.1 扫描
iw dev wlan0 scan | grep SSID
7.2 WPA 配置
cat > /etc/wpa_supplicant.conf <<EOF
network={
ssid="你的WiFi"
psk="密码"
key_mgmt=WPA-PSK
}
EOF
7.3 连接
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
udhcpc -i wlan0
7.4 测试
ping www.baidu.com
八、AP 模式配置(热点)
hostapd /etc/hostapd.conf
udhcpd /etc/udhcpd.conf
hostapd.conf 示例:
interface=wlan0
driver=nl80211
ssid=RK3506_AP
hw_mode=g
channel=6
wpa=2
wpa_passphrase=12345678
wpa_key_mgmt=WPA-PSK
九、开机自动加载驱动 + 自动连 WiFi
9.1 拷贝 ko
cp esp32_sdio.ko /lib/modules/$(uname -r)/
depmod -a
9.2 /etc/modules-load.d/esp32.conf
esp32_sdio
9.3 /etc/modprobe.d/esp32.conf
options esp32_sdio resetpin=518 clockspeed=50
9.4 网络自启
systemd-networkd / NetworkManager / udhcpc 自行配置
十、性能调优(提升速率与稳定性)
- SDIO 4-bit + 50MHz
- 内核开启:
CONFIG_PREEMPT=y
CONFIG_HZ=1000
- 关闭蓝牙减少中断
- SDIO 线短、差分、包地、上拉标准
- 调整队列:
ifconfig wlan0 txqueuelen 1000
实测:
- iperf3 TCP 下行:26~31 Mbps
- 上行:20~25 Mbps
十一、避坑大全
1)驱动加载失败:no esp32 found
- 检查 EN 复位电平(先低后高)
- SDIO 上拉是否焊接
- DTS bus-width 必须 4
- 频率从 40MHz 开始试
2)wlan0 出现但 scan 失败
- ESP32 固件必须是 SDIO Slave
- 主机驱动与从机固件版本必须匹配(同分支)
3)速率低、丢包
- 串阻 22~33Ω
- 电源噪声
- 降低到 40MHz
4)重启后找不到设备
- DTS 增加
keep-power-in-suspend - 复位时序不对,加大 post-power-on-delay
5)MAC 地址每次变化
options esp32_sdio custom_mac_addr=1
options esp32_sdio mac_addr=00:11:22:33:44:55
十二、总结
本文完整实现:
- RK3506 Linux SDIO 硬件定义
- DTS 完整配置
- ESP32 SDIO 从机固件
- 主机驱动编译加载
- STA/AP 模式
- 开机自启、性能调优、排错
ESP32-SDIO 是 RK3506 外接 WiFi 最稳定、成本最优 方案,适合工业网关、IPC、平板、盒子量产。

736

被折叠的 条评论
为什么被折叠?



