Impedir a reivindicação de novidade do dispositivo usb pelo usbhid para que eu possa controlá-lo com o libusb?

9

Eu tenho um lançador de foguetes USB com o qual gostaria de experimentar libusb. No entanto, o libusb não pode reivindicar a interface; presumivelmente porque a saída das usb-deviceslistas 'usbhid' como o driver do dispositivo.

Ao ler na internet, cheguei à conclusão de que preciso desconectar esse driver do dispositivo para poder usá-lo com o libusb. No entanto, não encontrei uma única maneira definitiva de fazer isso, apenas várias idéias e relatórios de erros diferentes.

Portanto, existe uma maneira de desanexar o driver usbhid de um dispositivo que seja relevante para 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 depois reiniciando. O arquivo ainda está lá, mas não parece estar funcionando.

EDITAR:

Ok, eu tentei isso:

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

Depois disso, navegando para /sys/bus/hid/devices/0003.0A81.0701.0006 e ls, obtém-se:

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 de "driver" como fazia antes, então eu presumo que ele não tenha sido vinculado. No entanto, todas as evidências parecem sugerir que o driver ainda está usbhid. Por exemplo, dispositivos USB produz:

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

O libusb ainda executa o comando -1 novamente em usb_claim_interface () ....

cemitar
fonte

Respostas:

5

Se você simplesmente executar o programa libusb como root,

usb_detach_kernel_driver_np()

realmente funciona como esperado.

cemitar
fonte
2

Eu acho que você precisará adicionar o ID do dispositivo à udevlista negra de modo que nenhum módulo, incluindo o usbhid, seja anexado a ele.

Caleb
fonte
Como exatamente eu faria isso? Perdoe minha falta de experiência, mas este link wiki.archlinux.org/index.php/Blacklisting , ao acessar uma página do udev, não parece estar especificamente associado ao udev e, na verdade, não me diz como lista negra de um dispositivo específico com o ID do produto do fornecedor.
cemulate
Essa página é sobre como colocar um módulo na lista negra de carregamento. Você não quer fazer isso porque precisa do módulo para o teclado e o mouse! O que você deseja é impedir que esse dispositivo específico se associe a ele. Me desculpe, eu não sei a regra udev de imediato. Se eu tiver uma alteração para procurá-la, adicionarei à minha resposta, mas pensei em apontar a direção primeiro.
Caleb
1

Eu 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 membro do grupo plugdev para obter acesso. Não há necessidade de executar como root com esta regra em vigor.

davefiddes
fonte
1

Para mim (Debian sid / stretch), o $idatributo udev está vazio quando eu conecto meu dispositivo USB. É o $kernelque contém a sequência necessária para passar para a desconexão 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 idVendor e idProduct pelos IDs do seu dispositivo, é claro.


Para escrever esse tipo de regra, 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/

Finalmente, $ide $kernelnão são variáveis ​​de shell; eles são substituídos pelo analisador udev. Para obter uma lista completa dessas variáveis, man udevprocure %k.

Jander
fonte