USB Host驱动开发与设备枚举实战工程 - 第1节
1. USB协议基础
USB(Universal Serial Bus)采用星形-菊花链混合拓扑,由主机(Host)作为唯一根节点,通过集线器(Hub)向下扩展端口,最多支持 127 个设备(含 Hub 本身)。
核心原则:USB 总线是主机主导的轮询总线,所有事务必须由 Host 发起,设备不能主动发送数据。
拓扑结构三要素
- 主机(Host):唯一总线控制器,负责调度、错误恢复、电源管理。典型实现为 PC 的 xHCI 控制器或嵌入式 SoC 的 DWC3 控制器。
- 集线器(Hub):端口扩展器,负责转发事务、检测设备连接/断开、电源转换。根集线器(Root Hub)集成在 Host 内部。
- 设备(Device):功能端点,如 U 盘、键盘、摄像头。每个设备包含若干端点(Endpoint),端点 0 用于控制传输。
嵌入式开发提示:在嵌入式 Linux 中,Host 控制器通常对应
/sys/bus/usb/devices/ 下的拓扑树。使用 lsusb -t 可查看实际总线拓扑。
1.2 主机与设备角色
主机(Host)职责
| 职责 | 说明 |
|---|---|
| 事务调度 | 按帧/微帧时间片轮询各端点,发起 IN/OUT/SETUP 事务 |
| 枚举管理 | 检测设备插入/拔出,分配地址,读取描述符,加载驱动 |
| 电源管理 | 控制端口供电、挂起/唤醒、选择性挂起 |
| 错误恢复 | 检测 CRC 错误、超时、STALL,执行重试或复位 |
| 带宽分配 | 为等时/中断传输预留带宽,确保实时性 |
设备(Device)职责
- 被动响应:不主动发起事务,仅回复 Host 的请求。
- 端点暴露:通过端点 0 提供控制接口,其他端点提供数据通道。
- 描述符提供:向 Host 报告设备描述符、配置描述符、接口描述符、端点描述符。
- 电源响应:支持挂起/唤醒信号检测,响应远程唤醒。
常见误区:USB 设备不能像以太网设备那样主动发送数据包。所有通信必须由 Host 轮询触发,这是 USB 协议设计的根本约束。
1.3 USB 版本演进与速率对比
版本演进时间线
- USB 1.0 (1996):低速 1.5 Mbps + 全速 12 Mbps,首次统一外设接口。
- USB 1.1 (1998):修复 1.0 的时序问题,成为首个广泛部署版本。
- USB 2.0 (2000):高速 480 Mbps,引入微帧(125 µs)、事务转换器(TT)。
- USB 3.0 (2008):超高速 5 Gbps,增加双单工差分对,物理层改为 8b/10b 编码。
- USB 3.1 (2013):超高速+ 10 Gbps,编码升级为 128b/132b。
- USB 3.2 (2017):双通道 20 Gbps,使用 Type-C 连接器。
- USB4 (2019):40 Gbps,基于 Thunderbolt 3 协议隧道,支持 PCIe/DisplayPort 复用。
速率对比表
| 版本 | 市场名称 | 理论速率 | 编码方式 | 信号线 |
|---|---|---|---|---|
| USB 1.0 | 低速 (LS) | 1.5 Mbps | NRZI + 位填充 | D+/D- |
| USB 1.1 | 全速 (FS) | 12 Mbps | NRZI + 位填充 | D+/D- |
| USB 2.0 | 高速 (HS) | 480 Mbps | NRZI + 位填充 | D+/D- |
| USB 3.0 | 超高速 (SS) | 5 Gbps | 8b/10b | SSTX+/-, SSRX+/- |
| USB 3.1 | 超高速+ (SS+) | 10 Gbps | 128b/132b | SSTX+/-, SSRX+/- |
| USB 3.2 | USB 3.2 2x2 | 20 Gbps | 128b/132b | 双通道 Type-C |
| USB4 | USB4 Gen3x2 | 40 Gbps | 128b/132b | 双通道 Type-C |
关键理解:USB 2.0 与 USB 3.x 在物理层完全独立。USB 3.x 增加了额外的差分对,与 USB 2.0 的 D+/D- 并行工作。这意味着 USB 3.0 设备插入 USB 2.0 端口时,会降级为 USB 2.0 高速模式。
1.4 速率与物理层关键差异
USB 2.0 与 USB 3.x 物理层对比
| 特性 | USB 2.0 (HS) | USB 3.0/3.1 (SS/SS+) |
|---|---|---|
| 信号线 | D+, D- (半双工) | SSTX+, SSTX-, SSRX+, SSRX- (全双工) |
| 传输方向 | 半双工,同一时间只能收或发 | 全双工,可同时收发 |
| 编码 | NRZI + 位填充 | 8b/10b (3.0) / 128b/132b (3.1+) |
| 帧结构 | 帧 1 ms / 微帧 125 µs | 无固定帧,异步传输 |
| 电源 | VBUS 5V,最大 500 mA | VBUS 5V,最大 900 mA (3.0) / 1.5 A (3.1+) |
| 连接器 | Type-A, Type-B, Mini, Micro | Type-A, Type-B, Type-C (3.1+) |
驱动开发关注点:USB 2.0 使用
ehci-hcd 或 ohci-hcd 驱动,USB 3.x 使用 xhci-hcd 驱动。xHCI 同时管理 USB 2.0 和 USB 3.x 端口,是当前主流方案。
速率选择对驱动的影响
- 低速/全速设备:事务传输延迟大,适合 HID 类设备(键盘、鼠标)。驱动需处理较长的帧间隔。
- 高速设备:微帧调度,适合批量传输(U 盘、MTP)。驱动需处理高吞吐量 DMA。
- 超高速设备:全双工流控,适合视频、存储类设备。驱动需处理多请求队列(TRB 环)。
性能陷阱:USB 3.0 设备插入 USB 2.0 端口时,不仅速率降为 480 Mbps,而且由于半双工限制,实际吞吐量可能只有 USB 3.0 的 1/10 以下。设计产品时务必确认端口版本匹配。
1.5 本章小结
- USB 采用星形-菊花链混合拓扑,主机是唯一总线主控。
- 主机负责调度、枚举、电源、错误恢复;设备被动响应。
- USB 版本从 1.0 的 1.5 Mbps 演进到 USB4 的 40 Gbps,物理层和编码方式发生根本变化。
- USB 2.0 与 USB 3.x 物理层独立并行,xHCI 驱动统一管理。
- 理解拓扑和版本差异是USB 驱动开发和设备枚举调试的基础。