アイドル電源切断のサポート

一部のデバイスは、システムが動作 (S0) 状態のまま低電力(Dx) 状態に入ることがあります。 Windows 8 以降では、Dx 状態に移行する前に、デバイスを低電力機能電源状態 (Fx) に移行できます。 このようなデバイスの場合、フレームワークは、デバイスがアイドル状態になった (使用されていない) 時間 (および設定可能な) 時間が経過した後、デバイスやコンポーネントの電力低下を開始します。

これらのデバイスの一部では、外部イベントを検出したときにバス上でウェイクアップ信号をトリガーすることもできます。 バス ドライバーは、この信号に応答し、ドライバー スタックは、その動作状態にデバイスを復元します。 (外部イベントを検出しないデバイスはメイン動作状態へのデバイスの復元を開始するようフレームワークがバス ドライバーに要求するまで、低電力状態になります)。

デバイスまたはコンポーネントがアイドル状態のときに電源を切断できる場合、電源ポリシー所有者EvtDriverDeviceAdd コールバック関数は、次の 2 つの手順を実行する必要があります。

  1. WdfDeviceAssignS0IdleSettings を呼び出して、次を指定します。

    • デバイスが入力する低電力状態
    • デバイスが電源状態を低下させる前にアイドル状態にしたままにする必要がある時間
    • デバイスが外部イベントを検出し、バスでウェイクアップ信号をトリガーできるかどうか
    • ユーザーがデバイスのアイドル設定を制御できるかどうか
    • デバイスのアイドル電源切断機能が有効か無効か
    • システムが動作 (S0) 状態に戻ったときに、デバイスが動作 (D0) 状態に戻るかどうか
    • デバイスのアイドル タイムアウト値が電源管理フレームワーク (PoFx) によって決定されるかどうか
    • アイドル タイムアウトの期間が経過したときに、フレームワークが D3cold 電源状態にデバイスを配置できるかどうか

    これらの設定の詳細については、「WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 構造」および「機能電源状態のサポート」を参照してください。

  2. デバイスに必要な場合は、WdfDeviceInitSetPowerPolicyEventCallbacks を呼び出して、次のイベント コールバック関数を登録します。

    • EvtDeviceArmWakeFromS0 は、デバイス ハードウェア (バスではない) が外部ウェイクアップ イベントに応答できるようにします。
    • EvtDeviceDisarmWakeFromS0 は、外部ウェイクアップ イベントに応答するデバイスの機能 (バスの機能ではない) を無効にします
    • EvtDeviceWakeFromS0Triggered は、バスがウェイク信号を検出したことをドライバーに通知します。

アイドル状態の条件

フレームワークは、デバイスがアイドル状態であると見なし、次のすべての条件が満たされたときにアイドル時間のカウントを開始します。

  • このデバイス インスタンス用に作成された電源管理キューには、キュー内で待機している要求やドライバーにディスパッチされる要求はありません。 要求がドライバーにディスパッチされ、ドライバーが I/O ターゲットに送信した場合、要求は引き続きキューに関連付けられます。 ドライバーが要求の送信に ”送信するだけ” オプションを使用しない限り、デバイスはアイドル状態とは見なされません。 電源管理されていないキュー内の要求は、デバイスのアイドル状態にはカウントされません。
  • ドライバーが以前に WdfDeviceStopIdle を呼び出した場合、ドライバーは後で WdfDeviceResumeIdle を呼び出します。
  • 電源ポリシー所有者がバス ドライバーの場合、バス ドライバーの子デバイスは D0 にありません。

ドライバー (またはユーザー) がデバイスのアイドル電源切断を有効にする場合は、WdfDeviceStopIdle メソッドを使用する必要があります。 デバイスが動作 (D0) 状態の場合、このメソッドは、ドライバーが WdfDeviceResumeIdle を呼び出すまで、デバイスがアイドル状態にならないようにします。 ドライバーが WdfDeviceStopIdle を呼び出すときにデバイスが低電力状態にあり、システムが動作 (S0) 状態の場合、フレームワークは、デバイスを動作 (D0) 状態に復元するようバス ドライバーに要求します。 WdfDeviceStopIdle への呼び出しが成功するたびに、WdfDeviceResumeIdle の呼び出しと一致する必要があります。 デバッガーで電源リファレンス カウントを表示する方法については、「WDF での電源リファレンス リークのデバッグ」を参照してください。

ドライバーが WdfDeviceStopIdle を呼び出す必要がある場合の詳細については、メソッドのリファレンス ページを参照してください。

デバイスが低電力状態から復帰できる場合、デバイスのバスのドライバーはデバイスのスリープ解除に参加します。 バス ドライバーは通常、EvtDeviceEnableWakeAtBus および EvtDeviceDisableWakeAtBus コールバック関数を提供します。 これらの関数は、低電力状態から復帰するデバイスの機能を有効または無効にするためにバス アダプターで必要な操作を行います。

デバイスのアイドル機能を制御するレジストリ エントリの詳細については、「デバイスのアイドル状態とスリープ解除動作のユーザー制御」を参照してください。