TIBI:Software Linux

De WikiRobotics
Saltar a: navegación, buscar

Descripción Software

El manejo de la tarjeta de interface se ha realizado bajo Linux. Nuestra religión y creencias personales nos impiden realizar este trabajo bajo otros entornos ;) pero vamos, la idea es la misma que vamos a comentar aquí...

Empecemos por la más sencilla a la par que cutre :) que sería utilizar la tarjeta directamente, es decir, accediendo directamente desde el programa a la dirección base codificada en el dip switch. Pero esta opción tiene algunas desventajas, quizás la más grande es que para poder acceder a los puertos el programa debe ejecutarse como root, o en caso de que lo ejecute otro usuario, deberá pertenecer a root y tener activado el suid, cosa que es muy, muy, muy mala .)

La idea es obtener acceso al puerto mediante ioperm() y a partir de aquí realizar la entrada/salida con inb() y outb().

Pero como somos unos machotes, hemos pensado que lo más divertido es hacerse un driver para el inventillo y darle más gracia a asunto, así que te dejamos disponible también el código fuente en C de un módulo para Linux que actúa como driver para la tarjeta de interface. El módulo registra un nuevo dispositivo /dev/tibi sobre el cual se puede realizar toda la entrada/salida. Las funciones capturadas por el driver son open(), close(), read() y write(). Las entradas/salidas se hacen con datos de 1 byte. El diseño del driver se ha mantenido lo más simple posible a falta de quizás un poco más de robustez, pero vamos, es algo experimental y sobre el cual tienes total libertad para mejorarlo si te apetece. Mándanos las mejoras que nunca está de más aprender :)

Para compilarlo debes hacer algo similar a lo siguiente:

 cc -D__KERNEL__ -DMODULE -Wall -O2 -o tibi.o tibi.c

Luego lo cargas con un típico:

 insmod tibi.o io=0x31c

En este caso la dirección es 0x31c pero deberás poner la que hayas codificado en el dip switch, claro está :)

Si quieres hacer las cosas ya cañeras, cañeras ;) puedes hacer que el driver se cargue automáticamente cuando se acceda al dispositivo /dev/tibi, para ello deberás modificar tu fichero /etc/modules.conf y añadir unas líneas como las siguientes:

 alias char-major-254 tibi
 options tibi io=0x31c

Un pequeño detallito... en este caso, el dispositivo se ha registrado con un major number de 254, si ves e código fuente del módulo, te darás cuenta de que al registrar el dispositivo se obtiene el major de forma dinámica, no se usa un major fijo, por lo que debes estar atento a este tema. Cuando el dispositivo se carga, obtienes información del major asignado y de cómo crear el dispositivo en tu fichero /var/log/messages:

 Sep 24 02:06:57 gibson kernel: Registrado el major 254
 Sep 24 02:06:57 gibson kernel: Ahora hay que hacer: mknod tibi c 254

Una vez que se ha cargado el módulo, indicando la dirección base de E/S como parámetro (el hardware tal y como está diseñado no permite la autodetección), únicamente resta hacer un programa de usuario que maneje el dispositivo.