Evitar reivindicar o dispositivo usb novidade por usbhid para que eu possa controlá-lo com libusb?

8

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 () ....

    
por cemulate 28.05.2011 / 19:34

4 respostas

4

Se você simplesmente executar o programa libusb como root,

usb_detach_kernel_driver_np()

funciona como esperado.

    
por 30.05.2011 / 00:23
2

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.

    
por 28.05.2011 / 19:47
1

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.

    
por 08.04.2012 / 14:08
0

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 .

    
por 19.05.2015 / 17:30