libusb
を使って実験したいUSBロケットランチャーを持っています。ただし、libusbはインターフェースを要求できません。おそらくusb-devices
の出力がデバイスのドライバーとして「usbhid」をリストするためです。
インターネットで読んだところ、このドライバーをデバイスから切り離して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
以前のように「ドライバー」シンボリックリンクがリストされなくなったため、バインド解除されたと思います。しかし、すべての証拠は、運転手がまだ不審であることを示唆しているようです。たとえば、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を返します。
Rootとしてlibusbプログラムを実行すると、
usb_detach_kernel_driver_np()
実際に期待どおりに動作します。
Usbhidを含むモジュールが接続されないように、udev
のブラックリストにデバイスIDを追加する必要があると思います。
私(Debian sid/stretch)では、udev $id
USBデバイスを接続すると、属性が空になります。 $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
。
次の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として実行する必要はありません。