USBデバイスは、さまざまな機能や動作モードを持つことができ、その設定情報は「コンフィギュレーションディスクリプタ」として提供されます。このディスクリプタは、USBデバイスの動作をホストに知らせるために重要な役割を果たします。ここでは、USBコンフィギュレーションディスクリプタの基本構造と設定例について詳しく解説します。
1. コンフィギュレーションディスクリプタとは?
USBコンフィギュレーションディスクリプタは、USBデバイスがどのように機能するかを定義する情報を提供します。これには、消費電力、インターフェースの数、各インターフェースの詳細などが含まれます。ホストはこの情報を元に、適切な設定を行い、デバイスを使用します。
2. コンフィギュレーションディスクリプタの基本構造
USBコンフィギュレーションディスクリプタは、以下のフィールドで構成されています:
- bLength
- bDescriptorType
- wTotalLength
- bNumInterfaces
- bConfigurationValue
- iConfiguration
- bmAttributes
- bMaxPower
3. 各フィールドの詳細と設定方法
a. bLength
- 意味: ディスクリプタの長さ(バイト単位)
- 設定方法: 常に9(コンフィギュレーションディスクリプタの固定長)
uint8_tbLength=9;
b. bDescriptorType
- 意味: ディスクリプタの種類(コンフィギュレーションディスクリプタの場合は0x02)
- 設定方法: 常に0x02
uint8_tbDescriptorType=0x02;
c. wTotalLength
- 意味: このコンフィギュレーションに含まれる全ディスクリプタの合計長(バイト単位)
- 設定方法: コンフィギュレーションディスクリプタ、インターフェースディスクリプタ、エンドポイントディスクリプタなどの合計長
uint16_twTotalLength=sizeof(configuration_descriptor) +sizeof(interface_descriptor) +sizeof(endpoint_descriptor);
d. bNumInterfaces
- 意味: このコンフィギュレーションで使用されるインターフェースの数
- 設定方法: デバイスのインターフェース数を設定
uint8_tbNumInterfaces=1; // 例:1つのインターフェース
e. bConfigurationValue
- 意味: このコンフィギュレーションを選択するための値
- 設定方法: コンフィギュレーションの識別子(通常1から始まる)
f. iConfiguration
- 意味: コンフィギュレーションの文字列ディスクリプタのインデックス
- 設定方法: 文字列ディスクリプタのインデックス(0は無効)
uint8_tiConfiguration=0; // 例:インデックス0(文字列なし)
g. bmAttributes
- 意味: コンフィギュレーションの属性(バスパワード、セルフパワード、リモートウェイクアップなど)
- 設定方法: 属性をビットマスクで設定
uint8_tbmAttributes=0x80; // 例:バスパワードのみ(ビット7が常に1)
- ビット7: 常に1(予約)
- ビット6: セルフパワード(1)/バスパワード(0)
- ビット5: リモートウェイクアップ(1で有効)
uint8_tbmAttributes=0xC0; // 例:セルフパワード、リモートウェイクアップ有効
h. bMaxPower
uint8_t bMaxPower = 50; // 例:100mA(2mA単位で50)
4. コンフィギュレーションディスクリプタの設定例
以下に、典型的なUSBコンフィギュレーションディスクリプタの設定例を示します。
// コンフィギュレーションディスクリプタ構造体の定義
struct configuration_descriptor {
uint8_t bLength;
uint8_t bDescriptorType;
uint16_t wTotalLength;
uint8_t bNumInterfaces;
uint8_t bConfigurationValue;
uint8_t iConfiguration;
uint8_t bmAttributes;
uint8_t bMaxPower;
};
struct configuration_descriptor config_desc = {
.bLength = 9,
.bDescriptorType = 0x02,
.wTotalLength = sizeof(config_desc) + sizeof(interface_desc) + sizeof(endpoint_desc),
.bNumInterfaces = 1,
.bConfigurationValue = 1,
.iConfiguration = 0,
.bmAttributes = 0xC0, // セルフパワード、リモートウェイクアップ有効
.bMaxPower = 50 // 100mA
};
まとめ
USBコンフィギュレーションディスクリプタは、USBデバイスがどのように機能するかをホストに伝えるために重要な役割を果たします。各フィールドを正確に設定することで、デバイスが正しく認識され、適切に動作することが保証されます。このガイドを参考にして、USBコンフィギュレーションディスクリプタを正しく設定し、デバイスの性能を最大限に引き出しましょう。