Abstract
Applicando una tecnica di reverse engineering ho scoperto come sono
mappati i segnali sulla scheda ARM. Questo vuol dire avere il pinout
completo della scheda. In questa pagina vi illustrero' il
procedimento che ho usato per trovare come sono collegati i segnali
sulla scheda e per finire vi mostrero' il pinout completo.
A vostro proprio rischio potete ripetere l'intero procedimento sulla
vostra scheda, oppure semplicemente potete prendere i miei risultati
come buoni e basare il vostro lavoro su di essi. Volendo potete
anche utilizzare lo stesso metodo per altre schede o altri sistemi e
tentare di scoprire come sono stati disegnati.
Il principio
Il microprocessore MC9328MXL e' dotato di un piccolo firmware
interno chiamato bootloader. Questo e' un piccolo programma
che puo' essere attivato da una precisa configurazione delle linee
BOOT (vedere Bootstrap Mode Operation nel
Manuale di Riferimento
del MC9328MXL). Nel nostro caso l'attivazione del bootloader
si ottiene chiudendo il Programming jumper al centro della
scheda.
Il bootloader e' un piccolo interprete dei comandi in grado
di fare solo due o tre cose: riceve comandi dalla porta seriale, i
comandi sono costituiti da stringhe speciali chiamate
B-records, ciascun comando puo' leggere dei dati dalla
memoria, scrivere dei dati in memoria o avviare l'esecuzione di un
programma da un'indirizzo ben preciso.
Questo loader viene utilizzato per caricare nella scheda il codice
richiesto dall'applicazione e in alcuni casi puo' essere utilizzato
come un debugger molto primitivo.
Nel nostro caso noi utilizzeremo questo bootloader come un
agente in grado di agire dall'interno della scheda e di fare cio'
che noi gli chiederemo di fare. In questo scenario noi comunichiamo
attraverso la seriale con il loader e possiamo manipolare i registri
del microprocessore dalla Linux box. Ho fatto tutto questo perche'
e' molto piu' semplice per me scrivere e modificare un programma che
gira sulla mia Linux box invece di scrivere un programma che giri
sull'ARM che c'e' sulla scheda.
Possiamo vedere il bootloader come una piovra che possiamo
guidare per manipolare i registri di controllo all'interno del
microprocessore. Ora noi gli chiederemo di impostare uno specifico
registro ad un ben preciso valore ed egli lo fara', in questo modo
possiamo manipolare i registri di controllo direttamente dalla Linux
box.
Questa cosa e' estremamente utile perche' modificando i registri di
controllo possiamo pilotare le linee di I/O e scoprire come sono
collegate nel PCB. Cerchero' di spiegarmi meglio: sulla scheda c'e'
una linea di I/O, osservando dove e' collegata possiamo supporre
l'uso che questa linea puo' avere, ma non saremmo in grado di
trovare l'esatta funzione della linea: per esempio sappiamo dov'e'
la porta seriale, il connettore e' ben visibile sulla scheda, ma
questo connettore ha 6 fili, quale di questi e' la linea TX? Quale la
linea DTR?
Agendo dall'interno possiamo muovere il pin TX su e giu', quindi con
una sonda possiamo individuarlo sul connettore, in questo modo siamo
assolutamente sicuri di quale sia il piedino TX.
Possiamo collegare una serie di sonde ciascuna ad una linea di I/O,
quindi pilotare su e giu' ciascuna linea mappata sul GPIO e vedere
dove si trova quella linea sulla scheda.
Mappatura GPIO
Ci sono 97 linee di I/O disponibili sul MC9328MXL, tutte
queste linee sono pilotate dal modulo GPIO. Il GPIO e' un
dispositivo (interno al microprocessore) in grado di rimappare
ciascuna linea di I/O da un elenco di funzioni che possono essere
impiegate per quella linea.
Questa tabella riassume tutte le funzioni che possono essere mappate
su ciascuna linea di I/O, i bit segnati come Unused non sono
disponibili nel GPIO.
Port A |
Function GPR_A=0 |
Function GPR_A=1 |
Other |
0 |
A24 |
|
SPI2_SCLK |
1 |
TIN |
|
SPI2_RXD |
2 |
PWMO |
|
|
3 |
CSI_MCLK |
|
|
4 |
CSI_D0 |
|
|
5 |
CSI_D1 |
|
|
6 |
CSI_D2 |
|
|
7 |
CSI_D3 |
|
|
8 |
CSI_D4 |
|
|
9 |
CSI_D5 |
|
|
10 |
CSI_D6 |
|
|
11 |
CSI_D7 |
|
|
12 |
CSI_VSYNC |
|
|
13 |
CSI_HSYNC |
|
|
14 |
CSI_PIXCLK |
|
|
15 |
I2C_SDA |
|
|
16 |
I2C_SCL |
|
|
17 |
PA17 |
|
SPI2_SS |
18 |
BCLK |
|
|
19 |
LBA |
|
|
20 |
ECB |
|
|
21 |
A0 |
|
|
22 |
CS4 |
|
|
23 |
CS5 |
|
|
24 |
A16 |
|
|
25 |
A17 |
|
|
26 |
A18 |
|
|
27 |
A19 |
|
|
28 |
A20 |
|
|
29 |
A21 |
|
|
30 |
A22 |
|
|
31 |
A23 |
|
|
|
Port B |
Function GPR_B=0 |
Function GPR_B=1 |
Other |
0 |
|
|
|
1 |
|
|
|
2 |
|
|
|
3 |
|
|
|
4 |
|
|
|
5 |
|
|
|
6 |
|
|
|
7 |
|
|
|
8 |
SD_DAT_0 |
MS_PI0 |
|
9 |
SD_DAT_1 |
MS_PI1 |
|
10 |
SD_DAT_2 |
MS_SCLKI |
|
11 |
SD_DAT_3 |
MS_SDI0 |
|
12 |
SD_CLK |
MS_SCLKO |
|
13 |
SD_CMD |
MS_BS |
|
14 |
PB14 |
|
|
15 |
PB15 |
|
|
16 |
PB16 |
|
|
17 |
PB17 |
|
|
18 |
PB18 |
|
|
19 |
PB19 |
|
|
20 |
USBD_AFE |
|
|
21 |
USBD_OE |
|
|
22 |
USBD_RCV |
|
|
23 |
USBD_SUSPND |
|
|
24 |
USBD_VP |
|
|
25 |
USBD_VM |
|
|
26 |
USBD_VPO |
|
|
27 |
USBD_VMO |
|
|
28 |
UART2_CTS |
|
|
29 |
UART2_RTS |
|
|
30 |
UART2_TXD |
|
|
31 |
UART2_RXD |
|
|
|
Colors legend |
Unused |
SPI1 |
SPI2 |
UART1 |
UART2 |
UART3 |
|
I2C |
CMOS |
SIM |
MSHC |
MMCSD |
|
SSI |
SSI2 |
USB |
LCD |
other I/O |
|
Port C |
Function GPR_C=0 |
Function GPR_C=1 |
Other |
0 |
|
|
|
1 |
|
|
|
2 |
|
|
|
3 |
SSI_RXFS |
|
|
4 |
SSI_RXCLK |
|
|
5 |
SSI_RXDAT |
|
|
6 |
SSI_TXDAT |
|
|
7 |
SSI_TXFS |
|
|
8 |
SSI_TXCLK |
|
|
9 |
UART1_CTS |
|
|
10 |
UART1_RTS |
|
|
11 |
UART1_TXD |
|
|
12 |
UART1_RXD |
|
|
13 |
SPI1_SPI_RDY |
|
|
14 |
SPI1_SCLK |
|
|
15 |
SPI1_SS |
|
|
16 |
SPI1_MISO |
|
|
17 |
SPI1_MOSI |
|
|
18 |
|
|
|
19 |
|
|
|
20 |
|
|
|
21 |
|
|
|
22 |
|
|
|
23 |
|
|
|
24 |
|
|
|
25 |
|
|
|
26 |
|
|
|
27 |
|
|
|
28 |
|
|
|
29 |
|
|
|
30 |
|
|
|
31 |
|
|
|
|
Port D |
Function GPR_D=0 |
Function GPR_D=1 |
Other |
0 |
|
|
|
1 |
|
|
|
2 |
|
|
|
3 |
|
|
|
4 |
|
|
|
5 |
|
|
|
6 |
LSCLK |
|
|
7 |
REV |
UART2_DTR |
SPI2_SCLK |
8 |
CLS |
UART2_DCD |
SPI2_SS |
9 |
PS |
UART2_RI |
SPI2_RXD |
10 |
SPL_SPR |
UART2_DSR |
SPI2_TXD |
11 |
CONTRAST |
|
|
12 |
ACD/OE |
|
|
13 |
LP/HSYNC |
|
|
14 |
FLM/VSYNC |
|
|
15 |
LD0 |
|
|
16 |
LD1 |
|
|
17 |
LD2 |
|
|
18 |
LD3 |
|
|
19 |
LD4 |
|
|
20 |
LD5 |
|
|
21 |
LD6 |
|
|
22 |
LD7 |
|
|
23 |
LD8 |
|
|
24 |
LD9 |
|
|
25 |
LD10 |
|
|
26 |
LD11 |
|
|
27 |
LD12 |
|
|
28 |
LD13 |
|
|
29 |
LD14 |
|
|
30 |
LD15 |
|
|
31 |
TMR2OUT |
|
SPI2_TXD |
|
Questa tabella potrebbe essere incompleta in alcune parti, l'ho
ricavata dal capitolo Signals and connections del MC9328MXL
Tecnical Data.
Board pinout
Questa e' la piedinatura completa della scheda:
Reverse in azione
Se vuoi ripetere l'intero processo per tuo conto leggi questo
capitolo, in caso contrario puoi saltarlo ed andare a lavorare con
la tua scheda ARM.
Prima di tutto hai bisogno di una sonda, meglio sarebbe avere piu'
sonde da usare contemporaneamente. Una sonda molto semplice (come
quella usata da me) puo' essere costruita come mostrato nella figura
sottostante, altrimenti puoi usare un voltmetro (meglio se
analogico) o un oscilloscopio.
Questo tipo di sonda funziona anche se il livello d'ingresso e'
ricavato da un'alimentazione a 3.3V, quindi funzionera' anche con la
scheda ARM.
1) Collega questo convertitore
RS232 alla prima porta seriale ed usarlo per connettersi alla Linux
box.
2) Collega tutte le tue sonde a tutti i piedini di I/O visibili
sulla scheda, fai attenzione ai connettori CMOS perche' sono molto
delicati.
3) Scarica mxlrever ed
installalo sulla tua Linux box.
Ora sei pronto per partire:
4) Digita:
$ mxlrever -icspnuw
per lanciare tutti i test per tutti i piedini.
Se l'esecuzione e' troppo veloce puoi modificare alcuni
#define in test.c o semplicemente rilanciare il test.
Fai attenzione: se usi mxlrever piu' di una volta devi
aggiungere il flag -S sulla riga di comando.
Non tutte le 97 linee di I/O vengono testate al momento, ma
mxlrever e' comunque sufficiente per trovare cio' che stai
cercando.
Possibili espansioni
Come puoi vedere sopra ci sono alcuni connettori inutilizzati che
puoi usare per collegare una memoria SD o una Memory
stick alla scheda ARM. Ci sono altre cose interesanti che
possiamo fare con questa scheda, per una documentazione completa
sull'argomento ti rimando alla documentazione ufficiale del
microprocessore, sotto puoi trovare alcuni link e materiali molto
interessanti.
Download
Puoi scaricare tutti i files relativi al progetto ARM diretamente
da qui.
Links
Alcuni link utili riguardo questo progetto:
binutils
|
binutils ftp repository.
|
GCC
|
GCC homepage.
|
newlib
|
newlib homepage.
|
u-boot
|
u-boot repository presso sourceforge.
|
ARM Linux
|
porting del kernel di Linux per varie architetture ARM.
|
uClinux
|
La homepage del progetto uClinux: linux per mcroprocessori che
non hanno la MMU.
|
brain & vision
|
descrizione del modulo brain & vision e links ai data sheets.
|
FAQ
Q: Sai a cosa serve il jumper J20 vicino al condensatore?
A: Certo, il pin vicino al condensatore e' collegato a massa
(GND), l'altro pin e' collegato alla linea
SSI_RXCLK (pin 4 PORT C). Questo segnale puo' essere
utilizzato sia come ingresso che come uscita per fare dei
controlli sull'esecuzione del programma.
Contact me
Se hai delle domande, suggerimenti, problemi, etc. puoi contattami
a questo indirizzo:
bit.trapper@gmail.com
Ultimo aggiornamento: 29 Dic 2012
|