Guida Programmare microcontroller con Raspberry Pi e OpenOCD

CokePhi

Bannato
27 Novembre 2017
270
14
90
107
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:
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

37163



Navighiamo nella cartella scaricata ed avviamo il bootstrapper con questi due comandi:
cd openocd-code
./bootstrap

37164



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

37165



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

37166



Per finalizzare, procediamo all'installazione usando il comando:
sudo make install

37167



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

37168



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:

37170



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:

37173


*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

37174



Fine! Bootloader riprogrammato in 0.2 secondi.