我目前正在实现一个uinput
基于Linux 的input
设备(evdev
)“驱动程序”,并且除了发送输入事件之外,我希望它能够接收“输出”事件。
在内核中,input
设备通过input_dev
from表示<linux/input.h>
:
/**
* struct input_dev - represents an input device
* [...]
* @event: event handler for events sent _to_ the device, like EV_LED
* or EV_SND. The device is expected to carry out the requested
* action (turn on a LED, play sound, etc.) The call is protected
* by @event_lock and must not sleep
* [...]
*/
struct input_dev {
/* ... */
int (*event)(struct input_dev *dev, unsigned int type, unsigned int code, int value);
/* ... */
};
以便内核驱动程序可以通过设置轻松处理接收到的事件input_dev::event
(请参阅处理输出事件):
static struct input_dev *button_dev;
static int button_event(struct input_dev *dev, unsigned int type, unsigned int code, int value)
{
/*
* handle event received from userspace
*/
return 0;
}
static int __init button_init(void)
{
int error;
/* ... */
button_dev = input_allocate_device();
/* ... */
button_dev->event = button_event; // <---- here
error = input_register_device(button_dev);
/* ... */
return 0;
}
static void __exit button_exit(void)
{
input_unregister_device(button_dev);
/* ... */
}
module_init(button_init);
module_exit(button_exit);
在用户空间中,设备通过基于 - 的界面uinput
进行设置和管理。ioctl
假设“输出”事件是通过write
-ing 从客户端代码发送到设备文件(这是正确的吗?),read
从uinput
基于 - 的实现管理它的文件中 -ing 显然会破坏目的,因为它会消耗自己的事件.
此外,考虑到它可能由所有uinput
基于 - 的驱动程序共享,poll
-ing 和read
-ing from /dev/uinput
(由ioctl
调用使用)也没有意义;特别是当我们一直write
使用它来生成输出事件时。
因此,有没有办法让uinput
设备异步处理接收到的事件?如果可能,是否也可以通过libevdev
?