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总线上的传输行为差异:

USB四种端点类型传输特性对比 控制端点 双向,可靠,有序 枚举/配置/命令 批量端点 单向,可靠,尽力而为 大块数据传输 中断端点 单向,可靠,轮询 HID/低延迟数据 等时端点 单向,不可靠,实时 音频/视频流 关键区别 • 控制端点:每个设备必须有一个默认端点0,用于枚举和标准请求。 • 中断端点:主机保证在bInterval时间内轮询一次,适合周期性小数据。 • 等时端点:无重传机制,数据可能丢失,但延迟最低。

3.2 描述符层次结构

USB描述符是设备向主机报告自身能力的结构化数据。描述符以层次化方式组织,主机通过标准请求(如GET_DESCRIPTOR)逐层获取。完整的描述符链如下:

  1. 设备描述符(Device Descriptor):描述设备的整体信息,包括USB版本、厂商ID(VID)、产品ID(PID)、设备类、子类、协议等。每个设备只有一个设备描述符。
  2. 配置描述符(Configuration Descriptor):描述设备的供电模式、最大电流、接口数量等。一个设备可以有多个配置,但同一时刻只能激活一个。
  3. 接口描述符(Interface Descriptor):描述一个功能单元,包括接口编号、备用设置、端点数量、接口类/子类/协议。一个配置可以包含多个接口。
  4. 端点描述符(Endpoint Descriptor):描述端点的地址、方向、类型、最大包大小、轮询间隔。每个接口可以有多个端点(端点0除外)。
Gadget驱动视角: 在Linux Gadget框架中,描述符通过结构体数组定义。例如,一个简单的HID Gadget需要定义设备描述符、配置描述符、接口描述符、HID描述符和中断端点描述符。描述符的顺序和内容必须严格符合USB规范,否则主机无法正确识别设备。

下图展示了描述符的层次化结构以及主机获取描述符的流程:

USB描述符层次结构 设备描述符 (Device Descriptor) bLength=18, bcdUSB, idVendor, idProduct, ... 配置描述符 (Configuration Descriptor) bLength=9, wTotalLength, bNumInterfaces, ... 接口描述符 (Interface Descriptor) bLength=9, bInterfaceNumber, bAlternateSetting, ... 端点描述符 (Endpoint Descriptor) bLength=7, bEndpointAddress, bmAttributes, wMaxPacketSize, ... 获取流程 1. 主机发送GET_DESCRIPTOR(设备) 2. 设备返回设备描述符 3. 主机发送GET_DESCRIPTOR(配置) 4. 设备返回完整配置树 5. 主机解析接口和端点 6. 主机选择配置 7. 设备进入配置状态 注意: 配置描述符返回时包含 所有接口和端点描述符 (一次传输完成)。

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的物理层与协议栈差异:

USB 2.0 vs USB 3.0 协议栈对比 USB 2.0 (High Speed) 应用层 (Class Driver) USB协议层 (Token/Data/Handshake) 链路层 (NRZI编码, SOF) 物理层 (D+/D- 半双工) USB 3.0 (SuperSpeed) 应用层 (Class Driver) 协议层 (Header/Data Packet) 链路层 (8b/10b编码, LPM) 物理层 (SSTX+/SSRX+ 全双工) 相同 不同 不同 不同

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间隔)以获得良好的响应速度。

下图展示了中断传输的时序流程:

中断传输时序(主机轮询设备) 主机 设备 1. 发送IN令牌包 IN令牌 2. 返回数据包 数据包 3. 发送ACK握手 ACK 注意:如果设备没有数据,则返回NAK握手包,主机将在下一个bInterval后再次轮询。

3.5 本章小结

本章回顾了USB协议的核心基础:

  • 四种端点类型:控制、批量、中断、等时,各自适用于不同的应用场景。
  • 描述符层次结构:设备→配置→接口→端点,是Gadget驱动必须正确构建的数据结构。
  • USB 2.0 vs USB 3.0:速率、编码、双工模式、电源管理、描述符格式均有显著差异,驱动需要分别处理。
  • 中断端点机制:主机轮询、固定间隔、NAK/ACK握手,是Gadget驱动实现低延迟通信的基础。