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

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

源码基准:rk3588/kernel-6.1/drivers/usb/chipidea/。目标模块 ci_hdrcCONFIG_USB_CHIPIDEA)。

1. 驱动定位

ChipIdea USB HS OTG / Dual-Role Controller(也常写作 Chipidea CI HDRC)是 MIPS/NXP 系商用 USB2 主机 + 设备双角色 IP。Linux drivers/usb/chipidea 在同一寄存器窗口上实现:

  • 主机:作为 EHCI 变种 挂接到 usbcore(共享 drivers/usb/host/ehci*.h 基础设施)。
  • 设备usb_gadget(UDC),基于硬件 Queue Head / Transfer Descriptor(DTD) 环形结构与 dma_pool
  • 角色切换USB_ROLE_SWITCHextcon、可选 USB_OTG_FSMotg_fsm.c)。

与 RK3588:Rockchip 片上 USB 以 DWC3 等为主,一般不启用 Chipidea。本分析面向 i.MX / MSM / Tegra / PCI evaluation 等使用该 IP 的平台。


2. 构建分层(Makefile

组件 文件 作用
核心 core.c 寄存器 hw_bank/regmap(Cap + Op)、复位、时钟/phyUSBMODE、中断分发、probe/移除、usb_role_switchpm_runtime/LPM
OTG otg.c ID/VBUS、OTGSC 协作
OTG FSM otg_fsm.cCONFIG_USB_OTG_FSM 协议状态机定时器
ULPI ulpi.c OP_ULPI_VIEWPORT 访问外部 PHY
Debug debug.c debugfs
Host host.c ehci_hcd + ehci_driver_overrides(端口供电、reset 回调 ci_platform_configure
Gadget udc.ctrace.c usb_gadget/usb_epci_hw_ephw_ep_prime/DTD
Glue ci_hdrc_imx.cusbmisc_imx.cci_hdrc_usb2.cci_hdrc_pci.cci_hdrc_msm.cci_hdrc_tegra.c SoC 时钟、USB_MISC、复位、pdata/DT

Kconfig 依赖:USB_EHCI_HCD(主机)USB_GADGET(设备) 按裁剪组合;整包 select EXTCONRESET_CONTROLLERUSB_ULPI_BUSUSB_ROLE_SWITCH


3. 寄存器与硬件抽象(ci.h / core.c

  • struct hw_bankcap / op 两套指针 + regmap[],按 是否 LPM 选用 ci_regs_nolpm[]ci_regs_lpm[]OTGSC/USBMODE/EP 寄存器偏移 在 LPM 版上移址)。
  • CAP_DCCPARAMS:区分是否同时具备 HC/DC
  • OP_USBMODE:主机 / 设备 / 静止模式切换的核心之一。
  • OP_PORTSC:主机端口状态、测试模式(hw_port_test_set)等。
  • struct ci_hdrc:当前 enum ci_roleroles[] 指向 ci_role_driverstart/stop/irq)、gadgethcdqh_pool/td_poolplatdatalinux/usb/chipidea.hphyusb_phyflagsdr_modenotify_event**)。

4. 主机侧原理(host.c

  • 静态 ci_ehci_hc_driverehci_init_driver + ehci_ci_overrides 生成:
    • port_powerregulator 与可选 usb_phy_vbus_on/offCI_HDRC_PHY_VBUS_CONTROL);HSIC 时用 port test 强拉高速。
    • resetehci_setupci_platform_configure 及 SoC notify_event(CONTROLLER_RESET)
  • IRQhost_irqusb_hcd_irq(与 gadget 共享中断时在 core 里仲裁)。

本质:利用内核已有 EHCI 调度(QH/qTD),只补上 Chipidea 特有的 PHY/VBUS/复位钩子


5. 设备侧原理(udc.c

  • EP0 + EPnci_hw_ep 内含 usb_epqh(队列与 DMA 地址)、td_pool 分配的 DTD 节点
  • hw_device_state:配置 ENDPTLISTADDR、开门禁中断(UI/UEI/PCI/URI)。
  • hw_ep_prime/flush/complete:对齐芯片手册 Prime / Complete / Flush 模型推进传输。
  • drivers/usb/gadget composite 驱动对接标准 usb_endpoint_descriptor

6. 角色与电源(core.cotg*.c

  • usb_role_switch_registerset/get 映射 enum usb_roleenum ci_role,便于 Type‑C 控制器或其它策略模块切换。
  • struct ci_hdrc_cableextcon 监听 VBUS/ID,驱动 workci_hdrc_role_change 一类路径。
  • CONFIG_USB_OTG_FSMotg_fsm.c 维护 struct otg_fsm,与 OTGSC、定时器协作。

7. 平台数据(include/linux/usb/chipidea.h

ci_hdrc_platform_data 汇集 glue 差异:共享寄存器CI_HDRC_REGS_SHARED)、流模式关闭IMX28 写 workaroundHSICDMA 对齐要求dr_modeVBUS regulatornotify_event 回调等。DT platform_device 常与 ci_hdrc_imx 等绑定生成该结构。


8. 小结

维度 说明
对上接口 Host:usb_hcd(EHCI);Device:usb_gadget
数据通路 Host:EHCI QH/qTD;Device:硬件 QH + DTD(dma_pool)
PHY 内置寄存器 + ulpi.cplatdata->phy/usb_phy
DRD USBMODE + role drivers + role_switch/extcon (+ OTG FSM)

深入调试建议:对照芯片手册 USBCMD/USBSTS/PORTSC/USBMODE/ENDPTCTRL;主机栈抓 usbmon;设备栈开 drivers/usb/chipidea/trace.c(若 CONFIG_TRACING)。

文章互动

阅读 --

留言

0 条留言

正在加载留言…