RK3588 kernel-6.1 drivers/usb 目录结构与分层设计原理

RK3588 kernel-6.1 drivers/usb 目录结构与分层设计原理

1. 范围与目标

本文针对目录:

  • rk3588/kernel-6.1/drivers/usb

说明:

  • 顶层 Makefile / Kconfig 如何汇总各子系统;
  • 主机(Host)usbcoreHCDGadgetType‑C / 角色切换 等在源码树中的位置;
  • Linux USB 在 drivers/usb 层面的 分层设计原理(与 include/linux/usb*.hDocumentation/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_DWC3DWC2ISP1760CDNS*MTU3MUSBCHIPIDEARENESAS_USBHS dwc3/dwc2/ 片上 USB IP,常含 DRD(双角色) glue
CONFIG_USB_*_HCDCONFIG_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
2
3
4
usbcore-y := usb.o hub.o hcd.o urb.o message.o driver.o
usbcore-y += config.o file.o buffer.o sysfs.o endpoint.o
usbcore-y += devio.o notify.o generic.o quirks.o devices.o
usbcore-y += phy.o port.o

模块语义概要:

对象文件 职责
hcd.o Host Controller Driver 抽象:usb_hcdhc_driver,连接具体 HCD 与 core
hub.o Root hub / 外部 hub枚举、端口事件
urb.omessage.o URB 生命周期与 同步控制/批量 等消息路径
driver.o usb_driverusb_interface 绑定、总线类型注册
config.oendpoint.odevices.o 配置/端点/设备对象与 sysfs
usb.o core 初始化与通用辅助
phy.o drivers/usb/phy/ 协作(电源、链路侧能力等)

原理硬件差异止于各 HCD / SoC glue协议拓扑与驱动模型统一在 usbcore,避免每个设备驱动直接访问控制器寄存器。


4. 主机控制器:drivers/usb/host/

host/ 提供标准 HCD(如 xhci-hcdehci-hcdohci-hcduhci-hcd)及:

  • PCIehci-pciohci-pcixhci-pci 等;
  • Platformxhci-platehci-platformohci-platform 等;
  • SoC 专用:xhci-tegraehci-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 典型组成:

  • libcompositecomposite.cconfigfs.cfunctions.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
2
3
4
5
6
7
USB 接口级功能驱动(storage/serial/class/...)
↑ usb_driver / usb_interface
drivers/usb/core(usbcore:hub、hcd、urb、driver)
↑ usb_hcd / hc_driver
drivers/usb/host 与 SoC 目录(xHCI/EHCI/DWC3 glue…)
↑ MMIO / IRQ / DMA + PHY
USB 电缆与外设

11. 阅读顺序建议

  1. 本文:drivers/usb 目录与分层
  2. 同目录:rk3588-kernel-6.1-USB总线枚举匹配与数据传输分析.md —— 枚举与 URB
  3. 内核上游文档:Documentation/usb/Documentation/devicetree/bindings/usb/
  4. RK3588 板级:设备树中 snps,dwc3physdr_moderole-switch 等节点。

文档生成依据:rk3588/kernel-6.1/drivers/usb/Makefiledrivers/usb/core/Makefiledrivers/usb/host/Makefiledrivers/usb/gadget/Makefiledrivers/usb/Kconfig

文章互动

阅读 --

留言

0 条留言

正在加载留言…