Поделиться через


Поддержка простоя Power-Down на устройствах Multiple-Component

[Применимо только к KMDF]

Драйвер KMDF для устройства с несколькими компонентами может поддерживать переход в ждущий режим и функциональные состояния питания. Так как в этом случае драйвер регистрируется непосредственно в платформе управления питанием (PoFx), драйвер должен координировать полученные изменения состояния Dx с помощью PoFx.

Предоставление параметров простоя политики питания устройства

При вызове WdfDeviceAssignS0IdleSettingsдрайвер должен задать в структуре WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS для IdleTimeoutType значение DriverManagedIdleTimeout. Кроме того, драйвер должен задать PowerUpIdleDeviceOnSystemWake значение WdfTrue, а также IdleCaps значение IdleCannotWakeFromS0, как показано в следующем примере.

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) на состояние Low-Power (Dx)

В EvtDeviceSelfManagedIoInitдрайвер вызывает WdfDeviceStopIdle, чтобы удерживать ссылку на питание, что предотвращает перевод устройства в режим низкого энергопотребления.

Драйвер освобождает ссылку на питание путем вызова WdfDeviceResumeIdle из своей процедуры обратного вызова DevicePowerRequiredCallback.

Драйвер обычно задает очень короткий тайм-аут простоя, чтобы WDF перевёл устройство в режим пониженного энергопотребления сразу после освобождения всех ссылок на питание.

Переход с Low-Power (Dx) на рабочее (D0) состояние

В DevicePowerRequiredCallbackдрайвер должен перевести устройство в рабочее состояние (D0). Для этого необходимо делегировать вызов WdfDeviceStopIdle рабочему потоку с параметром WaitForD0, установленным в TRUE. Этот блокирующий вызов WdfDeviceStopIdle не должен вызываться внутри DevicePowerRequiredCallback.

Вместо этого драйвер должен отложить блокирующий вызов рабочему потоку, который работает на пассивном уровне и гарантированно не выполняет вызов WdfDeviceStopIdle в контексте управляемой питанием очереди подпрограммы отправки ввода-вывода.

Если драйвер ранее вызвал WdfDeviceInitSetPowerPageable (то есть он может получить доступ к страничным данным во время переходов питания), драйвер может вызвать WdfWorkItemCreate для создания рабочего элемента фреймворка. Если драйвер не установил power-pageable, драйвер должен создать собственный системный поток. Дополнительные сведения см. в разделе PsCreateSystemThread.

После того как WdfDeviceStopIdle вернёт управление, даже если метод возвращает ошибку, драйвер должен вызвать PoFxReportDevicePoweredOn.