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 ja abgeschalten 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

Linux

Zum Business Notebook gehört auch ein Business Betriebssystem.
Meine Wahl war Ubuntu, weil viele Dinge gleich im Kernel einkompiliert sind und auch unfreie Treiber leicht zu installieren sind. Damit wollte ich zuersteinmal ein funktionierendes System aufsetzen.

Erstes Problem:
"AMD/ATI SB600 can't do 64 Bit DMA Transfers"
->muss in 32Bit-Mode gezwungen werden, was erst möglich ist ab Kernel 2.6.22-rc2 oder 2.6.21-5 Debian
Deshalb verwende ich das neueste Ubuntu: Gutsy (7.10). Um auch den aktuellen Kernel zu bekommen 2.6.22-14 verwendete ich den netinstaller(Alternative Installer oder andere Architekturen), da Gutsy damals noch Beta war. Für den netinstaller ist natürlich eine bestehende Internetverbindung über den Lan Anschluss erforderlich. Mittlerweile sollte der Alternate installer auch gut verfügbar sein, so dass man auch diesen verwenden kann.

Zweites Problem:
Die 32 Bit Installation friert immer mal wieder ein, wenn versucht wird auf die Festplatte zuzugreifen. Festplattenzugriffe sind mit <1MB/s sehr langsam. Üblich sind >35MB/s auf dem Notebook. Ich kann mir das nur so erklären, dass der Sata Treiber für diese Hardware nicht korrekt funktioniert. Vielleicht ist da ein Zusammenhang mit der im Bios nicht vorhandenen Möglichkeit SATA auf den nativen Modus umzuschalten(Die Option ist im Bioscode vorhanden wird aber nicht angezeigt). Deshalb muss Linux aktuell mit 64 Bit Kernel installiert werden, dann sind auch Festplattenzugriffe normal schnell. Ein Nachwort zum 64Bit System: 32 Bit Programme können normal ausgeführt werden, was z.B. für den Fall Java interessant ist, da Sun kein 64Bit Browserplugin zur Verfügung stellt. ia32-sun-java6-bin hilft da weiter.

Drittes Problem
"..MP-BIOS bug: 8254 timer not connected to IO-APIC"
Wird vom verwendeten Kernel korrekt behandelt: "ATI board detected. Disabling timer routing over 8254.". Alternativ kann die Bootoption nolapic_timer an den Kernel angefügt werden.

Viertes Problem:
"PCI: Cannot allocate resource region 0 of device 0000:00:14.2"
...

Fünftes Problem:
"APIC error on CPU0: 40(40)"
Der Fehler tritt fortlaufend auf und kann für das Erste ignoriert werden. Nachteil ist, dass er /var/log/syslog zumüllt. Die Alternative, beim Booten APIC mit "noapic" und "nolapic" Option auszuschalten sollte nicht in betracht gezogen werden. Dann werden auch Stromspar- und Taktungsmechanismen abgeschaltet.

Nach der Installation gibt es noch folgende nicht funktionierende Dinge:
1. grafische Oberfläche
2. Wlan: der Standardtreiber bcm43xx bremst zudem die Festplatte merklich aus <4MB/s, wenn geladen
3. Lüfter zu laut
4. Standby, Ruhezustand
5. spezielle Energiesparmechanismen
6. knackender Sound bei Bässen in mp3s gelöst
Ungetestet sind: PC-Card, Brenner, Bluetooth. Die ersten beiden sollten aber gehen.

1. grafische Oberfläche
Beim auftretenden Fehler solange Fehler bestätigen, bis der gdm beendet wird, dann Strg+ALT+F1 auf die Konsole und bei bestehender Internetverbindung ein sudo apt-get install xorg-driver-fglrx sowie danach  sudo aticonfig --initial und ein Neustarten der grafischen Oberfläche mit sudo gdm und die grafische Oberfläche funktioniert. Anmerkung: Bei Kubuntu gdm durch kdm ersetzen.

Wem der ATI Treiber nicht gefällt, der kann sich den noch in der Entwicklung befindlichen freien Treiber radeonhd kompilieren. Eine Anleitung dazu befindet sich auf Phoronix [en]. Für meine Bedürfnisse ist er ausreichend, weil ich weder 3D noch 2D Beschleunigung benötige. Einziges Manko ist, dass ich um die Displayhelligkeit zu Regeln nach dem Login im Gnome auf eine Konsole wechseln muss(Strg+ALT+F1).

2. Wlan
Standardmäßig  lädt Ubuntu den Treiber Namens bcm43xx mit. Dieser ist zum aktuellen Zeitpunkt nicht ganz ausgereift oder funktioniert nicht mit der Eingebauten Broadcom Mini-PCI Karte. Wenn er mit zugehöriger Firmware(fwcutter) geladen ist fällt nach ca. 2 min auch die Plattengeschwindigkeit ab auf ca <4MB/s. Testbar mit sudo hdparm -t /dev/sda . Um das laden zu verhindern sudo echo blacklist bcm43xx >> /etc/modprobe.d/blacklist . Damit Wlan doch noch halbwegs(ja, die Wlan An-Aus Taste sollte lieber nicht benutzt werden, denn dann bekam ich das Wlan so schnell nicht wieder an) geht benutze ich ndiswrapper. Den installiere ich mit sudo apt-get install ndiswrapper-common und sudo apt get install ndiswrapper-utils-1.9 . Zusätzlich wird der Windows Wlan Treiber benötigt. Diesen gibt es auf der HP Seite als SP34152A. Entpackt im Treiber Verzeichnis dann ein sudo ndiswrapper -i bcmwl5.inf installiert den Treiber und sudo ndiswrapper -m schreibt die Konfiguration für das Modulladen. Das Modul kann nun über sudo modprobe ndiswrapper geladen werden. Um es bei jedem start zu laden: sudo echo ndiswrapper >> /etc/modules . Sollte der bcm43xx Treiber während der Installation Probleme machen kann er geblacklistet werden indem Setup nach dem Booten wie folgt aufgerufen wird.
install bcm43xx.blacklist=yes

Aktuell führt das Update vom network-manager(auf 0.6.5-0ubuntu16) dazu, dass ich nicht mehr ins versteckte WEP Wlan komme. Deshalb bleibe ich bei Version 0.6.5-0ubuntu15.

Sollte das Notebook nur mit aktiviertem WLAN unter Abstürzen leiden, den ndiswrapper mit mindestens Version 1.47 manuell herunterladen und installieren. (Mein Notebook hatte dieses Problem nicht, Danke Sebastian Meyer)

3. 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)
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

Fehlendes return() Einfügen:
Method (C15F, 2, Serialized) {
[...]
return()
}
Schwellentemperaturen für Lüftersteuerung ändern:
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.

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

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

4. Standby, Ruhezustand
Funktioniert noch nicht so wie es soll.
Wenn das fglrx Modul entladen und gdm beendet ist, dann funktioniert auch das eingebaute hibernate sowie uswsusp(falls installiert).
Angeblich liegts am Kernelmodul zum Treiber, welches in gutsy enthalten ist. Diese Lösung dazu beinhaltet aber auch das Neukompilieren des Kernels, was ich nicht probiert habe.

Alternativ kann man den freien radeonhd Treiber benutzen (Siehe 1. grafische Oberfläche). Dieser stellt sich Ruhezustand und Standby nicht mehr in den Weg. Praktisch funktioniert bei mir nur der Standby problemlos. Nach dem Aufwachen aus dem Ruhezustand funktioniert das ACPI nicht mehr korrekt. Ich kann also z.B. die aktuelle Prozessortemperatur nicht auslesen, weil mir dauerhaft ein alter und damit eventuell falscher Wert angezeigt wird. Mit dem nicht funktionierenden ACPI nach dem Aufwachen wird der Lüfter nicht mehr gesteuert und bleibt aus! Verwende ich für den Ruhezustand allerdings uswsusp funktioniert dieser tadellos.

5. spezielle Energiesparmechanismen

6. knackender Sound bei Bässen in mp3s (gelöst)
Ich schätze das liegt daran das die Codecs mit 64 Bit Kernel nicht einwandfrei laufen. Möglicherweise lags auch am Titel. Das werde ich nochmal prüfen.
Dies tritt nur auf, wenn die PCM Lautstärke zu hoch eingestellt ist. Es klingt dann übersteuert. Also den PCM Laustärkeregler nicht zu hoch einstellen (75% sind ok) und dann über die normale Laustärke regeln. Hier fehlt wohl die obere Grenze, die im Windowstreiber eingebaut ist.

Windows

Wer es denn unbedingt braucht sollte folgendes bei diesem Notebook beachten.

1. Lüfter zu laut
2. Fiependes Geräusch
3. Treiber

1. Lüfter zu laut
Was ich dagegen Grundsätzlich mache steht weiter oben im Linux Teil. Das ganze ist ein wenig schwieriger weil ich dafür cygwin brauche. Weiterhin wird der Microsoft sowie Intel DSDT Compiler benötigt.
1. DSDT extrahieren 
unter Cygwin mit installiertem vi:
reg query 'HKLM\HARDWARE\ACPI\DSDT\HP____\SB400\00010000'| \
 grep REG_BINARY|sed 's/.*BINARY.//'|xxd -r -ps > dsdt.orig
2. disassemblen
iasl -d dsdt.orig
3. Änderungen an der dsdt wie unter Linux machen.
4. Neu kompilieren
iasl dsdt.orig
dsdt.aml wird erzeugt
5. Neues DSDT laden mit Microsoft  Compiler
asl /loadtable DSDT.aml 

Dank Patrik Senn aus der Schweiz geht es nun auch einfacher. Er hat diese Anleitung am Beispiel Vista geschrieben. Für XP sind die Schritte analog dazu.

1) Microsoft ASL Compiler v.3.0.1 installieren
     http://www.microsoft.com/whdc/system/pnppwr/powermgmt/default.mspx

2) cmd als Administrator ausführen
      (suche "cmd", Rechts-Klick auf "cmd" -> als Administrator ausführen)

3) ins Verzeichnis C:\Programme\Microsoft ASL Compiler v3.0 wechseln

4) DSDT-Programm disassemblieren:  asl /tab=DSDT

5) Code editieren, gemäss http://www2.informatik.hu-berlin.de/~jbirkhol/hp6715/index.html#3._L%FCfter_zu_laut

6) Compilieren: asl DSDT.ASL
      (Warnings können ignoriert werden)

7) DSDT-Programm laden: asl /loadtable DSDT.AML

8) neu starten, und fertig 

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

2. Fiependes Geräusch
Ja, der DVD Brenner fiept, wenn der Rechner im Akkumodus nicht belastet ist. Warum dies so ist kann ich nicht beantworten. Die Älteren unter uns werden den hohen Ton vermutlich nicht einmal hören. Möglicherweise verursacht durch einen Treiber(ich habe da Lightscribe im Verdacht aber das muss ich alles noch prüfen).
Annahme: Es liegt an irgend einem Treiber im Windows und äußert sich hauptsächlich im Leerlauf. Das Problem tritt unter Linux bei mir nicht mehr auf.

Resümee nach 6 Monaten Nutzung bezüglich des fiepens ist für mich, dass es nach dem es einmal weg war nie wieder kam. Allerdings muss ich dazu sagen, wenn ich Videos schaue tritt es manchmal noch kurzzeitig auf. Vielleicht war der Ton nur, weil das Gerät noch neu war da. Genaueres kann ich in ermangelung eines Neugerätes nicht herausfinden.

3. Treiber
Das dürften einige sein, die aber alle bei HP unter Windows Xp Professional verfübar sind. Vistabesitzer bekommen ja seit kurzem einen kostenlosen Downgrade auf XP für das zumindest mein Modell eher ausgelegt ist. Wenns denn unbedingt Vista sein muss dann sollte da schon ein Dualcore und 2GB Ram im Notebook sein. Es müssen dann auch kürzere Akkulaufzeiten inkauf genommen werden.


Jan Birkholz
Created 10-23-2007, changed 07-04-2008