Humboldt-Universität zu Berlin, Institut für Informatik

Linux auf HP 6715s (HP 6715b)

Anfang Oktober 2007 war ich auf der Suche nach einem Business Notebook, also mit Augenmerk auf mattem Display und solider Verarbeitung. Gedacht ist es für mein Studium, für das ich dringend ein NB benötigte. Bei der Suche in mehreren Onlineshops bin ich auf dieses Notebook aufmerksam geworden, da es die Vorteile der Business Notebooks hatte aber trotzdem sehr günstig war ohne ein klappriges Billignotebook zu sein und unangenehm aufzufallen durch einen Spiegel. Wenn ihr das mal gesehen habt bei Deckenlicht, dann wisst ihr was ich meine. In einer anderen Ausstattung kommt auch dieses Notebook in ganz andere Preisdimensionen. Ich entschied mich für einen Sempron, weil er 1. genug Leistung für den Alltag bringt und 2. Stromsparfunktionen hat, die bei den Celerons abgeschaltet sind. Als Schmankerl obendrauf musste ich nicht die Zwangslizenz von Microsoft mitkaufen, da ja Freedos dabei war.

Ausstattung
Zum Kaufzeitpunkt kostete Das NB(6715s) mit Sempron 3600+, 2x512MB RAM, 80GB FP mit 5400rpm von Toshiba, 15,4" mattem 1280x800 Display, 47whr Akku(mit Ubuntu reichts ohne Optimierungen bei 50% Helligkeit fürs aktive surfen übers wlan für 2:30), DVD DL Brenner, Bluetooth, abg(wobei die Antenne nur bg kann) Broadcom Wlan 475 EUR ohne Versand bei cyberport. Der verbaute Chipsatz ist ein AMD M690T mit einer ATI SB600 Southbridge.

Vorweg
Vorteile

Nachteile

Lüfter zu laut (es gibt eine Revision mit defekten Mainboards deren Lüfter auch zu laut ist)
Wen der Lüfter nicht stört, der tut gut daran nichts zu Ändern. Die übrigen seien gewarnt das durch das Laden einer eigenen DSDT(Differentiated System Description Table) die Hardware beschädigt werden kann. Bei mir hat es funktioniert und ich bin mir sicher, dass ich nichts falsch gemacht habe, sowie das mein Gerät nicht zu warm wird.

Die geänderten Lüftereinstellungen stellen NICHT SICHER das die GPU genügend gekühlt wird. WENN das NOTEBOOK also FÜR 3D Anwendungen/3D Spiele genutzt wird kann die Grafikkarte heiß werden ohne das der Lüfter genügend Kühlluft zuführt. Konkret tritt dieser Fall ein, wenn die GPU voll belastet wird die CPU nur minimal. Weil die  Lüftersteuerung sich nur an der CPU Temperatur orientiert, kann die GPU zu heiß werden. 
Es besteht die Möglichkeit das DSDT umzuprogrammieren, so dass auch die GPU Temperatur zusätzlich für die Lüftersteuerung benutzt wird. Dies ist aber momentan nicht der Fall.

Dazu erläutere ich erstmal was ich im Folgenden überhaupt Ändern werde.
Das Notebook hat 5 Kühlstufen die von der Temperatur im Notebook abhängen.

Temperatur in °C

Kühlmethode

>=90

Zusätzlich zum Lüfter passive Kühlung durch untertakten/abschalten der CPU

>=75

Lüfter 100%

>=65

Lüfter 80%

>=55

Lüfter 60% wird bei mir auf 40% geändert

>=40

Lüfter 40% wird bei mir auf 10% geändert

Vorher war der Lüfter sehr oft an, kühlte das System mit für mich merklicher Lautstärke etwas runter und ging dann aus. Nach erfolgreichem Laden der eigenen DSDT  ist der Lüfter fast dauerhaft auf dem niedrigen 10% Niveau, was aber nicht lauter als das Laufgeräusch der Festplatte ist und geht bei starker Belastung wie dem Kopieren von großen Files an. Nicht aber beim Surfen oder Texteschreiben. Danach ist er wieder unhörbar. Wenn man natürlich das Ohr an den Lüfter hält, hört man etwas. Hält man das Ohr über die Tastatur, kann man den Lüfter nicht von dem Laufgeräusch (nicht Schreibgeräusch) der Festplatte unterscheiden.
Die CPU kann nach Amd nur OPN SMS3600HAX3CM(90nm) oder SMS3600HAX3DN(65nm) haben. Nach cpu-world haben beide Varianten eine maximale Betriebstemperatur von 95°C. Im Schlimmsten Fall wird mein Gerät im Alltag max 64°C(danach greift die Standardkühlung) warm und das auch nur bei Belastung. Das sollte für den Sempron kein Problem darstellen, da ja eher max 54°C(unterste Lüfterstufe) die Regel ist. Letztendlich pendelt sich bei mir die CPU Temperatur immer so bei 45-47°C ein.
Die DSDT kann bei jeder Bios Version(ich verwende F.07) anders aussehen und muss nicht bei jedem Laptop der gleichen Baureihe gleich sein.
Wie wirds gemacht ? Inspiration waren :(1,2,3,4)

Schwellentemperaturen für Lüftersteuerung ändern (ASL Code):

Originales DSDT

Geändertes DSDT

PowerResource (C395, 0x00, 0x0000)
        {
            Method (_STA, 0, NotSerialized)
            {
                Return (C38C (0x01, 0x64))
            }
 
            Method (_ON, 0, NotSerialized)
            {
                If (LLessEqual (\C00D (), 0x03))
                {
                    C38D (0x01, 0x64)
                }
                Else
                {
                    If (LGreater (DerefOf (Index (C389, 0x00)), C38F (C381, 0x00)))
                    {
                        C38D (0x01, 0x64)
                    }
                }
            }
 
            Method (_OFF, 0, NotSerialized)
            {
                C38E (0x01, 0x50)
            }
        }
 
        PowerResource (C396, 0x00, 0x0000)
        {
            Method (_STA, 0, NotSerialized)
            {
                Return (C38C (0x02, 0x50))
            }
 
            Method (_ON, 0, NotSerialized)
            {
                If (LLessEqual (\C00D (), 0x03))
                {
                    C38D (0x02, 0x50)
                }
                Else
                {
                    If (LGreater (DerefOf (Index (C389, 0x00)), C38F (C380, 0x00)))
                    {
                        C38D (0x02, 0x50)
                    }
                }
            }
 
            Method (_OFF, 0, NotSerialized)
            {
                C38E (0x02, 0x3C)
            }
        }
 
        PowerResource (C397, 0x00, 0x0000)
        {
            Method (_STA, 0, NotSerialized)
            {
                Return (C38C (0x04, 0x3C))
            }
 
            Method (_ON, 0, NotSerialized)
            {
                If (LLessEqual (\C00D (), 0x03))
                {
                    C38D (0x04, 0x3C)
                }
                Else
                {
                    If (LGreater (DerefOf (Index (C389, 0x00)), C38F (C37F, 0x00)))
                    {
                        C38D (0x04, 0x3C)
                    }
                }
            }
 
            Method (_OFF, 0, NotSerialized)
            {
                C38E (0x04, 0x28)
            }
        }
 
        PowerResource (C398, 0x00, 0x0000)
        {
            Method (_STA, 0, NotSerialized)
            {
                Return (C38C (0x08, 0x28))
            }
 
            Method (_ON, 0, NotSerialized)
            {
                If (LLessEqual (\C00D (), 0x03))
                {
                    C38D (0x08, 0x28)
                }
                Else
                {
                    If (LGreater (DerefOf (Index (C389, 0x00)), C38F (C37E, 0x00)))
                    {
                        C38D (0x08, 0x28)
                    }
                }
            }
 
            Method (_OFF, 0, NotSerialized)
            {
                C38E (0x08, 0x00)
            }
        }
}

PowerResource (C395, 0x00, 0x0000)
        {
            Method (_STA, 0, NotSerialized)
            {
                Return (C38C (0x01, 0x64))
            }
 
            Method (_ON, 0, NotSerialized)
            {
                If (LLessEqual (\C00D (), 0x03))
                {
                    C38D (0x01, 0x64)
                }
                Else
                {
                    If (LGreater (DerefOf (Index (C389, 0x00)), C38F (C381, 0x00)))
                    {
                        C38D (0x01, 0x64)
                    }
                }
            }
 
            Method (_OFF, 0, NotSerialized)
            {
                C38E (0x01, 0x50)
            }
        }
 
        PowerResource (C396, 0x00, 0x0000)
        {
            Method (_STA, 0, NotSerialized)
            {
                Return (C38C (0x02, 0x50))
            }
 
            Method (_ON, 0, NotSerialized)
            {
                If (LLessEqual (\C00D (), 0x03))
                {
                    C38D (0x02, 0x50)
                }
                Else
                {
                    If (LGreater (DerefOf (Index (C389, 0x00)), C38F (C380, 0x00)))
                    {
                        C38D (0x02, 0x50)
                    }
                }
            }
 
            Method (_OFF, 0, NotSerialized)
            {
                C38E (0x02, 0x28)
            }
        }
 
        PowerResource (C397, 0x00, 0x0000)
        {
            Method (_STA, 0, NotSerialized)
            {
                Return (C38C (0x04, 0x28))
            }
 
            Method (_ON, 0, NotSerialized)
            {
                If (LLessEqual (\C00D (), 0x03))
                {
                    C38D (0x04, 0x28)
                }
                Else
                {
                    If (LGreater (DerefOf (Index (C389, 0x00)), C38F (C37F, 0x00)))
                    {
                        C38D (0x04, 0x28)
                    }
                }
            }
 
            Method (_OFF, 0, NotSerialized)
            {
                C38E (0x04, 0x0A)
            }
        }
 
        PowerResource (C398, 0x00, 0x0000)
        {
            Method (_STA, 0, NotSerialized)
            {
                Return (C38C (0x08, 0x0A))
            }
 
            Method (_ON, 0, NotSerialized)
            {
                If (LLessEqual (\C00D (), 0x03))
                {
                    C38D (0x08, 0x0A)
                }
                Else
                {
                    If (LGreater (DerefOf (Index (C389, 0x00)), C38F (C37E, 0x00)))
                    {
                        C38D (0x08, 0x0A)
                    }
                }
            }
 
            Method (_OFF, 0, NotSerialized)
            {
                C38E (0x08, 0x00)
            }
        }
}

Für das Bsp. ist 0x3C Hexadezimal 3C und Dezimal 48+12=60. Die 60 bedeuten hier das der Lüfter auf 60% der Maximalleistung laufen soll.

Zu guter Letzt muss zum Funktionieren noch ein return() im Code eingefügt werden:
Method (C15F, 2, Serialized) {
[...]
return()
}

Wer Ambitionen hat weitere Änderungen am DSDT vorzunehmen sollte sich mal den Thread im Notebook Hardware Control Forum zu Gemüte führen.

Linux

1. Laden der ursprünglichen DSDT aus dem Gerät: cat /proc/acpi/dsdt > dsdt.orig
2. Disassemblen der DSDT: iasl -d dsdt.orig > dsdt.asl mit dem IASL Compiler
3. Gewünschte Änderungen in die dsdt.asl einbringen und Fehler korrigieren
4. Neu kompilieren: iasl -sa dsdt.asl    (Die 4 bereits im Original enthaltenen Warnungen habe ich fürs Erste ignoriert)
5. Ins initramfs-tools Verzeichnis kopieren: sudo cp dsdt.aml /etc/initramfs-tools/DSDT.aml
6. Und intramfs updaten: sudo update-initramfs -u
7. Reboot

Windows

Basierend auf einer Anleitung von Patrik Senn aus der Schweiz für Vista. Für XP sind die Schritte analog dazu.

1) Microsoft ASL Compiler installieren
2) Eingabeaufforderung als Administrator starten („cmd“ suchen und per Rechtsklick als Administrator starten)
3) ins Verzeichnis des in Schritt 1 installierten ASL Compilers wechseln
4) DSDT disassemblieren: asl /tab=DSDT
5) Code in DSDT.asl editieren, gemäss Anleitung
6) Compilieren: asl DSDT.ASL (Warnungen ignorieren)
7) DSDT laden: asl /loadtable DSDT.AML
8) neu starten

Entfernt werden kann die DSDT wieder mit: asl.exe /loadtable -d DSDT.aml . Deshalb sollte die Datei auch aufgehoben werden.

Nachwort

Ich bin nicht mehr im Besitz des Notebooks und kann deshalb keine Informationen aktualisieren. Aus demselben Grund kann ich auch keine Hinweise für ein Funktionieren des Notebooks mit einem aktuellem Linux geben. Für den Fall, dass alte Probleme in aktuellen Distributionen noch existieren halte ich die Originalversion der Seite vor.


Jan Birkholz
Created 10-23-2007, changed 10-26-2009