USB インターフェイス関連付け記述子
USB インターフェイス関連付け記述子 (IAD) は、デバイスで 1 つの機能に属するインターフェイスをグループ化するために使用します。 この記事では、特定の機能の IAD がデバイスに含まれているかどうかをクライアント ドライバーが判断する方法について説明します。
USB 仕様のリビジョン 2.0 では、複合デバイスの 1 つの機能内で複数のインターフェイスをグループ化することはサポートされていません。 しかし、USB デバイス作業部会 (DWG) は、複数のインターフェイスを備える機能を可能にする USB デバイス クラスを作成しました。 USB Implementor's Forum は、インターフェイスをグループ化するメカニズムを定義する ECN (Engineering Change Notification) を発行しました。
ECN は、インターフェイス関連付け記述子 (IAD) という USB 記述子を規定しており、これによりハードウェア製造元はインターフェイスのグループを定義できるようになっています。 IAD を使用する可能性が最も高いデバイス クラスは次のとおりです。
- USB ビデオ クラス仕様 (クラス コード - 0x0E)
- USB オーディオ クラス仕様 (クラス コード - 0x01)
- USB Bluetooth クラス仕様 (クラス コード - 0xE0)
IAD の使用方法
以降のサブセクションでは、IAD の使用方法について説明します。
ファームウェアの IAD を Windows に通知する複合デバイス
複合デバイス製造元は通常、USB 仕様で規定されているように、デバイス記述子のデバイス クラス (bDeviceClass)、サブクラス (bDeviceSubClass)、およびプロトコル (bDeviceProtocol) フィールドに値 0 を割り当てます。 製造元は、個々のインターフェイスをそれぞれ異なるデバイス クラスおよびプロトコルに関連付けることができます。
USB-IF コア チームは、デバイス ファームウェアに 1 つ以上の IAD が存在することをオペレーティング システムに通知する特別なクラスとプロトコルのコード セットを考案しました。 デバイス記述子には、次の表に示す値が必要です。これらの値がないと、オペレーティング システムはデバイスの IAD を検出せず、デバイスのインターフェイスを適切にグループ化できません。
デバイス記述子のフィールド | 必須の値 |
---|---|
bDeviceClass | 0xEF |
bDeviceSubClass | 0x02 |
bDeviceProtocol | 0x01 |
これらのコード値は、IAD をサポートしていないバージョンの Windows に、デバイスを正しく列挙する専用のバス ドライバーをインストールするよう通知するものです。 デバイス記述子にこれらのコードがないと、システムがデバイスの列挙に失敗したり、デバイスが正しく動作しなかったりする可能性があります。
1 台のデバイスに複数の IAD を使用できます。 各 IAD は、IAD が定義するインターフェイス グループ内のインターフェイスの直前に指定する必要があります。
IAD の機能クラス (bFunctionClass)、サブクラス (bFunctionSubclassClass)、およびプロトコル (bFunctionProtocol) フィールドには、その機能のインターフェイスを定義する USB デバイス クラスによって指定された値を設定する必要があります。
IAD のクラス フィールドおよびサブクラス フィールドは、IAD が定義するインターフェイス コレクション内のインターフェイスのクラス フィールドおよびサブクラス フィールドと一致する必要はありません。 Microsoft では、コレクションの最初のインターフェイスのクラス フィールドとサブクラス フィールドが、IAD のクラス フィールドとサブクラス フィールドに一致することを推奨しています。 次の表では、どのフィールドが一致する必要があるかを示しています。
IAD フィールド | 対応するインターフェイス フィールド |
---|---|
bFunctionClass | bInterfaceClass |
bFunctionSubclassClass | bInterfaceSubClass |
IAD の bFirstInterface フィールドは、機能の最初のインターフェイスの番号を示します。 IAD の bInterfaceCount フィールドは、インターフェイス コレクションに含まれるインターフェイスの数を示します。 IAD インターフェイス コレクション内のインターフェイスは連続している必要があります (インターフェイス番号のリストで番号に間隔がないようにする必要があります)。そのため、最初のインターフェイスの番号と数を指定することで、コレクション内のすべてのインターフェイスを指定できます。
IAD の内容へのアクセス
クライアント ドライバーは IAD 記述子に直接アクセスできません。 IAD Engineering Change Notice (ECN) では、デバイスがホスト ソフトウェアから構成記述子 (GetDescriptor 構成) の要求を受け取ったときに返す構成情報に IAD を含める必要があると規定しています。 ホスト ソフトウェアは、GetDescriptor 要求を使用して IAD を直接取得できません。
ただし、クライアント ドライバーは、USB デバイスの親ドライバーにデバイスのハードウェア識別子 (ID) を照会でき、デバイスのハードウェア ID には IAD のフィールドに関する情報が埋め込まれています。
USB インターフェイス関連付け記述子の例
このセクションでは、複合 USB デバイスの記述子のレイアウトを示します。 この例のデバイスには 2 つの機能があります。
Video クラス機能
インターフェイス関連付け記述子 (IAD) はこの機能を定義します。 この機能には、インターフェイス 0 とインターフェイス 1 の 2 つのインターフェイスが含まれています。
「ワイヤレス モバイル通信デバイス クラスのサポート」で説明しているように、システムはこの機能に対してハードウェア識別子 (ID) と互換性 ID を生成します。 OS が適切な INF ファイルと一致したら、システムはビデオ クラス ドライバー スタックを読み込みます。
HID (Human Input Device) 機能
この機能にはインターフェイス 2 のみが含まれています。
「USB 複合デバイスのインターフェイス コレクションの列挙」で説明しているように、システムは機能に対してハードウェア ID と互換性 ID を生成します。 OS が適切な INF ファイルと一致したら、システムは HID (Human Input Device) クラス ドライバーを読み込みます。
記述子は次のとおりです。
デバイス記述子
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 (Human Input Devices) インターフェイス記述子
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 エンドポイント記述子
. . . .
. . . .
. . . .