ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
デバイスドライバの記述 Oracle Solaris 11.1 Information Library (日本語) |
パート I Oracle Solaris プラットフォーム用デバイスドライバの設計
2. Oracle Solaris カーネルとデバイスツリー
デバイス、インタフェース、エンドポイントの各ステータスの取得
22. ドライバのコンパイル、ロード、パッケージ化、およびテスト
23. デバイスドライバのデバッグ、テスト、およびチューニング
このセクションでは、デバイスへのドライバのバインドについて説明します。単一のインタフェースを備えたデバイスと複数のインタフェースを備えたデバイスの互換デバイス名についても説明します。
USB デバイスは複数の構成をサポートできます。ある瞬間にアクティブになっている構成は、1 つだけです。そのアクティブな構成は現在の構成と呼ばれます。
構成には、複数のインタフェースを含めることができますが、1 つの機能に対して 2 つ以上のインタフェースをグループ化するインタフェース関連付けに干渉する可能性があります。構成のすべてのインタフェースが同時にアクティブになります。各インタフェースがそれぞれ異なるデバイスドライバによって操作される可能性があります。
各インタフェースは代替設定を使用することで、ホストシステムに対してさまざまな方法で自身を表現できます。ある特定のインタフェースでアクティブになる代替設定は、1 つだけです。
各代替設定は、エンドポイント経由でデバイスアクセスを提供します。各エンドポイントには特定の目的があります。ホストシステムは、エンドポイントとの通信チャネルを確立することで、デバイスと通信します。この通信チャネルはパイプと呼ばれます。
構成とインタフェースをそれぞれ 1 つずつ備え、デバイスクラスがゼロであるような USB デバイスは、単一のデバイスノードとして表現されます。複数のインタフェースを備えた USB デバイスは、階層デバイス構造として表現されます。階層デバイス構造では、各インタフェースのデバイスノードは最上位デバイスノードの子になります。複数のインタフェースを備えたデバイスの一例として、オーディオ制御インタフェースとオーディオストリーミングインタフェースの両方を同時にホストコンピュータに対して提供するオーディオデバイスが挙げられます。オーディオ制御インタフェースとオーディオストリーミングインタフェースはそれぞれ独自のドライバを使って制御できます。
Oracle Solaris ソフトウェアは、各デバイス内に保持された識別情報に基づいて、USB バインド用に互換デバイス名の順序付きリストを構築します。この情報にはデバイスクラス、サブクラス、ベンダー ID、製品 ID、リビジョン、プロトコルが含まれています。USB のクラスやサブクラスの一覧については、http://www.usb.org/home を参照してください。
この名前の階層では、デバイス固有のドライバが使用可能でない場合には汎用ドライバへのバインドが可能です。汎用ドライバの例としては、クラス固有のドライバが挙げられます。usbif で始まるデバイス名は、単一インタフェースのデバイスを表します。例については、例 20-1 を参照してください。USBA 2.0 フレームワーク は、あるデバイスのすべての互換名を定義します。これらのデバイス名を表示するには、例 20-2 に示すように prtconf コマンドを使用します。
次の例は、USB マウスデバイスの互換デバイス名の例を示したものです。このマウスデバイスは、全体が単一のドライバによって制御される複合ノードを表します。USBA 2.0 フレームワーク はこのデバイスノードに、例に示す名前を表示された順番で与えます。
例 20-1 USB マウスの互換デバイス名
1. 'usb430,100.102' Vendor 430, product 100, revision 102 2. 'usb430,100' Vendor 430, product 100 3. 'usbif430,class3.1.2' Vendor 430, class 3, subclass 1, protocol 2 4. 'usbif430,class3.1' Vendor 430, class 3, subclass 1 5. 'usbif430,class3' Vendor 430, class 3 6. 'usbif,class3.1.2' Class 3, subclass 1, protocol 2 7. 'usbif,class3.1' Class 3, subclass 1 8. 'usbif,class3' Class 3
上の例の名前は、具体的な名前から一般的な名前の順に並んでいます。エントリ 1 は、特定ベンダーの特定製品の特定リビジョンにしかバインドしません。エントリ 3、4、5 は、ベンダー 430 によって製造されたクラス 3 デバイス用です。エントリ 6、7、8 は、任意のベンダーのクラス 3 デバイス用です。バインド処理では、最上位の名前から下向きに、名前の一致が検索されます。バインドするためには、ドライバをシステムに追加する際に、これらの名前のいずれかに一致する別名を使用する必要があります。ドライバを追加するときに、バインド先となる互換デバイス名のリストを取得するには、prtconf -vp コマンドの出力に含まれるデバイスの compatible プロパティーをチェックします。
次の例は、キーボードとマウスの互換プロパティーリストを示したものです。バインドされたドライバを表示するには、prtconf -D コマンドを使用します。
例 20-2 構成出力コマンドによって表示された互換デバイス名
# prtconf -vD | grep compatible compatible: 'usb430,5.200' + 'usb430,5' + 'usbif430,class3.1.1' + 'usbif430,class3.1' + 'usbif430,class3' + 'usbif,class3.1.1' + 'usbif,class3.1' + 'usbif,class3' compatible: 'usb2222,2071.200' + 'usb2222,2071' + 'usbif2222,class3.1.2' + 'usbif2222,class3.1' + 'usbif2222,class3' + 'usbif,class3.1.2' + 'usbif,class3.1' + 'usbif,class3'
デバイスやデバイスグループのドライバをより正確に特定するには、できるだけ具体的な名前を使用してください。特定製品の特定リビジョン向けに記述されたドライバをバインドするには、一致する名前の中でもっとも具体的なものを使用します。たとえば、ベンダー 430 によって製品 100 のリビジョン 102 向けに記述された USB マウスドライバがある場合は、次のコマンドを使用してそのドライバをシステムに追加します。
add_drv -n -i '"usb430,100.102"' specific_mouse_driver
ベンダー 430 の任意の USB マウス (クラス 3、サブクラス 1、プロトコル 2) 向けに記述されたドライバを追加するには、次のコマンドを使用します。
add_drv -n -i '"usbif430,class3.1.2"' more_generic_mouse_driver
これらのドライバを両方ともインストールしたあとで互換デバイスを接続すると、接続されたデバイスにシステムによって正しいドライバがバインドされます。たとえば、これらのドライバを両方ともインストールしたあとでベンダー 430、モデル 100、リビジョン 102 のデバイスを接続すると、そのデバイスは specific_mouse_driver にバインドされます。ベンダー 430、モデル 98 のデバイスを接続すると、そのデバイスは more_generic_mouse_driver にバインドされます。別のベンダーのマウスを接続すると、そのデバイスも more_generic_mouse_driver にバインドされます。特定のデバイスで複数のドライバが使用可能である場合、ドライババインディングフレームワークは、互換名リスト内で先に最初に一致した互換名を持つドライバを選択します。
複合デバイスとは、複数のインタフェースをサポートするデバイスのことです。複合デバイスには、インタフェースごとの互換名リストがあります。この互換名リストにより、使用可能なドライバの中で最適なものがインタフェースにバインドされます。もっとも汎用的なマルチインタフェースエントリは、usb,device です。
USB オーディオ複合デバイスの場合、互換名は次のようになります。
1. 'usb471,101.100' Vendor 471, product 101, revision 100 2. 'usb471,101' Vendor 471, product 101 3. 'usb,device' Generic USB device
名前 usb,device は、任意の USB デバイス全体を表す互換名です。USB デバイス全体を要求したドライバがほかに存在しなければ、usb_mid(7D) ドライバ (USB マルチインタフェースドライバ) が usb,device デバイスノードにバインドします。usb_mid ドライバは、物理デバイスのインタフェースごとに子デバイスノードを 1 つずつ作成します。さらに、usb_mid ドライバは各インタフェースの一連の互換名も生成します。生成されたそれらの互換名はどれも usbif で始まります。システムはその後、生成されたそれらの互換名を使用して各インタフェースの最適なドライバを検索します。このようにして、1 つの物理デバイスの各インタフェースにそれぞれ異なるドライバをバインドすることが可能となります。
たとえば、usb_mid ドライバは、マルチインタフェースのオーディオデバイスにその usb,device ノード名を介してバインドします。続いて usb_mid ドライバは、インタフェース固有のデバイスノードを作成します。これらのインタフェース固有のデバイスノードはそれぞれ、独自の互換名リストを持ちます。オーディオ制御インタフェースノードの互換名リストは、次の例に示すようなリストになります。
例 20-3 USB オーディオ互換デバイス名
1. 'usbif471,101.100.config1.0' Vend 471, prod 101, rev 100, cnfg 1, iface 0 2. 'usbif471,101.config1.0' Vend 471, product 101, config 1, interface 0 3. 'usbif471,class1.1.0' Vend 471, class 1, subclass 1, protocol 0 4. 'usbif471,class1.1' Vend 471, class 1, subclass 1 5. 'usbif471,class1' Vend 471, class 1 6. 'usbif,class1.1.0' Class 1, subclass 1, protocol 0 7. 'usbif,class1.1' Class 1, subclass 1 8. 'usbif,class1' Class 1
vendor_model_audio_usb という名前のベンダー固有、デバイス固有のクライアントドライバを、例 20-3 に示したベンダー固有、デバイス固有で構成 1、インタフェース 0 のインタフェース互換名にバインドするには、次のコマンドを使用します。
add_drv -n -i '"usbif471,101.config1.0"' vendor_model_audio_usb
audio_class_usb_if_driver という名前のクライアントドライバを、例 20-3 に示したより汎用的なクラス 1、サブクラス 1 のインタフェース互換名にバインドするには、次のコマンドを使用します。
add_drv -n -i '"usbif,class1.1"' audio_class_usb_if_driver
デバイスとそのドライバの一覧を表示するには、prtconf -D コマンドを使用します。次の prtconf -D コマンドの例から、usb_mid ドライバが audio デバイスを管理していることがわかります。usb_mid ドライバが audio デバイスをいくつかのインタフェースに分割しています。audio デバイス名の下で各インタフェースがインデントされています。prtconf -D コマンドのインデントされたリスト内のインタフェースごとに、そのインタフェースを管理するドライバが表示されています。
audio, instance #0 (driver name: usb_mid) sound-control, instance #2 (driver name: usb_ac) sound, instance #2 (driver name: usb_as) input, instance #8 (driver name: hid)
デバイスにインタフェース関連付け記述子が含まれている場合、次の 3 つのレベルでデバイスツリーを解析できます。
使用可能なベンダー固有またはクラス固有のドライバが存在しない場合は、複合デバイスのデバイスレベルノードに usb_mid(7D) USB マルチインタフェースドライバがバインドします。
インタフェース関連付けノードにクライアントドライバがバインドされます。
クライアントドライバが見つからない場合は、usb_ia(7D) USB インタフェース関連付けドライバがデフォルトでバインドされます。その後、このインタフェース関連付けのインタフェースレベルにクライアントドライバをバインドできます。
usb_mid ドライバは、ia ごとに ia (インタフェース関連付け) ノードを 1 つずつ作成します。ia ノードの互換名は一般に usbia で始まります。名前 usb,ia は互換名の後部として任意の ia を表す互換名です。ia ノードには、その ia を要求するドライバがほかに存在しない場合には、usb_ia ドライバがバインドされます。usb_ia ドライバは、インタフェースごとに子ノードを 1 つずつ作成します。ia ノードの子ノードとしてのインタフェースノードは、デバイスノードの子としてのインタフェースノードと同じ特性を持ちます。
例 20-4 USB ビデオインタフェース関連付けの互換名
1. 'usbia46d,8c9.5.config1.0' vend 46d, prod 8c9, rev 5, cnfg 1, first_if_in_ia 0 2. 'usbia46d,8c9.config1.0' vend 46d, prod 8c9, cnfg 1, first_if_in_ia 0 3. 'usbia46d,classe.3.0' vend 46d, class e, subclass 3, protocol 0 4. 'usbia46d,classe.3' vend 46d, class e, subclass 3 5. 'usbia46d,classe' vend 46d, class e 6. 'usbia,classe.3.0' class e, subclass 3, protocol 0 7. 'usbia,classe.3' class e, subclass 3 8. 'usbia,classe' class e 9. 'usb,ia' by default
vendor_model_video_usb という名前のベンダー固有、デバイス固有のクライアントドライバを、例 20-4 に示したベンダー固有、デバイス固有の構成 1、first_if_in_ia 0 互換名にバインドするには、次のコマンドを使用します。
add_drv -n -i '"usbia46d,8c9.config1.0"' vendor_model_video_usb
video_class_usb_ia_driver という名前のクラスドライバを、例 20-4 に示したより汎用的な class e 互換名にバインドするには、次のコマンドを使用します。
add_drv -n -i '"usbia,classee"' video_class_usb_ia_driver
次の例では、prtconf -D コマンドにより、video と audio の ia を含む、Web カメラのデバイスツリーが表示されています。usb_mid ドライバがこのデバイスを管理し、2 つの ia をそれぞれビデオ用とオーディオ用に作成しています。ビデオ ia にビデオドライバ usbvc がバインドされ、オーディオ ia のインタフェースにオーディオドライバがバインドされています。
miscellaneous, instance #28 (driver name: usb_mid) video, instance #24 (driver name: usbvc) audio, instance #30 (driver name: usb_ia) sound-control, instance #38 (driver name: usb_ac) sound, instance #47 (driver name: usb_as)
ファイル /etc/driver_aliases には、すでにシステム上に存在しているバインディングのエントリが含まれています。/etc/driver_aliases ファイルの各行には、ドライバ名、空白、デバイス名がこの順番で表示されます。デバイスドライバの既存バインディングをチェックするには、このファイルを使用します。
注 - /etc/driver_aliases ファイルを手動で編集しないでください。バインディングを確立するには、add_drv(1M) コマンドを使用します。バインディングを変更するには、update_drv(1M) コマンドを使用します。