diff --git a/power/power-feature.c b/power/power-feature.c index 1834c35..614b75e 100644 --- a/power/power-feature.c +++ b/power/power-feature.c @@ -14,7 +14,9 @@ * limitations under the License. */ +#include #include +#include #include #include "power-feature.h" @@ -23,10 +25,47 @@ #include #include +int open_ts_input() { + int fd = -1; + DIR *dir = opendir("/dev/input"); + + if (dir != NULL) { + struct dirent *ent; + + while ((ent = readdir(dir)) != NULL) { + if (ent->d_type == DT_CHR) { + char absolute_path[PATH_MAX] = {0}; + char name[80] = {0}; + + strcpy(absolute_path, "/dev/input/"); + strcat(absolute_path, ent->d_name); + + fd = open(absolute_path, O_RDWR); + if (ioctl(fd, EVIOCGNAME(sizeof(name) - 1), &name) > 0) { + if (strcmp(name, "fts_ts") == 0 || strcmp(name, "goodix_ts") == 0 || + strcmp(name, "NVTCapacitiveTouchScreen") == 0) + break; + } + + close(fd); + fd = -1; + } + } + + closedir(dir); + } + + return fd; +} + void set_device_specific_feature(feature_t feature, int state) { switch (feature) { case POWER_FEATURE_DOUBLE_TAP_TO_WAKE: { - int fd = open(TAP_TO_WAKE_EVENT_NODE, O_WRONLY); + int fd = open_ts_input(); + if (fd == -1) { + ALOGW("DT2W won't work because no supported touchscreen input devices were found"); + return; + } struct input_event ev; ev.type = EV_SYN; ev.code = SYN_CONFIG; diff --git a/power/power-feature.h b/power/power-feature.h index 3f2ab19..b4c3ef6 100644 --- a/power/power-feature.h +++ b/power/power-feature.h @@ -16,7 +16,5 @@ #define LOG_TAG "libpower_feature.davinci" -#define TAP_TO_WAKE_EVENT_NODE "/dev/input/event2" - #define INPUT_EVENT_WAKUP_MODE_OFF 4 #define INPUT_EVENT_WAKUP_MODE_ON 5