Linux USB Host驱动架构与xhci协议 - 第1节
1. USB系统概述
通用串行总线(Universal Serial Bus,USB)自 1996 年正式发布以来,已成为电子设备最主流的有线连接标准。其设计初衷是统一外围设备接口、支持热插拔、提供总线供电,并简化 PC 与设备间的物理连接。下表梳理了 USB 各代标准的发布时间、速率与关键特性:
| 版本 | 发布时间 | 标称速率 | 编码方式 | 关键特性 |
|---|---|---|---|---|
| USB 1.0 | 1996 | 1.5 Mbps (Low-Speed) 12 Mbps (Full-Speed) |
NRZI + 位填充 | 热插拔、总线供电、Hub 扩展 |
| USB 1.1 | 1998 | 同上 | 同上 | 修正电气规范,广泛商用 |
| USB 2.0 | 2000 | 480 Mbps (Hi-Speed) | NRZI + 位填充 | 微帧调度、事务分割、OTG 补充 |
| USB 3.0 | 2008 | 5 Gbps (SuperSpeed) | 8b/10b | 双总线架构、全双工、增量 I/O |
| USB 3.1 | 2013 | 10 Gbps (SuperSpeed+) | 128b/132b | Type-C 接口、PD 协议 |
| USB 3.2 | 2017 | 20 Gbps (双通道) | 128b/132b | 多通道复用、增强 Type-C |
| USB4 | 2019 | 40 Gbps | 128b/132b | 基于 Thunderbolt 3、隧道协议 |
关键认知:USB 3.x 并非 USB 2.0 的简单提速,而是引入了独立的物理层和协议层,形成“双总线”架构——USB 2.0 信号与 SuperSpeed 信号在物理上并行传输,由主机控制器统一管理。
1.1.1 版本演进背后的驱动力
- USB 1.0 → 1.1:修复电气噪声与线缆长度限制,确立标准 A/B 接口形态。
- USB 2.0:引入微帧(Microframe,125 µs)和主机调度器,支持高速外设(如存储、视频)。
- USB 3.0:增加 5 对差分信号线(SSTX/SSRX),实现全双工传输;采用异步通知取代轮询,降低延迟。
- USB 3.1/3.2:提升信号速率并引入双通道(Lane)捆绑,配合 Type-C 正反插与 PD 供电。
- USB4:融合 Thunderbolt 3 协议栈,支持 DisplayPort、PCIe 隧道,面向高性能扩展坞与显示器。
讲师提示:在 Linux 内核中,USB 3.0 及以上版本由 xHCI(eXtensible Host Controller Interface)驱动统一管理;USB 2.0 及以下版本仍可由 EHCI/OHCI/UHCI 驱动处理,但现代 SoC 通常只集成 xHCI 控制器。
1.2 USB 物理拓扑结构:Host – Hub – Device
USB 采用星形-树形拓扑,由唯一的主机(Host)作为根节点,通过集线器(Hub)向下扩展,最多支持 127 个设备(含 Hub 自身)。物理拓扑严格分层,不允许环路。
1.2.1 主机(Host)角色
USB 系统中唯一的主控方,负责:
- 调度传输:管理所有事务(Transaction)的时间片,包括等时、批量、中断、控制四种传输类型。
- 枚举设备:检测设备插入/拔出,分配地址,读取描述符,加载驱动。
- 电源管理:控制总线供电、挂起/唤醒、选择性挂起。
在 Linux 中,Host 角色由 HCD(Host Controller Driver) 实现,xHCI 驱动是当前最通用的 HCD。
1.2.2 集线器(Hub)角色
Hub 是拓扑扩展的核心元件,具备以下功能:
- 信号中继与恢复:对上行/下行信号进行电平整形、时钟恢复。
- 端口状态管理:检测连接/断开、使能/禁能端口、复位设备。
- 事务分割(TT,Transaction Translator):USB 2.0 Hub 内置 TT,将高速帧转换为全速/低速事务,兼容低速设备。
常见误区:USB 3.0 Hub 不包含 TT 功能——SuperSpeed 信号与 USB 2.0 信号在 Hub 内部走独立路径,低速设备必须通过 Hub 内的 USB 2.0 中继器通信。
1.2.3 设备(Device)角色
USB 设备分为两类:
| 类别 | 说明 | 示例 |
|---|---|---|
| 功能设备(Function) | 提供具体功能,如存储、HID、音频 | U 盘、鼠标、扬声器 |
| 复合设备(Compound) | 内部包含 Hub + 多个功能 | USB 键盘带 Hub、扩展坞 |
每个设备在枚举后获得唯一的 7 位地址(1–127),并通过端点(Endpoint)与主机通信。端点 0 为默认控制端点,用于控制传输。
1.3 USB 系统软件架构概览
在 Linux 内核中,USB 子系统采用分层设计,从硬件到用户空间依次为:
本课程将重点聚焦 HCD 层中的 xHCI 驱动,深入分析其数据结构、环形缓冲区(Ring)、事件处理、命令提交与 DMA 交互机制。