![일반 HID 드라이버 대신 사용자 정의 문자 장치 드라이버에 마우스를 바인딩합니다.](https://linux55.com/image/215899/%EC%9D%BC%EB%B0%98%20HID%20%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84%20%EB%8C%80%EC%8B%A0%20%EC%82%AC%EC%9A%A9%EC%9E%90%20%EC%A0%95%EC%9D%98%20%EB%AC%B8%EC%9E%90%20%EC%9E%A5%EC%B9%98%20%EB%93%9C%EB%9D%BC%EC%9D%B4%EB%B2%84%EC%97%90%20%EB%A7%88%EC%9A%B0%EC%8A%A4%EB%A5%BC%20%EB%B0%94%EC%9D%B8%EB%94%A9%ED%95%A9%EB%8B%88%EB%8B%A4..png)
간단한 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.c
a)를 할당하는 유일한 방법 은 특정 드라이버를 장치에 바인딩하는 것입니다. usb_driver
하지만 제가 틀렸을 수도 있습니다.