USBエンドポイントHALT復旧:CLEAR_FEATURE、STALLループ、バルク失敗、ドライバリセット挙動
USBエンドポイントHALTの復旧、CLEAR_FEATURE ENDPOINT_HALT、繰り返されるSTALLループ、バルク転送失敗、ドライバリセット、ファームウェア状態バグのトラブルシューティング方法を解説します。
USBエンドポイントHALTは「1回は動くがその後失敗する」系のバグの定番です。バルク転送がストールし、ドライバがHALTをクリアし、デバイスが再びストール、最終的にアプリが「タイムアウト」「I/Oエラー」「デバイスリセット」「切断」を報告する。デバイスは消えないものの、特定エンドポイントでのトラフィック受付を止めてしまう——そんなときに USB endpoint halt、CLEAR_FEATURE ENDPOINT_HALT、USB STALL loop、bulk endpoint stalled、libusb clear halt といった検索がされます。
Bus Scopeが効くのは、エンドポイントHALTの復旧が「シーケンス」であり、単発のイベントではないからです。最初のSTALL、ホストの復旧リクエスト、その後のデバイスの挙動、そして同じコマンドで再度ストールしていないかを見る必要があります。
エンドポイントHALTの意味
HALT状態とは、エンドポイントがストールしており、HALT状態がクリアされるまで通常の転送ができない、ということです。ホストは次を発行できます。
CLEAR_FEATURE(ENDPOINT_HALT)
対象エンドポイントに対して。クリア後も、エンドポイントのdata toggleとデバイス側の状態が一貫していないと、転送が正しく再開しません。
ファームウェアがUSBハードウェアフラグだけクリアして内部プロトコル状態を直さないと、次の転送も失敗します。
STALL vs タイムアウト
STALLは明示的。タイムアウトは「期待時間内に完了しなかった」ことを意味します。タイムアウトの原因は、エンドポイントが応答しない/デバイスがNAKし続ける/デバイスが切断した、のいずれかです。
HALT復旧の出発点はSTALLです。ホストがSTALLを見ずにタイムアウトばかり見るなら、復旧パスは別の話になります。
バルクエンドポイントのHALT
バルクエンドポイントは、コマンドが不正、プロトコルフェーズが誤り、ファームウェアがエラーを検出したときなどにHALTしがちです。
例:
Host -> Device bulk OUT command
Device -> Host STALL on bulk IN
Host -> Device CLEAR_FEATURE(ENDPOINT_HALT)
Host retries bulk IN
Device stalls again
このパターンは、HALTが単なる一時的なバスエラーではなく、デバイスプロトコル状態の症状であることを示しています。
復旧はエンドポイントの方向と一致させる必要がある
エンドポイントアドレスには方向があります。エンドポイント 0x81 と 0x01 は方向が違うので別物。誤ったエンドポイントをクリアしても、ストールしたパイプは復旧しません。
確認ポイント:
- どのエンドポイントがストールしたか?
- INかOUTか?
- ホストは同じエンドポイントをクリアしたか?
- クリア後に転送が再開したか?
- data toggle/状態が正しく復旧したか?
これは「clear haltが効かない」報告が誤解のもとになる定番ポイントです。
繰り返されるSTALLループ
クリア後もSTALLが繰り返されるなら、根本原因が残っています。
- ホストが未対応のコマンドを再送している
- ファームウェアのステートマシンがエラーのまま
- デバイスがリトライ前にリセットを期待している
- ホストが誤ったエンドポイントから読んでいる
- コマンド長やチェックサムが間違っている
- エンドポイントのdata toggle/状態に不整合
- ファームウェアが再開前にクラス/ベンダーリクエストを要する
トレースには、復旧試行だけでなく、最初のSTALLの直前のコマンドも残しておいてください。
ドライバのリセット挙動
Clear-HALT復旧に失敗すると、ドライバはデバイスをリセットすることがあります。これで本来のエンドポイントエラーが覆い隠されます。ユーザーの目には再接続やデバイス消滅しか見えませんが、バスの証拠を見れば、最初の失敗はSTALLループだったと分かります。
保全すべきタイムライン:
- 最後の成功コマンド
- 最初のSTALL
- Clear halt試行
- リトライ
- 再STALLまたはタイムアウト
- デバイスリセットまたは切断
デバッグチェックリスト
次の流れで作業すると、原因に早くたどり着けます。
- ストールしたエンドポイントを特定する
- エンドポイントの方向と転送種別を記録する
- STALL直前のコマンド/転送を確認する
- ホストが
CLEAR_FEATURE(ENDPOINT_HALT)を送ったかを確認する - 正しいエンドポイントを対象としているかを確認する
- 転送が再開したかを確認する
- STALLが再発するならファームウェアプロトコル状態を確認する
- 復旧失敗後にデバイスリセットが走っていないか確認する
- 既知の正常なコマンドシーケンスと比較する
- STALLの前に十分なコンテキストを残しておく
最終的な診断
USBエンドポイントHALTの復旧は「ステートマシン」の問題です。CLEAR_FEATURE(ENDPOINT_HALT) はUSBエンドポイント状態をクリアしますが、ファームウェアのプロトコル状態、不正コマンド、誤エンドポイント、ドライバのリトライ論理までは自動で直してくれません。
Bus ScopeはHALTと復旧シーケンス全体を可視化するので、エンドポイント失敗を「実際のUSB挙動」から診断できます。