RK3588 kernel-6.1 drivers/usb 目录结构与分层设计原理
1. 范围与目标
本文针对目录:
rk3588/kernel-6.1/drivers/usb
说明:
- 顶层
Makefile/Kconfig如何汇总各子系统; - 主机(Host)、
usbcore、HCD、Gadget、Type‑C / 角色切换 等在源码树中的位置; - Linux USB 在
drivers/usb层面的 分层设计原理(与include/linux/usb*.h、Documentation/usb/内核文档互补)。
更细的 枚举、hub.c 调用链、URB、接口驱动匹配 见同目录:
rk3588-kernel-6.1-USB总线枚举匹配与数据传输分析.md
2. 顶层构建:drivers/usb/Makefile
drivers/usb/Makefile 按 配置项 挂接子目录,体现「主机 core / PHY / 各类控制器 / Gadget / 类驱动 / 周边」的划分:
| 变量前缀 | 典型目录 | 含义 |
|---|---|---|
CONFIG_USB_COMMON |
common/ |
Host/Gadget 共用符号(若启用) |
CONFIG_USB |
core/ |
usbcore:hub、hcd、urb、driver 等 |
CONFIG_USB_SUPPORT |
phy/ |
USB PHY 框架与驱动入口 |
CONFIG_USB_DWC3、DWC2、ISP1760、CDNS*、MTU3、MUSB、CHIPIDEA、RENESAS_USBHS |
dwc3/、dwc2/ 等 |
片上 USB IP,常含 DRD(双角色) glue |
CONFIG_USB_*_HCD、CONFIG_USB_PCI |
host/ |
xHCI/EHCI/OHCI/UHCI 及 PCI/platform glue |
CONFIG_USB_MON |
mon/ |
usbmon 监视 |
CONFIG_USB_*(class/storage 等) |
class/、storage/、image/ |
标准类与海量存储等 |
CONFIG_USB_SERIAL |
serial/ |
USB 串口子系统 |
CONFIG_USB_GADGET |
gadget/ |
Gadget:UDC + composite + functions |
CONFIG_USBIP_CORE |
usbip/ |
USB/IP |
CONFIG_TYPEC |
typec/ |
Type‑C、PD、TCPM、mux 等 |
CONFIG_USB_ROLE_SWITCH |
roles/ |
USB 角色切换 class |
设计要点:编译边界与 Kconfig 菜单一致,便于裁剪嵌入式镜像;控制器实现(dwc3/、host/)与 协议与设备模型(core/)分离。
3. 主机核心:drivers/usb/core/(usbcore)
drivers/usb/core/Makefile 将主机通用逻辑链接为 usbcore:
1 | usbcore-y := usb.o hub.o hcd.o urb.o message.o driver.o |
模块语义概要:
| 对象文件 | 职责 |
|---|---|
hcd.o |
Host Controller Driver 抽象:usb_hcd、hc_driver,连接具体 HCD 与 core |
hub.o |
Root hub / 外部 hub、枚举、端口事件 |
urb.o、message.o |
URB 生命周期与 同步控制/批量 等消息路径 |
driver.o |
usb_driver 与 usb_interface 绑定、总线类型注册 |
config.o、endpoint.o、devices.o |
配置/端点/设备对象与 sysfs |
usb.o |
core 初始化与通用辅助 |
phy.o |
与 drivers/usb/phy/ 协作(电源、链路侧能力等) |
原理:硬件差异止于各 HCD / SoC glue;协议拓扑与驱动模型统一在 usbcore,避免每个设备驱动直接访问控制器寄存器。
4. 主机控制器:drivers/usb/host/
host/ 提供标准 HCD(如 xhci-hcd、ehci-hcd、ohci-hcd、uhci-hcd)及:
- PCI:
ehci-pci、ohci-pci、xhci-pci等; - Platform:
xhci-plat、ehci-platform、ohci-platform等; - SoC 专用:
xhci-tegra、ehci-exynos等。
RK3588 常见衔接:片上 DWC3 在 host 模式下往往与 platform xHCI(如 xhci-plat.c)路径配合(具体以 BSP DTS/驱动绑定为准),之上仍是同一 usbcore。
5. 片上 IP 与双角色:dwc3/、dwc2/、musb/、chipidea/、cdns3/、mtu3/ 等
这些目录对应 集成 USB 控制器,特点:
- 同一 IP 常支持 Host / Device / OTG;
- 驱动负责 时钟、复位、寄存器映射、PHY 握手、模式切换;
- 向内核注册 HCD(主机)和/或 UDC(Gadget),而不是替代
usbcore。
设计要点:把 SoC/Board 差异收敛在单独目录,与通用 host/ 里的纯标准 HCD 并存。
6. Gadget:drivers/usb/gadget/
gadget/Makefile 典型组成:
libcomposite:composite.c、configfs.c、functions.c等——复合设备框架;udc/:各 USB Device Controller 驱动;function/:USB Function(mass storage、rndis、hid 等);legacy/:旧式 gadget 驱动。
原理:UDC 提供 peripheral 侧端点能力;上层通过 composite/configfs 组装配置与接口,与主机侧 usb_driver 对称但模型不同。
7. 功能类与设备驱动:class/、storage/、serial/、image/、misc/
class/:内核内置 USB class 驱动(如 ACM、printer、WDM、TMC)。storage/、serial/等:按应用场景划分的 USB 设备驱动,通过usb_register()绑定 接口,属于 USB 设备功能层,不实现总线控制器。
8. Type‑C、PD、角色:typec/、roles/
typec/:连接器与电源协商(TCPM、PD、mux、UCSI 等),与usbcore并行,通过端口/notifier 与控制器协同。roles/:USB role switch(例如intel-xhci-usb-role-switch.c),用于 host/peripheral 视图切换。
二者解决的是 物理端口与电源/角色策略,不是替代 USB 协议栈本身。
9. 其它:usbip/、mon/、early/、atm/、cdns3/ 双路径等
usbip/:通过网络导出/导入 USB 设备;mon/:usbmon,抓包/调试;early/:早期 printk USB(极少平台);usb-skeleton.c:示例驱动。
10. 主机侧逻辑分层小结(与 drivers/usb 对应)
1 | USB 接口级功能驱动(storage/serial/class/...) |
11. 阅读顺序建议
- 本文:
drivers/usb目录与分层; - 同目录:
rk3588-kernel-6.1-USB总线枚举匹配与数据传输分析.md—— 枚举与 URB; - 内核上游文档:
Documentation/usb/、Documentation/devicetree/bindings/usb/; - RK3588 板级:设备树中
snps,dwc3、phys、dr_mode、role-switch等节点。
文档生成依据:rk3588/kernel-6.1/drivers/usb/Makefile、drivers/usb/core/Makefile、drivers/usb/host/Makefile、drivers/usb/gadget/Makefile、drivers/usb/Kconfig。
正在加载留言…