## page was renamed from ElinuxBBB #format rst #language de Pflichtversuche mit dem Beagle Bone Black ========================================= H\. Högl, 2016, 2017, 2018 Link zur Veranstaltung: http://hhoegl.informatik.hs-augsburg.de/hhwiki/EmbeddedLinux .. contents:: Inhalt .. sectnum:: Vorkenntnisse -------------- 1. Üben Sie das Arbeiten auf der Kommandozeile. Der typische Zugang zu einem Embedded Linux Rechner ist fast immer mit ``ssh`` auf der Kommandozeile -- ohne grafische Oberfläche. Sie können das sehr gut auf dem PC/Notebook simulieren, wenn Sie eine Linux Distribution ohne grafische Oberfläche installieren, auch gerne virtuell über VirtualBox, z.B. Debian 10 Server Image, 64bit, https://www.osboxes.org/debian. #. Bereiten Sie den Hostrechner (d.h. Ihr PC/Notebook) zur Arbeit mit dem BBB vor (Terminalemulator z.B. picocom oder kermit, NFS, Crosscompiler, Netzwerkeinrichtung, ...) #. Machen Sie sich mit den wichtigsten Bauteilen und Schnittstellen auf dem BBB vertraut. | .. figure:: http://hhoegl.informatik.hs-augsburg.de/elinux/ss20/bbb.svg :width: 500px :target: http://hhoegl.informatik.hs-augsburg.de/elinux/ss20/bbb.svg Das BBB im Betrieb kennenlernen ------------------------------- Normalerweise sollte im eMMC Speicher ein lauffähiges Linux vorhanden sein. Früher war das ein Angstrom Linux, aktuell ist es ein Debian Linux. Falls das BBB nicht aus dem eMMC Speicher bootet, installieren Sie zunächst den eMMC Speicher neu (aktuell ist es ein Debian 10.3). 1. Lernen Sie den schematischen Aufbau des Boards kennen mit den wesentlichen Bausteinen, die darauf sind (Blockschaltbild). #. Üben Sie häufig wiederkehrende Aufgaben 1. Terminalprogramm mit serieller Schnittstelle verbinden (siehe den Abschnitt unten zur Konsole) #. Einloggen #. Bootmeldungen betrachten (dmesg) #. Welches Linux haben Sie? (Typ, Version) #. Useraccount mit ``adduser`` einrichten (nicht als Root arbeiten) #. Systemzeit setzen mit ``date`` und ``ntpdate`` #. Machen Sie sich mit ``systemd`` vertraut. Übersicht: https://www.linuxtrainingacademy.com/systemd-cheat-sheet - Viewing Systemd Information - Working with Services - Viewing Log Messages - Zeiteinstellungen mit ``timedatectl`` #. Netzwerkverbindung herstellen. Verschiedene Varianten ausprobieren: - mit USB Kabel - mit Kabel über eth Schnittstelle - mit WiFi, z.B. über einen USB WiFi Adapter. Ich kann den TPLINK TL-WN725N empfehlen. #. Gehen Sie mit ``ssh`` und ``http`` auf das Board. #. Dateien mit ``scp`` zwischen Host und Target übertragen #. Vom Target aus über den Hostrechner eine Netzwerkverbindung in das Internet herstellen (ip, iw, ifconfig, iwconfig, wpa_supplicant) #. System auf der Kommandozeile u.a. mit ``procfs`` erforschen (ls, ps, tree, cat, less, vi, uname, mount, df, du, fdisk, ...) #. "Erforschen" Sie das Linux auf dem BBB über die ssh oder Konsolenverbindung: - Welches Linux wird verwendet? - Welche Prozesse (Dienste) laufen? Welche Aufgabe haben diese Prozesse? - Welche Pakete sind installiert? - Wie viel Platz belegt das Root Filesystem? Flash Speicher -------------- #. Wie behandelt man eine rohe SD Karte mit ``fdisk`` und ``mkfs.vfat`` bzw. ``mkfs.ext4``, so dass man darauf ein bootfähiges Linux installieren kann? #. Wie bootet man von der SD Karte? #. Wie kann man den eMMC Speicher komplett neu mit einem Linux beschreiben? Vorher sollte man ein Backup des aktuellen eMMC Speicher machen! Tipp: Es geht mit einem "Flasher Image", das man unter https://beagleboard.org/latest-images bekommt. Konsole ------- #. Schliessen Sie einen UART-zu-USB Adapter an der 6-poligen Pfostenleiste auf dem BBB an, so dass man die Konsole auf dem Hostrechner sehen kann. Das Terminalprogramm ``picocom`` starten mit :: picocom -b 115200 /dev/ttyUSB0 (aufpassen: Manche Linux Distributionen verwenden nur 9600 Baud) Welchen Vorteil hat diese Konsole im Vergleich mit der ssh Verbindung über USB bzw. Netzwerkkabel? Hostrechner ----------- 1. Mounten Sie das Homeverzeichnis des BBB mit ``sshfs`` auf dem Hostrechner. #. Installieren Sie auf dem Hostrechner eine Cross-GCC Toolchain und kompilieren Sie ein kleines Demoprogramm. Übertragen Sie es mit ``scp`` auf das BBB und führen Sie es aus. Die einzelnen Programme des Cross-GCC haben den Präfix ``arm-linux-gnueabihf-``. Auf Ubuntu und verwandten Linuxen gibt es das Paket ``gcc-arm-linux-gnueabi``. Das ist der einfachste Weg um zu einer Toolchain zu kommen. Eine Alternative ist das "Crosstool-NG": http://crosstool-ng.github.io (so macht es Simmonds in MELP). Ein dritter Weg ist die "Linaro Toolchain", https://www.linaro.org/downloads. Falls Sie einen C Compiler auf dem BBB haben, kompilieren Sie das Programm auch nativ und testen Sie es. U-Boot ------ 1. Stoppen Sie den Bootvorgang in der Konsole, so dass Sie auf dem U-Boot Prompt landen. - Wie sieht man die U-Boot Umgebungsvariablen an? - Booten Sie auf dem U-Boot Prompt vom eMMC Speicher. - Booten Sie auf dem U-Boot Prompt von der MicroSD Karte. - Booten Sie auf dem U-Boot Prompt über das Netzwerk mit tftp oder nfs. #. Kompilieren Sie den U-Boot Bootloader aus den aktuellen git Quellen und Updaten Sie ihn auf dem Board. Schnittstellen -------------- 1. Einfache I/O Demo mit Taster und LED: 1. GPIO ueber sysfs einlesen (polling/interrupt) und ausgeben #. Tastendruck wird als Event ueber sysfs erkannt und schaltet LED ein und aus #. Ein Demo-Geraetetreiber faengt den Tastendruck als Interrupt ab und schaltet die LED ein- und aus. Lit.: http://derekmolloy.ie/writing-a-linux-kernel-module-part-1-introduction GPIOs werden in Molloy, Kap. 6 behandelt. #. Machen Sie ein einfaches Programm zum Ansteuern der seriellen Schnittstelle in C/C++ und Python. Sie sollten die Schnittstelle öffnen, ein paar Zeichen schreiben und danach lesen, am Ende wieder schliessen. Man sollte den Code mit einer simplen Verbindung zwischen dem TX- (senden) und RX-Signal testen können. Hilfreich sind folgende Texte: - http://tldp.org/HOWTO/Serial-Programming-HOWTO - https://pythonhosted.org/pyserial Der UART wird in Molloy, Kap. 8 behandelt. #. Machen Sie sich mit den Bussen `I2C `_ und `SPI `_ vertraut. Beide werden in Molloy, Kap. 8 behandelt. Auch `1-Wire Bus `_ wäre eine gute Wahl an Hand des Temperatursensors DS18B20. Ein Tutorial von vielen im Netz zu 1-Wire: http://www.bonebrews.com/temperature-monitoring-with-the-ds18b20-on-a-beaglebone-black/ Build-Umgebungen ---------------- Das ist ungefähr der Inhalt von Simmonds MELP, ch. 6 "Selecting a Build System". 1. Bauen Sie ein Root-Filesystem mit Kernel und U-Boot aus den folgenden Distributionen: * Buildroot * Yoctoproject Installieren Sie es auf einer MicroSD-Karte und testen Sie es auf dem BBB. Es soll auch der Bootloader U-Boot und die Cross-Toolchain dabei entstehen. #. Aufgaben mit dem Kernel in der Bau-Umgebung * Konfigurieren * Vorhandene Treiber aktivieren/deaktivieren * Eigenen (Dummy) Treiber einbauen * Updaten auf eine andere Kernel Version #. Aufgaben mit dem Root Filesystem in der Bau-Umgebung * Pakete aktivieren/deaktivieren * Eigene Pakete einbauen Programmieraufgaben ------------------- Diese Aufgaben sollen als "Vorübung" zum Projekt verstanden werden (siehe ``_). Kleiner Server `````````````` Das soll nur ein Gerüst für einen Server werden, der automatisch nach dem Booten startet. Mögliche Programmiersprachen sind C, C++, Python, Go und JavaScript (Node.JS). Der Server sollte auch einen Logging-Mechanismus haben. Zeitliches Verhalten programmieren ("Echtzeit") ``````````````````````````````````````````````` Im gitlab Repository https://r-n-d.informatik.hs-augsburg.de:8080/hubert.hoegl/elinux.git finden Sie ein paar Beispiele die demonstrieren, wie man zeitliches Verhalten in Linux programmiert. Vollziehen Sie die Beispiele in den Verzeichnissen ``timing`` und ``bbb-rt-test/rt-demos`` nach. Tipps für die Kommandozeile --------------------------- Welche serielle Schnittstelle ist an welchem Device? ```````````````````````````````````````````````````` Wenn ich mir auf meinem Rechner alle ``/dev/tty*`` Einträge anschaue, dann sieht es so aus: .. code-block:: text tty tty21 tty35 tty49 tty62 ttyS12 ttyS26 tty0 tty22 tty36 tty5 tty63 ttyS13 ttyS27 tty1 tty23 tty37 tty50 tty7 ttyS14 ttyS28 tty10 tty24 tty38 tty51 tty8 ttyS15 ttyS29 tty11 tty25 tty39 tty52 tty9 ttyS16 ttyS3 tty12 tty26 tty4 tty53 ttyACM0 ttyS17 ttyS30 tty13 tty27 tty40 tty54 ttyACM1 ttyS18 ttyS31 tty14 tty28 tty41 tty55 ttyACM2 ttyS19 ttyS4 tty15 tty29 tty42 tty56 ttyACM3 ttyS2 ttyS5 tty16 tty3 tty43 tty57 ttyACM4 ttyS20 ttyS6 tty17 tty30 tty44 tty58 ttyprintk ttyS21 ttyS7 tty18 tty31 tty45 tty59 ttyS0 ttyS22 ttyS8 tty19 tty32 tty46 tty6 ttyS1 ttyS23 ttyS9 tty2 tty33 tty47 tty60 ttyS10 ttyS24 ttyUSB0 tty20 tty34 tty48 tty61 ttyS11 ttyS25 Die für uns wichtigsten Einträge sind ``/dev/ttyACM*`` und ``/dev/USB*``. Je nachdem wie viele serielle Geräte man in welcher Reihenfolge eingesteckt hat, kann sich der Gerätename auch ändern. Über ``lsusb`` findet man schon mal den VID:PID Eintrag heraus (VID = Vendor ID, PID = Product ID). Der USB Anschluss des BBB ist hier:: Bus 003 Device 010: ID 1d6b:0104 Linux Foundation Multifunction Composite Gadget Der USB UART für die Konsole sieht so aus:: Bus 003 Device 011: ID 0403:6001 Future Technology Devices International, Ltd FT232 Serial (UART) IC Mit ``udevadm`` kann man nun die Properties eines Gerätes ausgeben und nachschauen, ob VID:PID identisch sind:: udevadm info -q property -n /dev/ttyACM4 Bei mir kommt heraus, dass ttyACM4 der USB Anschluss des BBB ist. Der Konsolen-UART ist ttyUSB0. Nun kann man den Terminal-Emulator mit dem richtigen Device aufrufen:: picocom -b 115200 /dev/ttyUSB0 # Konsolen-UART (USB Kabel von FTDIChip) picocom -b 115200 /dev/ttyACM4 # USB Anschluss des BBB Aufpassen: Es kann gut sein, dass eine andere Linux Distribution nicht die angegebenen Geschwindigkeit von 115200 Baud hat sondern z.B. nur 9600 Baud! Mikro-SD Karte beschreiben `````````````````````````` Alte Mikro-SD Karte (4 GByte) in den Kartenleser gesteckt, um zu sehen was drauf ist: .. code-block:: bash $ lsblk ... sdd 8:48 1 3,7G 0 disk ├─sdd1 8:49 1 100M 0 part /media/hhoegl/BOOT └─sdd2 8:50 1 3,6G 0 part /media/hhoegl/ROOT ... Das sieht nach einer bereits für das BBB beschriebenen Karte aus. Wir wollen diese Karte jedoch mit einem neuen Image überschreiben, deshalb aktuelles Debian Image holen von https://beagleboard.org/latest-images: ``bone-debian-10.3-iot-armhf-2020-04-06-4gb.img.xz``. Man muss das Image nicht entpacken. Den "Balena Etcher" von https://www.balena.io/etcher holen. Im ZIP Archiv befindet sich ein "AppImage" für 64-Bit Linux, das man einfach mit ``chmod 755 ...`` ausführbar macht. Danach kann man es mit ``./balenaEtcher-1.5.81-x64.AppImage`` starten. Das Tool ist mit etwa 100 MByte ziemlich gross, Gründe dafür sind (a) es ist mit dem "Electron" Framework gemacht, und (b) es ist ein AppImage. Im Etcher wählt man das Image und die Mikro-SD Karte aus, dann wird die Karte geschrieben. Nachdem die Karte fertig geschrieben wurde, wirft man sie aus und steckt sie in das BBB. Vorher die Stromversorgung des BBB abschalten. Danach wieder einschalten, nun sollte das BBB von der Karte booten. *Auch empfohlen:* Die Karte mit üblichen Kommandozeilenwerkzeugen beschreiben. Es geht ungefähr so: 1. Mit ``fdisk`` oder ``cfdisk`` zwei Partitionen anlegen, vom Typ eine (klein) für FAT16 Dateisystem, eine für EXT4 (gross). 2. Die Dateisysteme erstellen (den konkreten Wert /dev/sdX müssen Sie für Ihren Rechner einsetzen):: sudo mkfs.vfat -F 16 -n "boot" /dev/sdb1 sudo mkfs.ext4 -j -L "root" /dev/sdb2 3. Die Dateien zum Booten müssen in "boot" kopiert werden. 4. Das Root Filesystem muss in "root" kopiert werden. Eine detaillierte Anleitung ist hier: http://www.armhf.com/boards/beaglebone-black/bbb-sd-install/ http://www.armhf.com/boards/beaglebone-black/bbb-sd-install/ Den eMMC Speicher auf dem BBB beschreiben ````````````````````````````````````````` Das geht im Prinzip wie im vorherigen Abschnitt "Mikro-SD Karte beschreiben", ausser dass man nun das "Flasher Image" nimmt. Das Flasher Image wird auf die Mikro-SD Karte geschrieben, nach dem Booten erfüllt es nur den alleinige Zweck, dass es den eMMC Speicher mit einem Debian Linux beschreibt. Während dem Flashen sieht man viele Logmeldungen auf der Konsole: http://hhoegl.informatik.hs-augsburg.de/elinux/ss20/flasher-log.txt Nach dem Flashen muss man die Karte entfernen und gut beschriften, nicht dass sie versehentlich zum Booten verwendet wird. Sollte das passieren, wir sofort wieder der eMMC Speicher überschrieben.