Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
[Применимо только к 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.