如何作为 uinput 设备接收事件?

问题描述

我目前正在实现基于 Linux uinputinput 设备 (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 的驱动程序共享,来自 pollread-ing 和 /dev/uinput-ing(由 {{1} }} 调用)也没有意义;特别是当我们保持 ioctl-ing 以生成输出事件时。

因此,有没有办法让 write 设备异步处理接收到的事件?如果可能,也可以通过libevdev完成吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)