lunes, 7 de abril de 2008

Controlando el puerto paralelo en linux

El controlar el puerto paralelo en linux es algo relativamente sencillo y existen varias formas de hacerlo, en los siguientes ejemplos supondré que tenemos conectados una serie de leds en las terminales 2 al 9 (data port) del puerto paralelo para ser usados como salidas, asi como 2 push boton (PB) en las terminales 10 y 12 para usarlos como entradas.

Todos los ejemplos que ponga haran lo siguiente: al presionar el PB en el pin 12 se empezaran a prender los leds puestos en los pines 2 al 9, al llegar al pin 9 se volverán a apagar, al presionar el PB en el pin 10 se terminara el programa.

El primer ejemplo es usando inb y outb:


#include <stdio.h>
#include <sys/io.h>
#include <unistd.h>

#define puerto 0x378

int i, x, dato, pin12, pin10;

main(){
pin12 = 32;
pin10 = 64;
ioperm(puerto,2,1);

while ((pin10 & dato) != pin10) {
x=0;
outb(x,puerto);
dato = inb(puerto + 1);
if ((dato & pin12) == pin12)
for ( i = 1; i <= 9; i++) {
outb(x,puerto);
x = x*2+1;
usleep(200000);
}
}
ioperm(puerto,2,0);

}

ioperm(puerto,2,1): Nos sirve para pedir "permiso" para hacr uso del puerto, el 2 indica el rango de direcciones que queremos usar, en nuestro caso son las direcciones 0x378 y 0x379, el 1 indica que estamos "habilitando" el puerto.

Para ver si se activado algún PB que tenemos en los pines 10 y 12 hacemos uso de una mascara.


Otro forma de acceder al puerto paralelo lo veremos con el siguiente ejemplo:
#include <unistd.h>
#include <stdio.h>
#include <fcntl.h>



#define puerto 0x378
#define pin12 32
#define pin10 64

int i ,fd, dato, x;
main (){

while ((pin10 & dato) != pin10) {
x = 0;
fd = open ("/dev/port", O_RDWR);
lseek (fd, puerto + 1, 1);
read(fd,&dato,1);
close(fd);
fd = open ("/dev/port", O_RDWR);
lseek (fd, puerto, 1);
write(fd,&x,1);
close(fd);
if ((dato & pin12) == pin12)
for ( i = 1; i <= 9; i++) {
x = x*2+1;
usleep(200000);
fd = open ("/dev/port", O_RDWR);
lseek (fd, puerto, 1);
write(fd,&x,1);
close(fd);
}
}
}

En el ejemplo anterior hacemos uso del nodo /dev/port, hacemos uso de lseek() para posicionarnos en la dirección del puerto paralelo. Una vez que lo tengamos abierto funciona como si estuviéramos escribiendo o leyendo un archivo cualquiera.

Los 2 ejemplos anteriores solo nos sirven cuando los ejecuta el usuario root.

No hay comentarios.: