USB HID入力遅延とレポート欠落のデバッグ:キーボード、ゲームパッド、スキャナ、独自HIDデバイス
USB HID入力遅延、レポート欠落、キー連打、ゲームパッド遅延、バーコードスキャナの取りこぼし、インタラプトエンドポイントのタイミング、ポーリング間隔、レポートディスクリプタ問題を診断する方法を解説します。
USB HIDの不具合は、ユーザーの言葉で語られることが多いです。キーボード遅延、キー抜け、連打、バーコードスキャナの取りこぼし、ゲームパッド遅延、フットペダルが反応しない、独自HIDデバイスはレポートを送っているのにアプリに届かない。検索ワードは USB HID input lag、missed HID reports、HID interrupt endpoint delay、keyboard repeated keys USB、gamepad latency USB capture のように並びますが、エンジニアリング上の必要事は同じです。「アプリイベントではなく、HIDレポートフローを観察すること」。
HIDデバイスは通常インタラプトエンドポイントを使います。デスクトップ的な意味でのハードウェア割り込みではなく、ホストが一定間隔でエンドポイントをポーリングする仕組みです。レポートが壊れている、遅い、頻度が高すぎる、サイズが大きすぎる、正しく記述されていない——そうした状態だと、アプリは遅延や欠落を目にすることになります。
Bus Scopeが効くのは、HID診断には「ディスクリプタ/エンドポイント/ポーリング/レポート」をまとめて見る必要があるからです。
HIDレポートディスクリプタが重要
HIDレポートディスクリプタは、レポートが何を意味するかを定義します。Usage、Report Size、Report Count、論理範囲、Report ID、Input/Output/Featureの各レポートを記述します。
ディスクリプタがデバイスの実バイトと噛み合わないと、症状は奇妙なものになります。
- アプリが入力を受け取れない
- 一部のボタンは効くが他は無反応
- 軸が飛んだり飽和したりする
- キーボードのキーが連打される
- Report IDが期待されているのに送られていない
- レポート長がディスクリプタと異なる
- ホストがレポートを拒否または無視
デバイスはバイトを送っているのに、ホストが誤って解釈しているケースです。
インタラプトエンドポイントのポーリング間隔
HID Interrupt INエンドポイントにはポーリング間隔があります。Low-Speed/Full-Speed/High-Speedで振る舞いが異なります。ポーリング間隔が遅すぎると、デバイス構成の時点で入力遅延が確定的に組み込まれます。
ゲームパッドやリアルタイム制御デバイスではレポート間隔が重要。バーコードスキャナなら散発的レポートでも問題ないものの、レポートフレーミングは信頼性必須です。
エンドポイントディスクリプタで確認すべき項目:
- エンドポイントアドレス
- インタラプト転送タイプ
- 最大パケットサイズ
- ポーリング間隔
- デバイス速度
アプリUIだけから遅延を推測しないでください。
レポート欠落とアプリイベント欠落は別物
レポートはいくつかのレイヤーで「欠落」し得ます。
- デバイスファームウェアが送らなかった
- USB転送が失敗した
- ホストのポーリングが遅すぎた
- レポートは送られたが壊れていた
- ドライバが解釈を誤った
- アプリがフィルタで落とした
- フォーカスやOSの入力ルーティングがイベントを落とした
バスレベルの証拠は最初の4つに答えます。バス上にレポートが正常にいるなら、ドライバ/アプリ側に話を進める。バス上にレポートがないなら、ファームウェア・エンドポイントタイミング・電源状態を疑ってください。
キー連打とスティッキーなボタン
「キー押し下げ」レポートが送られたまま「キー離す」レポートが来ない/壊れていると、連打になります。ゲームパッドのボタンが押しっぱなしに見えるのも同じ理由です。
イベント周辺のキャプチャ例:
Report: key A down
Report: no keys down
離すレポートが出てこなければ、デバイスまたはUSBパスが疑わしい。バス上で離すレポートが出ているのにアプリがまだ押しっぱなしと判断するなら、ドライバ/アプリのマッピングを確認。
バーコードスキャナの取りこぼし
多くのバーコードスキャナはキーボードをエミュレートします。スキャン時にはHIDレポートの高速シーケンスが発生します。アプリ側が速さに追いつけないなら、問題はUSBではないかもしれません。ただし、トレースに「欠落したキーレポート」「誤ったReport ID」「エンドポイントエラー」が出ているなら、スキャナまたはハブ経路が疑わしい。
有用な証拠:
- スキャン全体のレポートシーケンス
- レポート間隔
- 離すレポートの欠落
- エンドポイントエラー
- スキャン中のデバイス再接続やサスペンド
デバッグチェックリスト
次の流れで作業すると、原因に早くたどり着けます。
- 接続時から列挙をキャプチャする
- HIDレポートディスクリプタを保全する
- Interrupt INエンドポイントとポーリング間隔を特定する
- 既知の入力シーケンスをキャプチャする
- 実際のレポート長をディスクリプタと比較する
- Report IDを確認する
- 押し下げ/離すのペア抜けを探す
- エンドポイントエラーが発生していないか確認する
- ポート直結とハブ経由を比較する
- バスの証拠をアプリログと突き合わせる
最終的な診断
USB HID入力遅延とレポート欠落には、HIDディスクリプタ・インタラプトエンドポイント・ポーリング間隔・実レポートバイトの証拠が必要です。UI症状は「デバイス/バス/ドライバ/アプリ」のどれが犯人かを証明しません。
Bus ScopeはHIDレポートシーケンスを可視化するので、キーボード/ゲームパッド/スキャナ/独自HIDの問題を「USBの事実」からデバッグできます。