blob: 8a4761f1b221772ebcbeaaad4a71e280cc7f817f [file] [log] [blame]
Bing Jiang64847fc2021-11-09 15:42:10 +08001#include <fcntl.h>
2#include <linux/input.h>
3#include <linux/uinput.h>
yanmei.yang17bcb2b2022-01-04 17:36:39 +08004#include <stdio.h>
5#include <stdlib.h>
6#include <string.h>
7#include <sys/stat.h>
Bing Jiang64847fc2021-11-09 15:42:10 +08008#include <sys/time.h>
9#include <sys/types.h>
10#include <unistd.h>
11
yanmei.yang17bcb2b2022-01-04 17:36:39 +080012void simulate_key(int fd, int kval) {
Bing Jiang64847fc2021-11-09 15:42:10 +080013 struct input_event event;
14 int ret;
15
yanmei.yang17bcb2b2022-01-04 17:36:39 +080016 gettimeofday(&event.time, 0);
Bing Jiang64847fc2021-11-09 15:42:10 +080017 event.type = EV_KEY;
18 event.code = kval;
19 event.value = 1;
20 ret = write(fd, &event, sizeof(event));
21
22 event.type = EV_SYN;
23 event.code = SYN_REPORT;
24 event.value = 0;
25 ret = write(fd, &event, sizeof(event));
26
27 memset(&event, 0, sizeof(event));
28 gettimeofday(&event.time, NULL);
29 event.type = EV_KEY;
30 event.code = kval;
31 event.value = 0;
32 ret = write(fd, &event, sizeof(event));
33
34 event.type = EV_SYN;
35 event.code = SYN_REPORT;
36 event.value = 0;
37 ret = write(fd, &event, sizeof(event));
38}
39
yanmei.yang17bcb2b2022-01-04 17:36:39 +080040int main(int argc, char *argv[]) {
Bing Jiang64847fc2021-11-09 15:42:10 +080041 unsigned int keycode;
42 int fd_kbd;
kirk.wangd6c124f2024-07-31 15:43:46 +080043 char eventname[32] = {0};
yanmei.yang17bcb2b2022-01-04 17:36:39 +080044 FILE *fp;
45 const char *deviceInfo = "/proc/bus/input/devices";
46
47 char *p;
yanmei.yang51b906c2022-03-17 15:28:38 +080048 char *buf = 0;
49 size_t readLen = 0;
yanmei.yang17bcb2b2022-01-04 17:36:39 +080050
51 unsigned char foundDev = 0;
Bing Jiang64847fc2021-11-09 15:42:10 +080052
53 if (argc != 2) {
54 printf("Usage: simulate_key keycode\n");
55 return -1;
56 }
57
yanmei.yang17bcb2b2022-01-04 17:36:39 +080058 fp = fopen(deviceInfo, "r");
59 if (fp == NULL) {
60 printf("error to open input devices info\n");
61 return -1;
Bing Jiang64847fc2021-11-09 15:42:10 +080062 }
yanmei.yang17bcb2b2022-01-04 17:36:39 +080063
64 while ((readLen = getline(&buf, &readLen, fp)) != -1) {
65 if (buf) {
66 if (!foundDev) {
67 p = strstr(buf, "N: Name=\"ir_keypad\"");
yanmei.yang948dc012024-09-12 09:52:56 +080068 if (p == NULL) {
69 p = strstr(buf, "N: Name=\"ir_keypad0_0\"");
70 }
yanmei.yang17bcb2b2022-01-04 17:36:39 +080071 if (p != NULL) {
72 foundDev = 1;
73 }
74 } else {
75 p = strstr(buf, "H: Handlers=");
76 if (p != NULL) {
77 p = strstr(buf, "event");
78 char event[8];
79 sscanf(p, "%s", event);
80 sprintf(eventname, "/dev/input/%s", event);
81 break;
82 }
83 }
84 }
85 }
86
87 if (buf) {
88 free(buf);
89 buf = NULL;
90 }
91
92 fclose(fp);
93
94 if (!foundDev) {
95 printf("no input device found\n");
96 return -1;
97 }
98
99 fd_kbd = open(eventname, O_RDWR);
100
Bing Jiang64847fc2021-11-09 15:42:10 +0800101 if (fd_kbd <= 0) {
yanmei.yang17bcb2b2022-01-04 17:36:39 +0800102 printf("error open keyboard %s\n", eventname);
Bing Jiang64847fc2021-11-09 15:42:10 +0800103 return -1;
104 }
105
106 keycode = strtoul(argv[1], NULL, 0);
yanmei.yang17bcb2b2022-01-04 17:36:39 +0800107 printf("send simulate event %s keycode: %d (0x%x)!\n", eventname, keycode,
108 keycode);
Bing Jiang64847fc2021-11-09 15:42:10 +0800109 simulate_key(fd_kbd, keycode);
110
111 close(fd_kbd);
112}