Struttura

Tutto il software contenuto in questa pagina e' libero se non diversamente specificato; potete ridistribuirlo e/o modificarlo sotto i termini della GNU General Public License versione 2, come pubblicato dalla Free Software Foundation.

Questi programmi sono distribuiti con l'intento che possano essere utili, ma SENZA ALCUNA GARANZIA; senza nemmeno la garanzia implicita che servano allo scopo per cui sono stati creati. Vedere la GNU Genral Public License per maggiori dettagli.


Home
Hardware
Lab

Descrizione generale

Questo progetto verrebbe tentare di ridare un minimo di dignita' ai computer moderni: purtroppo le porte parallele sono scomparse quasi completamente e per quelli come me, che amano smanettare con i segnali digitali, sono arrivati i tempi duri. E' sempre piu' difficile riuscire a pilotare dal personal computer il dispositivo del giorno: memorie seriali, accelerometri, display, trasduttori di temperatura, etc.

Lo scopo del gioco sarebbe riuscire ad avere dei pin liberi da poter controllare a piacere e collegarvi di volta in volta il device di turno, giusto per capire se e come funziona, sia per fare delle indagini, sia per fare reverse engineering, sia per sviluppare i driver stessi della periferica.

A questo punto qualcuno potrebbe chiedere: "Perche' non usare Arduino o Raspberry Pi?"

E' un po' come chiedere: "Perche' programmare un computer quando ne puoi programmare un altro?!?"

Avanti cosi' diventa solo un tentare di spostare il problema da un'altra parte, senza mai risolverlo veramente. La soluzione delle soluzioni sarebbe comprarsi (o costruirsi) una porta parallela, ma ancora una volta i portatili pongono alcune difficolta' di installazione, quindi ancora una volta diventa una strada impraticabile. Una possibile soluzione sembrano essere gli adattatori USB-seriale.

Gli adattatori USB-seriale della FTDI, oltre a svolgere la classica funzione per cui sono stati costruiti, possono essere utilizzati in bit-bang mode e pilotati come linee di I/O generiche. Ciascun adattatore fornisce 8 linee di I/O indipendenti che possono essere programmate come ingressi o uscite. Il passaggio sembra quantomeno contorto: host usb -> hub usb -> adattatore usb-seriale -> I/O -> device. Al momento sembra essere la soluzione piu' economica, a livello di prestazioni mi rimangono molti dubbi: di fatto la velocita' di trasmissione crolla drasticamente, ma in un'ottica in cui a noi non serva pilotare realmente la periferica, ma solo dimostrare come questa debba essere pilotata, allora il compromesso potrebbe essere valido. Questo progetto non vuole modificare o sostituire l'interfacciamento con la periferica: prima o poi la periferica sara' collegata ad un sistema dedicato Arduino like, lo scopo di struttura e' quello di realizzare il driver di periferica prima di sviluppare il driver stesso. Potrebbe sembrare un gioco di parole venuto male: il compito di struttura e' quello di ricreare sul personal computer un ambiente facile da modificare in cui poter sviluppare e testare il driver di periferica, in modo da semplificare poi il passaggio verso il sistema target.

Collegamenti

Il tipo di chip contenuto nell'adattatore seriale non sembra importante, quasi tutti i modelli FTDI supportano il bit-bang mode ed al momento struttura utilizza solo questo metodo per pilotare l'hardware. I chip FTDI metterebbero a disposizione altre modalita' per accedere all'hardware, ad esempio alcuni modelli hanno il cosidetto bus emulation mode, ma tutte queste modalita' risultano specifiche per certe applicazioni o richiedono un hardware molto piu' complicato; al momento vorrei tenere le cose il piu' semplice possibile, il bit-bang mode mi sembra un buon punto di partenza. Al momento struttura e' stato collaudato con diversi chip FTDI e tutti hanno dato i medesimi risultati, il mio ultimo acquisto e' stato un adattatore basato su FT232RL di cui riporto qui sotto il pin-out.

pinout USB-serial Bit-bang SPI bus
TXD D0 MOSI
RXD D1 MISO
RTS D2 CLK
CTS D3 D3
DTR D4 D4
DSR D5 D5
DCD D6 D6
RI D7 D7

I/O puro e semplice

Struttura puo' essere visto come una collezione di driver uniti ad un interprete dei comandi, i driver vengono attivati via via che se ne ha bisogno e spaziano dal semplice controllo degli I/O, fino all'implementazione dell'interfaccia SPI. Cominciamo con la prova zero: il semplice controllo delle uscite.

link example

Prendiamo un adattatore USB-seriale basato su FT232RL come quello visibile in figura qui a fianco e colleghiamo un indicatore luminoso a ciascuna delle 8 linee di I/O. Per far prima io ho utilizzato le mie schedine sonda: sono dei led bicolore bufferizzati da un 74LV04 in modo da non caricare le uscite del FT232RL.

Ora avviate struttura digitando dalla riga di comando:

$ ./struttura -C demo_1

Questo script pilota direttamente le linee di I/O mettendole tutte in uscita e alzandole una alla volta e poi riabbassandole sempre una alla volta. Nello script sono inserite delle pause tra il cambio di una linea e il successivo in modo da essere chiaramente visibile ad occhio nudo.

Display alfanumerico

Proviamo ora qualcosa di piu' interessante: abbiamo ripetuto fin'ora che struttura non e' altro che una collezione arricchibile di driver, allora cominciamo ad utilizzare almeno quelli gia' pronti.

link example

Colleghiamo un display alfanumerico basato su HD44780 al nostro adattatore seriale e digitiamo:

$ ./struttura demo_2

Questo script sfrutta ovviamente il driver per HD44780, da notare che in questo esempio alcuni caratteri sono stati ridefiniti (vedi la clessidra sulla prima riga).

Display OLED

Questa e' una prova fatta con struttura-0.12 che sfrutta l'emulazione del bus SPI per dialogare con il display controller.

OLED display link
OLED adaptor

Struttura-0.12 fa uso dell'interprete TCL per potenziare lo strumento, per avviare la demo dalla directory tcl digitare:

$ ../struttura ssd1328_demo.tcl

Download

struttura-0.10.tar.gz
struttura-0.11.tar.gz
struttura-0.12.tar.gz

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