使用中斷喚醒裝置
當裝置轉換成低電源狀態時,架構會中斷 (或報告為非使用中) 中斷,以供 I/O 處理使用。 從在 Windows 8.1 上執行的 KMDF 1.13 和 UMDF 2.0 開始,WDF 驅動程式可以建立架構中斷物件,在裝置轉換為低電源狀態時保持作用中,然後可用來喚醒裝置並將其還原到完全處於 D0 狀態。
如果您要在 Chip (SoC) 平臺上開發系統的 WDF 驅動程式,您可以使用這類中斷來喚醒未提供傳統喚醒訊號機制的裝置。 若要使用這項功能,裝置必須具備喚醒中斷的硬體支援,如透過 ACPI 公開。 建立中斷的驅動程式必須是裝置的電源原則擁有者。
當裝置轉換成低電源狀態時,架構不會中斷已識別為可喚醒的中斷中斷。 當裝置中斷時,架構會在 IRQL = PASSIVE_LEVEL呼叫驅動程式的 EvtDeviceD0Entry 和 EvtInterruptIsr 回呼常式。
如果您的驅動程式已經為 I/O 處理建立 被動層級中斷物件 ,建議您共用相同的中斷物件以取得喚醒功能。 在此案例中,驅動程式的 EvtInterruptIsr 回呼常式會實作條件式邏輯,以執行 I/O 相關中斷的處理,以及喚醒處理。
不過,如果您的驅動程式使用需要處理裝置 IRQL (DIRQL) 的中斷,建議您建立額外的架構中斷物件以提供喚醒功能。
請遵循下列步驟,在 KMDF 或 UMDF 驅動程式中建立具有喚醒功能的中斷物件:
呼叫WdfDeviceAssignS0IdleSettings,通常是從EvtDriverDeviceAdd,在IdleCaps參數中指定IdleCanWakeFromS0。
選擇性地呼叫 WdfDeviceInitSetPowerPolicyEventCallbacks 來註冊 支援系統喚醒中所述的事件回呼函式。
呼叫 WDF_INTERRUPT_CONFIG_INIT 以初始化 WDF_INTERRUPT_CONFIG 結構。 提供 EvtInterruptIsr 回呼函式,以在被動層級呼叫。 在組態結構中,將 PassiveHandling 和 CanWakeDevice 設定為 TRUE。 然後從驅動程式的EvtDevicePrepareHardware回呼函式呼叫WdfInterruptCreate,以建立架構中斷物件。
呼叫 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,架構會呼叫 EvtDeviceArmWakeFromS0 。
當裝置發出喚醒中斷訊號時,架構會呼叫驅動程式的 EvtDeviceD0Entry 回呼常式。
如果驅動程式的 EvtDeviceD0Entry 回呼傳回成功,架構會在被動層級呼叫驅動程式的 EvtInterruptIsr 回呼。 在中斷處理常式傳回之前,它必須在中斷控制器中將中斷靜音。 如果驅動程式從 EvtDeviceD0Entry傳回失敗碼,則架構會中斷中斷,並在驅動程式提供時呼叫驅動程式的 EvtInterruptDisable 回呼。
如果驅動程式已提供下列喚醒事件回呼常式,架構會呼叫下列喚醒事件回呼常式:
架構會繼續使用一般電源回呼順序,如 函式或篩選驅動程式的 Power-Up 序列中所述。
您可以使用 !wdfkd.wdfinterrupt 偵錯工具延伸模組來顯示特定中斷是否已設定為可喚醒。
喚醒中斷功能無法與 USB 選擇性暫停搭配使用。