HID 장치 드라이버를 사용자 정의 드라이버로 교체

HID 장치 드라이버를 사용자 정의 드라이버로 교체

키보드 커널 모듈을 커스텀 모듈로 교체할 수 있는 방법을 찾고 있습니다. 저는 이 목적을 위한 Logitech MK710 키보드 + 마우스 세트와 이 2개의 커넥터가 있는 USB 수신기를 가지고 있습니다. 자동으로 이 USB 수신기는 일부 정보와 함께 기본 또는 모듈로 관리됩니다(참고: usb수신기 장치입니다).usbhidlogitech-hidpp-device1-2

ubuntu@ubuntu-VirtualBox:/sys/bus/usb/devices/1-2$ tree | grep driver
│   ├── driver -> ../../../../../../bus/usb/drivers/usbhid
│   ├── driver -> ../../../../../../bus/usb/drivers/usbhid
│   │   │   ├── driver -> ../../../../../../../../bus/hid/drivers/logitech-hidpp-device
│   │   │   ├── driver -> ../../../../../../../../bus/hid/drivers/logitech-hidpp-device
│   │   ├── driver -> ../../../../../../../bus/hid/drivers/logitech-djreceiver
│   ├── driver -> ../../../../../../bus/usb/drivers/usbhid
├── driver -> ../../../../../bus/usb/drivers/usb

내가 달성하고 싶은 것은 기본 드라이버 대신 커널이 선택할 적절한 모듈을 작성하는 것입니다. 적절한 모듈 별칭을 작성하는 것이 문제라고 생각하지만 아직 아무것도 작동하지 않았기 때문에 확실하지 않습니다. 내가 시도한 것들은 다음과 같습니다:

  • 내 모듈을 /lib/modules/$(uname -r)/kernel/drivers디렉터리에 넣습니다(그 안에 자체 custom하위 디렉터리를 만들고 거기에 .ko 파일을 넣었습니다).

  • 모듈 C 코드의 올바른 별칭을 사용하여 아래 나열된 모든 옵션을 시도했습니다(참고: 내가 사용한 매크로와 해당 값은 내 특정 장치에 대해 올바르게 설정되었습니다) USB_VENDOR_ID.USB_PRODUCT_ID

    static struct hid_device_id mod_table [] = {
        { HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY, USB_VENDOR_ID, USB_PRODUCT_ID) },
        { }                      /* Terminating entry */
    };
    MODULE_DEVICE_TABLE(hid, mod_table);
    

또는

static struct hid_device_id mod_table [] = {
    { HID_USB_DEVICE(USB_VENDOR_ID, USB_PRODUCT_ID) },
    { }                      /* Terminating entry */
};
MODULE_DEVICE_TABLE(hid, mod_table);

그리고

static struct usb_device_id mod_table [] = {
    { USB_DEVICE(USB_VENDOR_ID, USB_PRODUCT_ID) },
    { }                      /* Terminating entry */
};
MODULE_DEVICE_TABLE(usb, mod_table);
  • 디렉토리에서 원본(기본) HID 드라이버 /lib/modules/$(uname -r)/kernel/drivers(상단에 지정한 3개)를 제거합니다.

그러나 커널은 여전히 ​​내 모듈 대신 원래 모듈을 로드하도록 선택합니다. 내 드라이버의 별칭에만 공급업체와 제품 ID가 지정되어 있는지도 확인했지만( modules.alias파일에서 확인) 아무것도 작동하지 않았습니다. 모듈은 libusb라이브러리를 통해(함수를 사용하여) 사용자 공간에서 커널 드라이버를 수동으로 분리하고 내 사용자 정의 모듈을 다시 로드하기로 결정한 경우에만 작동하기 시작했습니다 libusb_detach_kernel_driver. 그런 다음에만 커널이 장치를 내 드라이버와 연결했지만 이는 다음 단계까지만 가능합니다. 시작. 영구적으로, 자동으로 만들고 싶습니다. 전체 개념이 이해하기 쉽고 너무 혼란스럽지 않기를 바랍니다. 미리 감사드립니다.

답변1

initramfs에 문제가 있을 가능성이 높습니다. 원본 HID 드라이버 모듈의 복사본은 설치 시 현재 커널에 저장되어 있으며, 모듈을 추가할 때 initramfs를 재생성하지 않으면 사용자 정의 드라이버 모듈이 거기에 저장하지 마십시오.

부팅 시 시스템이 여전히 initramfs에서 실행 중이고 실제 루트 파일 시스템이 아직 마운트되지 않은 경우 USB 지원 모듈이 먼저 로드됩니다. 따라서 시스템은 여전히 ​​원래 usbhid+ 모듈 조합을 찾고 로드하고 있습니다 logitech-hidpp-device.

Ubuntu를 사용하고 있는 것으로 보이므로 Debian 스타일 sudo update-initramfs -u명령으로 현재 모듈 세트 및 기타 구성 파일을 사용하여 현재 커널 버전의 initramfs를 다시 빌드하는 데 충분해야 합니다.

관련 정보