GCC M68k

Wechseln zu: Navigation, Suche

GNU GCC Compiler für Freescale M68k

Übersicht

Dieser Artikel beschreibt wie eine GNU Cross Toolchain für die 68000 Mikrocontroller Familie und kompatible (Coldfire) von Freescale erstellt wird. Prinzipiell kann die Anleitung auch für andere Targets verwendet werden, muss dann allerdings angepasst werden.

Entwicklungssystem (host): OpenSuSE Linux 12.1 x86_64
Zielsystem (target): Embedded System mit MC68332CFC16 CPU, 64kB externes RAM

Folgende Softwarepakete werden verwendet:

  • Binutils 2.22
  • GCC 4.6.2
  • Newlib 1.20.0
  • GDB 6.8 und 7.3.1
  • BDM Tools 1.4.0 pre4

Zum Entpacken und Compilieren der Pakete werden diese in einem gemeinsamen Verzeichnis abgelegt. In dieser Anleitung ist das cross-m68k. Die gesamte Toolchain wird für m68k-elf Target kompiliert. Das Installationsverzeichnis wird /opt/m68k/

Zunächst wird das Build Verzeichnis angelegt und dort hin gewechselt:

mkdir cross-m68k
cd cross-m68k

Zudem macht es Sinn das Verzeichnis mit den M68k Binaries gleich zu Beginn in die Pfad Variable aufzunehmen:

export PATH=$PATH:/opt/m68k/bin


Binutils

Die Binutils enthalten den GNU Assembler, Linker, etc. Diese können mit folgenden Kommandos im Verzeichnis cross-m68k heruntergeladen, gebaut und installiert werden:

wget http://ftp.gnu.org/gnu/binutils/binutils-2.22.tar.bz2
tar -xvf binutils-2.22.tar.bz2 
cd binutils-2.22
mkdir m68k-obj
cd m68k-obj
../configure --target=m68k-elf --prefix=/opt/m68k/
make
sudo make install

GCC

GCC ist der eigentliche Compiler. Hier wird nur der C-Compiler eingesetzt, daher genügt es das Paket gcc-core-<version>.tar.bz2 von der GCC Download Seite herunter zu laden. GCC unterstützt eine sehr grosse Anzahl an Parametern und Einstellungen weshalb der Configure Schritt viele Parameter enthält. Eine Übersicht über die Einstellungen Gibt die GCC Build Referenz. Um GCC herunterzuladen, zu kompilieren und installieren müssen folgende Kommandos ausgeführt werden:

wget ftp://ftp.gwdg.de/pub/misc/gcc/releases/gcc-4.6.2/gcc-core-4.6.2.tar.bz2
tar -xvf gcc-core-4.6.2.tar.bz2
cd gcc-4.6.2
mkdir m68k-obj
cd m68k-obj
../configure --target=m68k-elf --prefix=/opt/m68k/ --enable-languages=c --with-newlib --disable-libmudflap --disable-libssp --disable-libgomp --disable-libstdcxx-pch --disable-threads --with-gnu-as --with-gnu-ld --disable-nls --with-headers=yes --disable-checking --without-headers
make -j6
sudo make install

Newlib

Newlib ist eine für Embedded Projekte zugeschnittene standard ANSI-C Bibliothek. Um sie herunterzuladen, zu bauen und installieren müssen folgende Kommandos ausgeführt werden:

wget ftp://sources.redhat.com/pub/newlib/newlib-1.20.0.tar.gz
tar -xvf newlib-1.20.0.tar.gz
cd newlib-1.20.0
mkdir m68k-obj
cd m68k-obj
../configure --target=m68k-elf --prefix=/opt/m68k/ --enable-newlib-reent-small --disable-malloc-debugging --enable-newlib-multithread --disable-newlib-io-float --disable-newlib-supplied-syscalls --disable-newlib-io-c99-formats --disable-newlib-mb --disable-newlib-atexit-alloc --enable-target-optspace --disable-shared --enable-static --enable-fast-install
make -j6
sudo make install

Bei meinen Tests hatte hier der sudo make install Aufruf nicht funktioniert, jedoch nach einem direkten Login als root und einem make install Aufruf hat des funktioniert.

Die GNU Toolchain ist nun einsatzfähig, es können C und Assembler Programme damit kompiliert/assembliert werden.

GDB

GDB ist der GNU Debugger. Er wird mit folgenden Kommandos heruntergeladen, gebaut und installiert:

wget http://ftp.gnu.org/gnu/gdb/gdb-7.3.1.tar.bz2
tar -xvf gdb-7.3.1.tar.bz2
cd gdb-7.3.1
mkdir m68k-obj
cd m68k-obj
../configure --target=m68k-elf --prefix=/opt/m68k/
make -j6
sudo make install

Falls eine ältere Version von GDB benötigt wird (die aktuellen 7.x Versionen funktionieren teilweise nicht mit Eclipse - memory view geht nicht). So kann die Version 6.8 mit folgenden Kommandos heruntergeladen, gebaut und parallel zur ober installierten Version installiert werden:

wget http://ftp.gnu.org/gnu/gdb/gdb-6.8a.tar.bz2
tar -xvf gdb-6.8a.tar.bz2
cd gdb-6.8
mkdir m68k-obj
cd m68k-obj
../configure --target=m68k-elf --prefix=/opt/m68k/ --program-suffix=6.8 --disable-werror --program-prefix=m68k-elf-
make -j6
sudo make install

Der GDB 6.8 kann dann mit m68k-elf-gdb6.8 oder m68k-elf-gdbtui6.8 gestartet werden.

BDM Tools

Die meisten der Freescale Prozessoren und Mikrocontroller besitzen eine eingebaute Debug Hardware (ähnlich JTAG) welche BDM (Background Debug Mode) genannt wird. Die Kommunikation des GDB mit dem Target Prozessor erfolgt über einen BDM Adapter und einen Device Treiber welcher Teil der BDM Tools ist. Die BDM Tools unterstützen 68000 und Coldfire Targets. Bauanleitungen für passende BDM Adapter am PC Parallelport befinden sich auf der BDM Tools Homepage. Für Coldfire Targets kann alternativ das TBLCF USB Interface verwendet werden. Des weiteren funktionieren die Parallelport Wiggler für m68k von Macraigor mit den BDM Tools.

Um die BDM Tools auf einem 64Bit Host System einsetzen zu können müssen diese modifiziert werden, des weiteren wird der MC68332 nicht direkt von den BDM Tools Testprogrammen unterstützt. Statt dessen sind die Testprogramme auf den MC68360 angepasst, welcher sich in Konfigurationsregistern und teilweise in Prozessorregistern unterscheidet. Die Anpassungen für 64Bit Host und MC68332 sind diesem Beitrag als Patch beigefügt.

Datei:M68k-bdm-1.4-pre4-x86 64.patch.tar.bz2

Die BDM tools werden mit dem folgenden Kommandos heruntergeladen, gepatcht, gebaut und installiert:

wget http://sourceforge.net/projects/bdm/files/m68k-bdm/1.4.0/m68k-bdm-1.4-pre4.tar.bz2/download -O m68k-bdm-1.4-pre4.tar.bz2
tar -xvf m68k-bdm-1.4-pre4.tar.bz2
wget http://www.mikrocontroller.net/wikifiles/8/85/M68k-bdm-1.4-pre4-x86_64.patch.tar.bz2
tar -xvf M68k-bdm-1.4-pre4-x86_64.patch.tar.bz2
cd m68k-bdm-1.4-pre4
patch -p1 < ../m68k-bdm-1.4-pre4-x86_64.patch
cd m68k
mkdir m68k-obj
cd m68k-obj
../configure --prefix=/opt/m68k/ --disable-tblcf --enable-bdmctrl
make -j6
sudo make install

Parallelport Treiber

Für den Hardwarezugriff muss noch der Device Treiber installiert werden. Dazu muss der Treiber für eines der Host Systeme im cross-m68k/m68k-bdm-1.4-pre4/m68k/driver Verzeichnis kompiliert werden. Für den in OpenSuSE 12.1 verwendeten 3.1 Kernel den Treiber im linux-3 Verzeichnis. Dazu folgendes Kommando ausführen:

make

Um den Treiber zu installieren müssen alle folgende Aktionen als root durchgeführt werden:

make install
depmod -a

Die folgenden Schritte hängen Teilweise von der verwendeten Linux Distribution ab. Weitere Informationen zum Einrichten des Device Treibers können auf der BDM Tools Homepage gefunden werden.

Nun muss noch ein Devicenode erstellt werden, dazu als root folgende Kommandos eingeben:

mknod -m666 /dev/bdmicd0 c 34 8  
ln -s /dev/bdmicd0 /dev/bdm

Damit die Devicenodes nicht nach jedem Neustart neu erstellt werden müssen können diese auch in die Datei /etc/init.d/boot.local eingetragen werden.

Damit der Treiber automatisch geladen wird muss die Datei /etc/modprobe.d/50-bdm.conf mit folgendem Inhalt als root erstellt werden:

alias char-major-34 bdm

Um die Funktion des Parallelport Treibers zu testen kann das Programm bdm-cpu32-chk verwendet werden. Um es zu starten muss die Target Hardware eingeschaltet sein und über den BDM Parallelport Adapter mit dem PC verbunden sein. Danach das Programm starten:

bdm-cpu32-chk /dev/bdmicd0

Das Testprogramm führt dann über die BDM Schnittstelle folgende Testschritte aus:

  • Prozessor Register schreiben/lesen
  • Initialisieren der Chip selects CS2 und CS3 für 64k RAM ab Adresse 0x200000
  • aktivieren des internen TPURAM
  • RAM Test intern
  • RAM Test extern
  • Testcode in internes RAM laden und ausführen (Einzelschritt und run)
  • Testcode in externes RAM laden und ausführen (Einzelschritt und run)

Es kann gegebenenfalls notwendig sein das bdm-cpu32-chk Programm anzupassen da dieser sehr stark von der verwendeten Target Hardware abhängt. Der Sourcecode befindet sich im Verzeichnis cross-m68k/m68k-bdm-1.4-pre4/m68k/test/cpu32-chk.c.

Wenn diese Tests ohne Fehler ausgeführt werden können ist der BDM Adapter und Treiber Software einsatzbereit.

Beispiel

Beispieldatei (main.c):

int main(int argc, char *argv[])
{
  int i,j=1;
  for(i=0;i<10;i++)
  {
    j *= (i+1);
  }
  for(;;);
}

Kompilieren:

m68k-elf-gcc -O0 -gdwarf-2 -o m68ktest.elf main.c

Laden mit Debugger:

m68k-elf-gdb -x gdbinit m68ktest.elf

Die gdbinit Datei:

# connect target
targ rem | m68k-bdm-gdbserver pipe /dev/bdmicd0

# reset target
monitor bdm-sleep 200
monitor bdm-reset
monitor bdm-sleep 200

# I/O is to supervisor program space
set $dfc=5
set $sfc=5

# set SIMCR
set {unsigned short}(0xfffa00) = 0x42cf
# set SYPCR
set {unsigned char}(0xfffa21) = 0x06
# set SYNCR
set {unsigned short}(0xfffa04) = 0x7f00
# set TRAMBAR
#set {unsigned short}(0xfffb04) = 0x1000
# set CSPAR0
set {unsigned short}(0xfffa44) = 0x3fff
# set CSPAR1
set {unsigned short}(0xfffa46) = 0x03ff
# set CSBAR2 to 0x200000 with 64k even byte
set {unsigned short}(0xfffa54) = 0x2003
# set CSOR2
set {unsigned short}(0xfffa56) = 0xd830
#set {unsigned short}(0xfffa56) = 0xdf70
# set CSBAR3 to 0x200000 with 64k odd byte
set {unsigned short}(0xfffa58) = 0x2003
# set CSOR3
set {unsigned short}(0xfffa5a) = 0xb830
#set {unsigned short}(0xfffa5a) = 0xbf70

# load program
load
# set breakpoint to main
b main
# run to main
cont

Hello World

Hier ein Bespielprojekt: Datei:M68k-example.tar.bz2

Links

Binutils Download: http://ftp.gnu.org/gnu/binutils
Binutils Build Referenz: http://sourceware.org/binutils
GCC Download: http://gcc.gnu.org
GCC Build Referenz: http://gcc.gnu.org/install/configure.html
Newlib Homepage: http://sourceware.org/newlib
GDB Homepage: http://www.gnu.org/software/gdb
BDM Tools Homepage: http://bdm.sourceforge.net
TBLCF Forum Thread: http://forums.freescale.com/freescale/board/message?board.id=CFCOMM&message.id=624