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必要性
DEVICE1◎:必要
CONFIGURATION2◎:必要
STRING3△:指定があれば
INTERFACE4◎:必要
ENDPOINT5○:Endpoint=0 以外は必要
DEVICE_QUALIFIER6○:Hi-Speed USB をサポートする場合、必要
OTHER_SPEED_CONFIGURATION7○:Hi-Speed USB をサポートする場合、必要
INTERFACE_POWER8?:見たことがない

GET_DESCRIPTOR (DEVICE)

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

FieldOffsetSize詳細
bLength01Descriptor の全体長。DEVICE は 18(0x12)Byte 固定。
bDescriptorType11Descriptor Types。DEVICE は 1。
bcdUSB22USB のバージョン(BCD)。0x100(USB1.0)、0x110(USB1.1)、0x200(USB2.0) のいずれか。
bDeviceClass41Class 番号。0x0*1 と 0xFF*2 以外は USB-IF が予約している。
bDeviceSubClass51Sub Class 番号。0x0 と 0xFF 以外は Class 番号に依存する。
bDeviceProtocol61Protocol 番号。0x0 と 0xFF 以外は Class、Sub Class 番号に依存する。
bMaxPacketSize071Endpoint0 の最大パケットサイズ(Byte)。8, 16, 32, 64 のいずれか。
idVendor82Vendor ID(VID)。USB-IF より ID を発行(有償)してもらう必要有り。
idProduct102Product ID(PID)。ベンダー各社がプロダクト毎に ID を自由に振りふれる。PnP との関わりが深いためかなり重要。
bcdDevice122Device バージョン番号(BCD)。PnP に関わりが薄いため重要視されていない。
iManufacturer141ベンダーの STRING Descriptor の Index 番号。0の場合、指定無し。
iProduct151Product の STRING Descriptor の Index 番号。0の場合、指定無し。
iSerialNumber161シリアルナンバーの STRING Descriptor の Index 番号。0の場合、指定無し。複数接続を前提とするならば指定が必要。
bNumConfigurations171CONFIGURATION Descriptor の個数。複数の Configuration より複数の Interface の方が好まれるケースが多い。

GET_DESCRIPTOR (CONFIGURATION)

Configuration Descriptor を取得します。Configuration Descriptor 下には従属的に Interface Descriptor、Endpoint Descriptor が付属します。一般的には始めに Configuration Descriptor の固定 9 byte 分を読み込み wTotalLength を取得し、再度、wTotalLength 分の Configuration Descriptor を取得します。

FieldOffsetSize詳細
bLength01Descriptor の全体長。CONFIGURATION は 9(0x9)Byte 固定。
bDescriptorType11Descriptor Types。CONFIGURATION は 2。
wTotalLength22Configuration,Interface,Endpoint Descriptor を含む全体長。
bNumInterface41INTERFACE Descriptor の個数。
bConfigurationValue51Configuration 番号。複数の Configuration Descriptor が指定された時に使われるはずなんだけど、経験上見たことが無い。
iConfiguration61Configuration の STRING Descriptor の Index 番号。0の場合、指定無し。設定されている USB 機器は少ないんじゃないかな。
bmAttributes71bit 7:予約(1)、bit 6:Self Power(0/1)、bit 5:Remote Wakeup機能(0/1)、bit 4-0:予約(0)
bMaxPower81必要とするバスからの電流の1/2(mA)。最大 500(=0xFA*2)mA。値の1/2を設定するのは 1 byte に丸めたかったがため。

INTERFACE Descriptor

FieldOffsetSize詳細
bLength01Descriptor の全体長。INTERFACE は 9(0x9)Byte 固定。
bDescriptorType11Descriptor Types。INTERFACE は 4。
bInterfaceNumber21Interface の識別番号。複合デバイス(Composite device)の場合、異なった値が設定されなければならない。デフォルトは 0。
bAlternateSetting31bInterfaceNumberが同じで bAlternateSetting が異なる場合、排他的な複数の設定を持っていることになる。デフォルトは 0。
bNumEndpoints41Endpoint 数(ただし Endpoint0 は除く)
bInterfaceClass51Class 番号。bDeviceClass(CONFIGURATION Descriptor) の設定が 0 だった場合、この設定が参照される。0x0 は未定義、0xFF は Vendor-specific。
bInterfaceSubClass61Sub Class 番号。0x0 と 0xFF 以外は Class 番号に依存する。
bInterfaceProtocol71Protocol 番号。0x0 と 0xFF 以外は Class、Sub Class 番号に依存する。
iInterface81Interface の STRING Descriptor の Index 番号。0の場合、指定無し。Composite device でたまに見かける。

ENDPOINT Descriptor

FieldOffsetSize詳細
bLength01Descriptor の全体長。ENDPOINT は 7(0x7)Byte 固定。
bDescriptorType11Descriptor Types。ENDPOINT は 5。
bEndpointAddress21bit 7 : IN=1, OUT=0、bit 6-4 : 予約(0)、bit 3-0 : Endpoint 番号
bmAttributes31bit 7-2 : 予約(0)*3、bit 1-0 : 00=Control 転送、01=Isochronous 転送、10=Bulk 転送、11=Interrupt 転送
wMaxPacketSize42最大パケット長。
bInterval61最大待ち時間。転送方式、速度によって意味合いが異なる。

GET_DESCRIPTOR (STRING)

指定された Index 番号で問い合わせることで、指定の STRING 情報が取得できます。STRING 情報は UNICODE で返却します。

FieldOffsetSize詳細
bLength01STRING Descriptor の全体長。可変。
bDescriptorType11Descriptor Types。STRING は 3。
wLANGID(Index=0の場合)、bString(0以外)2n文字列データ。

*1 Interface descriptorに詳細有り
*2 Vendor-specific
*3 USB 2.0 の Full/Hi Speed USB の Isochronous 転送の場合、bit 5-2 を使用する

Last-modified: 2005.12.14 (水) 21:41:41 (4419d)