單一元件裝置的 KMDF 驅動程式可以定義元件的一或多個功能電源狀態,並在元件之 Fx 狀態變更或其作用中/閑置條件變更時註冊電源管理架構 (PoFx) 所呼叫的回呼函式。 從UMDF 2.0版開始,單一元件裝置的UMDF驅動程式可以定義單一功能電源狀態 (F0)。
如需PoFx的詳細資訊,請參閱 電源管理框架概觀。
若要實作單一元件裝置的 Fx 狀態支援,您必須在裝置第一次啟動之前或期間依序執行下列動作。
此步驟僅適用於 KMDF 驅動程式。 呼叫 WdfDeviceWdmAssignPowerFrameworkSettings 以指定 WDF 在向 PoFx 註冊時所使用的 Power Framework 設定。 驅動程式在呼叫 WdfDeviceWdmAssignPowerFrameworkSettings 時,可以在提供的 WDF_POWER_FRAMEWORK_SETTINGS 結構中提供指向數個回呼函式的指標。 如果驅動程式只支援單一功能電源狀態 (F0),則此步驟是選擇性的。
此步驟適用於 KMDF 驅動程式和 UMDF 驅動程式。 調用 WdfDeviceAssignS0IdleSettings 並將 IdleTimeoutType 欄位設定為 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 結構中的 SystemManagedIdleTimeout 或 SystemManagedIdleTimeoutWithHint。 這樣做會導致 WDF 向 PoFx 註冊。
若為 KMDF 驅動程式,在向 PoFx 註冊時,框架會使用驅動程式在呼叫 WdfDeviceWdmAssignPowerFrameworkSettings 時所提供的 WDF_POWER_FRAMEWORK_SETTINGS 資訊。
因為裝置可能會多次重新啟動,例如在資源重新分配的情況下,驅動程式可能會在 EvtDeviceSelfManagedIoInit 回呼函式中執行先前的步驟。 如果驅動程式已註冊 EvtDeviceSelfManagedIoInit 回呼函式,則架構會在首次呼叫驅動程式的 EvtDeviceD0Entry 回呼函式之後,為每個裝置呼叫它一次。
本主題中其餘的資訊僅適用於 KMDF 驅動程式。
啟動電源
當驅動程式呼叫 WdfDeviceWdmAssignPowerFrameworkSettings 時,它可以提供一個指向 EvtDeviceWdmPostPoFxRegisterDevice 回呼函式的指標。
框架在向 PoFx 註冊之後,會呼叫驅動程式的 EvtDeviceWdmPostPoFxRegisterDevice 回呼函式。 以下是一般啟動序列的範例:
- EvtDevicePrepareHardware
- EvtDeviceD0Entry(PrevState, WdfPowerDeviceD3Final)
- #B0 #A1 EvtInterruptEnable #A2 #C3
- #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 作業:
針對每個裝置的電源受控佇列,各呼叫一次 WdfIoQueueStop。 在每次呼叫WdfIoQueueStop時,提供一個EvtIoQueueState回呼函式。 一般而言,驅動程式會從 ComponentIdleConditionCallback 內呼叫 WdfIoQueueStop。
請確保從每個電源管理佇列分派至驅動程式的請求能夠迅速完成。 視驅動程式而定,這可能涉及下列部分或全部:
- 如果驅動程式未長時間保留要求,並且不會將其轉送至會這樣做的 I/O 目標,請繼續執行步驟 3。
- 如果驅動程式保留特定要求一段較長時間,請將這些要求重新排入手動佇列。 在 #B0 #A1 ComponentActiveConditionCallback #A2 #C3 常式中,驅動程序接著可以擷取要求。
- 如果驅動程式將特定要求轉送到一個長時間保留這些要求的 I/O 目標,請取消這些要求。 在 ComponentActiveConditionCallback 中重新提交請求。
當每個佇列都停止時,架構會呼叫 EvtIoQueueState。 如果驅動程式停止多個電源受控佇列,架構會對每個佇列多次呼叫 EvtIoQueueState。
驅動程式必須在呼叫最後一個 EvtIoQueueState 函式之後,呼叫 PoFxCompleteIdleCondition。 例如,驅動程式可以從最後一個 EvtIoQueueState 進行此呼叫。
為了確定哪一次呼叫是最後的,驅動程式可能會使用計數器來追蹤框架所呼叫 EvtIoQueueState 的次數。 Singlecomp 範例說明這項技術。 此範例從 Windows 8 WDK 開始提供。
以下是一般關閉電源序列的範例:
- ComponentIdleConditionCallback
- ComponentIdleStateCallback
- EvtInterruptDisable
- EvtDeviceD0Exit
在 ComponentActiveConditionCallback 中重新啟動電源管理的佇列和自我管理的 I/O 作業。
如果驅動程式先前已呼叫 WdfInterruptReportInactive,請在 ComponentActiveConditionCallback 或 ComponentIdleStateCallback 中呼叫 WdfInterruptReportActive,以重新啟用非作用中的中斷。