次の方法で共有


1 つまたは複数の機能電源状態を持つ単一コンポーネント デバイスのサポート

単一コンポーネント デバイスの KMDF ドライバーは、コンポーネントの 1 つ以上の機能電源状態を定義し、コンポーネントの Fx 状態が変更されたとき、またはそのアクティブ/アイドル状態が変化したときに電源管理フレームワーク (PoFx) が呼び出すコールバック関数を登録できます。 UMDF バージョン 2.0 以降では、単一コンポーネント デバイスの UMDF ドライバーは、単一の機能電源状態 (F0) を定義できます。

PoFx の詳細については、「電源管理フレームワークの概要」を参照してください。

単一コンポーネント デバイスの Fx 状態のサポートを実装するには、デバイスの初回起動前または初回起動中に、次の手順を実行する必要があります。

  1. この手順は、KMDF ドライバーの場合に限ります。 WdfDeviceWdmAssignPowerFrameworkSettings を呼び出して、PoFx に登録するときに WDF が使用する電源フレームワーク設定を指定します。 ドライバーが WdfDeviceWdmAssignPowerFramework を呼び出すときにドライバーが提供する WDF_POWER_FRAMEWORK_SETTINGS 構造体では設定ドライバーは複数のコールバック関数へのポインターを提供できます。 ドライバーが単一の機能電源状態 (F0) のみをサポートしている場合、この手順は省略可能です。

  2. この手順は、KMDF ドライバーと UMDF ドライバーに適用されます。 WdfDeviceAssignS0Idle を呼び出し、 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 構造体の IdleTimeoutType フィールドを SystemManagedIdleTimeout または SystemManagedIdleTimeoutWithHint に設定します。 これにより、WDF が PoFx に登録されます。

    KMDF ドライバーの場合、PoFx に登録するときに、フレームワークは WdfDeviceWdmAssignPowerFrameworkSettings を呼び出したときにドライバーが WDF_POWER_FRAMEWORK_SETTINGS で提供した情報を使用します。

たとえば、リソースの再調整が発生した場合など、デバイスは複数回起動できるため、ドライバーは EvtDeviceSelfManagedIoInit コールバック関数内で前の手順を実行する可能性があります。 ドライバーが EvtDeviceSelfManagedIoInit コールバック関数を登録している場合、フレームワークは、ドライバーの EvtDeviceD0Entry コールバック関数を初めて呼び出した後、デバイスごとに 1 回呼び出します。

このトピックの他の情報は、KMDF ドライバーにのみ適用されます。

電源の起動

ドライバーが WdfDeviceWdmAssignPowerFrameworkSettings を呼び出すときに、EvtDeviceWdmPostPoFxRegisterDevice コールバック関数へのポインターを提供できます。

フレームワークは、フレームワークが PoFx に登録された後、ドライバーの EvtDeviceWdmPostPoFxRegisterDevice コールバック関数を呼び出します。 一般的な電源起動シーケンスの例を次に示します。

  1. EvtDevicePrepareHardware
  2. EvtDeviceD0Entry (PrevState = WdfPowerDeviceD3Final)
  3. EvtInterruptEnable
  4. EvtDeviceWdmPostPoFxRegisterDevice // PoFx handle is available

ドライバーは、電源フレームワークの登録に POHANDLE を使用して追加の操作を実行する必要がある場合は、EvtDeviceWdmPostPoFxRegisterDevice コールバックを提供します。 たとえば、待機時間、所在地、スリープ解除の要件を指定できます。 POHANDLE を使用するルーチンの詳細については、「デバイス電源管理ルーチン」を参照してください。

ドライバーは POHANDLE を使用して、電源制御要求を PoFx と交換することもできます。

電源の切断

WDF は、PoFx で指定された登録を削除する前に、EvtDeviceWdmPrePoFxUnregisterDevice コールバック関数を呼び出します。

ドライバーは、WdfDeviceWdmAssignPowerFrameworkSettings に提供する WDF_POWER_FRAMEWORK_SETTINGS 構造体の ComponentIdleStateCallback ルーチンへのポインターを提供できます。 PoFx は、指定されたコンポーネントの Fx 電源状態の保留中の変更をドライバに通知するために、このルーチンを呼び出します。 このコールバック ルーチンでは、ドライバーは、機能状態の変更に関連するハードウェア固有の操作を実行できます。

たとえば、コンポーネントを低電力 Fx 状態に移行する前に、ドライバーはハードウェアの状態を保存し、割り込みと DMA を無効にする可能性があります。 ドライバーは、割り込みがアクティブでなくなったことをシステムに通知する WdfInterruptReportInactive を呼び出します。 F 状態遷移中に割り込みをオフにすると、システム全体の消費電力が削減される可能性があります。

ドライバーは、WDF_POWER_FRAMEWORK_SETTINGS 構造体で ComponentIdleConditionCallback ルーチンへのポインターを提供することもできます。 PoFx は、コンポーネントがアイドル状態になったことをドライバーに通知するには、このルーチンを呼び出します。 このルーチンでは、ドライバーは、電源管理キューと自己管理 I/O 操作を停止するプロセスを開始します。

  1. デバイスの電源管理キューごとに WdfIoQueueStop を 1 回呼び出します。 WdfIoQueueStop の各呼び出しで、EvtIoQueueState コールバックを指定します。 通常、ドライバーは ComponentIdleConditionCallback 内から WdfIoQueueStop を呼び出します。

  2. 電源管理された各キューからドライバーにディスパッチされる要求が速やかに完了していることを確認します。 ドライバーによっては、次の一部またはすべてを含む場合があります。

    • ドライバーが要求を長時間保持せず、それを行う I/O ターゲットに転送しない場合は、手順 3 に進みます。
    • ドライバーが特定の要求を長時間保持している場合は、これらの要求を手動キューへ再度いれます。 その ComponentActiveConditionCallback ルーチンで、ドライバーは要求を取得できます。
    • ドライバーが特定の要求を長時間保持している I/O ターゲットに転送する場合は、これらの要求を取り消します。 ComponentActiveConditionCallback で要求を再送信します。
  3. 各キューが停止されると、フレームワークは EvtIoQueueState を呼び出します。 ドライバーが複数の電源管理キューを停止している場合、フレームワークは EvtIoQueueState をキューごとに 1 回ずつ複数回呼び出します。

    ドライバーは、最後の EvtIoQueueState 関数が呼び出された後に PoFxCompleteIdleCondition を呼び出す必要があります。 たとえば、ドライバーは、最後の EvtIoQueueState 内からこの呼び出しを行うことができます。

    どの呼び出しが最後であるかを判断するために、ドライバーはカウンターを使用して、フレームワークが EvtIoQueueState を呼び出した回数を追跡する場合があります。 Singlecomp サンプルは、この手法を示しています。 このサンプルは、Windows 8 WDK から入手できます。

一般的な電源切断シーケンスの例を次に示します。

  1. ComponentIdleConditionCallback
  2. ComponentIdleStateCallback
  3. EvtInterruptDisable
  4. EvtDeviceD0Exit

ComponentActiveConditionCallback で電源管理キューと自己管理 I/O 操作を再起動します。

ドライバーが以前に WdfInterruptReportInactive を呼んだ場合は、ComponentActiveConditionCallback または ComponentIdleStateCallback から WdfInterruptReportActive を呼び出して、非アクティブな割り込みを再度有効にします。