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. Дополнительные сведения см. в разделе Поддержка функциональных состояний питания.
Драйвер, который не регистрирует свое устройство в PoFx, по-прежнему может получать уведомления о неожиданном переходе на D0, если устройство вооружается для пробуждения. Когда водители автобуса включат питание устройства, они выполняют запрос IRP_MN_WAIT_WAKE водителя. В ответ драйвер инициализирует свое устройство для работы в D0. Скорее всего, устройство будет простаивать. В этом случае драйвер через некоторое время переместит это устройство в D3hot.
Драйвер функции, который не регистрируется в PoFx и не вооружает свое устройство для пробуждения, не получает уведомления о неожиданном переходе с D3cold на D0. Устройство может тратить большое количество времени в неинициализированном состоянии D0. В этом состоянии все компоненты на устройстве обычно включены. Чтобы снизить энергопотребление неактивными устройствами, драйверы должны включать вход в D3cold только в том случае, если они могут получать уведомления о неожиданных переходах в D0.