| ナビゲーションリンクをスキップ | |
| 印刷ビューの終了 | |
|
デバイスドライバの記述 Oracle Solaris 11.1 Information Library (日本語) |
パート I Oracle Solaris プラットフォーム用デバイスドライバの設計
2. Oracle Solaris カーネルとデバイスツリー
64 ビットに対応したデバイスドライバに対する入出力制御のサポート
22. ドライバのコンパイル、ロード、パッケージ化、およびテスト
23. デバイスドライバのデバッグ、テスト、およびチューニング
attach(9E) ルーチンは、次に示すような、すべてのデバイスに必要な一般的な初期化タスクを実行します。
インスタンスごとの状態構造体の割り当て
デバイス割り込みの登録
デバイスのレジスタのマッピング
mutex 変数と条件変数の初期化
電源管理可能なコンポーネントの作成
マイナーノードの作成
これらのタスクのコード例については、「attach() エントリポイント」を参照してください。
文字デバイスドライバは、タイプ S_IFCHR のマイナーノードを作成します。S_IFCHR のマイナーノードを指定すると、このノードを表す文字型特殊ファイルが最終的に /devices 階層に表示されます。
次の例は、文字ドライバの標準的な attach(9E) ルーチンを示しています。デバイスに関連付けられているプロパティーは一般に、attach() ルーチンで宣言されます。この例では、定義済みの Size プロパティーを使用しています。Size は、ブロックデバイスでのパーティションのサイズを取得するための Nblocks プロパティーに相当します。たとえば、ディスク装置で文字入出力を実行している場合は、Size を使用してパーティションのサイズを取得できます。Size は 64 ビットのプロパティーであるため、64 ビットのプロパティーインタフェースを使用する必要があります。この場合は、ddi_prop_update_int64(9F)を使用します。プロパティーの詳細については、「デバイスプロパティー」を参照してください。
例 15-1 文字ドライバの attach() ルーチン
static int
xxattach(dev_info_t *dip, ddi_attach_cmd_t cmd)
{
int instance = ddi_get_instance(dip);
switch (cmd) {
case DDI_ATTACH:
/*
* Allocate a state structure and initialize it.
* Map the device's registers.
* Add the device driver's interrupt handler(s).
* Initialize any mutexes and condition variables.
* Create power manageable components.
*
* Create the device's minor node. Note that the node_type
* argument is set to DDI_NT_TAPE.
*/
if (ddi_create_minor_node(dip, minor_name, S_IFCHR,
instance, DDI_NT_TAPE, 0) == DDI_FAILURE)
{
/* Free resources allocated so far. */
/* Remove any previously allocated minor nodes. */
ddi_remove_minor_node(dip, NULL);
return (DDI_FAILURE);
}
/*
* Create driver properties like "Size." Use "Size"
* instead of "size" to ensure the property works
* for large bytecounts.
*/
xsp->Size = size_of_device_in_bytes;
maj_number = ddi_driver_major(dip);
if (ddi_prop_update_int64(makedevice(maj_number, instance),
dip, "Size", xsp->Size) != DDI_PROP_SUCCESS) {
cmn_err(CE_CONT, "%s: cannot create Size property\n",
ddi_get_name(dip));
/* Free resources allocated so far. */
return (DDI_FAILURE);
}
/* ... */
return (DDI_SUCCESS);
case DDI_RESUME:
/* See the "Power Management" chapter in this book. */
default:
return (DDI_FAILURE);
}
}