共用方式為


使用中斷將裝置喚醒

當裝置轉換成低功率狀態時,架構會中斷用於I/O處理的中斷(或報告為非作用中)。 從 KMDF 1.13 和 UMDF 2.0 開始在 Windows 8.1 上運行,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

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

  7. 如果驅動程式的 EvtDeviceD0Entry 回呼傳回成功,架構會在被動層級呼叫驅動程式的 EvtInterruptIsr 回呼。 在中斷處理程序返回之前,必須將中斷控制器中的中斷禁用。 如果驅動程式從 EvtDeviceD0Entry 傳回失敗碼,架構會中斷中斷連線,並在驅動程式提供了此回呼的情況下呼叫驅動程式的 EvtInterruptDisable 回呼。

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

  9. 框架會繼續執行正常的開機回呼序列,如函數或篩選驅動程式的Power-Up序列中所述。

您可以使用 !wdfkd.wdfinterrupt 偵錯工具擴充功能來顯示特定中斷是否已設定為支持喚醒功能。

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