首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用自定义驱动程序替换HID设备驱动程序

用自定义驱动程序替换HID设备驱动程序
EN

Unix & Linux用户
提问于 2022-01-23 23:37:41
回答 1查看 794关注 0票数 2

我正在寻找一种将我的键盘内核模块替换为自定义模块的方法。我有一个罗技MK710键盘+鼠标设置,有一个带有这两个接口的USB接收器。自动地,此USB接收器由默认的usbusbhidlogitech-hidpp-device模块管理,有一些信息(注意:1-2是接收设备):

代码语言:javascript
复制
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_IDUSB_PRODUCT_ID是我使用的宏,它们的值是为我的特定设备正确设置的):静态结构hid_device_id mod_table [] ={ HID_DEVICE(HID_BUS_ANY,HID_GROUP_ANY,USB_VENDOR_ID,USB_PRODUCT_ID) },{} /*终止条目*/ };MODULE_DEVICE_TABLE(hid,mod_table);

代码语言:javascript
复制
static struct hid_device_id mod_table [] = {
    { HID_USB_DEVICE(USB_VENDOR_ID, USB_PRODUCT_ID) },
    { }                      /* Terminating entry */
};
MODULE_DEVICE_TABLE(hid, mod_table);

代码语言:javascript
复制
static struct usb_device_id mod_table [] = {
    { USB_DEVICE(USB_VENDOR_ID, USB_PRODUCT_ID) },
    { }                      /* Terminating entry */
};
MODULE_DEVICE_TABLE(usb, mod_table);
  • /lib/modules/$(uname -r)/kernel/drivers目录中删除原始(默认) HID驱动程序(在顶部指定的3位驱动程序)。

然而,内核仍然选择加载原始模块而不是我自己的模块。我甚至确保只有我的驱动程序的别名指定了供应商和产品in (在modules.alias文件中检查它),但是没有任何工作。只有当我决定通过libusb库(使用libusb_detach_kernel_driver函数)手动从用户空间中分离内核驱动程序并重新加载我自己的自定义模块时,该模块才能开始工作--只有在内核将设备与我的驱动程序关联起来时,但这才是下一次引导。我想把它永久化,甚至是自动的。我希望整个概念是可以理解的,不要太混乱。提前谢谢。

EN

回答 1

Unix & Linux用户

回答已采纳

发布于 2022-01-24 08:57:27

很可能您正被initramfs绊倒:在安装当前内核时,原始HID驱动模块的副本已经存储在其中,如果在添加模块时没有重新生成initramfs,则您的自定义驱动模块将不在其中。

在引导时,USB支持模块是首批加载的模块之一,此时系统仍在initramfs上运行,而真正的根文件系统尚未挂载。因此,系统仍在寻找和加载原来的usbhid + logitech-hidpp-device模块组合。

您似乎在使用Ubuntu,因此Debian样式的sudo update-initramfs -u命令应该足以使用当前的一组模块和其他配置文件重新构建当前内核版本的initramfs。

票数 3
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/687623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档