支援具有單一或多個功能電源狀態的 Single-Component 裝置
單一元件裝置的 KMDF 驅動程式可以定義元件的一或多個功能電源狀態,並註冊電源管理架構 (PoFx 的回呼函式,) 元件狀態變更或其作用中/閑置條件變更時呼叫。 從UMDF 2.0版開始,單一元件裝置的UMDF驅動程式可以定義單一功能電源狀態 (F0) 。
如需PoFx的詳細資訊,請參閱 Power Management Framework 概觀。
若要實作單一元件裝置的 Fx 狀態支援,您必須在第一次啟動裝置之前或期間執行下列動作。
此步驟僅適用於 KMDF 驅動程式。 呼叫 WdfDeviceWdmAssignPowerFrameworkSettings 以指定 WDF 在向 PoFx 註冊時所使用的電源架構設定。 在驅動程式呼叫 WdfDeviceWdmAssignPowerFrameworkSettings 時所提供的WDF_POWER_FRAMEWORK_SETTINGS結構中,驅動程式可以提供數個回呼函式的指標。 如果驅動程式僅支援單一功能電源狀態 (F0) ,則此步驟是選擇性的。
此步驟適用於 KMDF 驅動程式和 UMDF 驅動程式。 呼叫 WdfDeviceAssignS0IdleSettings,並將 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 結構的 IdleTimeoutType 字段設定為 SystemManagedIdleTimeout 或 SystemManagedIdleTimeoutWithHint。 這樣做會導致 WDF 向 PoFx 註冊。
若為 KMDF 驅動程式,在向 PoFx 註冊時,架構會使用呼叫 WdfDeviceWdmAssignPowerFrameworkSettings 時,WDF_POWER_FRAMEWORK_SETTINGS中提供的驅動程序資訊。
因為裝置可以多次啟動,例如在資源重新平衡時,驅動程式可能會在 EvtDeviceSelfManagedIoInit 回呼函式中執行先前的步驟。 如果驅動程式已註冊 EvtDeviceSelfManagedIoInit 回呼函式,則架構會在架構第一次呼叫驅動程式的 EvtDeviceD0Entry 回呼函式之後,針對每個裝置呼叫它一次。
本主題中其餘的資訊僅適用於 KMDF 驅動程式。
啟動電源
當驅動程式呼叫 WdfDeviceWdmAssignPowerFrameworkSettings 時,它可以提供 EvtDeviceWdmPostPoFxRegisterDevice 回呼函式的指標。
架構會在架構向 PoFx 註冊之後呼叫驅動程式的 EvtDeviceWdmPostPoFxRegisterDevice 回呼函式。 以下是一般電源啟動序列的範例:
- EvtDevicePrepareHardware
- EvtDeviceD0Entry (PrevState = WdfPowerDeviceD3Final)
- EvtInterruptEnable
- EvtDeviceWdmPostPoFxRegisterDevice - PoFx 句柄可供使用
如果驅動程式必須使用POHANDLE來執行任何額外的作業,驅動程式會提供 EvtDeviceWdmPostPoFxRegisterDevice 回呼,以用於Power Framework 註冊。 例如,它可以指定延遲、落地和喚醒需求。 如需使用POHANDLE之例程的詳細資訊,請參閱 裝置電源管理例程。
您的驅動程式也可以使用 POHANDLE 與 PoFx 交換電源控制要求:
- 若要將電源控制要求傳送給 PoFx,驅動程式會提供 EvtDeviceWdmPostPoFxRegisterDevice 回呼函式,然後使用產生的 POHANDLE 來呼叫 PoFxPowerControl。
- 為了執行 PoFx 所要求的電源控制作業,驅動程式在其WDF_POWER_FRAMEWORK_SETTINGS結構中提供 PowerControlCallback 回呼例程。
關閉電源
WDF 會先呼叫 EvtDeviceWdmPrePoFxUnregisterDevice 回呼函式,再刪除與 PoFx 的指定註冊。
驅動程式可以在提供給 WdfDeviceWdmAssignPowerFrameworkSettings的WDF_POWER_FRAMEWORK_SETTINGS結構中,提供 ComponentIdleStateCallback 例程的指標。 PoFx 會呼叫此例程,以通知驅動程式對指定元件的 Fx 電源狀態進行擱置變更。 在此回呼例程中,驅動程式可以執行與功能狀態變更相關的硬體特定作業。
例如,在將元件轉換成低電源 Fx 狀態之前,驅動程式可能會儲存硬體狀態並停用中斷和 DMA。 驅動程式會呼叫 WdfInterruptReportInactive ,通知系統中斷不再作用中。 在 F 狀態轉換期間關閉中斷可能會降低整體系統耗電量。
驅動程式也可以在其WDF_POWER_FRAMEWORK_SETTINGS結構中提供 ComponentIdleConditionCallback 例程的指標。 PoFx 會呼叫此例程,以通知驅動程式元件已閒置。 在此例程中,驅動程式會開始停止其電源受控佇列和自我管理 I/O 作業的程式:
針對每個裝置的電源受控佇列呼叫 WdfIoQueueStop 一次。 在每個 WdfIoQueueStop 呼叫中,提供 EvtIoQueueState 回呼。 一般而言,驅動程式會從 ComponentIdleConditionCallback 內呼叫 WdfIoQueueStop。
請確定從每個電源管理的佇列分派至驅動程式的要求會快速完成。 視驅動程式而定,這可能牽涉到下列部分或全部:
- 如果驅動程式未保留要求一段時間,而且不會將它們轉送到執行此動作的 I/O 目標,請繼續執行步驟 3。
- 如果驅動程式保留特定要求一段時間,請將這些要求重新排入手動佇列。 在其 ComponentActiveConditionCallback 例程中,驅動程式接著可以擷取要求。
- 如果驅動程式將特定要求轉送至保留一段時間的 I/O 目標,請取消這些要求。 重新提交 ComponentActiveConditionCallback 中的要求。
當每個佇列停止時,架構 會呼叫 EvtIoQueueState。 如果驅動程式停止多個電源受控佇列,架構會針對每個佇列呼叫 EvtIoQueueState 多次。
驅動程式必須在呼叫最後一個 EvtIoQueueState 函式之後呼叫 PoFxCompleteIdleCondition。 例如,驅動程式可以從最後一個 EvtIoQueueState 中進行此呼叫。
為了判斷最後一個呼叫,驅動程式可能會使用計數器來追蹤架構呼叫 EvtIoQueueState 的次數。 Singlecomp 範例說明這項技術。 此範例從 Windows 8 WDK 開始提供。
以下是一般關閉電源順序的範例:
重新啟動 ComponentActiveConditionCallback 中的電源受控佇列和自我管理的 I/O 作業。
如果驅動程式先前稱為 WdfInterruptReportInactive,請從 ComponentActiveConditionCallback 或 ComponentIdleStateCallback 呼叫 WdfInterruptReportActive 來重新啟用非作用中的中斷。