问题描述
我目前正在实现基于 Linux uinput
的 input
设备 (evdev
)“驱动程序”,并且在发送输入事件的同时,我希望它能够接收“输出”事件。
在内核中,input
设备通过 <linux/input.h>
中的 input_dev
表示:
/**
* 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
轻松处理接收到的事件(参见 handling output events):
static struct input_dev *button_dev;
static int button_event(struct input_dev *dev,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
-ing 从 uinput
基于实现管理它显然会违背目的,因为它会消耗自己的事件。
此外,鉴于它可能由所有基于 uinput
的驱动程序共享,来自 poll
的 read
-ing 和 /dev/uinput
-ing(由 {{1} }} 调用)也没有意义;特别是当我们保持 ioctl
-ing 以生成输出事件时。
因此,有没有办法让 write
设备异步处理接收到的事件?如果可能,也可以通过libevdev
完成吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)