Click here to load reader

Embedded Linux lernen mit dem Raspberry Pi - · PDF fileEmbedded Linux lernen mit dem Raspberry Pi Linux- Systeme selber bauen und programmieren Bearbeitet von Jürgen Quade 1. Auflage

  • View
    233

  • Download
    0

Embed Size (px)

Text of Embedded Linux lernen mit dem Raspberry Pi - · PDF fileEmbedded Linux lernen mit dem...

  • Embedded Linux lernen mit dem Raspberry Pi

    Linux-Systeme selber bauen und programmieren

    Bearbeitet vonJrgen Quade

    1. Auflage 2014. Taschenbuch. X, 296 S. PaperbackISBN 978 3 86490 143 0

    Format (B x L): 16,5 x 24 cm

    Weitere Fachgebiete > EDV, Informatik > Hardwaretechnische Grundlagen >Grorechner, Server, eingebettete Systeme

    Zu Inhaltsverzeichnis

    schnell und portofrei erhltlich bei

    Die Online-Fachbuchhandlung beck-shop.de ist spezialisiert auf Fachbcher, insbesondere Recht, Steuern und Wirtschaft.Im Sortiment finden Sie alle Medien (Bcher, Zeitschriften, CDs, eBooks, etc.) aller Verlage. Ergnzt wird das Programmdurch Services wie Neuerscheinungsdienst oder Zusammenstellungen von Bchern zu Sonderpreisen. Der Shop fhrt mehr

    als 8 Millionen Produkte.

  • 3.3 Cross-Development fr den Raspberry Pi

    Um fr den Raspberry Pi ein eigenes System zu bauen, sind die folgendenSchritte notwendig:

    1. Kernel herunterladen, konfigurieren, generieren

    2. Userland generieren

    3. Installation auf der SD-Karte

    Theoretisch ist es mglich, die System- und Anwendungssoftware frden Raspberry Pi auf dem Raspberry Pi selbst zu erzeugen, also eineHostentwicklung durchzufhren. Praktisch jedoch dauert allein das Ge-nerieren des Kernels mehrere Stunden, sodass eine Host-/Target-Ent-wicklung effizienter ist. Je nach Leistungsfhigkeit des Hostsystemskann die Generierung des Kernels auf unter zehn Minuten reduziertwerden.

    Fr die Host-/Target-Entwicklung wird eine Cross-Development-Toolchain bentigt, die aus Cross-Compiler, Cross-Linker, Cross-Libra-ries und Cross-Debugger besteht. Als Cross-Development-Toolchainwird im Allgemeinen gern auf die GNU-Toolchain gesetzt, die parallelzu den Hostwerkzeugen (also Compiler fr das Hostsystem selbst) in-stalliert wird. Allerdings ist die Installation hufig nicht trivial, sodasswir zunchst auf vorbereitete Pakete zurckgreifen beziehungsweisespter ein Werkzeug zur automatisierten Erstellung der Toolchain ein-setzen.

    Im Folgenden wollen wir das Selbstbausystem auf den Raspberry Piportieren. Daran lsst sich sehr gut der Umgang mit Cross-Entwick-lungswerkzeugen demonstrieren. Wir fangen wieder mit dem Kernel an,um danach das Userland aufzusetzen. Die Entwicklung selbst soll unter-halb des Verzeichnisses ~/embedded/raspi/ stattfinden, das wir bereits an-gelegt haben.

    3.3.1 Cross-Generierung Kernel

    Um einen Kernel fr den Raspberry Pi zu bauen, ist Folgendes zu tun (sieheBeispiel 3-8):

    1. Toolchain installieren

    2. Kernelquellen per git herunterladen

    3. Kernel konfigurieren

    4. Generieren

    64 3 Embedded von Grund auf

  • Fr die Cross-Generierung des Kernels wird als Erstes eine Cross-Ent-wicklungsumgebung bentigt, die sich auf einem Ubuntu per apt-getinstall gcc-arm-linux-gnueabi leicht installieren lsst. Auch wenn diese(in der unter Ubuntu 12.04 zur Verfgung stehenden Version) wederUserland noch Bootloader generiert, wollen wir sie zunchst fr denKernel einsetzen.

    Leider knnen Sie die bereits installierten Kernelquellen nicht weiterbenutzen, da der ber [http://www.kernel.org] herunterladbare Kernelin der Version 3.10.9 von Linus Torvalds den Raspberry Pi nicht voll-stndig untersttzt. Nehmen Sie daher einen bereits vorkonfektioniertenQuellcode, der sich per git ber Github unterhalb von ~/embedded/raspi/installieren lsst. Der Umgang mit git falls unbekannt ist brigensim Anhang C, Git im Einsatz in Kurzform beschrieben.

    Vorteilhafterweise bringt der vorkonfektionierte Kernel die in Ta-belle 3-7 aufgefhrten Generierungs-Targets fr den Raspberry Pi mit,die die Kernelkonfiguration erheblich vereinfachen. Der mit dem Targetbcmrpi_defconfig generierte Kernel kann brigens auch mit einem Rasp-bian eingesetzt werden, wobei einige nicht elementare Treiber als Mo-dule generiert werden.

    Fr die Konfiguration und die Generierung des Linux-Kernels mit einemCross-Compiler wird make mit dem zustzlichen Parameter ARCH=arm auf-gerufen [QuKu2011a]. Zustzlich muss noch der Parameter CROSS_COMPI-LE=arm-linux-gnueabi- angegeben werden. Nur so werden die richtigenCross-Compile-Werkzeuge gefunden, deren Namen sich aus den im Pa-rameter stehenden Namensvorsatz arm-linux-gnueabi- und demWerkzeugnamen selbst ergeben. Der Name des Cross-Compilers gcclautet demnach arm-linux-gnueabi-gcc. Beispiel 3-8 zeigt im Detaildie Kommandos, die in einem Terminal aufzurufen sind, um auf einemUbuntu einen Raspberry Pi-Kernel zu generieren. Dabei mssen Sie ins-besondere fr das Klonen des Kernels (Herunterladen des gepatchtenKernelquellcodes per git) einige Minuten Zeit einplanen.

    Tabelle 3-7

    Vordefinierte

    Kernelkonfigura-

    tionen fr den

    Raspberry Pi

    3.3 Cross-Development fr den Raspberry Pi 65

  • [email protected]:~/embedded>[email protected]:~/embedded> cd [email protected]:~/embedded/raspi> sudo apt-get \ install gcc-arm-linux-gnueabi [email protected]:~/embedded/raspi> git clone \ https://github.com/raspberrypi/[email protected]:~/embedded/raspi> cd [email protected]:~/embedded/raspi/linux> git branch -a* rpi-3.6.y remotes/origin/HEAD -> origin/rpi-3.6.y remotes/origin/master remotes/origin/rpi-3.10.y remotes/origin/rpi-3.2.27 remotes/origin/rpi-3.6.y remotes/origin/rpi-3.8.y remotes/origin/rpi-3.9.y remotes/origin/[email protected]:~/embedded/raspi/linux> git checkout [email protected]:~/embedded/raspi/linux> make ARCH=arm [email protected]:~/embedded/raspi/linux> make ARCH=arm \ CROSS_COMPILE=arm-linux-gnueabi- [email protected]:~/embedded/raspi/linux>

    Der Parameter -j4 sorgt wieder fr die Parallelverarbeitung auf einemMulticore-System. Der Kernel befindet sich nach einer erfolgreichdurchgelaufenen Generierung im Linux-Quellcodeverzeichnis unter~/embedded/raspi/linux/arch/arm/boot/zImage.

    Die Installation des Kernels auf der SD-Karte des Raspberry Pi wirdnach der Generierung des Userlands beschrieben.

    Kernel auf dem Raspberry Pi selbst bauenAuch wenn es lange dauert, wenn der Raspberry Pi mit einem Raspbian be-trieben wird, lsst sich der Kernel auf diesem nativ kompilieren. Loggen Siesich dazu auf dem Raspberry Pi mit dem Login pi (Passwort raspberry) einund werden Sie Superuser (sudo su). Sie knnen dann die gepatchten Kern-elquellen installieren, konfigurieren und genererieren. Beispiel 3-9 zeigt Ih-nen die dazu bentigten Befehle und zustzlich noch die Kommandos, mitdenen Kernel und Module installiert werden. Da der Kernel zustzlich zumStandardkernel installiert wird, wird noch die Datei /boot/config.txt modifi-ziert. Dieser Schritt darf allerdings nur einmalig durchgefhrt werden .

    Beispiel 3-8

    Kommandos, um

    den Raspberry-

    Kernel auf einem

    Ubuntu zu

    generieren

    66 3 Embedded von Grund auf

  • [email protected] ~ $ sudo [email protected]:/home/pi# cd /usr/[email protected]:/usr/src# git clone \ https://github.com/raspberrypi/linux.git -b [email protected]:# cd [email protected]:# make [email protected]:# make [email protected]:# [email protected]:# make [email protected]:# cp arch/arm/boot/zImage /boot/[email protected]:# echo "kernel=linux-3.10.y" >>/boot/config.txt

    3.3.2 Cross-Generierung Userland

    Um das Userland fr den Raspberry Pi zu bauen, ist Folgendes zu tun:

    1. Das fr Qemu erstellte Userland kopieren

    2. Das Init-Skript rcS anpassen

    3. Die inittab anpassen

    4. Cross-Entwicklungsumgebung erstellen

    5. Busybox fr die Cross-Entwicklung konfigurieren und Busybox kompilie-ren

    6. Generierungsskript mkrootfs.sh anpassen

    7. Das Userland per mkrootfs.sh zusammenbauen

    Um das bereits in Abschnitt 3.2 vorbereitete Userland auf dem Raspber-ry Pi einsetzen zu knnen, muss es angepasst werden. Dazu kopieren Sieals Erstes die Quelldateien in das Verzeichnis raspi, legen fr Skripte eineigenes Verzeichnis an und kopieren dann noch das Generierungsskriptmkrootfs.sh in das neue Verzeichnis:

    [email protected]:~> cd embedded/raspi/[email protected]:~/embedded/raspi> cp -r ../qemu/userland/ [email protected]:~/embedded/raspi> mkdir [email protected]:~/embedded/raspi/scripts> cp ../../qemu/mkrootfs.sh [email protected]:~/embedded/raspi/scripts>

    Die Anpassungen des Userlands betreffen zunchst die Dateien inittab(zur Untersttzung der seriellen Schnittstelle) und rcS (zur Konfigurati-on des Netzwerkinterface). Auerdem mssen noch zustzliche Gerte-dateien angelegt und die Busybox cross-kompiliert werden.

    Beispiel 3-9

    Kernel auf dem

    Raspberry Pi selbst

    bauen

    3.3 Cross-Development fr den Raspberry Pi 67

  • ::sysinit:/etc/rcS::askfirst:/bin/ashttyAMA0::askfirst:/bin/ash

    Um im Userland nicht nur mit einer ber USB angeschlossenen Tastaturund einem per HDMI angeschlossenen Monitor Ein- und Ausgaben tti-gen zu knnen, soll die im Bereich eingebetteter Systeme hufig anzut-reffende serielle Schnittstelle untersttzt werden. Dazu wird init berdie inittab so konfiguriert, dass eine zweite Shell auf der seriellenSchnittstelle gestartet wird. Beispiel 3-10 zeigt die modifizierte Konfigu-rationsdatei, die um eine Zeile ergnzt wurde. Dieser entnehmen Sie,dass die serielle Schnittstelle auf dem Raspberry Pi ber den NamenttyAMA0 angesprochen wird. Die zugehrige Gertedatei /dev/ttyAMA0wird spter ber das Skript mkrootfs.sh angelegt.

    [email protected]:~/embedded/raspi> cd userland/[email protected]:~/embedded/raspi/userland/target> gedit inittab &

    Die Netzwerkkonfiguration muss angepasst werden, da das Ethernet-In-terface auf dem Raspberry Pi eine Initialisierungszeit bentigt. Vorherlsst sich keine IP-Adresse konfigurieren. Die IP-Adresse selbst ist eben-falls auszutauschen. Anstelle der