nessunoPIC32 PINGUINO
 |  0          it  #1
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
  • 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.
cd ~
mkdir MIPS
cd MIPS


Download della mips Toolchain ufficiale
Creiamo una cartella dedicata alla toolchain, scarichiamola, ed estraiamola.
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.
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.
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
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
../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
make

Ora, ne installiamo il contenuto in una directory fittizia, in maniera da poter copiare poi solo objcopy
mkdir tmp
make install DESTDIR=`pwd`/tmp/


Copia di objcopy patchato all'interno della toolchain ufficiale
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
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
export MIPS_TOOLCHAIN=~/MIPS/Toolchain/bin/

E modifichiamo la variabile $PATH in questo modo:
 export PATH=$MIPS_TOOLCHAIN:$PATH

Rendiamo effettive le modifiche:
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)

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.

#!/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
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


This website uses cookies, even third part cookies: clicking on OK, continuing the navigation or interacting with the page you consented to the use of cookies. Information OK