1

在 Linux 中,如何创建具有用户指定事件编号的输入事件接口并将其映射到特定设备事件?

我正在使用 gpio-keys 驱动程序来翻译键盘上的按键。我定义了要在我的板配置源文件中使用的键,如下所示

static struct gpio_keys_button ev_keys[] = {
    [0] = {
        .type           = EV_KEY,
        .active_low     = 1,
        .wakeup         = 0,
        .debounce_interval  = KEYS_DEBOUNCE_MS,
        .code           = KEY_MUTE,
       .desc           = "mute", 
       .gpio           = PUSHBUTTON_MUTE, 
    }
};

并将其注册到内核。

我在构建内核时启用了事件接口和 GPIO 按钮。

Device Drivers ---> Input device support --> Event interface

Device Drivers ---> Input device support --> Keyboards --> GPIO buttons

/dev/input/event0这将为 GPIO 按钮事件映射到的事件创建一个节点。在一个只使用一个事件接口的系统中,我可以调用poll()fd/dev/input/event0并且一切都按预期工作。

现在,我的系统上有第二个/dev/input/event0默认使用的外围设备,我需要将事件从 gpio-keys 驱动程序映射到另一个事件。关于如何使用我可以指定的数字/ID 创建事件然后将其映射到 gpio-keys 事件的任何建议?

谢谢。

4

2 回答 2

2

如果你的意思是“映射”指定 /dev/input/eventX '文件'的名称,你应该使用 Udev。内核分配事件设备的编号,这是一个坏主意,并且可能无法尝试强制使用此编号,因为您永远不知道哪个其他设备可能首先获得了此编号。

我的建议是让 Udev 创建一个指向您设备的符号链接;你可以选择你自己的名字并在你的程序中使用它(即/dev/my_first_keypad)。例如,我的 Wacom 数位板使用以下 udev 规则分配 /dev/wacom:

KERNEL=="event*", SUBSYSTEM=="input", SUBSYSTEMS=="input", ATTRS{name}=="Wacom Volito", SYMLINK+="wacom"

诀窍是找到合适的变量集来准确指定您的键盘。如果它是基于 USB 的,供应商/产品 ID 是一个好的开始。否则,用于udevadm info --export-db获取 Udev 数据库的完整转储。Udev 规则位于 /etc/udev/rules.d/ 或 /lib/udev.d 中的文件中,具体取决于您使用的 Linux 发行版。

于 2013-09-11T10:51:06.897 回答
0

您可以检查 System.map 文件以获取注册事件接口的功能。首先出现的通常会获得最低的 eventX 编号,而后面的函数会将 eventX 编号增加一。IMO,对于设备配置是静态的并且在操作期间不会更改的嵌入式设备,可以依赖静态设备节点文件,但通常您应该使用 udev 来满足您的目的。

于 2013-09-12T10:30:07.973 回答