일반 HID 드라이버 대신 사용자 정의 문자 장치 드라이버에 마우스를 바인딩합니다.

일반 HID 드라이버 대신 사용자 정의 문자 장치 드라이버에 마우스를 바인딩합니다.

간단한 Linux USB 마우스 드라이버를 작성하려고 하는데 실제로 마우스에서 모듈로 정보를 가져오는 데 문제가 있습니다.

이제 커널에 성공적으로 로드할 수 있는 커널 모듈이 생겼습니다. 모듈은 파일을 통해 액세스할 수 있는 문자 장치이며 /dev/mymodule, 모듈에 쓰고 읽으면 내가 구현한 함수가 호출됩니다.

그러나 마우스에서 이 캐릭터 드라이버로 데이터를 공급하는 방법을 이해할 수 없습니다. 읽을 수 있는 마우스에 대한 별도의 파일이 있으며 /dev/input, 마우스에 대한 항목을 보면 마우스가 드라이버를 /sys/bus/hid/devices/사용하고 실제 마우스처럼 작동한다는 것을 알 수 있습니다 .hid-generic

마우스에서 문자 장치 드라이버를 사용하려면 어떻게 해야 합니까? (내 컴퓨터에 연결된 다른 마우스보다는 이 마우스를 선호합니다.) 제가 기본적인 내용을 잘못 이해한 것 같습니다.

시도했지만 작동하지 않았던 것들:

  • MODULE_ALIAS(<content of /sys/bus/hid/devices/<mouse>/modalias>)모듈 소스에 추가되었습니다 .
  • MODULE_DEVICE_TABLE다음을 추가하세요 .
static struct hid_device_id mod_table [] = {
        {HID_USB_DEVICE(1532, 0043)},
        {}
};

MODULE_DEVICE_TABLE(hid, mod_table);

두 경우 모두 별칭이 module.alias뒤에 표시되지만 depmod아무 작업도 수행하지 않는 것 같습니다.

제가 시도한 또 다른 것은 unbind범용 드라이버였지만 마우스를 캐릭터 드라이버에 바인딩하는 방법을 모르겠습니다. 이 상황에 대해 구현해야 할 다른 것이 있습니까?

어떤 도움이라도 대단히 감사하겠습니다.

답변1

나는 또한 최근에이 문제에 직면했습니다. struct usb_driver모듈에 드라이버를 등록했지만 하나도 등록하지 않은 것 같습니다 hid_driver. 편집: 이런, 나는 당신이 문자 드라이버를 작성하고 있다는 것을 어떻게든 놓쳤습니다.

linux/drivers/hid/hid-generic.c(사용자 정의 드라이버보다 먼저 호환성을 확인하는) 드라이버의 소스 코드를 보면 bus_for_each_drv해당 기능에서 match매크로를 호출하는 것을 볼 수 있습니다. 이는 지정된 버스( hid_bus_type이 경우) 에 등록된 각 드라이버를 반복하고 hid_device가장 최근에 삽입된 장치를 나타내는 구조 인스턴스가 id드라이버 ID 테이블(해당 테이블) hid_device_id의 s와 일치하는지 확인합니다.

여기서 중요한 점은 드라이버가 등록되어 있지 않으면 hid_driver추가로 테이블을 제공하고 모듈 별칭을 생성하더라도 이 루프에 포함되지 않는다는 것입니다. hid_device_id동일한 매크로를 호출 하고 루프를 통과하는 각 드라이버에 대한 문자열을 bus_for_each_drv인쇄하는 콜백 함수를 전달하는 간단한 커널 모듈을 작성하여 이를 직접 확인할 수 있습니다. drv->name간단한 예는 다음과 같습니다.

#include <linux/init.h>
#include <linux/module.h>
#include <linux/hid.h>

MODULE_LICENSE("GPL");

static int __print_driver_name(struct device_driver *drv, void *data)
{
        printk("%s", drv->name);
        return 0;
}

static int __init init_list_hid_drivers(void)
{
        printk("list_hid_drivers module loaded. Drivers:\n");
        bus_for_each_drv(&hid_bus_type, NULL, NULL, __print_driver_name);

        return 0;
}

static void __exit exit_list_hid_drivers(void)
{
        printk("list_hid_drivers module unloaded");
}

module_init(init_list_hid_drivers);
module_exit(exit_list_hid_drivers);                                         

매우 간단한 구현을 위해 hid-generic.c 드라이버를 템플릿으로 사용할 수 있습니다 hid_driver.

hid_device_probe의 기능을 간략하게 살펴보면 HID가 아닌 일부 드라이버(예: HID 장치에 linux/drivers/hid/hid-core.ca)를 할당하는 유일한 방법 은 특정 드라이버를 장치에 바인딩하는 것입니다. usb_driver하지만 제가 틀렸을 수도 있습니다.

관련 정보