Longan系统USB设备驱动调试实战:从T113-S3蓝牙/WiFi模组看嵌入式Linux外设集成
在嵌入式物联网设备开发中,无线通信模块的集成往往是项目成败的关键环节。最近我在一个基于全志T113-S3的智能网关项目上,遇到了蓝牙和WiFi模组驱动加载的各种问题。这个平台运行的是Longan系统(基于Linux 5.4内核),硬件上集成了rtl8723du WiFi芯片和rtk_btusb蓝牙模块,都是通过USB接口连接的。调试过程中,我花了大量时间分析内核日志、调整USB配置、排查固件加载问题,积累了不少实战经验。
对于物联网设备开发者来说,USB外设驱动的调试不仅仅是让设备“能工作”,更要确保在各种边缘场景下的稳定性、功耗控制和故障恢复能力。T113-S3这样的双核Cortex-A7平台,在成本、性能和功耗之间取得了很好的平衡,但USB OTG配置、内核驱动选项、固件加载机制等方面都有不少细节需要注意。这篇文章我将分享从硬件识别到驱动加载完整的调试流程,重点放在那些容易踩坑的地方。
1. T113-S3平台USB子系统架构与配置要点
全志T113-S3的USB子系统设计相对成熟,但不同版本的内核和硬件设计会有细微差异。我使用的这块开发板提供了1个USB 2.0 OTG接口(设计为Type-A)和2个USB 2.0 HOST接口,无线模组通常连接在HOST接口上。
1.1 USB控制器初始化流程解析
查看内核启动日志时,我特别注意USB控制器的初始化顺序:
[ 1.257385] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
[ 1.264719] sunxi-ehci: EHCI SUNXI driver
[ 1.269695] get ehci0-controller wakeup-source is fail.
[ 1.275689] sunxi ehci0-controller don't init wakeup source
[ 1.281994] [sunxi-ehci0]: probe, pdev->name: 4101000.ehci0-controller...
[ 1.294023] [sunxi-ehci0]: Not init ehci0
这里有个关键点:Not init ehci0。这意味着第一个EHCI控制器没有被初始化,通常是因为设备树配置中禁用了这个控制器,或者硬件设计上这个端口没有被使用。实际可用的USB HOST控制器是ehci1和ohci1。
注意:全志平台通常使用EHCI(高速USB 2.0)和OHCI(全速/低速USB 1.1)控制器配对的方式。如果只看到EHCI初始化成功而OHCI失败,可能会导致某些低速设备无法正常工作。
1.2 设备树配置关键参数
在Longan系统中,USB控制器的配置主要在设备树中完成。对于T113-S3,需要检查sun8iw20p1.dtsi和板级设备树文件:
usbc0: usbc0@0 {
device_type = "usbc0";
compatible = "allwinner,sunxi-otg-manager";
usb_port_type = <0x2>; /* 0: device only, 1: host only, 2: OTG */
usb_detect_type = <0x1>; /* 0: none, 1: vbus/id detect, 2: id/dpdm detect */
usb_id_gpio;
usb_det_vbus_gpio;
usb_regulator_io = "nocare";
usb_wakeup_suspend = <0>;
usb_luns = <3>;
usb_serial_unique = <0>;
usb_serial_number = "20080411";
rndis_wceis = <1>;
status = "okay";
};
usbc1: usbc1@0 {
device_type = "usbc1";
usb_drv_vbus_gpio;
usb_host_init_state = <1>;
usb_regulator_io = "nocare";
usb_wakeup_suspend = <0>;
status = "okay";
};
配置要点总结:
| 参数 | 值 | 说明 |
|---|---|---|
| usb_port_type | 0x2 | OTG模式,支持主机和设备切换 |
| usb_detect_type | 0x1 | 使用VBUS/ID引脚检测连接状态 |
| usb_host_init_state | 0x1 | 上电初始化为主机模式 |
| status | "okay" | 启用该控制器 |
1.3 内核配置选项优化
编译内核时,USB相关的配置选项需要仔细选择。我通常使用make menuconfig进入配置界面,重点关注以下几个部分:
# 进入内核配置
cd kernel/linux-5.4
make ARCH=arm menuconfig
# 关键配置路径
Device Drivers --->
[*] USB support --->
<*> Support for Host-side USB
<*> EHCI HCD (USB 2.0) support
<*> Sunxi EHCI driver
<*> OHCI HCD (USB 1.1) support
<*> Sunxi OHCI driver
-*- USB Mass Storage support
<*> USB Serial Converter support
<*> USB driver for GSM and CDMA modems
[*] Network device support --->
[*] USB Network Adapters --->
<*> Realtek RTL8188CU/RTL8192CU USB Wireless Network Adapter driver
<*> Realtek RTL8XXXU USB Wireless Network Adapter driver
[*] HID support --->
<*> USB HID transport layer
容易遗漏的配置:
- USB_OTG 和 USB_OTG_FSM:如果使用OTG功能,这两个必须开启
- USB_PHY:全志平台的USB PHY驱动需要单独启用
- USB_STORAGE 和 USB_SERIAL:即使不直接使用,很多模块的固件加载会依赖
提示:如果遇到USB设备识别不稳定,可以尝试开启
CONFIG_USB_DEBUG和CONFIG_DYNAMIC_DEBUG,通过echo 'module sunxi_ehci +p' > /sys/kernel/debug/dynamic_debug/control启用详细日志。
2. 无线模组驱动加载全流程拆解
在实际项目中,我同时集成了rtl8723du WiFi和rtk_btusb蓝牙模块。这两个都是USB接口的无线设备,但驱动加载机制有所不同。
2.1 rtl8723du WiFi驱动加载分析
从内核日志可以看到WiFi驱动的加载过程:
[ 4.006134] RTW: module init start
[ 4.006901] rtk_btusb: chip type value: 0x71
[ 4.010264] RTW: rtl8723du v5.10.0-24-g3dddfb3.20200429_COEX20190530-3030
[ 5.389148


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



