導向電源管理架構簡介
從 Windows 10 版本 1903 開始,運行時間電源管理架構第 3 版 (PoFx) 提供選擇性的導向電源模型導向 PoFx (DFx)。
使用 DFx 時,作業系統會指示裝置堆疊在系統轉換為閑置時進入其適當的低功率閑置狀態,而且沒有 啟動器代理的軟體活動,進而讓系統更可靠地進入低功率。
目標是讓系統更具電源效率,並降低不同尺寸的 Windows 裝置的能耗。
目前只有 D 狀態條件約束的裝置才支援 DFx。 DFx 會略過任何具有 F 狀態條件約束的裝置子樹。
DFx 不會關閉分頁或偵錯裝置。
WDF (非迷你埠) 驅動程式的需求
Power Policy 擁有者的 WDF 驅動程式必須藉由在 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 結構中指定 SystemManagedIdleTimeout 或 SystemManagedIdleTimeoutWithHint,以實作適當的 S0-Idle 原則。 這可讓裝置在閑置時關閉電源。 作為新增的復原量值,驅動程式可以將下列登錄機碼新增至 DDInstall.HW 區段中 INF 的 AddReg 指示詞區段,以選擇加入 DFx:
HKR,"WDF","WdfDirectedPowerTransitionEnable",0x00010001,1
以 31 版和更新版本為目標的 WDF 驅動程式預設會啟用 DFx。 如果這是不想要的,驅動程式可以將登錄機碼設定為0,以退出宣告 DFx:
HKR,"WDF","WdfDirectedPowerTransitionEnable",0x00010001,0
以第 33 版和更新版本為目標的 WDF 驅動程式也可以將 WDF_POWER_FRAMEWORK_SETTINGS 結構的 DirectedPoFxEnabled 成員設定為 WdfFalse,以退出宣告 DFx。
提示
若要初始化其 WDF_POWER_FRAMEWORK_SETTINGS 結構,您的驅動程式應該呼叫 WDF_POWER_FRAMEWORK_SETTINGS_INIT。
由於要求系統管理的閑置逾時會導致WDF 代表驅動程式向PoFx註冊,因此驅動程式不需要在此案例中向PoFx註冊。
如果驅動程式指定 DriverManagedIdleTimeout,請考慮切換至系統管理的閑置逾時。 如果這不可行,請使用下列 WDM 區段中的指導方針來加入加入 DFx。
如果WDF驅動程式不使用運行時間電源管理,請新增其支援,並使用系統管理的閑置逾時。 若要這樣做,請提供WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS結構作為 WdfDeviceAssignS0Idle 的輸入 設定。
WDM (非迷你埠) 驅動程式的需求
如果您的驅動程式未使用 WDF 所提供的系統管理閑置支援(驅動程式是使用 驅動程式管理的閑置或 WDM 驅動程式的 WDF 驅動程式),它仍然可以透過向 PoFx 註冊本身來取得 DFx 支援。 在此案例中,驅動程式會藉由實作下列方式向PoFx註冊:
在輸入至 PoFxRegisterDevice 函式的PO_FX_DEVICE_V3結構中,提供這些回呼的指標。
若要取得 DFx 支援,驅動程式必須:
- 註冊 PoFx 時提供
PO_FX_DIRECTED_POWER*
回呼 - 在從閑置傳回時,從其PO_FX_DIRECTED_POWER_UP_CALLBACK回呼函式呼叫 PoFxReportDevicePoweredOn。 如果這是 WDF 驅動程式,它可以設定旗標,然後在 EvtDeviceD0Entry 中檢查旗標並呼叫 PoFxReportDevicePoweredOn。
- 從 Sx 轉換繼續時呼叫 PoFxReportDevicePoweredOn。 如果這是 WDF 驅動程式,則需要 預先處理 IRP_MN_SET_POWER。 前置處理回呼只有在 時
Parameters.Power.Type == SystemPowerState
才會繼續。 由於裝置可能在整個睡眠/繼續週期中保持 Dx 狀態,因此在 EvtDeviceD0Entry 中檢查旗標的上述方法將無法運作。 相反地,EvtDeviceWdmIrpPreprocess 事件回呼函式應該呼叫 IoSetCompletionRoutine 來設定 IoCompletion 例程,並從完成例程呼叫 PoFxReportDevicePoweredOn。
範例
下列範例顯示上述的自我註冊選項:
PO_FX_DEVICE_V3 MyPoFxDevice;
POHANDLE MyPoFxHandle;
RtlZeroMemory(&MyPoFxDevice, sizeof(PO_FX_DEVICE_V3));
MyPoFxDevice.Version = PO_FX_VERSION_V3;
// Initialize other PoFx callbacks and other fields like
// components and their idle states.
MyPoFxDevice.DirectedPowerUpCallback = <Driver's DFx power up callback>
MyPoFxDevice.DirectedPowerDownCallback = <Driver's DFx power down callback>
Status = PoFxRegisterDevice(
<Driver's device object>,
(PPO_FX_DEVICE)&MyPoFxDevice,
&MyPoFxHandle);
if (!NT_SUCCESS(Status)) {
return Status;
}
如果您先前指定的 PO_FX_VERSION_V1
驅動程式,請注意 PO_FX_DEVICE_V3
結構會用於 PO_FX_COMPONENT_V2
元件數位結構。
迷你埠驅動程式的需求
針對遵循埠/迷你埠驅動程式模型的裝置類別,系統提供的埠驅動程式通常會處理電源原則擁有權。 大部分的迷你埠都不需要任何程式碼變更以選擇加入 DFx,因為對應的埠驅動程式預期會處理 DFx 支援。
KS.sys的第三方迷你埠指引
從 Windows 10 版本 2004 開始(也稱為 20H1 或組建 19041),KS.sys預設退出 DFx 和相關 HLK 需求。 KS.sys的第三方迷你埠可以註冊到 DFx 和相關 HLK,方法是向 PoFx 註冊本身,並將 KsDFxSupportEnable 登錄機碼新增至 INF。
驅動程式可以使用本節中所述的實作向 PoFx 註冊本身。 此外,必須在 AddReg 指示詞區段中新增下列這一行。
HKR, , KSDFxSupportEnable, 0x00010001, 1
您可以透過裝置的 [DDInstall.HW] 區段或驅動程式的 [service-install-section] 來叫用 AddReg 區段。 將它新增至 [DDInstall.HW] 區段只會變更該特定裝置。 如果相同的驅動程式用於不同的 VID/PID 組合,但只有特定裝置才需要啟用 DFx,這非常有用。
在 [service-install-section] 中新增 AddReg 區段,選擇使用該驅動程式的所有裝置使用 DFx。
測試
Microsoft 提供 DFx 的三項測試:Windows Driver Kit 中的單一裝置測試,用於測試使用者指定的裝置、裝置層級 HLK 測試,以及用於測試系統上所有裝置的系統層級 HLK 測試。
單一裝置測試是隨附於WDK的 PwrTest 工具的一部分。 若要存取它,請使用 參數執行 /directedfx
工具。 如需詳細資訊,請參閱 PwrTest DirectedFx 案例。
如需 HLK 測試的相關信息,請參閱下列頁面:
建議在 S4 轉換之後測試 DFx,以攔截驅動程式在從 S4 繼續之後可能無法正確呼叫 PoFxReportDevicePoweredOn 的任何情況。
DFx 和 S 狀態轉換
- DFx 轉換的目標 D 狀態應該符合運行時間 D3 (RTD3)的目標 D 狀態,這可能與 S3/S4 轉換的目標 D 狀態不同。 請考慮裝置針對 RTD3 輸入 D2 但針對 S3/S4 輸入 D3 的案例。 在此情況下,DFx 的目標 D 狀態應該是 D2。
- 同樣地,DFx 的 arm-for-wake 行為應該符合 RTD3,這可能與 S3/S4 轉換中使用的不同。 例如,裝置可能會針對 RTD3 輸入 D2/wake-armed,但針對 S3/S4 輸入 D3/no-wake-armed。 在此案例中,DFx 轉換也應該進入 D2/喚醒式。
DFx 和運行時間 D3 (RTD3)
- 使用 RTD3 時,裝置通常會在閒置時進入較低的電源 D 狀態。 如果新工作送達,裝置會立即喚醒至 D0。 使用 DFx 時,裝置應該會繼續保持其目標 D 狀態(並在佇列上寫下新工作),直到 PoFx 指示它進行電源備份。