Logo PJ
Home
Arcade
Musica
Bicicletta
FabLab
Linux
DreamBox
Giochi
 
   Introduzione   Perle   Programmi   SSH   SAMBA   Firewall   GPS   WIFI   Jukebox   PCcar 

Gestione della porta I/O su schede WAFER 5822

La scheda WAFER 5822 prodotta dalla taiwanese ICP mette a disposizione una porta I/O che consente di gestire via software 4 porte di input e 4 porte di output. L'indirizzo del registro che controlla tali porte viene specificato da BIOS e può assumere uno dei seguenti valori: 0x240, 0x260 oppure 0x280. Sia nel caso ci interessi pilotare le porte di input, sia ci interessino quelle di output dobbiamo utilizzare i primi quattro bit di tale registro, in lettura nel primo caso, in scrittura nel secondo caso; non viene tenuta memoria quindi da parte del registro dello stato delle porte di output, che all'avvio della scheda risultano attive.

Un problema che ho incontrato appena ho iniziato a programmare su tale porta è l'ambiguità del manuale sulla numerazione dei pin: ci propone infatti una tabella che ricalca la posizione dei piedini sulla scheda, ma utilizza una numerazione per colonna anziché per riga come invece avviene solitamente in elettronica. Ed infatti dopo un paio di prove sono arrivato alla conclusione che non bisogna seguire la numerazione dei piedini presentata nel manuale, ma la loro posizione; volendo quindi provare a ricompilare la tabella dei segnali, otteniamo il seguente risultato:

 Pin   Signal   Pin   Signal 
1 GND 2 VCC
3 Out3 4 Out2
5 Out1 6 Out0
7 In3 8 In2
9 In1 10 In0

Cominciamo quindi ad analizzare il valore del registro, e scopriamo che all'accensione della scheda contiene il valore esadecimale 0xF0, ovvero i quattro bit più alti impostati a 1 e i quattro più bassi impostati a 0. Se ora proviamo a collegare il piedino VCC con quello In0 e rileggiamo il valore del registro I/O, questa volta leggeremo il valore 0xF1. Per quanto riguarda invece le porte di output, proviamo a collegare il tester ai piedini GND e Out0 e verifichiamo che passa corrente; una volta impostato a 1 il primo bit del registro l'ago del tester scenderà allo zero, mentre reimpostandolo a 0 torneremo a leggere un valore positivo.

Nella realizzazione del driver per pilotare tale porta ho voluto rendere all'utente le cose il più semplice possibile, quindi ho pensato di realizzare una directory /proc/io_port/ dentro la quale sono presenti gli otto file che rappresentano le singole porte, più un file che riporta lo stato complessivo della porta. Ovviamente i file che rappresentano le porte di input sono solamente in lettura e restituiscono un valore 1 o 0 a seconda se la porta corrispondente risulti attiva oppure no, mentre per quanto riguarda le porte di output è possibile oltre che leggerne lo stato anche impostarlo scrivendoci il valore 1 per attivarle oppure 0 per disattivarle.

Una volta quindi compilato il sorgente come modulo per il kernel lo carichiamo in memoria e controlliamo nella directory /proc se compare la nuova directory:

[/root]# gcc -DMODULE -D__KERNEL__ -O6 -c wafer5822io.c [/root]# insmod wafer5822io.o [/root]# lsmod Module Size Used by wafer5822io 4112 0 (unused) [/root]# ls -la /proc/io_port/ totale 0 drw-r--r-- 1 root root 0 gen 5 23:38 . dr-xr-xr-x 46 root root 0 gen 6 00:30 .. -r--r--r-- 1 root root 0 gen 5 23:38 in0 -r--r--r-- 1 root root 0 gen 5 23:38 in1 -r--r--r-- 1 root root 0 gen 5 23:38 in2 -r--r--r-- 1 root root 0 gen 5 23:38 in3 -rw-r--r-- 1 root root 0 gen 5 23:38 out0 -rw-r--r-- 1 root root 0 gen 5 23:38 out1 -rw-r--r-- 1 root root 0 gen 5 23:38 out2 -rw-r--r-- 1 root root 0 gen 5 23:38 out3 -r--r--r-- 1 root root 0 gen 5 23:38 status [/root]#

a questo punto siamo in grado di leggere lo stato attuale delle porte:

[/root]# cat /proc/io_port/status Register address: 0x280 Input: 0 0 0 0 Output: 1 1 1 1 [/root]#

L'output indica chiaramente che le porte di input non sono attive e tutte quelle di output invece forniscono corrente. Ora possiamo provare ad abbassare la corrente della prima porta:

[root@mp3 /root]# echo 0 > /proc/io_port/out0 [root@mp3 /root]# cat /proc/io_port/status Register address: 0x280 Input: 0 0 0 0 Output: 0 1 1 1 [root@mp3 /root]#

Andando a controllare con il tester verificheremo che sulla porta In0 non è presente corrente, come appunto ci aspettavamo. A questo punto possiamo utilizzare le porte come più ci comoda.

Ultima cosa: se vi interessa utilizzare compilare il driver direttamente nel kernel dovete applicare la patch che ho fornito, ed attivare il driver dalla sezione delle impostazioni generali. Occorre in questo caso indicare subito anche l'indirizzo del registro I/O in quanto viene disattivato l'autoriconoscimento della porta per maggior sicurezza. Il modulo invece permette di specificare come parametro io_addr l'indirizzo del registro I/O (se non viene specificato il modulo cercherà di riconoscerlo automaticamente) mentre impostando a 1 il parametro start_out_down nel momento in cui viene caricato il modulo tutte le porte di output vengono impostate a 0.

RIFERIMENTI

In allegato vi lascio il sorgente del modulo appena discusso e il sito del produttore della scheda. Controllando altri manuali in linea impostando il valore del registro a 0x240 forse questo driver può funzionare senza bisogno di modifiche anche sulle schede WAFER 4821 e 4823.

  • Il sorgente del driver (sorgente C, 10 KB) per la porta I/0.
  • Il sito del produttore della scheda.