Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Creación de drivers
para dispositivos USB
1. USB
1.1. Descriptores de un dispositivo
1.2. Comunicación con dispositivo
1.3. Modos de transferencia de información
2. Kernel vs. Libusb
3. Introducción a Usbfs
3.1. Libusb
4. Creación de un driver de ratón
5. Otros ejemplos de drivers
5.1. Ingeniería inversa
5.2. Lanzamisiles
6. Bibliografía
Enero 2009 Rafa Muñoz Cárdenas 2
1. USB
El Universal Serial Bus es un puerto que sirve para conectar periféricos a una
computadora.
Fue creado en 1996 por siete empresas: IBM, Intel, Northern Telecom, Compaq,
Microsoft, Digital Equipment Corporation y NEC.
Objetivos:
Permitir la conexión de periféricos en una sola interfaz de socket
estandarizada.
Mejorar la capacidad “plug-and-play” (permitiendo así el “hot swapping”).
Suministrar a través del mismo puerto energía a dispositivos de bajo
consumo.
4 versiones:
1.0: Tasa de transferencia de hasta 1'5 Mbps (192 KB/s). Utilizado en
teclados, ratones y joysticks.
1.1: Tasa de transferencia de hasta 12 Mbps (1'5 MB/s).
2.0: Tasa de transferencia de hasta 480 Mbps (60 MB/s).
3.0: Tasa de transferencia de hasta 4.8 Gbps (600 MB/s).
Libusb driver
Fácil de programar.
Esconde detalles innecesarios al programador.
Reduce el tamaño de los programas de forma notable.
Código portable a otras plataformas.
Drivers dispersos por internet (escasos grandes repositorios).
La comunicación con periféricos es más lenta respecto a drivers en kernel.
No válida para periféricos complejos.
Para simplificar aún más la programación sobre Usbfs, podemos hacer uso de las
librerías Libusb (C/C++) y jUSB (Java). Ambas corren sobre esta capa software en
sistemas GNU/Linux.
$lsusb -v
Bus 002 Device 004: ID 046d:c001 Logitech, Inc. N48/M-BB48 [FirstMouse Plus]
Device Descriptor:
......
idVendor 0x046d Logitech, Inc.
idProduct 0xc001 N48/M-BB48 [FirstMouse Plus]
......
bNumConfigurations 1
Configuration Descriptor:
......
bNumInterfaces 1
......
(Bus Powered)
Remote Wakeup
MaxPower 50mA
Interface Descriptor:
......
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
BinterfaceSubClass 1 Boot Interface Subclass
bInterfaceProtocol 2 Mouse
iInterface 0
......
Endpoint Descriptor:
bLength 7
bDescriptorType 5
bEndpointAddress 0x81 EP 1 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0008 1x 8 bytes
BInterval 10
Observando la salida de “lsusb -v” podemos empezar a crear nuestro driver usando la
librería Libusb.
raton.c:
return NULL;
}
Ahora declaramos las estructuras del dispositivo y lo buscamos usando la función anteriormente declarada:
int main() {
struct usb_device *dev;
struct usb_dev_handle *udev;
dev = find_device(VENDOR, PRODUCT);
udev = usb_open(dev);
usb_detach_kernel_driver_np(udev, dev->config->interface->altsetting->bInterfaceNumber);
Probamos el programa:
$ g++ -Wall -W raton.c -o driver_raton -L/usr/lib/ -lusb
$ sudo ./driver_raton
Buscando raton USB...
¡Encontrado!
Deshabilitando driver de raton...
Fabricante: Logitech
Nombre del producto: USB Mouse
Numero de serie de dispositivo: ?
Direccion de endpoint: 0x81
0 -1 0 0
0 -2 0 0
0 -1 0 0
0 -1 -1 0
0 -1 0 0
0 -1 0 0
1000
3000
Cerrando dispositivo.
Necesitamos crear drivers de dispositivos complejos a los que hay que enviar señales
de control para poder interactuar con ellos o URB's.
Un programa conocido para “espiar” la información que circula por los buses USB es
SnoopyPro.
El procedimiento para capturar información revelante es el siguiente:
1. Iniciamos SnoopyPro y señalamos la interfaz a monitorizar.
2. Realizamos una acción simple con el dispositivo.
3. Guardamos la salida obtenida de realizar la acción simple.
4. Volvemos a realizar la acción simple con el periférico reiniciado para
asegurarnos y guardamos de nuevo el log con la salida.
Ahora podríamos ser capaces de crear nuestro driver para controlar el lanzamisiles.
int send_message(char* msg, int index) {
int j = usb_control_msg(launcher,
0x21,
0x9,
0x200,
index,
msg, // movimiento arriba/derecha/etc.
8, //bytes
1000); // timeout
return j;
}
1. USB
http://en.wikipedia.org/wiki/USB
http://free-electrons.com/doc/linux-usb.pdf
http://www.tech-pro.net/intro_usb.html
http://www.fujitsu.com/downloads/EU/es/soporte/discosduros/UnpaseoporUSBMSD.pdf
http://catarina.udlap.mx/u_dl_a/tales/documentos/lep/ordaz_g_r/capitulo2.pdf
Linux Device Drivers, Third Edition (O'Reilly): http://lwn.net/Kernel/LDD3/
http://www.lrr.in.tum.de/Par/arch/usb/download/usbdoc/usbdoc-1.32.pdf
2. Kernel vs. Libusb
http://www.freesoftwaremagazine.com/articles/drivers_linux?page=0%2C0
http://www.linuxquestions.org/questions/linux-kernel-70/kernel-driver-vs-libusb-662647/
http://www.nabble.com/Write-Linux-USB-Driver-td14913265.html
3. Introducción a Usbfs
http://www.linuxforums.org/forum/linux-tutorials-howtos-reference-material/10865-develop
http://libusb.wiki.sourceforge.net/
http://en.wikipedia.org/wiki/Libusb
http://www.linux-usb.org/USB-guide/x173.html