USB BOS 与 Microsoft OS 描述符调试:WebUSB、WinUSB、WCID、Windows 驱动绑定
USB BOS 描述符、Microsoft OS 描述符、WCID、WinUSB 自动驱动绑定、WebUSB Landing Page、描述符 STALL、Windows 枚举行为的排查。
现代 USB 设备经常依赖基础 Device Descriptor 和 Configuration Descriptor 之外的描述符。BOS Descriptor、Microsoft OS Descriptor、WCID Descriptor、WebUSB Platform Capability、WinUSB 兼容 ID 都能控制 Windows 怎么绑驱动,以及浏览器或工具怎么发现设备能力。这些描述符一旦不对,用户看到 "WinUSB driver not binding"、"WebUSB device not found"、"USB BOS descriptor failed"、"Microsoft OS descriptor invalid"、"device works on Linux but not Windows"。
Bus Scope 在这个场景下有用,因为描述符驱动的问题发生在枚举期间。如果不抓描述符请求,你可能只看到设备管理器或应用里那个最终的症状。
BOS Descriptor 是什么
BOS 是 Binary Object Store。它让 USB 设备声明平台能力和额外的设备级信息。现代化设备里,BOS 可能包含:
- USB 2.0 extension
- SuperSpeed capability
- WebUSB platform capability
- Microsoft OS 2.0 platform capability
如果 BOS Descriptor 畸形,Windows 或浏览器工具可能忽略特性或校验失败。
Microsoft OS Descriptor 和 WinUSB
Microsoft OS Descriptor 能帮助 Windows 在某些情况下自动绑 WinUSB,不用自定义 INF。实际设备里既能看到老式 WCID 风格的描述符,也能看到较新的 Microsoft OS 2.0 描述符。
重要的证据包括:
- 老式流程里对 String Descriptor Index
0xEE的请求 - 请求 OS Descriptor 时用的 vendor code
- 类似
WINUSB的 Compatible ID - Extended Properties
- Interface 编号关联
- 设备对不支持的描述符请求是不是正确 STALL
固件返回畸形数据,Windows 可能就不绑 WinUSB,即便设备能枚举。
WebUSB
WebUSB 用 BOS Platform Capability Descriptor 来声明 Landing Page 和浏览器可访问的能力。如果 BOS 条目不对,浏览器可能不会按预期暴露设备。
症状:
- 浏览器找不到设备
- 设备在 OS 里能看到,WebUSB chooser 里没有
- Landing Page URL 缺失或错了
- 设备用原生工具能用,用 Web 工具不行
总线 trace 能展示主机有没有请求 BOS、设备回了什么。
合法 STALL 行为
对一些可选的 Microsoft 描述符机制,不支持该特性的设备应该 STALL 这个请求。STALL 不一定是 Bug,Bug 的是回了非法描述符数据,或者声称支持但后续请求失败。
这就是 Control Transfer 上下文很重要的原因。
组合设备的复杂度
Microsoft OS Descriptor 通常针对特定接口。组合设备如果描述符指错了接口号,或者 Windows 只绑了设备的一部分,就会挂。
要查的:
- Interface 编号
- Interface Association Descriptor
- Compatible ID 段
- Function Subset Header
- WinUSB 是只针对一个接口还是所有接口
排查清单
按这个流程:
- 从插入开始抓
- 保留 Device、Configuration、Interface、Endpoint、BOS 描述符
- 找 Microsoft OS Descriptor 请求
- 解码 vendor code 和描述符长度
- 检查描述符数据里的 Interface 编号
- 校验 Compatible ID 取值,例如
WINUSB - 看不支持的请求有没有正确 STALL
- 对比 Windows 和 Linux 枚举行为
- 检查枚举之后设备管理器的绑定
- 保留描述符字节供固件调试
最终诊断
USB BOS 和 Microsoft OS Descriptor 的失败是描述符契约问题。设备可以枚举,但 WinUSB、WebUSB 或接口特定的驱动绑定还是可能挂——因为可选描述符畸形、缺失、或映射错了接口。
Bus Scope 把枚举和描述符请求直接摊开来——驱动绑定失败可以从 USB 证据出发调试,而不是只依赖 OS 的症状。