Se você simplesmente executar o programa libusb como root,
usb_detach_kernel_driver_np()
funciona como esperado.
Eu tenho um lançador de foguetes USB que eu gostaria de experimentar com libusb
. No entanto, a libusb não pode reivindicar a interface; presumivelmente porque a saída de usb-devices
lista 'usbhid' como o driver para o dispositivo.
De ler na internet, eu só cheguei à conclusão de que eu preciso separar este driver do dispositivo para que eu possa usá-lo com a libusb. No entanto, eu não encontrei uma única maneira definitiva para fazer isso, apenas várias idéias diferentes e relatórios de bugs.
Então, existe uma maneira de separar o driver usbhid de um dispositivo que seria relevante com o kernel e as ferramentas fornecidas com o Ubuntu 11.04?
EDITAR:
Eu tentei criar o arquivo
/etc/udev/rules.d/10-usbhid.rules
e escrevendo o seguinte:
ATTRS{idVendor}=="0a81", ATTRS{idProduct}=="0701", OPTIONS=="ignore_device"
Salvando e reinicializando. O arquivo ainda está lá, mas parece que não está funcionando.
EDITAR:
Ok, tentei isso:
sudo -i
echo -n "0003:0A81:0701.0006" > /sys/bus/hid/drivers/generic-usb/unbind
Depois disso, navegue para /sys/bus/hid/devices/0003:0A81:0701.0006 e ls rende:
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
Ele não lista mais um link simbólico "driver" como antes, então eu diria que ele não está vinculado. No entanto, todas as evidências parecem sugerir que o motorista ainda é usbhid. Por exemplo, os dispositivos usb produzem:
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 ainda retém -1 em usb_claim_interface () ....
Acho que você precisará adicionar o ID do dispositivo à lista negra de udev
para que nenhum módulo, incluindo o usbhid, seja anexado a ele.
Acho que a seguinte regra do udev fará o que você deseja:
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'"
Seu usuário precisará ser um membro do grupo plugdev para obter acesso. Não há necessidade de executar como root com esta regra.
Para mim (Debian sid / stretch), o atributo udev $id
está vazio quando eu conecto meu dispositivo USB. É $kernel
que contém a string necessária para passar ao unbHH do USBHID.
Aqui estão as regras do udev que estou 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'"
Substitua o idVendor e idProduct pelos IDs do seu dispositivo, é claro.
Para escrever esses tipos de regras, o comando a seguir mostrará todos os atributos que você pode usar (para o dispositivo USB fornecido):
udevadm info -a /sys/bus/usb/devices/1-3:1.0/
Por fim, $id
e $kernel
não são variáveis do shell; eles são substituídos pelo analisador do udev. Para obter uma lista completa dessas variáveis, man udev
e pesquise %k
.