input: touchscreen: touchscreen_mmi: implement double tap detection

Uses single tap and detects whether it's been triggered twice.

Change-Id: I722b74e900e521be9a1bf2eb62c8a7226b269717
Signed-off-by: Sevenrock <sevenrock@hotmail.de>
This commit is contained in:
Cosmin Tanislav 2022-06-21 13:30:22 +03:00 • committed by Michael Bestas
commit d6d69a4fb4
No known key found for this signature in database
4 changed files with 67 additions and 0 deletions

View file

@ -408,6 +408,36 @@ static ssize_t gesture_store(struct device *dev,
return size;
}
static DEVICE_ATTR(gesture, (S_IWUSR | S_IWGRP | S_IRUGO), gesture_show, gesture_store);
static ssize_t double_tap_enabled_show(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct ts_mmi_dev *touch_cdev = dev_get_drvdata(dev);
return snprintf(buf, PAGE_SIZE, "%u\n",
!!(touch_cdev->gesture_mode_type & TS_MMI_GESTURE_SINGLE));
}
static ssize_t double_tap_enabled_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
{
struct ts_mmi_dev *touch_cdev = dev_get_drvdata(dev);
gesture_set(touch_cdev, TS_MMI_GESTURE_SINGLE, buf[0] != '0');
return count;
}
static DEVICE_ATTR_RW(double_tap_enabled);
static ssize_t double_tap_pressed_show(struct device *dev,
struct device_attribute *attr,
char *buf)
{
struct ts_mmi_dev *touch_cdev = dev_get_drvdata(dev);
return snprintf(buf, PAGE_SIZE, "%u\n", touch_cdev->double_tap_pressed);
}
static DEVICE_ATTR_RO(double_tap_pressed);
#endif
/*
@ -493,6 +523,8 @@ static struct attribute *sysfs_class_attrs[] = {
#endif
#ifdef CONFIG_BOARD_USES_DOUBLE_TAP_CTRL
&dev_attr_gesture.attr,
&dev_attr_double_tap_enabled.attr,
&dev_attr_double_tap_pressed.attr,
#endif
&dev_attr_liquid_detection_ctl.attr,
NULL,

View file

@ -209,6 +209,31 @@ static inline void update_poison_center(struct touch_event_data *tev)
}
#endif /* TS_MMI_TOUCH_GESTURE_POISON_EVENT */
#define DOUBLE_TAP_MAX_TIME (2 * NSEC_PER_SEC)
static void ts_mmi_single_tap_handler(struct ts_mmi_dev *touch_cdev)
{
ktime_t now, tmp;
if (!touch_cdev->single_tap_pressed) {
touch_cdev->single_tap_pressed_time = ktime_get_boottime();
touch_cdev->single_tap_pressed = true;
return;
}
touch_cdev->single_tap_pressed = false;
now = ktime_get_boottime();
tmp = ktime_add(touch_cdev->single_tap_pressed_time,
DOUBLE_TAP_MAX_TIME);
if (ktime_after(now, tmp))
return;
touch_cdev->double_tap_pressed = true;
sysfs_notify(&DEV_MMI->kobj, NULL, "double_tap_pressed");
}
static int ts_mmi_gesture_handler(struct gesture_event_data *gev)
{
int key_code;
@ -220,6 +245,7 @@ static int ts_mmi_gesture_handler(struct gesture_event_data *gev)
if (!(mode_type & TS_MMI_GESTURE_SINGLE))
return 1;
ts_mmi_single_tap_handler(touch_cdev);
key_code = BTN_TRIGGER_HAPPY3;
pr_info("%s: single tap\n", __func__);
break;
@ -249,6 +275,8 @@ static int ts_mmi_gesture_handler(struct gesture_event_data *gev)
key_code = BTN_TRIGGER_HAPPY6;
pr_info("%s: double tap\n", __func__);
touch_cdev->double_tap_pressed = true;
sysfs_notify(&DEV_MMI->kobj, NULL, "double_tap_pressed");
break;
default:
pr_info("%s: unknown id=%x\n", __func__, gev->evcode);

View file

@ -362,6 +362,8 @@ static void ts_mmi_queued_resume(struct ts_mmi_dev *touch_cdev)
*/
mutex_lock(&touch_cdev->extif_mutex);
ts_mmi_restore_settings(touch_cdev);
touch_cdev->single_tap_pressed = false;
touch_cdev->double_tap_pressed = false;
touch_cdev->pm_mode = TS_MMI_PM_ACTIVE;
mutex_unlock(&touch_cdev->extif_mutex);
dev_info(DEV_MMI, "%s: done\n", __func__);

View file

@ -562,6 +562,11 @@ struct ts_mmi_dev {
struct attribute_group *extern_group;
struct list_head node;
struct touch_clip_area clip;
ktime_t single_tap_pressed_time;
bool single_tap_pressed;
bool double_tap_pressed;
/*
* vendor provided
*/