1. USB协议基础:USB总线发展历史、USB物理拓扑结构、USB电气特性、USB数据流模型

1.1 USB总线发展历史

通用串行总线(Universal Serial Bus,USB)自1996年正式发布以来,经历了多个版本的演进,每一次迭代都带来了带宽、供电能力和协议功能的显著提升。下表总结了各主要版本的关键参数:

版本发布时间理论带宽信号速率编码方式供电能力
USB 1.0 / 1.11996 / 19981.5 Mbps (Low-Speed)
12 Mbps (Full-Speed)
1.5 / 12 MbpsNRZI + 位填充5V / 500 mA
USB 2.02000480 Mbps (High-Speed)480 MbpsNRZI + 位填充5V / 500 mA
USB 3.2 Gen 1×12008 (USB 3.0)5 Gbps (SuperSpeed)5 Gbps8b/10b5V / 900 mA
USB 3.2 Gen 2×12013 (USB 3.1)10 Gbps (SuperSpeed+)10 Gbps128b/132b5V / 900 mA
USB 3.2 Gen 2×2201720 Gbps10 Gbps × 2 通道128b/132b5V / 1.5 A (BC 1.2)
USB4 Gen 3×2201940 Gbps20 Gbps × 2 通道64b/66b5V / 3 A (USB PD)
关键理解:USB 2.0 之前的版本使用半双工共享总线架构,而 USB 3.x 引入了独立的发送/接收差分对,实现了全双工通信。USB4 则进一步融合了 Thunderbolt 3 协议,支持隧道传输(PCIe、DisplayPort)。

1.2 USB物理拓扑结构

USB 采用星型-菊花链混合拓扑,由主机(Host)、集线器(Hub)和设备(Device)三级构成。主机控制器位于根集线器(Root Hub)之上,最多支持 127 个设备地址(地址 0 保留给未配置设备)。

拓扑规则:最大层级深度为 7 层(包括根集线器),每个集线器最多连接 7 个下游端口。物理连接必须构成树形结构,不允许环路。
USB 物理拓扑结构(树形) 主机 (Host / Root Hub) 集线器 Hub (Level 1) 集线器 Hub (Level 2) 集线器 Hub (Level 2) 设备 Device 设备 Device 设备 Device 设备 Device 最大设备数:127(含集线器) | 最大层级:7 层 | 拓扑:树形,禁止环路

1.3 USB电气特性

USB 总线使用差分信号传输数据,并同时提供VBUS(+5V)和GND电源线。不同速度模式下的电气参数差异显著:

速度模式信号电平终端电阻电缆最大长度驱动方式
Low-Speed (1.5 Mbps)差分 0~3.3V上游 15 kΩ 下拉
下游 1.5 kΩ 上拉 (D-)
5 m电压驱动
Full-Speed (12 Mbps)差分 0~3.3V上游 15 kΩ 下拉
下游 1.5 kΩ 上拉 (D+)
5 m电压驱动
High-Speed (480 Mbps)差分 0~400 mV45 Ω 对地 (D+/D-)5 m电流驱动
SuperSpeed (5 Gbps)差分 0~1.0V100 Ω 差分终端3 m电流驱动 + 去加重
工程注意:USB 2.0 High-Speed 模式下,D+ 和 D- 上的终端电阻从 Full-Speed 的 1.5 kΩ 上拉切换为 45 Ω 对地,这是由集线器或主机在握手阶段通过 Chirp 信号动态配置的。驱动开发中,终端电阻的检测是枚举流程中判断设备速度等级的关键依据。

1.4 USB数据流模型

USB 的数据传输采用主机驱动的轮询模型,所有通信均由主机发起。数据流在逻辑上分为四个层级:

  1. 应用层(Client Software):设备驱动程序与用户空间交互,通过 URBs(USB Request Blocks)与 USB 核心层通信。
  2. USB 系统软件层(USB Core / HCD):Linux 内核中的 USB 核心子系统,负责协议解析、带宽管理、设备枚举。
  3. 主机控制器层(Host Controller):硬件实现 OHCI / UHCI / EHCI / xHCI 规范,管理事务处理列表。
  4. 物理层(Bus Interface):差分信号、包编码、位填充、CRC 校验。
USB 数据流模型(主机侧) 应用层:Client Driver / User App USB 系统软件层:USB Core / HCD 主机控制器层:OHCI / UHCI / EHCI / xHCI 物理层:差分信号 / 包编码 / CRC 数据流方向:主机 → 设备(OUT)或 设备 → 主机(IN),所有事务由主机调度

1.4.1 传输类型与数据流特征

USB 规范定义了四种传输类型,每种类型对应不同的数据流模型和带宽保证:

传输类型方向带宽保证错误重试典型应用最大包大小 (FS/HS/SS)
控制传输双向10% 保留硬件重试枚举、配置、命令64 / 64 / 512
批量传输单向尽力而为硬件重试存储、打印机、网络64 / 512 / 1024
中断传输单向保证延迟硬件重试HID 键盘/鼠标、游戏杆64 / 1024 / 1024
等时传输单向保证带宽无重试音频、视频、实时数据1023 / 1024 / 1024
驱动开发要点:在 Linux 内核中,每种传输类型对应不同的 URB 处理函数和完成回调。批量传输适合大数据量但无实时要求的场景;中断传输适合周期性小数据;等时传输必须处理丢包,因为硬件不自动重试。控制传输是所有设备枚举的必经之路,必须优先实现。

1.4.2 数据流单元:包、事务与传输

USB 数据流在物理层以包(Packet)为最小单位,多个包组成事务(Transaction),多个事务构成一次传输(Transfer)。以批量 OUT 传输为例:

传输 (Transfer)
  ├── 事务 1 (Transaction)
  │   ├── 令牌包 (Token Packet): OUT + 地址 + 端点
  │   ├── 数据包 (Data Packet): DATA0 / DATA1 + 数据负载 + CRC16
  │   └── 握手包 (Handshake Packet): ACK / NAK / STALL
  ├── 事务 2
  │   ├── 令牌包: OUT + 地址 + 端点
  │   ├── 数据包: DATA0 / DATA1 (切换同步)
  │   └── 握手包: ACK
  └── ... (直到传输完成)
数据切换(Data Toggle)机制:USB 使用 DATA0 和 DATA1 交替发送来保证数据完整性。主机和设备各自维护一个 toggle 位,只有 toggle 匹配的数据包才会被接收。驱动开发中,toggle 同步错误是常见的枚举失败原因之一,通常需要复位端点或重新配置接口。