Guía de USB en Gentoo Linux

Shyam Mani  Autor
John Christian Stoddart  Traductor
José Luis Rivero  Traductor
Andrés Pereira  Traductor
Sergio D. Rodríguez Inclan  Traductor

Actualizado 21 de junio, 2008

1.  Introducción

¿Qué es USB?

USB significa Bus Serial Universal (Universal Serial Bus en inglés) y básicamente es una interfaz externa estándar que permite la comunicación entre el computador y varios tipos de periféricos. Algunos de los dispositivos USB más comúnmente usados hoy en día son los teclados, ratones, llaveros (también llamados pen drives), cámaras digitales, grabadores externos de CD y DVD, impresoras, etc.

Actualmente hay dos versiones en uso de USB, a saber, USB 1.1 y USB 2.0. Debido a que USB siempre ha sido compatible hacia atrás con sus versiones anteriores, USB 2.0 es compatible con USB 1.1. Los últimos dispositivos USB típicamente son compatibles con USB 2.0. Adicionalmente USB 2.0 permite una velocidad máxima de transferencia de datos de 480 Mbps o 60 MBps y esta es la principal diferencia entre los dos estándares. Otra ventaja de USB es que los dispositivos son todos enchufables en caliente, lo que significa que no tiene que reiniciar su sistema para poder usar esos dispositivos.

Una perspectiva técnica

Antes de ir a las opciones exactas de configuración en el núcleo, es bueno revisar USB un poco más en detalle. Si está apurado o desea saltarse esta sección, por favor vaya a Configuración del Núcleo.

Un sistema USB tiene una controladora, concentradores y un concentrador raíz, entre otros, y permite tener hasta 127 dispositivos USB incluyendo los concentradores. La controladora no es otra cosa que la interfaz de hardware entre el dispositivo USB y el Sistema Operativo. Hoy en día hay un par de interfaces HCI (Interfaz de Controladora de Host) en uso y son la interfaz OHCI (Open HCI) proveniente de Compaq, UHCI (HCI Universal) y EHCI (HCI Mejorado), ambas de Intel. Tanto OHCI como UCHI son los estándares de interfaces en la industria para USB 1.1 mientras que EHCI lo es para USB 2.0.

El fabricante de hardware provee de una interfaz al programador que permite al sistema interactuar con el hardware al que se le conoce como HCD (Dispositivo Controlador del Host). A través del HCD el dispositivo interactúa con el software. El siguiente diagrama debería aclarar los conceptos y ayudar a una mejor comprensión:

Listado de Código 1.1: Arquitectura General de USB

(El software consiste de otras componentes también tal como
el manejador del dispositivo, pero no se muestra por motivos de
simplicidad)


   + -----  Hardware  ----   + ----  Software  ---- +
   |                         |                      |
   |[Disp. USB] -+-> {EHCI}--+--->  ( EHCD )        |
   |             |           |                      |  Usuario
   |             `-> {UHCI}--+--->  ( UHCD )        |
   |                         |                      |
   + -----  Hardware  ----   + ----  Software  ---- +

Un dispositivo USB puede usar un manejador propio o bien uno ya presente en el sistema y esto está basado en el concepto de clase de un dispositivo. Esto significa que si un dispositivo pertenece a cierta clase, entonces otros dispositivos que también pertenezcan a la misma clase pueden hacer uso del mismo manejador. Alguna de esas son la clase USB HID (Dispositivos de Interfaz Humana) que abarca dispositivos de entrada como teclados y ratones, la clase de dispositivos USB de almacenamiento masivo comprende a dispositivos como los llaveros, cámaras digitales, reproductores de audio y la clase CDC de USB (Clase de Dispositivos de Comunicación) que esencialmente cubre los módems USB y dispositivos similares.

¿Qué hay en su máquina?

Es muy simple averiguar si su máquina tiene o no soporte USB 2.0. Usaremos el comando lscpci para este propósito.

Nota: La herramienta lspci es parte del paquete sys-apps/pciutils. Si no lo tiene instalado, hágalo mediante emerge pciutils. Note que debe ser superusuario mientras ejecute el comando lspci.

Listado de Código 1.2: Algunas salidas de lspci

(En un sistema que es conforme a USB 1.1, note que sólo hay UHCI)

# lspci -v | grep USB
0000:00:04.2 USB Controller: Intel Corp. 82371AB/EB/MB PIIX4 USB (rev 01) (prog-if 00 [UHCI])

(En sistema conforme a USB 2.0, note que hay EHCI y UHCI)

00:1d.0 USB Controller: Intel Corp. 82801DB USB (Hub #1) (rev 01) (prog-if 00 [UHCI])
00:1d.1 USB Controller: Intel Corp. 82801DB USB (Hub #2) (rev 01) (prog-if 00 [UHCI])
00:1d.2 USB Controller: Intel Corp. 82801DB USB (Hub #3) (rev 01) (prog-if 00 [UHCI])
00:1d.7 USB Controller: Intel Corp. 82801DB USB EHCI Controller (rev 01) (prog-if 20 [EHCI])

Así que al usar el comando lspci, puede averiguar si sistema permite el uso de USB 2.0. Esto será de utilidad al activar las opciones correspondientes en el núcleo.

2.  Configuración del Núcleo

Obteniendo el núcleo

Primero instale con emerge las fuentes del núcleo de su preferencia. Aquí usaremos gentoo-sources. Para mayor información acerca de las distintas fuentes del núcleo disponibles en Portage, por favor revise la Guía del Núcleo de Gentoo.

Listado de Código 2.1: Obtener las fuentes del núcleo

#  emerge gentoo-sources

Ahora, procedemos con la tarea de configurar el núcleo.

Listado de Código 2.2: Dirigiéndose a la fuentes

#  cd /usr/src/linux
#  make menuconfig

Nota: El ejemplo anterior asume que el enlace simbólico /usr/src/linux apunta a las fuentes del núcleo que desea usar. Por favor, asegúrese de esto antes de continuar.

Opciones de configuración para el núcleo

Ahora se dará una mirada a algunas de las opciones que tendrá que activar en el núcleo para asegurar el soporte de USB para sus dispositivos.

Nota: Los ejemplos en este documento mostrarán las opciones de configuración para dar soporte básico de USB así como aquellas que comúnmente se necesitan, por ejemplo, un dispositivo de almacenamiento USB (en su mayoría cámaras y llaveros USB). Si tiene un dispositivo específico USB que necesita ser configurado, lea el manual del fabricante o busque en Internet para ver si dicho dispositivo tiene soporte incluido en el núcleo o que haya algún controlador que puede usar. Note que por motivos de simplicidad, todos los ejemplos tienen las opciones configuradas en el núcleo y no como módulos. Si desea tener un núcleo modular, asegúrese de anotar los nombres de los módulos y ajuste apropiadamente sus archivos de configuración.

Listado de Código 2.3: Opciones de make menuconfig

Device Drivers  --->
  SCSI device support  --->

(Aunque SCSI será activado de forma automática cuando se seleccione
"USB Mass Storage", necesitamos activar el soporte de discos)
---   SCSI support type (disk, tape, CD-ROM)
<*>   SCSI disk support

(Luego muévase un nivel atrás y vaya a "USB support")
USB support  --->

(Este es el concentrador raíz y se necesita para el soporte USB. Si
prefiere compilarlo como módulo, será llamado usbcore)
<*> Support for Host-side USB

(Active esta opción para ver sus dispositivos USB en /proc/bus/usb.
Se recomienda activarlo)
 [*]   USB device filesystem

(Seleccione al menos uno de los siguientes HCD. Si no está seguro,
puede seleccionar todos sin problemas)
--- USB Host Controller Drivers
<*> EHCI HCD (USB 2.0) support
< > OHCI HCD support
<*> UHCI HCD (most Intel and VIA) support

(Moviéndose un poco más abajo, se llega a la sección CDC y
almacenamiento masivo)
< > USB Modem (CDC ACM) support
<*> USB Printer support
<*> USB Mass Storage support

(Si tiene una tarjeta de red USB como la RTL8150, necesitará activar
esto)
USB Network Adapters  --->
    <*> USB RTL8150 based ethernet device support (EXPERIMENTAL)

(Si tiene un conversor serial a USB como el Prolific 2303, necesitará
activar esto)
USB Serial Converter support  --->
    <*> USB Serial Converter support
    <*> USB Prolific 2303 Single Port Serial Driver (NEW)

Si tiene un teclado USB, ratón, joystick, o cualquier otro dispositivo, necesitará activar el soporte para HID. Regrese un nivel a "Device drivers" y active el soporte para HID como se muestra a continuación:

Listado de Código 2.4: Activando el soporte HID

Device Drivers --->
  [*] HID Devices  --->
    <*>   USB Human Interface Device (full HID) support

Ya que están configuradas sus opciones, puede (re)compilar el núcleo y el soporte USB debería estar funcionando una vez que reinicie con el nuevo núcleo. Ustéd puede ahora pasar a Ver USB funcionando y asegurarse que todo trabaje como es debido.

3.  Ver USB funcionando

¡dmesg es su amigo!

Ha llegado la hora de probar y usar los dispositivos USB. En este capítulo veremos cómo responde el sistema a los variados dispositivos USB. Empezaremos conectando un llavero USB de 512 MB. Puede usar algún otro dispositivo de almacenamiento masivo similar. Usaremos principalmente dmesg para ver qué está sucediendo y cómo responde el sistema al dispositivo.

Nota: dmesg, en general, presenta una buena cantidad de información antes de desplegar la que necesitamos, pues lee el búfer del núcleo que tiene todos los mensajes del arranque. La salida mostrada en los siguientes ejemplos tiene sólo las opciones relevantes y se han agregado espacios extras para mejorar la lectura. Si lo necesita, por favor use dmesg | more o dmesg | less para ver mejor la salida en su sistema.

Listado de Código 3.1: Salida de dmesg para el llavero

(Conecte el llavero en el puerto USB disponible y luego ejecute: 
# dmesg | less

(El dispositivo es seleccionado como de tipo USB 1.1 y se le asigna una dirección. También
dice qué HCD está usando.)
usb 1-1: new full speed USB device using uhci_hcd and address 2

(Aparece automáticamente la emulación SCSI)
scsi0 : SCSI emulation for USB Mass Storage devices
usb-storage: device found at 2

(Ahora se recupera la información del dispositivo incluyendo su número de modelo)
usb-storage: waiting for device to settle before scanning
  Vendor: JetFlash  Model: TS512MJF2A        Rev: 1.00
  Type:   Direct-Access                      ANSI SCSI revision: 02
SCSI device sda: 1003600 512-byte hdwr sectors (514 MB)

(La característica de protección de escritura es código marcado como EXPERIMENTAL en los últimos núcleos)
sda: Write Protect is off
sda: Mode Sense: 0b 00 00 08
sda: assuming drive cache: write through
SCSI device sda: 1003600 512-byte hdwr sectors (514 MB)
/dev/scsi/host0/bus0/target0/lun0: p1
Attached scsi removable disk sda at scsi0, channel 0, id 0, lun 0
Attached scsi generic sg0 at scsi0, channel 0, id 0, lun 0,  type 0
usb-storage: device scan complete
(En este punto, el dispositivo generalmente es asequible montando /dev/sda1)

(Cuando se desconecta el dispositivo, el sistema da cuenta de aquello)
usb 1-1: USB disconnect, address 2

Una vez que el dispositivo está conectado y montado, puede acceder a él como si fuera un disco duro normal. Las operaciones habituales como cp, mv, rm, etc funcionan bien. También podría crear un sistema de archivos en el llavero USB.

Listado de Código 3.2: Acceder al llavero

# mount /dev/sda1 /mnt/usb
# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/hda8             9.4G  7.5G  1.9G  80% /
/dev/hda9              11G  8.1G  2.4G  78% /usr
none                  189M     0  189M   0% /dev/shm
/dev/sda1             490M   34M  457M   7% /mnt/usb

Nota: Las cámaras digitales pueden accederse de la misma forma que los llaveros. El autor de este documento posee una Nikon Coolpix 5200 y obtiene acceso de esta forma. Las cámaras de hoy en día normalmente tienen dos modos para transferir las fotos: Almacenamiento masivo USB y PTP (Protocolo de Transferencia de Imágenes). La cámara está configurada para que se comporte como un dispositivo de almacenamiento masivo y el procedimiento usado es exactamente el mismo para acceder a un llavero USB, motivo por el cual no se explica con detalle. Por favor, note que esto puede que NO funcione en todos los casos y con todas las cámaras digitales que tengan soporte USB.

¿Cómo aparecería un ratón USB en caso de que tenga uno? Lo hará como un dispositivo HID.

Listado de Código 3.3: Ratón óptico USB

# dmesg | grep USB
drivers/usb/input/hid-core.c: v2.0:USB HID core driver
usb 1-1: new low speed USB device using address 2
input: USB HID v1.10 Mouse [Logitech USB-PS/2 Optical Mouse] on usb-0000:00:07.2-1

Otro elegante comando que puede usar para ver el estado de sus puertos USB es lsusb. Es parte de sys-apps/usbutils y será cubierto en el siguiente capítulo.

4.  USB en el espacio del usuario

Herramientas útiles

Hasta ahora hemos visto cuánto soporte de USB existe en el núcleo/sistema en Linux. Ahora prestaremos atención en qué tipo de soporte provee Gentoo para USB en el espacio del usuario.

Una de las herramientas más útiles que hay es lsusb. Esta muestra todos los dispositivos conectados al sistema. Instalarlo es muy simple.

Listado de Código 4.1: Instalar usbutils

# emerge usbutils

Una vez instalado, puede ejecutar lsusb para obtener información simple de los dispositivos USB que están conectados a la máquina.

Nota: Debe ser superusuario en la mayoría de los casos para ejecutar lsusb.

Aviso: lsusb lee la información de los dispositivos USB a partir de /proc/bus/usb. Si no está activado aquello en su núcleo, es posible que lsusb no funcione. Por favor, asegúrese que el soporte del sistema de archivos /proc esté activado en su núcleo y que usbfs esté montado en /proc/bus/usb (lo que debería pasar automáticamente).

Listado de Código 4.2: lsusb en acción

# lsusb
(Este es el llavero USB de 512 MB de Transcend)
Bus 001 Device 003: ID 0c76:0005 JMTek, LLC. USBdisk
(Este es el ratón óptico)
Bus 001 Device 002: ID 046d:c00e Logitech, Inc. Optical Mouse
(Este es el concentrador raíz)
Bus 001 Device 001: ID 0000:0000

Si es de aquellos que disfruta de ver mucha información, tiene la opción de ejecutar lsusb -v. Inténtelo y vea la cantidad de información que se despliega. Otra buena opción es que lsusb muestra la jerarquía física actual de USB como un árbol y por tanto hace más fácil de entender el mapa exacto del dispositivo. El comando es lsusb -t. Por ejemplo,

Listado de Código 4.3: lsusb mostrando la jerarquía USB

# lsusb -t
Bus#  1
`-Dev#   1 Vendor 0x0000 Product 0x0000
  |-Dev#   2 Vendor 0x046d Product 0xc00e
  `-Dev#   3 Vendor 0x0c76 Product 0x0005

Fácilmente puede correlacionar las salidas de lsusb y lsusb -t, que ayuda a la hora de depurar así como entender el funcionamiento de USB.

5.  Agradecimientos ...

Referencias

Me fueron de especial ayuda un buen número de documentos en línea para escribir esto, y algunos de ellos son bastante técnicos pero ciertamente interesantes. Pienso que todos merecen algo de crédito. ¡Así que aquí vamos!

Otros enlaces interesantes