如何在Linux中通过写入/dev/input/eventX来模拟触摸事件?

如何在Linux中通过写入/dev/input/eventX来模拟触摸事件?

我正在开发带有触摸屏的嵌入式 Linux(内核 5.10.24)。
现在我想通过写入触摸屏对应的/dev/input/eventX来触发触摸事件。

为了找出我想要模拟的事件,我首先通过触摸屏幕来收集事件。然后我将这些事件硬编码在代码中,并将它们一一写入到/dev/input/eventX中。

以下是我从触摸中得到的事件。

~ # ./touchevent
timeS=1651152027,timeUS=312095,type=3,code=57,value=50
timeS=1651152027,timeUS=312095,type=3,code=53,value=218
timeS=1651152027,timeUS=312095,type=3,code=54,value=1223
timeS=1651152027,timeUS=312095,type=3,code=48,value=54
timeS=1651152027,timeUS=312095,type=3,code=58,value=54
timeS=1651152027,timeUS=312095,type=1,code=330,value=1
timeS=1651152027,timeUS=312095,type=0,code=0,value=0
timeS=1651152027,timeUS=448388,type=3,code=57,value=-1
timeS=1651152027,timeUS=448388,type=1,code=330,value=0
timeS=1651152027,timeUS=448388,type=0,code=0,value=0

我对前 7 个事件(包括 EV_SYN)进行了硬编码以写入 /dev/input/eventX。

#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <linux/input.h>
int main( void )
{
        int                     fd;
        int                     ret;
        struct input_event      event;

        fd = open( "/dev/input/event0", O_RDWR);
        if ( fd < 0 )
        {
                perror( "/dev/input/event0" );
                return(-1);
        }

        event.type = 3;
        event.code = 53;
        event.value = 218;
        ret     = write( fd, &event, sizeof(struct input_event) );
        printf("ret: %d\n", ret);

        event.type = 3;
        event.code = 54;
        event.value = 1223;
        ret     = write( fd, &event, sizeof(struct input_event) );
        printf("ret: %d\n", ret);

        event.type = 3;
        event.code = 48;
        event.value = 54;
        ret     = write( fd, &event, sizeof(struct input_event) );
        printf("ret: %d\n", ret);

        event.type = 3;
        event.code = 58;
        event.value = 54;
        ret     = write( fd, &event, sizeof(struct input_event) );
        printf("ret: %d\n", ret);

        event.type = 1;
        event.code = 330;
        event.value = 1;
        ret     = write( fd, &event, sizeof(struct input_event) );
        printf("ret: %d\n", ret);

        event.type = 0;
        event.code = 0;
        event.value = 0;
        ret     = write( fd, &event, sizeof(struct input_event) );
        printf("ret: %d\n", ret);

        close( fd );
.....
}

当我在目标上运行代码时,触摸屏没有预期的响应。
我不确定是否可以通过写入 /dev/input/eventX 来模拟触摸事件,如果可以,我在执行此操作时错过了什么?

我没有 Andriod 的 sendevent/getevent 工具,我想自己做这件事。

答案1

经过大量的测试和试验,我终于使事件注入起作用了。
首先,我检查了输入设备和触摸屏设备驱动程序的内核代码,我发现写入/dev/input/event0使用与TS驱动程序类似的逻辑来报告事件。
这证实了我这是一个正确的方向。

其次,我改变了测试方式如下,

  1. 记录屏幕触摸的完整事件。
  2. 通过写入 来重播所有事件/dev/input/event0
  3. 检查屏幕以确认其可以通过手指进行触摸。

相关内容