Página siguiente Página anterior Índice general

8.1 USB ratón-teclado

Esta sección está fuertemente basada en el capítulo 2 del documento The Linux USB sub-system y me centro en el ratón y teclado, supongo que el resto de componentes no debiera tener ningún problema añadido (exceptuando dispositivos de puerto pararelo).

Se supone que se trabaja con el kernel 2.2.16 (es en el que probó el autor, aunque debiera de funcionar con el 2.2.14).

¿Cómo puedo saber si mi adaptador USB es OHCI o UHCI ?

Si tu placa madre usa chipsets Intel, PIIX4, VIA,... el adaptador USB es UHCI, y si usa Compaq, iMacs, OPTi, Sis,Ali,... el adaptador USB es OHCI. En caso de no conocer que chipsets tiene tu ordenador hay dos opciones: lo abres y/o (lo más cómodo) y suponiendo que tengas un kernel compilado con la entrada /proc/pci activada, puedes hacer un cat /proc/pci, si la entrada USB es de la forma 0xHHHH (16 bits) es UHCI, si es 0xHH000000 (32 bits) entonces es OHCI.

No me aparecen las opciones de compilación de USB en el kernel 2.2.16

Los drivers de USB están en contínuo desarrollo y se arreglan muchos bugs de una versión a otra, al igual que se añaden muchas características nuevas. Actualmente, el desarrollo de USB se centra para la serie de kerneles 2.4 y los que vienen de serie con el 2.2.x están muy anticuados. Para ello hay un backport de los drivers USB de la seria 2.4 al 2.2.16. Estos funcionarán con los dispositivos soportados a excepción de los que usen el puerto paralelo, por necesitar éstos del driver partport que sufrió muchas modificaciones.

Entonces lo que tendremos que hacer es descargar el parche de http://www.suse.cz/development/usb-backport/usb-2.4.0-test2-pre2-for-2.2.16-v3.diff.gz y aplicarlo al árbol de fuentes del kernel 2.2.16 mediante los comandos:

   [22:55:17 asimov@asimovi download]$ cd /usr/src/linux-2.2.16/
   [22:55:17 asimov@asimovi download]$ gzip -dc /tmp/usb-2.4.0-test2-pre2-for-2.2.16-v3.diff.gz|patch -p1

Ahora ya podremos hacer un make xconfig o un make menuconfig, el make config se lo dejo a los arriesgados o a los que no tienen más remedio (aunque si se tiene usb, se tiene máquina suficiente ;-).

¿Qué opciones marco?

La primera opción a seleccionar es la de Support USB (recomiento la opción como módulo), y la opción Preliminary USB device filesystem para la opción de /proc/usb, a continuación si se sabe ya si es OHCI o UHCI pues seleciona UHCI (Intel PIIX4, VIA, ...) ó ohci-hcd (Compaq, iMacs,OPTi, SiS, ALi,...) aunque si se va a utilizar el script de este howto, mejor seleccionar los dos (siempre como módulo).

Necesitarás marcar qué dispositivos quieres usar:

¿Dónde está el dispositivo del ratón, y cómo le digo a las X donde está?

El dispositivo de un PS/2 es el /dev/psaux, el de uno serie es el /dev/ttySx, en realidad da igual el nombre, lo importante son los números mágicos mayores y menores. En el script que se adjunta más abajo, crea el directorio /dev/input/ y en él dispositivo con mknod /dev/input/mice c 13 63.

Para utilizar el ratón USB con las X, hay que editar el fichero /etc/X11/XF86Config

Versión

XFree86>=4.0

   Section "InputDevice"
             Identifier "Ratón USB"
             Driver "mouse"
             Option "Protocol" "IMPS/2"
             Option "Device" "/dev/input/mice"
             Option "ZAxisMapping" "4 5"
EndSection
Y en la seccion ServerLayout:
             InputDevice "Ratón USB" "CorePointer"
Versión

XFree86 3.3x

   Section "Pointer"
             Protocol "IMPS/2"
             Device "/dev/input/mice"
             ZAxisMapping 4 5
EndSection

¿Como cargo los módulos compilados y como monto el sistema de ficheros /proc/usb?

Yo cogí el fichero que viene en la Mandrake 7.1, y lo modifiqué un poco, ya que éste viene para cargar los módulos antiguos, y modifiqué tambien la detección de si es UHCI o OHCI. Aquí está:

#!/bin/sh
if [ ! -f /etc/conf.modules -o ! -f /etc/sysconfig/usb ];then
        echo "No existe /etc/sysconfig/usb";
        exit 1;
fi
. /etc/rc.d/init.d/functions
. /etc/sysconfig/usb
#Esta función mete el alias correspondiente en /etc/conf.modules
function sed_usb_interface () {
        local module
        module=$1
        #echo "alias usb-interface $module"
        echo "alias usb-interface $module">>/etc/conf.modules
        touch /lib/modules/$(uname -r)/modules.dep
}
#Esta funcion detecta el tipo de interfaz usb que tenemos (uhci_t o ohci_t)
function probe_usb_interface () {
        local t pci_f uhci_t ohci_t
        if ! grep -q "USB" /proc/pci  ;then
        return 1;
        fi
        if [ $(cat /proc/pci |sed -n '/USB/,$p'|sed -n '3p'|awk  '{print $3;}'|wc -c|sed -e 's/\ *//') -gt 7 ];then 
                sed_usb_interface usb-ohci      
                return 0;
        else    
                sed_usb_interface usb-uhci      
                return 0;
        fi
}       
 
function get_usb_interface () {
        if ! grep -q "^alias usb-interface" /etc/conf.modules; then
                echo -n "Detectando interfaz USB    "
                if ! probe_usb_interface; then
                        echo_failure;
                        echo
                        exit 1;
                else
                        echo_success
                        echo
                fi
        fi
}
 
function mount_proc_usb () {
        if grep -q usbdevfs /proc/filesystems; then
                if ! grep -q /proc/bus/usb /proc/mounts; then
                        action "Montando sistema de ficheros USB" mount -t usbdevfs /proc/bus/usb /proc/bus/usb
                fi
        fi              
}
 
function umount_proc_usb () {
        if grep -q usbdevfs /proc/filesystems;then
                if grep -q /proc/bus/usb /proc/mounts;then
                        action "Desmontando sistema de ficheros USB" umount /proc/bus/usb
                fi
        fi
}
 
 
################################################
#           Main                               #
################################################
 
PKLVL=`sed -e 's/^\(.\).*/\1/'</proc/sys/kernel/printk`
case $1 in
        start)
        get_usb_interface;
        sysctl -w kernel.printk=0
        action "Cargando interfaz USB" /sbin/modprobe usb-interface
        if [ "$MOUSE" = "yes" ];then
                sleep 2
                if [ ! -d /dev/input ];then
                        mkdir /dev/input
                fi
                if [ ! -c /dev/input/mice ];then
                        mknod /dev/input/mice c 13 63
                fi
                action "Cargando ratón USB" /sbin/modprobe input && /sbin/modprobe hid && /sbin/modprobe mousedev
        fi
        if [ "$KEYBOARD" = "yes" ];then
                sleep 2
                action "Cargando teclado USB" /sbin/modprobe input && /sbin/modprobe hid && /sbin/modprobe keybdev
        fi
        sleep 1 && sysctl -w kernel.printk=$PKLVL
        mount_proc_usb;
        ;;
        stop)
        sysctl -w kernel.printk=0
        if [ "$MOUSE" = "yes" ];then
                action "Descargando ratón USB" /sbin/modprobe -r mousedev && /sbin/modprobe -r hid && /sbin/modprobe -r input 
    fi
    if [ "$KEYBOARD" = "yes" ];then
                action "Descargando teclado USB" /sbin/modprobe -r keybdev && /sbin/modprobe -r hid && /sbin/modprobe -r input 
    fi
    action "Descargando interfaz Usb" /sbin/modprobe -r usb-interface
    sleep 1 && sysctl -w kernel.printk=$PKLVL
    ;;
    status)
    if fgrep -q usbcore /proc/modules; then
            echo "USB Cargado."
    else 
            echo "USB no cargado."
    fi  
    exit 0
    ;;
    restart)
    $0 stop
    $0 start
    ;;
    *)
    echo "Uso: $(basename $0) start|stop|restart|status"
    exit 0
    ;;
esac
exit 0
 

Este archivo se puede meter en /etc/rc.d/init.d/usb, y hacerle un enlace desde el nivel de ejecución, bien sea a mano, o mediante el ksysv o cualquier otro editor de niveles de arraque. Este fichero funcionará en redhat y derivadas. Para que funcione en el resto hay que eliminar la línea . /etc/rc.d/init.d/functions y sustituir la expresión action <cadena> por echo <cadena>';'.

El fichero supone que existe el fichero /etc/sysconfig/usb, en el que estarán las claves MOUSE y KERYBOARD, con yes o cualquier otra cosa.

Básicamente los módulos a cargar son:

usbcore.o, usb-uhci.o o usb-ohci.o, input.o, hid.o, y mousedev.o y/o keybdev.o

Direcciones de interés

http://www.linux-usb.org.

Aquí está todo lo que se necesita (para qué se quiere más).


Página siguiente Página anterior Índice general