1. USB协议基础回顾:USB 2.0与USB 3.0架构差异、传输类型与描述符层级

各位好,我是老周。做Rockchip平台USB驱动开发这些年,我最大的感触是:很多问题归根结底,都是协议基础没吃透。你想想看,USB协议栈从硬件PHY到软件驱动,层层叠叠,一旦出问题,如果不懂底层协议,连日志都看不懂。

这一章,咱们把USB协议的核心骨架过一遍。不追求大而全,只挑驱动开发中最常用的知识点。我当年刚接触RK平台时,就是靠这些基础一点点啃下来的。

1.1 USB 2.0 vs USB 3.0:架构上的根本差异

先看一张整体对比图,心里有个谱。

USB 2.0 vs USB 3.0 架构对比 USB 2.0 vs USB 3.0 架构差异 USB 2.0 主机 • 单根差分信号线 (D+/D-) • 半双工通信 • 主机轮询 (Polling) 模式 • 速率: 1.5/12/480 Mbps • 无独立电源管理总线 USB 2.0 设备 • 共享 D+/D- 总线 • 被动响应主机查询 • 端点 (Endpoint) 概念 • 最大包长受限于协议 • 无异步通知能力 USB 3.0 主机 • 双差分对 (SSTX+/-, SSRX+/-) • 全双工通信 • 异步通知 + 流控 • 速率: 5/10/20 Gbps • 独立电源管理总线 USB 3.0 设备 • 独立发送/接收通道 • 支持异步事件通知 • 流 (Stream) 能力 • 更大的最大包长 • 支持功能暂停/恢复 注意:USB 3.0 保留了 USB 2.0 的 D+/D- 线,用于兼容和枚举阶段通信

这张图很直观。USB 3.0 不是简单的提速,而是架构上的重构。我最早在RK3288上调试USB 3.0时,发现设备枚举总是超时,查了半天才发现是D+/D-的兼容线没处理好——嗯,这个坑后面会细说。

核心差异速查表

对比项USB 2.0USB 3.0
信号线1对差分 (D+/D-)2对差分 (SSTX, SSRX) + 保留D+/D-
通信模式半双工全双工
传输调度主机轮询异步 + 流控
最大速率480 Mbps (HS)5 Gbps (Gen1) / 10 Gbps (Gen2)
电源管理无独立总线独立电源管理总线
数据包开销较大 (SOF, 帧起始)较小 (TP, 事务包)

1.2 四种传输类型:选对类型,事半功倍

USB协议定义了四种传输类型。说白了,就是给不同场景准备的通信方式。选错了,性能上不去;选对了,事半功倍。

  • 控制传输 (Control Transfer):枚举、配置、命令。双向,保证送达。我习惯叫它「握手型」——每次通信都有Setup、Data、Status三个阶段。在RK平台上,控制传输的端点0是标配,所有设备必须支持。
  • 批量传输 (Bulk Transfer):大块数据,比如U盘读写。保证送达,但不保证延迟。在RK3588上调试NVMe硬盘时,批量传输的吞吐量直接决定了读写性能。
  • 中断传输 (Interrupt Transfer):小数据,低延迟,比如鼠标键盘。主机定期轮询。注意:USB 3.0的中断传输支持异步通知,延迟更低。
  • 同步传输 (Isochronous Transfer):实时数据,比如音频、摄像头。不保证送达,但保证带宽和延迟。我在调试RK3566的UVC摄像头时,同步传输的带宽预留是个大坑。

个人经验:在RK平台上,批量传输的缓冲区大小和DMA对齐非常关键。我曾经遇到一个U盘读写速度只有20MB/s的问题,最后发现是批量传输的URB缓冲区没有做cache对齐——改完之后直接飙到80MB/s。

1.3 描述符层级结构:设备自报家门

USB设备通过描述符向主机「自报家门」。这个层级结构,我建议你背下来——调试时90%的问题都能从描述符里找到线索。

USB 描述符层级结构 USB 描述符层级结构 设备描述符 (Device Descriptor) 配置描述符 (Configuration Descriptor) 接口描述符 (Interface Descriptor) 端点描述符 1 端点描述符 2 端点描述符 N 一个设备可以有多个配置,一个配置可以有多个接口,一个接口可以有多个端点 调试时常用 lsusb -v 或 usb.ids 查看描述符内容

这个层级结构,我建议你把它想象成一棵树:设备是根,配置是主干,接口是分支,端点是叶子。每个层级都有对应的描述符。

避坑指南:我曾经在RK3399上调试一个复合设备,设备描述符里配置了3个接口,但实际只实现了2个。结果主机枚举到第3个接口时直接卡死。后来我养成了一个习惯:拿到设备先用 lsusb -v 把描述符全dump出来,对照协议检查一遍。

1.4 描述符关键字段速查

驱动开发中,你经常需要解析描述符。下面这几个字段,我建议你记在脑子里:

描述符类型关键字段说明
设备描述符bcdUSB, idVendor, idProduct, bNumConfigurations协议版本、厂商ID、产品ID、配置数量
配置描述符bNumInterfaces, bMaxPower, bmAttributes接口数量、最大功耗、属性(自供电/总线供电)
接口描述符bInterfaceClass, bInterfaceSubClass, bInterfaceProtocol类、子类、协议(如HID、Mass Storage)
端点描述符bEndpointAddress, bmAttributes, wMaxPacketSize端点地址、传输类型、最大包长

调试技巧:在RK平台上,你可以通过 /sys/kernel/debug/usb/devices 直接查看描述符解析结果。我经常用这个文件快速定位设备枚举失败的原因——比如端点描述符的wMaxPacketSize配置错误,会导致URB提交失败。

1.5 小结

这一章我们回顾了USB协议的核心基础:USB 2.0与3.0的架构差异、四种传输类型的适用场景、以及描述符的层级结构。这些内容看似基础,但我在RK平台上的每一次调试,几乎都会用到它们。