Überraschung Wake-Up

Ein überraschendes Aufwachen ist ein unerwarteter Übergang zu D0. Nachdem ein Gerät in D3cold eingereckt wurde, kann es als Nebeneffekt zu einem überraschenden Aufwecken kommen, wenn der Treiber für ein anderes Gerät auf demselben Stromschienen einen Übergang von D3cold zu D0 anfordert. Der Treiber für das erste Gerät muss eine Benachrichtigung über die überraschende Aktivierung erhalten, um zu verhindern, dass das Gerät in einem nicht initialisierten D0-Zustand verbleibt.

Wenn ein Gerät von D3hot zu D3cold wechselt, wird dies wahrscheinlich getan, weil die Stromquelle, die es mit einer Reihe anderer Geräte teilt, deaktiviert wurde. Einige Zeit nachdem diese Geräte D3cold eingegeben haben, kann der Treiber für eines der Geräte einen Übergang zu D0 anfordern. Als Reaktion auf diese Anforderung schaltet der übergeordnete Bustreiber oder ACPI-Filtertreiber die Energiequelle ein, und alle Geräte, die die Energiequelle gemeinsam nutzen, treten in ihren Standardmäßigen Einschalthardwarestatus ein.

Der einzige Gerätetreiber, der diese Änderung des Energiezustands erwartet, ist der Treiber, der die Änderung angefordert hat. Die Treiber für die anderen Geräte müssen eine Benachrichtigung über diese Änderung erhalten, damit sie ihre Geräte ordnungsgemäß initialisieren können, um in D0 zu arbeiten. Nur ein Treiber, der diese Benachrichtigung empfangen kann, sollte das Gerät die Eingabe von D3cold aktivieren. Andernfalls weiß der Treiber nicht, wann das Gerät in D0 eintritt.

Wenn ein Gerät aktiviert ist, wird es in einen standardmäßigen, nicht initialisierten Hardwarezustand versetzt. Beispielsweise definiert die PCI Express Base 3.0-Spezifikation einen nicht initialisierten D0-Zustand , den ein Gerät beim ersten Empfang der Stromversorgung betritt. Die Definition dieses Zustands ist spezifisch für PCI- und PCI-Express-Geräte, aber Geräte, die eine Verbindung mit anderen Bussen herstellen, sind so konzipiert, dass sie ähnliche Hardwarezustände eingeben, wenn sie eingeschaltet sind.

Im Fall eines PCI- oder PCI Express-Geräts, das mehrere Funktionen implementiert, teilen sich diese Gerätefunktionen wahrscheinlich dieselbe Power Rail. Allerdings kann jede Funktion über einen separaten Treiber verfügen, und es ist unwahrscheinlich, dass die Treiber für diese Funktionen direkt miteinander kommunizieren. Wenn der Treiber für eine dieser Funktionen eine Änderung des Energiezustands von D3cold in D0 anfordert, erwarten die Treiber für die anderen Funktionen diese Änderung nicht. Wenn diese anderen Funktionen Strom erhalten, müssen ihre Treiber benachrichtigt werden, damit sie die Funktionen für den ordnungsgemäßen Betrieb in D0 konfigurieren können.

Ein Bustreiber erkennt, wenn die Stromversorgung für ein untergeordnetes Gerät eingeschaltet ist. Wenn der Funktionstreiber dieses Geräts keinen Übergang zu D0 anforderte, fordert der Bustreiber den Gerätetreiber auf, sich selbst eine D0-Energie-IRP (eine IRP_MN_SET_POWER Anforderung mit Zielzustand = PowerDeviceD0) zu senden, um das Gerät für den Betrieb in D0 zu initialisieren. Aus diesem initialisierten D0-Zustand kann der Gerätetreiber dann den Übergang des Geräts zu D3hot initiieren. Gerätetreiber können auf folgende Weise Benachrichtigungen über überraschende Übergänge zu D0 von Bustreibern erhalten:

  • Gerätetreiber, die sich direkt oder indirekt als Clients des Laufzeit-Power Management-Frameworks (PoFx) registrieren, erhalten Benachrichtigungsrückrufe.
  • Treiber für Geräte, die ihre Geräte für die Aktivierung ausrüsten, haben ihre ausstehenden IRP_MN_WAIT_WAKE Anforderungen von den Bustreibern abgeschlossen.

Ab Windows 8 kann sich der Funktionstreiber eines Geräts, der als Besitzer der Energierichtlinie fungiert, als PoFx-Client registrieren. Wenn der Bustreiber PoFx benachrichtigt, dass das Gerät einen überraschenden Übergang zu D0 erlebt hat, hilft PoFx dem Gerät, in einen initialisierten D0-Zustand und dann zu D3hot zu wechseln. Zunächst ruft PoFx die DevicePowerRequiredCallback-Routine des Treibers auf, um den Gerätetreiber aufzufordern, einen D0-Strom-IRP im Gerätestapel zu senden. Als Nächstes ruft PoFx die DevicePowerNotRequiredCallback-Routine des Treibers auf, um den Gerätetreiber zu benachrichtigen, dass das Gerät nicht erforderlich ist, um im D0-Zustand zu bleiben.

Ab Kernel-Mode Driver Framework (KMDF) Version 1.11 kann sich der KMDF-Treiber für ein Einzelkomponentengerät indirekt bei PoFx registrieren, indem die WdfDeviceWdmAssignPowerFrameworkSettings-Methode aufgerufen wird. In diesem Aufruf stellt der Treiber Zeiger auf Rückrufroutinen bereit, die den Treiber über überraschende Übergänge zu D0 benachrichtigen. Weitere Informationen finden Sie unter Unterstützen von Funktionsenergiezuständen.

Ein Treiber, der sein Gerät nicht bei PoFx registriert, kann immer noch über einen überraschenden Übergang zu D0 benachrichtigt werden, wenn das Gerät zum Aufwachen bewaffnet ist. Wenn die Bustreiber die Stromversorgung des Geräts einschalten, schließen sie die IRP_MN_WAIT_WAKE Anforderung des Fahrers ab. Daraufhin initialisiert der Treiber sein Gerät für den Betrieb in D0. Das Gerät befindet sich wahrscheinlich im Leerlauf. In diesem Fall wird der Treiber nach einiger Zeit dieses Gerät auf D3hot verschieben.

Ein Funktionstreiber, der sich nicht bei PoFx registriert und sein Gerät nicht für die Aktivierung ausrüspelt, erhält keine Benachrichtigung über einen überraschenden Übergang von D3cold zu D0. Das Gerät kann viel Zeit in einem nicht initialisierten D0-Zustand verbringen. In diesem Zustand sind in der Regel alle Komponenten im Gerät aktiviert. Um den Energieverbrauch von Geräten im Leerlauf zu reduzieren, sollten Treiber den Eintrag zu D3cold nur aktivieren, wenn sie Benachrichtigungen über überraschende Übergänge zu D0 erhalten können.