다른 hid 드라이버가 채택한 hid 인터페이스에 hid 범용 드라이버를 바인딩하는 방법은 무엇입니까?

다른 hid 드라이버가 채택한 hid 인터페이스에 hid 범용 드라이버를 바인딩하는 방법은 무엇입니까?

내가 직면한 문제에 대한 간략한 배경. 저는 USB 브리지 FT260을 사용하여 동기식 UART/I2C 작업을 구현하는 중입니다. 칩은 HID 보고를 사용하여 이러한 기능을 제공합니다. 연결되면 hid 범용 드라이버는 두 개의 인터페이스, 즉 0과 1을 감지합니다. 첫 번째는 I2C용이고 두 번째는 UART용입니다. 현재 나는FT260 드라이버I2C 지원오직모듈로 로드됨(예:ft260 숨기기) 잘 작동합니다. 그런 다음 후자가 숨겨진 일반을 인수했다고 생각합니다.USBHID이에 대한 책임을 지십시오. lsusb -t반품:

|__ Port 2: Dev 3, If 1, Class=Human Interface Device, Driver=usbhid, 12M
|__ Port 2: Dev 3, If 0, Class=Human Interface Device, Driver=usbhid, 12M

dmesg시작하면 다음이 표시됩니다.

hid-generic 0003:0403:6030.0001: hidraw0: USB HID v1.11 Device [FTDI FT260] on usb-xhci-hcd.1.auto-1.2
hid-generic 0003:0403:6030.0002: hidraw1: USB HID v1.11 Device [FTDI FT260] on usb-xhci-hcd.1.auto-1.2
ft260 0003:0403:6030.0001: hidraw0: USB HID v1.11 Device [FTDI FT260] on usb-xhci-hcd.1.auto-1.2/input
ft260 0003:0403:6030.0002: hidraw1: USB HID v1.11 Device [FTDI FT260] on usb-xhci-hcd.1.auto-1.2/input

UART의 경우 hid-generic과 함께 작동하는 애플리케이션을 사용해야 합니다. I2C용 드라이버는 UART를 지원하도록 확장될 수 있지만(아마도 가상 COM 포트로) 그렇게 간단하지는 않으며(적어도 내 생각에는) 사용하고 싶은 작업 코드가 있고 프로젝트의 나머지 부분에서 계속 작업하고 싶습니다. .

다음을 사용하여 인터페이스 UART 바인딩을 해제하려고 하면:

echo -n 0003:0403:6030.0002 > /sys/bus/hid/drivers/ft260/unbind

바인딩이 사라지는 것을 볼 수 있습니다. 그러나 정확한 인터페이스(1인 경우)를 바인딩하려고 하면일반 숨기기

echo -n 0003:0403:6030.0002 > /sys/bus/hid/drivers/hid-generic/bind

나는 얻다:

-bash: echo: write error: No such device

다음 명령을 사용하여 hid-ft260 모듈을 제거하면 hid-generic이 자동으로 로드됩니다(핫 스왑).

modprobe -r hid-ft260

usbhid가 PID 및 VID를 기반으로 한 번에 하나의 하위 드라이버를 잠그는 것처럼 들리지만 다른 것일 수도 있습니다. 이 문제를 우회하는 방법에 대한 통찰력이 있다면 매우 도움이 될 것입니다. 감사해요.

답변1

좋아, 나에게 도움이 되는 답변을 추가하겠습니다. 그것은 밝혀일반 숨기기hid_generic_match두 번째 bool 매개변수를 허용 하는 콜백 함수(커널 5.4.70)를 제공하세요 ignore_special_driver. 이 값이 설정되면(ignore_special_driver=1) 일치 함수가 반환되고 true조사됩니다. 금후,일반 숨기기ft260의 uart 인터페이스에 연결할 수 있습니다.USBHID결국 그것은 그것과 아무 관련이 없습니다.

내 설정에서는 모듈이일반 숨기기그리고ft260 숨기기재부팅 후 시작ft260 숨기기두 인터페이스를 모두 제어합니다. 그래서 위에 게시된 문제를 해결하기 위해 다음을 수행합니다.

echo 1 > /sys/module/hid/parameters/ignore_special_drivers
echo -n "0003:0403:6030.0002" > /sys/bus/hid/drivers/ft260/unbind

핫 플러깅으로 인해 사용 가능한 HID-UART 인터페이스에서 hid-generic이 성공적으로 감지되었습니다.

hid-generic 0003:0403:6030.0002: hidraw1: USB HID v1.11 Device [FTDI FT260] on usb-xhci-hcd.1.auto-1.2/input1

바인딩은 다음과 같이 확인할 수도 있습니다.

root@root:~# ls /sys/bus/hid/drivers/ft260/
0003:0403:6030.0001  bind  module  new_id  uevent  unbind
root@root:~# ls /sys/bus/hid/drivers/hid-generic/
0003:0403:6030.0002  bind  module  new_id  uevent  unbind

udev이 작업을 자동화하는 규칙을 만들 수 있습니다.

논평: ignore_special_driver=1감지하기 전인 경우ft260 숨기기, VID와 PID가 일치하더라도 ft260 드라이버는 두 인터페이스 중 하나에 바인딩되지 않습니다.

관련 정보