저는 터치 스크린이 있는 임베디드 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
/dev/input/eventX에 쓰기 위해 처음 7개 이벤트(EV_SYN 포함)를 하드코딩했습니다.
#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에 기록하여 터치 이벤트를 시뮬레이션할 수 있는지 잘 모르겠습니다. 그렇다면 이 작업을 수행할 때 무엇을 놓치고 있습니까?
Android용 sendevent/getevent 도구가 없는데 이 작업을 직접 수행하고 싶습니다.
답변1
많은 테스트와 실험 끝에 마침내 이벤트 주입이 작동하게 되었습니다.
먼저 입력 장치 및 터치 스크린 장치 드라이버에 대한 커널 코드를 확인한 결과 쓰기가 /dev/input/event0
TS 드라이버와 유사한 논리를 사용하여 이벤트를 보고한다는 사실을 발견했습니다.
이것은 나에게 이것이 올바른 방향이라는 것을 확인시켜주었습니다.
둘째, 테스트 방식을 다음과 같이 변경했습니다.
- 화면 터치의 전체 이벤트를 기록합니다.
- 를 작성하여 모든 이벤트를 재생합니다
/dev/input/event0
. - 화면을 확인하여 손가락으로 터치할 수 있는지 확인하세요.