将鼠标绑定到自定义字符设备驱动程序而不是通用 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.aliasafter中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中的函数可以看出linux/drivers/hid/hid-core.c,分配一些非 HID 驱动程序(例如 ausb_driver到 HID 设备)的唯一方法是将特定驱动程序绑定到您的设备,这应该避免必须经过任何这些匹配过程,但我对此可能是错误的。

相关内容