USB BOSとMicrosoft OSディスクリプタのデバッグ:WebUSB、WinUSB、WCID、Windowsドライババインド
USB BOSディスクリプタ、Microsoft OSディスクリプタ、WCID、WinUSBの自動ドライババインド、WebUSBのランディングページ、ディスクリプタSTALL、Windows列挙挙動のトラブルシューティング方法を解説します。
近年のUSBデバイスは、基本のデバイス/コンフィギュレーションディスクリプタ以外にも依存していることが多いです。BOSディスクリプタ、Microsoft OSディスクリプタ、WCIDディスクリプタ、WebUSBプラットフォームケーパビリティ、WinUSB互換IDなどは、Windowsがドライバをどうバインドするか、ブラウザやツールがデバイスの能力をどう発見するかを左右します。これらが間違っていると、WinUSB driver not binding、WebUSB device not found、USB BOS descriptor failed、Microsoft OS descriptor invalid、device works on Linux but not Windows といった症状として現れます。
Bus Scopeが威力を発揮するのは、こうしたディスクリプタ起因の問題が「列挙の最中」に起きることです。ディスクリプタのリクエストをキャプチャしておかないと、デバイスマネージャやアプリケーション側の最終症状しか見えなくなります。
BOSディスクリプタとは
BOSは「Binary Object Store」の略で、USBデバイスに対してプラットフォームケーパビリティや追加のデバイスレベル情報を告知させる仕組みです。近年のデバイスでは、BOSに次のようなケーパビリティが含まれます。
- USB 2.0 Extension
- SuperSpeedケーパビリティ
- WebUSBプラットフォームケーパビリティ
- Microsoft OS 2.0 プラットフォームケーパビリティ
BOSディスクリプタの形式が壊れていると、Windowsやブラウザベースのツールが機能を無視したり、検証で失敗したりします。
Microsoft OSディスクリプタとWinUSB
Microsoft OSディスクリプタを使うと、WindowsがカスタムINFなしで自動的にWinUSBをバインドできる場合があります。古いWCID系ディスクリプタも、新しいMicrosoft OS 2.0ディスクリプタも、実デバイスでは普通に目にします。
特に重要な証拠:
- 旧来のフローにおける、文字列ディスクリプタ index
0xEEへのリクエスト - OSディスクリプタ取得に使われるベンダーコード
WINUSBなどのCompatible ID- Extended Properties
- インターフェース番号の関連付け
- 未サポートのディスクリプタリクエストを正しくSTALLしているか
ファームウェアが不正なデータを返すと、デバイスは列挙できてもWindowsはWinUSBをバインドしません。
WebUSB
WebUSBは、BOSのプラットフォームケーパビリティディスクリプタを使って、ランディングページとブラウザからアクセス可能なケーパビリティを告知します。BOSエントリが間違っていると、ブラウザは期待どおりにデバイスを公開してくれません。
症状:
- ブラウザがデバイスを見つけられない
- OSには表示されるがWebUSBの選択UIに出てこない
- ランディングページのURLが抜けている/間違っている
- ネイティブツールでは動くがWebツールでは動かない
バストレースを見れば、ホストがBOSを要求したかどうか、デバイスが何を返したかを確認できます。
正しいSTALLの挙動
一部のオプション的Microsoftディスクリプタ機構では、その機能をサポートしないデバイスがリクエストをSTALLで返すのが正解です。STALLが常にバグとは限りません。バグなのは、不正なディスクリプタデータを返したり、対応を主張しておきながら次のリクエストを失敗させたりすることです。
だからこそ、コントロール転送の「文脈」が重要なのです。
複合デバイス特有の落とし穴
Microsoft OSディスクリプタは、多くの場合特定のインターフェースを指します。複合デバイスでは、ディスクリプタが誤ったインターフェース番号を指していたり、Windowsがデバイスの一部にしかドライバをバインドしなかったりして失敗します。
確認すべきポイント:
- インターフェース番号
- インターフェースアソシエーションディスクリプタ(IAD)
- Compatible IDセクション
- Function Subset Header
- WinUSBが対象とするのが1つのインターフェースなのか全インターフェースなのか
デバッグチェックリスト
次の流れで作業すると、原因に早くたどり着けます。
- 接続直後からキャプチャする
- デバイス・コンフィギュレーション・インターフェース・エンドポイント・BOSディスクリプタを保全する
- Microsoft OSディスクリプタへのリクエストを探す
- ベンダーコードとディスクリプタ長をデコードする
- ディスクリプタ内のインターフェース番号を確認する
WINUSBなどのCompatible ID値を検証する- 未サポートのリクエストが正しくSTALLされるかを確認する
- WindowsとLinuxの列挙挙動を比較する
- 列挙後にデバイスマネージャのバインドを確認する
- ファームウェアデバッグのため、ディスクリプタの生バイトを保全する
最終的な診断
USB BOSとMicrosoft OSディスクリプタの失敗は、「ディスクリプタ契約」の問題です。デバイスは列挙できても、オプションのディスクリプタが壊れている・抜けている・誤ったインターフェースにマッピングされているせいで、WinUSB・WebUSB・インターフェース固有のドライババインドが失敗します。
Bus Scopeは列挙とディスクリプタリクエストをそのまま可視化するので、ドライババインドの失敗を「OS側の症状」ではなく「USB上の証拠」からデバッグできます。