3. USB协议基础回顾:端点类型、描述符层次结构与USB 2.0/3.0差异
在深入USB Gadget驱动开发之前,必须牢固掌握USB协议的核心概念。本章将系统回顾USB的四种端点类型、描述符的层次化结构,以及USB 2.0与USB 3.0的关键差异。这些知识是理解Gadget驱动如何配置硬件、如何与主机通信的基础。
3.1 USB端点类型与传输特性
端点是USB通信的基本单元,每个端点有唯一的地址和传输方向。USB协议定义了四种端点类型,每种类型对应不同的传输需求:
| 端点类型 | 传输模式 | 特点 | 典型应用 | 最大包大小(USB 2.0 HS) |
|---|---|---|---|---|
| 控制端点 | 双向(默认端点0) | 可靠、有序、用于枚举和配置 | 设备描述符请求、设置配置 | 64字节 |
| 批量端点 | 单向(IN/OUT) | 可靠、带宽尽力而为、无实时保证 | U盘、打印机、网络适配器 | 512字节 |
| 中断端点 | 单向(IN/OUT) | 可靠、有轮询间隔、低延迟 | 键盘、鼠标、HID设备 | 64字节(FS/HS) |
| 等时端点 | 单向(IN/OUT) | 不可靠(无重传)、固定带宽、实时 | 音频流、视频流、摄像头 | 1023字节 |
Gadget开发提示: 中断端点是本课程的核心关注点。在Gadget驱动中,中断端点常用于模拟HID设备(如自定义键盘、游戏手柄)或低延迟传感器数据上报。其轮询间隔(bInterval)在高速模式下以125µs为单位,在低速/全速模式下以1ms为单位。
下图展示了四种端点类型在USB总线上的传输行为差异:
3.2 描述符层次结构
USB描述符是设备向主机报告自身能力的结构化数据。描述符以层次化方式组织,主机通过标准请求(如GET_DESCRIPTOR)逐层获取。完整的描述符链如下:
- 设备描述符(Device Descriptor):描述设备的整体信息,包括USB版本、厂商ID(VID)、产品ID(PID)、设备类、子类、协议等。每个设备只有一个设备描述符。
- 配置描述符(Configuration Descriptor):描述设备的供电模式、最大电流、接口数量等。一个设备可以有多个配置,但同一时刻只能激活一个。
- 接口描述符(Interface Descriptor):描述一个功能单元,包括接口编号、备用设置、端点数量、接口类/子类/协议。一个配置可以包含多个接口。
- 端点描述符(Endpoint Descriptor):描述端点的地址、方向、类型、最大包大小、轮询间隔。每个接口可以有多个端点(端点0除外)。
Gadget驱动视角: 在Linux Gadget框架中,描述符通过结构体数组定义。例如,一个简单的HID Gadget需要定义设备描述符、配置描述符、接口描述符、HID描述符和中断端点描述符。描述符的顺序和内容必须严格符合USB规范,否则主机无法正确识别设备。
下图展示了描述符的层次化结构以及主机获取描述符的流程:
3.3 USB 2.0与USB 3.0关键差异
USB 3.0(SuperSpeed)在物理层、协议层和电气特性上对USB 2.0进行了重大升级。对于Gadget驱动开发者,理解这些差异至关重要,因为驱动需要根据硬件能力选择正确的描述符和传输模式。
| 特性 | USB 2.0 (High Speed) | USB 3.0 (SuperSpeed) |
|---|---|---|
| 信号速率 | 480 Mbps | 5 Gbps |
| 编码方式 | NRZI + 位填充 | 8b/10b 编码 |
| 数据传输 | 半双工(共享总线) | 全双工(独立TX/RX通道) |
| 电源管理 | 设备轮询式 | 异步通知(LPM, U1/U2/U3) |
| 端点类型 | 控制、批量、中断、等时 | 增加流(Stream)能力(批量端点) |
| 包开销 | 较大(SOF, 令牌包等) | 较小(Header Packet + Data Packet) |
| 线缆/连接器 | 4线(VBUS, D+, D-, GND) | 9线(增加SSTX+, SSTX-, SSRX+, SSRX-) |
| 描述符变化 | 标准描述符 | 增加SuperSpeed端点伴侣描述符(bcdUSB=0x0300) |
Gadget开发注意事项: 当开发同时支持USB 2.0和USB 3.0的Gadget时,必须提供两套描述符:一套用于USB 2.0(bcdUSB=0x0200),一套用于USB 3.0(bcdUSB=0x0300)。Linux Gadget框架通过usb_gadget->speed字段判断当前连接速度,驱动需要根据速度选择正确的描述符集合。此外,USB 3.0的端点最大包大小更大(批量端点可达1024字节),中断端点的轮询间隔单位也变为125µs的倍数。
下图对比了USB 2.0和USB 3.0的物理层与协议栈差异:
3.4 中断端点通信机制详解
中断端点是本课程后续章节的核心。与直觉相反,USB中断传输并非由设备主动发起,而是由主机在固定时间间隔内轮询设备。设备只能在收到主机IN令牌包后,才能向主机发送数据。
中断传输的关键参数:
- bInterval:轮询间隔。对于全速设备,单位为1ms;对于高速设备,单位为125µs(即1ms的1/8)。例如,bInterval=4表示每4×125µs=500µs轮询一次。
- wMaxPacketSize:每个微帧中传输的最大字节数。高速中断端点最大为64字节(USB 2.0)或1024字节(USB 3.0)。
- 方向:中断端点可以是IN(设备到主机)或OUT(主机到设备)。Gadget驱动通常使用IN端点上报数据。
调试技巧: 在Gadget驱动中,中断端点的轮询间隔通过端点描述符的bInterval字段设置。如果设置过小(如bInterval=1),主机将频繁轮询,增加CPU负载;如果设置过大,数据延迟会增加。对于HID设备,通常设置bInterval=8(即1ms间隔)以获得良好的响应速度。
下图展示了中断传输的时序流程:
3.5 本章小结
本章回顾了USB协议的核心基础:
- 四种端点类型:控制、批量、中断、等时,各自适用于不同的应用场景。
- 描述符层次结构:设备→配置→接口→端点,是Gadget驱动必须正确构建的数据结构。
- USB 2.0 vs USB 3.0:速率、编码、双工模式、电源管理、描述符格式均有显著差异,驱动需要分别处理。
- 中断端点机制:主机轮询、固定间隔、NAK/ACK握手,是Gadget驱动实现低延迟通信的基础。