GP2X


Progetti casalinghi attorno alla GP2X

Non mi assumo nessuna responsabilita' per danneggiamenti, perdita di dati o danni personali come risultato diretto o indiretto dell'uso delle informazioni contenute in queste pagine. Questo materiale e' fornito cosi' com'e' senza nessuna garanzia implicita o esplicita.

console image


Home
Hardware
Software

Abstract
Cambiare menu
Console pinout
Cavo seriale
Primo esperimento
L'ambiente di u-boot
Nuova porta USB
Adattatore seriale
Links
FAQ
Contatti

Abstract

In questa pagina ho raccolto alcuni progetti ed informazioni che riguardano la GP2X: questa potentissima console portatile e' una vera Linux box, puoi usarla semplicemente per giocare o per guardare i film, oppure puoi farci qualcosa di piu' interessante: come navigare in Internet, sniffare traffico wi-fi o guidare il tuo modello robot. Come al solito il limite e' solo la tua fantasia.
In questa pagina cerchero' di mostrarti la vera essenza di questa console, ovviamente a modo mio.

Cambiare menu

La GP2X viene fornita con un menu preinstallato, con questo puoi avere accesso a giochi e programmi, ascoltare misica, vedere video e foto, etc. E' completamente funzionante, ma fa veramente schifo. Se preferisci un vero menu grafico invece di un clone del menu della PSP, allora puoi installare GMenu2X, se lo provi non tornerai piu' indietro!

Console pinout

Ora una breve descrizione dei vari connettori della console e delle varie piedinature. Ci sono fondamentalmente due connettori sulla console: sul lato destro la porta USB device e in basso il connettore EXT: il primo e' un connettore mini USB standard e puo' essere utilizzato per collegare la GP2X ad un computer, dal computer puoi accedere ai files contenuti nella memoria SD come se fosse un hardisk USB portatile. Non sono ammessi altri scambi di dati: semplicemente dal computer puoi accedere al contenuto della memoria SD.
Il secondo e' un connettore single line a 24 pin che porta diversi segnali: puo' essere utilizzato per fare quasi tutto e sara' l'argomento principale di questa pagina.
La foto mostra la piedinatura del connettore USB device della GP2X e la piedinatura di un cavo USB standard.

USB pinout
Porta USB device della GP2X e piedinatura di un cavo USB

L'immagine qui sotto mostra la piedinatura del connettore EXT di una GP2X-F200, come si puo' vedere contiene l'uscita audio e video, una porta Jtag, una porta seriale e una porta USN host, quest'ultima puo' essere usata per collegare diversi dispositivi alla console: come tastiere, mouse, harddisks, adattatori wi-fi, interfacce bluetooth e molto altro.
Posso vedere una luce brillare nei tuoi occhi!

EXT pinout
Piedinatura connettore EXT

Cavo seriale

Ci sono due modi per utilizzare il connettore EXT: comprare il craddle della GP2X o costruirsi un cavo seriale. Ci sarebbe anche un'altra scelta ma dal mio punto di vista e' molto simile a farsi il proprio cavetto seriale: e' la BoB. Bob e' essenzialmente una scheda fatta in casa, molto simile al craddle originale, da collegare alla porta EXT della GP2X; io ho ricavato il mio cavetto seriale proprio dagli schemi della Bob.
Essenzialmente abbiamo bisogno solo di due cose dal connettore EXT: la porta seriale e la porta USB host, questa e' la ragione per cui costruire il cavetto e non la Bob completa, ma sei libero di modificare il mio progetto come preferisci. Abbiamo bisogno della porta seriale perche' la GP2X gestisce la console attraverso la porta seriale e questo puo' essere molto utile durante lo sviluppo di nuove applicazioni; abbiamo bisogno della porta USB host per tutto il resto: alla porta USB host possiamo collegare qualsiasi dispositivo USB.
Cominciamo!
Il disegno qui sotto mostra lo schema elettrico del cavetto seriale.

cable schematic
Schema del cavo seriale

Attenzione: per utilizzare la porta USB host occorre collegarla ad un HUB alimentato oppure utilizzare un power injector lungo il cavo, perche' la GP2X non fornisce i +5V necessari per alimentare i dispositivi USB.
Per costruire il mio cavo ho modificato il cavo USB di un telefonino Samsung: ho aggiunto un pezzo di cavo USB e ho aggiunto un traslatore di livello per adattare i livelli logici ai livelli di tensione della RS232.
Nella foto sottostante e' visibile il mio cavetto.

serial cable
Cavo seriale

Il risultato e' lungo circa 30cm, e' un pochino lungo ma e' solo un prototipo, se preferisci puoi fare una scatolina contenente tutti i connettori, sarebbe meglio avere un pezzo di cavo tra il connettore EXT e gli altri perche' la porta EXT e' un pochino delicata: come ti accorgerai tu stesso il connettore EXT e' tenuto in posizione solo da due gancetti laterali, il risultato non ha un aspetto molto solido quindi un pezzo di cavo aiuta ad evitare di rompere connettore e console.
Nelle foto qui sotto i dettagli dei connettori.

ext connector
Connettore EXT (aperto)

serial connector
Connettore seriale e traslatore di livello

serial connector
Connettore seriale e traslatore di livello

Per realizzare il traslatore di livello ho utilizzato alcuni componenti SMD per ridurre lo spazio necessario, i transistor BC337 e BC327 sono invece nel classico contenitore plastico. L'immagine qui sotto mostra il layout del circuito che ho realizzato.

level translator
Layout del traslatore di livello

Primo esperimento

Ed ora partiamo col primo esperimento: dobbiamo provare il nostro nuovo cavo. Segui questi passi:
1) Carica le tue batterie.
2) Collega il cavo alla GP2X.
3) Collega la porta RS232 alla porta /dev/ttyS0 della tua Linux box. La porta USB per ora non ci serve.
I tuoi collegamenti dovrebbero risultare circa cosi':

hardware setup
Collegamenti GP2X

4) Lancia miniterm, o il tuo emulatore di terminale preferito, le impostazioni della linea sono: 115200bps 8n1 controllo di flusso Xon/Xoff.
5) Ora accendi la GP2X, sullo schermo del terminale dovresti vedere tutte le informazioni di boot fornite dalla GP2X, questo e' cio' che vedo io quando accendo la mia:




U-Boot 1.0.0 (Sep 10 2007 - 21:07:23)

U-Boot code: 03E00000 -> 03E49FA4  BSS: -> 03E82B70
IRQ Stack: 03ea3b6c
FIQ Stack: 03ea4b6c
DRAM Configuration:
Bank #0: 00100000 63 MB
Flash:  0 kB
NAND:Probing at 0x9c000000
Flash chip found:
	 Manufacturer ID: 0xEC, Chip ID: 0x76 (Samsung K9F1208 64Mb)
1 flash chips found. Total nand_chip size: 64 MB
Get Environment from NAND offset 0x70000 ... 
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial

NAND read: device 0 offset 0x1a0000, size 0x40000 ...  262144 bytes read: OK

NAND read: device 0 offset 0x80000, size 0xb0000 ...  720896 bytes read: OK
### main_loop: bootcmd="bootm"
Hit any key to stop autoboot:  0 
## Booting image at 01000000 ...
   Image Name:   GP2X Linux Kernel
   Created:      2007-10-08   9:22:48 UTC
   Image Type:   ARM Linux Kernel Image (gzip compressed)
   Data Size:    673304 Bytes = 657.5 kB
   Load Address: 00008000
   Entry Point:  00008000
   Verifying Checksum ... OK
   Uncompressing Kernel Image ... OK

Starting kernel ...

MMC/SD Card Detected
Partition check:
 mmcsda: p1
Register SD: 952MsB
mount...1 
mount...2: 
 INIT:  version 2.84 booting 
<7>**>>ecc error unfixed on chunk 3268:0
 Started device management daemon v1.3.25 for /dev
<7>**>>ecc error unfixed on chunk 3844:0
MSDOS FS: IO charset utf8
----
GMenu2X starting: If you read this message in the logs,
check http://gmenu2x.sourceforge.net/page/Troubleshooting for a solution
----

      
      
      

6) Se stai usando il GMenu2X prendi la tua GP2X in mano ed esegui Exit, dovresti vedere il menu' originale.
7) Ora bisogna killare il menu', per fare questo devi inviare un Ctrl-C alla GP2X, se stai usando un altro emulatore di terminale sai gia' cosa fare quindi vai al passo 11, se stai usando miniterm vai al passo 8.
8) Premi Ctrl-B, questo terminera' miniterm.
9) Digita: $ echo -n -e "\003" >ctrlc.bin
10) Riavvia miniterm: $ miniterm -s9 -f ctrlc.bin
11) Il display della GP2X dovrebbe diventare nero e tu dovresti vedere il prompt dei comandi sul terminale. Ora sei alla console della tua GP2X, e' una vera Linux box quindi puoi usare i comandi soliti.
Buon divertimento!

L'ambiente di u-boot

Nella mia GP2X il baudrate della console seriale e' impostato a 115200bps, troppo veloce per le mie applicazioni, quindi ho bisogno di modificare le impostazioni della seriale. La porta seriale e' utilizzata dadue programmi diversi: inizialmente viene utilizzata da u-boot come console seriale, successivamente viene usata dal kernel e diventa la consolse di linux; questo significa che dobbiamo cambiare entrambe le impostazioni sia in u-boot che nel kernel.
Le impostazioni della console seriale usate dal kernel sono passate da u-boot durante l'avvio, quindi dobbiamo modificare le impostazioni nell'ambiente di u-boot per modificare le impostazioni del kernel; le impostazioni della seriale usate da u-boot sono specificate nelle sue variabili d'ambiente, quindi ancora una volta dobbiamo modificate le impostazioni d'ambiente di u-boot per modificare le impostazioni della seriale.
Semplice!?! Non cosi' semplice!
Se osservi la sequenza di avvio noterai due cose: l'ambiente di u-boot non e' valido quindi parte con le impostazioni di default, u-boot avvia immediatamente il kernel, questo significa che non c'e' alcun modo di modificare l'ambiente di u-boot perche' non c'e' modo di interromperlo durante la sequenza di avvio, inoltre l'ambiente di u-boot non e' visibile da linux.
Questo e' il problema che dobbiamo risolvere!



U-Boot 1.0.0 (Sep 10 2007 - 21:07:23)

U-Boot code: 03E00000 -> 03E49FA4  BSS: -> 03E82B70
IRQ Stack: 03ea3b6c
FIQ Stack: 03ea4b6c
DRAM Configuration:
Bank #0: 00100000 63 MB
Flash:  0 kB
NAND:Probing at 0x9c000000
Flash chip found:
	 Manufacturer ID: 0xEC, Chip ID: 0x76 (Samsung K9F1208 64Mb)
1 flash chips found. Total nand_chip size: 64 MB
Get Environment from NAND offset 0x70000 ... 
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial

NAND read: device 0 offset 0x1a0000, size 0x40000 ...  262144 bytes read: OK

NAND read: device 0 offset 0x80000, size 0xb0000 ...  720896 bytes read: OK
### main_loop: bootcmd="bootm"
Hit any key to stop autoboot:  0 
## Booting image at 01000000 ...
   Image Name:   GP2X Linux Kernel
   Created:      2007-10-08   9:22:48 UTC
   Image Type:   ARM Linux Kernel Image (gzip compressed)
   Data Size:    673304 Bytes = 657.5 kB
   Load Address: 00008000
   Entry Point:  00008000
   Verifying Checksum ... OK
   Uncompressing Kernel Image ... OK

Starting kernel ...

      
      

Quindi abbiamo bisogno di fare due cose: impostare la variabile bootdelay ad un valore maggiore di 0 ed impostare il baudrate della seriale ad un valore inferiore a 115200bps, in entrambi i casi dobbiamo modificare le impostazioni nell'ambiente di u-boot.
Vediamo se esite un modo...
Se guardi nel filesystem della tua GP2X troverai questi files:

	/dev/mtdblock/0
	/dev/mtdblock/1
	/dev/mtdblock/2
	/dev/mtdblock/3
	/dev/mtdblock/4
      

Ciascuno di questi device file mappa una zona particolare della memoria NAND della GP2X, nella GP2X-F200 rappresentano:

	/dev/mtdblock/0		bootloader
	/dev/mtdblock/1		immagine del kernel parte 1
	/dev/mtdblock/2		immagine del kernel parte 2
	/dev/mtdblock/3		immagine del filesystem
	/dev/mtdblock/4		l'intera NAND
      

Leggendo dal device /dev/mtdblock/0 troverai l'immagine di u-boot, scrivendo sul device /dev/mtdblock/1 sovrascriverai l'immagine del kernel, e magari potresti anche distruggere la tua GP2X!
Bene! Questa sembra la strada giusta! L'idea e' di creare un data block contenente un ambiente valido per u-boot e piazzarlo dove u-boot lo andra' a acercare, in questo modo u-boot carichera' le nostre impostazioni!
Il data block contenente l'ambiente utilizzato da u-boot e' una regione di memoria contenente variabili e definizioni, assomiglia molto ad un file di testo eccetto per un piccolo detaglio: e' convalidato da un checksum. Noi useremo makenv per creare un data block valido, makenv usa le stesse funzioni utilizzate da u-boot per verificare e salvare i propri dati d'ambiente, l'unica cosa che ci occorre sapere e' la domensione esatta che u-boot si aspetta per le proprie impostazioni d'ambiente.
Da una piccola ricerca iniziale sembra che il data block conentente le impostazioni d'ambiente debba essere di 16Kb e che debba iniziare dall'indirizzo 0x70000 della NAND.
Partiamo!
Queste sono le impostazioni d'ambiente che vogliamo per u-boot:


bootargs=root=ramfs devfs=mount console=ttyS0,19200
baudrate=19200
bootdelay=5
ethaddr=00:11:22:33:44:55
ipaddr=192.168.1.225
serverip=192.168.1.230
netmask=255.255.255.0
bootfile="bios.bin"
stdin=serial
stdout=serial
stderr=serial
bootcmd=bootm

      

1) Da un terminale della tua linux box crea un file di testo contenente queste definizioni e salvalo come newenv.txt.
2) Convertilo eliminando i newline:

# tr "\n" "\0" newenv.bin

3) Crea un data block contenente le definizioni d'ambiente:

# makenv -b 0x4000 <newenv.bin >newenv.img

4) Ora copia il file newenv.img nella root directory della tua SD card, inserisci la SD card nella tua GP2X, collega la GP2X alla linux box come illustrato nel primo esperimento e accendi la GP2X. Vedrai la seuqnza di avvio sulla console, ora killa il menu della GP2X per ottenere il controllo della console (segui le indicazioni del primo esperimento se non sai come).
5) Dalla console della GP2X digita:

# dd bs=16384 if=newenv.img of=/dev/mtdblock/0 seek=28 conv=notrunc

Dovresti ricevere un messaggio d'errore tipo: Read-only filesystem, questo succede anche se il file appare come scrivibile, sembra non ci sia nessun modo per scrivere su questo device. Non ti preoccupare, ripeti la stessa cosa ma col device 4:

# dd bs=16384 if=newenv.img of=/dev/mtdblock/4 seek=28 conv=notrunc

Dovresti ricevere una serie di messaggi d'errore di scrittura sulla NAND ma sembra funzionare ugualmente, c'e' un solo modo per saperlo
6) Riavvia la GP2X: ora dovresti vedere un conteggio alla rovescia durante il boot prima che il kernel venga caricato, se premi un tasto durante il conteggio u-boot interrompe la sequenza di boot e ritorna al prompt dei comandi.
Yeah! Ci siamo riusciti!

In realta' questo esperimento non e' proprio un siccesso completo: se hai notato la velocita' della seriale non e' cambiata, lavora sempre a 115200bps, non so perche' ma adesso possiamo usare la console di u-boot per modificare le impostazioni d'ambiente quando vogliamo!

Nuova porta USB

Come abbiamo visto nel paragrafo cavo seriale la GP2X e' dotata di una porta USB host che puo' essere utilizzata per collegare tastiere, joypads, memory sticks, adattatori wi-fi, hard disks e cosi' via. L'unico modo di utilizzare la porta USB host e' utilizzare il cavo mostrato sopra, ma in questo modo manca il +5V per alimentare i dispositivi USB, inoltre il cavo EXT e' veramente scomodo e troppo fragile.
Quindi perche' non aggiungere una porta USB host alla GP2X?
L'idea e' molto semplice: un piccolo circuito stampato che monta tutti i componenti necessari, una porta USB ed una porta seriale per la console di Linux. Lo schema elettrico qui sotto mostra cio' di cui avremmo bisogno.

schematic
Adattatore per porta USB host e porta seriale

Il realta' all'interno della GP2X c'e' molto spazio inutilizzato, realizzando un circuito sottile possiamo sfruttare questo spazio per aggiungere altre due porte alla console. Per contenere gli ingombri e mantenere un profilo basso ho utilizzato un connettore SIL a 4 pins come porta seriale, invece del tradizionale connettore sub-D a 9 pins, decisamente troppo grande.
L'immagine sottostante mostra il layout del circuito stampato.

PCB layout
Layout del circuito adattatore

All'interno della GP2X-F200 possiamo trovare alcuni utili test point che forniscono le tensioni +5V, +3.3V e GND; non ho idea della corrente che la linea a +5V puo' fornire, se il carico richiede piu' 300mA suggerisco di utilizzare un hub alimentato.
Le immagini seguenti mostrano alcuni passaggi dell'installazione del crcuito all'interno della console.

Test points description
Mappa dei test points

Il coperchio posteriore va tagliato per creare un'apertura per i nuovi connettori, il circuito stampato va fissato alla cover con del biadesivo.

USB board
Circuito fissato al coperchio posteriore

Una volta che il circuito stampato e' fissato e tutti i buchi sono a posto puoi procedere collegando i fili alla scheda della GP2X, purtroppo non tutti i collegamenti si possono fare sui test points: i segnali della seriale e della porta USB vanno prelevati direttamente sul connettore EXT, fai attenzione perche' i pins del connettore sono molto vicini ed e' facilissimo saldarne due insieme.
Salda i fili prima sul connettore EXT prima e poi sul circuito, in questo modo e' molto piu' facile ed il lavoro viene molto piu' pulito.

EXT port wiring
Collegamenti sul connettore EXT

USB board installed
Installazione completata

Per collegare la porta seriale puoi usare uno dei cavetti utilizzati di solito dentro i PC per collegare la motherboard alle lucette sul pannello frontale.

ports view
Vista dei nuovi connettori

Ora fai attenzione: il convertitore RS232 e' fatto con due transistor, piu' piccolo, economico e bello (almeno per me) del classico MAX232 ma con un piccolo problema: se il lato RS232 non e' collegato il segnale TX puo' fare eco dentro all'RX, questo puo' essere un problema se hai modificato l'ambiente di u-boot come visto prima. In questo caso per permettere a u-boot di completare il boot devi cortocircuitare a massa il segnale RX (lato RS232) con un jumper, questo interrompe il loop ed evita che u-boot si arresti durante la sequenza di boot.

Adattatore seriale

USB-RS232 adapter
Adattatore USB-RS232

Puoi colegare un adattatore USB RS232 direttamente alla GP2X usando questo driver. Ora contiene anche il supporto per i chip FTDI.

Links

Questa e' una lista non esaustiva di argomenti collegati al mondo della GP2X:

FAQ

Contatti

Se hai delle domande, suggerimenti, problemi, etc. puoi contattami a questo indirizzo: bit.trapper@gmail.com

Ultimo aggiornamento: 29 Dic 2012


Questo sito e' stato realizzato interamente con vim.
Grazie a tutta la comunita' open source, alla free software foundation e chiunque scriva software libero.