/dev/input/eventX에 작성하여 Linux에서 터치 이벤트를 시뮬레이션하는 방법은 무엇입니까?

/dev/input/eventX에 작성하여 Linux에서 터치 이벤트를 시뮬레이션하는 방법은 무엇입니까?

저는 터치 스크린이 있는 임베디드 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/event0TS 드라이버와 유사한 논리를 사용하여 이벤트를 보고한다는 사실을 발견했습니다.
이것은 나에게 이것이 올바른 방향이라는 것을 확인시켜주었습니다.

둘째, 테스트 방식을 다음과 같이 변경했습니다.

  1. 화면 터치의 전체 이벤트를 기록합니다.
  2. 를 작성하여 모든 이벤트를 재생합니다 /dev/input/event0.
  3. 화면을 확인하여 손가락으로 터치할 수 있는지 확인하세요.

관련 정보