From 59ccefeb4b25be75addbf7d853dca82814a9fd1d Mon Sep 17 00:00:00 2001 From: Wenge Zhu Date: Mon, 5 Dec 2022 20:12:03 +0800 Subject: [PATCH] Support goodix touch under water detection TP: Support goodix touch under water detection. Change-Id: I8552676ca8b270595c8a99a94efe939ddb8e4802 Signed-off-by: Wenge Zhu Reviewed-on: https://gerrit.mot.com/2451133 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Jun Weng Reviewed-by: Jianqi Yang Submit-Approved: Jira Key --- .../goodix_berlin_mmi/goodix_brl_hw.c | 13 +++++ .../goodix_berlin_mmi/goodix_ts_core.h | 5 ++ .../goodix_berlin_mmi/goodix_ts_gesture_fod.c | 17 +++++- .../goodix_berlin_mmi/goodix_ts_mmi.c | 53 ++++++++++++++++++- .../goodix_berlin_mmi/goodix_ts_mmi.h | 4 ++ 5 files changed, 89 insertions(+), 3 deletions(-) diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_brl_hw.c b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_brl_hw.c index 814ad56669ce..e2d9d0eced36 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_brl_hw.c +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_brl_hw.c @@ -15,6 +15,7 @@ * */ #include "goodix_ts_core.h" +#include "goodix_ts_mmi.h" /* berlin_A SPI mode setting */ #define GOODIX_SPI_MODE_REG 0xC900 @@ -1101,11 +1102,22 @@ static int goodix_touch_handler(struct goodix_ts_core *cd, int fp_flags = 0; static int pre_flags = 0; #endif + int underwater_flag = 0; /* clean event buffer */ memset(ts_event, 0, sizeof(*ts_event)); /* copy pre-data to buffer */ memcpy(buffer, pre_buf, pre_buf_len); + if (cd->set_mode.liquid_detection) { + underwater_flag = buffer[2] & GOODIX_GESTURE_UNDER_WATER; + if (cd->liquid_status != underwater_flag) { + cd->liquid_status = underwater_flag; + /* call class method */ + cd->imports->report_liquid_detection_status(cd->bus->dev, cd->liquid_status? 1:0); + ts_info("under water flag changed to 0x%x\n", cd->liquid_status); + } + } + touch_num = buffer[2] & 0x0F; if (touch_num > GOODIX_MAX_TOUCH) { @@ -1244,6 +1256,7 @@ static int brl_event_handler(struct goodix_ts_core *cd, ts_debug("unsupported request code 0x%x", pre_buf[2]); } else if (event_status & GOODIX_GESTURE_EVENT) { ts_event->event_type = EVENT_GESTURE; + ts_event->gesture_report_info = pre_buf[2]; ts_event->gesture_type = pre_buf[4]; #ifdef CONFIG_GTP_FOD memcpy(ts_event->gesture_data, &pre_buf[8], diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.h b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.h index 7433cded93e4..e0afb2de8881 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.h +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_core.h @@ -63,6 +63,7 @@ #define GOODIX_GESTURE_SINGLE_TAP 0x4C #define GOODIX_GESTURE_FOD_DOWN 0x46 #define GOODIX_GESTURE_FOD_UP 0x55 +#define GOODIX_GESTURE_UNDER_WATER 0x20 enum GOODIX_GESTURE_TYP { GESTURE_SINGLE_TAP = (1 << 0), @@ -407,6 +408,7 @@ struct goodix_ts_event { enum ts_event_type event_type; u8 request_code; /* represent the request type */ u8 gesture_type; + u8 gesture_report_info; struct goodix_touch_data touch_data; struct goodix_pen_data pen_data; #ifdef CONFIG_GTP_FOD @@ -488,6 +490,7 @@ struct goodix_mode_info { int sample; int report_rate_mode; int edge_mode[2]; + int liquid_detection; }; struct goodix_ts_core { @@ -516,6 +519,7 @@ struct goodix_ts_core { int power_on; int irq; size_t irq_trig_cnt; + int liquid_status; atomic_t irq_enabled; atomic_t suspended; @@ -554,6 +558,7 @@ struct goodix_ts_core { #ifdef CONFIG_GTP_LAST_TIME ktime_t last_event_time; #endif + unsigned short gesture_cmd; atomic_t pm_resume; wait_queue_head_t pm_wq; }; diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_gesture_fod.c b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_gesture_fod.c index c66004cb6791..d856dfc4ee9c 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_gesture_fod.c +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_gesture_fod.c @@ -372,6 +372,7 @@ static int gsx_gesture_ist(struct goodix_ts_core *cd, static unsigned long start = 0; int fod_down_interval = 0; int fod_down = cd->zerotap_data[0]; + int underwater_flag = 0; #endif if (atomic_read(&cd->suspended) == 0 || cd->gesture_type == 0) return EVT_CONTINUE; @@ -397,8 +398,19 @@ static int gsx_gesture_ist(struct goodix_ts_core *cd, gs_event.event_type); goto re_send_ges_cmd; } - ts_info("got gesture type 0x%x", gs_event.gesture_type); + ts_debug("got gesture type 0x%x", gs_event.gesture_type); #if defined(CONFIG_INPUT_TOUCHSCREEN_MMI) + if (cd->set_mode.liquid_detection) { + underwater_flag = gs_event.gesture_report_info & GOODIX_GESTURE_UNDER_WATER; + if ( cd->liquid_status != underwater_flag) { + cd->liquid_status = underwater_flag; + /* call class method */ + cd->imports->report_liquid_detection_status(cd->bus->dev, cd->liquid_status? 1:0); + ts_info("under water flag changed to: 0x%x\n", cd->liquid_status); + goto gesture_ist_exit; + } + } + mmi_event.evcode =0; if ( cd->imports && cd->imports->report_gesture) { if(cd->gesture_type & GESTURE_SINGLE_TAP && gs_event.gesture_type == GOODIX_GESTURE_SINGLE_TAP) { @@ -525,6 +537,9 @@ static int gsx_gesture_ist(struct goodix_ts_core *cd, re_send_ges_cmd: #if defined(PRODUCT_MIAMI) if (hw_ops->gesture(cd, 0x80)) +#elif defined(CONFIG_BOARD_USES_DOUBLE_TAP_CTRL) + if (goodix_ts_send_cmd(cd, ENTER_GESTURE_MODE_CMD, 6, (cd->gesture_cmd) >> 8, + cd->gesture_cmd & 0xFF) < 0) #else if (hw_ops->gesture(cd, 0)) #endif diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.c b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.c index 64846e85dbc3..b9035a449586 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.c +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.c @@ -12,7 +12,6 @@ */ #include "goodix_ts_mmi.h" -#include "goodix_ts_core.h" #include #include #include "goodix_ts_config.h" @@ -132,7 +131,7 @@ static int goodix_ts_mmi_extend_attribute_group(struct device *dev, struct attri return 0; } -static int goodix_ts_send_cmd(struct goodix_ts_core *core_data, +int goodix_ts_send_cmd(struct goodix_ts_core *core_data, u8 cmd, u8 len, u8 subCmd, u8 subCmd2) { int ret = 0; @@ -957,6 +956,7 @@ static int goodix_ts_mmi_panel_state(struct device *dev, if (ret < 0) { ts_err("Failed to send enable gesture mode\n"); } + core_data->gesture_cmd = gesture_cmd; ts_info("Send enable gesture mode 0x%04x, 0x%02x\n", gesture_cmd, gesture_type); #else #if defined(PRODUCT_MIAMI) @@ -1091,6 +1091,15 @@ static int goodix_ts_mmi_post_resume(struct device *dev) { core_data->get_mode.edge_mode[1], core_data->get_mode.edge_mode[0]); } } + if (core_data->get_mode.liquid_detection) { + ret = goodix_ts_send_cmd(core_data, LIQUID_DETECTION_SWITCH_CMD, 5, + core_data->get_mode.liquid_detection, 0x00); + if (!ret) { + core_data->set_mode.liquid_detection = core_data->get_mode.liquid_detection; + msleep(20); + ts_info("Success to %d liquid detection mode\n", core_data->get_mode.liquid_detection); + } + } mutex_unlock(&core_data->mode_lock); #ifdef CONFIG_GTP_FOD if(core_data->zerotap_data[0]) { @@ -1155,6 +1164,45 @@ static int goodix_ts_mmi_update_fps_mode(struct device *dev, int mode) { } #endif +static int goodix_ts_mmi_update_liquid_detect_mode(struct device *dev, int mode) { + int ret = 0; + struct platform_device *pdev; + struct goodix_ts_core *core_data; + + GET_GOODIX_DATA(dev); + + mutex_lock(&core_data->mode_lock); + core_data->get_mode.liquid_detection= mode; + if (core_data->set_mode.liquid_detection == mode) { + ts_debug("The value = %d is same, so not to write", mode); + goto exit; + } + + if (core_data->power_on == 0) { + ts_debug("The touch is in sleep state, restore the value when resume\n"); + goto exit; + } + + //clear liquid status before enable detection + if (mode) + core_data->liquid_status = 0; + + ret = goodix_ts_send_cmd(core_data, LIQUID_DETECTION_SWITCH_CMD, 5, + core_data->get_mode.liquid_detection, 0x00); + if (ret < 0) { + ts_err("failed to set liquid detection, mode = %d", mode); + goto exit; + } + + core_data->set_mode.liquid_detection = mode; + msleep(20); + ts_info("Success to set %d\n", mode); + +exit: + mutex_unlock(&core_data->mode_lock); + return ret; +} + #define Y_MIN_ID 2 #define Y_MAX_ID 3 #define SCREEN_X_MAX 1080 @@ -1231,6 +1279,7 @@ static struct ts_mmi_methods goodix_ts_mmi_methods = { .charger_mode = goodix_ts_mmi_charger_mode, .refresh_rate = goodix_ts_mmi_refresh_rate, .active_region = goodix_ts_mmi_active_region, + .update_liquid_detect_mode = goodix_ts_mmi_update_liquid_detect_mode, /* Firmware */ .firmware_update = goodix_ts_firmware_update, /* vendor specific attribute group */ diff --git a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.h b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.h index 25274c333625..1b2e95e288f6 100644 --- a/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.h +++ b/drivers/input/touchscreen/goodix_berlin_mmi/goodix_ts_mmi.h @@ -16,6 +16,7 @@ #include #include #include +#include "goodix_ts_core.h" #ifdef CONFIG_INPUT_TOUCHSCREEN_MMI int goodix_ts_mmi_dev_register(struct platform_device *ts_device); @@ -28,6 +29,8 @@ static int inline goodix_ts_mmi_dev_unregister(struct platform_device *ts_device return -ENOSYS; } #endif +int goodix_ts_send_cmd(struct goodix_ts_core *core_data, + u8 cmd, u8 len, u8 subCmd, u8 subCmd2); #define LEATHER_MODE_SWITCH_CMD 0x26 #define ENTER_LEATHER_MODE 0x01 @@ -54,4 +57,5 @@ static int inline goodix_ts_mmi_dev_unregister(struct platform_device *ts_device #define EXIT_HIGH_REPORT_RATE_CMD 0xC100 #define SAMPLE_SWITCH_CMD 0xC2 #define ENTER_GESTURE_MODE_CMD 0xA6 +#define LIQUID_DETECTION_SWITCH_CMD 0x33 #endif