/dev/input/eventXに書いてLinuxでタッチイベントをシミュレートする方法は?

/dev/input/eventXに書いてLinuxでタッチイベントをシミュレートする方法は?

私はタッチスクリーン付きの組み込みLinux(カーネル5.10.24)を開発しています。
それでは、タッチスクリーンに対応する/dev/input/eventXに書き込んでタッチイベントをトリガーしたいと思います。

どのイベントをシミュレートしたいかを知るために、まず画面をタッチしてイベントを収集します。その後、これらのイベントをコードにハードコードし、1つずつ/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. 画面を確認して指でタッチできることを確認してください。

関連情報