前のページ 次のページ 目次

2. The Linux USB Subsystem

Linuxでは, USB デバイスとホストコントローラをサポートするために特定のAPI を持つ「USB コア」と呼ばれるサブシステムが存在する. その目的は, 関数, マクロ, データ構造体のセットを定義することにより すべてのハードウエアやデバイスに依存しない部分を抽象化するためである. USB コアはすべての USB デバイスドライバとホストコントローラドライバーに共通のルーチンを含んでいる. これらの機能を上流と下流の API レイヤーに分類することができる. 図 3が示すように, USB デバイスドライバのための API とホストコントローラのためのAPI が存在する. ホストコントローラドライバーのための開発は既に終了しているので, 以下のセクションでは USB デバイスドライバ・レイヤーの説明に焦点をあてる. このセクションはエントリーポイントと API 関数の使用法の説明により USB フレームワークの概略を説明する. あなたが linux デバイスドライバに精通していないならば, 以下のセクションはそれほど有用でないかもしれない.

2.1 The USB Device Driver Framework

USB デバイスドライバーはサブシステムで登録/削除される. ドライバーは 2 つのエントリーポイントとその名前を登録しなければならない. 特定の USB デバイス(いかなる他のサブシステムでも登録に適さないデバイス)に関しては, ドライバーは 2,3 のファイル操作とマイナ番号を登録する. この場合, 指定されたマイナ番号と以下の15の番号がドライバーに割当てられる. これは 1 つのドライバーで最大 16 台の同様の USB デバイスを扱うことを可能にする. すべての USB デバイスのメジャー番号は 180 である.

2.1.1 Framework Data Structures

すべての USB が関連する関数またはデータ構造体は同じ命名法則に従い, usb_から始まる. 図 4は, サブシステムで USB デバイスドライバを登録するのに必要な構造体を示す. 図4:usb_driver 構造体

2.1.2 Framework Entry Points

USB ドライバー・フレームワークは典型的なデバイスドライバに 2 つのエントリー ポイントを付加する -

2.1.3 Framework Functions

2.2 Configuring USB Devices

API はディスクリプタの選択または問い合わせのための1 セットの関数, コンフィグレーション, デバイスの相互設定を含む.

2.2.1 Descriptor Data Structures

Linux USB サブシステムは, サブシステムの特定の構造により拡張もしくは組み込まれた標準の USB ディスクリプタによって, ディスクリプタの階層構造を記述する. この構造体は, 選択されたコンフィギュレーションとインタフェースにポインタを格納するのを手伝う. これらの構造体の要素は, その後の API 呼び出しに必要である限り詳細に説明される. usb.h とセクション 9.5 にディスクリプタに関する詳細な情報がある.

struct usb_device{
  ...
  struct usb_config_descriptor *actconfig;/* the active configuration */
  ...
  struct usb_device_descriptor descriptor;/* Descriptor */
  struct usb_config_descriptor *config;	/* All of the configs */
}

usb_device 構造体はすべての USB の特定のディスクリプタの根源である. 時々, デバイスのコンフィギュア, または適切に転送要求をセットアップするためにドライバーの中のディスクリプタを分析することが必要となる.