Skip to main content

ディスクリプタ

Share:

概要:

USBでは、各周辺機器をホスト側で正しく認識させるためにディスクリプタと呼ばれるデータを必ずもっています。各周辺機器のもっているディスクリプタは以下の7つ(USB2.0で2つ追加されました)になります。

 

種類 内容 各Descriptorの関連
Device
Descriptor
対応しているUSB Specのバージョン、Device Class、Device SubClass、Protocol、Endpoint 0に対する転送で利用可能な最大パケット長
  • ベンダID、製品ID、Deviceの版数、Configurationの個数
  • 各種String DescriptorのIndex
どのデバイスにも必ず1つ存在。
Configuration
Descriptor
包含されるInterfaceの個数、Configurationを選択するためのConfiguration番号
  • デバイスの属性(電源供給方法)
  • 消費電力
  • 各種String DescriptorのIndex
デバイスに1つ以上存在し、1つのConfiguration Descriptorに対して1つ以上のInterface Descriptorが存在。
Interface
Descriptor
Interfaceを選択するためのInterface番号
  • Alternative Settingの個数
  • 包含されるEndpointの個数
  • Interface Class、Interface SubClass、Interface Protocol、String DescriptorのIndex
Endpoint
Descriptor
Endpointを選択するためのEndpoint番号
  • 転送タイプ(転送方向)
  • 転送で利用可能な最大パケット長
  • 転送のインターバル
各Interface Descriptorに対してそれぞれ、独立に存在。Endpoint 0はEndpoint DescriptorではなくDevice Descriptorで定義されるのでInterfaceによってはEndpoint Descriptorを持たないInterface Descriptorも存在。
String
Descriptor
文字列を保持するディスクリプタ
Device_Qualifier
Descriptor
ベンダID、製品ID、Deviceの版数を除いてDevice Descriptorと同じもの。動作中のspeed mode以外の設定におけるDevice Descriptor。 high-Speed capable deviceに必ず1つ存在。
Other_Speed_
Configuration
Descriptor
構成はConfiguration Descriptorと同じで、Interface、Endpoint Descriptorを持つ。動作中のspeed mode以外の設定におけるConfiguration Descriptor。 high-Speed capable deviceで必ず1つ以上存在。

 

Endpoint DescriptorはUSB Interface内に存在するバッファを説明するディスクリプタです。Endpoint0を除いたすべてのEndpointはこのディスクリプタを持っています。Interfaceは複数のEndpointを1つにまとめて管理するための単位です。
なぜ、EndpointをまとめてInterfaceとして管理するのかというと、それによって複合の機能を持った装置を設計できるからです。USBではClass, SubclassがDeviceとInterfaceの両方のDescriptorで定義できます。ひとつの例としてスピーカを考えた場合、制御のためのEndpoint 0 (Control転送)、Audioデータを受信するEndpoint 1(Isochronous)が必要になります。また、オプションとしてスピーカ上のボリュームを変化させた時に、結果をPCにフィードバックするためのEndpoint 2 (Interrupt)を持つかもしれません。

 

スピーカーの例

 

Interfaceという概念がない場合、Endpoint0/1だけを持った装置とEndpoint0/1/2を持った装置はともにDevice DescriptorでAudio Classと定義されますが、PC上のデバイスドライバはそれぞれ異なるものになります。それでもドライバを開発できれば問題ありませんが、効率はよくないでしょう。ドライバを開発する場合Endpoint 0/1のドライバとオプションのEndpoint 2用のドライバを分けて開発した方が他への流用はそれだけ行いやすいです。特にスピーカの例ではオプションのEndpoint 2はマウスなどと同じHID Classの装置分類できます。EndpointをInterfaceでまとめて、そのInterfaceにドライバを関連づけることができれば、ドライバを分離して開発できます。このためInterfaceに対してClass、SubClass、Protocolが記述できるようになっているのです。 また、InterfaceレベルではAlternative Settingと言う考えが導入されています。これは特にIsochronous Endpointで有効な考え方です。Audioを考えた場合、Busに送信されるデータ量はPCMのビット数やステレオ/モノラルによって大幅に変わります。

 

1byte(PCM) X 45(44.1kHz) X 1(モノラル) = 45 byte/ms
1byte(PCM) X 45(44.1kHz) X 2(ステレオ) = 90 byte/ms
2byte(PCM) X 45(44.1kHz) X 1(モノラル) = 90 byte/ms
2byte(PCM) X 45(44.1kHz) X 2(ステレオ) = 180 byte/ms

 

転送するデータ量にあわせてMax packet sizeを変更しないと、バンド幅を確保できずにクライアントS/Wとファンクションの通信を確立できないかもしれません。Alternative SettingはEndpointのMax Packet SizeをPCからの設定によって変更できる場合に使います。

Endpoint 0以外のEndpointは基本的(Shared Endpointという思想もありますが....)に複数のInterfaceで共有させることはできません。InterfaceとEndpointの組み合わせを変更する場合には別のConfigurationとして準備し、Configurationそのものを変更して対応することになります。Configurationを複数持つ目的はこのためです。Device DescriptorはUSB規定されているリクエストのGetDescriptor Deviceによってホストによって読み込まれます。対象のドライバの検出はここに記載されているベンダID、製品IDまたはClass,Subclassを"Inf"ファイル内のドライバ リストと比較して行うかInterface Descriptorに記述されている Class、Subclass を"Inf"ファイル内のドライバリストと比較して行います。

 

Configration

 


USB2.0の仕様概要

 


End of content

Back To Top