Support goodix touch under water detection

TP:
Support goodix touch under water detection.

Change-Id: I8552676ca8b270595c8a99a94efe939ddb8e4802
Signed-off-by: Wenge Zhu <zhuwg1@motorola.com>
Reviewed-on: https://gerrit.mot.com/2451133
SME-Granted: SME Approvals Granted
SLTApproved: Slta Waiver
Tested-by: Jira Key
Reviewed-by: Jun Weng <wengjun1@motorola.com>
Reviewed-by: Jianqi Yang <yangj@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
Wenge Zhu 2022-12-05 20:12:03 +08:00 • committed by zhuwg1
commit 59ccefeb4b
5 changed files with 89 additions and 3 deletions

View file

@ -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],

View file

@ -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;
};

View file

@ -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

View file

@ -12,7 +12,6 @@
*/
#include "goodix_ts_mmi.h"
#include "goodix_ts_core.h"
#include <linux/delay.h>
#include <linux/input/mt.h>
#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 */

View file

@ -16,6 +16,7 @@
#include <linux/platform_device.h>
#include <linux/touchscreen_mmi.h>
#include <linux/mmi_wake_lock.h>
#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