첫 번째 배경. Logitech 게임 패널 장치용 드라이버를 개발 중입니다. 스크린이 있는 키보드 입니다. 드라이버는 제대로 작동하지만 장치는 기본적으로 HID에 의해 처리됩니다. HID가 운전자보다 먼저 장치를 장악하는 것을 방지하기 위해 hid-core.c에서 해당 장치를 블랙리스트에 올릴 수 있습니다. 이것은 효과가 있지만 최선의 해결책은 아닙니다. 왜냐하면 저는 여러 사람과 함께 일하고 있고 우리 모두는 지속적으로 HID 모듈을 패치해야 하기 때문입니다. 특히 initramfs 등을 재구축하는 일이 자주 포함되기 때문에 이는 자질구레한 일이 되고 있습니다.
나는 이 문제에 관해 조사를 좀 하다가 발견했습니다.이 메일링 리스트 게시물, 결국에는 나를 그곳으로 데려가세요LWN에 대한 이 기사. 이는 런타임 시 장치를 특정 드라이버에 바인딩하는 메커니즘을 설명합니다. 이것이 바로 나에게 필요한 것 같습니다.
그래서 한번 시도해 보았습니다. HID에서 키보드 바인딩을 해제할 수 있었습니다. 이는 예상대로 작동하므로 더 이상 입력할 수 없습니다. 하지만 드라이버에 바인딩하려고 하면 "오류: 해당 장치가 없습니다"라는 메시지가 표시되고 작업이 실패합니다.
그래서 내 질문은: hid-core에서 HID 장치를 블랙리스트에 추가하고 자체 드라이버를 제공할 때 발생하는 일을 복제하기 위해 커널 바인딩/바인딩 해제 작업을 어떻게 사용할 수 있습니까? - 즉, 교체하려면 hid-core.c를 항상 패치해야 합니까?
우리 드라이버의 소스는 여기에 있습니다:https://github.com/ali1234/lg4l
답변1
글쎄, 답은 바로 내 앞에 있다는 것이 밝혀졌습니다.
첫째, 사용자 정의 드라이버를 사용하든 일반적으로 장치를 대신하는 일반 드라이버를 사용하든 궁극적으로 USB가 아닌 HID에 의해 제어됩니다.
이전에 HID에서 바인딩을 해제하려고 시도했지만 그렇게 되지 않았습니다. HID에는 하위 드라이버가 있으며, 전용 드라이버가 없는 장치를 대신하는 드라이버를 범용 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
내가 말했듯이, 이 두 가지 주요 정보는 장치가 바인딩될 때 온라인에 나타나는 처음 두 가지 정보이기 때문에 내 얼굴을 똑바로 쳐다보십시오...