Unterstützung von idle Power-Down auf Multiple-Component-Geräten
[Gilt nur für KMDF]
Ein KMDF-Treiber für ein Gerät mit mehreren Komponenten kann leerlauf- und funktionsbezogene Energiezustände unterstützen. Da sich der Treiber in diesem Fall direkt beim Power Management Framework (PoFx) registriert, muss der Treiber die resultierenden Dx-Zustandsänderungen mit PoFx koordinieren.
Bereitstellen von Energierichtlinien für Geräte im Leerlauf
Wenn WdfDeviceAssignS0IdleSettings aufgerufen wird, muss der Treiber IdleTimeoutType in der WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS-Struktur auf DriverManagedIdleTimeoutout festlegen. Darüber hinaus muss der Treiber PowerUpIdleDeviceOnSystemWake auf WdfTrue und IdleCaps auf IdleCannotWakeFromS0 festlegen, wie im folgenden Beispiel gezeigt.
WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS s0IdleSettings;
WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&s0IdleSettings,
IdleCannotWakeFromS0);
s0IdleSettings.IdleTimeoutType = DriverManagedIdleTimeout;
s0IdleSettings.PowerUpIdleDeviceOnSystemWake = WdfTrue;
s0IdleSettings.IdleTimeout = 1;
status = WdfDeviceAssignS0IdleSettings(device, &s0IdleSettings);
Wechsel von Working (D0) zum Low-Power (Dx)-Zustand
In EvtDeviceSelfManagedIoInit ruft der Treiber WdfDeviceStopIdle auf, um einen Energieverweis zu nehmen, der verhindert, dass WDF das Gerät in einen Energiesparzustand versetzt.
Der Treiber gibt den Energieverweis frei, indem er WdfDeviceResumeIdle aus seiner DevicePowerRequiredCallback-Rückrufroutine aufruft .
Der Treiber gibt in der Regel ein sehr kurzes Leerlauftimeout an, sodass WDF das Gerät kurz nach der Freigabe aller Energieverweise in einen Low-Power-Zustand versetzt.
Übergang von Low-Power (Dx) zum Betriebszustand (D0)
In DevicePowerRequiredCallback muss der Treiber das Gerät in den Betriebszustand (D0) versetzen. Dazu muss ein Aufruf von WdfDeviceStopIdle an einen Workerthread verschoben werden, wobei der WaitForD0-Parameter auf TRUE festgelegt ist. Dieser blockierende Aufruf von WdfDeviceStopIdle darf nicht in DevicePowerRequiredCallbackerfolgen.
Stattdessen muss der Treiber den blockierenden Aufruf an einen Workerthread zurückstellen, der auf passiver Ebene ausgeführt wird und garantiert nicht den WdfDeviceStopIdle-Aufruf im Kontext der E/A-Dispatchroutine einer energieverwalteten Warteschlange ausführt.
Wenn der Treiber zuvor WdfDeviceInitSetPowerPageable aufgerufen hat (d. h., er kann bei Energieübergängen auf auslagerungsfähige Daten zugreifen), kann der Treiber WdfWorkItemCreate aufrufen, um ein Frameworkarbeitselement zu erstellen. Wenn der Treiber kein Power-Pageable festgelegt hat, muss der Treiber einen eigenen Systemthread erstellen. Weitere Informationen finden Sie unter PsCreateSystemThread.
Nachdem WdfDeviceStopIdle zurückgegeben wurde, muss der Treiber PoFxReportDevicePoweredOn aufrufen, auch wenn die Methode einen Fehler zurückgibt.