Embedded Linux im Sommersemester 2012
Hubert Högl, März 2012
Link zur Veranstaltung: http://elk.informatik.hs-augsburg.de/hhweb/elinux/index.html
In dieser Veranstaltung haben wir zum ersten mal das Gnublin-Board verwendet.
Inhalt
- 1 Projekte
- 2 Muster für screen Init-Datei
- 3 Muster für kermit Init-Datei
- 4 Safari Bücher (Yaghmour, Hallinan)
- 5 Dokumente über Gnublin
- 6 Gnublin Foren
- 7 set.sh
- 8 Projektideen
- 9 Kernel kopieren
- 10 Kernel kompilieren
- 11 WiFi mit WEP
- 12 WiFi im Eduroam Netz der Hochschule
- 13 Wichtige Kernel Konfigurationsvariable
- 14 Problem beim Laden von Firmware
- 15 Zusammenfassung USB WiFi Adapter
- 16 Pakete krosskompilieren
- 17 Kernel Module
- 18 MicroSD-Karte mit ext3 Filesystem
2 Muster für screen Init-Datei
http://elk.informatik.hs-augsburg.de/pub/gnublin-lpc3131/work_eplpc3131/etc/_screenrc
3 Muster für kermit Init-Datei
http://elk.informatik.hs-augsburg.de/pub/gnublin-lpc3131/work_eplpc3131/etc/_kermrc
7 set.sh
# ELDK5 environment settings for Gnublin LPC3131 # <Hubert.Hoegl@hs-augsburg.de> 2011-12-12 ELDK5X86=/opt/eldk-5.0/armv5te/sysroots/i686-oesdk-linux P1=$ELDK5X86/usr/bin/armv5te-linux-gnueabi/ P2=$ELDK5X86/bin/armv5te-linux-gnueabi/ export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabi- export PATH=$P1:$P2:$PATH
9 Kernel kopieren
Es kann vorkommen, dass man die Kernel Sourcen aus dem Git Repository zunaechst in ein anderes Verzeichnis kopieren will, um sie dort dann zu kompilieren. Dabei sollte man aufpassen, dass eine einfache rekursive Kopie mit cp -r nicht funktioniert, da damit keine Dateien die mit einem Punkt beginnen (vor allem .config) kopiert werden. Neben der .config Datei gibt es noch etwa 80 .gitignore Dateien, die man mit find . -name \.gitignore -print | wc -l finden kann.
Man kann sich zunaechst alle Dateinamen mit einem Punkt am Anfang ansehen:
find . -name \.\* -print find . -name \.\* -print | wc -l (gibt Anzahl Dateien aus)
Oft wird eine der folgenden Moeglichkeiten angewendet:
Variante 1
Verzeichnis mit tar packen, woanders wieder entpacken.
Ein Trick, um Verzeichnisse zu kopieren ohne eine tar Datei anzulegen steht im Buch von Yaghmour (Seite 245, 1. Auflage):
(cd <src_dir> && tar cf - .) | (cd <dest_dir> && tar xvf -)
Variante 2
find . -depth | cpio -padm dir2 find . -depth -print | io -VBpdum dir2
Weitere Information siehe cpio manpage oder info cpio.
Variante 3
rsync -zav --delete . dir2
10 Kernel kompilieren
Es gibt zwei Möglichkeiten:
10.1 Variante 1
Die ELDK 5.0 Toolchain muss installiert sein.
- Hostrechner vorbereiten: Oft fehlen die Pakete: git, libncurses5-dev. Auf Fehlermeldungen achten, ob weitere Pakete fehlen.
Kernelsourcen holen
git clone git://elk.informatik.hs-augsburg.de/srv/git/repositories/gnublin-linux-2.6.33.git
Verzeichnis wechseln:
cd gnublin-linux-2.6.33
Umschalten auf Branch "gnublin"
git checkout gnublin
Einstellungen "sourcen":
. set.sh
- make menuconfig
make zImage, make modules
Das zImage findet man im Verzeichnis arch/arm/boot/.
Module installieren
make modules_install INSTALL_MOD_PATH=<your-module-path>
10.2 Variante 2
(veraltet, bitte nicht verwenden)
Hinweis Ueblicherweise wird man danach die MicroSD Karte in den Kartenleser stecken und versuchen, das zImage und die Module auf die Karte zu schreiben. Mit dem mount Kommando findet man heraus, unter welchem Verzeichnis die Karte auf dem Hostrechner gemountet wurde. Ich finde es immer ganz praktisch, den gerade erstellten Kernel bestehend aus zImage, Modulen und der .config Datei auf der Karte in einem eigenen Verzeichnis aufzubewahren. Der Kernel ist beim Gnublin Board direkt im Root Verzeichnis zu finden. Die Module sind in /lib/modules/2.6.33/. Nach dem Beschreiben der MicroSD Karte ist es wichtig, dass man diese wieder mit umount aus dem Dateisystem aushaengt. Erst dadurch kann man sich darauf verlassen, dass alle Dateien auf die Karte geschrieben wurden. Ein anderes wichtiges Kommando in diesem Zusammenhang ist sync, damit werden alle eventuell sich noch im Hauptspeicher befindlichen Dateien auf die Festplatte oder die SD-Karte geschrieben.
11 WiFi mit WEP
"Patriot" USB WiFi Adapter mit r8712u Treiber (fest einkompiliert)
root@armv5te:~# ifconfig wlan0 up root@armv5te:~# iwconfig wlan0 mode managed essid "linksys" key 0...116EBB986.....1DF02829 root@armv5te:~# udhcpc -i wlan0
Essid und WEP key muessen angepasst werden. Der r8712u Treiber funktioniert auch beim Asus WL-167G V3 Adapter.
12 WiFi im Eduroam Netz der Hochschule
Interface starten
root@armv5te:~# ifconfig wlan0 up
Starten des wpa_supplicant im Hintergrund:
root@armv5te:~# cat start-wpa-supp-bg.sh sudo wpa_supplicant -i wlan0 -D wext -c /etc/wpa_supplicant/wpa_supplicant.conf -B
Zum Testen ist es nuetzlich, wpa_supplicant im Vordergrund zu starten. Dazu ersetzt man die -B Option durch -d.
/etc/wpa_supplicant/wpa_supplicant.conf
# path to UNIX socket control interface ctrl_interface=/var/run/wpa_supplicant #eapol_version=1 ap_scan=1 network={ ssid="eduroam" key_mgmt=WPA-EAP eap=TTLS proto=WPA RSN identity="hhoegl" anonymous_identity="anonymous@hs-augsburg.de" password="......." # ca_cert="/etc/wpa_supplicant/deutsche-telekom-root-ca-2.crt" phase2="auth=PAP" }
Adressen mit DHCP beziehen:
# udhcpc -i wlan0
13 Wichtige Kernel Konfigurationsvariable
(für Kernel 2.6.33)
- CONFIG_UNIX=y
- Das ist die Voraussetzung, damit der syslog Daemon arbeiten kann.
- CONFIG_LOCALVERSION_AUTO=y
- Damit enthalten die Modulverzeichnisse unter /lib/modules/ noch die aktuelle Git Version des Kernels. Ich neige eher dazu, diese Option nicht einzuschalten.
- CONFIG_FIRMWARE_IN_KERNEL=y
- Normalerweise sollte diese Option nicht noetig sein. Sie wurde gelegentlich verwendet, da es ein Problem mit dem Hotplug Mechanismus gab, das verhinderte, das die Firmware in USB-zu-WLAN Adapter geladen wurde. Mit einem funktionierenden /sbin/hotplug sollte das kein Problem mehr sein.
- CONFIG_GPIO_SYSFS=y, CONFIG_SYSFS=y
- Damit kann man die GPIO Pins mit den Dateien unter /sys/class/gpio/ ansteuern.
CONFIG_DEBUG_GPIO
- CONFIG_HW_RANDOM
- Hardware Zufallszahlengenerator
14 Problem beim Laden von Firmware
(H. Hoegl, 2012-05-18)
Es gab immer ein Problem beim Laden der Firmware in USB Geraete, z.B. dem ASUS WL-167G V3 Adapter. Die unschoene Loesung war bisher, die Firmware direkt in den Kernel einzukompilieren. Bei genauerer Betrachtung zeigte sich, dass das Problem mit Hotplug zu tun hatte. Wenn man /sbin/hotplug mit folgendem Inhalt anlegt, dann funktioniert der Ladevorgang. Die Konfigurationsoption CONFIG_FIRMWARE_IN_KERNEL=y sollte deaktiviert werden.
#!/bin/sh HOTPLUG_FW_DIR=/lib/firmware echo 1 > /sys/$DEVPATH/loading cat $HOTPLUG_FW_DIR/$FIRMWARE > /sys/$DEVPATH/data echo 0 > /sys/$DEVPATH/loading
Diese Datei muss ausfuehrbar sein!
Beim Asus WL-167G V2 USB-zu-WiFi Adapter muss die Firmware hier sein: /lib/firmware/rt73.bin.
15 Zusammenfassung USB WiFi Adapter
- Asus WL-167G v1, Treiber rt2500usb, keine Firmware benoetigt
- Asus WL-167G v2, Treiber rt73usb, Firmware /lib/firmware/rt73.bin
- Asus WL-167G v3, Treiber r8712u, Firmware /lib/firmware/rtlwifi/r8712u.bin
- Patriot WiFi Adapter (wie Asus WL-167G v3)
- Theta WiFi Adapter, Treiber RTL8187, keine Firmware
- Alfa Networks AWUS036NH, Treiber rt2800usb, Firmware /lib/firmware/rt2870.bin
16 Pakete krosskompilieren
Oft sollte ausreichen:
./configure --host=arm-linux-gnueabi make
Man kann vor den configure Aufruf auch noch explizit Umgebungsvariable setzen (Beispiel lynx Browser):
CC=arm-linux-gnueabi-gcc RANLIB=arm-linux-gnueabi-ranlib \ STRIP=arm-linux-gnueabi-strip LD=arm-linux-gnueabi-ld \ ./configure --host=arm-linux-gnueabi --enable-static make
17 Kernel Module
Es gibt einige Beispielprogramme und -Treiber im Ordner NGW100, die ich allerdings noch noch nicht auf das Gnublin Board angepasst habe. Vielleicht möchten Sie das machen.
Literatur:
- The Linux Kernel Module Programming Guide http://tldp.org/LDP/lkmpg/2.6/html/
18 MicroSD-Karte mit ext3 Filesystem
Die mit Gnublin ausgelieferte MicroSD Karte ist mit dem ext2 Filesystem ausgestattet, was nicht die beste Lösung für eine Flash-Karte ist. Bei der täglichen Arbeit kann es durch spontanes Abstecken oder Reset-Drücken zu Fehlern im Filesystem kommen, die man durch einen Filesystem-Check mit fsck.ext2 wieder reparieren muss. Dazu muss man die Karte aus Gnublin entfernen, in den Entwicklungsrechner stecken und unter Linux das fsck Werkzeug starten. Somit bleibt der schöne Nebeneffekt, dass man Linux - meist Ubuntu - auf dem Entwicklungsrechner installieren muss.
Besser ist es, wenn man auf der Karte das ext3 Filesystem verwendet. Man kann von ext2 auf ext3 umsteigen, wenn man auf dem Entwicklungsrechner das Kommando tune2fs -j <device> eingibt (-j steht für "Journal"). Vermutlich kann man das sogar auf Gnublin machen. Damit die Karte dann auch tatsächlich mit ext3 verwendet wird, muss der Kernel mit Unterstützung für EXT3 übersetzt werden. Falls das nicht der Fall ist, wird die Karte als EXT2 gemountet.
Mit der aktuellen Version (2012-06-03) von gnublin-card.py kann man eine Karte mit ext3 Root-Filesystem erstellen, siehe
https://r-n-d.informatik.hs-augsburg.de:8080/hubert.hoegl/gnublin
Es kommt vor, dass man auf einer Karte das ext3 Journal aktiviert, aber der Kernel noch nicht mit ext3 umgehen kann. Das führt dazu, dass der Kernel nicht mehr bootet. Man kann diese Panne umgehen, wenn man die Karte in das Lesegerät steckt und in der Datei etc/fstab (auf der Karte!) den folgenden Eintrag explizit auf ext2 setzt:
rootfs / ext2 defaults 1 1
Zuguter letzt noch ein Rat: Bitte nicht ext4 nehmen, damit kann der Apex Bootloader noch nicht umgehen.