Real-Time and Embedded Systems

Firmwareänderungen

Anders als beim RCX hat Lego die NXT Firmware von Anfang an auch als Source-Code veröffentlicht. Das ermöglicht das Erstellen von eigenen angepassten Custom-Firmwares. Für das Kompilieren der Quelldateien verwendet Lego das kommerzielle Produkt IAR Embedded Workbench for LEGO MINDSTORMS. Eine andere Möglichkeit bietet das NXTGCC Projekt. Damit werden die IAR-konformen Quelldateien in ein GCC-verständliches Format überführt und anschließend wird die Firmware mit dem ARM-GCC Cross-Compiler kompiliert. NXTGCC unterstützt offiziell nur Microsoft Windows, man kann es aber mit ein bisschen Geschick auch auf Linux- und MacOS-Systeme benutzen.

Installation unter Microsoft Windows

Als erstes ladet man sich NXTGCC von der Sourceforge-Projektseite runter und entpackt es. (Lokale Kopie: hier). Im NXTGCCECLIPSE Ordner hat man dann eine Eclipse-Entwicklungsumgebung zusammen mit dem ARM-GCC Cross-Compiler und alles, was man sonst für das Kompilieren der Firmware braucht. Nachdem man Eclipse startet, sieht man im Workspace zwei Projekte: NXTGCC und NXTGCCFANTOM. Für uns ist nur das erste Projekt NXTGCC relevant. Es beinhaltet zwei Unterordner LEGO-MINDSTORMS-NXT-Firmware-Open-Source und other, sowie den Java Source-Ordner src (other kann hier vernachlässigt werden). Im src befindet sich die Java-Klasse nxtgcc.sf.net.ConvertNxtGcc, mit deren Hilfe die Firmware-Quelldateien ins GCC-Format übersetzt werden. LEGO-MINDSTORMS-NXT-Firmware-Open-Source beinhaltet unter Anderem die Unterordner SourceOrig, in dem die ursprünglichen Lego-Sourcen liegen, Source, in dem sich die übersetzten GCC-konformen Sourcen befinden, sowie nxtgcc, der die für das Kompilieren der Firmware benötigten Dateien enthält.

Als nächstes muss man den Wert der Variable LEGODOWNLOADDIR im Makefile aus dem nxtgcc Ordner so ändern, dass LEGODOWNLOADDIR auf den Ordner zeigt, in den die fertig kompilierte Firmware kopiert werden soll, z.B. C:\Users\<my_user>\Documents.

Dann führt man die Klasse nxtgcc.sf.net.ConvertNxtGcc aus, in dem man aus dem Run-Button an der Toolbar ConvertNxtGcc auswählt. Somit werden die Quelldateien im SourceOrig Ordner ins GCC-verständige Format übersetzt und in den Source Ordner hinkopiert.

Wenn man nun Änderungen an den Quelldateien im Source Ordner vornimmt, muss man anschließend nur noch das Makefile ausführen, in dem man aus dem Run-External-Tool-Button NXTGCC Make auswählt. Somit wird die Firmware kompiliert und landet in den im LEGODOWNLOADDIR angegebenen Ordner. Die Firmware-Datei heißt nxtgcc.rfw. Danach kann die Firmware mit Hilfe von NeXTTool auf den NXT geflasht werden (siehe weiter unten).

Installation unter Linux

Hier braucht man als erstes den ARM-GCC Cross-Compiler. Dazu bieten wir eine fertig vorkompilierte Version an, man kann ihn aber auch manuell kompilieren und bilden, indem man die Methode verwendet, die auch bei Installation von nxtOSEK benutzt wird:

  1. Man installiert die vorausgesetzten Bibliotheken: tk-dev, ncurses-dev, libmpfr-dev und texinfo. Auf Debian-basierten Systemen (z.B. Ubuntu), kann man das beispielsweise wie folgt machen:
    $> sudo apt-get install tk-dev ncurses-dev libmpfr-dev texinfo
  2. Man lädt das build_am_toolchain.sh Skript von der nxtOSEK-Projektseite runter. (Lokale Kopie: hier)
  3. Man startet das Skript mit:
    $> sh ./build_am_toolchain.sh
    Eventuell muss man vorher die Dateirechte anpassen:
    $> sudo chmod +rwx build_arm_toolchain.sh
    Das Skript lädt die für den Cross-Compiler benötigten Pakete aus dem Netz runter, wobei das Linux/UNIX-Kommando wget benutzt wird. wget ist standardmäßig auf allen Distributionen schon vorinstalliert. Falls es aber doch noch aus irgendeinem Grund fehlt, kann man die notwendigen Pakete auch manuell runterladen. Angenommen build_am_toolchain.sh liegt im Ordner workspace. Dann erstellt man im workspace einen Unterordner src und platziert in diesem die Pakete gcc-4.4.2, binutils-2.20 und newlib-1.18.0. Diese kann man sich aus dem Netz runterladen, z.B. von hier: gcc-4.4.2, binutils-2.20 und newlib-1.18.0. Zu beachten ist allerdings, dass alle drei Pakete Source-Archive im Format .tar.bz2 oder .tar.gz sein müssen. Anschließend startet man das Skript, wie oben beschrieben.
    Und an dieser Stelle noch ein Hinweis: Die Ausführzeit des Skripts kann bis zu einer halben Stunde betragen. Der Cross-Compiler ist erst dann fertig gebildet, wenn auf der Konsole Build complete! erscheint.

Nun ist der ARM-GCC Cross-Compiler gebildet und voll funktionsfähig. Als nächstes werden wir das NXTGCC-Projekt für die Arbeit unter Linux anpassen. Dazu sind folgende Schritte notwendig:

  1.  Man lädt NXTGCC von der Sourceforge-Projektseite runter und entpackt es. (Lokale Kopie: hier). Im NXTGCCECLIPSE Ordner befinden sich die Unterordner eclipse (wird hier nicht benötigt und kann gelöscht werden) und workspace. Im workspace sind die Unterordner NXTGCC, NXTGCCFANTOM und .metadata (Die letzteren beiden werden nicht gebraucht und können auch gelöscht werden). Man hat also in etwa die folgende Ordnerstruktur:
    NXTGCC:
    -> bin:
       -> nxtgcc.sf.net.ConvertNxtGcc.class
       -> nxtgcc.sf.net.NGU.class
    -> LEGO-MINDSTORMS-NXT-Firmware-Open-Source:
       -> AT91SAM7S256:
          -> nxtgcc:
             -> .dep:
             -> utils:
                -> ...
                -> Makefile
                -> ...
             -> ...
             -> Makefile
             -> ...
          -> Source:
          -> SourceOrig:
    -> other:
    -> src:
    Für uns sind die Ordner bin, nxtgcc, Source und SourceOrig interessant, sowie die Datei nxtgcc.sf.net.ConvertNxtGcc.class und die zwei Makefiles. Im SourceOrig liegen die Quelldateien der offiziellen Lego-Firmware und im Source die übersetzten GCC-konformen Quelldateien, die wir verändern wollen. Die Java-Klasse nxtgcc.sf.net.ConvertNxtGcc dient dazu, die Übersetzung durchzuführen und mit dem Makefile im nxtgcc kompiliert man die Sourcen und erstellt die angepasste Firmware.
  2. Im NXTGCC/LEGO-MINDSTORMS-NXT-Firmware-Open-Source/AT91SAM7S256/nxtgcc/utils führt man das Makefile aus:
    NXTGCC/LEGO-MINDSTORMS-NXT-Firmware-Open-Source/AT91SAM7S256/nxtgcc/utils$> make all
    Es wird das Executable binsert erstellt. (Die Kompilierwarnungen kann man an dieser Stelle ignorieren.)
  3. Im NXTGCC/LEGO-MINDSTORMS-NXT-Firmware-Open-Source/AT91SAM7S256/nxtgcc löscht man den Unterordner .dep (dieser ist eventuell versteckt!).
  4. Im NXTGCC/LEGO-MINDSTORMS-NXT-Firmware-Open-Source/AT91SAM7S256/nxtgcc ersetzt man das Makefile mit diesem. Anschließend muss man das neue Makefile so anpassen, dass die Variable LEGODOWNLOADDIR auf den Ordner zeigt, in den die fertig kompilierte Firmware kopiert werden soll (z.B. /home/<my_user>/) und die Variable ARMELFGCCLOC auf den bin Ordner des Cross-Compilers zeigt (z.B. /home/<my_user>/gnuarm/bin/).
  5. Im NXTGCC/bin/nxtgcc/sf/net ersetzt man die Klasse ConvertNxtGcc mit dieser.
  6. Im NXTGCC startet man nxtgcc.sf.net.ConvertNxtGcc:
    NXTGCC$> java -classpath bin nxtgcc/sf/net/ConvertNxtGcc
    Somit werden die Quelldateien im SourceOrig Ordner ins GCC-verständige Format übersetzt und in den Source Ordner hinkopiert.

 

Wenn man nun Änderungen an den Quelldateien im Source Ordner vornimmt, muss man anschließend nur noch das Makefile im NXTGCC/LEGO-MINDSTORMS-NXT-Firmware-Open-Source/AT91SAM7S256/nxtgcc ausführen:

NXTGCC/LEGO-MINDSTORMS-NXT-Firmware-Open-Source/AT91SAM7S256/nxtgcc$> make all

Somit wird die Firmware kompiliert und landet in den im LEGODOWNLOADDIR angegebenen Ordner. Die Firmware-Datei heißt nxtgcc.rfw. Danach kann die Firmware mit Hilfe von NeXTTool auf den NXT geflasht werden (siehe weiter unten).

Installation unter MacOS

Auch hier braucht man als erstes den ARM-GCC Cross-Compiler. Wir bieten wieder eine fertig vorkompilierte Version an, man kann den Compiler aber auch manuell kompilieren und bilden, indem man die im Linux-Abschnitt benutzte Methode anwendet. In beiden Fällen wird vorausgesetzt, dass MacPorts bereits auf dem Rechner installiert ist. Näheres dazu siehe auf der MacPorts-Projektseite. Außerdem sollte man die GNU Multiple Precision Arithmetic Library (GMP) installieren, z.B. mit:

$> port install gmp

Anschließend fährt man, ganz analog zu der Linux-Anleitung, mit der NXTGCC Installation fort. Zu beachten ist jedoch, dass MacOS-Pfade mit /Users/ und nicht mit /home/ anfangen. 

Firmware-Flash mit NeXTTool

NeXTTool ist ein kleines Kommandozeilen-Programm, mit dessen Hilfe Firmwares auf den NXT Brick geflasht werden können. Vorausgesetzt wird, dass der Fantom-Driver bzw. libusb bereits installiert sind (näheres dazu gibt es hier). NeXTTool funktioniert unter Windows, Linux und MacOS und die entsprechende Version kann von der Bricxcc-Projektseite (befindet sich etwas weiter unten) heruntergeladen werden. Nachdem man NeXTTool entpackt hat, kann man mit

$> nexttool /COM=usb -firmware=<path_to_firmware>\nxtgcc.rfw                          (Windows + MacOS)

bzw.

$> sudo ./NeXTTool /COM=usb -firmware=<path_to_firmware>/nxtgcc.rfw                   (Linux)

die Firmware flashen. Dazu muss der NXT nicht zwingend im Firmware-Update-Mode sein, falls es aber beim Flashen Probleme gibt, sollte man das dennoch machen.