Ngăn chặn yêu cầu thiết bị usb mới lạ bằng usbhid để tôi có thể kiểm soát nó bằng libusb?


9

Tôi có một trình phóng tên lửa USB mà tôi muốn thử nghiệm thông qua libusb. Tuy nhiên, libusb không thể yêu cầu giao diện; có lẽ vì đầu ra của usb-devicesdanh sách 'usbhid' là trình điều khiển cho thiết bị.

Từ việc đọc trên internet, tôi chỉ đưa ra kết luận rằng tôi cần tách trình điều khiển này khỏi thiết bị để tôi có thể sử dụng nó với libusb. Tuy nhiên, tôi đã không tìm thấy một cách dứt khoát duy nhất để làm điều đó, chỉ có một số ý tưởng và báo cáo lỗi khác nhau.

Vậy, có cách nào để tách trình điều khiển usbhid khỏi thiết bị có liên quan đến kernel và các công cụ được cung cấp với Ubuntu 11.04 không?

BIÊN TẬP:

Tôi đã thử tạo tập tin

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

và viết như sau:

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

Lưu, sau đó khởi động lại. Các tập tin vẫn còn đó, nhưng nó dường như không hoạt động.

BIÊN TẬP:

Được rồi, tôi đã thử điều này:

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

Sau đó, điều hướng đến /sys/bus/hid/devices/0003 0A81:0701.0006 và ls mang lại:

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

Nó không còn liệt kê một liên kết "trình điều khiển" như trước đây, vì vậy tôi sẽ cho rằng nó không gắn kết nó. Tuy nhiên, tất cả các bằng chứng dường như cho thấy rằng trình điều khiển vẫn là usbhid. Ví dụ sản lượng thiết bị usb:

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 vẫn truy xuất -1 trên usb_claim_interface () ....

Câu trả lời:


5

Nếu bạn chỉ đơn giản chạy chương trình libusb với quyền root,

usb_detach_kernel_driver_np()

thực sự hoạt động như mong đợi


2

Tôi nghĩ bạn sẽ cần thêm id thiết bị vào udevdanh sách đen để không có mô-đun nào, kể cả usbhid, được gắn vào nó.


Làm thế nào chính xác tôi sẽ đi về điều đó? Xin lỗi vì thiếu kinh nghiệm của tôi, nhưng liên kết này wiki.archlinux.org/index.php/Blacklisting , mà tôi đã truy cập bằng cách theo dõi một trang trên udev, dường như không được liên kết cụ thể với udev và thực sự không cho tôi biết làm thế nào để danh sách đen một thiết bị cụ thể với id sản phẩm của nhà cung cấp.
hỏa táng

Trang đó là về danh sách đen một mô-đun từ tải. Bạn không muốn làm điều đó bởi vì bạn cần mô-đun cho bàn phím và chuột của bạn! Những gì bạn muốn là ngăn thiết bị cụ thể đó liên kết với nó. Tôi xin lỗi tôi không biết quy tắc udev ra tay. Nếu tôi nhận được một sự thay đổi để tìm kiếm nó, tôi sẽ thêm nó vào câu trả lời của mình nhưng tôi nghĩ tôi sẽ chỉ cho bạn hướng đi trước.
Caleb

1

Tôi nghĩ rằng quy tắc udev sau đây sẽ làm những gì bạn muốn:

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

Người dùng của bạn sẽ cần phải là thành viên của nhóm plugdev để có quyền truy cập. Không cần phải chạy bằng root với quy tắc này.


1

Đối với tôi (Debian sid / Stretch), $idthuộc tính udev trống khi tôi cắm thiết bị USB của mình. Đó là $kernelchứa chuỗi cần thiết để chuyển đến hủy liên kết của USBHID.

Dưới đây là các quy tắc udev mà tôi đang sử dụng:

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

Dĩ nhiên, thay thế idVendor và id sản phẩm bằng ID của thiết bị của bạn.


Để viết các loại quy tắc này, lệnh sau sẽ hiển thị cho bạn tất cả các thuộc tính bạn có thể sử dụng (đối với thiết bị USB đã cho):

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

Cuối cùng, $id$kernelkhông phải là biến shell; chúng được thay thế bởi trình phân tích cú pháp udev. Đối với một danh sách đầy đủ của các biến này, man udevvà tìm kiếm %k.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.