2. USB 硬件拓扑:主机控制器(HCD)、根集线器(Root Hub)、USB设备、端点(Endpoint)、管道(Pipe)

USB 硬件拓扑是一个严格的树形分层结构,由 USB 主机控制器作为根节点,通过根集线器向下扩展,连接各类USB 设备。理解这一拓扑中的核心组件——主机控制器、根集线器、设备、端点和管道——是掌握 USB 驱动架构的基础。

2.1 拓扑结构总览

一个典型的 USB 系统包含以下层级:

  • 主机侧:USB 主机控制器(Host Controller, HC)与根集线器(Root Hub)集成在 SoC 或 PCI 控制器中。
  • 总线侧:根集线器提供物理端口,通过 USB 电缆连接外部集线器或功能设备。
  • 设备侧:每个 USB 设备内部包含若干端点(Endpoint),主机通过管道(Pipe)与端点进行数据通信。
关键概念:USB 拓扑中,主机控制器是唯一的“主设备”,所有通信均由主机发起。USB 设备不能主动向主机发送数据,只能响应主机的请求。
USB 硬件拓扑分层结构 USB 主机控制器(HCD) 根集线器(Root Hub) 外部集线器 USB 功能设备 复合设备 端点 0(控制) 端点 1(中断) 端点 2(批量) 端点 3(同步) 管道(Pipe) 主机控制器与端点之间的逻辑数据通道,由端点地址 + 传输类型唯一标识

2.2 主机控制器(HCD)

USB 主机控制器是 USB 系统的核心硬件单元,负责管理总线上的所有数据传输。在 Linux 内核中,主机控制器驱动(HCD, Host Controller Driver)抽象了不同硬件规范的差异。

规范 速度 Linux HCD 驱动 特点
UHCI USB 1.1 (Full/Low) uhci-hcd Intel 主导,软件复杂度高,硬件简单
OHCI USB 1.1 (Full/Low) ohci-hcd Compaq/Microsoft 主导,硬件复杂度高
EHCI USB 2.0 (High) ehci-hcd 高速模式,兼容 UHCI/OHCI
xHCI USB 3.0/3.1/3.2 (SuperSpeed) xhci-hcd 统一架构,支持所有速度,向后兼容
驱动开发要点:在嵌入式 Linux 中,xHCI 已成为主流。编写 HCD 驱动时,需要实现 struct hc_driver 结构体中的回调函数,包括 start()、stop()、urb_enqueue() 等。

2.3 根集线器(Root Hub)

根集线器是主机控制器内部集成的虚拟集线器,提供物理 USB 端口。它在 Linux 中被抽象为一个标准的 USB 集线器设备,参与设备枚举和状态管理。

  • 端口管理:检测设备插入/拔出、复位端口、启用/禁用端口。
  • 速度协商:通过 D+/D- 信号线的电平组合判断设备速度(Low/Full/High/SuperSpeed)。
  • 电源管理:控制端口电源开关,支持挂起/唤醒。
  • 中断传输:根集线器通过中断传输向主机报告端口状态变化。

2.4 USB 设备

USB 设备分为两类:集线器(Hub)和功能设备(Function)。每个 USB 设备在枚举后由内核分配一个唯一的 struct usb_device 结构体。

设备类型 描述 示例
集线器 扩展 USB 端口,实现总线拓扑扩展 USB 2.0 4 端口集线器
功能设备 实现特定功能,如 HID、存储、音频 鼠标、键盘、U 盘
复合设备 包含多个接口(Interface),每个接口实现独立功能 USB 摄像头(视频 + 音频)

2.5 端点(Endpoint)

端点是 USB 设备中实际进行数据收发的硬件单元。每个 USB 设备至少包含一个端点 0(默认控制端点),用于设备枚举和控制传输。端点由 struct usb_host_endpoint 描述。

端点根据传输类型分为四种:

  1. 控制端点(Control):双向,用于设备配置、状态查询。端点 0 固定为控制端点。
  2. 中断端点(Interrupt):单向(IN 或 OUT),保证延迟,用于 HID 设备(鼠标、键盘)。
  3. 批量端点(Bulk):单向,保证数据完整性,用于存储设备、网络适配器。
  4. 同步端点(Isochronous):单向,保证带宽,允许数据丢失,用于音频、视频流。
常见误区:端点方向是相对于主机而言的。IN 端点表示设备向主机发送数据,OUT 端点表示主机向设备发送数据。在设备描述符中,端点方向由 bEndpointAddress 的最高位(bit 7)标识。

2.6 管道(Pipe)

管道是主机软件(USB 核心层)与设备端点之间的逻辑通信通道。在 Linux 内核中,管道由 struct usb_pipe 抽象,包含以下信息:

  • 设备地址:7 位地址,由主机在枚举时分配。
  • 端点编号:4 位,范围 0~15。
  • 端点方向:IN 或 OUT。
  • 传输类型:控制、中断、批量、同步。
  • 最大包大小:端点支持的单次传输最大字节数。
管道(Pipe)与端点(Endpoint)映射关系 主机(Host) 管道 0(控制) 管道 1(中断 IN) 管道 2(批量 OUT) USB 设备 端点 0(控制) 端点 1(中断 IN) 端点 2(批量 OUT) 管道 = 设备地址 + 端点号 + 方向 + 传输类型 例如:地址 0x03,端点 1 IN,中断传输 → 唯一标识一个逻辑通信通道 URB 通过管道提交到对应端点

2.7 拓扑与驱动架构的对应关系

USB 硬件拓扑直接映射到 Linux USB 驱动的软件架构:

硬件组件 内核数据结构 驱动角色
主机控制器 struct usb_hcd HCD 驱动,管理硬件寄存器、调度传输
根集线器 struct usb_device (hub) 集线器驱动,处理端口事件
USB 设备 struct usb_device 设备驱动(如 usb-storage、usbhid)
端点 struct usb_host_endpoint URB 传输的目标实体
管道 struct usb_pipe (内部) URB 提交时的路由信息