ACPI-DSDT: Einrichten der "Smart-Battery" auf ACER-Laptops
Hallo zusammen,
Seit etwa 2.5 Jahren bin ich stolzer Besitzer eines Acer Extensa 3002 WLMi und eigentlich auch ganz zufrieden.
Einer der wirklich störenden Punkte war jedoch für mich immer, daß die Batteriestatus-Anzeige unter SuSE nicht funktionierte.
Zwar gab es immer wieder Lösungen, die wohl funktionierten, aber alle, die ich gefunden hatte, waren mit dem Patchen und Kompilieren eines eigenen Kernels verbunden, und da dies dann bei jedem Kernel-Update wieder der Fall wäre, habe ich das Ganze zunächst mal sein gelassen und es geriet in Vergessenheit.
Vor ein paar Tagen habe ich mich dann wieder ans Suchen im WWW gemacht und siehe da, es gab eine vielversprechende Lösung, die ich dann erfolgreich anwenden konnte OHNE meinen Kernel neu zu kompilieren. Wie sich später herausstellte, existiert diese Lösung zumindest prinzipiell schon etwas länger, aber was solls.
Diese Lösung möchte ich nun hier Schritt für Schritt vorstellen:
0. Das Prinzip
Im Endeffekt wird die -unter Linux fehlerhaft interpretierte- DSDT durch eine von uns gepatchte DSDT ersetzt und nicht - wie in den meisten "alten" Lösungen vorgeschlagen- in den neu zu erstellenden Kernel eingebunden, sondern in die Initial Ramdisk.
Dadurch wird beim Booten die gepatchte DSDT verwendet ... et voila .. die Batterieanzeige funktioniert.
DSDT? Was ist denn das überhaupt?
- Im Kernel muß der "ACPI DSDT in initrd"-Patch enthalten sein. Wer einen Vanilla-Kernel von kernel.org am Laufen hat, der muß diesen Patch einspielen und seinen Kernel nun doch neu kompilieren, aber das ist in diesem Fall nicht meine "Zielgruppe"
.
Wer einen SuSE-Distributionskernel verwendet, der braucht hier keine weiteren Vorarbeiten zu leisten.
Da wir in der initrd rumpatchen, ist es eine gute Idee, diese vorher zu sichern. Im Folgenden beschreibe ich das Ganze unter Verwendung von Konqueror, auch wenn ich selbst lieber die Kommandozeile verwende. Trotzdem sollte schon zu Beginn auch eine Konsole "griffbereit" sein.
a) Konqueror als root starten.
b) Ins Verzeichnis /boot/ wechseln und dort die Datei initrd-*aktuelleKernelversion*-default (oder wenn man einen smp-Kernel hat, da natürlich initrd-*aktuelleKernelversion*-smp) kopieren und als initrd-*Kernelversion*-default.bak einfügen.
Es existiert auch eine Verküpfung, die nur initrd heisst, diese kopieren wir jetzt ebenfalls und nennen die Datei initrd.bak. Nach diesem Schritt sollte das Ganze so in etwa aussehen:
Wie man sehen kann, zeigen die Links initrd und initrd.bak beide auf initrd-2.6.13-15.8-default.
c) Einen neuen Ordner erstellen (ich habe ihn in /opt/ erstellt und dsdt genannt) und dort ebenfalls eine Kopie der initrd-*aktuelleKernelversion*-default ablegen und diese in initrd-*aktuelleKernelversion*-default-dsdt umbenennen.
Achtung!: Wer /opt/ auf einer EXTRA-Partition hat, der sollte im Anschluß bevor er Schritt 3 ausführt, die gepatchte intrd in /boot/ kopieren und die Links entsprechend anpassen.
d) Den "Smart Battery System for Linux" DSDT-Patch von Rich Townsend (sbs-cm) hier
http://sourceforge.net/projects/sbs-linux/
herunterladen, entpacken und die Dateien in den Ordner /opt/dsdt/ kopieren.
So sollte das in etwa nach diesem Schritt aussehen.
2. Das eigentliche "Patchen" des DSDT
Hierzu benötigen wir den Intel ASL compiler "iasl", der bei sich normalerweise auch schon auf dem System befindet.
Eine Eingabe von
ohne weitere Parameter liefert dann in etwa Folgendes:
a) Auslesen der aktuellen DSDT aus /proc/acpi/ in eine Datei.
Nun sollte eine Datei dsdt.out im Verzeichnis /opt/dsdt/ auftauchen.
b) Disassembling ("Dekompilieren") der dsdt.out (Keine Sorge, ich bin bei Euch
).
Nun wurde die binäre dsdt.out in -menschenlesbaren- Quellcode umgewandelt und in die Datei dsdt.dsl geschrieben.
c) Patchen der dsdt.dsl mit dem geeigneten Patch.
Hierzu sollte man zuvor einen Blick in das README werfen:
(Hier wählt Ihr natürlich den für Euer Modell geeigneten Patch aus).
Das in etwa sollte ausgespuckt werden:
Die Zahlen können/werden differieren, aber wichtig ist, KEINE Fehlermeldungen.
d) Neukompilieren der nun gepatchten dsdt.dsl.
Auch hier gilt, Zahlen können anders sein, wichtig ist nur, KEINE Errors.
Wenn die Kompilation geklappt hat, dann sollte sich im Ordner /opt/dsdt/ eine Datei DSDT.aml befinden. Hat es nicht funktioniert, dann ist die DSDT selbst buggy und wer sich weiter reinknien will, der kann sich das HowTo im Gentoo-Forum ansehen.
http://forums.gentoo.org/viewtopic.php?t=122145
Sollte es jemandem gelingen, eine DSDT zu debuggen, dann gilt folgendes hier:
http://forums.gentoo.org/viewtopic.php?t=122145
(Abschnitt 10a *GRMBL*).
3. TEST: Gefahrloses Einbinden der gepatchten DSDT in eine Initial Ramdisk und Testlauf.
Nachdem wir nun eine gepatchte DSDT haben (DSDT.aml) müssen wir unserem System noch beibringen, sie auch zu verwenden. Um auf Nummer sicher zu gehen, testen wir zunächst, ob die neue DSDT überhaupt funktioniert.
a) Erzeugen einer initrd mit eingebundener DSDT.aml.
Hierzu rufen wir den Befehl "mkinitrd" mit dem Parameter -k (welcher Kernel soll verwendet werden), -a (was wollen wir EXTRA zur initrd hinzufügen) und -i (in welche Datei soll die neue initrd geschrieben werden) auf. Ich führe dies hier beispielhaft für den gerade aktuellen Kernel /boot/vmlinuz-2.6.13-15.8-default durch. Die neue initrd wird in /opt/dsdt/initrd-2.6.13-15.8-default-dsdt geschrieben.
---> Weiter gehts nach der nächsten Maus ääääh im nächsten Posting
.
Hallo zusammen,
Seit etwa 2.5 Jahren bin ich stolzer Besitzer eines Acer Extensa 3002 WLMi und eigentlich auch ganz zufrieden.
Einer der wirklich störenden Punkte war jedoch für mich immer, daß die Batteriestatus-Anzeige unter SuSE nicht funktionierte.
Zwar gab es immer wieder Lösungen, die wohl funktionierten, aber alle, die ich gefunden hatte, waren mit dem Patchen und Kompilieren eines eigenen Kernels verbunden, und da dies dann bei jedem Kernel-Update wieder der Fall wäre, habe ich das Ganze zunächst mal sein gelassen und es geriet in Vergessenheit.
Vor ein paar Tagen habe ich mich dann wieder ans Suchen im WWW gemacht und siehe da, es gab eine vielversprechende Lösung, die ich dann erfolgreich anwenden konnte OHNE meinen Kernel neu zu kompilieren. Wie sich später herausstellte, existiert diese Lösung zumindest prinzipiell schon etwas länger, aber was solls.
Diese Lösung möchte ich nun hier Schritt für Schritt vorstellen:
0. Das Prinzip
Im Endeffekt wird die -unter Linux fehlerhaft interpretierte- DSDT durch eine von uns gepatchte DSDT ersetzt und nicht - wie in den meisten "alten" Lösungen vorgeschlagen- in den neu zu erstellenden Kernel eingebunden, sondern in die Initial Ramdisk.
Dadurch wird beim Booten die gepatchte DSDT verwendet ... et voila .. die Batterieanzeige funktioniert.
DSDT? Was ist denn das überhaupt?
1. Vorarbeiten/Voraussetzungen.http://acpi.sourceforge.net/dsdt/index.php schrieb:What is a DSDT?
This is just a short introduction to DSDTs, see the specification, chapter 2.1 for more info.
DSDT is an acronym for Differentiated System Description Table. This table contains the Differentiated Definition Block, which supplies the information and configuration information about the base system. It is always inserted into the ACPI Namespace by the OS at boot time. Unfortunately, many hardware vendors and OEMs are not capable of supplying fully functional tables (not even the members of the ACPI SIG), see also the blacklist. So there is a need to patch these tables by us.![]()
- Im Kernel muß der "ACPI DSDT in initrd"-Patch enthalten sein. Wer einen Vanilla-Kernel von kernel.org am Laufen hat, der muß diesen Patch einspielen und seinen Kernel nun doch neu kompilieren, aber das ist in diesem Fall nicht meine "Zielgruppe"
Wer einen SuSE-Distributionskernel verwendet, der braucht hier keine weiteren Vorarbeiten zu leisten.
- Sicherungskopien anlegen, falls denn etwas schiefgehen sollte und sich einen "Arbeitsordner" schaffen, in dem wir dann die Patches anwenden und Tests durchführen können.http://gaugusch.at/kernel.shtml schrieb:SuSE, Mandriva and Ubuntu, as well as other distros, already include this patch in the default kernel, no need for re-compiling your kernel! In SuSE, have a look at /etc/sysconfig/kernel for more information (ACPI_DSDT=...)
Da wir in der initrd rumpatchen, ist es eine gute Idee, diese vorher zu sichern. Im Folgenden beschreibe ich das Ganze unter Verwendung von Konqueror, auch wenn ich selbst lieber die Kommandozeile verwende. Trotzdem sollte schon zu Beginn auch eine Konsole "griffbereit" sein.
a) Konqueror als root starten.
Code:
kdesu konqueror
Es existiert auch eine Verküpfung, die nur initrd heisst, diese kopieren wir jetzt ebenfalls und nennen die Datei initrd.bak. Nach diesem Schritt sollte das Ganze so in etwa aussehen:
Code:
cd /boot/
ls -ls initrd*
0 lrwxrwxrwx 1 root root 26 2006-05-21 03:06 initrd -> initrd-2.6.13-15.8-default
2194 -rw-r--r-- 1 root root 2240885 2006-05-21 03:06 initrd-2.6.13-15.8-default
2194 -rw-r--r-- 1 root root 2240705 2006-05-21 02:20 initrd-2.6.13-15.8-default.bak
0 lrwxrwxrwx 1 root root 26 2006-05-21 03:07 /boot/initrd.bak -> initrd-2.6.13-15.8-default
c) Einen neuen Ordner erstellen (ich habe ihn in /opt/ erstellt und dsdt genannt) und dort ebenfalls eine Kopie der initrd-*aktuelleKernelversion*-default ablegen und diese in initrd-*aktuelleKernelversion*-default-dsdt umbenennen.
Achtung!: Wer /opt/ auf einer EXTRA-Partition hat, der sollte im Anschluß bevor er Schritt 3 ausführt, die gepatchte intrd in /boot/ kopieren und die Links entsprechend anpassen.
d) Den "Smart Battery System for Linux" DSDT-Patch von Rich Townsend (sbs-cm) hier
http://sourceforge.net/projects/sbs-linux/
herunterladen, entpacken und die Dateien in den Ordner /opt/dsdt/ kopieren.
Code:
cd /opt/dsdt/
ls -ls
acer-tm32xx-sbs-cm.diff
acer-tm4xxx-sbs-cm.diff
acpi-ec-nospinlock-2.6.10.diff
acpi-ec-nospinlock-2.6.11.diff
acpi-ec-nospinlock-2.6.12.diff
acpi-ec-nospinlock-2.6.13.diff
acpi-ec-nospinlock-2.6.14.diff
COPYING
initrd-2.6.13-15.8-default-dsdt
README
sbs-cm-1b.asl
sbs-cm-2b.asl
smbus-cm.asl
2. Das eigentliche "Patchen" des DSDT
Hierzu benötigen wir den Intel ASL compiler "iasl", der bei sich normalerweise auch schon auf dem System befindet.
Eine Eingabe von
Code:
su
(Passwort)
iasl
OK, noch einmal TIIIIIIIIIIEEEEEEEEEF Durchatmen und los gehts (die folgenden Schritte sind als root in der Konsole auszuführen).Intel ACPI Component Architecture
ASL Optimizing Compiler version 20050902 [Sep 9 2005]
Copyright (C) 2000 - 2005 Intel Corporation
Supports ACPI Specification Revision 3.0
....... usw usw.
Code:
su
(Passwort)
cd /opt/dsdt/
Code:
cat /proc/acpi/dsdt > dsdt.out
b) Disassembling ("Dekompilieren") der dsdt.out (Keine Sorge, ich bin bei Euch
Code:
iasl -d dsdt.out
Intel ACPI Component Architecture
AML Disassembler version 20050902 [Sep 9 2005]
Copyright (C) 2000 - 2005 Intel Corporation
Supports ACPI Specification Revision 3.0
Loading Acpi table from file dsdt.out
Acpi table [DSDT] successfully installed and loaded
Pass 1 parse of [DSDT]
Pass 2 parse of [DSDT]
Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)
.....................................................................
Parsing completed
Disassembly completed, written to "dsdt.dsl"
c) Patchen der dsdt.dsl mit dem geeigneten Patch.
Hierzu sollte man zuvor einen Blick in das README werfen:
Dazu muss man nichts mehr sagen, oder? Wählt euer Modell aus und los gehts:Patches
-------
In this release, two patches are available; the list below indicates
what machines these patches are expected/known to work on:
acer-tm4xxxx-sbs-cm.diff
*) Acer Extensa 3001WLMi [w]
*) Acer Extensa 3002WLMi [w]
*) Acer TravelMate 4000LMi [c]
*) Acer TravelMate 4000WLMi [w]
*) Acer TravelMate 4001LMi [w]
*) Acer TravelMate 4001WLMi [w]
*) Acer TravelMate 4002LMi [w]
*) Acer TravelMate 4502LMi [w]
*) Acer TravelMate 4502WLMi [w]
acer-tm32xx-sbs-cm.diff
*) Acer TravelMate 2303LCi [w]
*) Acer TravelMate 3201XCi [w]
*) Acer TravelMate 3202XCi [w]
Code:
patch < XXXXXXXX-sbs-cm.diff
Das in etwa sollte ausgespuckt werden:
Code:
Hunk #1 succeeded at 3730 (offset 475 lines).
Hunk #2 succeeded at 3758 (offset 475 lines).
Hunk #3 succeeded at 5338 (offset 411 lines).
d) Neukompilieren der nun gepatchten dsdt.dsl.
Code:
iasl dsdt.dsl
Compilation complete. 0 Errors, 7 Warnings, 0 Remarks, 933 Optimizations
Wenn die Kompilation geklappt hat, dann sollte sich im Ordner /opt/dsdt/ eine Datei DSDT.aml befinden. Hat es nicht funktioniert, dann ist die DSDT selbst buggy und wer sich weiter reinknien will, der kann sich das HowTo im Gentoo-Forum ansehen.
http://forums.gentoo.org/viewtopic.php?t=122145
Sollte es jemandem gelingen, eine DSDT zu debuggen, dann gilt folgendes hier:
Und vor allem auch:http://acpi.sourceforge.net/dsdt/index.php schrieb:Add and Edit
Of course, you can also add or edit a DSDT. Before you can add one, you have to create a user in our user database. Registered users can add DSDTs and "sign" comments for a DSDT.
Warum mir bei dem letzten Nebensatz die Zornesröte ins Gesicht steigt, könnt ihr hier nachlesen:http://acpi.sourceforge.net/wiki/index.php/SuseHowToLoadCustomDsdtTable schrieb:Don'f forget to mail your BIOS vendor your patch, somebody has to educate them how to do it right.
http://forums.gentoo.org/viewtopic.php?t=122145
(Abschnitt 10a *GRMBL*).
3. TEST: Gefahrloses Einbinden der gepatchten DSDT in eine Initial Ramdisk und Testlauf.
Nachdem wir nun eine gepatchte DSDT haben (DSDT.aml) müssen wir unserem System noch beibringen, sie auch zu verwenden. Um auf Nummer sicher zu gehen, testen wir zunächst, ob die neue DSDT überhaupt funktioniert.
a) Erzeugen einer initrd mit eingebundener DSDT.aml.
Hierzu rufen wir den Befehl "mkinitrd" mit dem Parameter -k (welcher Kernel soll verwendet werden), -a (was wollen wir EXTRA zur initrd hinzufügen) und -i (in welche Datei soll die neue initrd geschrieben werden) auf. Ich führe dies hier beispielhaft für den gerade aktuellen Kernel /boot/vmlinuz-2.6.13-15.8-default durch. Die neue initrd wird in /opt/dsdt/initrd-2.6.13-15.8-default-dsdt geschrieben.
---> Weiter gehts nach der nächsten Maus ääääh im nächsten Posting