USB HID Boot Protocol vs 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クラスリクエストを送るからです。ファームウェアが SetProtocol を無視したり、誤ったレポート形式を送ったりすると、デバイスは正常に列挙されてもキーが消えます。
Boot Protocolとは
Boot Protocolは、BIOS/UEFI/プレブート環境/シンプルなホストスタックで使われる、簡略化されたHID形式です。完全なHIDパーサが利用可能になる前に、基本的なキーボードとマウスを動作させるための仕組みです。
Boot Protocolが関わる症状:
- BIOSではキーボードが動くがOSでは失敗
- OSでは動くがブートメニューで動かない
- プレブートモードで特殊キーが消える
- OSロード後にしかマウスが動かない
- Bootレポートが期待していない場面でファームウェアがReport IDを送る
診断の問いは「ホストがどのプロトコルを選んだか」です。
Report Protocolとは
Report ProtocolはHIDレポートディスクリプタを使用します。より豊富なレイアウト、Report ID、ベンダー定義レポート、メディアキー、センサ、複合挙動をサポートします。
ホストがReport Protocolに切り替えたのにデバイスがBootレポートを送り続けると、OSが入力を誤パースします。ホストがBoot Protocolを要求しているのにデバイスがReport Protocolを送ると、BIOSはレポートを無視します。
SetProtocolリクエスト
HIDクラスリクエスト SetProtocol は、サポート対象デバイスについてBoot ProtocolとReport Protocolを切り替えます。
収集すべき証拠:
- HIDインターフェースディスクリプタ
- Bootサブクラスとプロトコルの値
- レポートディスクリプタ
SetProtocolリクエスト- ホストが選択したプロトコル値
- スイッチ前後のInterrupt INレポートバイト
Bus Scopeはこのシーケンスを可視化できます。
Report IDとキーの欠落
Report ProtocolはReport IDを使うことがあります。Boot ProtocolはReport IDプレフィックスなしの固定長レポートを期待するのが一般的です。
よくあるファームウェアバグ:
- Boot ProtocolでReport IDを含めてしまう
- Report ProtocolでReport IDを省いてしまう
- レポートサイズを変えるがディスクリプタが追従しない
- メディアキーがセカンダリレポートにしかない
- NKROレポートをホストが有効化する前に送る
- キーボードエンドポイントにベンダーレポートを送る
これらは「USB keyboard missing keys」「HID report ID wrong」といった検索を生みます。
BIOS vs OSの挙動
BIOS/UEFI環境は通常、完全なOSより厳密かつシンプルです。WindowsやLinuxでは問題なく見えても、ブート前に失敗することがあります。
有用な比較:
- 可能なら外部アナライザでプレブート中もキャプチャ
- OSロード後にキャプチャ
- SetProtocolの挙動を比較
- レポートペイロード形式を比較
- 環境間でデバイスがリセットするかを確認
プレブート時のキャプチャが難しくても、OS側のSetProtocol証拠からファームウェアの前提を明らかにできます。
デバッグチェックリスト
次の流れで作業すると、原因に早くたどり着けます。
- 列挙をキャプチャする
- HIDインターフェースのサブクラスとプロトコルを確認する
- HIDレポートディスクリプタを確認する
SetProtocolリクエストを探す- 選択されたプロトコルをデコードする
- 前後のInterrupt INレポートを比較する
- Report IDの使用状況を確認する
- 通常キーとメディアキーを試す
- BIOS/ブートローダ/Windows/Linuxの挙動を比較する
- ディスクリプタとレポートバイトを一緒に保全する
最終的な診断
HID Boot ProtocolとReport Protocolの失敗は、「レポート形式ネゴシエーション」の問題です。デバイスは列挙できても、誤ったプロトコル形式でレポートを送っているかもしれません。
Bus Scopeは、キー欠落・BIOS入力失敗・HID互換性問題が「SetProtocol処理」「Report ID」「ディスクリプタ不一致」「ファームウェアのレポート整形」のどれから来ているかを証明する手助けをします。