iMX6ULL RTL8723BU WiFi蓝牙模块驱动移植与配置实战

📅 发布时间:2026/7/13 4:40:49 👁️ 浏览次数:
iMX6ULL RTL8723BU WiFi蓝牙模块驱动移植与配置实战
1. 环境准备与模块认知大家好我是老李一个在嵌入式圈子里摸爬滚打了十多年的老工程师。今天咱们不聊虚的直接上手干点实在活——给iMX6ULL这块经典又实惠的板子配上RTL8723BU这个集成了WiFi和蓝牙的“二合一”模块。我用的板子是讯为的TERMINATOR_V1.1内核和文件系统基于Buildroot构建整个过程踩过不少坑也总结了不少经验今天就手把手带你走一遍目标是让你看完就能自己动手搞定。首先咱们得搞清楚手头有什么。iMX6ULL是恩智浦的一款高性能、低功耗的应用处理器在工业控制、物联网网关等领域用得非常广。而RTL8723BU呢是瑞昱Realtek推出的一款高度集成的单芯片它把2.4GHz的802.11n WiFi和蓝牙4.0BLE功能做到了一起通过一个USB 2.0接口与主控通信。这种设计对开发者特别友好因为你不需要额外处理复杂的SDIO或UART协议USB是即插即用的驱动框架也成熟。不过友好归友好想把驱动完美地移植到你的定制板卡和内核版本上还是有几个关键点要特别注意的。在开始动手之前我强烈建议你先准备好三样东西。第一是一个稳定的Linux开发环境我习惯用Ubuntu 20.04别的发行版也行但确保基本的编译工具链gcc, make, git等都装好了。第二是你为iMX6ULL定制好的Linux内核源码树和Buildroot工程。我这里参考的是官方的i.MX6ULL EVK开发板但内核和Buildroot都根据讯为的板子做了适配。第三是一颗“不怕折腾”的心因为驱动移植这事儿很少有一次成功的但每次失败都能让你更了解系统底层。接下来咱们就从最核心的Linux内核配置开始。2. 深度配置Linux内核驱动内核配置是驱动能否工作的基石配置错了或者漏了后面的一切都是空中楼阁。我建议你打开内核源码目录使用make menuconfig命令进入那个经典的蓝色配置界面。这里咱们一步步来别图快。2.1 启用USB主机控制器支持RTL8723BU是通过USB和iMX6ULL通信的所以第一步必须确保内核能正确识别并驱动你板子上的USB Host接口。iMX6ULL的USB控制器是ChipIdea系列的配置路径如下Device Drivers --- [*] USB support --- * EHCI HCD (USB 2.0) support * ChipIdea Highspeed Dual Role Controller [*] ChipIdea device controller [*] ChipIdea host controller这里有几个关键点。EHCI HCD是USB 2.0高速主机控制器驱动必须编译进内核*而不是编成模块M因为系统启动初期就需要它。下面的ChipIdea控制器如果你确认板子只做主机Host使用不涉及USB OTG功能那么ChipIdea device controller理论上可以不选。但根据我的经验特别是有些板子的硬件设计可能存在差异为了保险起见我通常把主机和设备控制器都选上[*]让内核自己去识别角色避免出现USB口根本没电或者识别不了设备的情况。配置完后保存退出。2.2 配置无线局域网WiFi支持这是RTL8723BU WiFi功能的核心。内核里其实已经自带了rtlwifi驱动家族对很多瑞昱的芯片都有支持RTL8723BU也在其列。但要注意内核自带的驱动版本可能较旧或者对某些特定功能如电源管理支持不完善。我们先使用内核自带的驱动来测试路径如下Device Drivers --- [*] 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)这里我踩过一个坑。RTL8723AU/RTL8188[CR]U/RTL819[12]CU (mac80211) support这个选项看名字没有BU但实际上它包含了BU系列的支持。你必须把它编译进内核*。下面那个[*] Include support for untested Realtek 8xxx USB devices (EXPERIMENTAL)是支持未经充分测试的瑞昱USB设备对于RTL8723BU来说强烈建议勾上。我一开始没勾结果模块插入后根本创建不出wlan0网络接口折腾了好久才发现是这里的问题。勾选它意味着启用了一些实验性的代码路径可能稳定性有细微影响但对于让设备跑起来是至关重要的。2.3 配置通用的无线网络协议栈光有设备驱动还不够还需要上层协议栈的支持这样系统才能用标准的工具如iwconfig,wpa_supplicant来管理WiFi。配置路径在另一个顶级菜单下[*] Networking support --- -*- Wireless --- * cfg80211 - wireless configuration API * Generic IEEE 802.11 Networking Stack (mac80211)cfg80211和mac80211是现代Linux无线驱动的标准框架它们提供了内核空间和用户空间配置无线接口的API。这两个都必须编译进内核*确保无线工具能正常工作。2.4 配置蓝牙子系统支持接下来是蓝牙部分。RTL8723BU的蓝牙同样是通过USB HCI主机控制器接口实现的所以我们需要启用内核的蓝牙子系统并特别指明USB传输层和瑞昱的协议支持。[*] Networking support --- * Bluetooth subsystem support --- [*] Bluetooth Classic (BR/EDR) features * RFCOMM protocol support (用于串口仿真很多蓝牙应用需要) [*] RFCOMM TTY support * BNEP protocol支持 (用于蓝牙网络如个人局域网PAN) [*] Multicast filter support [*] Protocol filter support * HIDP protocol support (用于蓝牙键鼠) [*] Bluetooth Low Energy (LE) features (蓝牙4.0低功耗特性) [*] Export Bluetooth internals in debugfs (调试用可选) Bluetooth device drivers --- * HCI USB driver [*] Realtek protocol support (关键必须选中)这里最重要的就是[*] Realtek protocol support。瑞昱的蓝牙芯片通常需要一个特定的初始化协议固件加载和配置才能正常工作这个选项就是启用内核中对瑞昱专有协议的支持。如果不选即使蓝牙控制器被识别为HCI设备也可能无法正常初始化导致hciconfig命令看不到设备或设备状态异常。其他如RFCOMM、BNEP、HIDP等根据你后续是否需要蓝牙串口、网络或输入设备支持来选择建议先都选上避免后续功能缺失。3. 集成Buildroot用户空间工具内核驱动准备好相当于给硬件装上了“发动机”。但要让用户能用上WiFi和蓝牙我们还需要用户空间的“方向盘”和“仪表盘”——也就是各种工具。Buildroot极大地简化了这个过程我们只需要在菜单里勾选即可。进入你的Buildroot源码目录执行make menuconfig。我们需要关注Target packages菜单。Target packages --- [*] Networking applications --- [*] bluez5-utils (注意可能是bluez5-utils版本号不同) [*] Install tools (安装hciconfig, hcitool等命令行工具) [*] Install experimental tools [*] Install client (安装bluetoothctl等客户端) [*] wireless-tools (老牌的iwconfig等部分脚本依赖) [*] wpa_supplicant (连接WPA/WPA2加密WiFi的必备工具) [*] Enable nl80211 support (必须使用新的netlink接口) [*] Enable WPA3 support (如果路由器支持WPA3建议选上) [*] Build and install wpa_cli (命令行配置工具) [*] Build and install wpa_passphrase (生成PSK的工具) [*] dhcpcd 或 dhcp client (用于自动获取IP地址二选一即可)这里有几个细节。第一蓝牙工具包现在通常是bluez5-utils对应BlueZ 5.x版本确保选中并安装工具和客户端。第二wpa_supplicant的Enable nl80211 support必须勾选因为现代内核的无线驱动包括rtl8723bu都使用nl80211接口与用户空间通信旧的wext接口可能无法工作。第三记得选上一个DHCP客户端这样WiFi连接后才能自动获取IP地址。配置完成后保存退出然后回到Buildroot根目录执行make。这个过程会下载、编译并打包好所有选中的工具到你的根文件系统镜像中。4. 获取并部署关键固件这是整个移植过程中最容易出错也最容易被忽略的一步。很多朋友按照上面的步骤编译烧录后发现WiFi或蓝牙还是不能用dmesg查看内核日志常常会看到“firmware not found”或“failed to load firmware”之类的错误。这是因为像RTL8723BU这样的复杂外设其驱动本身只包含控制逻辑芯片运行还需要一段厂商提供的、包含微码和配置参数的二进制文件这就是固件Firmware。内核自带的rtlwifi驱动通常会尝试从系统的/lib/firmware/rtlwifi/目录下加载固件。但RTL8723BU的固件可能并不包含在你当前的内核源码树中。我们需要手动获取并放置。根据我的实测最可靠的方法是使用社区维护的专门仓库# 在开发主机上操作 git clone https://github.com/lwfinger/rtl8723bu.git克隆这个仓库后进入rtl8723bu目录你会发现里面有几个关键的.bin文件。通常你需要的是rtl8723b_fw.bin和rtl8723bu_nic.bin。有时可能还需要一个配置文件。你需要将这些文件复制到你的根文件系统镜像的/lib/firmware/rtlwifi/目录下。如果你使用的是Buildroot构建的根文件系统有几种方法在Buildroot编译前放置在Buildroot的output/target/lib/firmware/rtlwifi/目录这个目录可能在编译后才会出现创建好或者更规范的做法是创建一个自定义的filesystem overlay目录在里面创建lib/firmware/rtlwifi/结构并放入固件然后在Buildroot配置中指定这个overlay路径。在系统启动后放置将固件文件放在SD卡或U盘的FAT分区系统启动后手动用cp命令复制到/lib/firmware/rtlwifi/。这种方法适合快速测试。打包进根文件系统镜像修改Buildroot的配置添加一个自定义的post-build脚本在制作根文件系统镜像前将固件文件拷贝到$(TARGET_DIR)/lib/firmware/rtlwifi/。我推荐第一种或第三种方法以实现自动化。放置好固件后重启开发板使用dmesg | grep -i firmware或dmesg | grep -i rtl命令查看内核启动日志应该能看到成功加载固件的提示比如rtl8723bu: Loading firmware rtlwifi/rtl8723bu_nic.bin。5. WiFi功能测试与联网实战当固件正确加载后你的系统应该能识别到USB无线网卡了。上电启动输入ifconfig -a或ip link show你应该能看到一个名为wlan0也可能是wlan1等的网络接口。如果没看到回头检查内核驱动配置和固件。看到wlan0只是第一步让它连接上路由器上网才是目标。我们需要用到之前通过Buildroot编译进去的wpa_supplicant工具。首先创建一个WiFi连接配置文件/etc/wpa_supplicant.conf。这个文件定义了要连接的网络。# /etc/wpa_supplicant.conf ctrl_interface/var/run/wpa_supplicant ap_scan1 network{ ssid你的WiFi名称 psk你的WiFi密码 # 如果是不加密的开放网络用 key_mgmtNONE 并去掉 psk # key_mgmtNONE }注意ssid和psk替换成你实际的名称和密码。对于WPA2-PSK加密最常见的家用加密方式这样配置即可。然后我们需要配置网络接口让它在启动时自动连接。编辑/etc/network/interfaces文件如果你的系统使用这个传统配置方式的话添加关于wlan0的配置# /etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp auto wlan0 iface wlan0 inet dhcp pre-up wpa_supplicant -B -Dnl80211 -i wlan0 -c /etc/wpa_supplicant.conf post-down killall -q wpa_supplicant这段配置的意思是在wlan0接口启动pre-up之前先以后台模式-B启动wpa_supplicant守护进程指定驱动为nl80211-Dnl80211接口为wlan0配置文件为我们刚才创建的。接口关闭post-down后则杀掉对应的wpa_supplicant进程。inet dhcp表示使用DHCP自动获取IP地址。配置完成后重启网络服务或直接重启开发板。你可以通过ifconfig wlan0查看是否获取到了IP地址inet字段。也可以用ping命令测试外网连通性比如ping 8.8.8.8。在我的讯为TERMINATOR板子上由于板载天线性能一般在距离路由器稍远时延迟和丢包率会上升这是硬件限制属于正常现象。如果追求稳定性和距离可以考虑外接一个带IPX接口的WiFi天线。6. 蓝牙功能配置与设备扫描WiFi搞定后我们来测试蓝牙。首先确保你的内核日志dmesg中没有关于蓝牙初始化失败的严重错误。然后使用hciconfig -a命令查看蓝牙适配器信息。如果一切正常你会看到类似下面的输出hci0: Type: Primary Bus: USB BD Address: 00:11:22:33:44:55 ACL MTU: 1021:8 SCO MTU: 64:1 UP RUNNING RX bytes:1234 acl:0 sco:0 events:56 errors:0 TX bytes:2345 acl:0 sco:0 commands:56 errors:0 ...如果UP RUNNING这一行没有或者设备状态是DOWN你需要先启用它hciconfig hci0 up。现在我们可以尝试扫描周围的蓝牙设备了。将你的手机蓝牙设置为“可被所有人发现”或类似模式。在开发板终端上执行hcitool scan这个命令会进行传统的蓝牙经典BR/EDR设备扫描。稍等片刻你应该能看到扫描结果显示周围蓝牙设备的MAC地址和名称。如果能扫描到你的手机说明蓝牙射频和基础协议栈工作正常。为了进一步测试连通性我们可以尝试一个简单的L2CAP ping测试。首先你需要知道目标设备的MAC地址比如你手机的地址AA:BB:CC:DD:EE:FF。l2ping -c 4 AA:BB:CC:DD:EE:FF这个命令会向目标设备发送4个L2CAP回声请求包。如果收到回复会显示往返时间。这证明了链路层通信是成功的。当然更复杂的应用如文件传输OBEX、音频A2DP等还需要在Buildroot中编译相应的蓝牙协议栈和工具如pulseaudio、obexftp等并可能需要进行复杂的配对和授权配置这超出了本篇基础移植的范围但有了这个能扫描和ping通的基础后续的功能集成就有了坚实的起点。整个移植过程从内核配置到功能测试最需要耐心的是排错阶段。多利用dmesg查看内核信息多用lsusb确认设备是否被USB总线识别多用lsmod查看驱动模块是否加载。驱动移植就像拼图只要方向对每一块配置都落到实处最终一定能看到wlan0和hci0欢快地工作起来。我这份基于讯为TERMINATOR_V1.1板子的记录希望能为你节省一些在黑暗中摸索的时间。