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 エンドポイント記述子

    . . . .
    . . . .
    . . . .