USB HIDフィーチャーレポートのデバッグ:GET_REPORT、SET_REPORT、ベンダーコマンド、デバイス設定の欠落
HIDフィーチャーレポートの失敗、GET_REPORT、SET_REPORT、Report ID、コントロール転送、ベンダー設定、デバイスコンフィギュレーション、USB HIDファームウェアバグのトラブルシューティング方法を解説します。
HIDデバイスはキーボードやマウスだけではありません。セキュリティキー、センサ、操作パネル、ベンダーツール、産業機器、ゲームコントローラ、UPSデバイス、独自コンフィギュレーションインターフェースなど、多種多様です。こうしたデバイスの多くはコンフィギュレーションとステータスにHIDフィーチャーレポートを使います。フィーチャーレポートが失敗すると、「HID Feature Report not working」「GET_REPORT failed」「SET_REPORT failed」「HID report ID mismatch」「USB HID vendor command timeout」で検索されることになります。通常の入力は動くのにコンフィギュレーションだけが動かない、というケースです。
Bus Scopeが効くのは、フィーチャーレポートがエンドポイントゼロを「コントロール転送」として流れることが多いからです。実際のSetupパケット、レポート種別、Report ID、長さ、応答ステータスがすべて鍵になります。
フィーチャーレポートとは
HIDにはいくつかのレポート種別があります。
- Inputレポート
- Outputレポート
- Featureレポート
InputレポートはInterrupt INエンドポイントで来ることが多いです。Featureレポートはコントロール転送で GET_REPORT や SET_REPORT を使って要求されるのが一般的です。
「ボタンは動くが設定パネルが失敗する」場合、フィーチャーレポート処理が疑わしい。
Report IDと長さの不一致
多くのHIDデバイスはReport IDを使います。ホストがReport ID 3を含めて送っているのに、ファームウェアがReport ID 0を期待していると、リクエストが失敗したり誤データを返したりします。
よくあるバグ:
- ファームウェアがReport IDバイトを省いてしまう
- ホストが誤ったレポート長を送る
- ディスクリプタが長さAと宣言しているのにファームウェアが長さBを返す
- フィーチャーレポートはファームウェア上存在するがディスクリプタにない
- ディスクリプタがファームウェアに存在しないレポートを宣言している
HIDレポートディスクリプタとコントロール転送を突き合わせる必要があります。
GET_REPORTとSET_REPORTの証拠
確認ポイント:
- Setupパケットのリクエスト種別
- HID
GET_REPORTまたはSET_REPORT - レポート種別 Feature
- Report ID
wLength- データステージのバイト
- STALL/タイムアウト
ディスクリプタが掲示しているフィーチャーレポートをデバイスがストールするなら、ファームウェアかディスクリプタの一貫性が疑わしい。
HID経由のベンダーコンフィギュレーション
多くの製品が「独自カーネルドライバを避けたい」理由でHIDを採用しています。ベンダー設定はフィーチャーレポートとして実装されることがあります。
例:
- サンプリングレートの変更
- ファームウェアバージョンの読み取り
- LEDモードの設定
- センサレンジのコンフィギュレーション
- ブートローダーの有効化
- キャリブレーションデータの読み取り
こうしたコマンドが失敗しても、デバイスはHIDデバイスとして正常に見えることがあります。
デバッグチェックリスト
次の流れで作業すると、原因に早くたどり着けます。
- 列挙とHIDディスクリプタをキャプチャする
- HIDレポートディスクリプタを保全する
- フィーチャーレポート定義を特定する
- 失敗する GET_REPORT/SET_REPORT をキャプチャする
- Report IDを確認する
- 要求長を確認する
- ディスクリプタの宣言長と転送長を比較する
- STALL/タイムアウト/短縮応答を探す
- 動くInputレポートと失敗するFeatureレポートを比較する
- ディスクリプタとコントロール転送を一緒に保全する
最終的な診断
HIDフィーチャーレポートの失敗は、多くの場合「ディスクリプタ/Report ID/長さ/ファームウェア状態/コントロール転送処理」の問題です。入力は動くのにコンフィギュレーションだけが落ちます。
Bus Scopeは、HIDレポートの契約と失敗した正確なコントロール転送をそのまま可視化するので、「謎のベンダーツールエラー」ではなく診断可能な問題にしてくれます。