Go to main content
Oracle® Solaris 11.3 デバイスドライバの記述

印刷ビューの終了

更新: 2016 年 11 月
 
 

文字デバイスの自動構成

attach(9E) ルーチンは、次に示すような、すべてのデバイスに必要な一般的な初期化タスクを実行します。

  • インスタンスごとの状態構造体の割り当て

  • デバイス割り込みの登録

  • デバイスのレジスタのマッピング

  • mutex 変数と条件変数の初期化

  • 電源管理可能なコンポーネントの作成

  • マイナーノードの作成

これらのタスクのコード例については、attach エントリポイントを参照してください。

文字デバイスドライバは、タイプ S_IFCHR のマイナーノードを作成します。S_IFCHR のマイナーノードを指定すると、このノードを表す文字型特殊ファイルが最終的に /devices 階層に表示されます。

次の例は、文字ドライバの標準的な attach(9E) ルーチンを示しています。デバイスに関連付けられているプロパティーは一般に、attach() ルーチンで宣言されます。この例では、定義済みの Size プロパティーを使用しています。Size は、ブロックデバイスでのパーティションのサイズを取得するための Nblocks プロパティーに相当します。たとえば、ディスク装置で文字入出力を実行している場合は、Size を使用してパーティションのサイズを取得できます。Size は 64 ビットのプロパティーであるため、64 ビットのプロパティーインタフェースを使用する必要があります。この場合は、ddi_prop_update_int64(9F)を使用します。プロパティーの詳細については、デバイスプロパティーを参照してください。

使用例 69  文字ドライバの 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);
  }
}