Come creare la toolchain
La CPU che il PIC32 PINGUINO (OTG) ha in dotazione è quella presente nel PIC32MX440F256H, cioè MIPS32® M4K® Processor Core.
Questa CPU use l'architettura MIPS. Abbiamo quindi bisogno di un set di strumenti che ci permettano di sviluppare per questa architettura.
Possiamo articolare il tutto in 9 passi:
Passi preliminari
Inanzitutto creiamo una directori MIPS dove più ci aggrada dove lavoreremo.
Download della mips Toolchain ufficiale
Creiamo una cartella dedicata alla toolchain, scarichiamola, ed estraiamola.
Download di binutils
Prima di tutto creiamo una cartella dedicata al lavoro che faremo con binutils.
Per una totale compatibilità, scarichiamo dal sito ufficiale la stessa versione delle binutils che troviamo nella toolchain (2.12) e lo estraiamo nella directory.
Creiamo una direcotry in cui metteremo i file generati dal comando configure e spostiamoci all'interno
Configuriamo le binutils per avere come TARGET=mips-sde-elf e impostiamo come sysroot la sysroot della toolchain che abbiamo scaricato
Applicazione della patch
Ora, dobbiamo sistemare un problema relativo a objcopy per quando riguarda la generazione di file hex, estratti dall'elf che andremo a creeare compilando il programma C.
Portiamoci alla linea 773 del file ../binutils-2.21.1/bfd/ihex.c e aggiungiamo dopo "where = l->where;" il seguente codice:
In questo modo eliminiamo l'estensione del segno che da problemi nella generazione di file ihex validi.
Salviamo e iniziamo la compilazione delle binutils.
Compilazione di binutils
Prima
Ora, ne installiamo il contenuto in una directory fittizia, in maniera da poter copiare poi solo objcopy
Copia di objcopy patchato all'interno della toolchain ufficiale
Download dell'ultima release dell'IDE PINGUINO che ci permette di avere già a disposizione i file proprietari della microchip e diversi file di esempio
Ci spostiamo nella direcotry ~/MIPS, creiamo una cartella per l'ide e file annessi e scarichiamo da svn l'ultima versione
Configurazione del tutto
Ricapitolando.
La nostra direcotry ~MIPS ora ha al suo interno le seguenti sub-dir:
binutils-dev, Pinguino, toolchain
È totalmente sicuro eliminare la cartella binutils-dev, in quanto non più necessaria.
Ora, dobbiamo fare in modo che ogni volta che abbiamo bisogno del nostro compilatore, non dobbiamo digitare l'indirizzo completo.
Aggiorniamo il file .bashrc aggiungendo la riga
E modifichiamo la variabile $PATH in questo modo:
Rendiamo effettive le modifiche:
Inoltre, un altro passaggio che consiglio (ma non è indispensabile) è di copiare il contenuto della cartella ~/MIPS/Pinguino/p32/include/ in ~/MIPS/Toolchain/include/ in maniera da non dover aggiungere il parametro -I all'invocazione di gcc comunicandogli dove trovare gli header che verranno inclusi.
Non ci resta altro se non procurarci ubw32 per poter caricare l'ihex che otterremo dai processi nel punto seguente sulla board.
Per la compilazione è necessario procurarsi libhid (su archilinux è disponibile su AUR)
Creazione di uno script per compilare rapidamente i sorgenti
Non mi dilungo ulteriormente, posto qui il mio script da inserire in ~/MIPS/Toolchain/bin/ la cui configurazione è banale.
Lo lascio configurato secondo le mie impostazioni attuali e per un pinguino pic 32 otg.
Il file è commentato spiegando anche nel dettaglio i parametri passati al compilatore.
Per l'upload, semplicemente
Infine...
Dato che vogliamo programmare questo PIC, bisogna procurarsi la documentazione. Si scarica tranquillamente dal sito di microchip il datasheet del PIC32 -> http://ww1.microchip.com/downloads/en/DeviceDoc/61143H.pdf
E inoltre, è fondamentale aver gli schematici e ogni informazioni sulla board.
Sul sito dell'olimex troviamo ogni cosa: https://www.olimex.com/Products/Duino/PIC32/PIC32-PINGUINO-OTG/
Inoltre, grazie agli utenti della community di pinguino.cc è disponibile una comodissima tabella con le relazioni tra i registri del device usati, e i valori da impostare per poterli utilizzare -> http://wiki.pinguino.cc/images/a/a4/PIC32-Pinguino_OTG_Xref_Table.pdf
Questo è tutto.
Si ringrazia: http://pinguino.cc
La CPU che il PIC32 PINGUINO (OTG) ha in dotazione è quella presente nel PIC32MX440F256H, cioè MIPS32® M4K® Processor Core.
Questa CPU use l'architettura MIPS. Abbiamo quindi bisogno di un set di strumenti che ci permettano di sviluppare per questa architettura.
Possiamo articolare il tutto in 9 passi:
- Passi preliminari
- Download della mips Toolchain ufficiale
- Download di binutils
- Applicazione della patch per la corretta generazione di file ihex da parte di objcopy
- Compilazione di binutils
- Copia di objcopy patchato all'interno della toolchain ufficiale
- Download dell'ultima release dell'IDE PINGUINO che ci permette di avere già a disposizione i file proprietari della microchip e diversi file di esempio
- Configurazione del tutto
- Creazione di uno script per compilare rapidamente i sorgenti
Passi preliminari
Inanzitutto creiamo una directori MIPS dove più ci aggrada dove lavoreremo.
bash:Text version
cd ~
mkdir MIPS
cd MIPS
Download della mips Toolchain ufficiale
Creiamo una cartella dedicata alla toolchain, scarichiamola, ed estraiamola.
bash:Text version
mkdir toolchain
wget http://d2gosfejro2q5l.cloudfront.net/Mips_linux_toolchain_bin-1.1.tar.bz2
tar xvf Mips_linux_toolchain_bin-1.1.tar.bz2
Download di binutils
Prima di tutto creiamo una cartella dedicata al lavoro che faremo con binutils.
bash:Text version
cd ..
mkdir binutils_dev
cd binutils_dev
Per una totale compatibilità, scarichiamo dal sito ufficiale la stessa versione delle binutils che troviamo nella toolchain (2.12) e lo estraiamo nella directory.
bash:Text version
wget http://ftp.gnu.org/gnu/binutils/binutils-2.21.1.tar.bz2
tar xvf binutils-2.21.1.tar.bz2
Creiamo una direcotry in cui metteremo i file generati dal comando configure e spostiamoci all'interno
bash:Text version
mkdir build-binutils
cd build-binutils
Configuriamo le binutils per avere come TARGET=mips-sde-elf e impostiamo come sysroot la sysroot della toolchain che abbiamo scaricato
bash:Text version
../binutils-2.21.1/configure --target=mips-sde-elf --with-sysroot=~/MIPS/toolchain/
Applicazione della patch
Ora, dobbiamo sistemare un problema relativo a objcopy per quando riguarda la generazione di file hex, estratti dall'elf che andremo a creeare compilando il programma C.
Portiamoci alla linea 773 del file ../binutils-2.21.1/bfd/ihex.c e aggiungiamo dopo "where = l->where;" il seguente codice:
if(sizeof(bfd_vma) * 8 > 32 &&
(
(where & ~(bfd_vma)0x7fffffff) == 0 ||
(where & ~(bfd_vma)0x7fffffff) == ~(bfd_vma)0x7fffffff
)
)
where &= (bfd_vma)0xffffffffUL;
In questo modo eliminiamo l'estensione del segno che da problemi nella generazione di file ihex validi.
Salviamo e iniziamo la compilazione delle binutils.
Compilazione di binutils
Prima
bash:Text version
make
Ora, ne installiamo il contenuto in una directory fittizia, in maniera da poter copiare poi solo objcopy
bash:Text version
mkdir tmp
make install DESTDIR=`pwd`/tmp/
Copia di objcopy patchato all'interno della toolchain ufficiale
bash:Text version
cp tmp/usr/local/bin/mips-sde-elf-objcopy ../../toolchain/bin/mips-sde-elf-objcopy
Download dell'ultima release dell'IDE PINGUINO che ci permette di avere già a disposizione i file proprietari della microchip e diversi file di esempio
Ci spostiamo nella direcotry ~/MIPS, creiamo una cartella per l'ide e file annessi e scarichiamo da svn l'ultima versione
bash:Text version
cd ../../
mkdir Pinguino
cd Pinguino/
svn checkout http://pinguino32.googlecode.com/svn/branches/x.4 .
Configurazione del tutto
Ricapitolando.
La nostra direcotry ~MIPS ora ha al suo interno le seguenti sub-dir:
binutils-dev, Pinguino, toolchain
È totalmente sicuro eliminare la cartella binutils-dev, in quanto non più necessaria.
Ora, dobbiamo fare in modo che ogni volta che abbiamo bisogno del nostro compilatore, non dobbiamo digitare l'indirizzo completo.
Aggiorniamo il file .bashrc aggiungendo la riga
bash:Text version
export MIPS_TOOLCHAIN=~/MIPS/Toolchain/bin/
E modifichiamo la variabile $PATH in questo modo:
bash:Text version
export PATH=$MIPS_TOOLCHAIN:$PATH
Rendiamo effettive le modifiche:
bash:Text version
source ~/.bashrc
Inoltre, un altro passaggio che consiglio (ma non è indispensabile) è di copiare il contenuto della cartella ~/MIPS/Pinguino/p32/include/ in ~/MIPS/Toolchain/include/ in maniera da non dover aggiungere il parametro -I all'invocazione di gcc comunicandogli dove trovare gli header che verranno inclusi.
Non ci resta altro se non procurarci ubw32 per poter caricare l'ihex che otterremo dai processi nel punto seguente sulla board.
Per la compilazione è necessario procurarsi libhid (su archilinux è disponibile su AUR)
bash:Text version
wget -nH -np -r -L 'http://vak-opensource.googlecode.com/svn/!svn/bc/117/trunk/utilities/ubw32/'
cd svn/\!svn/bc/117/trunk/utilities/ubw32/
make
cp ubw32 ~/MIPS/Toolchain/bin/
Creazione di uno script per compilare rapidamente i sorgenti
Non mi dilungo ulteriormente, posto qui il mio script da inserire in ~/MIPS/Toolchain/bin/ la cui configurazione è banale.
Lo lascio configurato secondo le mie impostazioni attuali e per un pinguino pic 32 otg.
Il file è commentato spiegando anche nel dettaglio i parametri passati al compilatore.
bash:Text version
#!/bin/bash
#**************************************************************************
#** Copyright (c) 2012 Paolo Galeone
#**
#** The authors hereby grant permission to use, copy, modify, distribute,
#** and license this software and its documentation for any purpose, provided
#** that existing copyright notices are retained in all copies and that this
#** notice is included verbatim in any distributions. No written agreement,
#** license, or royalty fee is required for any of the authorized uses.
#** Modifications to this software may be copyrighted by their authors
#** and need not follow the licensing terms described here, provided that
#** the new terms are clearly indicated on the first page of each file where
#** they apply.
#**************************************************************************
#put your settings here
PROCESSOR=32MX440F256H
#linker dir
LKDIR=~/MIPS/Pinguino/p32/lkr/PIC32_PINGUINO_OTG
#include dir for non-free file
INDIR=~/MIPS/Toolchain/include/non-free
#object dir for non-free objects
OBJDIR=~/MIPS/Pinguino/p32/obj/non-free
########### do not edit below this line ##########
if [ ! "$#" -eq 1 ]
then
echo "Usage: $0 source.c"
exit -1
fi
GCC_INPUT=$1
FILENAME=`echo $1 | cut -d '.' -f 1`
GCC_OUTPUT="$FILENAME".elf
HEX_OUTPUT="$FILENAME".hex
HEX_TMP="$FILENAME".tmp
#little endian - #preserve sections and data defined in linker and in non-free header file
#define macro to identify processor
#link 2 linker script non free
#link non free object with processor specific functions
#link to crt0.S for program entry point (_reset) and other mips assemply routine
#input
#output
GCC_PARAMS="-EL -ffunction-sections -fdata-sections
-D __"$PROCESSOR"__
-I $INDIR
-T $LKDIR/procdefs.ld
-T $LKDIR/elf32pic32mx.x
$OBJDIR/processor.o
$OBJDIR/crt0.S
$GCC_INPUT
-o $GCC_OUTPUT";
BADRECORD='^:040000059D006000FA' # unsupported record in hex file / Jean-pierre Mandon 2012
########## EXECUTION #########
#on non return 0 status, exit failure
trap "exit -1" ERR
#copy specific processor object to processor.o
cp "$OBJDIR/$PROCESSOR".o "$OBJDIR"/processor.o
#compile
mips-sde-elf-gcc $GCC_PARAMS
#extract hexfile from elf
mips-sde-elf-objcopy -Oihex $GCC_OUTPUT $HEX_TMP
#remove unsupported record in hex file
grep --invert-match --binary $BADRECORD $HEX_TMP > $HEX_OUTPUT
#remove tmp file
rm $HEX_TMP
#remove trap on err
trap - ERR
#END EXECUTION
echo "Created $HEX_OUTPUT"
echo "Now you can upload this file to your board using ubw32"
Per l'upload, semplicemente
bash:Text version
sudo ubw32 -w $HEX_OUTPUT -r
Infine...
Dato che vogliamo programmare questo PIC, bisogna procurarsi la documentazione. Si scarica tranquillamente dal sito di microchip il datasheet del PIC32 -> http://ww1.microchip.com/downloads/en/DeviceDoc/61143H.pdf
E inoltre, è fondamentale aver gli schematici e ogni informazioni sulla board.
Sul sito dell'olimex troviamo ogni cosa: https://www.olimex.com/Products/Duino/PIC32/PIC32-PINGUINO-OTG/
Inoltre, grazie agli utenti della community di pinguino.cc è disponibile una comodissima tabella con le relazioni tra i registri del device usati, e i valori da impostare per poterli utilizzare -> http://wiki.pinguino.cc/images/a/a4/PIC32-Pinguino_OTG_Xref_Table.pdf
Questo è tutto.
Si ringrazia: http://pinguino.cc