From 5083a61945fabf73ab5312296a85b5b49b8991d9 Mon Sep 17 00:00:00 2001 From: LuK1337 Date: Mon, 11 Apr 2022 20:28:39 +0200 Subject: [PATCH] oplus: oplus_touchscreen_v2: Always enable gestures and assign unique keycodes This is required for dt2w and ITouchscreenGesture on LineageOS. Change-Id: I3fe73841276bb5d074536a9b7a292b305369b488 --- .../oplus_touchscreen_v2/touchpanel_common.h | 3 + .../touchpanel_common_driver.c | 24 ++++-- .../oplus_touchscreen_v2/touchpanel_proc.c | 76 ++++--------------- 3 files changed, 37 insertions(+), 66 deletions(-) diff --git a/oplus/kernel/touchpanel/oplus_touchscreen_v2/touchpanel_common.h b/oplus/kernel/touchpanel/oplus_touchscreen_v2/touchpanel_common.h index baf7a3998e..71c9d2d3da 100644 --- a/oplus/kernel/touchpanel/oplus_touchscreen_v2/touchpanel_common.h +++ b/oplus/kernel/touchpanel/oplus_touchscreen_v2/touchpanel_common.h @@ -88,6 +88,8 @@ #define TEST_RUNNING 1 #define TEST_NOSTART 3 +#define KEY_GESTURE_START 246 + #define HEALTH_REPORT_GRIP "grip_report" #define HEALTH_REPORT_BASELINE_ERR "baseline_err" #define HEALTH_REPORT_NOISE "noise_count" @@ -1110,6 +1112,7 @@ struct touchpanel_data { bool disable_gesture_ctrl; /*when lcd_trigger_load_tp_fw start no need to control gesture*/ int irq_need_dev_resume_time; /*control setting of wait resume time*/ int gesture_enable; /*control state of black gesture*/ + bool double_tap_to_wake_enable; /*control state of dt2w*/ struct gesture_info gesture; /*gesture related info*/ int gesture_enable_indep; /*independent control state of black gesture*/ bool incell_aod_flag; diff --git a/oplus/kernel/touchpanel/oplus_touchscreen_v2/touchpanel_common_driver.c b/oplus/kernel/touchpanel/oplus_touchscreen_v2/touchpanel_common_driver.c index 7375905563..113fb9fc95 100644 --- a/oplus/kernel/touchpanel/oplus_touchscreen_v2/touchpanel_common_driver.c +++ b/oplus/kernel/touchpanel/oplus_touchscreen_v2/touchpanel_common_driver.c @@ -781,7 +781,17 @@ static void tp_gesture_handle(struct touchpanel_data *ts) #endif /* end of CONFIG_OPLUS_TP_APK*/ - if (gesture_info_temp.gesture_type != UNKOWN_GESTURE + if (gesture_info_temp.gesture_type == DOU_TAP + && CHK_BIT(ts->gesture_enable_indep, (1 << gesture_info_temp.gesture_type))) { + tp_memcpy(&ts->gesture, sizeof(ts->gesture), \ + &gesture_info_temp, sizeof(struct gesture_info), \ + sizeof(struct gesture_info)); + input_report_key(ts->input_dev, KEY_WAKEUP, 1); + input_sync(ts->input_dev); + input_report_key(ts->input_dev, KEY_WAKEUP, 0); + input_sync(ts->input_dev); + + } else if (gesture_info_temp.gesture_type != UNKOWN_GESTURE && gesture_info_temp.gesture_type != FINGER_PRINTDOWN && gesture_info_temp.gesture_type != FRINGER_PRINTUP) { retval = tp_memcpy(&ts->gesture, sizeof(ts->gesture), \ @@ -798,9 +808,9 @@ static void tp_gesture_handle(struct touchpanel_data *ts) } } - input_report_key(ts->input_dev, KEY_F4, 1); + input_report_key(ts->input_dev, KEY_GESTURE_START + gesture_info_temp.gesture_type, 1); input_sync(ts->input_dev); - input_report_key(ts->input_dev, KEY_F4, 0); + input_report_key(ts->input_dev, KEY_GESTURE_START + gesture_info_temp.gesture_type, 0); input_sync(ts->input_dev); } else if (gesture_info_temp.gesture_type == FINGER_PRINTDOWN) { @@ -1841,7 +1851,7 @@ static struct attribute_group properties_attr_group = { */ static int init_input_device(struct touchpanel_data *ts) { - int ret = 0; + int ret = 0, i = 0; struct kobject *vk_properties_kobj; static bool board_properties = false; @@ -1932,6 +1942,10 @@ static int init_input_device(struct touchpanel_data *ts) if (ts->black_gesture_support) { set_bit(KEY_F4, ts->input_dev->keybit); + set_bit(KEY_WAKEUP, ts->input_dev->keybit); + for (i = UP_VEE; i <= S_GESTURE; i++) { + set_bit(KEY_GESTURE_START + i, ts->input_dev->keybit); + } #ifdef CONFIG_OPLUS_TP_APK set_bit(KEY_POWER, ts->input_dev->keybit); #endif /*end of CONFIG_OPLUS_TP_APK*/ @@ -4362,7 +4376,7 @@ int register_common_touch_device(struct touchpanel_data *pdata) ts->hall_status = false; ts->is_suspended = 0; ts->suspend_state = TP_SPEEDUP_RESUME_COMPLETE; - ts->gesture_enable = 0; + ts->gesture_enable = 1; ts->fd_enable = 0; ts->fp_enable = 0; ts->aiunit_game_enable = 0; diff --git a/oplus/kernel/touchpanel/oplus_touchscreen_v2/touchpanel_proc.c b/oplus/kernel/touchpanel/oplus_touchscreen_v2/touchpanel_proc.c index ef5ceed841..2187045bdf 100644 --- a/oplus/kernel/touchpanel/oplus_touchscreen_v2/touchpanel_proc.c +++ b/oplus/kernel/touchpanel/oplus_touchscreen_v2/touchpanel_proc.c @@ -738,12 +738,8 @@ DECLARE_PROC_OPS(tp_communicate_test_ops, simple_open, tp_communicate_test_read, /*double_tap_enable - For black screen gesture * Input: - * gesture_enable = 0 : disable gesture - * gesture_enable = 1 : enable gesture when ps is far away - * gesture_enable = 2 : disable gesture when ps is near - * gesture_enable = 3 : enable single tap gesture when ps is far away - * value = 5 : hall status is far way - * value = 6 : hall status is near + * gesture_enable = 0 : disable dt2w + * gesture_enable = 1 : enable dt2w */ static ssize_t proc_gesture_control_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) @@ -769,57 +765,13 @@ static ssize_t proc_gesture_control_write(struct file *file, mutex_lock(&ts->mutex); - switch(value) { - case 0: - case 1: - case 2: - case 3: - if (ts->gesture_enable != value) { - ts->gesture_enable = value; - TP_INFO(ts->tp_index, "%s: gesture_enable = %d, is_suspended = %d\n", __func__, - ts->gesture_enable, ts->is_suspended); + if (value) + ts->gesture_enable_indep |= (1 << DOU_TAP); + else + ts->gesture_enable_indep &= ~(1 << DOU_TAP); - if (0 == ts->gesture_enable && ts->is_suspended && ts->fp_grip_enable && ts->fp_grip_hold == true && ts->fp_grip_support) { - TP_INFO(ts->tp_index, "%s: maybe prox near to disable gesture,nead send release touch to fp\n", __func__); - touch_call_fp_grip(ts, 0); - } - - if (ts->is_incell_panel && (ts->suspend_state == TP_RESUME_EARLY_EVENT - || ts->disable_gesture_ctrl) && (ts->tp_resume_order == LCD_TP_RESUME)) { - TS_TP_INFO("tp will resume, no need mode_switch in incell panel\n"); /*avoid i2c error or tp rst pulled down in lcd resume*/ - - } else if (ts->is_suspended) { - if (ts->bus_ready == false) { - if (ts->health_monitor_support) { - ts->monitor_data.bus_not_ready_gesture_write_count++; - } - } - if (ts->fingerprint_underscreen_support && ts->fp_enable - && ts->ts_ops->enable_gesture_mask) { - ts->ts_ops->enable_gesture_mask(ts->chip_data, - (ts->gesture_enable & 0x01) == 1); - - } else { - operate_mode_switch(ts); - } - } - - } - break; - case 4: - break; - case 5: - ts->hall_status = false; - break; - case 6: - ts->hall_status = true; - if ((ts->gesture_enable & 0x01) && ts->is_suspended) - operate_mode_switch(ts); - break; - default: - TPD_DEBUG("invalid setting %d\n", value); - } - TPD_INFO("%s: gesture_enable = %d, value = %d, hall_status = %d\n", __func__, ts->gesture_enable, value, ts->hall_status); + if (ts->ts_ops->set_gesture_state) + ts->ts_ops->set_gesture_state(ts->chip_data, ts->gesture_enable_indep); mutex_unlock(&ts->mutex); @@ -828,14 +780,14 @@ static ssize_t proc_gesture_control_write(struct file *file, /*double_tap_enable - For black screen gesture * Output: - * gesture_enable = 0 : disable gesture - * gesture_enable = 1 : enable gesture when ps is far away - * gesture_enable = 2 : disable gesture when ps is near + * gesture_enable = 0 : disable dt2w + * gesture_enable = 1 : enable dt2w */ static ssize_t proc_gesture_control_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) { int ret = 0; + int value = 0; char page[PAGESIZE] = {0}; struct touchpanel_data *ts = PDE_DATA(file_inode(file)); @@ -843,8 +795,10 @@ static ssize_t proc_gesture_control_read(struct file *file, char __user *buffer, return 0; } - TP_DEBUG(ts->tp_index, "double tap enable is: %d\n", ts->gesture_enable); - ret = snprintf(page, PAGESIZE - 1, "%d\n", ts->gesture_enable); + value = !!(ts->gesture_enable_indep & (1 << DOU_TAP)); + + TP_DEBUG(ts->tp_index, "double tap enable is: %d\n", value); + ret = snprintf(page, PAGESIZE - 1, "%d\n", value); ret = simple_read_from_buffer(buffer, count, ppos, page, strlen(page)); return ret;