Dies ist eine alte Version des Dokuments!


Cross-Compilieren für das Zoom-Board

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.ntb.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

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.

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.ntb.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
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@ntb.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

Wenn der Inhalt von Makefile per Copy-Paste eingefügt wurde, wird vermutlich folgende Fehlermeldung ausgegeben:
Makefile:<Zeilen-Nr.>: *** 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@<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.