ガレスタさんのDIY日記

電子回路、Web、組み込み、自作エフェクターを語るblog

自分用メモ デバイスディスクリプタ

バイスディスクリプタディスクリプタ階層の一番上に属する。

一応書いておくと以下のような感じだ
┏デバイスディスクリプタ
 ┝コンフィグレーションディスクリプタ
  ┝インターフェイスディスクリプタ
   ┝エンドポイントディスクリプタ

役割としては主にVID,PIDとか一般情報を書くディスクリプタである。
Universal Serial Bus Specification9.6.1のデバイスディスクリプタの項目に説明があるので詳しく知りたい方はここを見てくれ

http://sdphca.ucsd.edu/lab_equip_manuals/usb_20.pdf(ここの290ページ辺り)
STの実際の記述と見比べてみると・・・・

__ALIGN_BEGIN uint8_t USBD_FS_DeviceDesc[USB_LEN_DEV_DESC] __ALIGN_END =
  {
    0x12,                       /*bLength */
    USB_DESC_TYPE_DEVICE,       /*bDescriptorType*/
#if (USBD_LPM_ENABLED == 1)
    0x01,                       /*bcdUSB */ /* changed to USB version 2.01 
                                               in order to support LPM L1 suspend
                                               resume test of USBCV3.0*/
#else  
    0x00,                       /* bcdUSB */
#endif
    0x02,
    0x02,                        /*bDeviceClass*/
    0x02,                       /*bDeviceSubClass*/
    0x00,                       /*bDeviceProtocol*/
    USB_MAX_EP0_SIZE,          /*bMaxPacketSize*/
    LOBYTE(USBD_VID),           /*idVendor*/
    HIBYTE(USBD_VID),           /*idVendor*/
    LOBYTE(USBD_PID_FS),           /*idVendor*/
    HIBYTE(USBD_PID_FS),           /*idVendor*/
    0x00,                       /*bcdDevice rel. 2.00*/
    0x02,
    USBD_IDX_MFC_STR,           /*Index of manufacturer  string*/
    USBD_IDX_PRODUCT_STR,       /*Index of product string*/
    USBD_IDX_SERIAL_STR,        /*Index of serial number string*/
    USBD_MAX_NUM_CONFIGURATION  /*bNumConfigurations*/
  } ; 
Field Offset Size 詳細
bLength 0 1 ディスクリプタの全体長。デバイスディスクリプタは 18(0x12)Byte
bDescriptorType 1 1 ディスクリプタの種別番号。DEVICE は 1。
bcdUSB 2 2 USB のバージョン(BCD)。
bDeviceClass 4 1 クラス番号 (USBクラス)。0x0 と 0xFF 以外は USB-IF が予約している。
bDeviceSubClass 5 1 サブクラス番号。0x0 と 0xFF 以外は クラス番号に依存する。
bDeviceProtocol 6 1 プロトコル番号。0x0 と 0xFF 以外は クラス、サブクラス番号に依存する。
bMaxPacketSize0 7 1 エンドポイント0の最大パケットサイズ(Byte)。速度別に規定がある。
idVendor 8 2 ベンダID(VID)。USB-IF より ID を発行(有償)してもらう必要有り。
idProduct 10 2 プロダクトID(PID)。ベンダー各社がプロダクト毎に ID を自由に振りふれる。
bcdDevice 12 2 バイスのバージョン番号(BCD)。
iManufacturer 14 1 製造者の ストリングディスクリプタ の Index 番号。0の場合、指定無し。
iProduct 15 1 Product の ストリングディスクリプタ の Index 番号。0の場合、指定無し。
iSerialNumber 16 1 シリアルナンバーのストリングディスクリプタの Index 番号。0の場合、指定無し。複数接続を前提とするならば指定が必要。
bNumConfigurations 17 1 コンフィグレーションディスクリプタの個数。

※日本語訳はおなかすいたWiki様より借用
デバイスディスクリプタ - おなかすいたWiki!

表よりわかるがデバイスディスクリプタは18byte固定となるのでここら辺はソースを読み進めやすいはず。
またbDeviceClassとかをよく見てソースコード読み進めていくと理解しやすい。
ここが0xEFとかになってたらIADと呼ばれる一個のコンフィグに複数のインターフェイスを持つものになっていることが多いのでここの情報はしっかり把握しておくこと。
自分が確認したところCDCのサンプルではSTが0x02,LPCが0xEFになっていた。



なので次回は以下の点を勉強して行きたいと思う