システムのスリープ解除のサポート
システムが低電力状態のとき、一部のデバイスでは、着信ネットワーク パケットなどの外部イベントを検出し、システムをスリープ解除することができます。たとえば、PCI デバイスが、デバイスの Power Management Capabilities (PMC) レジスタでの指定によってシステムのスリープ解除機能を備えている場合、そのデバイスは、PCI バス上で電源管理イベント (PME) 信号を生成することによって、システムのスリープ状態を解除します。
システム全体が低電力状態にあるときに、デバイスがシステムの低電力状態を解除できるようにするには、電源ポリシー所有者の EvtDriverDeviceAdd コールバック関数で、次の 2 つの手順を実行する必要があります。
WdfDeviceAssignSxWakeSettings を呼び出して次の事項を指定します。
- デバイスが移行する低電力状態
- ユーザーがデバイスのアイドル設定を制御できるようにするかどうか
- デバイスのスリープ解除機能を有効にするか無効にするか
これらの設定の詳細については、「WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS 構造体」(英語の可能性あり) を参照してください。
WdfDeviceInitSetPowerPolicyEventCallbacks を呼び出して、次のイベント コールバック関数のうちデバイスに必要なものを登録します。
- EvtDeviceArmWakeFromSx または EvtDeviceArmWakeFromSxWithReason: デバイスのハードウェアが外部のスリープ解除イベントに応答できるようにします。
- EvtDeviceDisarmWakeFromSx: 外部のスリープ解除イベントに応答するためのデバイスの機能を無効にします。
- EvtDeviceWakeFromSxTriggered: バスがスリープ解除信号を検出したことをドライバーに通知します。
システムのスリープ解除にはバス ドライバーも関係します。デバイスのバス ドライバーでは、通常、EvtDeviceEnableWakeAtBus および EvtDeviceDisableWakeAtBus の各コールバック関数を指定します。これらの関数は、低電力状態を解除するためのデバイスの機能を有効化および無効化するためにバス アダプターで必要となる、すべての処理を行います。
バス ドライバーは、デバイスがスリープ解除信号を生成したことを検出すると、WdfDeviceIndicateWakeStatus を呼び出して、デバイスの電源状態を元に戻す必要があることをフレームワークに通知する必要があります。これを受けてフレームワークは、この情報をドライバー スタック内の他のドライバーに渡します。
デバイスのスリープ解除機能を制御するレジストリ エントリについては、「デバイスのアイドル状態およびスリープ解除動作のユーザーによる制御」を参照してください。