0

我目前正在实现一个uinput基于Linux 的input设备(evdev)“驱动程序”,并且除了发送输入事件之外,我希望它能够接收“输出”事件。

在内核中,input设备通过input_devfrom表示<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 从客户端代码发送到设备文件(这是正确的吗?),readuinput基于 - 的实现管理它的文件中 -ing 显然会破坏目的,因为它会消耗自己的事件.

此外,考虑到它可能由所有uinput基于 - 的驱动程序共享,poll-ing 和read-ing from /dev/uinput(由ioctl调用使用)也没有意义;特别是当我们一直write使用它来生成输出事件时。

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

4

0 回答 0