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