elan touchpad module (not by me)
This commit is contained in:
154
elan-touchpad-manager.c
Normal file
154
elan-touchpad-manager.c
Normal file
@@ -0,0 +1,154 @@
|
|||||||
|
#include <dirent.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <linux/input.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/epoll.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#define TOUCHPAD_NAME "ELAN1206"
|
||||||
|
#define MAX_PATH_LEN 256
|
||||||
|
#define MAX_LINE_LEN 256
|
||||||
|
|
||||||
|
int find_touchpad_event() {
|
||||||
|
DIR *dir;
|
||||||
|
struct dirent *entry;
|
||||||
|
char device_path[MAX_PATH_LEN];
|
||||||
|
int event_num;
|
||||||
|
|
||||||
|
dir = opendir("/sys/class/input");
|
||||||
|
if (dir == NULL) {
|
||||||
|
perror("Error opening /sys/class/input directory");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while ((entry = readdir(dir)) != NULL) {
|
||||||
|
if (strncmp(entry->d_name, "event", 5) == 0) {
|
||||||
|
snprintf(device_path, MAX_PATH_LEN, "/sys/class/input/%s/device/name",
|
||||||
|
entry->d_name);
|
||||||
|
|
||||||
|
if (access(device_path, F_OK) != -1) {
|
||||||
|
FILE *device_file = fopen(device_path, "r");
|
||||||
|
if (device_file != NULL) {
|
||||||
|
char name_content[MAX_LINE_LEN];
|
||||||
|
|
||||||
|
if (fgets(name_content, MAX_LINE_LEN, device_file) != NULL) {
|
||||||
|
size_t len = strlen(name_content);
|
||||||
|
if (len > 0 && name_content[len - 1] == '\n') {
|
||||||
|
name_content[len - 1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strstr(name_content, TOUCHPAD_NAME) != NULL &&
|
||||||
|
strstr(name_content, "Touchpad") != NULL) {
|
||||||
|
|
||||||
|
sscanf(entry->d_name, "event%d", &event_num);
|
||||||
|
|
||||||
|
fclose(device_file);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fclose(device_file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
closedir(dir);
|
||||||
|
return event_num;
|
||||||
|
}
|
||||||
|
int stop_touch_pad() {
|
||||||
|
FILE *fp = fopen("/sys/bus/platform/drivers/idma64/unbind", "w");
|
||||||
|
if (fp == NULL) {
|
||||||
|
perror("Failed to open file");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fprintf(fp, "idma64.1") < 0) {
|
||||||
|
perror("Failed to write to file");
|
||||||
|
fclose(fp);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int start_touch_pad() {
|
||||||
|
FILE *fp = fopen("/sys/bus/platform/drivers/idma64/bind", "w");
|
||||||
|
if (fp == NULL) {
|
||||||
|
perror("Failed to open file");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fprintf(fp, "idma64.1") < 0) {
|
||||||
|
perror("Failed to write to file");
|
||||||
|
fclose(fp);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(fp);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int main() {
|
||||||
|
int touchpad_event = find_touchpad_event();
|
||||||
|
char touchpad_event_path[MAX_PATH_LEN];
|
||||||
|
if (touchpad_event != -1) {
|
||||||
|
snprintf(touchpad_event_path, MAX_PATH_LEN, "/dev/input/event%d",
|
||||||
|
touchpad_event);
|
||||||
|
int fd = open(touchpad_event_path, O_RDONLY | O_NONBLOCK);
|
||||||
|
if (fd < 0) {
|
||||||
|
perror("Failed to open device");
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
int epfd = epoll_create1(0);
|
||||||
|
if (epfd < 0) {
|
||||||
|
perror("epoll_create1 failed");
|
||||||
|
close(fd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
struct epoll_event ev;
|
||||||
|
ev.events = EPOLLIN;
|
||||||
|
ev.data.fd = fd;
|
||||||
|
if (epoll_ctl(epfd, EPOLL_CTL_ADD, fd, &ev) < 0) {
|
||||||
|
perror("epoll_ctl failed");
|
||||||
|
close(epfd);
|
||||||
|
close(fd);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct input_event event;
|
||||||
|
time_t last_event_time = time(NULL);
|
||||||
|
int is_sleeping = 0;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
struct epoll_event events[1];
|
||||||
|
int nfds = epoll_wait(epfd, events, 1, 1000);
|
||||||
|
|
||||||
|
time_t current_time = time(NULL);
|
||||||
|
|
||||||
|
if (!is_sleeping && difftime(current_time, last_event_time) >= 1.0 &&
|
||||||
|
nfds == 0) {
|
||||||
|
is_sleeping = 1;
|
||||||
|
stop_touch_pad();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nfds > 0) {
|
||||||
|
if (read(fd, &event, sizeof(event)) == sizeof(event)) {
|
||||||
|
last_event_time = current_time;
|
||||||
|
|
||||||
|
if (is_sleeping) {
|
||||||
|
is_sleeping = 0;
|
||||||
|
start_touch_pad();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
close(epfd);
|
||||||
|
close(fd);
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
fprintf(stderr, "Touchpad device %s not found\n", TOUCHPAD_NAME);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user