====== Cross-Compilieren für das Zoom-Board =================== Hier wird gezeigt, wie auf dem Host Applikationen und Kernel-Module für das [[https://wiki.bu.ost.ch/inf/zoomboard/start|ZOOM-Board]] übersetzt werden können. Workspace-Verzeichnis erstellen: mkdir -p ~/workspace/zoom $ sudo mkdir -p /opt/zoom $ cd /opt/zoom $ sudo wget -c ftp://inf004.ost.ch/zoom/buildroot-toolchain.tar.bz2 $ sudo tar xjf buildroot-toolchain.tar.bz2 $ sudo rm -rf ./buildroot-toolchain.tar.bz2 $ ./buildroot-toolchain/bin/arm-buildroot-linux-gnueabi-gcc -v Der letzte Befehl sollte folgende Version ausgeben: \\ ''gcc version 4.7.3 (Buildroot 2014.05)'' $ sudo nano ~/.bashrc Am Ende der Datei folgenden Inhalt einfügen: # sources $PATH export PATH=$PATH:/opt/zoom/buildroot-toolchain/ export PATH=$PATH:/opt/zoom/buildroot-toolchain/bin/ export PATH=$PATH:/opt/zoom/buildroot-toolchain/lib/ Speichern, Editor verlassen und **Terminal schliessen(!)**. $ mkdir -p ~/workspace/zoom/test $ cd ~/workspace/zoom/test $ nano hello.c Folgenden Inhalt einfügen: #include void main () { printf("Hello world\n"); } Speichern und Editor verlassen. Nun das File für den lokalen Rechner kompilieren: $ gcc hello.c -o hello $ ./hello Der letzte Befehl sollte nun auf der Kommandozeile des lokalen Rechners ein \\ ''**Hello world**'' \\ ausgeben. Falls ja, funktioniert der Compiler für den lokalen Rechner. \\ \\ Jetzt noch einen symbolischen Link erstellen, um eine Fehlermeldung zu vermeiden: $ sudo ln -s /usr/lib/x86_64-linux-gnu/libmpfr.so.6 /usr/lib/x86_64-linux-gnu/libmpfr.so.4 Falls der letzte Befehl folgende Fehlermeldung ausgibt... \\ \\ ''ln: failed to create symbolic link '/usr/lib/x86_64-linux-gnu/libmpfr.so.4': File exists'' \\ \\ ..., dann wurde der symbolische Link bereits erstellt. Die Fehlermeldung kann somit ignoriert und es kann weitergemacht werden. \\ Nun dasselbe File für das Zoom-Board crosskompilieren, danach auf das Zoom-Board übertragen und danach das kompilierte File direkt auf dem Zoom-Board ausführen: $ /opt/zoom/buildroot-toolchain/bin/arm-buildroot-linux-gnueabi-gcc-4.7.3 hello.c -o hello $ scp hello root@:/media/ram $ ssh root@ Passwort: **toor** \\ \\ Wir befinden uns nun auf dem Zoom-Board und führen folgende Befehle aus: $ cd /media/ram $ ./hello Der letzte Befehl sollte nun auf der Kommandozeile des Zoom-Boards ein \\ ''**Hello world**'' \\ ausgeben. Falls ja, funktioniert der Cross-Compiler für das Zoom-Board. $ mkdir -p ~/workspace/zoom/test/application $ cd ~/workspace/zoom/test/application $ nano hello.c Folgenden Inhalt einfügen: #include #include #include #include int main(void) { printf("Hello world\n"); return EXIT_FAILURE; } Speichern und Editor verlassen. \\ \\ Folgendes File erstellen: $ nano CMakeLists.txt Folgenden Inhalt einfügen: project(random) cmake_minimum_required (VERSION 2.8) add_executable(hello hello.c) Speichern und Editor verlassen. $ mkdir -p ~/workspace/zoom/test/application/build $ cd ~/workspace/zoom/test/application/build $ cmake -DCMAKE_TOOLCHAIN_FILE=/opt/zoom/buildroot-toolchain/share/buildroot/toolchainfile.cmake .. $ make $ scp hello root@:/media/ram $ ssh root@ Passwort: **toor** \\ \\ Wir befinden uns nun auf dem Zoom-Board und führen folgende Befehle aus: $ cd /media/ram $ ./hello Der letzte Befehl sollte nun auf der Kommandozeile des Zoom-Boards ein \\ ''**Hello world**'' \\ ausgeben. Falls ja, funktioniert die Applikationserstellung für das Zoom-Board. $ cd /opt/zoom $ sudo wget -c ftp://inf004.ost.ch/zoom/linux.tar.gz $ sudo tar xzf linux.tar.gz $ sudo rm -rf linux.tar.gz $ cd linux $ export ARCH=arm $ export CROSS_COMPILE=arm-buildroot-linux-gnueabi- $ make da850_omapl138_defconfig $ sudo ln -s /usr/lib/x86_64-linux-gnu/libmpfr.so.6 /usr/lib/x86_64-linux-gnu/libmpfr.so.4 Falls der letzte Befehl folgende Fehlermeldung ausgibt... \\ \\ ''ln: failed to create symbolic link '/usr/lib/x86_64-linux-gnu/libmpfr.so.4': File exists'' \\ \\ ..., dann wurde der symbolische Link bereits erstellt. Die Fehlermeldung kann somit ignoriert und es kann weitergemacht werden. $ make modules_prepare $ mkdir -p ~/workspace/zoom/test/kernelModule $ cd ~/workspace/zoom/test/kernelModule $ nano helloMod.c Folgenden Inhalt einfügen: #include #include MODULE_DESCRIPTION("test module"); MODULE_SUPPORTED_DEVICE("none"); MODULE_LICENSE("GPL"); MODULE_AUTHOR("urs.graf@ost.ch"); static int hello_init(void) { printk(KERN_ALERT "Hello world\n"); return 0; } static void hello_exit(void) { printk(KERN_ALERT "Goodbye\n"); } module_init(hello_init); module_exit(hello_exit); Speichern und Editor verlassen. $ nano Makefile Folgenden Inhalt einfügen: ifeq ($(KERNELRELEASE),) KERNELDIR ?= /opt/zoom/linux PWD := $(shell pwd) modules: $(MAKE) ARCH=arm CROSS_COMPILE=/opt/zoom/buildroot-toolchain/bin/arm-buildroot-linux-gnueabi- -C $(KERNELDIR) M=$(PWD) modules clean: rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions .PHONY: modules clean else obj-m := helloMod.o endif Speichern und Editor verlassen. $ make modules Wenn der Inhalt von **Makefile** per //Copy-Paste// eingefügt wurde, wird vermutlich folgende Fehlermeldung ausgegeben: \\ ''Makefile:: *** missing separator (did you mean TAB instead of 8 spaces?). Stop.'' \\ Falls dies der Fall ist, das **Makefile** nochmals editieren und in der entsprechenden Zeilen-Nr. die entsprechenden Abstände durch einen Tabulator (TAB) ersetzen, danach speichern und Editor verlassen und dann den Befehl $ make modules nochmals ausführen. $ ls Es sollte nun -nebst diversen anderen Files- ein File mit der Bezeichnung \\ ''**helloMod.ko**'' \\ aufgelistet werden. Falls ja, hat das Erstellen des Kernelmoduls für das Zoom-Board geklappt. Nun wird dieses Modul auf das Zoom-Board kopiert und dort getestet: $ scp helloMod.ko root@:/media/ram $ ssh root@ Passwort: **toor** \\ \\ Wir befinden uns nun auf dem Zoom-Board und führen folgende Befehle aus (Kernelmodul laden, wieder entladen und Ausgaben anzeigen): $ cd /media/ram $ sudo insmod helloMod.ko $ sudo rmmod helloMod.ko $ dmesg | tail Der letzte Befehl sollte nun auf der Kommandozeile des Zoom-Boards ein \\ ''**Hello world \\ Goodbye**'' \\ ausgeben. Falls ja, funktioniert das erstellte Kernelmodul für das Zoom-Board.