DWC3 双角色核心与 RK3588 集成

DWC3 双角色核心与 RK3588 集成

1. 文件

  • core.c:probe、PHY/clock/reset、mode、PM;
  • host.c:创建xHCI platform device;
  • gadget.c:UDC、endpoint/TRB/events;
  • ep0.c:控制端点状态机;
  • drd.c:OTG/role switch/extcon;
  • dwc3-of-simple.c:Rockchip等wrapper;
  • debugfs.c、trace。

2. MMIO分区

1
2
3
4
0x0000..0x7fff  xHCI
0xc100.. DWC3 globals
0xc700.. device registers
0xcc00.. OTG registers

Probe把xHCI区作为子设备资源,自身映射global/device区,避免重复claim。

3. Host

dwc3_host_init()创建 "xhci-hcd"

-传MMIO/IRQ;
-设置platform quirks;
-standard xHCI完成rings、root hubs和URB。

DWC3本身不重新实现Host USB协议栈。

4. Gadget

DWC3 UDC:

-注册 usb_gadget
-endpoint command配置;
-TRB ring;
-event buffer;
-EP0 SETUP/DATA/STATUS;
-connect/reset/link-state事件;
-USB2/USB3 speed。

5. DRD

dr_mode = "host"|"peripheral"|"otg"。Dual-role下role来源可为USB role switch、extcon或OTG events,dwc3_set_mode()通过work切换。

切换时需停止旧角色、reset/reconfigure core、设置PHY mode并启动新角色,不是简单改一bit。

6. RK3588 wrapper

父节点:

1
2
compatible = "rockchip,rk3588-dwc3",
"rockchip,rk3399-dwc3";

因此由dwc3-of-simple按rk3399 fallback处理clock/reset,子节点再由snps,dwc3 core probe。

7. 厂商改动

本树 dwc3_get_clocks()明确增加RK3588可选 utmipipe clocks。Host-only usbhost3_0父节点提供这两个clock;DRD0父节点只有ref/suspend/bus。

8. RK3588节点

  • usbdrd3_0 / fc000000:默认OTG,USB2 PHY0 + USBDP PHY0 U3;
  • usbhost3_0 / fcd00000:host,combo PHY2 USB3;
  • RK3588非S:usbdrd3_1 / fc400000,默认host,USB2 PHY1 + USBDP PHY1 U3。

9. Quirks

DTS禁用了部分LPM/U1/U2/PHY行为并设置parkmode等。Quirk是本BSP硬件/时序约束,不应为追求低功耗盲目删除。

10. PM

DWC3 runtime suspend需协调event buffer、PHY、clock、role和xHCI child。OTG插拔失败应同时检查parent wrapper与child PM状态。

文章互动

阅读 --

留言

0 条留言

正在加载留言…