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


Поддержка 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.