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

印刷ビューの終了

更新: 2014 年 9 月
 
 

電源管理

このセクションでは、デバイス電源管理とシステム電源管理について説明します。

デバイス電源管理は、個々の USB デバイスをその入出力動作やアイドル状態かどうかに応じて管理します。

システム電源管理は、チェックポイントと復元再開を使用することで、システムの状態をファイル内にチェックポイントし、システムを完全に停止します (チェックポイントは「システム保存停止」と呼ばれることもあります)。システムの電源を再度入れると、システムは保存停止される前の状態に復元再開されます。

デバイス電源管理

次のサマリーは、USB デバイスの電源管理のためにドライバ内で行う必要のある処理を箇条書きにしたものです。電源管理の詳細については、このサマリーのあとで説明します。

  1. attach(9E) 内で電源管理コンポーネントを作成します。usb_create_pm_components(9F) のマニュアルページを参照してください。

  2. power(9E) エントリポイントを実装します。

  3. デバイスにアクセスする前に、pm_busy_component(9F)pm_raise_power(9F) を呼び出します。

  4. デバイスへのアクセスが終了したらpm_idle_component(9F) を呼び出します。

USBA 2.0 フレームワーク は、USB インタフェースの電源管理仕様で規定されている 4 つの電源レベルをサポートしています。USB 電源レベルとオペレーティングシステム電源レベルとの対応関係については、/usr/include/sys/usb/usbai.h を参照してください。

デバイスの状態が USB_DEV_OS_PWR_OFF に遷移すると、hubd ドライバはポートを保存停止します。デバイスの状態が USB_DEV_OS_PWR_1 以上に遷移すると、hubd ドライバはポートを復元再開します。ポート保存停止とシステム保存停止は異なります。ポート保存停止の場合、停止されるのは USB ポートだけです。システム保存停止については、System Power Managementで定義します。

クライアントドライバでは、デバイスでのリモートウェイクアップを有効化できます。usb_handle_remote_wakeup(9F) のマニュアルページを参照してください。hubd ドライバが、あるポート上でリモートウェイクアップを検出すると、hubd ドライバはウェイクアップ処理を実行したあと、pm_raise_power(9F) を呼び出して子に通知します。

次の図は、電源管理のさまざまな部分の間の関係を示したものです。

図 20-5  USB 電源管理

image:図は、異なる 2 つの電源管理方式をどのような場合に採用するかを示しています。

ドライバは、Figure 20–5 の下部で説明した 2 つの電源管理方式のいずれかを実装できます。パッシブ方式は、デバイス転送中に電源管理を行わないので、アクティブ方式よりも単純です。

アクティブ電源管理

このセクションでは、アクティブ電源管理スキームを実装する際に使用する必要のある関数について説明します。

ドライバのattach(9E) エントリポイントで次の処理を行います。

  1. usb_create_pm_components(9F) を呼び出します。

  2. 必要に応じて、第 2 引数に USB_REMOTE_WAKEUP_ENABLE を指定してusb_handle_remote_wakeup(9F) を呼び出すことで、デバイスでのリモートウェイクアップを有効にします。

  3. pm_busy_component(9F) を呼び出します。

  4. pm_raise_power(9F) を呼び出して電源を USB_DEV_OS_FULL_PWR レベルにします。

  5. デバイスとの通信を行ってデバイスを初期化します。

  6. pm_idle_component(9F) を呼び出します。

ドライバのdetach(9E) エントリポイントで次の処理を行います。

  1. pm_busy_component(9F) を呼び出します。

  2. pm_raise_power(9F) を呼び出して電源を USB_DEV_OS_FULL_PWR レベルにします。

  3. attach(9E) エントリポイントで usb_handle_remote_wakeup(9F) 関数を呼び出した場合、ここで第 2 引数に USB_REMOTE_WAKEUP_DISABLE を指定して usb_handle_remote_wakeup(9F) を呼び出します。

  4. デバイスとの通信を行ってデバイスを完全に停止させます。

  5. pm_lower_power(9F) を呼び出して電源を USB_DEV_OS_PWR_OFF レベルにします。

    これが、クライアントドライバ内で pm_lower_power(9F) を呼び出す唯一の場合です。

  6. pm_idle_component(9F) を呼び出します。

あるドライバスレッド内でデバイスへの入出力を開始する必要がある場合、そのスレッドで次のタスクを実行します。

  1. pm_busy_component(9F) を呼び出します。

  2. pm_raise_power(9F) を呼び出して電源を USB_DEV_OS_FULL_PWR レベルにします。

  3. 入出力転送を開始します。

ドライバ内で入出力転送が完了したという通知を受け取ったら、pm_idle_component(9F) を呼び出します。

ドライバのpower(9E) エントリポイントでは、遷移先の電源レベルが有効かどうかをチェックします。また、複数のスレッドが同時に power(9E) への呼び出しを行うことを考慮しなければならない可能性もあります。

デバイスのアイドル状態が一定時間続いたか、またはシステムが停止しようとしている場合、デバイスの状態を USB_DEV_OS_PWR_OFF にするために power(9E) ルーチンが呼び出される可能性があります。この状態は、Figure 20–4 で示した PWRED_DWN 状態に対応しています。デバイスの状態が USB_DEV_OS_PWR_OFF に遷移する場合、power(9E) ルーチンで次の処理を行います。

  1. 開かれたパイプをすべてアイドル状態にします。たとえば、割り込みパイプのポーリングを停止します。

  2. 保存する必要のあるデバイスやドライバのコンテキストをすべて保存します。

    power(9E) の呼び出しが完了したあと、デバイスが接続されているポートが保存停止されます。

デバイス起動のリモートウェイクアップまたはシステム起動のウェイクアップが受信されると、power(9E) ルーチンが呼び出されデバイスの電源が入る可能性があります。ウェイクアップ通知が発生するのは、アイドル時間が長く続いたかシステムが保存停止したために、デバイスの電源レベルが低下したあとです。デバイスの状態が USB_DEV_OS_PWR_1 またはそれ以上に遷移する場合、power(9E) ルーチンで次の処理を行います。

  1. デバイスやドライバの必要なコンテキストをすべて復元します。

  2. 指定された電源レベルに適したアクティビティーをパイプ上で再開します。たとえば、割り込みパイプでポーリングを開始します。

デバイスが接続されているポートが以前保存停止されていた場合、power(9E) が呼び出される前にそのポートが復元再開されます。

パッシブ電源管理

パッシブ電源管理方式は、前述のアクティブ電源管理方式より単純です。このパッシブ方式では、転送中の電源管理は行われません。このパッシブ方式を実装するには、デバイスを開くときにpm_busy_component(9F)pm_raise_power(9F) を呼び出します。その後、デバイスを閉じるときにpm_idle_component(9F) を呼び出します。

システム電源管理

システム電源管理は、状態保存後のシステム全体の電源切断とシステム電源再投入後の状態復元とで構成されます。この処理は CPR (チェックポイントおよび復元再開) と呼ばれます。CPR に関する USB クライアントドライバの動作は、ほかのクライアントドライバの動作と同じです。デバイスを保存停止する場合は、ドライバの detach(9E) エントリポイントが cmd 引数 DDI_SUSPEND で呼び出されます。デバイスを復元再開する場合は、ドライバのattach(9E) エントリポイントが cmd 引数 DDI_RESUME で呼び出されます。detach(9E) ルーチンで DDI_SUSPEND コマンドを処理する場合、あとで完全な復元再開を行うのに必要な範囲で、デバイス状態やドライバ状態をクリーンアップします。(この状態はFigure 20–4SUSPENDED に対応しています)。attach(9E) ルーチンで DDI_RESUME コマンドを処理する場合、システムとデバイスの同期が取れるように、必ずデバイスの電源レベルをフルにします。

USB デバイスの場合、保存停止/復元再開はホットプラグの切り離し/再接続 (Hotplugging USB Devicesを参照) と同様に処理されます。CPR とホットプラグの重要な違いは、CPR では、デバイスが保存停止可能な状態にない場合にドライバでのチェックポイント処理が失敗する可能性があるという点です。たとえば、デバイスのエラー回復が進行中である場合、デバイスの保存停止は行えません。デバイスがビジー状態で安全に停止できない場合も、デバイスの保存停止は行えません。