Share via


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

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

如需PoFx的詳細資訊,請參閱 Power Management Framework 概觀

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

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

  2. 此步驟適用於 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 回呼函式。 以下是一般電源啟動序列的範例:

  1. EvtDevicePrepareHardware
  2. EvtDeviceD0Entry (PrevState = WdfPowerDeviceD3Final)
  3. EvtInterruptEnable
  4. EvtDeviceWdmPostPoFxRegisterDevice - PoFx 句柄可供使用

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

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

關閉電源

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

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

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

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

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

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

    • 如果驅動程式未保留要求一段時間,而且不會將它們轉送到執行此動作的 I/O 目標,請繼續執行步驟 3。
    • 如果驅動程式保留特定要求一段時間,請將這些要求重新排入手動佇列。 在其 ComponentActiveConditionCallback 例程中,驅動程式接著可以擷取要求。
    • 如果驅動程式將特定要求轉送至保留一段時間的 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 來重新啟用非作用中的中斷。