Unterstützung Single-Component Geräte mit einem oder mehreren Funktionszuständen
Ein KMDF-Treiber für ein Einzelkomponentengerät kann einen oder mehrere funktionsbezogene Energiezustände für die Komponente definieren und Rückruffunktionen registrieren, die das Power Management Framework (PoFx) aufruft, wenn sich der Fx-Zustand der Komponente ändert oder sich die Aktiv-/Leerlaufbedingung ändert. Ab UMDF Version 2.0 kann ein UMDF-Treiber für ein Einzelkomponentengerät einen einzelnen Funktionsleistungszustand (F0) definieren.
Weitere Informationen zu PoFx finden Sie unter Übersicht über das Power Management Framework.
Um die Fx-Statusunterstützung für ein Gerät mit einer einzelnen Komponente zu implementieren, müssen Sie die folgenden Schritte vor oder während des ersten Startvorgangs eines Geräts ausführen.
Dieser Schritt gilt nur für KMDF-Treiber. Rufen Sie WdfDeviceWdmAssignPowerFrameworkSettings auf , um die Power Framework-Einstellungen anzugeben, die WDF bei der Registrierung bei PoFx verwendet. In der WDF_POWER_FRAMEWORK_SETTINGS-Struktur , die der Treiber bereitstellt, wenn er WdfDeviceWdmAssignPowerFrameworkSettings aufruft, kann der Treiber Zeiger auf mehrere Rückruffunktionen bereitstellen. Wenn der Treiber nur einen einzelnen Funktionszustand (F0) unterstützt, ist dieser Schritt optional.
Dieser Schritt gilt für KMDF-Treiber und UMDF-Treiber. Rufen Sie WdfDeviceAssignS0IdleSettings auf , und legen Sie das Feld IdleTimeoutType der WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS-Struktur auf SystemManagedIdleTimeout oderSystemManagedIdleTimeoutWithHint fest. Dadurch wird WDF bei PoFx registriert.
Für KMDF-Treiber verwendet das Framework bei der Registrierung bei PoFx die Informationen, die der Treiber in WDF_POWER_FRAMEWORK_SETTINGS angegeben hat, als es WdfDeviceWdmAssignPowerFrameworkSettings aufgerufen hat.
Da ein Gerät mehr als einmal gestartet werden kann, z. B. im Falle eines Ressourcenausgleichs, kann ein Treiber die vorherigen Schritte innerhalb der Rückruffunktion EvtDeviceSelfManagedIoInit ausführen. Wenn der Treiber eine EvtDeviceSelfManagedIoInit-Rückruffunktion registriert hat, ruft das Framework diese einmal für jedes Gerät auf, nachdem das Framework die EvtDeviceD0Entry-Rückruffunktion des Treibers zum ersten Mal aufgerufen hat.
Die restlichen Informationen in diesem Thema gelten nur für KMDF-Treiber.
Einschalten
Wenn der Treiber WdfDeviceWdmAssignPowerFrameworkSettings aufruft, kann er einen Zeiger auf eine EvtDeviceWdmPostPoFxRegisterDevice-Rückruffunktion bereitstellen.
Das Framework ruft die Rückruffunktion EvtDeviceWdmPostPoFxRegisterDevice des Treibers auf, nachdem sich das Framework bei PoFx registriert hat. Hier sehen Sie ein Beispiel für eine typische Einschaltsequenz:
- EvtDevicePrepareHardware
- EvtDeviceD0Entry (PrevState = WdfPowerDeviceD3Final)
- EvtInterruptEnable
- EvtDeviceWdmPostPoFxRegisterDevice // PoFx Handle ist verfügbar
Der Treiber stellt den EvtDeviceWdmPostPoFxRegisterDevice-Rückruf bereit, wenn er zusätzliche Vorgänge mithilfe des POHANDLE für die Power Framework-Registrierung ausführen muss. Beispielsweise könnte er Latenz-, Aufenthalts- und Aktivierungsanforderungen angeben. Weitere Informationen zu Routinen, die das POHANDLE verwenden, finden Sie unter Geräteenergieverwaltungsroutinen.
Ihr Treiber kann den POHANDLE auch verwenden, um Energiesteuerungsanforderungen mit PoFx auszutauschen:
- Um eine Energiesteuerungsanforderung an PoFx zu senden, stellt der Treiber eine EvtDeviceWdmPostPoFxRegisterDevice-Rückruffunktion bereit und verwendet dann die resultierende POHANDLE, um PoFxPowerControl aufzurufen.
- Zum Ausführen von Energiesteuerungsvorgängen, die von PoFx angefordert werden, stellt der Treiber eine PowerControlCallback-Rückrufroutine in seiner WDF_POWER_FRAMEWORK_SETTINGS-Struktur bereit.
Herunterschalten
WDF ruft die Rückruffunktion EvtDeviceWdmPrePoFxUnregisterDevice auf, bevor eine angegebene Registrierung mit PoFx gelöscht wird.
Der Treiber kann einen Zeiger auf eine ComponentIdleStateCallback-Routine in der WDF_POWER_FRAMEWORK_SETTINGS Struktur bereitstellen, die er für WdfDeviceWdmAssignPowerFrameworkSettings bereitstellt. PoFx ruft diese Routine auf, um den Treiber über eine ausstehende Änderung des Fx-Energiezustands der angegebenen Komponente zu benachrichtigen. In dieser Rückrufroutine kann der Treiber hardwarespezifische Vorgänge im Zusammenhang mit der Funktionszustandsänderung ausführen.
Beispielsweise kann ein Treiber vor dem Übergang einer Komponente in einen Fx-Zustand mit niedriger Leistung den Hardwarezustand speichern und Interrupts und DMA deaktivieren. Der Treiber ruft WdfInterruptReportInactive auf, um das System darüber zu informieren, dass der Interrupt nicht mehr aktiv ist. Das Deaktivieren von Unterbrechungen während F-Zustandsübergängen kann den Gesamtleistungsverbrauch des Systems verringern.
Der Treiber kann auch einen Zeiger auf eine ComponentIdleConditionCallback-Routine in seiner WDF_POWER_FRAMEWORK_SETTINGS Struktur bereitstellen. PoFx ruft diese Routine auf, um den Treiber zu benachrichtigen, dass eine Komponente im Leerlauf ist. In dieser Routine beginnt der Treiber mit dem Beenden seiner energieverwalteten Warteschlangen und selbstverwalteten E/A-Vorgänge:
Rufen Sie WdfIoQueueStop einmal für jede der energieverwalteten Warteschlangen des Geräts auf. Geben Sie in jedem Aufruf von WdfIoQueueStop einen EvtIoQueueState-Rückruf an. In der Regel ruft der Treiber WdfIoQueueStop in ComponentIdleConditionCallback auf.
Stellen Sie sicher, dass Anforderungen, die von jeder der energieverwalteten Warteschlangen an den Treiber gesendet werden, schnell abgeschlossen werden. Je nach Treiber kann dies einige oder alle der folgenden Elemente umfassen:
- Wenn der Treiber Anforderungen für längere Zeit nicht enthält und sie nicht an ein E/A-Ziel weiterleitt, das dies tut, fahren Sie mit Schritt 3 fort.
- Wenn der Treiber bestimmte Anforderungen für einen längeren Zeitraum enthält, stellen Sie diese Anforderungen erneut an eine manuelle Warteschlange. In seiner ComponentActiveConditionCallback-Routine kann der Treiber dann die Anforderungen abrufen.
- Wenn der Treiber bestimmte Anforderungen an ein E/A-Ziel weiterleitet, das sie für einen längeren Zeitraum enthält, brechen Sie diese Anforderungen ab. Senden Sie die Anforderungen in ComponentActiveConditionCallback erneut.
Wenn jede Warteschlange beendet wurde, ruft das Framework EvtIoQueueState auf. Wenn der Treiber mehrere stromverwaltete Warteschlangen beendet, ruft das Framework EvtIoQueueState mehrmals auf, einmal für jede Warteschlange.
Der Treiber muss PoFxCompleteIdleCondition aufrufen, nachdem die letzte EvtIoQueueState-Funktion aufgerufen wurde. Beispielsweise könnte der Treiber diesen Aufruf innerhalb des letzten EvtIoQueueState tätigen.
Um zu bestimmen, welcher Aufruf zuletzt ist, kann der Treiber einen Zähler verwenden, um die Anzahl der Aufrufe des Frameworks evtIoQueueState nachzuverfolgen. Das Singlecomp-Beispiel veranschaulicht diese Technik. Dieses Beispiel ist ab dem Windows 8 WDK verfügbar.
Hier sehen Sie ein Beispiel für eine typische Powerdownsequenz:
Starten Sie powerverwaltete Warteschlangen und selbstverwaltete E/A-Vorgänge in ComponentActiveConditionCallback neu.
Wenn der Treiber zuvor WdfInterruptReportInactive genannt hat, aktivieren Sie inaktive Interrupts erneut, indem Sie WdfInterruptReportActive über ComponentActiveConditionCallback oder ComponentIdleStateCallback aufrufen.