USBインタラプトエンドポイントbIntervalのデバッグ:ポーリングレート、HID遅延、Full-Speed vs High-Speed、入力欠落
USBインタラプトエンドポイントのbInterval、ポーリングレート、HID遅延、入力レポート欠落、Full-Speed vs High-Speedのinterval規則、エンドポイントディスクリプタの誤りをデバッグする方法を解説します。
USBインタラプトエンドポイントは、キーボード、マウス、ゲームコントローラ、センサ、タッチパネル、バーコードスキャナ、UPSデバイス、さまざまな独自HIDツールで使われます。入力が遅く感じたり、レポートが想定外のレートで来たりするときに、USB bInterval、HID polling rate、USB interrupt endpoint latency、missed input reports、USB device 125Hz 250Hz 1000Hz、bInterval full speed high speed で検索されます。
Bus Scopeが効くのは、ポーリング挙動が「エンドポイントディスクリプタ」と「実際のバスタイミング」で定義されるものだからです。OSのUIは「デバイス接続済み」としか表示しないことが多い一方、キャプチャは「ホストが実際に使っているinterval」を映し出します。
bIntervalの意味
インタラプトエンドポイントのディスクリプタには bInterval が含まれます。この値はポーリング間隔を表しますが、解釈は速度とエンドポイント種別で変わります。
重要な区別:
- Low-Speed/Full-Speedインタラプトエンドポイントはミリ秒フレームベースのinterval
- High-Speedインタラプトエンドポイントはマイクロフレームに基づく異なるエンコーディング
- ホストコントローラのスケジューリングやハブトポロジが実タイミングに影響
- アプリの読み取りタイミングはUSBバスポーリングとは別物
アプリのコールバックだけ見ているエンジニアは、実際のエンドポイントスケジュールを取り逃します。
よくある症状
ポーリング間隔由来の問題は、次のように現れます。
- マウスやコントローラがもっさりする
- HID入力レポートが1msではなく8msごとに来る
- 1000Hzを提示しているのに125Hz相当の挙動
- センサデータがバースト的
- バーコードスキャナが高速スキャンを取りこぼす
- レジューム後にタッチパネルが遅く感じる
- ファームウェアがホストのポーリングより速くレポートを送る
- High-Speedモードでレポートタイミングが想定外に変わる
これらは遅延・反応の問題に見えますが、ルートの証拠はUSBディスクリプタとパケットタイミングにあります。
Full-Speed vs High-Speedの解釈
同じ数値の bInterval でも、速度が違えば実効タイミングも違います。Full-Speed HIDエンドポイントの bInterval=8 は、High-Speedエンドポイントの同じバイト値と同じスケジューリングモデルではありません。
デバッグでは次をキャプチャします。
- 実際にネゴシエートされた速度
- エンドポイントディスクリプタ
- エンドポイントアドレス
- 転送種別
bInterval- 観測されたINトークン/転送ケイデンス
- レポートペイロードのタイミング
Bus Scopeはディスクリプタの値と観測タイミングを並べて表示できます。
ファームウェアのオーバープロダクション
ファームウェアの中には、ホストのポーリングより速く入力レポートを生成するものがあります。そのレポートは、ホストに届く前に上書き・合体・破棄されることがあります。
症状:
- デバイスの内部ログにはイベントが残っている
- ホストが受け取るレポートは少ない
- 高速なボタン押しが抜ける
- 動きが滑らかに見えたり遅延して見えたりする
- バースト後のレポートには最新状態だけが入っている
これはUSBパケットロスの問題ではなく、ファームウェアのバッファリングとポーリング契約の問題です。
ホストポーリング ≠ アプリ読み取りレート
アプリが1msごとに読んでいても、USBホストは8msごとにしかポーリングしないかもしれません。ホストは時間通りにポーリングしていても、アプリのイベントループが処理は後回しにしているかもしれません。
パケットキャプチャは次を切り分けます。
- バスポーリング間隔
- デバイスの応答タイミング
- ホストドライバのバッファリング
- アプリのコールバック遅延
この切り分けはHID遅延サポート案件で決定的に重要です。
bIntervalのディスクリプタミス
よくあるディスクリプタバグ:
bInterval=10を誤って提示(本来1)- Full-SpeedのintervalをHigh-Speedディスクリプタに誤ってコピー
- HIDディスクリプタの期待とエンドポイントディスクリプタでintervalが違う
- コメントは1000Hzと言っているのにディスクリプタは遅い
- Alternate Settingでintervalが変わるがファームウェアが未対応
ディスクリプタ内のバイトこそが、ホストがスケジュールに使う「契約」です。
デバッグチェックリスト
次の流れで作業すると、原因に早くたどり着けます。
- 列挙をキャプチャする
- インタラプトエンドポイントのディスクリプタを特定する
- 実際のデバイス速度を記録する
bIntervalをデコードする- 観測されたInterrupt INのケイデンスを測定する
- 期待ポーリングレートと比較する
- 高速な入力イベントをトリガーする
- レポートが欠落/合体していないか確認する
- ポート直結とハブ経由を比較する
- ディスクリプタとタイミングの証拠を一緒に保全する
最終的な診断
USBインタラプトの遅延は単なるアプリ性能の問題ではなく、エンドポイントの bInterval/速度モード/ホストスケジューリング/レポート生成/ファームウェアバッファリングに依存します。
Bus Scopeは、HID/インタラプトデバイスが意図したレートで実際にポーリングされているか、入力欠落がディスクリプタ設定/ファームウェアバッファ/ホスト・アプリタイミングのどれに由来するかを、ファームウェアエンジニアが証明する手助けをします。