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 | 文字列データ。 |