Anbieter zum Thema
Wie die Kommunikation zwischen Power Manager und Treiber erfolgt
Bei einer Änderung des System-Power States (Bild 1.7) oder der Anwender wünscht eine Power-Zustandsänderung so verwendet der Power-Manager für die Kommunikation mit dem Treiber sogenannte IoControls (Bild 1.2). Mit dem API (DeviceIoControl(, dwRequest,,,) wird das Control im Parameter dwRequest übertragen. Im Treiber nimmt mit dem API (BKL_IOControl( ,dwCode,,) das Control entgegen.
Die Nachfolgend aufgeführten IoControls werden vom Treiber unterstützt.
- IOCTL_POWER_CAPABILITIES: Dem Power-Manager wird mitgeteilt, welche Zustände der Treiber unterstützt (D0=ON und D4=OFF). Diese Nachfrage erfolgt nur einmal und typischer Weise nur dann, wenn der Treiber vom Device-Manager geladen wird.
- IOCTL_POWER_GET: Teilt dem PM den aktuellen Zustand des Treibers mit.
- IOCTL_POWER_SET: Der Treiber wird in einen anderen Zustand gesetzt.
- IOCTL_POWER_QUERY: Der PW verwendet dieses Control um zu überprüfen ob ein Zustands-Übergang vom Treiber unterstützt wird.
Der Treiber kann seinen Zustand selbst nicht ändern. Zur Kommunikation mit dem PM benutzt der Treiber das API DevicePowerNotify (Bild 1.3). Über dieses API kann der Treiber eine Zustandsänderung vom PM anfordern. Ist es dem PM möglich diese Anforderung zu erfüllen sendet er das „IOCTL_POWER_SET“ an den Treiber um den Zustand einzustellen.
Das Power Management auf Applikations-Ebene
Die Applikation und der PM können sich gegenseitig beeinflussen, um eine Zustands-Änderung einzustellen. Über die „Power Manager API“ ist es möglich, den „Device Power State“ (Bild 1.8) zu setzen. Diesen Vorgang nennt man das passive Power Management. Ferner kann die Applikation über die „Power Notification API“ vom PM Ereignisse (Power Events) empfangen. Diese Ereignisse sind das Ergebnis von einem aktiven Power Management, Ereignisse können durch den PM erzeugt werden, weil sich der System Power State geändert hat und zum anderen, weil der Treiber einen anderen Zustand über (DevicePowerNotify (Bild 1.3)) eingestellt haben möchte.
- GetSystemPowerState: Gibt den Namen des aktuellen „System Power State“ zurück oder mit SetSystemPowerState soll ein neuer „System Power State” einstellen werden.
- SetPowerRequirement: Fordert den PM auf, für ein bestimmtes Gerät, einen Zustand einzustellen (D0) oder mit ReleasePowerRequirement wird der vorherige Zustand hergestellt.
- SetDevicePower: Damit wird für ein gewünschtes Gerät der „Device Power State“ gesetzt oder mit GetDevicePower ausgelesen.
Um Ereignisse vom PM zu empfangen, muss der Anwender einen Message Queue „CreateMsgQueue()“ erzeugen. Mit der Funktion RequestPowerNotifications() wird dem PM mitgeteilt, an welche Message Queue die Ereignisse zu senden sind und welche Ereignisse er empfangen möchte. Diese Ereignisse heißen: „Power Notifications“. Wird die Applikation beendet, oder es werden keine Ereignisse erwünscht, so wird mit der Funktion „StopPowerNotifications“ das dem PM mitgeteilt.
Die Power-Notifications-Zustände in der Applikation.
Mit der blockierenden Funktion „ReadMsgQueue (ppb)“ werden die Ereignisse vom PM entgegen genommen. Der Anwender wertet über „switch (ppb->Message)“ die unten aufgeführten Ereignisse aus:
- PBT_RESUME: Informiert die Applikation das der „Suspend State” verlassen wurde.
- PBT_POWERSTATUSCHANGE: Wenn es einen Änderung an der Spannungsversorgung gab. (AC<>DC) Batterie oder Netzteilbetrieb.
- PBT_TRANSITION: PM hat den „System Power State” geändert.
- PBT_POWERINFOCHANGE: Infos über die Batterie Status oder über die AC Status
(ID:280374)