次の方法で共有


USB インターフェイスの関連付け記述子

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

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