ACPI Wakeup
(→Kernel ab 2.6.22) |
(→Kernel ab 2.6.22) |
||
Zeile 24: | Zeile 24: | ||
Bei manchen Mainboards muss man den [[wikipedia:High Precision Event Timer|HPET]] deaktivieren. | Bei manchen Mainboards muss man den [[wikipedia:High Precision Event Timer|HPET]] deaktivieren. | ||
Die Deaktivierung erreicht man indem man dem kernel ''hpet=disable'' als Parameter übergibt. | Die Deaktivierung erreicht man indem man dem kernel ''hpet=disable'' als Parameter übergibt. | ||
− | Da die RTC-Treiber ein HPET-Gerät emulieren genügt es nicht während der Kernel-Konfiguration ''CONFIG_HPET'' abzuwählen!</span> | + | Da die RTC-Treiber ein HPET-Gerät emulieren genügt es nicht während der Kernel-Konfiguration ''CONFIG_HPET'' abzuwählen! HPET lässt sich auch in manchen BIOSsen ausschalten.</span> |
Beispiel: | Beispiel: |
Version vom 27. September 2010, 07:55 Uhr
Inhaltsverzeichnis |
Anwendung
Kernel < 2.6.22 (veraltet)
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.
Beispiel:
echo 2006-02-09 23:05:00 > /proc/acpi/alarm
Kernel ab 2.6.22
Der Pfad lautet /sys/class/rtc/rtc0/wakealarm. Näheres zur benötigten Kernelkonfiguration siehe MythTV-Wiki-Eintrag zu ACPI-Wakeup. Die Weckzeit wird als Anzahl der Sekunden seit dem 01.01.1970 erwartet und ohne Beachtung der jeweiligen Zeitzone in YYYY-MM-DD HH:MM:SS umgerechnet. Es ist daher ratsam, die Systemuhr in UTC laufen zu lassen, um im Shutdown-Skript keine Zeitzonen-abhängige Korrektur der vom VDR kommenden UTC-Zeiten vornehmen zu müssen.
$ hwclock --systohc --utc # the hardware clock is kept in UTC
Wenn UTC eingestellt ist, trifft folgendes zu:
- Im BIOS wird UTC Zeit statt der lokalen Zeit angezeigt.
- In /etc/default/rcS ist UTC=yes eingetragen
- Ein hwclock --debug gibt aus:
- Hardware clock is on UTC time
- Assuming hardware lock is kept in UTC time
Ist bereits ein wakealarm Wert gesetzt, so muss der Alarm erst wieder deaktiviert werden, sonst schlägt ein zweites Setzen fehl. Dies geschieht durch Setzen eines Datums in der Vergangenheit (z.B. 0).
ACHTUNG: Bei manchen Mainboards muss man den HPET deaktivieren. Die Deaktivierung erreicht man indem man dem kernel hpet=disable als Parameter übergibt. Da die RTC-Treiber ein HPET-Gerät emulieren genügt es nicht während der Kernel-Konfiguration CONFIG_HPET abzuwählen! HPET lässt sich auch in manchen BIOSsen ausschalten.
Beispiel:
echo 0 > /sys/class/rtc/rtc0/wakealarm date +%s -d "Fri Feb 22 21:00:00 MET 2008" > /sys/class/rtc/rtc0/wakealarm
Kernel 2.6.26 (Debian 5.0 lenny)
In der Linux Kernelversion 2.6.26, die von Debian 5.0 (lenny) standardmäßig verwendet wird, ist ACPI Wakeup offenbar kaputt. Man kann z.B. einen eigenen Kern Version 2.6.27 installieren um das Problem zu lösen. (Ein aktuellerer Kern führte hier leider zu anderen Inkompatibilitäten.) Hinweis: Mit dem aktuellen Kernel 2.6.26-2-686 funktioniert das aufwecken problenlos. Sofern man die Aufweckzeit korrekt setzt (UTC, vorher auf 0 setzen...)
Test
Bei beiden Varianten kann mittels...
cat /proc/driver/rtc
...der Erfolg des Setzens überprüft werden.
Überprüfen der Hardwarefähigkeiten
Voraussetzung für das Funktionieren von ACPI-Wakeup ist natürlich ein ACPI-fähiges Mainboard, was auf alle Consumer-Mainboards ab dem Jahr 2000 zutreffen sollte. Bevor man sich genauer mit der Thematik auseinandersetzt, ist es sinnvoll, die Fähigkeiten des Mainboards 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 Pseudo-Datei 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 Mainboard 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 Mainboard (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-Skripte machen das bereits.
- Manche Mainboards wachen nicht auf, wenn nach dem Speichern der Aufwachzeit die Hardwareuhr verändert wird, was meist beim Herunterfahren mittels eines Init-Skriptes geschieht. Die meisten Distributionen halten einen Parameter in ihren Init-Skripten oder Konfigurationsdateien bereit, um dieses zu deaktivieren. Alternativ kann man das Skript auch so modifizieren, dass es direkten ISA-Zugriff verwendet. Dazu dem hwclock-Aufruf "hwclock --systohc" zusätzlich den Parameter "--directisa" mitgeben. Das Skript findet man mit:
grep "hwclock" /etc/init.d/*
- weitere ausführliche Lösungen für debian, ubuntu, redhat, suse mythtv.org
nur debian systeme: /etc/init.d/hwclock.sh editieren, unter help.ubuntu.com
- Wenn ein Board aus S4 aufwachen kann, ist die Chance groß, dass es auch aus dem SoftOff erwacht, auch wenn dies vom ACPI-Standard nicht vorgesehen ist.
- ACPI-Wakeup ist verwandt mit der BIOS-Option "Wake on RTC", bei der man im BIOS eine Aufwachzeit einstellt. Diese Option muss je nach Mainboard mal aktiviert, mal deaktiviert sein, damit ACPI-Wakeup funktioniert.
ACPI Test Script
#!/bin/bash # Startet dem Rechner nach 3 Minuten über ACPI neu. DEV=/sys/class/rtc/rtc0/wakealarm #DEV=/proc/acpi/alarm # Fuer Kernel < 2.6.22 now=`date +%s` nextboot=`echo "$now + 3 * 60" | bc` echo 0 > $DEV echo $nextboot > $DEV # Einige Mainboards sind etwas begriffsstutzig, #echo $nextboot > $DEV # sie kapieren erst nach zwei Aufrufen, was Sache ist. echo "Aktuelle Zeit: "`date "+%Y-%m-%d %H:%M:%S"` echo cat /proc/driver/rtc echo echo "Fahre Rechner runter." #busybox poweroff #/usr/bin/poweroff.pl poweroff
VDR Shutdown Scripts
Meine Uhr läuft auf Localtime (UTS=no in /etc/rcS bzw. /etc/defaults/rcS) - deshalb funktioniert bei mir folgendes Skript:
sudo hwclock --systohc --localtime DEV=/sys/class/rtc/rtc0/wakealarm #DEV=/proc/acpi/alarm # Fuer Kernel < 2.6.22 #ACPI echo "Arguments: $*" echo "Next timer: $1 seconds from 1970/01/01, UTC" echo "Next timer: $2 seconds from now" naechsterTimer=$(/bin/date --date "now +$2 seconds" "+%s") #naechsterTimer=$(/bin/date --date "now +$2 seconds" "+%Y-%m-%d %H:%M:%S")# Fuer Kernel < 2.6.22 sudo chmod a+wr $DEV # wakealarm löschen (wenn schon gesetzt, muss er gelöscht werden) echo 0 > $DEV #alarm setzen echo $naechsterTimer > $DEV echo $naechsterTimer > $DEV sudo /sbin/shutdown -h now EXITSTATUS=0 exit $EXITSTATUS
Anmerkung: der Vdr ruft dieses Skript mit den Parametern "Uhrzeit des nächster Timerevent in utc" und "Sekunden bis dahin" wie unschwer zu erkennen ist bezieht sich $2 bei der Zuweisung von naechsterTimer auf diesen zweiten Parameter.
Eine Alternative unter Verwendung der lokalen Zeit (MET/CEST) die auf den ersten übergebenen Parameter zurückgreift:
echo "*************************" echo "****VDR ACPI SHUTDOWN****" echo "*************************" ntpdate <timeserver einguegen> hwclock --systohc --localtime DEV=/sys/class/rtc/rtc0/wakealarm #DEV=/proc/acpi/alarm # Fuer Kernel < 2.6.22 DATE=/bin/date if [[ "$DATE" =~ "CEST" ]]; then TIMER=`echo "$1 + 2 * 60 * 60" | bc`; else TIMER=`echo "$1 + 60 * 60" | bc`; fi echo 0 > $DEV echo $TIMER > $DEV /sbin/shutdown -h now EXITSTATUS=0 exit $EXITSTATUS
Anmerkung: Dieses Skript funktioniert bei lokaler Zeit, da es zuerst überprüft ob momentan Sommer-/Winterzeit ist und anschließend zur UTC 1, bzw. 2 Stunden dazurechnet um die korrekte Zeit zum Aufwachen zu setzen.
Liste getesteter Mainboards
Hier eine Liste von Mainboards, bei denen das Aufwachen per ACPI funktioniert oder aber auch nicht funktioniert.
Von VDR-Benutzern werden erfolgreich bzw. nicht erfolgreich eingesetzt:
Mainboard | ACPI i.o. | systohc bug-free | Hinweise/Besonderheiten | |
Acer FMCP7A-ION | ja | Acer Revo 3610 | ||
Asrock A780GMH/128M | nein | |||
Asus P2B-DS | ja | Board-Rev. ist 1.06 D03. Mainboard muss zunächst aus der Blacklist für ACPI entfernt werden, da ältere Revisionen offensichtlich einen Bug im ACPI-Support hatten. | ||
Asus M3N WS | ja | problemlos | ||
Asus A7V333-X | ja | |||
Asus A8V Deluxe | ja | |||
Asus P48X | ja | |||
Asus P5B WIFI Deluxe AP | ja | |||
Asus P5QL Pro | ja | ? | Wakeup per RTC muss im BIOS deaktiviert sein. | |
Asus P5K | ja | nein | Wakeup per RTC muss im BIOS deaktiviert sein. | |
Asus Pundit P1-AH2 | ja | nein | Wakeup per RTC muss im BIOS deaktiviert sein. | |
Asus M2A-VM (HDMI) | ja | nein | 1.) Im BIOS: APM Configuration - Power on by RTC Alarm = "disabled"
Bei Kernel >= 2.6.22 muss zusätzlich der Kernel-Paramter hpet=disable gesetzt werden. | |
Asus M3N78-VM (HDMI) | ja | IMHO ja | 1.) Im BIOS: APM Configuration - Power on by RTC Alarm = "disabled"
getestet mit /sys/class/rtc/rtc0/wakealarm | |
Asus M3N78-PRO (HDMI) | ja | IMHO ja | 1.) Im BIOS: APM Configuration - Power on by RTC Alarm = "disabled" | |
Asus M2NPV-VM | ja | nein | Im BIOS: APM Configuration - Power on by RTC Alarm = "disabled" | |
Asus M2R68L (P2-M2A690G Barebone) | ja | nein | Im BIOS: APM Configuration -> Power on by RTC Alarm = "disabled"
Bei Kernel >= 2.6.22 muss zusätzlich der Kernel-Paramter hpet=disable gesetzt werden. | |
Asus T3-M3N8200 (Barebone) | ja | n/a | Funktioniert mit Kernel-Parameter hpet=disable (ohne habe ich nicht getestet) | |
Asus M3A-H/HDMI | ja | nein | Im BIOS: Power -> APM Configuration -> Power on by RTC Alarm = "disabled" | |
DFI CA63-SN | ja | Resume on Alarm muss im BIOS aktiviert sein und Datum und Zeit müssen alle auf 0 stehen. | ||
Gigabyte GA-6VEML | ja | mit BIOS v7 | ||
Gigabyte GA-8I915G-MF | ja | ja | nvram + S3
S3 --> hwclock --systohc --directisa && sync && sleep 3s && s2ram --force | |
Gigabyte GA-K8VT800 PRO | ja | nein | 1.) Im BIOS: APM Configuration -> Power on by RTC Alarm = "disabled" | |
Gigabyte GA-5AX | ja | 1.) Im BIOS: APM Configuration -> PM by APM - RTC Alarm = "enabled" und feste Zeit eingestellt
(vermutlich egal, startet so aber nach zu langem Stromausfall das nächste Mal mit der eingestellten Zeit) 2.) Ist mit dem ACPI Test-Script nach 3 min neu gestartet (Nach Abzug von 1std. im Script, wegen "CET-Zeit") | ||
Gigabyte GA-M61P-S3 | ja | nein | 1.) Im BIOS: APM Configuration -> Power on by RTC Alarm = "disabled" | |
Gigabyte GA-MA770T-UD3 Rev. 1.2 | ja | ? (ja) | Im Bios: Power Management Setup -> HPET Support = "disabled", funktioniert nicht, wenn enabled. Mit Ubuntu 10.04 Standard-Config kein Problem mit systohc feststellbar. | |
Gigabyte GA-MA78GM-S2H (rev.1.1) BIOS F5 | ja | ? | getest mit 2.6.27.7 rtc_cmos und hpet=disable | |
Gigabyte GA-MA78G-DS3H (Rev: 2.0) | ja | 1) Im BIOS: Power Management Setup -> Power on by Alarm = Disabled
2) Dem Kernel hpet=disable mitgeben (Kernel) Ubuntu 8.10 (32 Bit) // Uhrzeit und Tag einstellbar | ||
Gigabyte GA-MA78GM-UD2H | ja | ? | kernel 2.6.31.6 "hpet=disable" übergeben und im BIOS (Menüpunkt: Power Management Setup) "Power-On by Alarm" ebenfalls auf disable gesetzt | |
Gigabyte M85M-US2H | ja | nein ? |
| |
MSI K8N NEO-FSR V2.0 S.754 (Version 3.0) | ja | Nur Uhrzeit, kein Tag einstellbar. | ||
MSI MS-6723 ver:1 (OEM Board im REAL Digitainer) | ja | Wakeup per RTC wurde im BIOS deaktiviert.
BIOS 6.02 und Kernel 2.6.23.9 | ||
MSI MS-7318 (OEM Board im Medion 8818) | ja | nein | Wakeup per RTC wurde im BIOS deaktiviert.
ubuntu 8.04 | |
MSI K9AG Neo2-Digital | ja | sowohl per /proc/acpi/alarm als auch /sys/class/rtc/rtc0/wakealarm im BIOS 'Resume by RTC Alarm' disabled. | ||
MSI 945GT Speedster-A4R | ja | nein | Mit /proc/acpi/alarm oder /sys/class/rtc/rtc0/wakealarm und im BIOS 'Resume by RTC Alarm' disabled.
Mit aktuelle Debian Lenny linux-image-2.6.26-13 klappt es aber nicht (/proc/driver/rtc sieht richtig aus aber kein wakeup!). Fungiert wieder mit z.b. Sidux linux-image-2.6.27+ wie in http://www.vdrportal.de/board/thread.php?threadid=83028 . | |
NMC 8TAX+ | ja | ? | Das Board ist baugleich mit Enmic 8TAX+. | |
Shuttle XPC SN68SG2 | ja | nein | 1.) Im BIOS: APM Configuration -> Power on by RTC Alarm = "disabled" | |
VIA EPIA 800 | nein | Nur Wecken per set_timer funktioniert. | ||
VIA EPIA ML5000 | ja | Ist mit dem ACPI Test-Script aus dem Standby gestartet. | ||
VIA EPIA ME6000 | ja | nein | Kernel 2.6.26, RTC auf UTC, BIOS 1.13 | |
VIA EPIA ME6000G | nein | siehe NVRAM_WakeUp | ||
VIA EPIA M10000 | ja | nein | Wakeup per RTC muss im BIOS deaktiviert werden. | |
VIA PC2500 | ja | nein | Wakeup per RTC muss im BIOS deaktiviert werden.
In /etc/default/rcS einfügen: HWCLOCKACCESS=no | |
VIA SP13000 | ja | ja | ||
VIA EPIA EN 15000G | ja | ja | Wakeup per RTC muss im BIOS deaktiviert werden.
echo "2010-03-28 23:07:00" > /proc/acpi/alarm Wacht aus S3 (Suspend2Ram) auf. |
systohc bug = einige Mainboards wachen nicht auf, wenn nach dem setzen der Weckzeit die Hardwareuhr per hwclock --systohc aktualisiert wird. (bei vielen Distributionen der Fall) Details siehe auch im Abschnitt Hinweise innerhalb dieses Artikels.
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 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
S4: Suspend to disk (aka Ruhezustand). Der Arbeitsspeicher inkl. Videoram wird auf der Swap-Partition abgelegt. Diese Partition muss als Kernelbootoption mit resume=/dev/sdxy übergeben werden - oder wenn suspend to disk nur verwendet wird, da das Board aus S5 nicht aufwacht, man jedoch auf einen sauberen Bootvorgang angewiesen ist, dann kann man auch in /etc/rc.local folgende Sequenz einfügen:
swapoff -a mkswap /dev/sdxy swapon -a
Kommando für S4:
echo -n "disk" > /sys/power/state
Links
- http://linvdr.org/wiki/index.php?%20pagename=LinVDR-Mainboards
- acpi-wakeup-0.1.tar.bz2
- Anleitung
- "Computer programmgesteuert aufwecken" von Mirko Dölle, Linux-Magazin 8/2004
- ACPI-Projekthomepage (Dokumentation, Kernel-Patches, Wiki)
- ACPI 2.0 Spezifikation, Compaq/Intel/Microsoft/Phoenix/Toshiba 27. Juli 2000