最近在折腾Luckfox开发板时遇到了一个典型问题——板子没有内置WiFi模块。官方SDK文档明确写着支持RTL8188系列芯片,于是我兴冲冲去某宝搜索,结果因为贪便宜买到了RTL8188EU,而官方支持的其实是RTL8188FU。这个教训告诉我们,硬件选购时一定要注意型号后缀,差一个字母可能就是天壤之别。
面对这个"买错硬件"的尴尬局面,我决定挑战一下驱动移植。整个过程可以分为六个关键步骤:源码获取与修改、内核配置调整、编译系统适配、设备树修改、WiFi应用层调试以及固件配置。每个环节都有需要注意的细节,稍有不慎就会导致驱动无法正常工作。
RTL8188EU的驱动源码可以在GitHub上找到,我使用的是lwfinger维护的版本。下载后需要将整个驱动目录放置到SDK的sysdrv/drv_ko/wifi目录下。这里有个细节要注意:最好保持目录名与官方支持的RTL8188FU驱动一致,这样后续编译脚本修改起来会更方便。
驱动移植最核心的部分就是Makefile适配。首先需要修改架构和交叉编译工具链设置:
makefile复制ARCH ?= arm
CROSS_COMPILE ?=
KVER ?= $(if $(KERNELRELEASE),$(KERNELRELEASE),$(shell uname -r))
KSRC ?= $(KERNEL_DIR)
特别要注意的是模块安装路径的设置。RV1103/RV1106平台使用的文件系统布局可能与标准Linux不同,需要确保驱动最终被安装到正确的目录:
makefile复制MODDESTDIR := /lib/modules/$(KVER)/kernel/drivers/staging/r8188eu/
编译目标也需要调整,要添加将生成的ko文件和固件复制到输出目录的逻辑:
makefile复制cp $(shell pwd)/8188eu.ko $(M_OUT_DIR)
@mkdir -p $(SYSDRV_DIR_OUT_ROOTFS)/lib/firmware/rtlwifi
cp $(shell pwd)/rtl8188eufw.bin $(SYSDRV_DIR_OUT_ROOTFS)/lib/firmware/rtlwifi/
要让USB WiFi正常工作,需要确保内核配置了以下关键选项:
code复制Device Drivers --->
[*] USB support --->
<*> EHCI HCD (USB 2.0) support
<*> ChipIdea Highspeed Dual Role Controller
[*] ChipIdea device controller
[*] ChipIdea host controller
[*] Network device support --->
[*] Wireless LAN --->
<*> IEEE 802.11 for Host AP (Prism2/2.5/3 and WEP/TKIP/CCMP)
[*] Support downloading firmware images with Host AP driver
[*] Support for non-volatile firmware download
[*] Realtek devices
<*> Realtek rtlwifi family of devices --->
<*> RTL8723AU/RTL8188[CR]U/RTL819[12]CU (mac80211) support
[*] Include support for untested Realtek 8xxx USB devices (EXPERIMENTAL)
[*] Networking support --->
-*- Wireless --->
<*> cfg80211 - wireless configuration API
<*> Generic IEEE 802.11 Networking Stack (mac80211)
特别注意最后一项mac80211子系统必须启用,这是现代Linux无线驱动的基础框架。
需要在BoardConfig_IPC/*.mk文件中添加WiFi启用标志:
makefile复制export RK_ENABLE_WIFI=y
然后修改sysdrv/drv_ko/wifi/Makefile,将RTL8188EU加入编译列表:
makefile复制build-usb:
@make -C rtl8188ftv/
@make -C ssv6x5x/
@make -C rtl8188eu/
build-usb-clean:
@make -C rtl8188ftv clean
@make -C ssv6x5x clean
@make -C rtl8188eu clean
RV1103/RV1106的USB控制器需要在设备树中明确设置为host模式:
dts复制&usbdrd_dwc3 {
status = "okay";
dr_mode = "host";
};
这个修改至关重要,因为默认配置可能是device模式,会导致USB WiFi无法被识别。
在sysdrv/drv_ko/wifi/insmod_wifi.sh中添加自动检测逻辑:
bash复制#rtl18188eu
cat /sys/bus/usb/devices/*/uevent | grep "bda\/179"
if [ $? -eq 0 ];then
insmod cfg80211.ko
insmod 8188eu.ko
fi
这里通过检查USB设备的厂商ID来确认是否插入了RTL8188EU网卡。
project/app/wifi_app/wifi/src/Rk_wifi.c中需要调整连接逻辑:
c复制if (access("/data/cfg/wpa_supplicant.conf", F_OK) == 0) {
exec_command_system("wpa_supplicant -B -i wlan0 -c /data/cfg/wpa_supplicant.conf -Dwext");
} else {
if (access("/etc/wpa_supplicant.conf", F_OK) == 0) {
if (exec_command_system("cp /etc/wpa_supplicant.conf /data/wpa_supplicant.conf") == 0)
exec_command_system("wpa_supplicant -B -i wlan0 -c /data/wpa_supplicant.conf -Dwext");
else
exec_command_system("wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf -Dwext");
}
}
将原来的dhcpcd替换为更轻量级的udhcpc:
c复制exec_command_system("udhcpc -i wlan0 -t 5 &");
这个修改特别适合资源受限的嵌入式环境。
在project/app/wifi_app/wpa_supplicant.conf中配置SSID和密码:
conf复制network={
ssid="Your_WiFi_SSID"
psk="Your_WiFi_Password"
key_mgmt=WPA-PSK
}
注意WPA-PSK适用于大多数家用路由器,包括WPA和WPA2安全协议。
驱动编译生成的rtl8188eufw.bin需要被复制到文件系统的/lib/firmware/rtlwifi/目录下。这个步骤经常被忽略,导致驱动加载失败。如果遇到"firmware not found"错误,首先就应该检查这个文件是否存在且路径正确。
在实际测试中,我发现驱动加载后还需要等待几秒钟才能扫描到无线网络。如果立即执行扫描命令可能会得到空结果,这是正常现象。建议在脚本中添加适当的延时:
bash复制insmod 8188eu.ko
sleep 3
iwlist wlan0 scan