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.