【RK3506实战-10】RK3506 Linux 接入 ESP32-SDIO WiFi 超详细实战

前言

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/蓝牙协议栈

优势:

  1. SDIO 比 USB 更稳定,无 USB 休眠问题
  2. ESP32 成本低、供货稳
  3. 支持 WiFi STA/AP/SNIFFER
  4. 标准 Linux net 接口,应用层无需修改

二、硬件接线(RK3506 ↔ ESP32)

2.1 必须信号(SDIO + 复位)

 

RK3506 SDMMC1ESP32 引脚功能注意
CLKGPIO14SDIO_CLK串 22~33Ω 电阻
CMDGPIO15SDIO_CMD10K 上拉到 3.3V
D0GPIO2SDIO_D010K 上拉
D1GPIO4SDIO_D110K 上拉
D2GPIO12SDIO_D210K 上拉
D3GPIO13SDIO_D310K 上拉
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
  1. Component config → ESP Hosted Feature
  • Transport Select: SDIO
  • WiFi: Enable
  • BT: Disable(如不需要)
  1. Component config → SDIO Slave
  • Bus width: 4-bit
  • Clock: 40MHz / 50MHz
  1. 关闭无用模块: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 自行配置

十、性能调优(提升速率与稳定性)

  1. SDIO 4-bit + 50MHz
  2. 内核开启:
CONFIG_PREEMPT=y
CONFIG_HZ=1000
  1. 关闭蓝牙减少中断
  2. SDIO 线短、差分、包地、上拉标准
  3. 调整队列:
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、平板、盒子量产。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值