Descriptor (ディスクリプタ) †
Descriptor は、各 USB 機器が必ず持ち合わせていなければならない詳細情報です。
USB 機器であるならば必ず OS からの Descriptor 問い合わせに何らかの返答を返さなければなりません。OS は、USB 機器を接続した際に Descriptor を USB 機器に対して問い合わせることで、どのような機器が接続されたのかを知ることが出来ます。OS のPlug-and-Play (PnP) には必要不可欠の情報です。
Descriptor は、Standard Device Requests で定義されている GET_DESCRIPTOR にて取得出来ます。
Descriptor Types †
Standard Descriptor には以下の種類があります。
| 種類 | bDescriptorType | 必要性 |
| DEVICE | 1 | ◎:必要 |
| CONFIGURATION | 2 | ◎:必要 |
| STRING | 3 | △:指定があれば |
| INTERFACE | 4 | ◎:必要 |
| ENDPOINT | 5 | ○:Endpoint=0 以外は必要 |
| DEVICE_QUALIFIER | 6 | ○:Hi-Speed USB をサポートする場合、必要 |
| OTHER_SPEED_CONFIGURATION | 7 | ○:Hi-Speed USB をサポートする場合、必要 |
| INTERFACE_POWER | 8 | ?:見たことがない |
GET_DESCRIPTOR (DEVICE) †
Device Descriptor を取得します。OS は USB 機器の plug-in 時の一番初めに問い合わせます。18Byte 固定情報で必ず OS からの要求に応答しなければなりません。
| Field | Offset | Size | 詳細 |
| bLength | 0 | 1 | Descriptor の全体長。DEVICE は 18(0x12)Byte 固定。 |
| bDescriptorType | 1 | 1 | Descriptor Types。DEVICE は 1。 |
| bcdUSB | 2 | 2 | USB のバージョン(BCD)。0x100(USB1.0)、0x110(USB1.1)、0x200(USB2.0) のいずれか。 |
| bDeviceClass | 4 | 1 | Class 番号。0x0*1 と 0xFF*2 以外は USB-IF が予約している。 |
| bDeviceSubClass | 5 | 1 | Sub Class 番号。0x0 と 0xFF 以外は Class 番号に依存する。 |
| bDeviceProtocol | 6 | 1 | Protocol 番号。0x0 と 0xFF 以外は Class、Sub Class 番号に依存する。 |
| bMaxPacketSize0 | 7 | 1 | Endpoint0 の最大パケットサイズ(Byte)。8, 16, 32, 64 のいずれか。 |
| idVendor | 8 | 2 | Vendor ID(VID)。USB-IF より ID を発行(有償)してもらう必要有り。 |
| idProduct | 10 | 2 | Product ID(PID)。ベンダー各社がプロダクト毎に ID を自由に振りふれる。PnP との関わりが深いためかなり重要。 |
| bcdDevice | 12 | 2 | Device バージョン番号(BCD)。PnP に関わりが薄いため重要視されていない。 |
| iManufacturer | 14 | 1 | ベンダーの STRING Descriptor の Index 番号。0の場合、指定無し。 |
| iProduct | 15 | 1 | Product の STRING Descriptor の Index 番号。0の場合、指定無し。 |
| iSerialNumber | 16 | 1 | シリアルナンバーの STRING Descriptor の Index 番号。0の場合、指定無し。複数接続を前提とするならば指定が必要。 |
| bNumConfigurations | 17 | 1 | CONFIGURATION Descriptor の個数。複数の Configuration より複数の Interface の方が好まれるケースが多い。 |
GET_DESCRIPTOR (CONFIGURATION) †
Configuration Descriptor を取得します。Configuration Descriptor 下には従属的に Interface Descriptor、Endpoint Descriptor が付属します。一般的には始めに Configuration Descriptor の固定 9 byte 分を読み込み wTotalLength を取得し、再度、wTotalLength 分の Configuration Descriptor を取得します。
| Field | Offset | Size | 詳細 |
| bLength | 0 | 1 | Descriptor の全体長。CONFIGURATION は 9(0x9)Byte 固定。 |
| bDescriptorType | 1 | 1 | Descriptor Types。CONFIGURATION は 2。 |
| wTotalLength | 2 | 2 | Configuration,Interface,Endpoint Descriptor を含む全体長。 |
| bNumInterface | 4 | 1 | INTERFACE Descriptor の個数。 |
| bConfigurationValue | 5 | 1 | Configuration 番号。複数の Configuration Descriptor が指定された時に使われるはずなんだけど、経験上見たことが無い。 |
| iConfiguration | 6 | 1 | Configuration の STRING Descriptor の Index 番号。0の場合、指定無し。設定されている USB 機器は少ないんじゃないかな。 |
| bmAttributes | 7 | 1 | bit 7:予約(1)、bit 6:Self Power(0/1)、bit 5:Remote Wakeup機能(0/1)、bit 4-0:予約(0) |
| bMaxPower | 8 | 1 | 必要とするバスからの電流の1/2(mA)。最大 500(=0xFA*2)mA。値の1/2を設定するのは 1 byte に丸めたかったがため。 |
INTERFACE Descriptor †
| Field | Offset | Size | 詳細 |
| bLength | 0 | 1 | Descriptor の全体長。INTERFACE は 9(0x9)Byte 固定。 |
| bDescriptorType | 1 | 1 | Descriptor Types。INTERFACE は 4。 |
| bInterfaceNumber | 2 | 1 | Interface の識別番号。複合デバイス(Composite device)の場合、異なった値が設定されなければならない。デフォルトは 0。 |
| bAlternateSetting | 3 | 1 | bInterfaceNumberが同じで bAlternateSetting が異なる場合、排他的な複数の設定を持っていることになる。デフォルトは 0。 |
| bNumEndpoints | 4 | 1 | Endpoint 数(ただし Endpoint0 は除く) |
| bInterfaceClass | 5 | 1 | Class 番号。bDeviceClass(CONFIGURATION Descriptor) の設定が 0 だった場合、この設定が参照される。0x0 は未定義、0xFF は Vendor-specific。 |
| bInterfaceSubClass | 6 | 1 | Sub Class 番号。0x0 と 0xFF 以外は Class 番号に依存する。 |
| bInterfaceProtocol | 7 | 1 | Protocol 番号。0x0 と 0xFF 以外は Class、Sub Class 番号に依存する。 |
| iInterface | 8 | 1 | Interface の STRING Descriptor の Index 番号。0の場合、指定無し。Composite device でたまに見かける。 |
ENDPOINT Descriptor †
| Field | Offset | Size | 詳細 |
| bLength | 0 | 1 | Descriptor の全体長。ENDPOINT は 7(0x7)Byte 固定。 |
| bDescriptorType | 1 | 1 | Descriptor Types。ENDPOINT は 5。 |
| bEndpointAddress | 2 | 1 | bit 7 : IN=1, OUT=0、bit 6-4 : 予約(0)、bit 3-0 : Endpoint 番号 |
| bmAttributes | 3 | 1 | bit 7-2 : 予約(0)*3、bit 1-0 : 00=Control 転送、01=Isochronous 転送、10=Bulk 転送、11=Interrupt 転送 |
| wMaxPacketSize | 4 | 2 | 最大パケット長。 |
| bInterval | 6 | 1 | 最大待ち時間。転送方式、速度によって意味合いが異なる。 |
GET_DESCRIPTOR (STRING) †
指定された Index 番号で問い合わせることで、指定の STRING 情報が取得できます。STRING 情報は UNICODE で返却します。
| Field | Offset | Size | 詳細 |
| bLength | 0 | 1 | STRING Descriptor の全体長。可変。 |
| bDescriptorType | 1 | 1 | Descriptor Types。STRING は 3。 |
| wLANGID(Index=0の場合)、bString(0以外) | 2 | n | 文字列データ。 |