项目概述
背景: 在基于Rockchip RK3568的定制化项目中,基于公版SDK, 重新梳理板上的USB接口,并解决板载的USB 3.0 OTG (Type-A) 端口在默认BSP配置下,无法正常识别U盘等Host模式设备。
我的职责与贡献: 作为项目的BSP工程师,我独立负责诊断并解决此USB功能性问题。我的核心贡献在于:
- 执行了系统性的问题排查,覆盖了从硬件原理图核对,功能确认,故障分析,到内核设备树(dts)代码编写调试和
sysfs运行时状态分析以及性能基线测试的详细排查。 - 主导并实施了解决方案:根据产品的硬件原理图,验证两个USB-A口和一个USB-C口的工作情况。并通过修改设备树(DTS),定下解决方案:将
usbdrd_dwc3控制器的dr_mode由"otg"强制修改为"host"。 - 精确定位了问题根源:OTG端口的ID引脚在当前硬件设计下并不存在,导致控制器无法自动检测plug-in,因此无法切换Host/Device模式。
- 完成了性能与功能的完整验证,确保修改后的端口不仅能稳定识别设备,其数据传输速率也达到了USB 3.0标准。
- 将整个调试过程和技术分析沉淀为详细的技术文档,为未来类似问题提供了清晰的解决范例。
我的方法论:嵌入式外设调试流程
本次调试遵循了一套由表及里、从软件到硬件的标准化诊断流程:
文档与电路功能分析:
- 研读RK3568 TRM,理解其USB子系统架构(2个USB3控制器、OHCI/EHCI控制器、Combo PHY等)。
- 核对硬件原理图,确认OTG端口的物理连接,特别是ID和VBUS引脚。
- 梳理两A(USB-A)一C(USB-C)的数据流走向
设备树(DTS)与驱动映射:
- 深入分析
rk3568.dtsi等芯片级设备树文件,梳理usbdrd30(OTG)、usbhost30(Host)、usb2phy等核心节点之间的配置和关系。 - 理清控制器与PHY之间的
phys引用关系,并记录汇总成表格。
- 深入分析
运行时状态诊断:
- 利用
sysfs下的extcon接口 (/sys/class/extcon/extcon0),实时查看内核感知的OTG端口状态(USB-HOST=0),印证了其未进入Host模式的猜想。 - 回到硬件原理图,研究USB-A/mini/micro/C四种接口的插拔原理,寻找解决方案。
- 利用
方案实施与验证:
- 在板级DTS中,创建
&usbdrd_dwc3的覆盖节点,将其dr_mode强制设为"host"。 - 重新编译并烧录固件,再次使用
hdparm进行测试,验证问题已解决。 - SOC端USB作为主,则拒绝一切主设备的接入,由SOC端供电,因此,将固件升级(主设备典型应用)安排到外部按键方式触发进入Maskrom模式来进行
- 系统成功加载后,该USB-A口则作为普通host口使用。
- 在板级DTS中,创建
技术总结和文档输出:
- 仔细梳理硬件数据流pipeline,在项目结尾终于成稿。
- 更新dts调试的心得DTS(设备树)调试心得
项目成果
- 功能修复: OTG端口现可稳定识别U盘及其他USB Host设备。
- 性能达标: 修复后,使用
hdparm -t /dev/sda测试,端口读取速度恢复至 ~48MB/s,符合USB 3.0标准。 - 方案固化: 最终的DTS修改被合入产品代码库,成为该硬件的标准化配置。
- 文档沉淀: 完整的调试过程、代码分析和相关资料被整理归档。
技术栈与工具
- 硬件平台: Rockchip RK3568 SoC
- 软件环境: Linux Kernel 5.10, Buildroot
- 核心技术: Device Tree (DTS), USB 2.0/3.0 Subsystem, OTG, XHCI/EHCI/OHCI, Kernel
extconFramework - 调试工具:
hdparm,sysfs, dmesg, 串口调试