ACPI Wakeup

Aus VDR Wiki
Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Beschreibung

ACPI (Advanced Configuration and Power Interface) ist eine Spezifikation, welche eine Schnittstelle definiert, über die moderne Rechnerhardware und ein Betriebssystem gekoppelt ist. Dadurch benötigt das Betriebssystem keine Informationen über die vorhandene Hardware, um diese Hardwarefunktionen nutzen zu können. ACPI ist eine Weiterentwicklung von APM, PNPBIOS und weiteren Technologien und bietet unter anderem Funktionen zur Kontrolle des Energieverbrauchs, zur Versetzung von Rechnern in den Ruhezustand, zur Aktivierung und Deaktivierung von Geräten.

ACPI-Wakeup bedeutet also vor diesem Hintergrund, dass der Rechner über das ACPI-Kernelinterface geweckt werden kann. Dazu schreibt man die Weckzeit in eine bestimmte Datei, die sich je nach Kernelversion entweder im proc- oder sysfs-Verzeichnisbaum befindet. Danach wird der Rechner schlafen gelegt, denn standardmäßig wird das Aufwachen nur aus den Schlafmodi Standby und Suspend to RAM unterstützt; Suspend to Disk ist optional, wird aber von vielen Boards implementiert. Wenn alles klappt wacht der Rechner dann zur übergebenen Uhrzeit wieder auf und fährt hoch.

Anwendung

Kernel < 2.6.22

Der Pfad lautet /proc/acpi/alarm. Die Weckzeit wird im Format YYYY-MM-DD HH:MM:SS erwartet. Unbedingt darauf achten, ob die HW-Uhr in UTC oder in lokaler Zeit läuft! Gegebenenfalls muss man eine oder zwei Stunden abziehen. Bei diesem Interface wird nur die Zeit gesetzt, nicht aber das Datum.

Beispiel:

 echo 2006-02-09 23:05:00 > /proc/acpi/alarm

Kernel >= 2.6.22

Der Pfad lautet /sys/class/rtc/rtc0/wakealarm. Die Weckzeit wird als Anzahl der Sekunden seit dem 01.01.1970 in UTC erwartet. Es ist ratsam, die Systemuhr in UTC laufen zu lassen. Es wird auch das Datum geschrieben, sofern das Board dies unterstützt. Näheres zur benötigten Kernelkonfiuration siehe MythTV-Wiki-Eintrag zu ACPI-Wakeup.

Beispiel:

 date +%s -d "Fri Feb 22 21:00:00 MET 2008" > /sys/class/rtc/rtc0/wakealarm

Überprüfen der Hardwarefähigkeiten

Voraussetzung für das Funktionieren von ACPI-Wakeup ist natürlich ein ACPI-fähiges Motherboard, was auf alle Consumer-Boards ab dem Jahr 2000 zutreffen sollte. Bevor man sich genauer mit der Thematik auseinandersetzt kann es sinnvoll sein, die Fähigkeiten des Boards herauszufinden. Interessant ist hier besonders, ob das Setzen des Datums und das Aufwachen aus dem SoftOff-Zustand unterstützt wird.

Diese Informationen sind in einer standardisierten Tabelle, der Sog. FADT (Fixed ACPI Description Table) hinterlegt. Bei aktuellen Kerneln (>= 2.6.22) werden diese Informationen im Kernel-Log ausgegeben:

 ACPI: RTC can wake from S4
 ...
 rtc0: alarms up to one month

Hat man nur einen älteren Kernel zur Verfügung, muss man die FADT selber über eine Pseudodatei im proc-Verzeichnisbaum auslesen. Das geschieht wie folgt:

 cat /proc/acpi/fadt > ~/fadt.bin

Diese Datei kann nun in einem Hexeditor (z.B. xxd oder KHexEdit) geöffnet werden. Interessant sind die Bytes 0x6A (106) und 0x6B (107). Sind diese nicht null, sollte das Board das Setzten des Tages (106) und des Monats (107) unterstützen. Die Fähigkeit, aus Zustand S4 aufzuwachen, wird mit dem höchstwertigen Bit im Byte 0x70 (112) kodiert.

Beispiel (interessante Bytes mit * markiert):

 xxd -g 1 ~/fadt.bin
 0000000: 46 41 43 50 74 00 00 00 01 bf 47 42 54 20 20 20  FACPt.....GBT   
 0000010: 41 57 52 44 41 43 50 49 31 2e 30 42 41 57 52 44  AWRDACPI1.0BAWRD
 0000020: 00 00 00 00 00 00 ef 03 c0 30 ef 03 00 00 09 00  .........0......
 0000030: b2 00 00 00 a1 a0 00 00 00 40 00 00 00 00 00 00  .........@......
 0000040: 04 40 00 00 00 00 00 00 00 00 00 00 08 40 00 00  .@...........@..
 0000050: 2c 40 00 00 28 40 00 00 04 02 00 04 04 04 10 00  ,@..(@..........
 0000060: 5a 00 84 03 00 00 00 00 01 01*0d*00*00 00 00 00  Z...............
 0000070:*a5*04 00 00

Dieses Board (Gigabyte GA-6OXM) unterstützt also das Aufwachen aus S4 (0xA5 = 10100101b) und das Setzten des Tages, nicht aber das Setzen des Monats.

Hinweise

  • Manche Mainboards sind etwas begriffsstutzig, so dass die Weckzeit zweimal in /proc/acpi/alarm geschrieben werden muss. Die gentoo-vdr-scripts machen das automatisch so
  • Manche Mainboards wachen nicht auf, wenn nach dem Speichern der Aufwachzeit die Hardwareuhr verändert wird. Unter gentoo muss der Parameter CLOCK_SYSTOHC in /etc/conf.d/clock dann auf no gestellt werden. Siehe auch die Liste getesteter Mainboards.
  • Wenn ein Board aus S4 aufwachen kann ist die Chance groß, dass es auch aus dem SoftOff erwacht

ACPI Test Script

#!/bin/bash

# Startet dem Rechner nach 3 min ueber acpi neu. 

min=`date "+%M"`
nextmin=`expr $min + 3`
nextboot=`date "+%Y-%m-%d %H:"$nextmin:00`
echo $nextboot > /proc/acpi/alarm  # einige Mainboards sind etwas begriffsstutzig,
echo $nextboot > /proc/acpi/alarm  # sie kapieren erst nach zwei Aufrufen, was Sache ist

echo "Aktuelle Zeit:         "`date "+%Y-%m-%d %H:%M:%S"`
echo "Starte Rechner neu um: "`cat /proc/acpi/alarm`
echo "Fahre Rechner nun runter." 

busybox poweroff
#/usr/bin/poweroff.pl
#poweroff

Liste getesteter Mainboards

Hier eine Liste von Mainboards bei denen Wecken per ACPI funktioniert, oder auch nicht funktioniert.

Von VDR Nutzern werden erfolgreich/nicht erfolgreich eingesetzt:

Mainboard ACPI i.o. Hinweise/Besonderheiten
VIA EPIA 800 nein Nur Wecken per set_timer funktioniert.
VIA EPIA M10000 ja Wakeup per RTC muss im BIOS deaktiviert werden,

nach setzen der ACPI Weckzeit darf die RTC per hwclock nicht mehr verändert werden.

VIA PC2500 ja Wakeup per RTC muss im BIOS deaktiviert werden,

nach setzen der ACPI Weckzeit darf die RTC per hwclock nicht mehr verändert werden: in /etc/default/rcS einfügen: HWCLOCKACCESS=no

Asus A8V Deluxe ja -/-
Asus P48X ja -/-
Asus P5B WIFI Deluxe AP ja -/-
Asus Pundit P1-AH2 ja Wakeup per RTC muss im BIOS deaktiviert sein

nach setzen der ACPI Weckzeit darf die RTC per hwclock nicht mehr verändert werden.

Gigabyte GA-6VEML ja mit BIOS v7
DFI CA63-SN ja Resume on Alarm muss im BIOS aktiviert sein und Datum und Zeit müssen alle auf 0 stehen.
MSI K8N NEO-FSR V2.0 S.754 (Version 3.0) ja Nur Uhrzeit, kein Tag einstellbar
ASUS M2A-VM (HDMI) ja 1.) Im BIOS: APM Configuration - Power on by RTC Alarm = "disabled"

2.) in /etc/default/rcS einfügen: HWCLOCKACCESS=no

ASUS M2R68L (P2-M2A690G Barebone) ja 1.) Im BIOS: APM Configuration - Power on by RTC Alarm = "disabled"

2.) in /etc/default/rcS einfügen: HWCLOCKACCESS=no

Shuttle XPC SN68SG2 ja 1.) Im BIOS: APM Configuration - Power on by RTC Alarm = "disabled"

2.) in /etc/default/rcS einfügen: HWCLOCKACCESS=no

Gigabyte GA-K8VT800 PRO ja 1.) Im BIOS: APM Configuration - Power on by RTC Alarm = "disabled"

2.) in /etc/default/rcS einfügen: HWCLOCKACCESS=no

siehe auch: http://linvdr.org/wiki/index.php?%20pagename=LinVDR-Mainboards

ACPI Schlafmodus

Mit ACPI kann man ausserdem das System schlafen legen, wenn das Mainboard mitspielt. Je nach BIOS werden verschiedene Modi unterstützt, S1 (Standby), S3 (Suspend to Ram) oder S4 (Suspend to Disk). Im Gegensatz zum vollständigen Shutdown braucht das Reaktivieren des Systems viel weniger Zeit.

S1: CPU und einige andere Komponenten werden abgeschaltet. Das ist die einfachste, schnellste und schonendste Variante, die aber auch am wenigsten Strom spart.

 echo -n "standby" > /sys/power/state

S3: Ausser dem Speicher wird alles abgeschaltet. Der Inhalt des Speichers bleibt so erhalten. Beim Einschalten kehrt das System zum ursprünglichen Zustand zurück. Man muss jedoch drauf achten dass vor dem Abschalten alle Dateisysteme unmounted werden (vor allem Festplatten oder Netzwerk-Dateisysteme), da sonst Datenverlust droht. Ausserdem sollte VDR beendet und die DVB Treiber entladen werden, weil die DVB Karten auch abgeschaltet werden und beim Reaktivieren neu initialisiert werden müssen.

 /etc/init.d/vdr stop
 /etc/init.d/dvb stop
 echo -n "mem" > /sys/power/state
 /etc/init.d/dvb start
 /etc/init.d/vdr start

Links

  1. acpi-wakeup-0.1.tar.bz2
  2. Anleitung
  3. "Computer programmgesteuert aufwecken" von Mirko Dölle, Linux-Magazin 8/2004
  4. ACPI-Projekthomepage (Dokumentation, Kernel-Patches, Wiki)
  5. ACPI 2.0 Spezifikation, Compaq/Intel/Microsoft/Phoenix/Toshiba 27. Juli 2000
In anderen Sprachen