某些裝置可以進入低功率(Dx)狀態,而系統仍處於運作中狀態(S0) 狀態。 從 Windows 8 開始,裝置可以在進入 Dx 狀態之前,轉換為低功率功能電源狀態(Fx)。 針對這類裝置,架構會在裝置閒置(未使用)一段預先設定的時間後,開始降低裝置或元件的電源。
其中有些裝置也可以在偵測到外部事件時,在公交車上觸發喚醒訊號。 總線驅動程式會回應此訊號,而驅動程式堆疊會將裝置還原至其工作狀態。 (在架構要求總線驅動程式起始將裝置還原至其工作狀態之前,不會偵測到外部事件的裝置仍處於低功率狀態。
如果您的裝置或元件可在閑置時關閉電源,則電源原則擁有者中的 EvtDriverDeviceAdd 回呼函式必須執行下列兩個步驟:
呼叫 WdfDeviceAssignS0IdleSettings 以指定:
- 裝置將進入的低功率狀態
- 裝置在電源狀態降低之前 必須保持閑置 的時間量
- 裝置是否能偵測外部事件,並在總線上觸發喚醒信號
- 使用者是否可以控制裝置的閑置設定
- 裝置的閑置電源關閉功能是否已啟用或停用
- 當系統回到其工作狀態時,裝置是否會回到其工作狀態 (D0) 狀態
- 裝置的閒置逾時值是否取決於電源管理架構 (PoFx)
- 架構是否能在閒置超時期間結束時,將裝置轉為 D3cold 電源狀態。
如需這些設定的詳細資訊,請參閱 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 結構,以及 支援功能電源狀態。
如果需要為您的裝置使用這些事件回呼函式,請呼叫 WdfDeviceInitSetPowerPolicyEventCallbacks 來註冊它們:
- EvtDeviceArmWakeFromS0,可讓裝置硬體(而非總線)回應外部喚醒事件
- EvtDeviceDisarmWakeFromS0,可停用裝置的能力(不是公共汽車的能力)回應外部喚醒事件
- EvtDeviceWakeFromS0Triggered,通知司機公共汽車偵測到喚醒訊號。
閑置狀態
架構會將裝置視為閑置,並在符合下列所有條件時開始計算閑置時間:
- 針對此裝置實例建立的所有電源受控佇列中,都沒有任何要求正在等候或已被分派給驅動程式。 如果要求已分派至驅動程式,而驅動程式將它傳送至 I/O 目標,要求仍與佇列相關。 除非驅動程式使用 傳送和忘記選項來傳送 要求,否則裝置不會被視為閑置。 在非電源管理佇列中的請求不會計入裝置待機時間。
- 如果驅動程式先前稱為 WdfDeviceStopIdle,則驅動程式隨後稱為 WdfDeviceResumeIdle。
- 如果電源原則擁有者是匯流排驅動程式,則匯流排驅動程式的子裝置都不是 D0。
如果您的驅動程式(或使用者)為您的裝置啟用閑置電源關閉功能,您可能必須使用 WdfDeviceStopIdle 方法。 如果裝置處於運作中狀態(D0),此方法會防止裝置閑著,直到驅動程式呼叫 WdfDeviceResumeIdle 為止。 如果當驅動程式呼叫 WdfDeviceStopIdle 時,裝置處於低功率狀態,而且如果系統處於運作中 (S0) 狀態,架構會要求總線驅動程式將裝置還原至其工作狀態 (D0) 狀態。 WdfDeviceStopIdle 的每個成功呼叫都必須與 WdfDeviceResumeIdle 的呼叫相符。 如需在調試程式中檢視電源參考計數的相關信息,請參閱 在WDF中偵錯電源參考流失。
如需驅動程式何時可能必須呼叫 WdfDeviceStopIdle 的詳細資訊,請參閱 方法的參考頁面。
如果裝置可以從低功率狀態喚醒自己,則裝置總線的驅動程序會參與喚醒裝置。 總線驅動程式通常會提供 EvtDeviceEnableWakeAtBus 和 EvtDeviceDisableWakeAtBus 回呼函式。 這些功能會在總線轉接器上執行任何必要動作,以啟用及停用裝置從低耗能狀態喚醒的能力。
如需控制裝置閑置功能之登錄專案的相關信息,請參閱 使用者控制裝置閑置和喚醒行為。