Сюрприз Wake-Up

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

Когда устройство перемещается с D3hot на D3cold, это, вероятно, делает это, потому что источник питания, который он использует для некоторых других устройств, был отключен. Через некоторое время после ввода этих устройств D3cold драйвер для одного из устройств может запросить переход на D0. В ответ на этот запрос драйвер родительской шины или драйвер фильтра ACPI включает источник питания, а все устройства, которые совместно используют источник питания, вводят состояния оборудования по умолчанию.

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

При включении устройства оно переходит в состояние оборудования по умолчанию, которое неинициализировано. Например, спецификация PCI Express Base 3.0 определяет неинициализированное состояние D0 , которое устройство вводит при первом получении питания. Определение этого состояния специфично для устройств PCI и PCI Express, но устройства, подключающиеся к другим шинам, предназначены для перехода в аналогичные аппаратные состояния при включении.

В случае устройства PCI или PCI Express, реализующего несколько функций, эти функции устройства, вероятно, используют одну и ту же линию электропитания. Однако каждая функция может иметь отдельный драйвер, и драйверы для этих функций вряд ли взаимодействуют напрямую друг с другом. Когда драйвер для одной из этих функций запрашивает изменение состояния питания с D3cold на D0, драйверы для других функций не ожидают этого изменения. Когда эти другие функции получают мощность, их драйверы должны быть уведомлены, чтобы они могли настроить функции для правильной работы в D0.

Драйвер шины обнаруживает, когда включается питание дочернего устройства. Если драйвер функции этого устройства не запрашивал переход на D0, драйвер шины предложит драйверу устройства отправить себе D0 power IRP ( запрос IRP_MN_SET_POWER с целевым состоянием = PowerDeviceD0), чтобы инициализировать устройство для работы в D0. В этом инициализированном состоянии D0 драйвер устройства может инициировать переход устройства на D3hot. Водители устройств могут получать уведомления о неожиданных переходах на D0 от водителей автобусов следующим образом:

  • Драйверы устройств, которые напрямую или косвенно регистрируют себя в качестве клиентов платформы управления питанием во время выполнения (PoFx), получают уведомления об обратных вызовах.
  • Драйверы устройств, которые подготавливают свои устройства для пробуждения, имеют их ожидающие запросы IRP_MN_WAIT_WAKE, обрабатываемые драйверами шины.

Начиная с Windows 8 драйвер функции устройства, который выступает в качестве владельца политики питания, может зарегистрировать себя в качестве клиента PoFx. Когда водитель шины уведомляет PoFx о том, что устройство испытало неожиданное переключение на D0, PoFx помогает устройству перейти в инициализированное состояние D0, а затем в D3hot. Во-первых, PoFx вызывает подпрограмму DevicePowerRequiredCallback драйвера, чтобы инициировать отправку D0-power IRP по стеку устройств. Затем PoFx вызывает подпрограмму DevicePowerNotRequiredCallback драйвера, чтобы уведомить драйвер устройства о том, что устройство не требуется оставаться в состоянии D0.

Начиная с Kernel-Mode Driver Framework (KMDF) версии 1.11 драйвер KMDF для устройства с одним компонентом может косвенно зарегистрировать себя в PoFx, вызвав метод WdfDeviceWdmAssignPowerFrameworkSettings . В этом вызове драйвер предоставляет указатели на процедуры обратного вызова, которые уведомляют драйвер о неожиданных переходах в состояние D0. Дополнительные сведения см. в разделе поддержки функциональных состояний power states.

Драйвер, который не регистрирует свое устройство с помощью PoFx, все равно может быть уведомлен о неожиданном переходе в D0, если устройство настроено для пробуждения. Когда водители автобуса включите питание на устройство, они завершают запрос IRP_MN_WAIT_WAKE водителя. В ответ драйвер инициализирует свое устройство для работы в D0. Устройство, скорее всего, неактивно, в этом случае драйвер, через некоторое время, переместит это устройство в D3hot.

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