In questa guida viene descritto come programmare chip tramite protocollo SPI sfruttando i pin GPIO del Raspberry con il programma OpenOCD.
A cosa serve?
Nel mio caso e' servito a flashare un bootloader su chip Arduino, ma OpenOCD supporta una miriade di chip e protocolli. Per saperne di piu' trovate la documentazione ufficiale QUI.
Necessario:
- Un raspberry pi (qualunque modello) con un'immagine di raspbian.
- Chip da flashare.
Accessori utili ma non essenziali:
- Una breadboard.
- Una scheda breakout per il Raspberry.
- Cavi dupont maschio-femmina e/o maschio-maschio a seconda del chip da flashare.
Compiliamo OpenOCD:
Il programma e' constantemente in sviluppo e per assicurarci di avere sempre l'ultima versione e' meglio compilarsela da soli utilizzando i comandi di seguito.
Accendiamo il Raspberry ed apriamo il terminale.
Iniziamo con questo comando:
In modo da assicurarci che ci siano tutti i pacchetti e le repository piu' aggiornate.
Seguiamo con il comando:
Verranno istallati i programmi necessari per la compilazione
Adesso scarichiamo l'ultima release di OpenOCD con il comando:
Navighiamo nella cartella scaricata ed avviamo il bootstrapper con questi due comandi:
A questo punto compiliamo il programma per i pin GPIO del Raspberry, funziona sui vari Raspberry anche se viene chiamato "bcm2835gpio", il comando da usare e' il seguente:
Alla fine del processo non viene menzionato il supporto per i pin GPIO del raspberry, e' tutto ok.
Per la compilazione vera e propria usate il comando:
Per finalizzare, procediamo all'installazione usando il comando:
E questo e' tutto per quanto riguarda l'installazione di OpenOCD sul Raspberry.
Per vedere la lista delle interfacce basta andare su
Connessione al chip:
Ora arriva la parte piu' divertente, dobbiamo connettere il Raspberry con il chip da programmare.
Da ora il poi mi riferiro' al chip da programmare come "destinatario" in modo da schematizzare meglio alcuni punti della guida.
Le connessioni da fare sono molto semplici:
- GND del destinatario al GND del Raspberry (GND = ground)
- SWDIO del destinatario al pin # 24 del Raspberry
- SWCLK del destinatario al pin # 25 del Raspberry
- RESET del destinatario al pin # 18 del Raspberry
Ecco un'immagine come riferimento per i pin del raspberry:
Configurazione per OpenOCD:
Ora non rimane che configurare il programma, in modo che riesca a comunicare correttamente con il chip destinatario.
Il modo piu' semplice e' creare una nuova cartella in home con questi comandi:
E mettere il file in questa cartella, nel mio caso specifico uso un bootloader per Arduino.
Nella stessa cartella creiamo un nuovo file chiamato
Copiamo dentro il seguente codice:
Cambiate
Salvate il file e lanciate il comando:
Dovrebbe apparirvi lo status della connessione come conferma di una buona connessione. Inoltre dovrebbe apparirvi anche la dicitura:
*Nota: se sotto "State" dovesse comparirvi la dicitura "unknown" controllate bene i cavi e/o controllate bene la scheda su cui il chip e' montato.
Ora che abbiamo verificato che la connessione e' andata a buon fine possiamo modificare il file di configurazione creato prima per scrivere sul chip destinatario.
Aprendolo di nuovo con
Cosi' facendo permettiamo ad OpenOCD di inizializzarsi con
Salvate il file e lanciate il comando:
Fine! Bootloader riprogrammato in 0.2 secondi.
A cosa serve?
Nel mio caso e' servito a flashare un bootloader su chip Arduino, ma OpenOCD supporta una miriade di chip e protocolli. Per saperne di piu' trovate la documentazione ufficiale QUI.
Necessario:
- Un raspberry pi (qualunque modello) con un'immagine di raspbian.
- Chip da flashare.
Accessori utili ma non essenziali:
- Una breadboard.
- Una scheda breakout per il Raspberry.
- Cavi dupont maschio-femmina e/o maschio-maschio a seconda del chip da flashare.
Compiliamo OpenOCD:
Il programma e' constantemente in sviluppo e per assicurarci di avere sempre l'ultima versione e' meglio compilarsela da soli utilizzando i comandi di seguito.
Accendiamo il Raspberry ed apriamo il terminale.
Iniziamo con questo comando:
sudo apt-get update
In modo da assicurarci che ci siano tutti i pacchetti e le repository piu' aggiornate.
Seguiamo con il comando:
sudo apt-get install git autoconf libtool make pkg-config libusb-1.0-0 libusb-1.0-0-dev
Verranno istallati i programmi necessari per la compilazione
Adesso scarichiamo l'ultima release di OpenOCD con il comando:
git clone http://openocd.zylin.com/openocd
Navighiamo nella cartella scaricata ed avviamo il bootstrapper con questi due comandi:
cd openocd-code
./bootstrap
A questo punto compiliamo il programma per i pin GPIO del Raspberry, funziona sui vari Raspberry anche se viene chiamato "bcm2835gpio", il comando da usare e' il seguente:
./configure --enable-sysfsgpio --enable-bcm2835gpio
Alla fine del processo non viene menzionato il supporto per i pin GPIO del raspberry, e' tutto ok.
Per la compilazione vera e propria usate il comando:
make
Per finalizzare, procediamo all'installazione usando il comando:
sudo make install
E questo e' tutto per quanto riguarda l'installazione di OpenOCD sul Raspberry.
Per vedere la lista delle interfacce basta andare su
/usr/local/share/openocd/scripts/interface
Connessione al chip:
Ora arriva la parte piu' divertente, dobbiamo connettere il Raspberry con il chip da programmare.
Da ora il poi mi riferiro' al chip da programmare come "destinatario" in modo da schematizzare meglio alcuni punti della guida.
Le connessioni da fare sono molto semplici:
- GND del destinatario al GND del Raspberry (GND = ground)
- SWDIO del destinatario al pin # 24 del Raspberry
- SWCLK del destinatario al pin # 25 del Raspberry
- RESET del destinatario al pin # 18 del Raspberry
Ecco un'immagine come riferimento per i pin del raspberry:
Configurazione per OpenOCD:
Ora non rimane che configurare il programma, in modo che riesca a comunicare correttamente con il chip destinatario.
Il modo piu' semplice e' creare una nuova cartella in home con questi comandi:
cd ~
mkdir bootloader
cd bootloader
E mettere il file in questa cartella, nel mio caso specifico uso un bootloader per Arduino.
Nella stessa cartella creiamo un nuovo file chiamato
openocd.cfg
usando il comando:nano openocd.cfg
Copiamo dentro il seguente codice:
Codice:
source [find interface/raspberrypi2-native.cfg]
transport select swd
set CHIPNAME at91samd21g18
source [find target/at91samdXX.cfg]
# did not yet manage to make a working setup using srst
#reset_config srst_only
reset_config srst_nogate
adapter_nsrst_delay 100
adapter_nsrst_assert_width 100
init
targets
reset halt
Cambiate
raspberrypi2-native.cfg
a seconda del modello di Raspberry che state usando. Per esempio se usate un Raspberry Pi 1 o Zero mettete raspberrypi1-native.cfg
oppure
raspberrypi-native.cfg
Salvate il file e lanciate il comando:
sudo openocd
Dovrebbe apparirvi lo status della connessione come conferma di una buona connessione. Inoltre dovrebbe apparirvi anche la dicitura:
target state:halted
come conferma che tutto sia andato bene come nell'immagine qui sotto:*Nota: se sotto "State" dovesse comparirvi la dicitura "unknown" controllate bene i cavi e/o controllate bene la scheda su cui il chip e' montato.
Ora che abbiamo verificato che la connessione e' andata a buon fine possiamo modificare il file di configurazione creato prima per scrivere sul chip destinatario.
Aprendolo di nuovo con
nano
aggiungiamo alla fine:
Codice:
init
targets
reset halt
at91samd bootloader 0
program samd21_sam_ba verify
at91samd bootloader 8192
reset
shutdown
Cosi' facendo permettiamo ad OpenOCD di inizializzarsi con
init
, poi cerchera' i targhet (in questo caso il mio chip arduino). Viene tolta la protezione del bootloader e viene scritto il file nel chip. Se non dovete flashare il bootloader sul chip potete saltare quel passaggio.Salvate il file e lanciate il comando:
sudo openocd
Fine! Bootloader riprogrammato in 0.2 secondi.