gpt4 book ai didi

linux - 在键盘热插拔上加载模块

转载 作者:IT王子 更新时间:2023-10-29 00:23:00 25 4
gpt4 key购买 nike

我正在尝试学习如何为 Linux 系统编写模块和驱动程序。类似于 this问题 我正在尝试在 USB 键盘热插拔(下面的代码)上运行一个简单的“Hello World”模块。尽管通过命令 insmodemodprobe 初始化模块似乎有效(dmesg 显示调试消息),但模块在插入时未加载键盘。

我做了什么:

  1. 运行make生成hellomodule.ko文件。
  2. 复制hellomodule.ko文件到/lib/modules/"my_kernel_version"/
  3. 运行 depmod -a 命令。

在这三个步骤之后,我将我的模块添加到 modules.aliasmodules.dep 文件中。还是不行。

这个内核配置错误还是完全不同?

系统:Ubuntu 14.04 LTS;内核:3.14.0

你好模块.c:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/usb.h>
#include <linux/usb/input.h>
#include <linux/hid.h>

MODULE_AUTHOR("author");
MODULE_DESCRIPTION("helloworld module\n");
MODULE_LICENSE("GPL");

static struct usb_device_id hello_id_table [] = {
{ USB_INTERFACE_INFO(USB_INTERFACE_CLASS_HID,
USB_INTERFACE_SUBCLASS_BOOT,
USB_INTERFACE_PROTOCOL_KEYBOARD) },
{ } /* Terminating entry */
};

MODULE_DEVICE_TABLE (usb, hello_id_table);

static int hello_probe(struct usb_interface *interface,
const struct usb_device_id *id)
{
pr_debug("HelloModule: USB keyboard probe function called\n");
return 0;
}

static void hello_disconnect(struct usb_interface *interface)
{
pr_debug("HelloModule: USB keyboard disconnect function called\n");
}

static struct usb_driver hello_driver = {
//.owner = THIS_MODULE,
.name = "hello_driver",
.probe = hello_probe,
.disconnect = hello_disconnect,
.id_table = hello_id_table
};

static int __init hello_init(void)
{
int retval = 0;

pr_debug("HelloModule: Hello World!\n");
retval = usb_register(&hello_driver);
if (retval)
pr_debug("HelloModule: usb_register failed. Error number %d", retval);

return 0;
}

static void __exit hello_exit(void)
{
usb_deregister(&hello_driver);
pr_debug("HelloModule: exit\n");
}

module_init(hello_init);
module_exit(hello_exit);

生成文件:

obj-m := hellomodule.o
CFLAGS_hellomodule.o := -DDEBUG

KDIR := /lib/modules/`uname -r`/build

default:
make -C $(KDIR) M=$(PWD) modules
clean:
make -C $(KDIR) M=$(PWD) clean

最佳答案

我遇到了同样的问题。在我的例子中,这是由 usbhid 模块已经加载引起的,因为我使用的是 USB 鼠标。

如果我理解正确,在 Ubuntu 14.04 中,当连接新设备时加载正确模块的 udev 规则如下(位于 /lib/udev/rules.d/80- drivers.rules):

DRIVER!="?*", ENV{MODALIAS}=="?*", RUN{builtin}="kmod load $env{MODALIAS}"

如您所见,kmod load 仅在新设备​​没有驱动程序时执行。但是,如果 usbhid 已经加载,则刚刚连接的键盘已经有驱动程序。因此,“hello world”模块未加载。

一个可能的解决方案是通过删除 DRIVER!="?*" 条件来修改/覆盖 udev 规则,从而将其变成:

ENV{MODALIAS}=="?*", RUN{builtin}="kmod load $env{MODALIAS}"`.

另一种可能的解决方法是在连接键盘之前卸载 usbhid 模块。当然,这会导致所有 USB 键盘、鼠标和其他 HID 类设备停止工作,直到您连接新键盘。

关于linux - 在键盘热插拔上加载模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23307579/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com