linux linux-kernel usb kernel mouse

¿Qué controladores usa el mouse usb en Linux Kernel?



linux-kernel (2)

El controlador del dispositivo es usbhid .

Para evitar que se HID_QUIRK_IGNORE a su dispositivo, agregue una entrada HID_QUIRK_IGNORE a drivers/hid/usbhid/hid-quirks.c , o use el parámetro quirks del módulo usbhid .

Leí del capítulo 14 de LDD3 sobre los controladores de conexión en caliente. Necesito escribir un controlador usb para el mouse que se carga cuando enchufo el hardware. Ahora, haciendo un experimento, me doy cuenta de que hay un controlador llamado "hid-generic" que se llama cuando se desconecta la clavija.

[ 6654.232046] usb 3-1: new low-speed USB device number 3 using uhci_hcd [ 6654.462061] usb 3-1: New USB device found, idVendor=093a, idProduct=2510 [ 6654.462067] usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 6654.462071] usb 3-1: Product: USB OPTICAL MOUSE [ 6654.462074] usb 3-1: Manufacturer: PIXART [ 6654.489316] input: PIXART USB OPTICAL MOUSE as /devices/pci0000:00/0000:00:1d.1/usb3/3-1/3-1:1.0/input/input12 [ 6654.489445] hid-generic 0003:093A:2510.0004: input,hidraw0: USB HID v1.10 Mouse [PIXART USB OPTICAL MOUSE] on usb-0000:00:1d.1-1/input0

También lsmod muestra,

Module Size Used by hid_generic 12541 0 usbhid 47259 0 hid 105241 2 hid_generic,usbhid psmouse 102541 0

Mis dudas son las siguientes,

1) Para hacer que mi módulo cargue (hotplug) cuando este mouse se enchufa, tengo que desactivar estos 3 controladores en kernel y construir kernel completo con mi controlador con el proveedor y el ID del dispositivo en id_table. ¿Derecha?

2) También leí acerca de los controladores de núcleo USB y los controladores de dispositivos USB. ¿Entonces estos controladores HID son controladores básicos o controladores de dispositivos?

3) ¿Cuáles son los controladores principales y el controlador de dispositivo en caso de un mouse USB? ¿Y dónde puedo encontrarlos en la fuente del kernel?

Gracias, Sunil.


Trataré de responder a tus preguntas una por una:

1) Para hacer que mi módulo cargue (hotplug) cuando este mouse se enchufa, tengo que desactivar estos 3 controladores en kernel y construir kernel completo con mi controlador con el proveedor y el ID del dispositivo en id_table. ¿Derecha?

Sí, pero hay algunas cosas adicionales que debes cuidar. Primero, comprenda cómo se carga un módulo particular (controlador). La clave para esto es MODULE_DEVICE_TABLE(usb, &my_id_table); Cada vez que se "instala" un módulo en particular (usando make modules_install ), se make modules_install una entrada, de acuerdo con la tabla de id aprobada en MODULE_DEVICE_TABLE en /lib/modules/<your_kernel>/modules.usbmap y /lib/modules/<your_kernel>/modules.dep Archivo /lib/modules/<your_kernel>/modules.dep (busque la cadena "usbhid" en los archivos). Cada vez que se detecta un nuevo dispositivo usb, el kernel lee estos archivos para encontrar los parámetros coincidentes. Si se encuentra, el siguiente módulo se carga desde la ruta correspondiente encontrada en /lib/modules/<your_kernel>/modules.dep que contiene la información. sobre la ruta donde se encuentra el controlador y también sus dependencias.

Entonces, ahora incluso si descarga (rmmod) usbhid del kernel, se volverá a cargar cuando vuelva a insertar el mouse. Para evitar que esto suceda, debe modificar esos archivos, es decir, eliminar las entradas de los archivos. Para hacerlo, "mueva" el controlador usbhid desde su ruta original (generalmente ubicado en /lib/modules/<your_kernel>/kernel/drivers/hid/usbhid/usbhid.ko a un lugar seguro. Ahora reconstruya las dependencias de modo que el las entradas se eliminarán de los archivos de dependencia.

Ahora necesita crear entradas de su controlador. ¡Simplemente instale su controlador y listo!

Entonces, para resumir:

$ sudo rmmod usbhid # Unload the usb mouse driver $ cd /lib/modules/$(uname -r)/ # Move to your current kernel $ vim modules.usbmap # Check for the "usbhid" string $ vim modules.dep # Check for "usbhid.ko:" string $ sudo mv kernel/drivers/hid/usbhid/usbhid.ko ~/Desktop # Take backup of your current usb mouse driver $ sudo depmod -a # Rebuild the dependency files

Ahora revisa los archivos de dependencia para la cadena "usbhid" nuevamente. No debería estar allí!

$ cd /path/to/your/driver $ sudo make modules_install # Install your driver into /lib/modules/$(uname -r)/extra $ sudo depmod -a # Rebuild the dependency files

Después de este paso, busque la cadena correspondiente a su módulo en los archivos de dependencia, ¡y debería estar allí! A partir de este momento, cada vez que inserte el mouse (o desde el propio arranque) se cargará su controlador, en lugar del original.

Una vez que haya terminado de jugar con su controlador, puede copiar el archivo usbhid original a su destino original y reconstruir los archivos de dependencia ( sudo depmod -a )

Ahora también veo que está tratando de usar la identificación del proveedor y del dispositivo para que coincida con su dispositivo, en cuyo caso, el controlador funcionaría solo para su mouse. La forma recomendada es usar identificadores de clase, lo que hace que el controlador funcione para cualquier mouse usb.

2) También leí acerca de los controladores de núcleo USB y los controladores de dispositivos USB. ¿Entonces estos controladores HID son controladores básicos o controladores de dispositivos?

usbhid es básicamente un "controlador de dispositivo". La clasificación de los controladores podría resumirse como: controladores de núcleo, controladores de host y controladores de dispositivo:

Controladores de dispositivo: este es el software utilizado para controlar los dispositivos. Por ejemplo, ratón usb, tarjeta de ethernet basada en pci, usb pendrive, acelerómetro basado en i2c.

Controladores del controlador de host: este es el software escrito para controlar el controlador de bus. Por ejemplo, controladores de host USB (EHCI, UHCI, OHCI, etc.), controlador de host PCI, maestros I2C, etc.

Controladores principales: en realidad, estos combinan los controladores discutidos anteriormente. Algunos ejemplos son el núcleo USB, el núcleo PCI, etc. Los controladores principales proporcionan rutinas auxiliares (API) para que el dispositivo y el controlador del controlador de host puedan hacer uso de ellos (¡concepto de apilamiento de módulos!). Estos son los que vinculan el dispositivo correcto con su controlador. Hay muchos otros servicios proporcionados por los controladores principales.

Código de ejemplo para el controlador de dispositivo USB:

http://lxr.free-electrons.com/source/drivers/hid/usbhid/usbmouse.c

Puede encontrar los Controladores del Controlador USB Host en:

http://lxr.free-electrons.com/source/drivers/usb/host/

USB Core reside aquí: http://lxr.free-electrons.com/source/drivers/usb/core/

¡Creo que esto también responde a tu tercera pregunta!

Espero que esto haya ayudado.