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 프로그램을 루트로 실행하면,

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 그룹의 구성원이어야 합니다. 이 규칙을 사용하면 루트로 실행할 필요가 없습니다.

답변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.

관련 정보