標準の USB 記述子

USB デバイスは、USB 記述子と呼ばれるデータ構造内のそれ自体に関する情報を提供します。 このセクションでは、デバイス、構成、インターフェイス、およびエンドポイント記述子に関する情報と、それらを USB デバイスから取得する方法について説明します。

デバイス レイアウトにマップされた USB 記述子

ホスト ソフトウェアは、さまざまな標準制御要求を既定のエンドポイントに送信することにより、接続されたデバイスから記述子を取得します (記述子要求の取得。USB 仕様のセクション 9.4.3 を参照)。 これらの要求は、取得する記述子の種類を指定します。 このような要求に応じて、デバイスは、デバイス、その構成、インターフェイス、および関連するエンドポイントに関する情報を含む記述子を送信します。 デバイス記述子には、デバイス全体に関する情報が含まれています。 構成記述子には、各デバイス構成に関する情報が含まれています。 文字列記述子には、Unicode テキスト文字列が含まれています。

すべての USB デバイスは、デバイスのクラス情報、ベンダーと製品の識別子、および構成の数を示すデバイス記述子を公開します。 各構成は、インターフェイスの数と電源特性を示す構成記述子を公開します。 各インターフェイスは、クラスとエンドポイントの数に関する情報を含む代替設定ごとにインターフェイス記述子を公開します。 各インターフェイス内の各エンドポイントは、エンドポイントのタイプと最大パケット サイズを示すエンドポイント記述子を公開します。

たとえば、OSR FX2 ボード デバイスのレイアウトを考えてみましょう (「USB デバイスのレイアウト」を参照)。 デバイス レベルでは、デバイスは既定のエンドポイントのデバイス記述子とエンドポイント記述子を公開します。 構成レベルでは、デバイスは構成 0 の構成記述子を公開します。 インターフェイス レベルでは、代替設定 0 の 1 つのインターフェイス記述子を公開します。 エンドポイント レベルでは、3 つのエンドポイント記述子を公開します。

Class diagram of USB device descriptor layout.

USB デバイス記述子

すべてのユニバーサル シリアル バス (USB) デバイスは、デバイスに関する関連情報を含む単一のデバイス記述子を提供できる必要があります。 Windows では、その情報を使用して、さまざまな情報セットを取得します。 たとえば、idVendor フィールドと idProduct フィールドでは、ベンダー識別子と製品識別子をそれぞれ指定します。 Windows では、これらのフィールド値を使用して、デバイスの ハードウェア ID を構築します。 特定のデバイスのハードウェア ID を表示するには、[デバイス マネージャー] を開き、デバイスのプロパティを表示します。 [詳細] タブの [ハードウェア ID] プロパティの値は、Windows によって生成されるハードウェア ID ("USB\XXX") を示します。 bcdUSB フィールドは、デバイスが準拠している USB 仕様のバージョンを示します。 たとえば、0x0200 は、デバイスが USB 2.0 仕様に従って設計されていることを示します。 bcdDevice 値は、デバイス定義のリビジョン番号を示します。 USB ドライバー スタックは、idVendoridProduct と共に bcdDevice を使用して、デバイスのハードウェア ID と互換性のある ID を生成します。 これらの識別子は、[デバイス マネージャー] で表示できます。 デバイス記述子は、デバイスがサポートする構成の合計数も示します。

ホストは、コントロール転送を通じてデバイス記述子を取得します。 マイクロソフトでは、記述子を取得するためのプログラミング インターフェイスを提供しています。

記述内容 呼び出し内容
Windows.Devices.Usb を使用する UWP アプリ UsbDevice.DeviceDescriptor
WinUSB 関数を使用する Win32 デスクトップ アプリ WinUsb_GetDescriptor
UMDF ベースのクライアント ドライバー IWDFUsbTargetDevice::RetrieveDescriptor
KMDF ベースのクライアント ドライバー WdfUsbTargetDeviceGetDeviceDescriptor
WDM ベースのクライアント ドライバー UsbBuildGetDescriptorRequest
_URB_CONTROL_DESCRIPTOR_REQUEST

USB 構成記述子

USB 構成には、一連のインターフェイスが含まれています。 各インターフェイスは 1 つ以上の代替設定で構成され、各代替設定は一連のエンドポイントで構成されます (「USB デバイスのレイアウト」を参照)。 構成記述子は、そのインターフェイス、代替設定、それらのエンドポイントを含む構成全体を記述します。 これらの各エンティティは記述子形式でも記述されます。 構成記述子には、デバイスの製造元によって定義されたカスタム記述子を含めることもできます。

したがって、構成記述子の最初の部分のみが固定 (9 バイト) されます。 残りは、インターフェイスの数とその代替設定、およびデバイスでサポートされているエンドポイントによって異なります。 このドキュメント セットでは、最初の 9 バイトを構成記述子と呼びます。 記述子の最初の 2 バイトは合計長を示します。

次の表は、USB Web カメラ デバイスの構成記述子を示しています。

フィールド
wTotalLength 0x02CA
bNumInterfaces 0x02
bConfigurationValue 0x01
iConfiguration 0x00
bmAttributes 0x80 (バス電源)
MaxPower 0xFA (500 mA)

bConfigurationValue フィールドは、デバイスのファームウェアで定義されている構成の番号を示します。 USB 構成は、特定の電源特性も示します。 bmAttributes には、構成がリモート ウェイクアップ機能をサポートしているかどうか、およびデバイスがバスパワーかセルフパワーかを示すビットマスクが含まれています。 MaxPower フィールドは、デバイスがバス電源の場合に、デバイスがホストから引き出すことができる最大電力 (ミリアンプ 単位) を指定します。 構成記述子は、デバイスがサポートするインターフェイス (bNumInterfaces) の合計数も示します。

記述内容 呼び出し内容
Windows.Devices.Usb を使用する UWP アプリ 固定長部分を取得する UsbDevice.ConfigurationDescriptor
構成セット全体を取得する UsbConfiguration.Descriptors
WinUSB 関数を使用する Win32 デスクトップ アプリ WinUsb_GetDescriptor
UMDF ベースのクライアント ドライバー IWDFUsbTargetDevice::RetrieveDescriptor
KMDF ベースのクライアント ドライバー WdfUsbTargetDeviceRetrieveConfigDescriptor
WDM ベースのクライアント ドライバー UsbBuildGetDescriptorRequest
_URB_CONTROL_GET_CONFIGURATION_REQUEST

USB インターフェイス記述子

インターフェイス記述子には、USB インターフェイスの代替設定に関する情報が含まれています。

次の表は、Web カメラ デバイスのインターフェイス 0 の代替設定 0 のインターフェイス記述子を示しています。

フィールド
bInterfaceNumber 0x00
bAlternateSetting 0x00
bNumEndpoints 0x01
bInterfaceClass 0x0E
bInterfaceSubClass 0x02
bInterfaceProtocol 0x00
iInterface 0x02
0x0409 "Microsoft LifeCam VX-5000"
0x0409 "Microsoft LifeCam VX-5000"

前の例では、bInterfaceNumber フィールド値と bAlternateSetting フィールド値をメモしています。 これらのフィールドには、ホストがインターフェイスとその代替設定の 1 つをアクティブにするために使用するインデックス値が含まれています。 アクティブ化の場合、アプリケーションまたはドライバーは関数呼び出しでインデックス値を指定します。 その情報に基づいて、USB ドライバー スタックは標準のコントロール要求 (SET INTERFACE) を構築し、デバイスに送信します。 bInterfaceClass フィールドをメモします。 インターフェイス記述子またはその代替設定の記述子は、クラス コード、サブクラス、およびプロトコルを指定します。 値 0x0E は、インターフェイスがビデオ デバイス クラス用であることを示します。 また、iInterface フィールドにも注目してください。 この値は、インターフェイス記述子に 2 つの文字列記述子が追加されていることを示します。 文字列記述子には、デバイスの列挙時に機能を識別するために使用される Unicode の説明が含まれています。

記述内容 呼び出し内容
Windows.Devices.Usb を使用する UWP アプリ 特定の代替設定の特定の記述子を取得する UsbInterfaceSetting.Descriptors
インターフェイスのすべての設定の記述子を取得する UsbInterface.Descriptors
WinUSB 関数を使用する Win32 デスクトップ アプリ WinUsb_GetDescriptor
UMDF ベースのクライアント ドライバー IWDFUsbInterface::GetInterfaceDescriptor
KMDF ベースのクライアント ドライバー WdfUsbInterfaceGetDescriptor
WDM ベースのクライアント ドライバー UsbBuildGetDescriptorRequest
_URB_CONTROL_GET_CONFIGURATION_REQUEST の後、各インターフェイス記述子を解析します。 詳細については、「USB デバイス用の構成の選択方法」を参照してください。

USB エンドポイント記述子

インターフェイス内の各エンドポイントは、デバイスの入力または出力の単一ストリームを記述します。 さまざまな種類の関数のストリームをサポートするデバイスには、複数のインターフェイスがあります。 関数に関連する複数のストリームをサポートするデバイスは、単一のインターフェイスで複数のエンドポイントをサポートできます。

すべての種類のエンドポイント (既定のエンドポイントを除く) は、ホストがエンドポイントに関する情報を取得できるようにエンドポイント記述子を提供する必要があります。 エンドポイント記述子には、そのアドレス、種類、方向、エンドポイントが処理できるデータの量などの情報が含まれます。 エンドポイントへのデータ転送は、その情報に基づいています。

次の表は、Web カメラ デバイスのエンドポイント記述子を示しています。

フィールド
bEndpointAddress 0x82 IN
bmAttributes 0x01
wMaxPacketSize 0x0080 (128)
bInterval 0x01

bEndpointAddress フィールドは、エンドポイント番号 (ビット 3..0) とエンドポイントの方向 (ビット 7) を含む一意のエンドポイント アドレスを指定します。 前の例でこれらの値を読み取ることにより、記述子がエンドポイント番号 2 の IN エンドポイントを記述していることがわかります。 bmAttributes 属性は、エンドポイントの種類が等時性であることを示します。 wMaxPacketSizefield は、エンドポイントが 1 つのトランザクションで送受信できる最大バイト数を示します。 ビット 12..11 は、マイクロフレームごとに送信できるトランザクションの合計数を示します。 bInterval は、エンドポイントがデータを送受信できる頻度を示します。

記述内容 呼び出し内容
Windows.Devices.Usb を使用する UWP アプリ UsbEndpointDescriptor
WinUSB 関数を使用する Win32 デスクトップ アプリ WinUsb_GetDescriptor
UMDF ベースのクライアント ドライバー WDFUsbTargetPipe::GetInformation
KMDF ベースのクライアント ドライバー WdfUsbTargetPipeGetInformation
WDM ベースのクライアント ドライバー UsbBuildGetDescriptorRequest
_URB_CONTROL_GET_CONFIGURATION_REQUEST の後、各エンドポイント記述子を解析します。 詳細については、「USB デバイス用の構成の選択方法」を参照してください。