Oracle® Solaris 11.2 デバイスドライバの記述

印刷ビューの終了

更新: 2014 年 9 月
 
 

記述子ツリー

記述子の解析時には、構造体のメンバーが自然な境界に位置合わせされたあと、ホストの CPU のエンディアンに変換されます。解析後の標準 USB 構成記述子、インタフェース記述子、およびエンドポイント記述子は、各構成の階層ツリーの形でクライアントドライバから使用可能となります。クラス固有またはベンダー固有の raw 記述子情報もすべて、同じ階層ツリー内でクライアントドライバから使用可能となります。

階層記述子ツリーを取得するには、usb_get_dev_data(9F) 関数を呼び出します。usb_get_dev_data (9F) のマニュアルページの「関連項目」セクションには、各標準 USB 記述子のマニュアルページの一覧が記載されています。raw 記述子情報を解析するには、usb_parse_data (9F) 関数を使用します。

2 つの構成を含むデバイスの記述子ツリーは、次の図に示すようなツリーになります。

図 20-3  階層 USB 記述子ツリー

image:図は、2 つの構成を含むデバイスの各インタフェースの記述子ペアのツリーを示しています。

上図に示した dev_cfg 配列には、構成に対応するノードが含まれています。各ノードに含まれる情報は次のとおりです。

  • 解析後の構成記述子

  • その構成のインタフェースに対応する記述子の配列へのポインタ

  • クラス固有またはベンダー固有の raw データが存在する場合はその配列へのポインタ

2 番目のインデックスで指定された構成の 2 番目のインタフェースを表すノードは、図で dev_cfg[1].cfg_if[1] の位置にあります。そのノードには、そのインタフェースの代替設定を表すノードの配列が含まれています。USB 記述子の階層はツリーの全体にわたって伝播されます。文字列記述子データに含まれる ASCII 文字列は、USB 仕様でこれらの文字列が存在するとされている場所に接続されます。

構成の配列は間が空いておらず、構成インデックスでインデックス指定されます。最初の有効な構成 (構成 1) は、dev_cfg[0] です。インタフェースと代替設定のインデックスは、それらの個数に対応した値になります。各代替設定のエンドポイントは連続的にインデックス指定されます。各代替設定の最初のエンドポイントはインデックス 0 です。

この採番方式によりツリーのトラバースが容易に行えます。たとえば、エンドポイントインデックス 0、代替 0、インタフェース 1、構成インデックス 1 の raw 記述子データは、次のパスで定義されるノードの位置にあります。

dev_cfg[1].cfg_if[1].if_alt[0].altif_ep[0].ep_descr

記述子ツリーを直接使用する代わりにusb_lookup_ep_data(9F) 関数を使用することもできます。usb_lookup_ep_data(9F) 関数は、引数としてインタフェース、代替設定、エンドポイント、エンドポイントタイプ、および向きを取ります。usb_lookup_ep_data(9F) 関数を使用すると、記述子ツリーをたどって特定のエンドポイントを取得できます。詳細については、usb_get_dev_data(9F) のマニュアルページを参照してください。