私はタッチスクリーン付きの組み込み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/event0
TSドライバと同様のロジックを使用してイベントを報告することを発見しました。
これは私にこれが正しい方向であることを確認しました。
次に、テスト方法を次のように変更しました。
- 画面タッチの全イベントを記録します。
- を作成してすべてのイベントを再生します
/dev/input/event0
。 - 画面を確認して指でタッチできることを確認してください。