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
.