1. USB协议栈概述
USB(Universal Serial Bus)协议栈是连接主机与外围设备的标准化通信体系。理解其层次结构是进行高速设备驱动性能调优的基础。本章从物理层到软件栈逐层剖析,并对比高速USB与全速/低速的关键差异。
1.1 USB协议栈的层次结构
USB协议栈自上而下分为四个层次:软件栈、协议层、链路层和物理层。每一层封装下层细节,向上层提供标准化接口。
1.2 各层次详解
1.2.1 物理层(Physical Layer)
物理层定义了USB信号在导线上的传输方式,包括差分信号、编码方案和电气特性。
- 信号编码:USB 2.0及以下使用NRZI(Non-Return-to-Zero Inverted)编码,配合位填充(Bit Stuffing)保证时钟同步;USB 3.x采用8b10b编码,直流平衡更好。
- 线缆结构:USB 2.0使用4线(VBUS、D+、D-、GND);USB 3.x增加为9线(额外SSTX+/-、SSRX+/-)。
- 终端电阻:全速/低速设备通过D+/D-线上的上拉电阻识别速度。
1.2.2 链路层(Link Layer)
链路层负责将数据组织为包(Packet)和事务(Transaction),管理总线访问。
- 包类型:令牌包(Token)、数据包(Data)、握手包(Handshake)、特殊包(Special)。
- 事务组成:一个事务包含令牌阶段、数据阶段(可选)、握手阶段(可选)。
- 帧/微帧:全速/低速以1ms为帧周期;高速USB以125μs为微帧周期,每微帧可发起多个事务。
1.2.3 协议层(Protocol Layer)
协议层定义了主机与设备之间的通信规则和数据组织。
- 端点(Endpoint):设备上的数据收发单元,每个端点有唯一地址和方向。
- 管道(Pipe):主机与端点之间的逻辑连接,分为消息管道(控制传输)和流管道(批量/中断/等时)。
- USB请求块(URB):Linux内核中描述一次USB传输的数据结构,包含传输类型、数据缓冲区、回调函数等。
1.2.4 软件栈(Software Stack)
软件栈是操作系统层面的实现,负责管理USB总线、枚举设备、调度传输。
- 主机控制器驱动(HCD):直接操作硬件寄存器,处理链路层事务。
- USB核心(USB Core):提供设备枚举、地址分配、描述符解析、电源管理等公共服务。
- 设备驱动(Client Driver):针对具体设备类型(如存储、HID、网络)实现业务逻辑。
1.3 高速USB与全速/低速的区别
USB 2.0引入了高速(High-Speed, 480 Mbps)模式,与全速(Full-Speed, 12 Mbps)和低速(Low-Speed, 1.5 Mbps)在电气、协议和调度上存在显著差异。USB 3.x(SuperSpeed, 5 Gbps及以上)则采用全新的物理层和协议。
| 特性 | 低速 (LS) | 全速 (FS) | 高速 (HS) | 超高速 (SS) |
|---|---|---|---|---|
| 速率 | 1.5 Mbps | 12 Mbps | 480 Mbps | 5/10/20 Gbps |
| 编码 | NRZI | NRZI | NRZI | 8b10b / 128b132b |
| 帧周期 | 1 ms | 1 ms | 125 μs(微帧) | 异步 |
| 信号电压 | 3.3V | 3.3V | 400mV(差分) | 800mV~1.2V |
| 线缆最大长度 | 3 m | 5 m | 5 m | 3 m(铜缆) |
| 拓扑 | 星型(通过Hub) | 星型 | 星型 | 星型(双单工) |
| 传输类型 | 控制、中断 | 控制、批量、中断、等时 | 控制、批量、中断、等时 | 控制、批量、中断、等时、流 |
性能调优要点:高速USB的微帧机制允许更细粒度的带宽分配,但同时也增加了调度复杂度。在驱动开发中,合理选择端点类型和事务大小直接影响吞吐量。
1.4 速度识别与协商
设备插入后,主机通过检测D+/D-线的电平状态识别设备速度:
- 低速设备:D-线上拉至3.3V,D+下拉至GND。
- 全速设备:D+线上拉至3.3V,D-下拉至GND。
- 高速设备:初始表现为全速设备,在复位过程中通过Chirp J/K序列协商切换到高速模式。
- 超高速设备:使用独立的差分对(SSTX/SSRX),通过电气握手协商进入SS模式。
1.5 传输类型与性能特征
USB定义了四种传输类型,每种类型在高速模式下的性能特征不同:
| 传输类型 | 用途 | 高速最大包大小 | 带宽保证 | 延迟敏感 |
|---|---|---|---|---|
| 控制传输 | 设备枚举、命令配置 | 64字节 | 10%保留 | 低 |
| 批量传输 | 存储、网络数据 | 512字节 | 无保证(尽力而为) | 低 |
| 中断传输 | 键盘、鼠标、HID | 1024字节 | 有(轮询间隔保证) | 中 |
| 等时传输 | 音频、视频流 | 1024字节 | 有(固定带宽) | 高 |
驱动调优启示:高速批量传输的包大小(512字节)是全速(64字节)的8倍,但无带宽保证。在驱动中,通过URB合并和DMA对齐可以显著提升批量传输吞吐量。中断传输在高速下支持更大的包,适合高频率数据采集设备。
1.6 USB 3.x 超高速新特性
USB 3.x(SuperSpeed)在架构上做了重大改进,与USB 2.0不兼容但共存:
- 双单工通信:独立的发送(SSTX)和接收(SSRX)通道,支持全双工。
- 异步传输:不再依赖主机轮询,设备可主动发起异步通知。
- 流(Stream):批量端点支持流模式,允许多个独立数据流复用同一个端点,提升存储设备并发性能。
- 电源管理:支持U0/U1/U2/U3多级低功耗状态,链路可在空闲时快速降速。
注意:USB 3.x的物理层编码和链路管理完全不同于USB 2.0。在驱动开发中,需要区分
struct usb_device的speed字段(USB_SPEED_SUPER),并针对性地调整URB调度策略和缓冲区对齐方式。
1.7 小结
USB协议栈的分层设计使得上层驱动无需关心电气细节,但性能调优必须理解每一层的开销:
- 物理层:线缆质量、信号完整性影响重传率。
- 链路层:帧/微帧调度决定带宽分配粒度。
- 协议层:端点类型和包大小直接影响吞吐量。
- 软件栈:URB管理、中断处理、DMA映射是CPU开销的主要来源。