支援閒置Power-Down

有些裝置可以進入低電源 (Dx) 狀態,而系統仍處於其運作 (S0) 狀態。 從Windows 8開始,裝置可以在進入 Dx 狀態之前,先轉換為低電源功能電源狀態, (Fx) 。 針對這類裝置,架構會在裝置閒置後起始裝置或元件的較低電源, (未針對預先決定的 (和可設定) 時間量使用) 。

其中有些裝置也可以在偵測到外來事件時,在匯流排上觸發喚醒訊號。 匯流排驅動程式會回應此訊號,而驅動程式堆疊會將裝置還原為其工作狀態。 (在架構要求匯流排驅動程式起始將裝置還原至其工作狀態之前,不會偵測到外來事件的裝置仍處於低電源狀態。)

如果您的裝置或元件可以在閒置時關閉電源,電源原則擁有者中的EvtDriverDeviceAdd回呼函式必須執行下列兩個步驟:

  1. 呼叫 WdfDeviceAssignS0IdleSettings 以指定:

    • 裝置將進入的低電源狀態
    • 裝置在電源狀態降低之前 必須保持閒置 的時間量
    • 裝置是否可以偵測外來事件,並在匯流排上觸發喚醒訊號
    • 使用者是否可以控制裝置的閒置設定
    • 裝置的閒置電源功能是否已啟用或停用
    • 當系統回到其運作 (S0) 狀態時,裝置是否會回到其工作 (D0) 狀態
    • 裝置的閒置逾時值是否取決於電源管理架構 (PoFx)
    • 當閒置逾時期間到期時,架構是否可以將裝置置於 D3cold 電源狀態

    如需這些設定的詳細資訊,請參閱 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 結構,以及 支援功能電源狀態

  2. 如果您需要裝置的回呼函式,請呼叫 WdfDeviceInitSetPowerPolicyEventCallbacks 來註冊下列事件回呼函式:

閒置條件

當符合下列所有條件時,架構會將裝置視為閒置,並開始計算閒置時間:

  • 針對此裝置實例建立的電源受控佇列沒有任何要求在佇列中等候或分派至驅動程式。 如果要求已分派給驅動程式,而驅動程式將它傳送至 I/O 目標,要求仍與佇列相關。 除非驅動程式使用 send and forget 選項 來傳送要求,否則裝置不會被視為閒置。 非電源受控佇列中的要求不會計入裝置閒置中。
  • 如果驅動程式先前稱為 WdfDeviceStopIdle,則驅動程式後續稱為 WdfDeviceResumeIdle
  • 如果電源原則擁有者是匯流排驅動程式,則匯流排驅動程式的子裝置都不是 D0。

如果您的驅動程式 (或使用者) 為您的裝置啟用閒置電源,您可能必須使用 WdfDeviceStopIdle 方法。 如果裝置處於運作中 (D0) 狀態,這個方法會防止裝置閒置,直到驅動程式呼叫 WdfDeviceResumeIdle為止。 如果裝置在驅動程式呼叫 WdfDeviceStopIdle時處於低電源狀態,而且如果系統處於其運作 (S0) 狀態,架構會要求匯流排驅動程式將裝置還原至其運作 (D0) 狀態。 對 WdfDeviceStopIdle 的每個成功呼叫都必須與 WdfDeviceResumeIdle的呼叫相符。 如需在偵錯工具中檢視電源參考計數的相關資訊,請參閱 在 WDF 中偵錯電源參考流失

如需驅動程式何時可能必須呼叫 WdfDeviceStopIdle的詳細資訊,請參閱方法的參考頁面。

如果裝置可以從低電源狀態喚醒自己,裝置匯流排的驅動程式會參與喚醒裝置。 匯流排驅動程式通常會提供 EvtDeviceEnableWakeAtBusEvtDeviceDisableWakeAtBus 回呼函式。 這些函式會在匯流排介面卡上執行任何必要動作,以啟用和停用裝置從低電源狀態喚醒的能力。

如需控制裝置閒置功能之登錄專案的資訊,請參閱 裝置閒置和喚醒行為的使用者控制