USB HID Boot Protocol 与 Report Protocol 调试:键盘 BIOS 模式、SetProtocol、Report ID、按键丢失
USB HID Boot Protocol 与 Report Protocol 切换、SetProtocol 请求、键盘 BIOS 模式、Report ID、按键丢失、HID 固件兼容性排查。
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 证据也能暴露固件假设。
排查清单
按这个流程:
- 抓枚举
- 检查 HID Interface Subclass 和 Protocol
- 检查 HID Report Descriptor
- 找 SetProtocol 请求
- 解码选中的 Protocol
- 对比切换前后的 Interrupt IN Report
- 检查 Report ID 使用
- 测普通键和多媒体键
- 对比 BIOS、Bootloader、Windows、Linux 行为
- 描述符和 Report 字节一起保留
最终诊断
HID Boot Protocol 和 Report Protocol 的失败是 Report 格式协商问题。设备可能枚举正常,但发的 Report 协议格式不对。
Bus Scope 能证明按键丢失、BIOS 输入失败、HID 兼容性问题到底是 SetProtocol 处理、Report ID、描述符不匹配、还是固件 Report 格式化的问题。
<!-- bus-scope-localized-transaction-foundation-v1:start -->“USB HID Boot Protocol 与 Report Protocol 调试:键盘 BIOS 模式、SetProtocol、Report ID、按键丢失”的 USB 事务合同检查
直接答案是:STALL、timeout 或 reset 本身不能解释根因。先证明抓取 provider 确实观察到目标 device,再读取 transfer 合同:类型、方向、recipient、wValue、wIndex、声明长度、实际长度、status,以及事务前后的设备状态。把结论关联到与 known-good 首次不同的 transaction,而不是应用最后显示的错误。
| 检查边界 | 比较内容 | 有效判断 |
|---|---|---|
| 平台 | provider、权限、Root Hub 或 usbmon/XHC20 | records 是否来自正确连接 |
| Setup | bmRequestType、bRequest、wValue、wIndex、wLength | host 是否发送预期请求 |
| Data | 方向、长度、已保留 bytes | payload 是否符合合同 |
| Status | ACK、STALL、timeout、cancellation | transaction 在哪里结束 |
| State | configuration、interface、alternate setting、halt | device 是否已准备好 |
从 reset 与 enumeration 前开始抓取,保留 descriptors、SET_CONFIGURATION、SET_INTERFACE 和失败前的 command。狭窄 endpoint filter 可能隐藏决定性的 control transfer。每次实验只执行一个已记录 USB 动作,只改变 firmware、driver、port、cable、host command 或 timing 中的一项。
怎样写可引用的回答
写明实际 request、setup fields、设备响应和前序状态,再给出只改一个变量的下一实验。因 retention 没有保存的 bytes 不能写成 packet loss。command 与 reset 时间接近只证明相关,必须结合状态转移或重复实验才可讨论原因。
保持 VID/PID、firmware、speed、topology、provider、filter、trigger 一致。比较 USB 语义阶段,不要直接比较 usbmon 与 USBPcap 的 frame number。记录开始、结束、版本、OS、连接位置和 checksum,并用 Bus Scope 故障排除复核。
Semrush owner 必须分开:free USB analyzer 属于产品页,best USB protocol analyzer 属于比较页,USB descriptor viewer 属于descriptor 指南。技术支持页不编造搜索量或 KD。
<!-- bus-scope-localized-transaction-foundation-v1:end --><!-- multilingual-blog-closeout:start -->直接答案与验收边界
关于“USB HID Boot Protocol 与 Report Protocol 调试:键盘 BIOS 模式、SetProtocol、Report ID、按键丢失”的简短答案是:USB HID Boot Protocol 与 Report Protocol 切换、SetProtocol 请求、键盘 BIOS 模式、Report ID、按键丢失、HID 固件兼容性排查。 这句话应当被视为需要验证的结果,而不是对所有输入、设备、项目或环境的承诺。完整结果会记录初始状态、准确操作、可见输出,以及能够证明任务已在 Bus Scope 中完成的条件。
证据优先的操作程序
修改完整项目之前,先从小型、可重复的案例开始。记录应用版本、操作系统、输入或设备身份、相关设置和预期结果。只执行一个明确动作,保留第一处意外变化,并在条件允许时与已知正常案例比较。同时修改多个控件会掩盖究竟哪个条件制造或修复了问题。
检查点 1:USB HID Boot Protocol 与 Report Protocol 调试:键盘 BIOS 模式、SetProtocol、Report ID、按键丢失
把“USB HID Boot Protocol 与 Report Protocol 调试:键盘 BIOS 模式、SetProtocol、Report ID、按键丢失”写成另一位操作者可以重复的通过或失败陈述。包括必须存在的内容、必须不存在的内容,以及失败时安全的恢复动作。在修复副本通过同一检查前,不要改变原始项目或抓取。
检查点 2:USB HID Boot Protocol 与 Report Protocol 切换、SetProtocol 请求、键盘 BIOS 模式、Report ID、按键丢失、HID 固件
把“USB HID Boot Protocol 与 Report Protocol 切换、SetProtocol 请求、键盘 BIOS 模式、Report ID、按键丢失、HID 固件兼容性排查。”作为“USB HID Boot Protocol 与 Report Protocol 调试:键盘 BIOS 模式、SetProtocol、Report ID、按键丢失”的独立验收关口。记录操作前状态、第一处可见变化和最终状态。如果结果与页面描述的目标不同,就回到最后一个已经确认的检查点,不要依靠假设继续。
检查点 3:Boot Protocol
把“Boot Protocol”写成另一位操作者可以重复的通过或失败陈述。包括必须存在的内容、必须不存在的内容,以及失败时安全的恢复动作。在修复副本通过同一检查前,不要改变原始项目或抓取。
检查点 4:Report Protocol
把“Report Protocol”作为“USB HID Boot Protocol 与 Report Protocol 调试:键盘 BIOS 模式、SetProtocol、Report ID、按键丢失”的独立验收关口。记录操作前状态、第一处可见变化和最终状态。如果结果与页面描述的目标不同,就回到最后一个已经确认的检查点,不要依靠假设继续。
检查点 5:SetProtocol 请求
把“SetProtocol 请求”写成另一位操作者可以重复的通过或失败陈述。包括必须存在的内容、必须不存在的内容,以及失败时安全的恢复动作。在修复副本通过同一检查前,不要改变原始项目或抓取。
检查点 6:Report ID 和按键丢失
把“Report ID 和按键丢失”作为“USB HID Boot Protocol 与 Report Protocol 调试:键盘 BIOS 模式、SetProtocol、Report ID、按键丢失”的独立验收关口。记录操作前状态、第一处可见变化和最终状态。如果结果与页面描述的目标不同,就回到最后一个已经确认的检查点,不要依靠假设继续。
检查点 7:BIOS vs 操作系统行为
把“BIOS vs 操作系统行为”写成另一位操作者可以重复的通过或失败陈述。包括必须存在的内容、必须不存在的内容,以及失败时安全的恢复动作。在修复副本通过同一检查前,不要改变原始项目或抓取。
检查点 8:排查清单
把“排查清单”作为“USB HID Boot Protocol 与 Report Protocol 调试:键盘 BIOS 模式、SetProtocol、Report ID、按键丢失”的独立验收关口。记录操作前状态、第一处可见变化和最终状态。如果结果与页面描述的目标不同,就回到最后一个已经确认的检查点,不要依靠假设继续。
检查点 9:最终诊断
把“最终诊断”写成另一位操作者可以重复的通过或失败陈述。包括必须存在的内容、必须不存在的内容,以及失败时安全的恢复动作。在修复副本通过同一检查前,不要改变原始项目或抓取。
检查点 10:“USB HID Boot Protocol 与 Report Protocol 调试:键盘 BIOS 模式、SetProtocol、Report ID、按键丢失”的 USB 事务
把““USB HID Boot Protocol 与 Report Protocol 调试:键盘 BIOS 模式、SetProtocol、Report ID、按键丢失”的 USB 事务合同检查”作为“USB HID Boot Protocol 与 Report Protocol 调试:键盘 BIOS 模式、SetProtocol、Report ID、按键丢失”的独立验收关口。记录操作前状态、第一处可见变化和最终状态。如果结果与页面描述的目标不同,就回到最后一个已经确认的检查点,不要依靠假设继续。
验收矩阵
| 检查点 | 需要保留的证据 | 通过条件 |
|---|---|---|
| USB HID Boot Protocol 与 Report Protocol 调试:键盘 BIOS 模式、SetProtocol、Report ID、按键丢失 | 初始状态、一个动作和结果状态 | 另一位操作者可以重复所述结果 |
| USB HID Boot Protocol 与 Report Protocol 切换、SetProtocol 请求、键盘 BIOS 模式、Report ID、按键丢失、HID 固件兼容性排查。 | 初始状态、一个动作和结果状态 | 另一位操作者可以重复所述结果 |
| Boot Protocol | 初始状态、一个动作和结果状态 | 另一位操作者可以重复所述结果 |
| Report Protocol | 初始状态、一个动作和结果状态 | 另一位操作者可以重复所述结果 |
| SetProtocol 请求 | 初始状态、一个动作和结果状态 | 另一位操作者可以重复所述结果 |
| Report ID 和按键丢失 | 初始状态、一个动作和结果状态 | 另一位操作者可以重复所述结果 |
失败隔离、恢复与交接
在第一个失败边界停止。保留源文件、项目、会话或抓取;破坏性编辑前先制作副本;每次实验只改变一个变量。多项修改后重跑完整流程,即使结果不同,也无法解释为什么。
要区分没有证据与证明不存在。空白界面可能来自错误输入、范围、过滤器、权限、设备、时间区间或项目状态。解释 decoder、编辑器、报告或导出之前,先证明采集或导入路径。
交接之前重新打开持久成果,检查开头、判断点和结尾。记录版本、平台、配置、预期行为、观察结果和最小复现步骤。删除或遮蔽敏感内容,并确认接收人有权接收。
问答
最快且可靠的开始方式是什么?
使用最小但有代表性的案例,写下预期结果,并且只改变一个变量。添加过滤器、效果、编辑、自动化或更大输入之前,先确认基础路径。
应该保存哪些证据?
保留输入身份、版本、平台、相关设置、准确动作、第一处意外变化和最终输出。项目、会话、报告或导出都应关闭并重新打开后再视为持久证据。
什么时候需要重复这套程序?
当应用、操作系统、driver、firmware、模型、源文件或工作流变化可能影响结果时。保留之前已经通过的案例,作为未修改的比较基线。
什么时候可以交接?
当另一位有权限的人能够识别输入、重复动作、看到相同结果、理解剩余限制,并且无需未记录的本地状态就能打开成果时。
相关指南
下面的同语言页面覆盖相邻阶段,同时不会改变本主题的规范所有页。
<!-- multilingual-blog-closeout:end -->