Samsung N140

Aus Fedorawiki.de

Wechseln zu: Navigation, Suche
Dieser Artikel ist Teil der HOWTO Sammlung
Neu.png Dieser Artikel wurde neu erstellt und bedarf evtl. noch einer Korrekturlesung. Danach kann diese Box entfernt werden.

Das Samsung N140 ist ein nettes Netbook, auf dem Fedora 11 und 12 ohne Probleme und im Wesentlichen out-of-the-box laufen. Es gibt aber einige Dinge, mit denen man Fedora noch besser an das N140 anpassen kann.

Einige der Beschreibungen hier beziehen sich explizit auf die Nutzung von Gnome als Desktop-Umgebung.

Inhaltsverzeichnis

Installation

Dual-Boot mit Windows

Wer das vorinstallierte Windows XP behalten möchte, um das N140 dual-boot-fähig zu haben, sollte das Netbook zunächst einmal normal starten und die Windows-Einrichtung durchlaufen lassen. Dabei kann man netterweise einstellen, wie viel Platz die Windows-Partition einnehmen soll. Eine Mindestgröße von 25 Gigabyte ist vorgeschrieben; das sollte im Normalfall auch ausreichen, wenn man sowieso meistens Fedora startet. Damit bleiben noch knapp 130 Gigabyte frei (es gibt eine 7-Gigabyte Recovery-Partition).

Achtung: Direkt nach dem Anschalten des Rechners gibt Samsung uns die Möglichkeit, durch Drücken von F4 die Systemwiederherstellung zu starten. Wie ich lernen musste, genügt ein solcher Tastendruck (selbst wenn man den Fehler sofort bemerkt und gleich Strg-Alt-Entf hinterherhaut), um den Bootloader zu überschreiben. Man hat dann keine Möglichkeit mehr, das zu startende Betriebssystem auszuwählen; es wird ausschließlich Windows gestartet. Zwar kann man den Bootloader relativ einfach wiederherstellen (siehe Anleitung (engl.)), aber das ist trotzdem mehr Arbeit, als man sich eigentlich machen möchte.

Fedora-Installation

Das N140 hat kein optisches Laufwerk. Es lässt sich aber problemlos von einem USB-Stick booten. Am einfachsten ist es, sich mit UNetbootin (engl.) aus einem Installations-ISO einen bootfähigen USB-Stick zu fabrizieren und Fedora damit zu installieren. UNetbootin ist als Fedora-Paket verfügbar, kann also einfach mit

[root]# yum install unetbootin

installiert werden. Ein Howto, wie man den Installations-Stick per Hand vorbereitet, findet sich im Wiki des Fedora-Projekts (engl.).

Display-Beleuchtung

Die Änderung der Hintergrundbeleuchtung des Displays mit den entsprechenden Tasten (Fn+PfeilHoch/Runter) gehört zu den Dingen, die unter Linux nicht von vorne herein funktionieren. Das Einstellen der Beleuchtung selbst ist aber relativ einfach möglich: Einfach mit root-Rechten

[root]# setpci -s 00:02.1 F4.B=XX

eingeben und XX durch eine Hexadezimal-Zahl zwischen 00 (Licht aus) und FF (volle Helligkeit) ersetzen. Gibt man nur

[root]# setpci -s 00:02.1 F4.B

ein, bekommt man die aktuelle Einstellung angezeigt.

Automatisierung

Das folgende Python-Skript macht die Beleuchtungsverwaltung einfacher.

#! /usr/bin/env python

import subprocess
import sys, os

def get_brightness():
    p = subprocess.Popen(("/sbin/setpci", "-s", "00:02.1", "F4.B"), stdout=subprocess.PIPE)
    result = p.communicate()[0]
    success = p.returncode == 0
    if not success:
        raise RuntimeError("couldn't retrieve current brightness")
    return int(result, 16)
    
def set_brightness(value):
    value = max(0, min(255, int(value)))
    success = subprocess.call(("/sbin/setpci", "-s", "00:02.1", "F4.B=%02x" % value)) == 0
    if not success:
        raise RuntimeError("couldn't set brightness")
    
def change_brightness(delta):
    set_brightness(get_brightness() + delta)

def toggle_brightness():
    filename = os.path.expanduser("~/.saved_brightness")
    current = get_brightness()
    if current:
	with open(filename, "w") as f: 
            f.write(str(current))
        set_brightness(0)
    else:
        try:
            f = open(filename)
            newval = int(f.read())
            f.close()
        except:
            newval = 255
        set_brightness(newval)
    
def help(exitcode = 0, message = None):
    if message is not None:
        sys.stderr.write(message + "\n\n")
    sys.stderr.write("""Set the backlight brightness on a Samsung N140.

Usage: %s command
where command is one of
    up      increase the brightness by 16
    down    decrease the brightness by 16
    toggle  switch lamp on / off
    help    show this message
""" % sys.argv[0])
    sys.exit(exitcode)
    
def main():
    if len(sys.argv) < 2:
        help(1, "Error: not enough arguments")
    command = sys.argv[1].lower()
    if command == "up":
        change_brightness(16)
    elif command == "down":
        change_brightness(-16)
    elif command == "toggle":
        toggle_brightness()
    elif command in ["help", "--help", "-h"]:
        help(0)
    else:
        help(1, 'Error: unknown command "%s"' % command)
        
if __name__ == "__main__":
    main()

Wer lieber ein Bash-Skript hätte, findet im Arch Linux-Wiki (engl.) eines mit ähnlicher Funktionsweise.

Das Skript einfach als /usr/local/bin/setbrightness speichern und mit

[root]# chmod 755 /usr/local/bin/setbrightness

ausführbar machen. Um nun die Beleuchtung per Tastendruck steuerbar zu machen, müssen wir zunächst dem normalen Benutzer das Recht geben, die Helligkeit zu ändern. Dazu bearbeiten wird die Datei sudoers mit Hilfe von visudo wie im entsprechenden Artikel beschrieben. Am Ende der Datei fügen wir folgende Zeilen an:

Defaults!/usr/local/bin/setbrightness !requiretty
benutzername  localhost=NOPASSWD:/usr/local/bin/setbrightness

Die erste Zeile bedeutet, dass zum Ausführen von setbrightness keine Konsole erforderlich ist (sonst würde die Steuerung über Tastenkürzel nicht funktionieren), die zweite Zeile gibt dem Nutzer mit dem angegebenen Namen (der natürlich passend ersetzt werden sollte) das Recht, setbrightness mit root-Rechten ohne Passworteingabe auszuführen.

Den Gnome-Tastenkürzeln (System -> Einstellungen -> Tastenkombinationen) können wir jetzt die Lichtsteuerung hinzufügen. Ein Klick auf "Hinzufügen" legt eine neue Kombination an. Als Name wählen wir z.B. "LCD-Beleuchtung an/aus", als Befehl sudo /usr/local/bin/setbrightness toggle. Entsprechend auch für up und down. Diese Befehle ordnen wir dann denjenigen Tasten zu, die wir für die Steuerung verwenden wollen.

Um diejenigen Tasten zu benutzen, die eigentlich genau für diesen Zweck gemacht sind (Fn+F5, Fn+PfeilHoch, Fn+PfeilRunter), müssen diese Tasten erst (wie im Abschnitt Funktionstasten beschrieben) nutzbar gemacht werden. Wem das zu aufwändig ist, der kann auch einfach andere Tastenkombinationen benutzen. Anbieten würde sich etwa, statt der Fn-Taste die Windows-Taste (auch "Super" oder "Mod4" genannt) zu benutzen. Diese muss über System -> Einstellungen -> Tastatur -> Belegungen -> Belegungseinstellungen -> Alt/Win key behavior u.U. erst aktiviert werden.

Die Funktionstasten

Manche der Sonder-Funktionstasten des N140 funktionieren sofort. Dazu gehören

  • Sperren des Touchpads (Fn+F10)
  • Suspend (Fn+ESC)
  • Ton leiser (Fn+PfeilLinks), lauter (Fn+PfeilRechts), aus (Fn+F6)

Für andere muss man etwas tricksen. Dazu muss man leider den Kernel neu kompilieren. Das ist zwar relativ einfach zu machen; wer sich das aber lieber nicht zutraut, kommt sicherlich auch ohne die Sondertasten aus.

Das Zuordnen der Tastaturcodes

Drückt man eine der "problematischen" Sondertasten, merkt der Kernel zwar, dass eine Taste gedrückt wurde, kennt sie aber nicht und kann deshalb nicht weitergeben, was passiert ist. Deshalb muss zunächst das N140 in die Liste der Samsung-Tastatur-Belegungen eingefügt werden. Das ist einfach: Mit root-Rechten die Datei /usr/share/hal/fdi/information/10freedesktop/30-keymap-misc.fdi bearbeiten. Zeile 120 (in Fedora 12 Zeile 137) sieht so aus:

<match key="/org/freedesktop/Hal/devices/computer:system.hardware.product" contains_outof="NC10;SP55S;SQ45S70S;

und so weiter. In die Liste einfach das N140 mit einfügen, also

NC10;N140;SP55S;SQ45S70S;SX60P;SX30S;R59P/R60P/R61P;Q210;Q310;X05

(o.ä.) und speichern. Fertig.

Das Key-Release-Problem

Durch das Zuordnen der Tastaturcodes erkennt der Kernel jetzt (bzw. spätestens nach einem Neustart) zwar die richtigen Tastencodes, aber es gibt leider ein Problem: Drückt man z.B. Fn+PfeilHoch (also Bildschirm heller), so erkennt der Kernel zwar, dass die Taste gedrückt wurde, aber nicht, dass sie losgelassen wurde. Es ist leider eine fixe Idee von vielen Netbook- und Laptop-Herstellen, bei den Sondertasten kein Key-Release-Signal weiterzugeben.

Will man nun einer Sondertaste einen Befehl zuordnen, also z.B. die Beleuchtung auch tatsächlich heller machen, braucht man aber auch dieses Release-Signal. Eine Taste gilt nähmlich erst dann als wirklich gedrückt, wenn man sie gedrückt und wieder losgelassen hat.

Um das Problem zu umgehen, wurde der Linux-Kernel in der Vergangenheit immer wieder gepatcht, um bei bestimmten Geräten und Tasten automatisch auch ein Release-Signal zu senden, wenn dass Press-Signal empfangen wurde. Diese "quirk handler" lassen sich relativ einfach auch für das N140 benutzen.

Ab der Kernel-Version 2.6.32 ist dies nicht mehr nötig; ab dieser Version lässt sich dieses "force release" ohne Neu-Kompilieren einstellen. Fedora 11 läuft aber derzeit mit 2.6.30; Fedora 12 mit 2.6.31.

Um die Fn-Tasten des N140 zu benutzen, bleibt uns also nur das Neu-Kompilieren des Kernels nach dem Einbauen eines zusätzlichen Patches, der das Auto-Release auch für das N140 aktiviert. Die Änderung ist minimal, und Fedora macht das Neukompilieren relativ einfach.

Das Patchen des Kernels

<b>Anmerkung</b> <b>Anmerkung:</b> Jedes Mal, wenn von Fedora ein Kernel-Update kommt, muss man die folgenden Schritte wiederholen.

Eine allgemeine Anleitung zum Patchen des Kernels findet sich im Fedora-Wiki (engl.).

Vorbereiten

Zunächst müssen zwei wichtige Pakete installiert sein, was spätestens nach

[root]# yum install yum-utils rpmdevtools

der Fall ist. Dann wird durch den Befehl

[user ~]$ rpmdev-setuptree

im Home-Verzeichnis des Benutzers das Verzeichnis rpmbuild erstellt, in dem sich ein vorbereiteter Verzeichnisbaum für das Erstellen des selbstgebauten Kernel-Pakets befindet. Dann laden wir den Kernel-Quellcode herunter:

[user ~]$ yumdownloader --source kernel

Nun sollte sich im Home-Verzeichnis die Datei kernel-<version>.src.rpm befinden. Achtung: Aus irgendeinem Grund findet dies bei mir manchmal nicht den Quellcode für die richtige Kernel-Version. Das Problem ist wahrscheinlich woanders, aber die einfachste Lösung war bei mir, yumdownloader als root auszuführen.

Dafür, dass alle zum Bau des Kernels notwendigen Pakete installiert sind, sorgt

[root]# yum-builddep kernel-<version>.src.rpm

— eigentlich sollte aber alles da sein. Durch

[user ~]$ rpm -Uvh kernel-<version>.src.rpm

wird der Quellcode entpackt.

Der Patch

Im Verzeichnis ~/rpmbuild/SOURCES legen wir eine neue Datei mit dem Namen linux-2.6-samsung-n140-keyboard-quirks.patch an, die den folgenden Inhalt bekommt:

diff -uNrp kernel-2.6.30.orig/drivers/input/keyboard/atkbd.c kernel-2.6.30.new/drivers/input/keyboard/atkbd.c
--- kernel-2.6.30.orig/drivers/input/keyboard/atkbd.c	2009-11-25 15:28:55.822853000 +0100
+++ kernel-2.6.30.new/drivers/input/keyboard/atkbd.c	2009-11-25 15:38:03.473854881 +0100
@@ -1545,6 +1545,15 @@ static struct dmi_system_id atkbd_dmi_qu
 		.driver_data = atkbd_samsung_forced_release_keys,
 	},
 	{
+		.ident = "Samsung N140",
+		.matches = {
+			DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
+			DMI_MATCH(DMI_PRODUCT_NAME, "N140"),
+		},
+		.callback = atkbd_setup_forced_release,
+		.driver_data = atkbd_samsung_forced_release_keys,
+	},
+	{
 		.ident = "Samsung NC20",
 		.matches = {
 			DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),

Jetzt wechseln wir das Verzeichnis:

[user ~] cd ~/rpmbuild/SPECS

und bearbeiten die hier bereits vorhandene Datei kernel.spec. Drei Änderungen werden hier durchgeführt. Ganz am Anfang (ca. Zeile 18) befindet sich die Zeile

#% define buildid .local

die wir durch

%define buildid .samsungn140

ersetzen (das "#" und das Leerzeichen vor "define" müssen weg). Rund um die Zeile 700 finden sich ganz viele Zeilen mit "PatchXXXXX:" am Anfang. An das Ende dieser Liste, vor das abschließende "%endif", kommen diese zwei Zeilen:

# atkbd.c: add Samsung N140 keyboard quirks handling
Patch99999: linux-2.6-samsung-n140-keyboard-quirks.patch

Rund um die Zeile 1400 sind dann viele Zeilen, die mit "ApplyPatch:" beginnen. Wiederum an das Ende der Liste, vor die Zeile

# END OF PATCH APPLICATIONS

kommen diese beiden:

# atkbd.c: add Samsung N140 keyboard quirks handling
ApplyPatch linux-2.6-samsung-n140-keyboard-quirks.patch

Speichern und schließen — das war's.

Kompilieren, bauen und installieren

Der Befehl

[user SPECS]$ rpmbuild -bb --without smp --without kdump --without debug --without up --with pae --with firmware
--without debuginfo --target=`uname -m` -v kernel.spec

startet den Bauprozess (alles in eine Zeile – hier steht's nur wegen des besseren Aussehens in zweien). Jetzt kann man sich die eine oder andere Tasse Kaffee herunterladen: Das kompilieren braucht vier bis fünf Stunden, sowie einige Gigabyte an Festplattenplatz.

<b>Anmerkung</b> <b>Anmerkung:</b> Fedora installiert auf dem N140 automatisch den PAE-Kernel, deshalb bauen wir diesen auch hier. Wer lieber einen Kernel ohne PAE will, ersetzt einfach "--without up --with pae" durch "--with up --without pae".

Am Ende der ganzen Warterei sollten sich im Verzeichnis ~/rpmbuild/RPMS/i686 vier Dateien finden ("<version>" enthält diesmal auch unser ".samsungn140"):

kernel-firmware-<version>.rpm
kernel-headers-<version>.rpm
kernel-PAE-<version>.rpm
kernel-PAE-devel-<version>.rpm

In dieses Verzeichnis wechseln wir und installieren den neuen Kernel durch

[root]# rpm -ivh *.rpm

Neu starten, und die Tasten sollten funktionieren. Den Ordner ~/rpmbuild und das Quellcode-Paket kann man jetzt gefahrlos wieder löschen.

Links

Weitere Infos zu Linux auf dem Samsung N140 findet man auf den folgenden Seiten. Viele Dinge in diesem Text sind von dort zusammengesucht.