RK3588 kernel-6.1:drivers/usb/cdns3 功能与实现要点

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-commoncore.odrd.o,可选 host.o
USB_CDNS3 cdns3.kocdns3-plat.o +(可选)cdns3-gadget.ocdns3-ep0.ocdns3-trace.o
USB_CDNS3_PCI_WRAP cdns3-pci-wrap.o(ACPI PCIe)
USB_CDNS3_TI / USB_CDNS3_IMX SoC glue:cdns3-ti.ccdns3-imx.c
USB_CDNSP_PCI cdnsp-udc-pci.koPCI 双功能(HOST/DEV + OTG);_gadget 侧 cdnsp-ring/gadget/mem/ep0(与 xHCI 环/TRB 思路相近

主机符合 xHCI,由 host.c 动态 platform_device_alloc("xhci-hcd") 挂载 drivers/usb/host/xhci-plat,不再重复实现调度器。
设备USB3cdns3-gadget.c(寄存器窗 dev);CDNSPcdnsp-*.c(支持 SSP,注释说明算法借鉴主机)。


2. 核心抽象:struct cdnscore.h

  • 资源分区xHCI MMIO + IRQxhci_res[])、Device 控制器 MMIOdev_regs)、OTG 控制 MMIOotg_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_driverstart/stop/suspend/resume
  • PHYusb2_phy/usb3_phygeneric_phy)。
  • gadget_init:USB3 平台为 cdns3_gadget_init;CDNSP PCI 为 cdnsp_gadget_init(在 glue 中赋值)。

core.ccdns_initcdns_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_modecdns_role_start(idle → 按 OTG/host/peripheral 启动)。


3. 主机侧(host.c

  1. cdns_drd_host_on:DRD 逻辑切到 主机可用(电源/时钟由 drd.c 协调)。
  2. 分配 xhci-hcd 子设备:资源为 IRQ + xhci MEM
  3. xhci_plat_priv
    • USBSS(CDNS3)XHCI_SKIP_PHY_INIT | XHCI_AVOID_BEIplat_startCMD_PM_INDEX扩展寄存器 XECP_AUX_CTRL_REG1/XECP_PORT_CAP_REG(LPM/RxDet 等 Cadence 专有项)。
    • USBSSP(CDNSP)XHCI_CDNS_SCTX_QUIRK
  4. resume_quirk:恢复后重做 plat_start

即:Cadence 只做 glue + quirk,协议与调度全在 内核 xhci 栈


4. DRD / OTG(drd.c

  • cdns_set_modeOTG 时配置 ID pull-up、部分版本的 PHYRST workaround;满足手册 ID 采样延时
  • cdns_get_id/cdns_get_vbus:读 OTGSTS
  • cdns_hw_role_switchusb_role_switch_register,与 Type‑C 或其它策略模块联动。
  • 中断/workqueue:根据 ID/VBUS 切换 cdns_role_start/stop(停 xHCIgadget,避免双角色同时抢占)。

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-phyphy_init + phy_power_on
  • gadget_init = cdns3_gadget_initcdns_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 与中断路径

文章互动

阅读 --

留言

0 条留言

正在加载留言…