web-dev-qa-db-ja.com

usbhidがUSBデバイスを要求しないようにする

直接関連: libusbで制御できるように、usbhidによる新規USBデバイスの要求を防止しますか?

Libusb-0.1を使用するプログラムからRFIDリーダー(HIDデバイスとして機能)にアクセスしたい。コードでは、カーネルドライバーはusb_detach_kernel_driver_np(エラーなし)で正しく切り離されていますが、私のプログラムがUSBデバイスにアクセスしようとするたびに、usbhidモジュールがそれを再利用しているようです。次のエラーは常にdmesgに表示されます:

usb 1-1.3:usbfs: 'MyProgram'が構成#1を設定しているときにusbhidがインターフェイス0を要求

次のudevルールを追加し、udevdを再起動してデバイスを再接続しましたが、効果はありません。デバイスがusbhidによって使用されないようにブラックリストに登録することになっています。

# I anonymized the vendor/product IDs here
ATTRS{idVendor}=="dead", ATTRS{idProduct}=="beef", OPTIONS=="ignore_device"

Dmesg出力とは別に、/sys/bus/usb/drivers/usbhid/でデバイス1-1.3:1.0が毎回再作成されるため、ブラックリストが機能していないようです。

他に何か試してみませんか?オペレーティングシステムは、カーネル3.2.27を搭載したRaspbian(Raspberry Pi上)です。

6
AndiDog

私は問題のこの部分を解決しました:

  • OPTIONS=="ignore_device"がカーネルから削除されました( commit
  • blacklist usbhidは何もせず、キーボードもブロックしていません
  • Usbhidがモジュールとしてコンパイルされていないため、options usbhid quirks=0xdead:0xbeef:0x0004を含む/etc/modprobe.d内の構成ファイルは機能しませんでした

したがって、usbhid.quirks=0xdead:0xbeef:0x4をブートコマンドラインに追加し(Raspbianでは/boot/cmdline.txtにあります)、usbhidはデバイスをバインドしなくなりました。


しかし、私の元々の問題はまだ残っています。 RFIDリーダーに初めてアクセスすると、常に読み取り/タイムアウトエラーが発生します。

3
AndiDog

同じ問題があり、次のようにudevルールファイルの変更を解決しました。

SUBSYSTEM=="input", GROUP="input", MODE="0666"
SUBSYSTEM=="usb", ATTRS{idVendor}=="4242", ATTRS{idProduct}=="e131", MODE:="666", GROUP="users"

これで、libusb関数を使用してRFIDロガーを読み取ることができます。

1
maicho