Mini2440 SDL GUI Programmierung

Aus der Mikrocontroller.net Artikelsammlung, mit Beiträgen verschiedener Autoren (siehe Versionsgeschichte)
Wechseln zu: Navigation, Suche

Wer ein kleines Linuxboard mit Display hat, möchte sicher nicht nur die Kernelausgaben auf der Framebuffer-Konsole ansehen oder sich für die
popligsten Anwendungen einen X-Server+Window Manager installieren, sich eine Anwendung schreiben und dann erst loslegen können.

Viel einfacher geht es in einigen Fällen mit SDL. Dieser Artikel beschreibt die Einrichtung einer Cross-Toolchain mit SDL-Support für
das Mini2440. Die unterschiede von Board zu Board sind meist sehr gering, was die Display-Ausgabe angeht. Daher lässt sich dieser Artikel
auch für einige andere Boards verwenden.

Hier ein Screenshot von einem meiner SDL-Programme:
Mini2440 sdl menu screenshot.png

Die Voraussetzungen hierfür sind:

Einrichten der Cross-Toolchain

Ich gehe davon aus, dass man alle kommenden Schritte als "normaler" User erledigt. Sämtliche Schritte, die als "root" erledigt werden müssen, wird ein "sudo" vorangestellt. Wenn das bei dir anders gehen sollte (z.B. su -c '...'), dann ändere es für dich!

Vorarbeit

Damit es funktioniert muss die friendlyARM Toolchain installiert sein und folgendes in der Konsole erledigt werden.

sudo cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/libts.la /usr/local/arm/4.3.2/lib/libts.la
sudo cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/usr/lib/libts.so /usr/local/arm/4.3.2/lib/libts.so

In der Datei "/usr/local/arm/4.3.2/lib/libts.la" die Zeile 35 als Adminstrator editieren (z.B. in der Konsole mit "sudo gedit /usr/local/arm/4.3.2/lib/libts.la").

libdir='/usr/local/lib'

ändern zu

libdir='/usr/local/arm/4.3.2/lib'

libsdl

Die Bibliothek libSDL wird folgendermaßen kompiliert:
(Beim kopieren die "\" entfernen und alles in eine Zeile.)

cd ~
wget http://www.libsdl.org/release/SDL-1.2.14.tar.gz
tar xvfz SDL-1.2.14.tar.gz
cd SDL-1.2.14
RANLIB=/usr/local/arm/4.3.2/bin/arm-linux-ranlib CROSS_COMPILE=arm-linux- ./configure --host=arm-linux \ 
--prefix=/usr/local/arm/4.3.2/ \ 
--enable-input-tslib --enable-video-fbcon --disable-audio --disable-video-x11 --disable-video-directfb
time make
sudo time make install

Diese Schritte dauerten bei mir ca 5 Minuten.

Nun lassen sich schon die ersten Programme mittels SDL compilieren. Allerdings fehlen noch zusätzliche libs, wie z.B. sdl_gfx und sdl_image
um Grafiken, Texte und Bilder anzeigen zu können. SDL alleine steht da ein wenig auf dem Schlauch.

Einen Haken hat die Sache noch. Dadurch, dass SDL in seinem Audio-Code auch Assembler verwendet habe ich es noch nicht hinbekommen, SDL mit ALSA oder OSS Support zu compilieren. Wer dazu einen Tip hat, immer her damit :)

libsdl_image

Mit dieser lib lassen sich recht einfach Bilder laden und anzeigen.
(Beim kopieren die "\" entfernen und alles in eine Zeile.)

cd ~
wget http://www.libsdl.org/projects/SDL_image/release/SDL_image-1.2.10.tar.gz
tar xvfz SDL_image-1.2.10.tar.gz
cd SDL_image-1.2.10
RANLIB=/usr/local/arm/4.3.2/bin/arm-linux-ranlib CROSS_COMPILE=arm-linux- ./configure --host=arm-linux \
--prefix=/usr/local/arm/4.3.2/ \ 
--enable-gif --enable-jpg --enable-bmp
time make
sudo time make install

libsdl_gfx

Diese lib stellt einen Haufen Grafikfuntkionen bereit, wie Polygone, Rechtecke, Kreise, Linien, ... Ausserdem beinhaltet sie eine Textausgabe und Funktionen um Surfaces zu rotieren und zu zoomen.
(Beim kopieren die "\" entfernen und alles in eine Zeile.)

cd ~
wget http://www.ferzkopp.net/Software/SDL_gfx-2.0/SDL_gfx-2.0.21.tar.gz
tar xvfz SDL_gfx-2.0.21.tar.gz
cd SDL_gfx-2.0.21
RANLIB=/usr/local/arm/4.3.2/bin/arm-linux-ranlib CROSS_COMPILE=arm-linux- ./configure --host=arm-linux \
--prefix=/usr/local/arm/4.3.2/ --disable-mmx
time make
sudo make install

Testprogramme

Die kompilierten Programme können nur auf dem Mini ausgeführt werden, wenn auch die vorher erstellten Bibliotheken dem Kernel bekannt sind. Die Bibliotheken aus diesem Artikel wären dann folgende:

  • libts-0.0.so.0.1.1
  • libSDL-1.2.so.0.11.3
  • libSDL_image-1.2.so.0.8.2
  • libSDL_gfx.so.13.5.2

Weil dies aber nicht der Standardname ist unter dem die Bibliothek angesprochen ist, muss noch ein Link auf diese Datei mit dem richtigen Dateinamen erstellt werden. Dazu kopiert man zu erst die bis jetzt erstellten Bibliotheken in den Ordner "/lib" des Minis und tippt in der Konsole des Minis folgendes ein:

cd /lib
ln -s libts-0.0.so.0.1.1 libts-0.0.so.0
ln -s libSDL-1.2.so.0.11.3 libSDL-1.2.so.0
ln -s libSDL_image-1.2.so.0.8.2 libSDL_image-1.2.so.0
ln -s libSDL_gfx.so.13.5.2 libSDL_gfx.so.13

Bevor die Programme auf dem Mini ausgeführt werden können, müssen diese ebenso übertragen werden.

SDL-1.2.14 Demoprogramme

Im vorhandenen Ordner "SDL-1.2.14" ist der Ordner "test" zu finden. In diesem sind ein paar Demoprogramme welche folgendermaßen kompiliert werden.

cd "Pfad zu dem Ordner"/SDL-1.2.14/test/
CROSS_COMPILE=arm-linux- ./configure --host=arm-linux
make

SDL_gfx-2.0.21 Demoprogramme

Im vorhandenen Ordner "SDL_gfx-2.0.21" ist der Ordner "Test" zu finden. In diesem sind ein paar Demoprogramme welche folgendermaßen kompiliert werden.

cd "Pfad zu dem Ordner"/SDL_gfx-2.0.21/Test/
CROSS_COMPILE=arm-linux- ./configure --host=arm-linux
make

Hinweis: Ich weiß nicht warum, aber das SDL-Skript includiert den Ordner "/usr/local/arm/4.3.2/include/SDL" und nicht "/usr/local/arm/4.3.2/include". Bei den Demoprogrammen bei der normalen SDL-Bibliothek war dies anscheinend OK. Bei diesem hier steht aber in jeder c-Datei "SDL/xxx.h" und deshalb findet er die Dateien nicht und bricht das Programmerstellen ab. Es gibt nun 2 Möglichkeiten dies zu umgehen.

  • /usr/local/arm/4.3.2/bin/sdl-config Zeile 45 editieren und das /SDL löschen oder
  • in jeder c-Datei das "SDL/" löschen.

2. Hinweis: In den c-Dateien sind defines/konstanten für die Auflösung definiert. Diese sollte man vor dem Kompilieren an sein eigenes Display anpassen.

Programm ausführen

Am besten den ganzen Ordner in das Dateisystem des Minis kopieren.
Ausgeführt werden können die Programme auf dem Mini mit:

./Programmname