我正在开发带有触摸屏的嵌入式 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驱动程序类似的逻辑来报告事件。
这证实了我这是一个正确的方向。
其次,我改变了测试方式如下,
- 记录屏幕触摸的完整事件。
- 通过写入 来重播所有事件
/dev/input/event0
。 - 检查屏幕以确认其可以通过手指进行触摸。