Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
При переходе устройства на низкое состояние питания платформа отключает (или сообщает как неактивные) прерывания, используемые для обработки ввода-вывода. Начиная с KMDF 1.13 и UMDF 2.0, работающих на Windows 8.1, драйвер WDF может создать объект прерывания фреймворка, который остается активным при переходе устройства в состояние низкой мощности, а затем можно использовать для пробуждения устройства и восстановления его в полностью активное состояние D0.
Если вы разрабатываете драйвер WDF для платформы System on a Chip (SoC), можно использовать такое прерывание для пробуждения устройства, которое не предоставляет традиционный механизм сигнализации пробуждения. Чтобы использовать эту функциональность, устройство должно иметь аппаратную поддержку прерываний для выхода из сна, предоставляемую через ACPI. Драйвер, создающий прерывание, должен быть владельцем политики питания устройства.
Когда устройство переходит в состояние низкой мощности, фреймворк не отключает прерывание, определенное как способное к пробуждению. Когда устройство прерывается, фреймворк вызывает подпрограммы обратного вызова EvtDeviceD0Entry и EvtInterruptIsr при IRQL = PASSIVE_LEVEL.
Если драйвер уже создает объект прерывания пассивного уровня для обработки операций ввода-вывода , рекомендуется предоставлять общий доступ к одному объекту прерывания для функций пробуждения. В этом сценарии подпрограмма обратного вызова EvtInterruptIsr драйвера реализует условную логику для обработки прерываний, связанных с вводом-выводом, а также для управления пробуждением.
Однако если ваш драйвер использует прерывание, требующее обработки на IRQL устройства (DIRQL), рекомендуется создать дополнительный объект прерывания фреймворка для обеспечения функциональности пробуждения.
Выполните следующие действия, чтобы создать объект прерывания с возможностью пробуждения в драйвере KMDF или UMDF.
Вызовите WdfDeviceAssignS0IdleSettings, обычно из функции EvtDriverDeviceAdd, указав IdleCanWakeFromS0 в параметре IdleCaps.
При необходимости вызовите WdfDeviceInitSetPowerPolicyEventCallbacks для регистрации функций обратного вызова событий, описанных в разделе "Поддержка пробуждения системы".
Вызовите WDF_INTERRUPT_CONFIG_INIT для инициализации структуры WDF_INTERRUPT_CONFIG. Предоставьте функцию обратного вызова EvtInterruptIsr для вызова на пассивном уровне. В структуре конфигурации установите PassiveHandling и CanWakeDevice в TRUE. Затем вызовите WdfInterruptCreate из функции обратного вызова EvtDevicePrepareHardware драйвера, чтобы создать объект прерывания фреймворка.
Вызовите WdfDeviceAssignSxWakeSettings, чтобы настроить устройство для пробуждения системы из состояния низкой мощности.
WDF_DEVICE_POWER_POLICY_WAKE_SETTINGS_INIT(&wakeSettings); wakeSettings.DxState = PowerDeviceD3; wakeSettings.UserControlOfWakeSettings = WakeDoNotAllowUserControl; wakeSettings.Enabled = WdfTrue; status = WdfDeviceAssignSxWakeSettings(Device, &wakeSettings); if (!NT_SUCCESS(status)) { Trace(TRACE_LEVEL_ERROR,"WdfDeviceAssignSxWakeSettings failed %x\n", status); return status; }
Когда устройство переходит в состояние низкого энергопотребления, фреймворк не вызывает EvtInterruptDisable для прерывания, допускающего пробуждение. Платформа вызывает EvtDeviceArmWakeFromS0 , если драйвер предоставил его.
Когда устройство сигнализирует о прерывании пробуждения, платформа вызывает подпрограмму обратного вызова EvtDeviceD0Entry драйвера.
Если обратный вызов EvtDeviceD0Entry возвращается успешно, платформа вызывает обратный вызов EvtInterruptIsr драйвера на пассивном уровне. Перед возвратом обработчика прерываний необходимо отключить прерывание в контроллере прерываний. Если драйвер возвращает код сбоя из EvtDeviceD0Entry, платформа отключает прерывание и вызывает обратный вызов EvtInterruptDisable драйвера, если драйвер предоставил его.
Фреймворк вызывает следующие подпрограммы обратного вызова событий пробуждения, если драйвер предоставил их.
Фреймворк продолжает стандартную последовательность вызова при включении питания, как описано в разделеPower-Up Sequence for a Function or Filter Driver.
Расширение отладчика !wdfkd.wdfinterrupt можно использовать, чтобы показать, настроено ли конкретное прерывание для пробуждения.
Функции прерывания пробуждения нельзя использовать в сочетании с выборочной приостановкой USB.