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 | 0x0000..0x7fff xHCI |
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 | compatible = "rockchip,rk3588-dwc3", |
因此由dwc3-of-simple按rk3399 fallback处理clock/reset,子节点再由snps,dwc3 core probe。
7. 厂商改动
本树 dwc3_get_clocks()明确增加RK3588可选 utmi和pipe 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状态。
正在加载留言…