USB Interface Association Descriptor(IAD)与组合设备调试

修复 USB Interface Association Descriptor(IAD)和组合设备驱动绑定错误。覆盖 Windows usbccgp.sys、Code 10、Code 43、接口描述符、部分枚举失败。

USB 组合设备, 驱动绑定错误, usbccgp, Code 10, Code 43, 接口描述符, USB 诊断

USB 组合设备通过一台物理 USB 设备暴露多个功能。一台设备可能同时提供 HID 控制、CDC 串口、大容量存储、厂商诊断、音频、视频、固件升级接口。驱动绑定一旦出错,用户看到 "USB Composite Device driver error"、"This device cannot start Code 10"、"Code 43"、"interface not working"、"COM port missing"、"one function works but another does not"。

搜 "USB composite device wrong driver"、"Windows usbccgp Code 10"、"USB interface driver not binding"、"IAD descriptor debugging" 一般都需要总线层的证据。光看 Windows 驱动状态看不出描述符是不是把功能描述对了。

Bus Scope 在这个场景下有用,因为组合设备的绑定是描述符驱动的。

组合设备的结构

一台组合设备包含一个 Device Descriptor 和一个或多个 Configuration。在 Configuration 里暴露多个接口。每个接口有 class / subclass / protocol 取值和端点。

例子功能:

  • Interface 0:HID
  • Interface 1:CDC Control
  • Interface 2:CDC Data
  • Interface 3:厂商自定义诊断

Windows 用 USB 通用父驱动(通常是 usbccgp.sys)来枚举子功能并绑合适的驱动。

Interface Association Descriptor

IAD 把多个接口归到一个功能里。CDC ACM 常用一个 Control Interface 加一个 Data Interface。IAD 不对,操作系统可能绑错,或者把它们当成无关接口。

IAD 错的症状:

  • CDC 串口 COM 端口缺失
  • 音频功能只出来一半
  • UVC 摄像头枚举了但视频接口挂
  • 厂商接口抢了别的驱动
  • 只有子功能之一能用

仔细看 Interface 编号和 IAD 区间。

类码和驱动选择

驱动绑定取决于 Device 或 Interface 级的 class / subclass / protocol。Device 级 Class 0x00 表示每个接口自己定义 Class。Device 级 Class 0xEF 经常用来表示"杂项组合设备",搭配 IAD。

固件声明了错误的 Class 码,Windows 就可能选错驱动。

对自定义设备,要有意识:

  • HID 接口要正确描述 HID
  • CDC 接口要符合 CDC 预期
  • 厂商自定义接口要用 Vendor Class
  • WinUSB 接口可能要 Microsoft OS Descriptor

Code 10 和 Code 43

Code 10 和 Code 43 是操作系统症状,不是根因。USB trace 能告诉你:

  • Device Descriptor 有没有被读到
  • Configuration Descriptor 合不合法
  • Interface Descriptor 一致不一致
  • Endpoint Descriptor 和 Interface 预期对不对得上
  • Class-specific Descriptor 畸不畸形
  • 驱动发的类请求 STALL 了没
  • 绑定过程中设备 Reset 了没

如果枚举成功但类请求失败,问题就比基础描述符读更后面。

部分设备失败

组合设备可以部分工作。比如 HID 按键能用,CDC 串口不行。这意味着设备不是简单"死了",而是一条接口路径挂了。

保留:

  • 所有 Interface Descriptor
  • Class-specific Descriptor
  • Interface 编号
  • 驱动类请求
  • 失败接口的端点流量

排查清单

按这个流程:

  1. 从插入开始抓
  2. 检查 Device 级的 class / subclass / protocol
  3. 检查 Configuration 的 wTotalLength 和 Interface 数量
  4. 检查每个 Interface Descriptor
  5. 检查 IAD Descriptor 和接口区间
  6. 检查 Class-specific Descriptor
  7. 识别哪个接口绑不上
  8. 找 STALL 的类请求
  9. 能比的话对比 Windows、Linux 和另一台 Windows 机器
  10. 编辑抓包之前先保留描述符

最终诊断

USB 组合设备的驱动绑定失败通常来自描述符契约:Class 码、Interface 编号、IAD 分组、Class-specific Descriptor、Microsoft OS Descriptor、或驱动启动期间的类请求。

Bus Scope 把这些契约摆出来——"USB Composite Device driver error" 可以被追溯到具体的接口和描述符证据。