libusbを使用して制御できるようにusbhidが新しいUSBデバイスを宣言するのを防ぎますか?

libusbを使用して制御できるようにusbhidが新しいUSBデバイスを宣言するのを防ぎますか?

libusb経由で使用したいUSBロケットランチャーがありますlibusb。しかし、おそらく出力にusb-devicesデバイスドライバとして "usbhid"がリストされているので、libusbはインターフェイスを宣言できません。

インターネットから読んだ結果、libusbで使用できるようにこのドライバをデバイスから切り離す必要があるという結論に達しました。しかし、私はこれを行う明確な方法を見つけることができず、いくつかの異なるアイデアとバグレポートだけが見つかりました。

もしそうなら、Ubuntu 11.04で提供されているデバイス関連のカーネルとツールからusbhidドライバを切り離す方法はありますか?

編集する:

ファイルを生成しようとしています。

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

そして以下を書いてください:

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

保存して再起動してください。ファイルはまだ存在しますが、まったく機能しないようです。

編集する:

はい、これを試してみました:

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

その後、/sys/bus/hid/devices/0003:0A81:0701.0006とlsに移動すると、次のようになります。

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

以前と同じように、「ドライバ」シンボリックリンクはリストされていないため、バインディングを解放すると仮定します。しかし、すべての証拠によると、ドライバーはまだusbhidのようです。たとえば、usb-devices は以下を生成します。

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はまだusb_claim_interface()で-1のサイズを変更します。

答え1

libusbプログラムをrootとして実行すると、

usb_detach_kernel_driver_np()

実際に期待通りに動作します。

答え2

udevモジュール(usbhidを含む)が接続されないように、ブラックリストにデバイスIDを追加する必要があるようです。

答え3

次のudevルールがあなたの要件を満たすと思います。

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'"

アクセス権を取得するには、ユーザーがPlugdevグループのメンバーである必要があります。このルールを使用すると、rootとして実行する必要はありません。

答え4

$id私(Debian sid / stretch)の場合、USBデバイスを接続するとudev属性が空になります。これには、$kernelバインド解除に必要なUSBHIDに渡された文字列が含まれています。

私が使用するudevルールは次のとおりです。

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'"

もちろん、idVendorとidProductをデバイスIDに置き換えてください。


このタイプのルールを作成するために、次のコマンドは特定の USB デバイスで使用可能なすべての属性を表示します。

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

最後に、これは$idシェル$kernel変数ではなく、udevパーサーに置き換えられます。これらの変数の完全なリストを表示するには、man udevを検索してください%k

関連情報