在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按钮事件映射到的事件创建一个节点。在只使用一个事件界面的系统中,我可以将fd上的poll()
调用/dev/input/event0
,一切都按预期工作。
现在,我的系统上有第二个外设默认使用/dev/input/event0
,我需要将事件从gpio-keys驱动程序映射到另一个事件。有关如何使用数字/ ID创建事件的任何建议我可以指定然后将其映射到gpio-keys事件?
感谢。
答案 0 :(得分:1)
如果您指的是“mapping”指定/ dev / input / eventX'文件'的名称,则应使用Udev。内核分配事件设备的编号,这是一个坏主意,并且可能无法尝试强制使用此编号,因为您永远不知道哪个其他设备可能首先获得此编号。
我的建议是让Udev创建一个指向你设备的符号链接;您可以选择自己的名称并在程序中使用它(即/ dev / my_first_keypad)。例如,我的Wacom平板电脑被分配了/ dev / wacom,其中包含以下udev规则:
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发行版。
答案 1 :(得分:0)
您可以检查System.map文件以查找注册事件接口的函数。首先出现的那个,通常得到最低的eventX数,后来的函数使eventX数增加1。 IMO,它可以依赖静态设备节点文件用于嵌入式设备,其中设备配置是静态的,并且在操作期间不会改变,但通常你应该使用udev。