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


Поддержка перехода в спящий режим в состоянии простоя

Некоторые устройства могут входить в состояние низкой мощности (Dx), пока система остается в состоянии работы (S0). Начиная с Windows 8 устройства могут переходить в состояние низкой функциональной мощности (Fx) до перехода в состояние Dx. Для таких устройств система инициирует снижение мощности устройства или компонента после нахождения в неактивном состоянии в течение определённого и настраиваемого времени.

Некоторые из этих устройств также могут активировать сигнал пробуждения на шине при обнаружении внешнего события. Драйвер шины отвечает на этот сигнал, и стек драйверов восстанавливает устройство в рабочее состояние. Устройства, которые не обнаруживают внешние события, остаются в состоянии низкого энергопотребления, пока платформа не попросит драйвер шины инициировать перевод устройства в рабочее состояние.

Если устройство или компонент могут быть отключены при простое, функция обратного вызова EvtDriverDeviceAdd в владельце политики электропитания должна выполнить следующие два шага:

  1. Вызовите WdfDeviceAssignS0IdleSettings, чтобы указать:

    • Состояние низкой мощности, в которое будет входить устройство
    • Время, когда устройство должно оставаться бездействующим до снижения состояния питания.
    • Способно ли устройство обнаружить внешнее событие и активировать сигнал пробуждения на шине
    • Могут ли пользователи управлять параметрами простоя устройства
    • Включена или отключена возможность отключения питания устройства в режиме простоя
    • Возвращается ли устройство к рабочему состоянию (D0), когда система возвращается к рабочему состоянию (S0)
    • Определяется ли значение времени ожидания простоя для устройства платформой управления питанием (PoFx)
    • Может ли фреймворк поместить устройство в состояние питания D3cold по истечении времени ожидания простоя

    Дополнительные сведения об этих параметрах см. в структуре WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS, а также в разделе «Поддержка функциональных состояний питания».

  2. Вызовите WdfDeviceInitSetPowerPolicyEventCallbacks, чтобы зарегистрировать следующие функции обратного вызова событий, если они необходимы для вашего устройства.

    • EvtDeviceArmWakeFromS0, что позволяет оборудованию устройства (а не шине) реагировать на внешнее событие пробуждения.
    • EvtDeviceDisarmWakeFromS0, что отключает способность устройства (а не способность шины) реагировать на внешнее событие пробуждения
    • EvtDeviceWakeFromS0Triggered, который сообщает водителю, что автобус обнаружил сигнал пробуждения.

Условия простоя

Платформа считает устройство бездействующим и начинает подсчет времени простоя, когда выполняются все следующие условия:

  • Ни одна из управляемых питанием очередей, созданных для этого экземпляра устройства, не имеет запросов, ожидающих в очереди или отправленных к драйверу. Если запрос был отправлен драйверу, а драйвер отправил его в целевой объект ввода-вывода, запрос по-прежнему связан с очередью. Устройство не будет считаться в режиме ожидания, если драйвер не использовал опцию «отправить и забыть» для отправки запроса. Запросы в очередях без управления питанием не учитываются в отношении простоя устройства.
  • Если драйвер ранее вызвал WdfDeviceStopIdle, то впоследствии он вызвал WdfDeviceResumeIdle.
  • Если владелец политики питания является драйвером шины, ни одно из дочерних устройств драйвера шины не находится в D0.

Если драйвер (или пользователь) включает отключение питания для устройства, возможно, потребуется использовать метод WdfDeviceStopIdle. Если устройство находится в состоянии работы (D0), этот метод предотвращает его переход в режим ожидания до тех пор, пока драйвер не вызовет WdfDeviceResumeIdle. Если устройство находится в состоянии низкой мощности, когда драйвер вызывает WdfDeviceStopIdle, и если система находится в состоянии работы (S0), платформа запрашивает драйвер шины восстановить устройство в рабочее состояние (D0). Каждый успешный вызов WdfDeviceStopIdle должен соответствовать вызову WdfDeviceResumeIdle. Сведения о просмотре количества ссылок на питание в отладчике см. в разделе Отладка утечек ссылок на питание в WDF.

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

Если устройство может проснуться из состояния низкой мощности, драйвер шины устройства участвует в пробуждении устройства. Драйвер автобуса обычно предоставляет функции обратного вызова EvtDeviceEnableWakeAtBus и EvtDeviceDisableWakeAtBus. Эти функции выполняют все необходимые действия на адаптере шины для включения и отключения возможности устройства пробуждаться от состояния низкого энергопотребления.

Сведения о записях реестра, которые управляют возможностями простоя устройства, см. в разделе Пользовательское управление простоем устройства и поведение пробуждения.