USB-HID 장치에 Linux 커널 드라이버 바인드 / 바인드 해제 인터페이스를 사용하는 방법은 무엇입니까?


26

첫 번째 배경. Logitech 게임 패널 장치 용 드라이버를 개발 중입니다. 화면이있는 키보드입니다. 드라이버는 잘 작동하지만 기본적으로 장치는 HID에 의해 처리됩니다. HID가 드라이버보다 먼저 장치를 인계받지 않도록 hid-core.c에 블랙리스트에 올릴 수 있습니다. 이것은 효과가 있지만 여러 사람들과 함께 일할 때 가장 좋은 해결책은 아니며 우리 모두가 종종 initramfs 등을 재구성하는 것과 같이 HID 모듈을 계속 패치해야합니다.

나는이 문제에 대한 몇 가지 연구를했고 나는 발견 이 메일 링리스트 게시물 결국에 데려 갔다, LWN에이 기사를 . 런타임에 장치를 특정 드라이버에 바인딩하는 메커니즘에 대해 설명합니다. 이것은 내가 필요한 것 같습니다.

그래서 나는 그것을 시도했다. 키보드를 HID에서 바인딩 해제 할 수있었습니다. 이것은 효과가 있었고 예상대로 더 이상 입력 할 수 없었습니다. 그러나 드라이버에 바인딩하려고하면 "오류 : 해당 장치 없음"이 표시되고 작업이 실패합니다.

그래서 내 질문은 : 어떻게 커널 바인드 / 언 바인드 작업을 사용하여 HID 장치를 hid-core로 블랙리스트에 추가하고 자신의 드라이버를 제공 할 때 발생하는 일을 복제합니까? -즉-hid-core.c를 항상 패치 할 필요성을 대체 할 것인가?

드라이버의 소스는 다음과 같습니다 : https://github.com/ali1234/lg4l

답변:


27

좋아, 대답이 나를 쳐다보고 있었다는 것이 밝혀졌다.

첫째, 사용자 지정 드라이버를 사용하든 일반적으로 장치를 인계받는 일반 드라이버를 사용하든 USB가 아닌 HID로 제어됩니다.

이전에는 HID에서 바인딩을 해제하려고 시도했지만 방법이 아닙니다. HID에는 특수 드라이버가없는 장치를 대신하는 하위 드라이버가 generic-usb라고합니다. 이것이 hid-g19에 바인딩하기 전에 바인딩을 해제하는 데 필요한 것입니다. 또한 "1-1.1 : 1.1"로 보이는 USB 주소가 아니라 "0003 : 046d : c229.0036"으로 보이는 HID 주소를 사용해야했습니다.

따라서 리 바인딩하기 전에 dmesg에서 이것을 볼 수 있습니다.

generic-usb 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

그런 다음

echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/generic-usb/unbind
echo -n "0003:046D:C229.0036" > /sys/bus/hid/drivers/hid-g19/bind

그런 다음 dmesg에서 봅니다.

hid-g19 0003:046D:C229.0036: input,hiddev0,hidraw4: USB HID v1.11 Keypad [Logitech G19 Gaming Keyboard] on usb-0000:00:13.2-3.2/input1

내가 말했듯이, 두 가지 핵심 정보가 장치가 바인딩 될 때 라인의 첫 번째 두 가지이기 때문에 나를 쳐다 본다.


해당 공급 업체 / 제품이 드라이버와 호환되도록 드라이버에서 지정 했습니까? 또는 "바인드"가 단순히 문제를 강요합니까? 블랙리스트에 올린 장치에 대해 "이러한 장치가 없습니다"라는 메시지가 표시되지만 강제로 바인딩하고 싶습니다. 블랙리스트를 이미징하는 것은 "자동 바인딩 방지"가 아니라 "바인딩 바인딩 방지"라는 이미지입니다. 무엇 "유형의 것.
dmansfield

바인드로 강제 실행하므로 드라이버 소스에서 ID를 요구할 필요가 없습니다. 그러나 자동으로로드하려는 경우입니다.
ali1234

내가 어려움을 겪고 있었던 두 가지 이유 : 첫째, 장치가 커널의 hid_ignore_list에 나열되어 있으므로 "숨겨진"바인딩을받지 않습니다. 커널 명령 행에 "usbhid.quirks = 0x0b0e : 0x0412 : 0x40000000"을 추가하고 재부팅해야했습니다. 플래그 0x40000000은 "무시하지 마십시오". 둘째, ID "0003 : 046D : C229.0036"의 마지막 부분은 '0036'입니다. 이것이 무엇을 의미합니까? 확실하지 않다. 그것을 찾는 유일한 방법은 이미 바인딩 된 다음 바인딩을 해제하고 리 바인드하는 것입니다.
dmansfield

자동 리 바인드 방법을 찾았습니까?
Vladius

내 자동 리 바인딩 솔루션을 추가했습니다 : unix.stackexchange.com/a/475277/96686
Vladius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.