Cegah klaim perangkat usb baru dengan usbhid agar saya dapat mengendalikannya dengan libusb?

9

Saya memiliki peluncur roket USB yang ingin saya coba libusb. Namun, libusb tidak dapat mengklaim antarmuka; mungkin karena keluaran dari usb-devicesdaftar 'usbhid' sebagai driver untuk perangkat.

Dari membaca di internet, saya hanya sampai pada kesimpulan bahwa saya perlu melepaskan driver ini dari perangkat sehingga saya dapat menggunakannya dengan libusb. Namun, saya belum menemukan satu cara pasti untuk melakukan itu, hanya beberapa ide dan laporan bug yang berbeda.

Jadi, apakah ada cara untuk melepaskan driver usbhid dari perangkat yang akan relevan dengan kernel dan alat-alat yang disertakan dengan Ubuntu 11.04?

EDIT:

Saya mencoba membuat file

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

dan menulis yang berikut ini:

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

Menyimpan, lalu me-reboot. File tersebut masih ada, tetapi tampaknya tidak berfungsi sama sekali.

EDIT:

Oke, saya coba ini:

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

Setelah itu, navigasikan ke /sys/bus/hid/devices/0003♥A81/0701.0006 dan ls menghasilkan:

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

Itu tidak lagi mencantumkan symlink "driver" seperti sebelumnya, jadi saya akan berasumsi bahwa itu tidak mengikatnya. Namun, semua bukti tampaknya menunjukkan bahwa pengemudi masih usbhid. Misalnya usb-devices menghasilkan:

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 masih mengembalikan -1 pada usb_claim_interface () ....

mencemari
sumber

Jawaban:

5

Jika Anda cukup menjalankan program libusb sebagai root,

usb_detach_kernel_driver_np()

sebenarnya berfungsi seperti yang diharapkan.

mencemari
sumber
2

Saya pikir Anda perlu menambahkan id perangkat ke udevdaftar hitam sehingga tidak ada modul, termasuk usbhid, yang melekat padanya.

Caleb
sumber
Bagaimana tepatnya saya melakukan hal itu? Maafkan kurangnya pengalaman saya, tetapi tautan ini wiki.archlinux.org/index.php/Blacklisting , yang saya dapatkan dengan mengikuti halaman di udev, tampaknya tidak secara spesifik dikaitkan dengan udev, dan tidak benar-benar memberi tahu saya bagaimana caranya. daftar hitam perangkat tertentu dengan id produk vendor.
Kuburkan
Halaman itu adalah tentang daftar hitam modul dari memuat. Anda tidak ingin melakukan itu karena Anda memerlukan modul untuk keyboard dan mouse Anda! Yang Anda inginkan adalah menghentikan perangkat tertentu itu agar tidak berasosiasi dengannya. Maaf saya tidak tahu aturan udev begitu saja. Jika saya mendapatkan perubahan untuk mencarinya, saya akan menambahkannya ke jawaban saya, tetapi saya pikir saya akan mengarahkan Anda ke arah terlebih dahulu.
Caleb
1

Saya pikir aturan udev berikut akan melakukan apa yang Anda inginkan:

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

Pengguna Anda harus menjadi anggota grup plugdev untuk mendapatkan akses. Tidak perlu dijalankan sebagai root dengan aturan ini di tempat.

davefiddes
sumber
1

Bagi saya (Debian sid / stretch), $idatribut udev kosong ketika saya mencolokkan perangkat USB saya. Ini $kernelberisi string yang diperlukan untuk dilewatkan ke USBHID yang tidak mengikat.

Berikut adalah aturan udev yang saya gunakan:

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

Ganti idVendor dan idProduct dengan ID perangkat Anda, tentu saja.


Untuk menulis aturan semacam ini, perintah berikut akan menunjukkan semua atribut yang dapat Anda gunakan (untuk perangkat USB yang diberikan):

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

Akhirnya, $iddan $kernelbukan variabel shell; mereka digantikan oleh parser udev. Untuk daftar lengkap variabel-variabel ini, man udevdan cari %k.

Jander
sumber