\author {Sven Goldt}
\title {Gu{\'\i}a del Programador de Linux}

%
% Traducci{\'o}n de Ignacio Arenaza (inaki.arenaza@jet.es) para el proyecto
% LuCAS (http://www.infor.es/LuCAS/)
%
% $Id: async.tex,v 1.2 1998/05/05 21:09:40 iarenaza Exp $
%
% $Log: async.tex,v $
% Revision 1.2  1998/05/05 21:09:40  iarenaza
% Primera traducción. A revisar por el coordinador.
%
%

\chapter {Programaci{\'o}n de los Puertos de E/S}

Normalmente, un PC tiene al menos dos interfaces serie y una paralelo. Estas
interfaces son dispositivos especiales y se mapean como sigue:
\begin {itemize}
\item $/dev/ttyS0 - /dev/ttyS{\bf n}$\\
estos son los dispositivos serie RS232 0-{\bf n} donde {\bf n} depende
de su hardware.
\item $/dev/cua0 - /dev/cua{\bf n}$\\
estos son los dispositivos RS232 0-{\bf n} donde {\bf n} depende de su
hardware.
\item $/dev/lp0 - /dev/lp{\bf n}$\\
estos son los dispositivos paralelos 0-{\bf n} donde {\bf n} depende
de su hardware.
\item $/dev/js0 - /dev/js{\bf n}$\\
estos son los dispositivos de joystick 0-{\bf n} donde $ 0<= {\bf n} <= 1 $.
\end {itemize}

La diferencia entre los dispositivos $/dev/ttyS*$ y $/dev/cua*$
consiste en como se maneja la llamada a open(2). Se supone que los
dispositivos $/dev/cua*$ se deben usar como dispositivos de llamada
saliente y por lo tanto, al invocar a open(2), reciben par{\'a}metros por defecto
diferentes a los que reciben los dispositivos $/dev/ttyS*$, que se
inicializan para llamadas entrantes y salientes.  Por defecto los
dispositivos son dispositivos controladores para aquellos procesos que los
abrieron.
Normalmente estos dispositivos especiales deber{\'\i}an manejarse con peticiones
ioctl(), pero POSIX prefiri{\'o} definir nuevas funciones para manejar los
terminales as{\'\i}ncronos que dependen fuertemente de la estructura
termios. Ambos m{\'e}todos requieren que se incluya
$<termios.h>$.
\begin {enumerate}
\item m{\'e}todo ioctl:\\
TCSBRK, TCSBRKP, TCGETA (obtener atributos), TCSETA (poner atributos)\\
Peticiones de control de E/S de Terminal (TIOC):\\
TIOCGSOFTCAR (obtener portadora soft), TIOCSSOFTCAR (poner
portadora soft),
TIOCSCTTY (poner tty controlador),
TIOCMGET (obtener l{\'\i}neas de m{\'o}dem), TIOCMSET (activar l{\'\i}neas de m{\'o}dem),
TIOCGSERIAL, TIOCSSERIAL, TIOCSERCONFIG, TIOCSERGWILD, TIOCSERSWILD,
TIOCSERGSTRUCT, TIOCMBIS, TIOCMBIC, ...\\
\item m{\'e}todo POSIX:\\
tcgetattr(), tcsetattr(), tcsendbreak(), tcdrain(), tcflush(), tcflow(),
tcgetpgrp(), tcsetpgrp()\\
cfsetispeed(), cfgetispeed(), cfsetospeed(), cfgetospeed()\\
\item otros m{\'e}todos:\\
outb,inb para la programaci{\'o}n a bajo nivel, como por ejemplo para usar
el puerto de la impresora con algo que no sea una impresora.\\
\end {enumerate}
\clearpage

\section {Programaci{\'o}n del Rat{\'o}n}
Los ratones se conectan o bien a un puerto serie o bien directamente al bus
AT. Diferentes tipos de ratones env{\'\i}an diferentes tipos de datos, lo
que hace la programaci{\'o}n del rat{\'o}n algo m{\'a}s complicada a{\'u}n.
Pero Andrew Haylett fue tan amable que puso un copyright generoso en
su programa selection, lo que significa que puede usar estas rutinas
de rat{\'o}n para sus propios programas. Junto con este manual puede
encontrar la versi{\'o}n ***release** previa de selection-1.8\footnote
{N. del T.: en el momento de traducir esto hab{\'\i}a una versi{\'o}n mas
  reciente disponible} junto con la nota de COPYRIGHT.
Por otra parte, X11 ofrece una API c{\'o}moda de usar, as{\'\i} que las
rutinas de Andrew se deber{\'\i}an usar {\'u}nicamente para aplicaciones que no
sean X11.
S{\'o}lo son necesarios los m{\'o}dulos mouse.c y mouse.h del paquete selection.
Para recibir los eventos del rat{\'o}n b{\'a}sicamente hay que llamar a
ms\_init() y get\_ms\_event(). ms\_init necesita los 10 par{\'a}metos
siguientes:
\begin {enumerate}
\item {\it int acceleration}\\
es el factor de aceleraci{\'o}n. Si mueve el rat{\'o}n m{\'a}s de {\it delta}
pixels, la velocidad de movimiento se incrementa dependiendo de este valor.
\item {\it int baud} \\
es la velocidad en bps que usa su rat{\'o}n (normalmente 1200).
\item {\it int delta}\\
{\'e}ste es el n{\'u}mero de pixels que debe mover el rat{\'o}n antes de que
comience la aceleraci{\'o}n.
\item {\it char *device}\\
es el nombre de su dispositivo de rat{\'o}n (por ejemplo /dev/mouse)
\item {\it int toggle}\\
conmuta la l{\'\i}nea de m{\'o}dem del rat{\'o}n DTR, RTS o ambas durante la
inicializaci{\'o}n (normalmente 0).
\item {\it int sample}\\
la resoluci{\'o}n (en dpi) de su rat{\'o}n (normalmente 100).
\item {\it mouse\_type mouse}\\
el identificador del rat{\'o}n conectado, como P\_MSC (Mouse Systems Corp.)
para mi rat{\'o}n ;).
\item {\it int slack}\\
  cantidad de elasticidad para el ``salto circular''\footnote{N. del
    T.: traducci{\'o}n libre de {\it wraparound}, que es sin{\'o}nimo de {\it
      word wrapping} y se refiere al salto autom{\'a}tico al otro extremo
    de la pantalla cuando algo no cabe en un lado de la misma},
  lo que significa que si {\it slack} es -1, un intento de mover el rat{\'o}n m{\'a}s
  all{\'a} del borde de la pantalla dejar{\'a} el cursor en el borde. Los valores
  $>=$ 0 significan que el cursor del rat{\'o}n pasar{\'a} al otro extremo de
  la pantalla tras mover el rat{\'o}n {\it slack} pixels contra el borde.
\item {\it int maxx}\\
la resoluci{\'o}n de su terminal actual en la direcci{\'o}n x. Con el tipo de
letra por defecto, un car{\'a}cter tiene una anchura de 10 pixels y por lo
tanto la resoluci{\'o}n total de la pantalla en x es 10*80-1.
\item {\it int maxy}\\
la resoluci{\'o}n de su terminal actual en la direcci{\'o}n y. Con el tipo de
letra por defecto, un car{\'a}cter tiene una altura de 12 pixels y por lo
tanto la resoluci{\'o}n total de la pantalla en y es 12*25-1.
\end {enumerate}
get\_ms\_event() necesita {\'u}nicamente un puntero a una estructura
ms\_event. Si ocurre un error, get\_ms\_event() devuelve -1. Cuando
todo va bien, devuelve 0 y la estructura ms\_event contiene el estado
actual del rat{\'o}n.

\section {Programaci{\'o}n del M{\'o}dem}
V{\'e}ase el ejemplo miniterm.c\\
Usar termios para controlar el puerto RS232.\\
Usar los comandos Hayes para controlar el m{\'o}dem.

\section {Programaci{\'o}n de la Impresora}
V{\'e}ase el ejemplo checklp.c\\
No usar termios para controlar el puerto de la impresora.
Usar ioctl e inb/outb si fuera necesario.\\
Usar comandos Epson, Postscript, PCL, etc. para controlar la impresora.\\
$<linux/lp.h>$\\
llamadas ioctl: LPCHAR, LPTIME, LPABORT, LPSETIRQ, LPGETIRQ, LPWAIT\\
inb/outb para estado y control del puerto.

\section {Programaci{\'o}n del Joystick}
V{\'e}ase ejemplo js.c en el paquete del m{\'o}dulo cargable del n{\'u}cleo para
el joystick.
$<linux/joystick.h>$\\
llamadas ioctl: JS\_SET\_CAL, JS\_GET\_CAL, JS\_SET\_TIMEOUT, JS\_GET\_TIMEOUT,
JS\_SET\_TIMELIMIT, JS\_GET\_TIMELIMIT, JS\_GET\_ALL, JS\_SET\_ALL.
Una lectura
 en /dev/js{\bf n} devolver{\'a} la estructura JS\_DATA\_TYPE.

\endinput

%%% Local Variables:
%%% mode: latex
%%% TeX-master: t
%%% End:
