Hier wird gezeigt, wie auf dem Host Applikationen und Kernel-Module für das ZOOM-Board übersetzt werden können.
Buildroot-Toolchain
Workspace-Verzeichnis erstellen:
mkdir -p ~/workspace/zoom
Buildroot-Toolchain installieren
$ 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)
Wichtige Pfade für die Bash-Kommandozeile global verfügbar machen
$ 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(!).
Zum Testen der Buildroot-Toolchain (Lokaler Compiler & Cross-Compiler):
$ mkdir -p ~/workspace/zoom/test $ cd ~/workspace/zoom/test $ nano hello.c
Folgenden Inhalt einfügen:
#include <stdio.h> 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
Hinweis
ln: failed to create symbolic link '/usr/lib/x86_64-linux-gnu/libmpfr.so.4': File exists
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@<meinZoomBoardHostName>:/media/ram $ ssh root@<meinZoomBoardHostName>
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.
Userspace Anwendungen mit CMake
$ mkdir -p ~/workspace/zoom/test/application $ cd ~/workspace/zoom/test/application $ nano hello.c
Folgenden Inhalt einfügen:
#include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> 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@<meinZoomBoardHostName>:/media/ram $ ssh root@<meinZoomBoardHostName>
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.
Kernelmodule
Linux Kernel Quellcode herunterladen und vorbereiten
$ 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
Hinweis
ln: failed to create symbolic link '/usr/lib/x86_64-linux-gnu/libmpfr.so.4': File exists
$ make modules_prepare
Kernelmodul erstellen
$ mkdir -p ~/workspace/zoom/test/kernelModule $ cd ~/workspace/zoom/test/kernelModule $ nano helloMod.c
Folgenden Inhalt einfügen:
#include <linux/init.h> #include <linux/module.h> 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
Hinweis
Makefile:<Zeilen-Nr.>: *** missing separator (did you mean TAB instead of 8 spaces?). Stop.
$ 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@<meinZoomBoardHostName>:/media/ram $ ssh root@<meinZoomBoardHostName>
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.