予期しないウェイクアップは、D0 への予期しない移行です。 デバイスが D3cold に入った後で、同じ電源レール上の別のデバイスのドライバーが D3cold から D0 への移行を要求すると、副作用として予期しないウェイクアップが発生する可能性があります。 最初のデバイスのドライバーは、初期化されていないデバイスがD0 状態を維持しないようにするため、予期しないウェイクアップの通知を受け取る必要があります。
デバイスが D3hot から D3cold に移行すると、他のいくつかのデバイスと共有する電源がオフになっている可能性があります。 これらのデバイスが D3cold に入ってからしばらくすると、いずれかのデバイスのドライバーが D0 への移行を要求する場合があります。 この要求に応じて、親バス ドライバーまたは ACPI フィルター ドライバーが電源をオンにし、電源を共有するすべてのデバイスは、既定の電源オン ハードウェアの状態を入力します。
この電源状態の変更を想定している唯一のデバイス ドライバーは、変更を要求したドライバーです。 他のデバイスのドライバーは、D0 で動作するようにデバイスを適切に初期化できるように、この変更の通知を受け取る必要があります。 この通知を受け取ることができるドライバーのみが、デバイスで D3cold を入力できるようにする必要があります。 それ以外の場合、ドライバーは、デバイスが D0 に入ったときに認識されません。
デバイスがオンになると、既定の初期化されていないハードウェア状態になります。 たとえば、PCI Express Base 3.0 仕様では、デバイスが最初に電源を受け取ったときに入力する D0 初期化されていない状態が定義されています。 この状態の定義は PCI および PCI Express デバイスに固有ですが、他のバスに接続するデバイスは、電源が入ったときに同様のハードウェア状態を入力するように設計されています。
複数の機能を実装する PCI または PCI Express デバイスの場合、これらのデバイス機能は同じ電源レールを共有している可能性があります。 ただし、各関数には個別のドライバーがあり、これらの関数のドライバーが互いに直接通信する可能性はほとんどありません。 これらの関数のドライバーが D3cold から D0 のいずれかの電源状態の変更を要求する場合、他の関数のドライバーはこの変更を想定していません。 これらの他の関数が電源を受け取ったら、D0 で正常に動作するように関数を構成できるように、ドライバーに通知する必要があります。
バス ドライバーは、子デバイスの電源がオンになっていることを検出します。 このデバイスのファンクション ドライバーが D0 への移行を要求しなかった場合、バス ドライバーは、D0 で動作するようにデバイスを初期化する D0 電源 IRP (ターゲット状態 = PowerDeviceD0 の IRP_MN_Standard Edition T_POWER 要求) を自身に送信するようにデバイス ドライバーに求めます。 この初期化された D0 状態から、デバイス ドライバーはデバイスの D3hot への移行を開始できます。 デバイス ドライバーは、次の方法でバス ドライバーから D0 への予期しない移行の通知を受け取ることができます。
- ランタイム電源管理フレームワーク (PoFx) のクライアントとして直接または間接的に自身を登録するデバイス ドライバーは、通知コールバックを受け取ります。
- ウェイクのためにデバイスを準備しているデバイスのドライバーには、バス ドライバーによって完了した保留中 の IRP_MN_WAIT_WAKE 要求があります。
Windows 8 以降、電源ポリシー所有者として機能するデバイスのファンクション ドライバーは、PoFx のクライアントとして自身を登録できます。 デバイスが D0 への予期しない移行を経験したことをバス ドライバーが PoFx に通知すると、PoFx はデバイスが初期化された D0 状態に移行し、次に D3hot に移行するのに役立ちます。 まず、PoFx は、D0 電源 IRP をデバイス スタックに送信するようにデバイス ドライバーに求めるドライバーの DevicePowerRequiredCallback ルーチンを呼び出します。 次に、PoFx はドライバーの DevicePowerNotRequiredCallback ルーチンを呼び出して、デバイスが D0 状態を維持する必要がないことをデバイス ドライバーに通知します。
カーネル モード ドライバー フレームワーク (KMDF) バージョン 1.11 以降では、単一コンポーネント デバイスの KMDF ドライバーは、WdfDeviceWdmAssignPowerFrameworkSettings メソッドを呼び出すことによって、PoFx に間接的に自身を登録できます。 この呼び出しでは、ドライバーは、D0 への予期しない移行をドライバーに通知するコールバック ルーチンへのポインターを提供します。 詳細については、機能的な電源状態のサポートを参照してください。
デバイスを PoFx に登録していないドライバーは、デバイスがウェイクのために準備している場合、D0 への予期しない移行を通知できます。 バス ドライバーは、デバイスの電源をオンにすると、ドライバーの IRP_MN_WAIT_WAKE 要求を完了します。 これに対して、ドライバーは D0 で動作するようにデバイスを初期化します。 デバイスはアイドル状態である可能性が高く、その場合、ドライバーはしばらくすると、このデバイスを D3hot に移動します。
PoFx に登録せず、デバイスがウェイクの準備をしていないファンクション ドライバーは、D3cold から D0 への予期しない移行の通知を受け取りません。 デバイスは、初期化されていない D0 状態で大量の時間を費やす可能性があります。 この状態では、通常、デバイス内のすべてのコンポーネントがオンになります。 アイドル状態のデバイスによる電力消費量を削減するには、ドライバーは、D0 への予期しない移行の通知を受信できる場合にのみ、D3cold へのエントリを有効にする必要があります。