Поддержка Power-Down бездействия на устройствах Multiple-Component
[Относится только к KMDF]
Драйвер KMDF для многокомпонентного устройства может поддерживать режим простоя и режим работы питания. Так как в этом случае драйвер регистрируется непосредственно в платформе управления питанием (PoFx), драйвер должен координировать результирующее изменение состояния Dx с Помощью PoFx.
Предоставление параметров простоя политики питания устройства
При вызове WdfDeviceAssignS0IdleSettings драйвер должен присвоить idleTimeoutType значение DriverManagedIdleTimeout в структуре WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS . Кроме того, драйвер должен задать для 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 , чтобы получить ссылку на питание, которая не позволяет WDF перевести устройство в состояние с низким энергопотреблением.
Драйвер освобождает ссылку на питание, вызывая WdfDeviceResumeIdle из процедуры обратного вызова DevicePowerRequiredCallback .
Драйвер обычно задает очень короткое время ожидания простоя, чтобы WDF переводит устройство в состояние с низким энергопотреблением вскоре после освобождения всех ссылок на питание.
Переход из Low-Power (Dx) в рабочее (D0) состояние
В DevicePowerRequiredCallback драйвер должен перевести устройство в рабочее состояние (D0). Для этого необходимо отложить вызов WdfDeviceStopIdle в рабочем потоке с параметром WaitForD0, равным TRUE. Этот блокирующий вызов WdfDeviceStopIdleне должен выполняться из DevicePowerRequiredCallback.
Вместо этого драйвер должен отложить вызов блокировки рабочему потоку, который выполняется на пассивном уровне и гарантированно не будет выполнять вызов WdfDeviceStopIdle в контексте подпрограммы диспетчеризации ввода-вывода очереди, управляемой питанием.
Если драйвер ранее вызывал WdfDeviceInitSetPowerPageable (то есть он может получать доступ к страничным данным во время перехода питания), драйвер может вызвать WdfWorkItemCreate , чтобы создать рабочий элемент платформы. Если драйвер не задал power-pageable, драйвер должен создать собственный системный поток. Дополнительные сведения см. в разделе PsCreateSystemThread.
После возврата WdfDeviceStopIdle , даже если метод возвращает ошибку, драйвер должен вызвать PoFxReportDevicePoweredOn.