Tarjeta Interface Bus ISA (TIBI)

[Introducción]

[Descripción]

[Software]

[Autor]

[Licencia]

[Download]

[Noticias]

[Agradecimientos]

[Disclaimer]



Introducción

Este circuito es una interface de E/S para PC diseñada como una tarjeta ISA estándar. El diseño es lo más sencillo posible ya que únicamente consta de un comparador, un buffer, un circuito NAND, resistencias y condensadores.


Descripción Hardware

El circuito no hace más que actuar como un simple buffer de entrada/salida entre el conector externo y el bus ISA del ordenador. La tarjeta deberá direccionarse como cualquier otra tarjeta estándar, por lo que habrá que asignarle una dirección base de E/S. esta función se realizará a través del dip switch que se ve en el diseño y sus valores corresponden con los de la tabla 1. El conector externo proporciona 8 señales de E/S (IO0 a IO7), dos líneas de dirección (A0 y A1), una señal de habilitación activa a nivel bajo (/ENABLE), una señal de lectura activa a nivel bajo (/RD) y una señal de escritura activa también a nivel bajo (/WR). Además de estas señales se tienen líneas de alimentación de +5V y señales de tierra.

300 304 308 30C 310 314 318 31C
A ON OFF ON OFF ON OFF ON OFF
B ON ON OFF OFF ON ON OFF OFF
C ON ON ON ON OFF OFF OFF OFF

Tabla 1

Con el dip switch se selecciona el estado lógico que tendrán las señales P0, P1 y P2 del comparador. Las resistencias, actuando como resistencias de pull-up, proporcionan un nivel lógico alto cuando alguna de estas entradas esté abierta en el interruptor. El resto de entradas P del comparador se mantienen a un nivel lógico fijo (todos a bajo, menos P6 que está a alto). Este tinglado de que unas estén a nivel bajo y alto de forma fija es por el rango de direcciones que estamos codificando. La tarjeta pude tomar direcciones entre la 0x300 y la 0x31C. Esto implica que las señales A8 y A9 del bus siempre estarán a 1 ya que si el resto están a 0 estariamos codificando la dirección 0x300. Para direccionar el resto de valores posibles del rango únicamente es necesario modificar los valores de los 3 bits de menor peso, es decir, A2, A3 y A4 del bus ISA.Las señales A0 y A1 del bus ISA se puentean directamente con las señales A0 y A1 del conector, por si se quiere direccionar dentro del dispositivo que conectemos (crear nuestro propio bus externo).

Por tanto, las líneas de dirección del bus ISA van al comparador, las líneas del dip switch, junto con las líneas de estado fijo comentadas anteriormente van al comparador, activando la señal a nivel bajo P=Q cuando la dirección programada y la del bus ISA coincidan, esto implica que estamos direccionando la tarjeta de interface. Se supone por tanto, que querremos hacer algún tipo de operación de entrada salida sobre la misma, por lo que se activa la señal de ENABLE del buffer, para permitir la transferencia en un sentido o en otro. El sentido, dependerá del estado de las señales RD y WR. Cuando RD se activa (a nivel bajo) estamos indicando una transferencia desde el conector al PC. La activación (a nivel bajo) de WR, implica una transferencia desde el PC al conector.


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 .)

Aquí tienes un  ejemplo  de un programa de este tipo hecho en C. Como ves 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 :)

El módulo lo tienes  aquí . 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. Un ejemplo de tal programa de usuario lo tienes  aquí


Autores

Los culpables de todo esto

Respecto al driver, los programillas y demás parafernalia, son cosa de FuTuR3 (angel at futur3 dot com)  que es un manazas y se dedica al soft ;)
El hardware se lo ha currado EagleMan que es un manitas ;) así que cualquier duda al respecto mejor a él.


Download

Descarga de ficheros

ejemplo1.c Ejemplo en C de acceso directo a TIBI
ejemplo2.c Ejemplo en C de acceso mediante el driver TIBI
tibi.c Ejemplo en C de un driver para TIBI
esquema.png Esquemático de la Tarjeta Interface Bus ISA
tibi_src.zip Archivo con todas las fuentes en C



Licencia

La tarjeta Opto-triac esta publicada bajo la licencia Creative Commons en la versión Attribution and Share Alike. Es decir se permite copiar, modificar y distribuir este material siempre que se reconozca al autor y se mantenga la misma licencia.


Noticias


Agradecimientos


Disclaimer ;)

Esto es puramente experimental, así que si al hacer la tarjeta quemas las cortinas con el soldador, te envenenas por los efluvios gaseosos del estaño, te provocas quemaduras de tercer grado al prenderte fuego los pantalones, o algo aún peor, no nos vengas luego llorando de que lo has hecho porque has visto esto en nuestra página... se un hombre y afronta la vida tronco...

Por otro lado... si cargas el driver y se te formatea espontáneamente el sistema, te revienta el nuevo DVD que te acababas de comprar ayer mismito, o el Linux te empieza a soltar core dumps... pues lo mismo... no me llores que te doy... afronta la vida como un hombre de pelo en pecho...

Por otro lado... comentarios constructivos, donaciones, o palmaditas (virtuales o no) en la espalda serán bienvenidas :)

A disfrutarlo con salud... :)
 


Ricardo Gómez González

IEAROBOTICS