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


Использование подпрограмм Power Manager для обнаружения простоя

Диспетчер питания обеспечивает поддержку обнаружения бездействия с помощью подпрограмм PoRegisterDeviceForIdleDetection и PoSetDeviceBusy .

Чтобы включить обнаружение бездействия для своего устройства, владелец политики питания устройства вызывает PoRegisterDeviceForIdleDetection и указывает:

  • Значение времени ожидания простоя, применяемое при оптимизации производительности системы.

  • Значение времени ожидания простоя, применяемое при оптимизации системы для сохранения.

  • Состояние питания устройства, в которое устройство должно переходить при простое.

PoRegisterDeviceForIdleDetection возвращает указатель на счетчик простоя, который драйвер использует позже для отключения обнаружения бездействия. Вызывающие функции PoRegisterDeviceForIdleDetection должны выполняться на DISPATCH_LEVEL IRQL < .

Драйвер может зарегистрировать свое устройство для обнаружения бездействия в любое время после запуска устройства и готов к обработке irP питания устройства. Например, драйвер может включить обнаружение бездействия в рамках своей процедуры IoCompletion для PnP start-device IRP.

Значения времени ожидания для любого конкретного устройства должны быть пропорциональны задержке выключения устройства и зависеть от наблюдаемого поведения устройства. Для устройств определенных типов драйвер может указать значения времени ожидания сохранения и производительности –1, чтобы использовать стандартные тайм-ауты политики питания для класса устройства. Дополнительные сведения см. в документации по устройствам.

Когда устройство используется, драйвер должен вызвать PoSetDeviceBusy, передав указатель, возвращенный PoRegisterDeviceForIdleDetection. PoSetDeviceBusy сбрасывает счетчик простоя, перезапуская таким образом обратный отсчет простоя для устройства. Драйвер должен вызывать PoSetDeviceBusy при каждой операции ввода-вывода.

Чтобы определить, находится ли устройство в режиме простоя, диспетчер питания сравнивает значение счетчика простоя с заданным драйвером значением времени ожидания для текущей политики питания системы (сохранение или производительность). Функции, относящиеся к системной политике управления питанием, см. в Microsoft Windows SDK.

Когда устройство удовлетворяет значению времени ожидания, диспетчер питания отправляет IRP набора питания устройства, указывая состояние питания устройства, которое драйвер передал в своем вызове PoRegisterDeviceForIdleDetection. Диспетчер управления питанием не отправляет запрос IRP перед отправкой IRP set-power. Драйверы в стеке обрабатывают IRP set-power так же, как и любые другие; они должны завершить его своевременно, и они не могут его завершить. (См. раздел Обработка Power-Down irP устройства.)

Если драйвер больше не требует определения простоя или не готов к обработке irps выключения устройства, он должен снова вызвать PoRegisterDeviceForIdleDetection , передав ноль для обоих значений времени ожидания. Установка нулевого времени ожидания отключает обнаружение простоя как для политик экономии (батареи), так и для политик питания производительности (переменного тока). Драйвер может быстро повторно включит обнаружение простоя; он просто вызывает PoRegisterDeviceForIdleDetection с ненулевыми значениями времени ожидания. После регистрации устройства драйвер может включить и отключить обнаружение бездействия, изменив значения времени ожидания, даже если устройство было выключено и снова разбудилось.