Asus M6N-Kompendium: ACPI
Aus Wikibooks
[Bearbeiten] DSDT
Die Differentiated System Descriptor Table (DSDT) der ASUS M6N Serie war eines der größten Probleme die man mit diesen Notebooks, bei der Verwendung von Linux, hatte. In Bios Version 0214A ist aber ein Fehler, der das Auslesen des Batterie-Status erschwerte, behoben worden.
Für ältere Bios Versionen, gibt es die Möglichkeit die DSDT selbst zu reparieren. Wie man das macht ist nachfolgend beschrieben. Die Anleitung folgt der, die im Forum von encke.net zu finden ist.
- Man lädt sich die aktuellste "ACPI CA - Unix Build Environment" von [1] herunter.
- Datei entpacken
- In das Unterverzeichnis compiler wechseln und den iasl mit make kompilieren.
- Als root liest man die vorhandene DSDT aus und sichert sie in eine Datei. Befehl: cat /proc/acpi/dsdt > dsdt
- Die DSDT muss mit dem iasl disassemblieren werden. Befehl: iasl -d dsdt
- Die entstandene dsdt.dsl muss nun repariert werden. Das kann von Hand oder über einen Patch geschehen. Folgende Fehler müssen beseitigt werden (Die Zeilenangaben können variiren und sind somit nur Richtwerte):
- Zeilen: 1535,1536,1543 → "IO" muss durch "IO_" ersetzt werden. Vermutlich ein BUG im Compiler.
- Zeilen: 4936, 4945, 4954, 5432, 5443 → Die If (SS#) {} mit ihrer Klammerung müssen gelöscht werden. Die Name () Deklarationen müssen stehen bleiben.
- Zeile: 645 → Der /*** */ Kommentar muss durch "EndDependentFn ()" ersetzen werden.
- Zeilen: 2699, 2960 → In die Methoden "BST0" muss am Ende ein "Return (Local0)" einfügen werden
- Die geänderte dsdt.dsl mit dem iasl compilieren. Befehl: iasl -tc -oa dsdt.dsl
- Die entstandene dsdt.hex oder DSDT.aml muss in den Kernel bzw. die Initrd gepatcht werden. Das kann man folgendermassen machen:
- Einfügen der dsdt.hex in den Kernel über osl-Patch
- Bei den 2.6er Kerneln (bis 2.6.9) ist es nötig, dafür die Datei osl.c zu patchen. Dafür lädt man sich den osl.patch herunter.
- Man kopiert den Patch nach /usr/src. Befehl: cp osl-2.6.7.patch /usr/src
- Mit dem Kommando patch muss die osl.c nun gepatcht werden. Befehle: "cd /usr/src" gefolgt von "patch -p0 < osl.patch"
- Die dsdt.hex muss ins Verzeichniss /usr/src/linux/drivers/acpi/ kopiert werden. Befehl: cp {Quellverzeichniss}/dsdt.hex /usr/src/linux/drivers/acpi
- Nun kann der Kernel mit der reparierten DSDT kompiliert werden.
- Einfügen über Kerneloption
Bei Kerneln ab 2.6.9 geht es folgender:
Einfach in der Kernel Konfiguration unter "Power management options" -> "ACPI (Advanced Configuration and Power Interface) Support" -> "Include Custom DSDT " einschalten und darunter, bei "Custom DSDT Table file to include" den Pfad zu der dsdt.hex angeben, anschließend Kernel neu bauen und installieren.
Bei einem Kernel ab 2.6.12 darauf achten, dass "Device Drivers" -> "Generic Driver Options" -> "Select only drivers that don't need compile-time external firmware" aus ist.
- Einfügen der dsdt.hex in den Kernel über osl-Patch
Es gibt auch eine Alternative zum Reparieren der DSDT und zwar den aml Patch. Mit diesem funktioniert unter anderem der Batteriestatus mit der orginal DSDT. Dies kann z.B. sehr hilfreich sein, wenn man nach der Bearbeitung Probleme mit dem Rechner hat. Um den Patch zu nutzen, geht man wie folgt vor:
- Herunterladen des Patches von → http://m6n.ath.cx/aml_method_exec_hack.patch
- Kopieren der Datei nach /usr/src/linux. Befehl: cp {Quellverzeichniss}/aml_method_exec_hack.patch /usr/src/linux
- Den Patch mit dem Kommando patch einspielen. Befehle: "cd /usr/src/linux" gefolgt von "patch -p1 < aml_method_exec_hack.patch"
- Nun muss der gepatchte Kernel konfiguriert, kompiliert und in den Bootloader aufgenommen werden.
[Bearbeiten] Speedstep
Notwendige Module laden (wenn nicht fest in den Kernel eingebaut):
- modprobe speedstep-centrino
Aktuelle Geschwindigkeit ermitteln:
- cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq
Die Anpassung des Prozessortaktes an die aktuelle Systemlast kann man dem Kernel überlassen. Dafür muss der "ondemand" CPU-Frequenzregler im Kernel sein, oder als Modul vorhanden sein. Einschalten kann man diesen Regler mit dem folgenden Befehl:
- echo "ondemand" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
Ab Kernel 2.6.12 kann alternativ der "conservative" CPU-Frequenzregler benutzt werden, welcher funktional dem "ondemand" gleichkommt, aber weniger hekisch regelt was sich bei mobilen Geräte günstig auf den Stromverbrauch auswirken sollte. Natürlich ist dieser zuvor in der Kernel-Config zu aktivieren und dann :
- echo "conservative" > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
[Bearbeiten] Zusatztasten
Die Zusatztasten gehören zur ACPI-Event-Gruppe "hotkey" und haben jeweils eine spezielle Eventnummer die sie identifiziert. Die folgende Liste zählt diese auf:
Tasten über dem Tastaturfeld:
- 00000050 E-Mail-Taste
- 00000051 Internet-Taste
- 0000005d WLAN-Taste
- 0000006a Touchpad an/aus Taste
- 0000005c Speedstep-Taste
Tasten an der linken Seite:
- 00000040 CD-Zurück-Taste
- 00000043 CD-Stop-Taste
- 00000045 CD-Play-Taste
- 00000041 CD-Vorwärts-Taste
- 0000004c CD-Audio-Taste
Tastenkombination auf dem Tastaturfeld:
- 0000005d Tastenkombination(Fn+F2) = WLAN
- 0000002b Tastenkombination(Fn+F5) = Dunkler
- 0000001c Tastenkombination(Fn+F6) = Heller
- 00000034 Tastenkombination(Fn+F7) = Display aus
- 00000033 Tastenkombination(Fn+F7) = Display an
- 00000061 Tastenkombination(Fn+F8) = Display wechseln
- 00000032 Tastenkombination(Fn+F10) = Stumm
- 00000031 Tastenkombination(Fn+F11) = Leiser
- 00000030 Tastenkombination(Fn+F12) = Lauter
Die Tasten für Display an/aus sowie heller und dunkler müssen nicht softwareseitig gesteuert werden, sie funktionieren ohne spezielle Konfiguration. Die Powertaste und die Sleep-Tastenkombination gehören zur ACPI-Event-Gruppe "button". Sie werden über einen, durch / von der Gruppe getrennten, Identifizierer (z.B. button/power) bestimmt.
- power Powertaste
- sleep Tastenkompination(Fn+F1) = Sleep
so hier mal ein kleines beispielscript für die tasten ;-)
/ect/acpi/default.sh :
#!/bin/bash
set $*
group=${1/\/*/}
action=${1/*\//}
# runlevel to use in AC mode
#RLVL_AC="default"
# runlevel to use in battery mode
#RLVL_BATTERY="battery"
# file indicating the AC state. Verify the filename before using
#AC_STATE="/proc/acpi/ac_adapter/AC/state"
# this string means running on AC
#AC_ON="on-line"
# this string means running on batteries
#AC_OFF="off-line"
#function SwitchRunlevel() {
# if [[ "$(grep ${AC_OFF} ${AC_STATE})" != "" && "$(cat /var/lib/init.d/softlevel)" != "${RLVL_BATTERY}" ]]
# then
# logger "Switching to ${RLVL_BATTERY} runlevel"
# /sbin/rc ${RLVL_BATTERY}
# elif [[ "$(grep ${AC_ON} ${AC_STATE})" != "" && "$(cat /var/lib/init.d/softlevel)" != "${RLVL_AC}" ]]
# then
# logger "Switching to ${RLVL_AC} runlevel"
# /sbin/rc ${RLVL_AC}
# fi
#}
## Dieser teil ist für Leute gut, die beim einstöpseln vom Strom
## in ein bestimmtes runlevel wechseln wollen...
case "$group" in
button )
case "$action" in
power )
case $3 in
00000080 )
shutdown -h 1 > /dev/null
;;
esac
;;
*)
;;
esac
;;
hotkey )
case "$3" in
00000057 )
speedfreq -p powersave
echo "0" > /proc/acpi/asus/mled
;;
00000058 )
speedfreq -p performance
echo "1" > /proc/acpi/asus/mled
;;
0000005c )
if [ "$(speedfreq -s | grep -o performance)" == "performance" ]
then
logger "Switching to battery saving"
speedfreq -p powersave
echo "0" > /proc/acpi/asus/mled
else
logger "Switching to performance mode"
speedfreq -p performance
echo "1" > /proc/acpi/asus/mled
fi
;;
0000005d )
logger "Starting Wlan"
wlan-uni
;;
00000040 )
xmms -r
;;
00000043 )
xmms -s
;;
00000045 )
xmms -t
;;
00000041 )
xmms -f
;;
00000032 )
if [ "$(amixer | head -n 5 | grep -o '\[on\]')" == "[on]" ]
then
logger "Mute"
amixer set Master mute > /dev/null
else
logger "Unmute"
amixer set Master unmute > /dev/null
fi
;;
00000031 )
amixer set Master 1- > /dev/null
;;
00000030 )
amixer set Master 1+ > /dev/null
;;
*)
logger "ACPI group battery / action $action is not defined"
;;
esac
;;
*)
logger "ACPI group $group / action $action is not defined"
;;
esac
← Grafik | Inhalt | C1-C4 States →

