#language de #format rst 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. .. contents:: Inhalt .. sectnum:: Projekte --------- * `EL12-Debian`_ * `EL12-Reaktionszeit`_ * `EL12-PWM`_ * `EL12-Smartphone`_ * `EL12-Beschleunigung`_ * `EW12-Feuchtesensor`_ * `EW12-Max`_ Muster für screen Init-Datei ---------------------------- http://elk.informatik.hs-augsburg.de/pub/gnublin-lpc3131/work_eplpc3131/etc/_screenrc Muster für kermit Init-Datei ---------------------------- http://elk.informatik.hs-augsburg.de/pub/gnublin-lpc3131/work_eplpc3131/etc/_kermrc Safari Bücher (Yaghmour, Hallinan) ---------------------------------- http://proquest.tech.safaribooksonline.de/ Dokumente über Gnublin ---------------------- http://www.hs-augsburg.de/~hhoegl/tmp/Gnublin Gnublin Foren ------------- - http://forum.gnublin.org - http://www.mikrocontroller.net/topic/237277 set.sh ------ :: # ELDK5 environment settings for Gnublin LPC3131 # 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 Projektideen ------------- Fahrbare Plattform `````````````````` `Ansicht unten`__ | `Ansicht oben`__ __ attachment: fahrzeug-unt.jpg __ attachment: fahrzeug-ob.jpg Die Motoren sind von http://nodna.de. 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 && tar cf - .) | (cd && 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 Kernel kompilieren ------------------ Es gibt zwei Möglichkeiten: Variante 1 ``````````` Die ELDK **5.0** Toolchain muss installiert sein. 0. Hostrechner vorbereiten: Oft fehlen die Pakete: git, libncurses5-dev. Auf Fehlermeldungen achten, ob weitere Pakete fehlen. 1. 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`` 2. Einstellungen "sourcen": ``. set.sh`` 3. ``make menuconfig`` 4. ``make zImage``, ``make modules`` Das zImage findet man im Verzeichnis ``arch/arm/boot/``. 5. Module installieren ``make modules_install INSTALL_MOD_PATH=`` Variante 2 ``````````` (veraltet, bitte nicht verwenden) * http://wiki.gnublin.org/index.php/Kernel_kompilieren_%2B_Module_installieren **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. 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. 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 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 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``. 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 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 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/ 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 `` 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.