Update Goodix TP FOD event implementation

1. Update FOD gesture trigger in screen off mode.
2. Add FOD event support in screen on mode

Change-Id: I7ecbfdb4aff8eaf34e88247d91d08279edd018a6
Signed-off-by: Yan Zhang <zhangy26@motorola.com>
Reviewed-on: https://gerrit.mot.com/2152070
SLTApproved: Slta Waiver
SME-Granted: SME Approvals Granted
Tested-by: Jira Key
Reviewed-by: Wei Deng <dengwei1@motorola.com>
Reviewed-by: Xiangpo Zhao <zhaoxp3@motorola.com>
Submit-Approved: Jira Key
This commit is contained in:
Yan Zhang committed 2021-12-23 03:06:05 -06:00
1 parent 3f42788a45
commit 565cf7a3ab
4 files changed
+69 -34

No files matched your search

@@ -1046,7 +1046,11 @@ static void goodix_parse_pen(struct goodix_pen_data *pen_data,
pen_data->keys[i].status = TS_TOUCH;
}
}
#ifdef CONFIG_GTP_FOD
#define GOODIX_FP_EVENTS 0x8
#define GOODIX_GESTURE_FOD_DOWN 0x46
#define GOODIX_GESTURE_FOD_UP 0x55
#endif
static int goodix_touch_handler(struct goodix_ts_core *cd,
struct goodix_ts_event *ts_event,
u8 *pre_buf, u32 pre_buf_len)
@@ -1062,7 +1066,10 @@ static int goodix_touch_handler(struct goodix_ts_core *cd,
u8 point_type = 0;
static u8 pre_finger_num;
static u8 pre_pen_num;
#ifdef CONFIG_GTP_FOD
int fp_flags = 0;
static int pre_flags = 0;
#endif
/* clean event buffer */
memset(ts_event, 0, sizeof(*ts_event));
/* copy pre-data to buffer */
@@ -1109,7 +1116,17 @@ static int goodix_touch_handler(struct goodix_ts_core *cd,
}
}
}
#ifdef CONFIG_GTP_FOD
ts_debug("touch pre_buf[0]=0x%x", pre_buf[0]);
fp_flags = pre_buf[0] & GOODIX_FP_EVENTS;
if(pre_flags != fp_flags) {
if(fp_flags)
ts_event->gesture_type = GOODIX_GESTURE_FOD_DOWN;
else
ts_event->gesture_type = GOODIX_GESTURE_FOD_UP;
}
pre_flags = fp_flags;
#endif
if (touch_num > 0 && (point_type == POINT_TYPE_STYLUS
|| point_type == POINT_TYPE_STYLUS_HOVER)) {
/* stylus info */
@@ -1221,7 +1221,10 @@ static int goodix_ts_request_handle(struct goodix_ts_core *cd,
ts_event->request_code);
return ret;
}
#ifdef CONFIG_GTP_FOD
#define GOODIX_GESTURE_FOD_DOWN 0x46
#define GOODIX_GESTURE_FOD_UP 0x55
#endif
/**
* goodix_ts_threadirq_func - Bottom half of interrupt
* This functions is excuted in thread context,
@@ -1266,6 +1269,19 @@ static irqreturn_t goodix_ts_threadirq_func(int irq, void *data)
/* report touch */
goodix_ts_report_finger(core_data->input_dev,
&ts_event->touch_data);
#ifdef CONFIG_GTP_FOD
if(ts_event->gesture_type == GOODIX_GESTURE_FOD_DOWN) {
input_report_key(core_data->input_dev, BTN_TRIGGER_HAPPY1, 1);
input_sync(core_data->input_dev);
input_report_key(core_data->input_dev, BTN_TRIGGER_HAPPY1, 0);
input_sync(core_data->input_dev);
} else if(ts_event->gesture_type == GOODIX_GESTURE_FOD_UP) {
input_report_key(core_data->input_dev, BTN_TRIGGER_HAPPY2, 1);
input_sync(core_data->input_dev);
input_report_key(core_data->input_dev, BTN_TRIGGER_HAPPY2, 0);
input_sync(core_data->input_dev);
}
#endif
}
if (core_data->board_data.pen_enable &&
ts_event->event_type == EVENT_PEN) {
@@ -335,9 +335,8 @@ static int gsx_gesture_init(struct goodix_ts_core *cd,
gsx->ts_core = cd;
/*enable all gesture wakeup by default */
gsx->ts_core->gesture_type = GESTURE_SINGLE_TAP |GESTURE_FOD_PRESS;
cd->ts_event.gesture_data[0] = 0;
atomic_set(&gsx_gesture->registered, 1);
return 0;
}
@@ -375,7 +374,8 @@ static int gsx_gesture_ist(struct goodix_ts_core *cd,
#if defined(CONFIG_INPUT_TOUCHSCREEN_MMI)
struct gesture_event_data mmi_event;
static unsigned long start = 0;
static bool fod_down = false;
int fod_down_interval;
int fod_down = cd->ts_event.gesture_data[0];
#endif
if (atomic_read(&cd->suspended) == 0 || cd->gesture_type == 0)
return EVT_CONTINUE;
@@ -397,14 +397,15 @@ static int gsx_gesture_ist(struct goodix_ts_core *cd,
if(cd->gesture_type & GESTURE_SINGLE_TAP && gs_event.gesture_type == GOODIX_GESTURE_SINGLE_TAP) {
ts_info("get SINGLE-TAP gesture");
mmi_event.evcode =1;
fod_down = false;
fod_down = 0;
/* call class method */
ret = cd->imports->report_gesture(&mmi_event);
if (!ret)
PM_WAKEUP_EVENT(cd->gesture_wakelock, 3000);
goto gesture_ist_exit;
} else if(cd->gesture_type & GESTURE_FOD_PRESS && gs_event.gesture_type == GOODIX_GESTURE_FOD_DOWN ){
int fod_down_interval = (int)jiffies_to_msecs(jiffies-start);
fod_down_interval = (int)jiffies_to_msecs(jiffies-start);
fodx = le16_to_cpup((__le16 *)gs_event.gesture_data);
fody = le16_to_cpup((__le16 *)(gs_event.gesture_data + 2));
overlay_area = gs_event.gesture_data[4];
@@ -412,38 +413,32 @@ static int gsx_gesture_ist(struct goodix_ts_core *cd,
mmi_event.evcode = 2;
mmi_event.evdata.x= 540;
mmi_event.evdata.y= 2164;
ts_info("get FOD-DOWN gesture");
if(fod_down_interval < 5000) {
if(fod_down == true) {
ts_debug("filter same fod down within 5s");
goto gesture_ist_exit;
ts_info("get FOD-DOWN gesture %d fod_down_interval=%d",fod_down,fod_down_interval);
if(fod_down_interval < 250)
{
if( fod_down) {
goto fod_exit;
}
} else {
fod_down= false;
fod_down = 0;
}
ret = cd->imports->report_gesture(&mmi_event);
if (!ret)
PM_WAKEUP_EVENT(cd->gesture_wakelock, 3000);
input_report_key(cd->input_dev, BTN_TRIGGER_HAPPY1, 1);
input_sync(cd->input_dev);
input_report_key(cd->input_dev, BTN_TRIGGER_HAPPY1, 0);
input_sync(cd->input_dev);
fod_down = true;
start=jiffies;
start = jiffies;
if(fod_down <4) {
ret = cd->imports->report_gesture(&mmi_event);
if (!ret)
PM_WAKEUP_EVENT(cd->gesture_wakelock, 3000);
}
}
fod_exit:
fod_down++;
goto gesture_ist_exit;
}else if(cd->gesture_type & GESTURE_FOD_PRESS && gs_event.gesture_type == GOODIX_GESTURE_FOD_UP) {
}else if(cd->gesture_type & GESTURE_FOD_PRESS && gs_event.gesture_type == GOODIX_GESTURE_FOD_UP) {
ts_info("get FOD-UP gesture");
mmi_event.evcode = 3;
input_report_key(cd->input_dev, BTN_TRIGGER_HAPPY2, 1);
input_sync(cd->input_dev);
input_report_key(cd->input_dev, BTN_TRIGGER_HAPPY2, 0);
input_sync(cd->input_dev);
fod_down = false;
}
fod_down = 0;
} else {
ts_debug("not support gesture type[%02X] to wakeup, suspended =%d", gs_event.gesture_type, atomic_read(&cd->suspended));
fod_down = false;
fod_down = 0;
}
#else
switch (gs_event.gesture_type) {
@@ -507,12 +502,14 @@ static int gsx_gesture_ist(struct goodix_ts_core *cd,
break;
}
#endif
re_send_ges_cmd:
if (hw_ops->gesture(cd, 0))
ts_info("warning: failed re_send gesture cmd");
gesture_ist_exit:
if (!cd->tools_ctrl_sync)
hw_ops->after_event_handler(cd);
cd->ts_event.gesture_data[0] = fod_down;
return EVT_CANCEL_IRQEVT;
}
@@ -884,7 +884,12 @@ static int goodix_ts_mmi_post_resume(struct device *dev) {
core_data->get_mode.edge_mode[1], core_data->get_mode.edge_mode[0]);
}
}
#ifdef CONFIG_GTP_FOD
if(core_data->ts_event.gesture_data[0]) {
ts_info("FOD is down during PM active");
}
core_data->ts_event.gesture_data[0] = 0;
#endif
return 0;
}