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 设备不能主动向主机发送数据,只能响应主机的请求。
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 描述。
端点根据传输类型分为四种:
- 控制端点(Control):双向,用于设备配置、状态查询。端点 0 固定为控制端点。
- 中断端点(Interrupt):单向(IN 或 OUT),保证延迟,用于 HID 设备(鼠标、键盘)。
- 批量端点(Bulk):单向,保证数据完整性,用于存储设备、网络适配器。
- 同步端点(Isochronous):单向,保证带宽,允许数据丢失,用于音频、视频流。
常见误区:端点方向是相对于主机而言的。IN 端点表示设备向主机发送数据,OUT 端点表示主机向设备发送数据。在设备描述符中,端点方向由
bEndpointAddress 的最高位(bit 7)标识。
2.6 管道(Pipe)
管道是主机软件(USB 核心层)与设备端点之间的逻辑通信通道。在 Linux 内核中,管道由 struct usb_pipe 抽象,包含以下信息:
- 设备地址:7 位地址,由主机在枚举时分配。
- 端点编号:4 位,范围 0~15。
- 端点方向:IN 或 OUT。
- 传输类型:控制、中断、批量、同步。
- 最大包大小:端点支持的单次传输最大字节数。
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 提交时的路由信息 |