共用方式為


支援具有單一或多個功能電源狀態的 Single-Component 裝置

單一元件裝置的 KMDF 驅動程式可以定義元件的一或多個功能電源狀態,並在元件之 Fx 狀態變更或其作用中/閑置條件變更時註冊電源管理架構 (PoFx) 所呼叫的回呼函式。 從UMDF 2.0版開始,單一元件裝置的UMDF驅動程式可以定義單一功能電源狀態 (F0)。

如需PoFx的詳細資訊,請參閱 電源管理框架概觀

若要實作單一元件裝置的 Fx 狀態支援,您必須在裝置第一次啟動之前或期間依序執行下列動作。

  1. 此步驟僅適用於 KMDF 驅動程式。 呼叫 WdfDeviceWdmAssignPowerFrameworkSettings 以指定 WDF 在向 PoFx 註冊時所使用的 Power Framework 設定。 驅動程式在呼叫 WdfDeviceWdmAssignPowerFrameworkSettings 時,可以在提供的 WDF_POWER_FRAMEWORK_SETTINGS 結構中提供指向數個回呼函式的指標。 如果驅動程式只支援單一功能電源狀態 (F0),則此步驟是選擇性的。

  2. 此步驟適用於 KMDF 驅動程式和 UMDF 驅動程式。 調用 WdfDeviceAssignS0IdleSettings 並將 IdleTimeoutType 欄位設定為 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 結構中的 SystemManagedIdleTimeoutSystemManagedIdleTimeoutWithHint。 這樣做會導致 WDF 向 PoFx 註冊。

    若為 KMDF 驅動程式,在向 PoFx 註冊時,框架會使用驅動程式在呼叫 WdfDeviceWdmAssignPowerFrameworkSettings 時所提供的 WDF_POWER_FRAMEWORK_SETTINGS 資訊。

因為裝置可能會多次重新啟動,例如在資源重新分配的情況下,驅動程式可能會在 EvtDeviceSelfManagedIoInit 回呼函式中執行先前的步驟。 如果驅動程式已註冊 EvtDeviceSelfManagedIoInit 回呼函式,則架構會在首次呼叫驅動程式的 EvtDeviceD0Entry 回呼函式之後,為每個裝置呼叫它一次。

本主題中其餘的資訊僅適用於 KMDF 驅動程式。

啟動電源

當驅動程式呼叫 WdfDeviceWdmAssignPowerFrameworkSettings 時,它可以提供一個指向 EvtDeviceWdmPostPoFxRegisterDevice 回呼函式的指標。

框架在向 PoFx 註冊之後,會呼叫驅動程式的 EvtDeviceWdmPostPoFxRegisterDevice 回呼函式。 以下是一般啟動序列的範例:

  1. EvtDevicePrepareHardware
  2. EvtDeviceD0Entry(PrevState, WdfPowerDeviceD3Final)
  3. #B0 #A1 EvtInterruptEnable #A2 #C3
  4. #B0 #A1 EvtDeviceWdmPostPoFxRegisterDevice #A2 #C3 - PoFx 句柄已可用

驅動程式會提供EvtDeviceWdmPostPoFxRegisterDevice回呼,如果必須使用 POHANDLE 來執行任何額外作業,以註冊電源框架。 例如,它可以指定延遲、駐留和喚醒需求。 如需有關使用 POHANDLE 的常式的詳細資訊,請參閱 裝置電源管理常式

您的驅動程式也可以使用 POHANDLE 與 PoFx 交換電源控制要求:

  • 若要將電源控制要求傳送至 PoFx,驅動程式需提供 EvtDeviceWdmPostPoFxRegisterDevice 回呼函式,然後使用所得的 POHANDLE 來呼叫 PoFxPowerControl。
  • 為了執行 PoFx 所要求的電源控制作業,驅動程式在其 WDF_POWER_FRAMEWORK_SETTINGS 結構中提供 PowerControlCallback 回呼程序。

關閉電源

WDF 會先呼叫 EvtDeviceWdmPrePoFxUnregisterDevice 回呼函式,然後再刪除與 PoFx 的特定註冊。

驅動程式可以在 WDF_POWER_FRAMEWORK_SETTINGS 結構中提供 ComponentIdleStateCallback 例程的指標,這是提供給 WdfDeviceWdmAssignPowerFrameworkSettings 使用的。 PoFx 會呼叫此例程,通知驅動程式對指定元件的 Fx 電源狀態進行擱置變更。 在此回呼例程中,驅動程式可以執行與功能狀態變更相關的硬體特定作業。

例如,將元件轉換成低功率 Fx 狀態之前,驅動程式可能會儲存硬體狀態並停用中斷和 DMA。 驅動程式會呼叫 WdfInterruptReportInactive,通知系統中斷不再作用中。 在 F 狀態轉換期間關閉中斷可能會降低整體系統耗電量。

驅動程式也可以在其 WDF_POWER_FRAMEWORK_SETTINGS 結構中提供指向 ComponentIdleConditionCallback 例程的指標。 PoFx 會呼叫此例程,以通知驅動程式元件已變成閑置狀態。 在此例程中,驅動程式會開始停止其電源管理的佇列和自我管理的 I/O 作業:

  1. 針對每個裝置的電源受控佇列,各呼叫一次 WdfIoQueueStop。 在每次呼叫WdfIoQueueStop時,提供一個EvtIoQueueState回呼函式。 一般而言,驅動程式會從 ComponentIdleConditionCallback 內呼叫 WdfIoQueueStop

  2. 請確保從每個電源管理佇列分派至驅動程式的請求能夠迅速完成。 視驅動程式而定,這可能涉及下列部分或全部:

    • 如果驅動程式未長時間保留要求,並且不會將其轉送至會這樣做的 I/O 目標,請繼續執行步驟 3。
    • 如果驅動程式保留特定要求一段較長時間,請將這些要求重新排入手動佇列。 在 #B0 #A1 ComponentActiveConditionCallback #A2 #C3 常式中,驅動程序接著可以擷取要求。
    • 如果驅動程式將特定要求轉送到一個長時間保留這些要求的 I/O 目標,請取消這些要求。 在 ComponentActiveConditionCallback 中重新提交請求。
  3. 當每個佇列都停止時,架構會呼叫 EvtIoQueueState。 如果驅動程式停止多個電源受控佇列,架構會對每個佇列多次呼叫 EvtIoQueueState。

    驅動程式必須在呼叫最後一個 EvtIoQueueState 函式之後,呼叫 PoFxCompleteIdleCondition。 例如,驅動程式可以從最後一個 EvtIoQueueState 進行此呼叫。

    為了確定哪一次呼叫是最後的,驅動程式可能會使用計數器來追蹤框架所呼叫 EvtIoQueueState 的次數。 Singlecomp 範例說明這項技術。 此範例從 Windows 8 WDK 開始提供。

以下是一般關閉電源序列的範例:

  1. ComponentIdleConditionCallback
  2. ComponentIdleStateCallback
  3. EvtInterruptDisable
  4. EvtDeviceD0Exit

在 ComponentActiveConditionCallback 中重新啟動電源管理的佇列和自我管理的 I/O 作業。

如果驅動程式先前已呼叫 WdfInterruptReportInactive,請在 ComponentActiveConditionCallbackComponentIdleStateCallback 中呼叫 WdfInterruptReportActive,以重新啟用非作用中的中斷。