USB HID Boot Protocol 与 Report Protocol 调试:键盘 BIOS 模式、SetProtocol、Report ID、按键丢失

USB HID Boot Protocol 与 Report Protocol 切换、SetProtocol 请求、键盘 BIOS 模式、Report ID、按键丢失、HID 固件兼容性排查。

HID Boot Protocol, Report Protocol, SetProtocol, USB 键盘, BIOS 模式, Report ID, USB 诊断

USB HID 键盘和鼠标可以用 Boot Protocol 或 Report Protocol。用户搜 "HID Boot Protocol"、"HID Report Protocol"、"USB keyboard BIOS mode"、"SetProtocol HID"、"keyboard works in BIOS but not OS"、"HID report ID missing keys" 的时候,输入在一个环境能用、另一个环境就不行。

Bus Scope 在这个场景下有用,因为主机可以发 HID 类请求来改变设备格式化 Report 的方式。固件如果忽略了 SetProtocol 或者发了错误格式的 Report,按键就可能消失——尽管设备枚举正常。

Boot Protocol

Boot Protocol 是一种简化的 HID 格式,给 BIOS、UEFI、Pre-Boot 环境、简单主机栈用。它让基本键盘和鼠标在完整的 HID 解析器还没就绪的时候就能工作。

涉及 Boot Protocol 的症状:

  • 键盘在 BIOS 能用、在 OS 里不能用
  • 键盘在 OS 能用、在 Boot 菜单不能用
  • Pre-Boot 模式下特殊键消失
  • 鼠标只有在 OS 启动之后才工作
  • 固件在 Boot Report 期望的地方发了 Report ID

要回答的诊断问题是:主机选的是哪个 Protocol?

Report Protocol

Report Protocol 用 HID Report Descriptor。它支持更丰富的布局、Report ID、厂商自定义 Report、多媒体键、传感器、组合行为。

主机切到 Report Protocol 但设备还在发 Boot Report,OS 可能把输入解错。主机请求 Boot Protocol 但设备发 Report Protocol,BIOS 可能直接忽略 Report。

SetProtocol 请求

HID 类请求 SetProtocol 可以在支持的设备上切换 Boot Protocol 和 Report Protocol。

要收集的证据:

  • HID Interface Descriptor
  • Boot Subclass 和 Protocol 取值
  • Report Descriptor
  • SetProtocol 请求
  • 主机选中的 Protocol 取值
  • 切换前后的 Interrupt IN Report 字节

Bus Scope 能让这条序列可见。

Report ID 和按键丢失

Report Protocol 可能用 Report ID。Boot Protocol 通常期望固定大小的 Report、不带 Report ID 前缀。

常见固件 bug:

  • Boot Protocol 里带了 Report ID
  • Report Protocol 里漏了 Report ID
  • 设备改了 Report 大小但描述符没跟上
  • 多媒体键只在另一个 Report 里
  • NKRO Report 在主机启用之前就发了
  • 键盘在键盘端点上发了厂商 Report

这些 bug 制造了 "USB 键盘按键丢失" 和 "HID report ID 错" 这一类搜索词。

BIOS vs 操作系统行为

BIOS 和 UEFI 通常比完整操作系统更严、更简。一把键盘在 Windows 或 Linux 上看着正常,启动之前就跪了。

有用的对比:

  • 能在 Pre-Boot 抓的话用外部分析器抓
  • 抓 OS 启动之后
  • 对比 SetProtocol 行为
  • 对比 Report payload 格式
  • 看设备在不同环境之间有没有 Reset

即使 Pre-Boot 抓包很难,OS 那一侧的 SetProtocol 证据也能暴露固件假设。

排查清单

按这个流程:

  1. 抓枚举
  2. 检查 HID Interface Subclass 和 Protocol
  3. 检查 HID Report Descriptor
  4. 找 SetProtocol 请求
  5. 解码选中的 Protocol
  6. 对比切换前后的 Interrupt IN Report
  7. 检查 Report ID 使用
  8. 测普通键和多媒体键
  9. 对比 BIOS、Bootloader、Windows、Linux 行为
  10. 描述符和 Report 字节一起保留

最终诊断

HID Boot Protocol 和 Report Protocol 的失败是 Report 格式协商问题。设备可能枚举正常,但发的 Report 协议格式不对。

Bus Scope 能证明按键丢失、BIOS 输入失败、HID 兼容性问题到底是 SetProtocol 处理、Report ID、描述符不匹配、还是固件 Report 格式化的问题。