USB デバイスは、 USB 記述子と呼ばれるデータ構造内のそれ自体に関する情報を提供します。 このセクションでは、デバイス、構成、インターフェイス、およびエンドポイント記述子に関する情報と、USB デバイスからそれらを取得する方法について説明します。
デバイス レイアウトにマップされた USB 記述子
ホスト ソフトウェアは、さまざまな標準制御要求を既定のエンドポイントに送信することで、接続されたデバイスから記述子を取得します (記述子要求の取得、USB 仕様のセクション 9.4.3 を参照)。 これらの要求は、取得する記述子の種類を指定します。 このような要求に応答して、デバイスは、デバイス、その構成、インターフェイス、および関連エンドポイントに関する情報を含む記述子を送信します。 デバイス記述子には、デバイス 全体に関する情報が含まれています。 構成記述子には、 各デバイス構成に関する情報が含まれています。 文字列記述子には、 Unicode テキスト文字列が含まれています。
すべての USB デバイスは、デバイスのクラス情報、ベンダーと製品の識別子、および構成の数を示すデバイス記述子を公開します。 各構成では、インターフェイスの数と電源特性を示す構成記述子が公開されます。 各インターフェイスは、クラスとエンドポイントの数に関する情報を含む各代替設定のインターフェイス記述子を公開します。 各インターフェイス内の各エンドポイントは、エンドポイントの種類と最大パケット サイズを示すエンドポイント記述子を公開します。
たとえば、OSR FX2 ボード デバイスのレイアウトを考えてみましょう (USB デバイスのレイアウトを参照)。 デバイス レベルでは、デバイスは既定のエンドポイントのデバイス記述子とエンドポイント記述子を公開します。 構成レベルでは、デバイスは構成 0 の構成記述子を公開します。 インターフェイス レベルでは、代替設定 0 用に 1 つのインターフェイス記述子が公開されます。 エンドポイント レベルでは、3 つのエンドポイント記述子が公開されます。
USB デバイス記述子
すべてのユニバーサル シリアル バス (USB) デバイスは、デバイスに関する関連情報を含む単一のデバイス記述子を提供できる必要があります。 Windows では、その情報を使用して、さまざまな情報セットを取得します。 たとえば、 idVendor フィールドと idProduct フィールドでは、ベンダー識別子と製品識別子をそれぞれ指定します。 Windows では、これらのフィールド値を使用して、デバイスのハードウェア ID を構築します。 特定のデバイスのハードウェア ID を表示するには、デバイス マネージャーを開き、デバイスのプロパティを表示します。 [ 詳細 ] タブの [ ハードウェア ID ] プロパティの値は、Windows によって生成されるハードウェア ID ("USB\XXX") を示します。 bcdUSB フィールドは、デバイスが準拠している USB 仕様のバージョンを示します。 たとえば、0x0200 は、デバイスが USB 2.0 仕様に従って設計されていることを示します。 bcdDevice 値は、デバイス定義のリビジョン番号を示します。 USB ドライバー スタックは、idVendor と idProduct と共に bcdDevice を使用して、デバイスのハードウェア ID と互換性のある ID を生成します。 これらの識別子は、デバイス マネージャーで表示できます。 デバイス記述子は、デバイスがサポートする構成の合計数も示します。
ホストは、コントロール転送を通じてデバイス記述子を取得します。 Microsoft では、記述子を取得するためのプログラミング インターフェイスを提供しています。
| あなたが執筆している場合に | 呼び出し。。。 |
|---|---|
| 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 エンドポイント記述子
インターフェイス内の各エンドポイントは、デバイスの入力または出力の単一ストリームを記述します。 さまざまな種類の関数のストリームをサポートするデバイスには、複数のインターフェイスがあります。 1 つの関数に関連するいくつかのストリームをサポートするデバイスは、1 つのインターフェイスで複数のエンドポイントをサポートできます。
すべての種類のエンドポイント (既定のエンドポイントを除く) は、ホストがエンドポイントに関する情報を取得できるように、エンドポイント記述子を提供する必要があります。 エンドポイント記述子には、そのアドレス、種類、方向、エンドポイントが処理できるデータの量などの情報が含まれます。 エンドポイントへのデータ転送は、その情報に基づいています。
次の表に、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 デバイスの構成を選択する方法」を参照してください。 |