Udev가 항상 usbhid 드라이버를 내 장치에 자동으로 바인딩하지 않습니다.

Udev가 항상 usbhid 드라이버를 내 장치에 자동으로 바인딩하지 않습니다.

Ubuntu 19.10을 실행하는 여러 시스템이 있습니다.
모든 시스템에서 감지되는 USB HID 장치가 있고
3개 시스템 모두에서 정확히 동일한 udev 규칙 파일(99-MyDevice.rules)을 사용하고 있습니다.

SUBSYSTEM=="usb",ATTRS{idVendor}=="XXXX",ATTRS{idProduct}=="YYYY",MODE="0660",GROUP="timothy",SYMLINK+="mydevice%n"

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0664", GROUP="timothy"

3개 시스템 모두에서 장치가 /dev/mydevice로 올바르게 나타납니다...

이제 실행하면 lsusb -t다음이 출력됩니다.

Port 4: Dev 3, If 1, Class=Human Interface Device, Driver=, 12M  

비어 있지만 Driver가끔은 실제로 드라이버(제가 원하는 것)를 로드하고 다음을 출력합니다.

Port 4: Dev 3, If 1, Class=Human Interface Device, Driver=usbhid, 12M  

드라이버를 로드한 후 소프트웨어는 장치를 감지하고 사용할 수 있습니다.
문제는 드라이버가 자동으로 로드되는 경우가 거의 없다는 것입니다.

지금까지 드라이버를 수동으로 로드하는 두 가지 방법을 찾았습니다(성공 여부).

방법 1:
다음을 사용하여 드라이버를 수동으로 할당/바인딩할 수 있습니다.

echo -n "4-3:1.0" > /sys/bus/usb/drivers/usbhid/bind

이 시점에서 lsusb -t드라이버가 로드되었음을 표시합니다.

Port 4: Dev 3, If 1, Class=Human Interface Device, Driver=usbhid, 12M

acl그런 다음 이를 사용하려면 /dev/mydevice...를 수정해야 합니다 .

이 접근 방식이 항상 작동하는 것은 아닙니다. 기껏해야 무작위로 느껴집니다.

방법 2:

컴퓨터에서 장치를 논리적으로 연결 해제했다가 다시 연결하십시오.
(물리적으로 연결을 끊는 것이 아니라) VMWare를 설치 하고 장치를 게스트 시스템에 몇 초 동안 연결하여
이 작업을 수행했습니다 .
장치가 호스트에 다시 연결된 후 대부분의 경우 드라이버가
자동으로 바인딩되고 소프트웨어에서 장치를 보거나 사용할 수 있습니다.
(이 접근 방식을 사용하면 아무 것도 수정할 필요가 없습니다 acl.)

몇 가지 참고사항:

  • Raspbian이 설치된 RaspberryPI에서 이 장치를 사용하면 이 문제가 발생하지 않습니다.
  • 동일한 유형의 장치가 여러 개 있는데 이 문제는 모든 장치에서 발생합니다.
  • 이 문제는 Windows에서는 발생하지 않습니다.
  • Windows의 Ubuntu 시스템 가상 머신에서는 이 문제가 발생하지 않습니다.
  • MacOS에서는 이 문제가 발생하지 않습니다.
  • 내가 기억하는 한 이전 버전의 Ubuntu에서도 이런 일이 발생하지 않습니다(완전히 확실하지는 않음).
  • 장치 자체는 STM32F4를 기반으로 합니다.

usbhid매번 운전자를 강제로 묶는 방법을 아시나요 ?

고쳐 쓰다:


장치 를 물리적으로 연결한 후 다음 명령을 실행하면 usbhid드라이버가 매번 올바르게 바인딩되는 것으로 나타났습니다 .

sudo rmmod usbhid && sudo modprobe usbhid

rmmod먼저 사용해야 했지만
단순히 실행하는 것만 으로 modprobe는 문제가 해결되지 않았습니다.

그래서:

  1. 물리적 연결:Driver=, 12MB
  2. 위 명령을 실행합니다.Driver=usbhid, 12MB

이에 따르면원천 드라이버 자체가 지원하는 장치를 선택합니다.

그래서 나는 이 명령으로 인해 usbhid드라이버가
장치를 처리할 수 있는지 여부를 다시 평가하게 된다고 추측합니다.

이제 자동화하는 방법을 알아내야 합니다.

답변1

/etc/modules-load.d/00-my-usbhid.conf에 라인 파일을 생성합니다.

usbhid

모듈이 자동으로 로드되므로 최신 시스템에서는 이 작업이 필요하지 않지만 때로는 모듈을 강제로 로드해야 하는 경우도 있습니다.

다른 모든 방법이 실패하면 커널 부팅 매개변수를 추가해 보세요.

usbhid.quirks=0x0463:0xffff:0x08

도착하다NOGET 특성을 다시 활성화합니다.작동하는지 확인하세요.

https://www.cyberciti.biz/faq/linux-how-to-load-a-kernel-module-automatically-at-boot-time/ https://bugzilla.redhat.com/show_bug.cgi?id=1715504 https://github.com/networkupstools/nut/issues/515

관련 정보