#topicpath
-----
*Descriptor (ディスクリプタ) [#e1707179]
*Descriptor (ディスクリプタ) [#title]
Descriptor は、各 USB 機器が必ず持ち合わせていなければならない詳細情報です。

#contents

USB 機器であるならば必ず OS からの Descriptor 問い合わせに何らかの返答を返さなければなりません。OS は、USB 機器を接続した際に Descriptor を USB 機器に対して問い合わせることで、どのような機器が接続されたのかを知ることが出来ます。OS のPlug-and-Play (PnP) には必要不可欠の情報です。

Descriptor は、Standard Device Requests で定義されている GET_DESCRIPTOR にて取得出来ます。

**Descriptor Types [#y2305d7d]
**Descriptor Types [#desc_type]

Standard Descriptor には以下の種類があります。

|CENTER:種類                |CENTER:bDescriptorType|CENTER:必要性|h
|[[DEVICE>#z89cbe99]]       |RIGHT:1|◎:必要|
|[[CONFIGURATION>#i8e3265d]]|RIGHT:2|◎:必要|
|[[STRING>#zf7e64d9]]       |RIGHT:3|△:指定があれば|
|[[INTERFACE>#i2f7b0f4]]    |RIGHT:4|◎:必要|
|[[ENDPOINT>#mf2dbe5a]]      |RIGHT:5|○:Endpoint=0 以外は必要|
|DEVICE_QUALIFIER|RIGHT:6|○:Hi-Speed USB をサポートする場合、必要|
|OTHER_SPEED_CONFIGURATION|RIGHT:7|○:Hi-Speed USB をサポートする場合、必要|
|INTERFACE_POWER|RIGHT:8|?:見たことがない|


**GET_DESCRIPTOR (DEVICE) [#z89cbe99]
**GET_DESCRIPTOR (DEVICE) [#get_desc_device]
Device Descriptor を取得します。OS は USB 機器の plug-in 時の一番初めに問い合わせます。18Byte 固定情報で必ず OS からの要求に応答しなければなりません。


|CENTER:Field  |CENTER:Offset|CENTER:Size|CENTER:詳細|h
|bLength|RIGHT:0|RIGHT:1|Descriptor の全体長。DEVICE は 18(0x12)Byte 固定。|
|bDescriptorType|RIGHT:1|RIGHT:1|[[Descriptor Types>#y2305d7d]]。DEVICE は 1。|
|bcdUSB|RIGHT:2|RIGHT:2|USB のバージョン(BCD)。0x100(USB1.0)、0x110(USB1.1)、0x200(USB2.0) のいずれか。|
|[[bDeviceClass>USB/Class/Class番号の詳細#hfe37efb]]|RIGHT:4|RIGHT:1|Class 番号。0x0((Interface descriptorに詳細有り)) と 0xFF((Vendor-specific)) 以外は USB-IF が予約している。|
|bDeviceSubClass|RIGHT:5|RIGHT:1|Sub Class 番号。0x0 と 0xFF 以外は Class 番号に依存する。|
|bDeviceProtocol|RIGHT:6|RIGHT:1|Protocol 番号。0x0 と 0xFF 以外は Class、Sub Class 番号に依存する。|
|bMaxPacketSize0|RIGHT:7|RIGHT:1|Endpoint0 の最大パケットサイズ(Byte)。8, 16, 32, 64 のいずれか。|
|idVendor|RIGHT:8|RIGHT:2|Vendor ID(VID)。USB-IF より ID を発行(有償)してもらう必要有り。|
|idProduct|RIGHT:10|RIGHT:2|Product ID(PID)。ベンダー各社がプロダクト毎に ID を自由に振りふれる。PnP との関わりが深いためかなり重要。|
|bcdDevice|RIGHT:12|RIGHT:2|Device バージョン番号(BCD)。PnP に関わりが薄いため重要視されていない。|
|iManufacturer|RIGHT:14|RIGHT:1|ベンダーの [[STRING Descriptor>#zf7e64d9]] の Index 番号。0の場合、指定無し。|
|iProduct|RIGHT:15|RIGHT:1|Product の [[STRING Descriptor>#zf7e64d9]] の Index 番号。0の場合、指定無し。|
|iSerialNumber|RIGHT:16|RIGHT:1|シリアルナンバーの [[STRING Descriptor>#zf7e64d9]] の Index 番号。0の場合、指定無し。複数接続を前提とするならば指定が必要。|
|bNumConfigurations|RIGHT:17|RIGHT:1|CONFIGURATION Descriptor の個数。複数の Configuration より複数の Interface の方が好まれるケースが多い。|


**GET_DESCRIPTOR (CONFIGURATION) [#i8e3265d]
**GET_DESCRIPTOR (CONFIGURATION) [#get_desc_config]
Configuration Descriptor を取得します。Configuration Descriptor 下には従属的に Interface Descriptor、Endpoint Descriptor が付属します。一般的には始めに Configuration Descriptor の固定 9 byte 分を読み込み wTotalLength を取得し、再度、wTotalLength 分の Configuration Descriptor を取得します。

|CENTER:Field  |CENTER:Offset|CENTER:Size|CENTER:詳細|h
|bLength|RIGHT:0|RIGHT:1|Descriptor の全体長。CONFIGURATION は 9(0x9)Byte 固定。|
|bDescriptorType|RIGHT:1|RIGHT:1|[[Descriptor Types>#y2305d7d]]。CONFIGURATION は 2。|
|wTotalLength|RIGHT:2|RIGHT:2|Configuration,Interface,Endpoint Descriptor を含む全体長。|
|bNumInterface|RIGHT:4|RIGHT:1|INTERFACE Descriptor の個数。|
|bConfigurationValue|RIGHT:5|RIGHT:1|Configuration 番号。複数の Configuration Descriptor が指定された時に使われるはずなんだけど、経験上見たことが無い。|
|iConfiguration|RIGHT:6|RIGHT:1|Configuration の [[STRING Descriptor>#zf7e64d9]] の Index 番号。0の場合、指定無し。設定されている USB 機器は少ないんじゃないかな。|
|bmAttributes|RIGHT:7|RIGHT:1|bit 7:予約(1)、bit 6:Self Power(0/1)、bit 5:Remote Wakeup機能(0/1)、bit 4-0:予約(0)|
|bMaxPower|RIGHT:8|RIGHT:1|必要とするバスからの電流の1/2(mA)。最大 500(=0xFA*2)mA。値の1/2を設定するのは 1 byte に丸めたかったがため。|


***INTERFACE Descriptor [#i2f7b0f4]
***INTERFACE Descriptor [#if_desc]
|CENTER:Field  |CENTER:Offset|CENTER:Size|CENTER:詳細|h
|bLength|RIGHT:0|RIGHT:1|Descriptor の全体長。INTERFACE は 9(0x9)Byte 固定。|
|bDescriptorType|RIGHT:1|RIGHT:1|[[Descriptor Types>#y2305d7d]]。INTERFACE は 4。|
|bInterfaceNumber|RIGHT:2|RIGHT:1|Interface の識別番号。複合デバイス(Composite device)の場合、異なった値が設定されなければならない。デフォルトは 0。|
|bAlternateSetting|RIGHT:3|RIGHT:1|bInterfaceNumberが同じで bAlternateSetting が異なる場合、排他的な複数の設定を持っていることになる。デフォルトは 0。|
|bNumEndpoints|RIGHT:4|RIGHT:1|Endpoint 数(ただし Endpoint0 は除く)|
|[[bInterfaceClass>USB/Class/Class番号の詳細#q6cd4677]]|RIGHT:5|RIGHT:1|Class 番号。bDeviceClass(CONFIGURATION Descriptor) の設定が 0 だった場合、この設定が参照される。0x0 は未定義、0xFF は Vendor-specific。|
|bInterfaceSubClass|RIGHT:6|RIGHT:1|Sub Class 番号。0x0 と 0xFF 以外は Class 番号に依存する。|
|bInterfaceProtocol|RIGHT:7|RIGHT:1|Protocol 番号。0x0 と 0xFF 以外は Class、Sub Class 番号に依存する。|
|iInterface|RIGHT:8|RIGHT:1|Interface の [[STRING Descriptor>#zf7e64d9]] の Index 番号。0の場合、指定無し。Composite device でたまに見かける。|

***ENDPOINT Descriptor [#mf2dbe5a]
***ENDPOINT Descriptor [#ep_desc]
|CENTER:Field  |CENTER:Offset|CENTER:Size|CENTER:詳細|h
|bLength|RIGHT:0|RIGHT:1|Descriptor の全体長。ENDPOINT は 7(0x7)Byte 固定。|
|bDescriptorType|RIGHT:1|RIGHT:1|[[Descriptor Types>#y2305d7d]]。ENDPOINT は 5。|
|bEndpointAddress|RIGHT:2|RIGHT:1|bit 7 : IN=1, OUT=0、bit 6-4 : 予約(0)、bit 3-0 : Endpoint 番号|
|bmAttributes|RIGHT:3|RIGHT:1|bit 7-2 : 予約(0)((USB 2.0 の Full/Hi Speed USB の Isochronous 転送の場合、bit 5-2 を使用する))、bit 1-0 : 00=Control 転送、01=Isochronous 転送、10=Bulk 転送、11=Interrupt 転送 |
|wMaxPacketSize|RIGHT:4|RIGHT:2|最大パケット長。|
|bInterval|RIGHT:6|RIGHT:1|最大待ち時間。転送方式、速度によって意味合いが異なる。|

**GET_DESCRIPTOR (STRING) [#zf7e64d9]
**GET_DESCRIPTOR (STRING) [#get_desc_string]
指定された Index 番号で問い合わせることで、指定の STRING 情報が取得できます。STRING 情報は UNICODE で返却します。

|CENTER:Field |CENTER:Offset|CENTER:Size|CENTER:詳細|h
|bLength|RIGHT:0|RIGHT:1|STRING Descriptor の全体長。可変。|
|bDescriptorType|RIGHT:1|RIGHT:1|[[Descriptor Types>#y2305d7d]]。STRING は 3。|
|wLANGID(Index=0の場合)、bString(0以外)|RIGHT:2|RIGHT:n|文字列データ。|




// EOF