RK3588 kernel-6.1:drivers/usb/cdns3 功能与实现要点
源码基准:rk3588/kernel-6.1/drivers/usb/cdns3/。涵盖 Cadence USBSS(USB3 DRD) 与 USBSSP / CDNSP(第二代,PCI 多见) 两条产品线,由 CONFIG_USB_CDNS_SUPPORT 总控。
1. 构建产物与选项
| 配置 | 产物 / 说明 |
|---|---|
USB_CDNS_SUPPORT |
共同点:select USB_XHCI_PLATFORM(主机)、USB_ROLE_SWITCH;公共代码 cdns-usb-common:core.o、drd.o,可选 host.o |
USB_CDNS3 |
cdns3.ko:cdns3-plat.o +(可选)cdns3-gadget.o、cdns3-ep0.o、cdns3-trace.o |
USB_CDNS3_PCI_WRAP |
cdns3-pci-wrap.o(ACPI PCIe) |
USB_CDNS3_TI / USB_CDNS3_IMX |
SoC glue:cdns3-ti.c、cdns3-imx.c |
USB_CDNSP_PCI |
cdnsp-udc-pci.ko:PCI 双功能(HOST/DEV + OTG);_gadget 侧 cdnsp-ring/gadget/mem/ep0(与 xHCI 环/TRB 思路相近) |
主机:符合 xHCI,由 host.c 动态 platform_device_alloc("xhci-hcd") 挂载 drivers/usb/host/xhci-plat,不再重复实现调度器。
设备:USB3:cdns3-gadget.c(寄存器窗 dev);CDNSP:cdnsp-*.c(支持 SSP,注释说明算法借鉴主机)。
2. 核心抽象:struct cdns(core.h)
- 资源分区:xHCI MMIO + IRQ(
xhci_res[])、Device 控制器 MMIO(dev_regs)、OTG 控制 MMIO(otg_v0/otg_v1/otg_cdnsp之一)、可选 wakeup IRQ。 - 版本:
CDNS3_CONTROLLER_V{0,1}、CDNSP_CONTROLLER_V2,决定 OTG 寄存器布局与 workaround(见drd.c)。 - 角色:
roles[USB_ROLE_HOST]、roles[USB_ROLE_DEVICE]、roles[USB_ROLE_NONE](idle),每角色cdns_role_driver:start/stop/suspend/resume。 - PHY:
usb2_phy/usb3_phy(generic_phy)。 gadget_init:USB3 平台为cdns3_gadget_init;CDNSP PCI 为cdnsp_gadget_init(在 glue 中赋值)。
core.c:cdns_init → cdns_core_init_role:综合 usb_get_dr_mode、硬件 strap(cdns->dr_mode)、Kconfig,调用 cdns_host_init(注册 host role,真正 start 时再 platform_device_add(xhci))、gadget_init,最后 cdns_drd_update_mode、cdns_role_start(idle → 按 OTG/host/peripheral 启动)。
3. 主机侧(host.c)
cdns_drd_host_on:DRD 逻辑切到 主机可用(电源/时钟由drd.c协调)。- 分配
xhci-hcd子设备:资源为 IRQ + xhci MEM。 xhci_plat_priv:- USBSS(CDNS3):
XHCI_SKIP_PHY_INIT | XHCI_AVOID_BEI,plat_start写CMD_PM_INDEX及 扩展寄存器XECP_AUX_CTRL_REG1/XECP_PORT_CAP_REG(LPM/RxDet 等 Cadence 专有项)。 - USBSSP(CDNSP):
XHCI_CDNS_SCTX_QUIRK。
- USBSS(CDNS3):
resume_quirk:恢复后重做plat_start。
即:Cadence 只做 glue + quirk,协议与调度全在 内核 xhci 栈。
4. DRD / OTG(drd.c)
cdns_set_mode:OTG 时配置 ID pull-up、部分版本的 PHYRST workaround;满足手册 ID 采样延时。cdns_get_id/cdns_get_vbus:读OTGSTS。cdns_hw_role_switch:usb_role_switch_register,与 Type‑C 或其它策略模块联动。- 中断/workqueue:根据 ID/VBUS 切换
cdns_role_start/stop(停 xHCI 或 gadget,避免双角色同时抢占)。
5. Gadget 侧(USB3:cdns3-gadget.c + cdns3-ep0.c)
- 操作
cdns3_usb_regs(与 xHCI 窗口分离)。 - TRB 环、doorbell、link TRB 等与 USB3 SuperSpeed 设备协议一致;源码注释详细记录 控制器版本相关的 DMA/TRB 竞争 workaround(共享片内 OUT buffer 等)。
- Kconfig:支持 FS/HS/SS,不支持 LS(与芯片一致)。
6. 平台示例(cdns3-plat.c)
- 解析
host/peripheral/otg/wakeup命名 IRQ;xhci/dev/otg命名 MEM。 cdns3,usb2-phy/cdns3,usb3-phy:phy_init+phy_power_on。gadget_init = cdns3_gadget_init→cdns_init。
i.MX / TI glue 在对应文件中补充 时钟、复位、pdata quirks。
7. CDNSP PCI(cdnsp-pci.c)
- 双 PCI function:function0 HOST+DEV BAR,function1 OTG;probe 时配对另一 function。
- BAR 映射:主机侧与设备侧寄存器分离(宏
PCI_BAR_*)。 - 适用于 Cadence 评估 FPGA / USBSSP IP 等。
8. 与 RK3588 的关系
RK3588(Rockchip)片上 USB 通常为 Synopsys DWC3,不是 Cadence CDNS3。本目录对 RK3588 树的意义主要是:对照「xHCI 主机 + 独立 DEV 寄存器 + DRD」 的软件拆分方式。
9. 小结
| 维度 | 说明 |
|---|---|
| 主机 | 标准 xHCI + xhci_plat_priv quirks |
| 设备 | 专用 gadget 驱动(USB3 cdns3;USBSSP cdnsp 更接近 xhci ring 模型) |
| 切换 | USB_ROLE_SWITCH + drd.c OTG 寄存器 + PHY |
| 依赖 | USB_CDNS_SUPPORT、DMA、(主机)USB_XHCI_PLATFORM |
调试主机问题时优先看 host.c 的 XECP 寄存器 与 xHCI dmesg;调试 device 时看 cdns3-gadget/cdnsp 的 TRB 与中断路径。
正在加载留言…