blob: 8a4761f1b221772ebcbeaaad4a71e280cc7f817f [file] [log] [blame]
#include <fcntl.h>
#include <linux/input.h>
#include <linux/uinput.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
void simulate_key(int fd, int kval) {
struct input_event event;
int ret;
gettimeofday(&event.time, 0);
event.type = EV_KEY;
event.code = kval;
event.value = 1;
ret = write(fd, &event, sizeof(event));
event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
ret = write(fd, &event, sizeof(event));
memset(&event, 0, sizeof(event));
gettimeofday(&event.time, NULL);
event.type = EV_KEY;
event.code = kval;
event.value = 0;
ret = write(fd, &event, sizeof(event));
event.type = EV_SYN;
event.code = SYN_REPORT;
event.value = 0;
ret = write(fd, &event, sizeof(event));
}
int main(int argc, char *argv[]) {
unsigned int keycode;
int fd_kbd;
char eventname[32] = {0};
FILE *fp;
const char *deviceInfo = "/proc/bus/input/devices";
char *p;
char *buf = 0;
size_t readLen = 0;
unsigned char foundDev = 0;
if (argc != 2) {
printf("Usage: simulate_key keycode\n");
return -1;
}
fp = fopen(deviceInfo, "r");
if (fp == NULL) {
printf("error to open input devices info\n");
return -1;
}
while ((readLen = getline(&buf, &readLen, fp)) != -1) {
if (buf) {
if (!foundDev) {
p = strstr(buf, "N: Name=\"ir_keypad\"");
if (p == NULL) {
p = strstr(buf, "N: Name=\"ir_keypad0_0\"");
}
if (p != NULL) {
foundDev = 1;
}
} else {
p = strstr(buf, "H: Handlers=");
if (p != NULL) {
p = strstr(buf, "event");
char event[8];
sscanf(p, "%s", event);
sprintf(eventname, "/dev/input/%s", event);
break;
}
}
}
}
if (buf) {
free(buf);
buf = NULL;
}
fclose(fp);
if (!foundDev) {
printf("no input device found\n");
return -1;
}
fd_kbd = open(eventname, O_RDWR);
if (fd_kbd <= 0) {
printf("error open keyboard %s\n", eventname);
return -1;
}
keycode = strtoul(argv[1], NULL, 0);
printf("send simulate event %s keycode: %d (0x%x)!\n", eventname, keycode,
keycode);
simulate_key(fd_kbd, keycode);
close(fd_kbd);
}