diff --git a/libevdev/libevdev.c b/libevdev/libevdev.c index 3a82fc7..48b49b1 100644 --- a/libevdev/libevdev.c +++ b/libevdev/libevdev.c @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include @@ -126,6 +127,26 @@ libevdev_dflt_log_func(enum libevdev_log_priority priority, vfprintf(stderr, format, args); } +static void +fix_invalid_absinfo(const struct libevdev *dev, + int axis, + struct input_absinfo* abs_info) +{ + /* + * The reported absinfo for ABS_MT_TRACKING_ID is sometimes + * uninitialized for certain mtk-soc, due to init code mangling + * in the vendor kernel. + */ + if (axis == ABS_MT_TRACKING_ID && + abs_info->maximum == abs_info->minimum) { + abs_info->minimum = -1; + abs_info->maximum = 0xFFFF; + log_bug(dev, + "Device \"%s\" has invalid ABS_MT_TRACKING_ID range", + dev->name); + } +} + /* * Global logging settings. */ @@ -431,6 +452,8 @@ libevdev_set_fd(struct libevdev* dev, int fd) if (rc < 0) goto out; + fix_invalid_absinfo(dev, i, &abs_info); + dev->abs_info[i] = abs_info; } }