USB複合デバイスの誤ドライババインド:インターフェース、IAD、Code 10、Code 43、Windows usbccgpのデバッグ
USB Interface Association Descriptor(IAD)と複合デバイスのドライババインドエラーを解決。Windows usbccgp.sys、Code 10、Code 43、インターフェースディスクリプタ、デバイスの部分列挙失敗までをカバーします。
USB複合デバイスは、1台の物理デバイスで複数の機能を提供します。HIDコントロール、CDCシリアル、マスストレージ、ベンダー診断、オーディオ、ビデオ、ファームウェア更新インターフェースなどが同居するケースもあります。ドライババインドが崩れると、「USB Composite Device driver error」「This device cannot start Code 10」「Code 43」「interface not working」「COM port missing」「one function works but another does not」といった症状が出ます。
「USB composite device wrong driver」「Windows usbccgp Code 10」「USB interface driver not binding」「IAD descriptor debugging」といった検索ワードが指し示すのは、ほぼ確実に「バスレベルの証拠」が必要な領域です。Windowsのドライバ状態だけ見ても、ディスクリプタが機能を正しく記述できているかどうかは分かりません。
Bus Scopeが効くのは、複合バインドがディスクリプタによって駆動されているからです。
複合デバイスの構造
複合デバイスは、1つのデバイスディスクリプタと、1つ以上のコンフィギュレーションを持ちます。コンフィギュレーションの中には複数のインターフェースが公開され、各インターフェースが class/subclass/protocol とエンドポイントを持ちます。
機能の例:
- Interface 0: HID
- Interface 1: CDC制御
- Interface 2: CDCデータ
- Interface 3: ベンダー固有診断
WindowsではUSB汎用親ドライバ(多くは usbccgp.sys)が子機能を列挙し、適切なドライバを割り当てます。
Interface Association Descriptor
IADは複数のインターフェースを1つの機能にまとめます。CDC ACMは通常、ControlインターフェースとDataインターフェースを組み合わせます。IADが正しくないと、OSはこれらを誤バインドしたり、無関係なインターフェースとして扱ったりします。
IADの誤りによる症状:
- CDCシリアルのCOMポートが現れない
- オーディオ機能が部分的にしか現れない
- UVCカメラは列挙されるがビデオインターフェースが失敗する
- ベンダーインターフェースが誤ったドライバを奪う
- サブ機能の1つしか動かない
インターフェース番号とIADの範囲を慎重に見直してください。
クラスコードとドライバ選択
ドライババインドは、デバイス/インターフェースレベルの class/subclass/protocol コードに依存します。デバイスレベルのクラスが 0x00 なら、クラスはインターフェースごとに定義されるという意味です。0xEF はIAD付きの複合デバイスで使われることが多いです。
ファームウェアが誤ったクラスコードを宣言すると、Windowsは誤ったドライバを選びます。
カスタムデバイスの場合は意図的に設計します:
- HIDインターフェースはHIDを正しく記述する
- CDCインターフェースはCDCの期待に合致させる
- ベンダー固有インターフェースはベンダー専用クラスを使う
- WinUSBインターフェースはMicrosoft OSディスクリプタを要するかもしれない
Code 10とCode 43
Code 10とCode 43は「OS側の症状」であって、根本原因ではありません。USBトレースを見れば、次のような点を確認できます。
- デバイスディスクリプタが読めたか
- コンフィギュレーションディスクリプタが妥当か
- インターフェースディスクリプタが一貫しているか
- エンドポイントディスクリプタがインターフェースの期待に合っているか
- クラス固有ディスクリプタが壊れていないか
- ドライバが出したクラスリクエストがストールしなかったか
- バインド中にデバイスがリセットされなかったか
列挙は成功したのにクラスリクエストが失敗するなら、問題は「基本ディスクリプタの読み取り」以降にあります。
デバイスの部分失敗
複合デバイスは「部分的に動く」ことがあります。たとえばHIDボタンは動くがCDCシリアルは動かない。これは「デバイスが完全に死んでいる」のではなく、「あるインターフェース経路が落ちている」という意味です。
保全すべきもの:
- すべてのインターフェースディスクリプタ
- クラス固有ディスクリプタ
- インターフェース番号
- ドライバのクラスリクエスト
- 失敗したインターフェースのエンドポイントトラフィック
デバッグチェックリスト
次の流れで作業すると、原因に早くたどり着けます。
- 接続直後からキャプチャする
- デバイスレベルの class/subclass/protocol を確認する
- コンフィギュレーションのトータル長とインターフェース数を確認する
- すべてのインターフェースディスクリプタを確認する
- IADディスクリプタとインターフェース範囲を確認する
- クラス固有ディスクリプタを確認する
- どのインターフェースがバインドに失敗しているか特定する
- ストールしたクラスリクエストを探す
- 必要ならWindows/Linux/別のWindows機で挙動を比較する
- キャプチャを編集する前にディスクリプタを保全する
最終的な診断
USB複合デバイスのドライババインド失敗は、ほぼ「ディスクリプタ契約」の問題です。クラスコード、インターフェース番号、IADグループ化、クラス固有ディスクリプタ、Microsoft OSディスクリプタ、ドライバ起動時のクラスリクエストなど。
Bus Scopeはこれらの契約をそのまま可視化するので、「USB Composite Device driver error」を「具体的なインターフェースとディスクリプタの証拠」まで辿れます。