Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ein KMDF-Treiber für ein Gerät mit einer einzigen Komponente kann einen oder mehrere funktionale Stromversorgungszustände für die Komponente definieren und Callback-Funktionen registrieren, die das Power Management Framework (PoFx) aufruft, wenn sich der Fx-Zustand der Komponente oder ihr Aktiv/Ruhezustand ändert. Ab UMDF Version 2.0 kann ein UMDF-Treiber für ein Einkomponentengerät einen einzigen funktionalen Leistungszustand (F0) definieren.
Weitere Informationen über PoFx finden Sie unter Übersicht über das Power Management Framework.
Um die Unterstützung des Fx-Status für ein Einkomponentengerät zu implementieren, müssen Sie vor oder während des ersten Starts eines Geräts die folgenden Schritte in der richtigen Reihenfolge ausführen.
Dieser Schritt gilt nur für KMDF-Treiber. Rufen Sie WdfDeviceWdmAssignPowerFrameworkSettings auf, um die Power Framework-Einstellungen festzulegen, die WDF bei der Registrierung bei PoFx verwendet. In der WDF_POWER_FRAMEWORK_SETTINGS-Struktur, die der Treiber beim Aufrufen von WdfDeviceWdmAssignPowerFrameworkSettings bereitstellt, kann der Treiber Zeiger auf mehrere Rückruffunktionen bereitstellen. Wenn der Treiber nur einen einzigen funktionalen Energiestatus (F0) unterstützt, ist dieser Schritt optional.
Dieser Schritt gilt für KMDF-Treiber und UMDF-Treiber. Rufen Sie WdfDeviceAssignS0IdleSettings auf und setzen Sie das IdleTimeoutType Feld der WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS Struktur auf SystemManagedIdleTimeout oder SystemManagedIdleTimeoutWithHint. 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 beim Aufruf von WdfDeviceWdmAssignPowerFrameworkSettingsbereitgestellt hat.
Da ein Gerät mehr als einmal starten kann, z. B. im Falle eines Ressourcenausgleichs, kann ein Treiber die vorherigen Schritte innerhalb der EvtDeviceSelfManagedIoInit Callback-Funktion ausführen. Wenn der Treiber eine EvtDeviceSelfManagedIoInit Callback-Funktion registriert hat, ruft das Framework diese einmal für jedes Gerät auf, nachdem das Framework die EvtDeviceD0Entry Callback-Funktion des Treibers zum ersten Mal aufgerufen hat.
Der Rest der Informationen in diesem Thema bezieht sich nur auf KMDF-Treiber.
Einschalten
Wenn der Treiber WdfDeviceWdmAssignPowerFrameworkSettingsaufruft, kann er einen Zeiger auf eine EvtDeviceWdmPostPoFxRegisterDevice Rückruffunktion bereitstellen.
Das Framework ruft die EvtDeviceWdmPostPoFxRegisterDevice Rückruffunktion 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 Callback zur Verfügung, wenn er zusätzliche Operationen mit dem POHANDLE für die Registrierung des Power Frameworks durchführen muss. Zum Beispiel könnte er Latenz-, Residenz- und Wake-Anforderungen festlegen. Weitere Informationen über Routinen, die den POHANDLE verwenden, finden Sie unter Geräte-Energieverwaltungsroutinen.
Ihr Treiber kann auch den POHANDLE verwenden, um Anforderungen zur Leistungssteuerung mit PoFx auszutauschen:
- Um eine Anfrage zur Stromversorgungssteuerung an PoFx zu senden, stellt der Treiber eine EvtDeviceWdmPostPoFxRegisterDevice Rückruffunktion zur Verfügung und verwendet dann den resultierenden POHANDLE, um PoFxPowerControlaufzurufen.
- Um die von PoFx angeforderten Operationen zur Stromversorgungssteuerung durchzuführen, bietet der Treiber eine PowerControlCallback-Rückrufroutine in seiner WDF_POWER_FRAMEWORK_SETTINGS-Struktur.
Herunterfahren
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 an WdfDeviceWdmAssignPowerFrameworkSettingsliefert. PoFx ruft diese Routine auf, um den Treiber über eine anstehende Änderung des Fx-Stromversorgungsstatus der angegebenen Komponente zu informieren. In dieser Callback-Routine kann der Treiber hardwarespezifische Operationen im Zusammenhang mit der Änderung des Funktionsstatus durchführen.
Bevor eine Komponente in den stromsparenden Fx-Zustand übergeht, kann ein Treiber beispielsweise den Hardwarezustand speichern und Interrupts und DMA deaktivieren. Der Treiber ruft WdfInterruptReportInactive auf, um das System zu informieren, dass der Interrupt nicht mehr aktiv ist. Die Abschaltung von Interrupts während F-State-Übergängen kann den Stromverbrauch des Systems insgesamt reduzieren.
Der Treiber kann auch einen Zeiger auf eine ComponentIdleConditionCallback Routine in seiner WDF_POWER_FRAMEWORK_SETTINGS Struktur bereitstellen. PoFx ruft diese Routine auf, um dem Treiber mitzuteilen, dass eine Komponente inaktiv geworden ist. In dieser Routine beginnt der Treiber mit dem Stoppen seiner stromgesteuerten Warteschlangen und selbstgesteuerten E/A-Operationen:
Rufen Sie WdfIoQueueStop einmal für jede der stromverwalteten Warteschlangen des Geräts auf. In jedem Aufruf von WdfIoQueueStopliefern Sie einen EvtIoQueueState Callback. Normalerweise ruft der Treiber WdfIoQueueStop innerhalb von ComponentIdleConditionCallbackauf.
Stellen Sie sicher, dass Anfragen, die von jeder der stromverwalteten Warteschlangen an den Treiber gesendet werden, schnell abgeschlossen werden. Je nach Fahrer kann dies einige oder alle der folgenden Punkte umfassen:
- Wenn der Fahrer Anforderungen über einen längeren Zeitraum nicht hält und sie nicht an ein E/A-Ziel weiterleitet, das dies tut, fahren Sie mit Schritt 3 fort.
- Wenn der Treiber bestimmte Anforderungen für eine längere Zeit hält, stellen Sie diese Anforderungen in eine manuelle Warteschlange. In seiner ComponentActiveConditionCallback Routine kann der Treiber dann die Anfragen abrufen.
- Wenn der Fahrer bestimmte Anforderungen an ein E/A-Ziel weiterleitet, das sie für eine längere Zeit hält, stornieren Sie diese Anforderungen. Senden Sie die Anfragen in ComponentActiveConditionCallbackerneut.
Wenn jede Warteschlange angehalten wurde, ruft das Framework EvtIoQueueStateauf. Wenn der Treiber mehrere stromverwaltete Warteschlangen anhält, ruft das Framework EvtIoQueueState mehrfach auf, einmal für jede Warteschlange.
Der Treiber muss PoFxCompleteIdleCondition aufrufen, nachdem die letzte EvtIoQueueState Funktion aufgerufen wurde. Der Treiber könnte diesen Aufruf zum Beispiel aus dem letzten EvtIoQueueStateheraus machen.
Um festzustellen, welcher Aufruf der letzte ist, könnte der Treiber einen Zähler verwenden, um zu verfolgen, wie oft das Framework EvtIoQueueStateaufgerufen hat. Das Singlecomp-Beispiel veranschaulicht diese Technik. Dieses Beispiel ist ab dem Windows 8 WDK verfügbar.
Hier ist ein Beispiel für eine typische Ausschaltsequenz:
Starten Sie stromverwaltete Warteschlangen und selbstverwaltete E/A-Operationen in ComponentActiveConditionCallbackneu.
Wenn der Treiber zuvor WdfInterruptReportInactiveaufgerufen hat, aktivieren Sie inaktive Interrupts wieder, indem Sie WdfInterruptReportActive entweder von ComponentActiveConditionCallback oder ComponentIdleStateCallbackaufrufen.