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:
Human Interface Device (HID) support : (es en la que nos centramos en este
howto) útil para teclado, ratón, joystick USB.
Mouse support : Selecciona esta opción en caso de tener un ratón USB, no
selecciones USB HIDBP Mouse support.
Keryborard support: Selecciona esta opción en caso de tener un teclado
USB, no selecciones USB HIDBP Keyboard support.
USB Scanner support :
¿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
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"
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
Aquí está todo lo que se necesita (para qué se quiere más).