1. USB协议栈概述

USB(Universal Serial Bus)协议栈是连接主机与外围设备的标准化通信体系。理解其层次结构是进行高速设备驱动性能调优的基础。本章从物理层到软件栈逐层剖析,并对比高速USB与全速/低速的关键差异。

1.1 USB协议栈的层次结构

USB协议栈自上而下分为四个层次:软件栈、协议层、链路层和物理层。每一层封装下层细节,向上层提供标准化接口。

USB协议栈层次结构 软件栈(Software Stack) USB核心子系统(USB Core) | 主机控制器驱动(HCD) | 设备驱动(Client Driver) 协议层(Protocol Layer) USB描述符 | 请求块(URB) | 管道(Pipe) | 端点(Endpoint) 链路层(Link Layer) 包传输(Packet Transfer) | 事务(Transaction) | 帧/微帧(Frame/Microframe) 物理层(Physical Layer) 电气特性 | 信号编码(NRZI / 8b10b) | 连接器与线缆 数据 流向 ↓ 主机 → 设备 双向

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-线的电平状态识别设备速度:

  1. 低速设备:D-线上拉至3.3V,D+下拉至GND。
  2. 全速设备:D+线上拉至3.3V,D-下拉至GND。
  3. 高速设备:初始表现为全速设备,在复位过程中通过Chirp J/K序列协商切换到高速模式。
  4. 超高速设备:使用独立的差分对(SSTX/SSRX),通过电气握手协商进入SS模式。
高速设备枚举与速度协商流程 设备插入 主机检测D+上拉 发送复位信号 Chirp J 支持HS? 切换到高速模式 保持全速模式 Chirp J/K序列:设备发送Chirp J(持续17ms),主机回复Chirp K序列完成握手

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开销的主要来源。