rk3399平台rtl8723DS Wi-Fi模块SDIO接口驱动移植与双模配置实战

张开发
2026/4/14 3:29:21 15 分钟阅读

分享文章

rk3399平台rtl8723DS Wi-Fi模块SDIO接口驱动移植与双模配置实战
1. 认识rk3399与rtl8723DS这对黄金搭档第一次拿到rk3399开发板和rtl8723DS模块时我就像拿到新玩具的孩子一样兴奋。rk3399这颗六核处理器在嵌入式领域堪称性能怪兽而rtl8723DS作为Wi-Fi蓝牙二合一模块2.4GHz频段支持加上双模共存特性简直是物联网项目的绝配。不过在实际调试中我发现官方文档对SDIO接口驱动的移植描述比较简略这也是我写下这篇实战指南的初衷。rtl8723DS采用SDIO 2.0接口与主机通信最高理论速率能达到50MHz。相比USB接口的Wi-Fi模块SDIO方案在嵌入式系统中有三大优势首先是不占用宝贵的USB接口资源其次是功耗更低实测待机电流比USB方案低30%左右最重要的是延迟表现更好在视频流传输测试中SDIO方案的抖动幅度比USB方案小了近40%。这个模块最吸引我的是它的Concurrent Mode并发模式也就是可以同时工作在AP和STA模式。想象一下这样的场景你的智能设备既能连接家里的路由器STA模式又能自己创建一个热点供手机配置AP模式。我在智能家居网关项目中就充分利用了这个特性设备出厂时默认开启AP模式供手机配网完成配置后自动切换为STA模式连接家庭路由器。2. 驱动移植前的准备工作2.1 搭建交叉编译环境工欲善其事必先利其器。我建议直接使用Buildroot来构建完整的交叉编译工具链这比单独配置gcc工具链要省心得多。以下是具体步骤# 下载buildroot稳定版 wget https://buildroot.org/downloads/buildroot-2023.02.tar.gz tar xvf buildroot-2023.02.tar.gz cd buildroot-2023.02 # 配置为rk3399平台 make rockchip_rk3399_defconfig make menuconfig在menuconfig界面需要特别注意几个选项Toolchain中确保选择aarch64架构System configuration里设置正确的serial port通常是ttyS2Kernel选项中选择使用外部Linux内核后面会单独编译配置完成后执行make这个过程可能需要1-2小时取决于你的网络和主机性能。编译完成后工具链会安装在output/host/bin目录下记得把这个路径加入PATH环境变量export PATH$PATH:$(pwd)/output/host/bin2.2 获取内核源码和驱动包rk3399的官方内核源码可以从Rockchip的GitHub仓库获取git clone https://github.com/rockchip-linux/kernel.git -b develop-5.10对于rtl8723DS驱动我强烈建议直接从Realtek官网获取最新版本当前最新是v5.8.1而不是使用开发板供应商提供的旧版本。新版驱动不仅修复了很多稳定性问题还对双模共存做了优化。我在调试时就遇到过旧版驱动在STA/AP切换时导致内核崩溃的问题升级后完美解决。驱动包解压后你会看到这些关键文件os_dep/linuxLinux平台相关代码hal/硬件抽象层Kconfig内核配置依赖文件Makefile编译主控文件3. 内核配置与驱动编译实战3.1 修改内核配置进入内核源码目录首先需要确保SDIO主机控制器驱动已经启用cd kernel make menuconfig依次进入以下菜单路径进行配置Device Drivers → MMC/SD/SDIO card support确保Rockchip SDMMC Controller编译进内核选择*打开SDIO UART Support选择MDevice Drivers → Network device support → Wireless LAN选择Wireless LAN (IEEE 802.11)选择*确保cfg80211 - wireless configuration API编译进内核选择*保存配置后需要手动修改几处代码以适应rk3399平台。编辑drivers/net/wireless/Kconfig在最后添加source drivers/net/wireless/rtl8723ds/Kconfig然后在同级目录的Makefile中增加obj-$(CONFIG_RTL8723DS) rtl8723ds/3.2 定制驱动Makefile将驱动包整个目录拷贝到drivers/net/wireless/下并重命名为rtl8723ds。然后编辑其中的Makefile找到PLATFORM_I386_PC配置项在其后添加CONFIG_PLATFORM_RK3399 y ifeq ($(CONFIG_PLATFORM_RK3399), y) EXTRA_CFLAGS -DCONFIG_LITTLE_ENDIAN EXTRA_CFLAGS -DCONFIG_PLATFORM_ARM_RK3399 EXTRA_CFLAGS -DCONFIG_CONCURRENT_MODE # 关键启用双模共存 EXTRA_CFLAGS -DCONFIG_IOCTL_CFG80211 -DRTW_USE_CFG80211_STA_EVENT ARCH : arm64 CROSS_COMPILE : aarch64-buildroot-linux-gnu- KSRC : /path/to/your/kernel MODULE_NAME : rtl8723ds endif这里特别要提醒的是-DCONFIG_CONCURRENT_MODE这个宏定义它就是实现双模共存的关键开关。很多开发者移植后只能使用单一模式往往就是因为漏掉了这个定义。3.3 编译与部署回到内核根目录执行编译make -j$(nproc) modules编译完成后你需要的驱动模块会出现在drivers/net/wireless/rtl8723ds/rtl8723ds.ko。把这个文件拷贝到开发板的/lib/modules/$(uname -r)/kernel/drivers/net/wireless/目录下然后执行depmod -a modprobe rtl8723ds如果一切顺利执行ifconfig -a应该能看到wlan0和wlan1两个网络接口。这里有个小技巧通过dmesg查看内核日志时如果看到rfkill: WiFi RF is blocked的提示需要先执行rfkill unblock all解除软锁。4. 双模共存配置详解4.1 STA模式连接路由器STA模式的配置相对简单主要使用wpa_supplicant这个工具。首先准备配置文件/etc/wpa_supplicant.confctrl_interface/var/run/wpa_supplicant update_config1 network{ ssid你的WiFi名称 psk你的WiFi密码 key_mgmtWPA-PSK priority1 }然后启动连接ifconfig wlan0 up wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf udhcpc -i wlan0这里有个实际项目中的经验在工业环境中WiFi信号可能不稳定建议增加自动重连机制。可以创建/etc/network/if-up.d/wifi_reconnect脚本#!/bin/sh if [ $IFACE wlan0 ]; then while ! ping -c1 8.8.8.8 /dev/null; do killall wpa_supplicant wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf udhcpc -i wlan0 sleep 10 done fi4.2 AP模式创建热点AP模式需要hostapd和dhcp服务器。先安装必要的工具opkg update opkg install hostapd dnsmasq配置hostapd/etc/hostapd.confinterfacewlan1 drivernl80211 ssidMyRK3399AP hw_modeg channel6 wpa2 wpa_passphrase12345678 wpa_key_mgmtWPA-PSK wpa_pairwiseTKIP rsn_pairwiseCCMPdnsmasq配置/etc/dnsmasq.confinterfacewlan1 dhcp-range192.168.50.100,192.168.50.200,255.255.255.0,24h启动服务ifconfig wlan1 192.168.50.1 up hostapd -B /etc/hostapd.conf dnsmasq -C /etc/dnsmasq.conf4.3 双模共存优化要让STA和AP模式真正协同工作还需要一些优化配置频段隔离确保两个接口使用不同的频段iw dev wlan0 set freq 2412 iw dev wlan1 set freq 2437流量转发允许AP客户端访问外网iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE echo 1 /proc/sys/net/ipv4/ip_forward负载均衡通过tc命令限制AP模式的带宽避免影响STA模式的网络质量我在实际测试中发现当STA模式进行大流量传输时AP模式的延迟会明显增加。通过以下QoS配置可以改善tc qdisc add dev wlan1 root handle 1: htb default 1 tc class add dev wlan1 parent 1: classid 1:1 htb rate 1mbps ceil 2mbps5. 常见问题排查指南5.1 驱动加载失败症状insmod rtl8723ds.ko时报错Unknown symbol in module解决方法# 检查内核配置是否开启依赖项 grep CFG80211 /boot/config-$(uname -r) # 重新生成模块依赖 depmod -a5.2 WiFi频繁断开症状STA模式连接不稳定时断时续可能原因及解决电源管理干扰iwconfig wlan0 power off路由器兼容性问题 在wpa_supplicant.conf中添加ap_scan1 bgscansimple:30:-70:3005.3 双模性能下降症状同时启用STA和AP后吞吐量大幅降低优化方案调整CTRL接口位置避免冲突# hostapd.conf中 ctrl_interface/var/run/hostapd # wpa_supplicant.conf中 ctrl_interface/var/run/wpa_supplicant使用不同的频宽iw dev wlan1 set channel 6 HT20 iw dev wlan0 set channel 11 HT406. 实际项目中的应用技巧在智能售货机项目中我们充分利用了双模特性实现了离线支付功能。当网络正常时设备通过STA模式连接云端服务器当网络中断时自动增强AP信号强度允许顾客通过设备热点完成本地支付。关键实现代码如下# 网络检测脚本 while true; do if ! ping -c1 -W2 8.8.8.8; then iw dev wlan1 set txpower 3000 # 增强AP信号 ifconfig wlan1 192.168.100.1/24 systemctl restart hostapd else iw dev wlan1 set txpower 1000 # 恢复默认功率 fi sleep 30 done另一个实用技巧是通过RSSI值自动切换模式。我们在仓库AGV小车上部署了这样的逻辑当检测到仓库AP信号强度低于-75dBm时自动启用设备自身的AP模式确保控制终端始终可以连接rssi$(iw dev wlan0 link | grep signal | awk {print $2}) if [ $rssi -lt -75 ]; then ifconfig wlan1 up hostapd /etc/hostapd.conf -B fi经过三个月的实际运行测试这套方案表现非常稳定。在200台设备规模的部署中平均无故障运行时间达到了1800小时完全满足工业级应用的要求。

更多文章