次の方法で共有


複数コンポーネント デバイスでのアイドル電源切断のサポート

[KMDF にのみ適用]

複数コンポーネント デバイスの KMDF ドライバーは、アイドル電源切断と機能電源状態をサポートできます。 この場合、ドライバーは電源管理フレームワーク (PoFx) に直接登録するため、ドライバーは、結果として得られる Dx 状態の変更を PoFx と調整する必要があります。

デバイス電源ポリシーのアイドル設定の提供

WdfDeviceAssignS0IdleSettings を呼び出す場合、ドライバーは、WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 構造体で IdleTimeoutTypeDriverManagedIdleTimeout に設定する必要があります。 さらに、次の例に示すように、ドライバーは PowerUpIdleDeviceOnSystemWakeWdfTrue に、IdleCapsIdleCannotWakeFromS0 に設定する必要があります。

WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS s0IdleSettings;

WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&s0IdleSettings, 
                                           IdleCannotWakeFromS0);
s0IdleSettings.IdleTimeoutType = DriverManagedIdleTimeout;
s0IdleSettings.PowerUpIdleDeviceOnSystemWake = WdfTrue;
s0IdleSettings.IdleTimeout = 1;
status = WdfDeviceAssignS0IdleSettings(device, &s0IdleSettings);

動作 (D0) から 低電力 (Dx) 状態への移行

EvtDeviceSelfManagedIoInit では、ドライバーは WdfDeviceStopIdle を呼び出して電源リファレンスを取得し、WDF がデバイスを低電力状態にすることを防ぎます。

ドライバーは、その DevicePowerRequiredCallback コールバック ルーチンから WdfDeviceResumeIdle を呼び出すことによって電源リファレンスを解放します。

ドライバーは通常、非常に短いアイドル タイムアウトを指定します。これにより、WDF は、すべての電源リファレンスが解放された直後にデバイスを低電力状態にします。

低電力 (Dx) から動作 (D0) 状態への移行

DevicePowerRequiredCallback では、ドライバーはデバイスを動作 (D0) 状態にする必要があります。 そのためには、WaitForD0 パラメーターを TRUE に設定して WdfDeviceStopIdle の呼び出しをワーカー スレッドに延期する必要があります。 WdfDeviceStopIdle へのこのブロッキング呼び出しは、DevicePowerRequiredCallback 内から行わないでください。

代わりに、ドライバーは、パッシブ レベルで実行されていて、電源管理キューの I/O ディスパッチ ルーチンのコンテキストで WdfDeviceStopIdle 呼び出しを行わないことが保証されているワーカー スレッドに、ブロック呼び出しを延期する必要があります。

ドライバーが以前に WdfDeviceInitSetPowerPageable を呼び出した場合 (つまり、電源切り替え中にページング可能なデータにアクセスできる)、ドライバーは WdfWorkItemCreate を呼び出してフレームワーク作業項目を作成できます。 ドライバーが電源ページング可能機能を設定していない場合、ドライバーは独自のシステム スレッドを作成する必要があります。 詳細については、「PsCreateSystemThread」を参照してください。

WdfDeviceStopIdle が返された後、メソッドがエラーを返した場合でも、ドライバーは PoFxReportDevicePoweredOn を呼び出す必要があります。