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:
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user