RK3588 kernel-6.1:drivers/usb/chipidea 功能与实现要点
源码基准:rk3588/kernel-6.1/drivers/usb/chipidea/。目标模块 ci_hdrc(CONFIG_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_SWITCH、extcon、可选USB_OTG_FSM(otg_fsm.c)。
与 RK3588:Rockchip 片上 USB 以 DWC3 等为主,一般不启用 Chipidea。本分析面向 i.MX / MSM / Tegra / PCI evaluation 等使用该 IP 的平台。
2. 构建分层(Makefile)
| 组件 | 文件 | 作用 |
|---|---|---|
| 核心 | core.c |
寄存器 hw_bank/regmap(Cap + Op)、复位、时钟/phy、USBMODE、中断分发、probe/移除、usb_role_switch、pm_runtime/LPM |
| OTG | otg.c |
ID/VBUS、OTGSC 协作 |
| OTG FSM | otg_fsm.c(CONFIG_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.c、trace.c |
usb_gadget/usb_ep、ci_hw_ep、hw_ep_prime/DTD |
| Glue | ci_hdrc_imx.c、usbmisc_imx.c、ci_hdrc_usb2.c、ci_hdrc_pci.c、ci_hdrc_msm.c、ci_hdrc_tegra.c |
SoC 时钟、USB_MISC、复位、pdata/DT |
Kconfig 依赖:USB_EHCI_HCD(主机) 与 USB_GADGET(设备) 按裁剪组合;整包 select EXTCON、RESET_CONTROLLER、USB_ULPI_BUS、USB_ROLE_SWITCH。
3. 寄存器与硬件抽象(ci.h / core.c)
struct hw_bank:cap/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_role、roles[]指向ci_role_driver(start/stop/irq)、gadget、hcd、qh_pool/td_pool、platdata(linux/usb/chipidea.h:phy、usb_phy、flags、dr_mode、notify_event**)。
4. 主机侧原理(host.c)
- 静态
ci_ehci_hc_driver由ehci_init_driver+ehci_ci_overrides生成:port_power:regulator与可选usb_phy_vbus_on/off(CI_HDRC_PHY_VBUS_CONTROL);HSIC 时用 port test 强拉高速。reset:ehci_setup后ci_platform_configure及 SoCnotify_event(CONTROLLER_RESET)。
- IRQ:
host_irq→usb_hcd_irq(与 gadget 共享中断时在core里仲裁)。
本质:利用内核已有 EHCI 调度(QH/qTD),只补上 Chipidea 特有的 PHY/VBUS/复位钩子。
5. 设备侧原理(udc.c)
- EP0 + EPn:
ci_hw_ep内含usb_ep、qh(队列与 DMA 地址)、td_pool分配的 DTD 节点。 hw_device_state:配置ENDPTLISTADDR、开门禁中断(UI/UEI/PCI/URI)。hw_ep_prime/flush/complete:对齐芯片手册 Prime / Complete / Flush 模型推进传输。- 与
drivers/usb/gadgetcomposite 驱动对接标准usb_endpoint_descriptor。
6. 角色与电源(core.c、otg*.c)
usb_role_switch_register:set/get映射enum usb_role↔enum ci_role,便于 Type‑C 控制器或其它策略模块切换。struct ci_hdrc_cable:extcon监听 VBUS/ID,驱动work做ci_hdrc_role_change一类路径。CONFIG_USB_OTG_FSM:otg_fsm.c维护struct otg_fsm,与OTGSC、定时器协作。
7. 平台数据(include/linux/usb/chipidea.h)
ci_hdrc_platform_data 汇集 glue 差异:共享寄存器(CI_HDRC_REGS_SHARED)、流模式关闭、IMX28 写 workaround、HSIC、DMA 对齐要求、dr_mode、VBUS regulator、notify_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.c;platdata->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)。
正在加载留言…