USB インターフェイス関連付け記述子 (IAD) を使用すると、デバイスは関数に属するインターフェイスをグループ化できます。 この記事では、クライアント ドライバーがデバイスに関数の IAD が含まれているかどうかを判断する方法について説明します。
ユニバーサル シリアル バス仕様リビジョン 2.0 では、1 つの関数内で複合デバイスの複数のインターフェイスをグループ化することはできません。 ただし、USB デバイス ワーキング グループ (DWG) は、複数のインターフェイスを持つ関数を可能にする USB デバイス クラスを作成しました。 USB 実装者フォーラムは、インターフェイスをグループ化するためのメカニズムを定義するエンジニアリング変更通知 (ECN) を発行しました。
ECN は、インターフェイス関連付け記述子 (IAD) と呼ばれる USB 記述子を指定します。これにより、ハードウェア製造元はインターフェイスのグループ化を定義できます。 IAD を使用する可能性が最も高いデバイス クラスは次のとおりです。
- USB ビデオ クラスの仕様 (クラス コード - 0x0E)
- USB オーディオ クラスの仕様 (クラス コード - 0x01)
- USB Bluetooth クラス仕様 (クラス コード - 0xE0)
IAD の使用方法
次のサブセクションでは、IAD の使用方法について説明します。
Windows にファームウェア内の IAD を通知する複合デバイス
複合デバイスの製造元は、通常、ユニバーサル シリアル バス仕様で指定されているように、デバイス記述子のデバイス クラス (bDeviceClass)、サブクラス (bDeviceSubClass)、プロトコル (bDeviceProtocol) フィールドに 0 の値を割り当てます。 製造元は、個々のインターフェイスを異なるデバイス クラスとプロトコルに関連付けることができます。
USB-IF コア チームは、1 つ以上の IAD がデバイス ファームウェアに存在することをオペレーティング システムに通知する特別なクラスとプロトコル コード セットを考案しました。 デバイス記述子には、次の表に示す値が必要です。または、オペレーティング システムがデバイスの IAD を検出しないか、デバイスのインターフェイスを適切にグループ化しません。
| デバイス記述子フィールド | 必須の値 |
|---|---|
| bDeviceClass | 0xEF |
| bDeviceSubClass | 0x02 |
| bDeviceProtocol | 0x01 |
コード値は、デバイスを正しく列挙する特殊な目的のバス ドライバーをインストールするための IAD をサポートしていない Windows のバージョンを警告します。 デバイス記述子にこれらのコードがないと、システムがデバイスを列挙できないか、デバイスが正常に動作しない可能性があります。
デバイスは複数の IAD を持つことができます。 各 IAD は、IAD が記述するインターフェイス グループ内のインターフェイスの直前に配置する必要があります。
IAD の関数クラス (bFunctionClass)、サブクラス (bFunctionSubclassClass)、プロトコル (bFunctionProtocol) フィールドには、関数内のインターフェイスを記述する USB デバイス クラスで指定された値が含まれている必要があります。
IAD のクラスフィールドとサブクラスフィールドは、IAD が記述するインターフェイス コレクション内のインターフェイスのクラスフィールドとサブクラスフィールドと一致する必要はありません。 コレクションの最初のインターフェイスには、IAD のクラスフィールドとサブクラスフィールドに一致するクラスフィールドとサブクラスフィールドが含まれることをお勧めします。 次の表は、一致するフィールドを示しています。
| IAD フィールド | 対応するインターフェイス フィールド |
|---|---|
| bFunctionClass | bInterfaceClass |
| bFunctionSubclassClass | bInterfaceSubClass |
IAD の bFirstInterface フィールドは、関数内の最初のインターフェイスの数を示します。 IAD の bInterfaceCount フィールドは、インターフェイス コレクション内のインターフェイスの数を示します。 IAD インターフェイス コレクション内のインターフェイスは連続している必要があります (インターフェイス番号の一覧にギャップがない可能性があります)。そのため、コレクション内のすべてのインターフェイスを指定するには、最初のインターフェイス番号を持つカウントで十分です。
IAD のコンテンツへのアクセス
クライアント ドライバーは IAD 記述子に直接アクセスできません。 IAD エンジニアリング変更通知 (ECN) は、デバイスが構成記述子 (GetDescriptor 構成) の要求をホスト ソフトウェアから受信したときに返される構成情報に IAD を含める必要があることを指定します。 ホスト ソフトウェアは、GetDescriptor 要求を使用して直接 IAD を取得できません。
ただし、クライアント ドライバーは、デバイスのハードウェア識別子 (ID) の USB デバイスの親ドライバーを照会でき、デバイスのハードウェア ID には、IAD のフィールドに関する埋め込み情報が含まれています。
USB インターフェイスの関連付け記述子の例
このセクションでは、複合 USB デバイスの記述子レイアウトを示します。 このデバイスの例には、次の 2 つの機能があります。
Video クラス関数
インターフェイス関連付け記述子 (IAD) は、この関数を定義します。 この関数には、インターフェイス 0 (0) とインターフェイス 1 (1) の 2 つのインターフェイスが含まれています。
システムは、 ワイヤレス モバイル通信デバイス クラスのサポートに関する説明に従って、関数のハードウェアおよび互換性のある識別子 (ID) を生成します。 OS が適切な INF ファイルと一致すると、システムはビデオ クラス ドライバー スタックを読み込みます。
人間入力デバイス (HID) 機能
この関数には、インターフェイス 2 (2) のみが含まれます。
USB 複合デバイス上のインターフェイス コレクションの列挙に関する説明に従って、システムは関数のハードウェア ID と互換性のある ID を生成します。 OS が適切な INF ファイルと一致すると、システムは人間入力デバイス (HID) クラス ドライバーを読み込みます。
記述子は次のとおりです。
デバイス記述子
BYTE bLength 0x12
BYTE bDescriptorType 0x01
WORD bcdUSB 0x0200
BYTE bDeviceClass 0xEF
BYTE bDeviceSubClass 0x02
BYTE bDeviceProtocol 0x01
BYTE bMaxPacketSize0 0x40
WORD idVendor 0x045E
WORD idProduct 0xFFFF
WORD bcdDevice 0x0100
BYTE iManufacturer 0x01
WORD iProduct 0x02
WORD iSerialNumber 0x02
BYTE bNumConfigurations 0x01
構成記述子
BYTE bLength 0x09
BYTE bDescriptorType 0x02
WORD wTotalLength 0x...
BYTE bNumInterfaces 0x03
BYTE bConfigurationValue 0x01
BYTE iConfiguration 0x01
BYTE bmAttributes 0x80 // (BUS Powered)
BYTE bMaxPower 0x19 // (50 mA)
インターフェイスの関連付け記述子
BYTE bLength 0x08
BYTE bDescriptorType 0x0B
BYTE bFirstInterface 0x00
BYTE bInterfaceCount 0x02
BYTE bFunctionClass 0x0E
BYTE bFunctionSubClass 0x03
BYTE bFunctionProtocol 0x00
BYTE iFunction 0x04
ビデオ コントロール インターフェイス記述子
BYTE bLength 0x09
BYTE bDescriptorType 0x04
BYTE bInterfaceNumber 0x00
BYTE bAlternateSetting 0x00
BYTE bNumEndpoints 0x01
BYTE bInterfaceClass 0x0E
BYTE bInterfaceSubClass 0x01
BYTE bInterfaceProtocol 0x00
BYTE iInterface 0x05
ビデオ コントロール クラス固有の記述子
. . . .
. . . .
. . . .
ビデオ制御エンドポイント記述子
. . . .
. . . .
. . . .
ビデオ ストリーミング インターフェイス記述子
BYTE bLength 0x09
BYTE bDescriptorType 0x04
BYTE bInterfaceNumber 0x01
BYTE bAlternateSetting 0x00
BYTE bNumEndpoints 0x01
BYTE bInterfaceClass 0x0E
BYTE bInterfaceSubClass 0x02
BYTE bInterfaceProtocol 0x00
BYTE iInterface 0x06
ビデオ ストリーミング クラス固有の記述子
. . . .
. . . .
. . . .
ビデオ ストリーミング エンドポイント記述子
. . . .
. . . .
. . . .
人間入力デバイス (HID) インターフェイス記述子
BYTE bLength 0x09
BYTE bDescriptorType 0x04
BYTE bInterfaceNumber 0x02
BYTE bAlternateSetting 0x00
BYTE bNumEndpoints 0x01
BYTE bInterfaceClass 0x03
BYTE bInterfaceSubClass 0x01
BYTE bInterfaceProtocol 0x01
BYTE iInterface 0x07
HID クラス固有の記述子
. . . .
. . . .
. . . .
HID エンドポイント記述子
. . . .
. . . .
. . . .