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.

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.

  1. Hostrechner vorbereiten: Oft fehlen die Pakete: git, libncurses5-dev. Auf Fehlermeldungen achten, ob weitere Pakete fehlen.
  2. 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

  3. Einstellungen "sourcen":

    . set.sh

  4. make menuconfig
  5. make zImage, make modules

    Das zImage findet man im Verzeichnis arch/arm/boot/.
  6. 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:

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.

EmbeddedLinux2012 (zuletzt geƤndert am 2017-03-30 20:17:14 durch HubertHoegl)