使用中斷喚醒裝置

當裝置轉換成低電源狀態時,架構會中斷 (或報告為非使用中) 中斷,以供 I/O 處理使用。 從在 Windows 8.1 上執行的 KMDF 1.13 和 UMDF 2.0 開始,WDF 驅動程式可以建立架構中斷物件,在裝置轉換為低電源狀態時保持作用中,然後可用來喚醒裝置並將其還原到完全處於 D0 狀態。

如果您要在 Chip (SoC) 平臺上開發系統的 WDF 驅動程式,您可以使用這類中斷來喚醒未提供傳統喚醒訊號機制的裝置。 若要使用這項功能,裝置必須具備喚醒中斷的硬體支援,如透過 ACPI 公開。 建立中斷的驅動程式必須是裝置的電源原則擁有者。

當裝置轉換成低電源狀態時,架構不會中斷已識別為可喚醒的中斷中斷。 當裝置中斷時,架構會在 IRQL = PASSIVE_LEVEL呼叫驅動程式的 EvtDeviceD0EntryEvtInterruptIsr 回呼常式。

如果您的驅動程式已經為 I/O 處理建立 被動層級中斷物件 ,建議您共用相同的中斷物件以取得喚醒功能。 在此案例中,驅動程式的 EvtInterruptIsr 回呼常式會實作條件式邏輯,以執行 I/O 相關中斷的處理,以及喚醒處理。

不過,如果您的驅動程式使用需要處理裝置 IRQL (DIRQL) 的中斷,建議您建立額外的架構中斷物件以提供喚醒功能。

請遵循下列步驟,在 KMDF 或 UMDF 驅動程式中建立具有喚醒功能的中斷物件:

  1. 呼叫WdfDeviceAssignS0IdleSettings,通常是從EvtDriverDeviceAdd,在IdleCaps參數中指定IdleCanWakeFromS0

  2. 選擇性地呼叫 WdfDeviceInitSetPowerPolicyEventCallbacks 來註冊 支援系統喚醒中所述的事件回呼函式。

  3. 呼叫 WDF_INTERRUPT_CONFIG_INIT 以初始化 WDF_INTERRUPT_CONFIG 結構。 提供 EvtInterruptIsr 回呼函式,以在被動層級呼叫。 在組態結構中,將 PassiveHandlingCanWakeDevice 設定為 TRUE。 然後從驅動程式的EvtDevicePrepareHardware回呼函式呼叫WdfInterruptCreate,以建立架構中斷物件。

  4. 呼叫 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;
    }
    
  5. 當裝置轉換為低電源狀態時,架構不會呼叫 EvtInterruptDisable 進行喚醒功能中斷。 如果驅動程式已提供 EvtDeviceArmWakeFromS0,架構會呼叫 EvtDeviceArmWakeFromS0

  6. 當裝置發出喚醒中斷訊號時,架構會呼叫驅動程式的 EvtDeviceD0Entry 回呼常式。

  7. 如果驅動程式的 EvtDeviceD0Entry 回呼傳回成功,架構會在被動層級呼叫驅動程式的 EvtInterruptIsr 回呼。 在中斷處理常式傳回之前,它必須在中斷控制器中將中斷靜音。 如果驅動程式從 EvtDeviceD0Entry傳回失敗碼,則架構會中斷中斷,並在驅動程式提供時呼叫驅動程式的 EvtInterruptDisable 回呼。

  8. 如果驅動程式已提供下列喚醒事件回呼常式,架構會呼叫下列喚醒事件回呼常式:

  9. 架構會繼續使用一般電源回呼順序,如 函式或篩選驅動程式的 Power-Up 序列中所述。

您可以使用 !wdfkd.wdfinterrupt 偵錯工具延伸模組來顯示特定中斷是否已設定為可喚醒。

喚醒中斷功能無法與 USB 選擇性暫停搭配使用。