¿Evitar que usbhid reclame un dispositivo usb novedoso para poder controlarlo con libusb?

9

Tengo un lanzador de cohetes USB con el que deseo experimentar libusb. Sin embargo, libusb no puede reclamar la interfaz; presumiblemente porque la salida de las usb-deviceslistas 'usbhid' como el controlador del dispositivo.

Después de leer en Internet, solo llegué a la conclusión de que necesito desconectar este controlador del dispositivo para poder usarlo con libusb. Sin embargo, no he encontrado una sola forma definitiva de hacerlo, solo varias ideas diferentes e informes de errores.

Entonces, ¿hay alguna forma de desconectar el controlador usbhid de un dispositivo que sería relevante con el kernel y las herramientas suministradas con Ubuntu 11.04?

EDITAR:

Traté de crear el archivo

/etc/udev/rules.d/10-usbhid.rules

y escribiendo lo siguiente:

ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0701", OPTIONS=="ignore_device"

Guardando, luego reiniciando. El archivo todavía está allí, pero no parece estar funcionando en absoluto.

EDITAR:

Bien, probé esto:

sudo -i
echo -n "0003:0A81:0701.0006" > /sys/bus/hid/drivers/generic-usb/unbind

Después de eso, navegando a /sys/bus/hid/devices/0003:0A81:0701.0006 y ls produce:

drwxr-xr-x 2 root root    0 2011-05-29 15:46 power
lrwxrwxrwx 1 root root    0 2011-05-29 13:19 subsystem ->       ../../../../../../../../../bus/hid
-rw-r--r-- 1 root root 4096 2011-05-29 13:19 uevent

Ya no enumera un enlace simbólico de "controlador" como lo hizo antes, por lo que supongo que lo desvincula. Sin embargo, toda la evidencia parece sugerir que el controlador todavía está usbhid. Por ejemplo, los dispositivos usb producen:

T:  Bus=02 Lev=03 Prnt=07 Port=00 Cnt=01 Dev#=  9 Spd=1.5 MxCh= 0
D:  Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs=  1
P:  Vendor=0a81 ProdID=0701 Rev=00.01
S:  Manufacturer=Dream Link
S:  Product=USB Missile Launcher v1.0
C:  #Ifs= 1 Cfg#= 1 Atr=a0 MxPwr=100mA
I:  If#= 0 Alt= 0 #EPs= 1 Cls=03(HID  ) Sub=00 Prot=00 Driver=usbhid

libusb todavía vuelve a ejecutar -1 en usb_claim_interface () ....

cemulate
fuente

Respuestas:

5

Si simplemente ejecuta el programa libusb como root,

usb_detach_kernel_driver_np()

En realidad funciona como se esperaba.

cemulate
fuente
2

Creo que necesitará agregar la identificación del dispositivo a udevla lista negra para que ningún módulo, incluido usbhid, se adjunte a él.

Caleb
fuente
¿Cómo exactamente haría eso? Disculpe mi falta de experiencia, pero este enlace wiki.archlinux.org/index.php/Blacklisting , al que llegué siguiendo una página en udev, no parece estar específicamente asociado con udev, y en realidad no me dice cómo poner en la lista negra un dispositivo en particular con la identificación del producto del proveedor.
cementar
Esa página se trata de poner en la lista negra un módulo de carga. ¡No quieres hacer eso porque necesitas el módulo para tu teclado y mouse! Lo que desea es evitar que ese dispositivo en particular se asocie con él. Lo siento, no sé la regla de udev de la mano. Si obtengo un cambio para buscarlo, lo agregaré a mi respuesta, pero pensé que primero lo señalaría en la dirección.
Caleb
1

Creo que la siguiente regla de udev hará lo que quieras:

SUBSYSTEM=="usb", ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0701", MODE="0660", GROUP="plugdev", RUN="/bin/sh -c 'echo -n $id:1.0 > /sys/bus/usb/drivers/usbhid/unbind'"

Su usuario deberá ser miembro del grupo plugdev para obtener acceso. No hay necesidad de ejecutar como root con esta regla en su lugar.

davefiddes
fuente
1

Para mí (Debian sid / stretch), el $idatributo udev está vacío cuando conecto mi dispositivo USB. Es $kernelque contiene la cadena necesaria para pasar a la desvinculación de USBHID.

Aquí están las reglas de udev que estoy usando:

SUBSYSTEM=="usb", ATTRS{idVendor}=="0000", ATTRS{idProduct}=="0000", MODE="0660", GROUP="plugdev"
ATTRS{idVendor}=="0000", ATTRS{idProduct}=="0000", DRIVER="usbhid", RUN="/bin/sh -c 'echo -n $kernel >/sys/bus/usb/drivers/usbhid/unbind'"

Reemplace idVendor e idProduct con las ID de su dispositivo, por supuesto.


Para escribir este tipo de reglas, el siguiente comando le mostrará todos los atributos que puede usar (para el dispositivo USB dado):

udevadm info -a /sys/bus/usb/devices/1-3:1.0/

Finalmente, $idy $kernelno son variables de shell; son reemplazados por el analizador udev. Para obtener una lista completa de estas variables, man udevbusque %k.

Jander
fuente