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

印刷ビューの終了

更新: 2014 年 9 月
 
 

デバイスアクセスを取得するためのドライバの登録

クライアントドライバからの USBA 2.0 フレームワーク への最初の 2 つの呼び出しは、usb_client_attach(9F) 関数とusb_get_dev_data (9F) 関数の呼び出しです。これら 2 つの呼び出しは、クライアントドライバのattach(9E) エントリポイントから行われます。usb_get_dev_data(9F) 関数を呼び出す前に usb_client_attach (9F) 関数を呼び出す必要があります。

usb_client_attach(9F) 関数は、USBA 2.0 フレームワーク にクライアントドライバを登録します。usb_client_attach (9F) 関数ではバージョン管理が強制実行されます。クライアントドライバのソースファイルは必ず、次の行で始まっている必要があります。

#define USBDRV_MAJOR_VER        2
#define USBDRV_MINOR_VER        minor-version
#include <sys/usb/usba.h>

minor-version の値は USBA_MINOR_VER 以下である必要があります。シンボル USBA_MINOR_VER<sys/usb/usbai.h> ヘッダーファイル内で定義されています。<sys/usb/usbai.h> ヘッダーファイルは <sys/usb/usba.h> ヘッダーファイルによってインクルードされます。

USBDRV_VERSION は、USBDRV_MAJOR_VERSIONUSBDRV_MINOR_VERSION からバージョン番号を生成するマクロです。usb_client_attach() の第 2 引数は USBDRV_VERSION である必要があります。第 2 引数が USBDRV_VERSION でない場合や USBDRV_VERSION が無効なバージョンを反映している場合には、usb_client_attach() 関数が失敗します。この制限により、プログラミングインタフェースの互換性が確保されます。

usb_get_dev_data() 関数は、適切な USB デバイス管理に必要な情報を返します。たとえば、usb_get_dev_data() 関数から次の情報が返されます。

  • デフォルト制御パイプ

  • mutex の初期化に使用する iblock_cookie (mutex_init(9F) を参照)

  • 解析後のデバイス記述子

  • ID 文字列

  • The Descriptor Treeで説明したツリー階層

usb_get_dev_data() 関数の呼び出しは必須です。usb_get_dev_data() を呼び出すことが、デフォルト制御パイプを取得したり mutex の初期化に必要な iblock_cookie を取得したりするための唯一の方法です。

クライアントドライバの attach(9E) ルーチンは通常、usb_get_dev_data() を呼び出したあとで、必要な記述子やデータを記述子ツリーからドライバのソフト状態にコピーします。ソフト状態にコピーされたエンドポイント記述子は、あとでそれらのエンドポイントへのパイプを開く際に使用されます。attach (9E) ルーチンは通常、記述子をコピーしたあとで、usb_free_descr_tree(9F) を呼び出して記述子ツリーを解放します。あるいは記述子ツリーを保持し、記述子をコピーしないようにしてもかまいません。

次の 3 つの解析レベルのいずれかをusb_get_dev_data(9F) 関数に指定することで、返される記述子ツリーの範囲を決定します。ドライバがデバイスのより広い範囲にバインドする必要がある場合、より広い範囲のツリーが必要となります。

  • USB_PARSE_LVL_IF: クライアントドライバが特定のインタフェースにバインドする場合、ドライバが必要とするのは、そのインタフェースの記述子だけです。それらの記述子のみを取得するには、usb_get_dev_data() の呼び出し時に解析レベルとして USB_PARSE_LVL_IF を指定します。

  • USB_PARSE_LVL_CFG: クライアントドライバがデバイス全体にバインドする場合は、USB_PARSE_LVL_CFG を指定して現在の構成のすべての記述子を取得します。

  • USB_PARSE_LVL_ALL。すべての構成のすべての記述子を取得するには、USB_PARSE_LVL_ALL を指定します。たとえば、usb_print_descr_tree(9F) を使用してあるデバイスのすべての構成の記述子ダンプを出力するには、ツリーの範囲をこの最高レベルにする必要があります。

クライアントドライバのdetach(9E) ルーチンは、usb_free_dev_data(9F) 関数を呼び出すことで、usb_get_dev_data() 関数によって割り当てられたリソースをすべて解放する必要があります。usb_free_dev_data() 関数は、記述子ツリーがすでに usb_free_descr_tree() 関数で解放されているハンドルを受け取ります。さらにクライアントドライバの detach() ルーチンは、usb_client_detach(9F) 関数も呼び出すことで、usb_client_attach(9F) 関数によって割り当てられたリソースをすべて解放する必要があります。