USBデバイスディスクリプタは、USBデバイスの基本情報をホストに提供するための重要な構造体です。このディスクリプタを通じて、ホストはデバイスの特性を認識し、適切なドライバをロードします。以下では、USBデバイスディスクリプタの各フィールドの意味と設定方法について詳しく解説します。
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
uint16_t idVendor = 0x1234; // 例:仮のベンダーID
i. idProduct
uint16_t idProduct = 0x5678; // 例:仮のプロダクトID
j. bcdDevice
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
- 意味: サポートするコンフィギュレーションの数
- 設定方法: デバイスがサポートするコンフィギュレーション数を設定
3. まとめ
USBデバイスディスクリプタは、デバイスの基本情報を提供する重要な構造体です。各フィールドはデバイスの特性や機能を詳細に説明し、ホストが適切にデバイスを認識し、ドライバをロードするための基礎を提供します。上記の設定方法を参考に、正確なディスクリプタを構築することで、USBデバイスが正しく機能することが保証されます。