RK3568平台USB OTG端口功能调试

验证调通USB部分的设备树代码,通过深入分析插拔的硬件原理,将配置方案优化为当前硬件条件下的最佳:即配置为该口为Host模式,砍掉了对主设备的连接支持,确保了产品功能的最大可用和稳定性。

项目概述

背景: 在基于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标准。
  • 将整个调试过程和技术分析沉淀为详细的技术文档,为未来类似问题提供了清晰的解决范例。

我的方法论:嵌入式外设调试流程

本次调试遵循了一套由表及里、从软件到硬件的标准化诊断流程:

  1. 文档与电路功能分析:

    • 研读RK3568 TRM,理解其USB子系统架构(2个USB3控制器、OHCI/EHCI控制器、Combo PHY等)。
    • 核对硬件原理图,确认OTG端口的物理连接,特别是ID和VBUS引脚。
    • 梳理两A(USB-A)一C(USB-C)的数据流走向
  2. 设备树(DTS)与驱动映射:

    • 深入分析rk3568.dtsi等芯片级设备树文件,梳理usbdrd30 (OTG)、usbhost30 (Host)、usb2phy等核心节点之间的配置和关系。
    • 理清控制器与PHY之间的phys引用关系,并记录汇总成表格。
  3. 运行时状态诊断:

    • 利用sysfs下的extcon接口 (/sys/class/extcon/extcon0),实时查看内核感知的OTG端口状态(USB-HOST=0),印证了其未进入Host模式的猜想。
    • 回到硬件原理图,研究USB-A/mini/micro/C四种接口的插拔原理,寻找解决方案。
  4. 方案实施与验证:

    • 在板级DTS中,创建&usbdrd_dwc3的覆盖节点,将其dr_mode强制设为"host"
    • 重新编译并烧录固件,再次使用hdparm进行测试,验证问题已解决。
    • SOC端USB作为主,则拒绝一切主设备的接入,由SOC端供电,因此,将固件升级(主设备典型应用)安排到外部按键方式触发进入Maskrom模式来进行
    • 系统成功加载后,该USB-A口则作为普通host口使用。
  5. 技术总结和文档输出:


项目成果

  • 功能修复: 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 extcon Framework
  • 调试工具: hdparm, sysfs, dmesg, 串口调试