USBデバイスディスクリプタの詳細解析:各フィールドの意味と設定方法

USBデバイスディスクリプタは、USBデバイスの基本情報をホストに提供するための重要な構造体です。このディスクリプタを通じて、ホストはデバイスの特性を認識し、適切なドライバをロードします。以下では、USBデバイスディスクリプタの各フィールドの意味と設定方法について詳しく解説します。

 

moun45.hatenablog.com

 

1. デバイスディスクリプタの基本構造

USBデバイスディスクリプタは、以下のようなフィールドで構成されています:

  • bLength
  • bDescriptorType
  • bcdUSB
  • bDeviceClass
  • bDeviceSubClass
  • bDeviceProtocol
  • bMaxPacketSize0
  • idVendor
  • idProduct
  • bcdDevice
  • iManufacturer
  • iProduct
  • iSerialNumber
  • bNumConfigurations

2. 各フィールドの詳細と設定方法

a. bLength

uint8_t bLength = 18;

b. bDescriptorType

uint8_t bDescriptorType = 0x01;

c. bcdUSB

  • 意味: USB仕様のバージョン(BCD形式)
  • 設定方法: 使用するUSB仕様に基づいて設定(例:USB 2.0の場合は0x0200)
uint16_t bcdUSB = 0x0200; // USB 2.0

d. bDeviceClass

  • 意味: デバイス全体のクラスコード。0x00はインターフェース毎に定義されることを示す。
  • 設定方法: デバイスの種類に基づいて設定(例:0x02はCommunications and CDC Control)
uint8_t bDeviceClass = 0x00; // インターフェース毎に定義

e. bDeviceSubClass

  • 意味: サブクラスコード
  • 設定方法: デバイスの種類に基づいて設定
uint8_t bDeviceSubClass = 0x00; // インターフェース毎に定義

f. bDeviceProtocol

uint8_t bDeviceProtocol = 0x00; // インターフェース毎に定義

g. bMaxPacketSize0

  • 意味: エンドポイント0の最大パケットサイズ(一般的に8, 16, 32, 64のいずれか)
  • 設定方法: デバイスのハードウェア仕様に基づいて設定
uint8_t bMaxPacketSize0 = 64; // 例:64バイト

h. idVendor

  • 意味: デバイスベンダーID(USB-IFから割り当てられる)
  • 設定方法: デバイスメーカー固有の値を設定
uint16_t idVendor = 0x1234; // 例:仮のベンダーID

i. idProduct

uint16_t idProduct = 0x5678; // 例:仮のプロダクトID

j. bcdDevice

  • 意味: デバイスリリース番号(BCD形式)
  • 設定方法: デバイスのリリースバージョンを設定
uint16_t bcdDevice = 0x0100; // 例:バージョン1.00

k. iManufacturer

uint8_t iManufacturer = 1; // 例:インデックス1

l. iProduct

uint8_t iProduct = 2; // 例:インデックス2

m. iSerialNumber

uint8_t iSerialNumber = 3; // 例:インデックス3

n. bNumConfigurations

uint8_t bNumConfigurations = 1; // 例:1つのコンフィギュレーション

3. まとめ

USBデバイスディスクリプタは、デバイスの基本情報を提供する重要な構造体です。各フィールドはデバイスの特性や機能を詳細に説明し、ホストが適切にデバイスを認識し、ドライバをロードするための基礎を提供します。上記の設定方法を参考に、正確なディスクリプタを構築することで、USBデバイスが正しく機能することが保証されます。