From 111a18c9eb2ab1d3b23ffda9ba21dceadf5e17e4 Mon Sep 17 00:00:00 2001 From: Wenge Zhu Date: Thu, 15 Sep 2022 20:43:18 +0800 Subject: [PATCH] Add gesture mode support for focaltech touch Add single tap and double tap gestures support for focaltech touch IC, gesture type receives from touch mmi class. Change-Id: Ib67d221eff3217b46f9b423b84426ef44f774826 Signed-off-by: Wenge Zhu Reviewed-on: https://gerrit.mot.com/2384855 SME-Granted: SME Approvals Granted SLTApproved: Slta Waiver Tested-by: Jira Key Reviewed-by: Wei Deng Reviewed-by: Jun Weng Reviewed-by: Jichao Zou Submit-Approved: Jira Key --- .../touchscreen/focaltech_touch_v3/Android.mk | 3 ++ .../touchscreen/focaltech_touch_v3/Kbuild | 6 +++- .../focaltech_touch_v3/focaltech_core.h | 1 + .../focaltech_touch_v3/focaltech_gesture.c | 35 +++++++++++++++++++ .../focaltech_touch_v3/focaltech_ts_mmi.c | 21 +++++++++++ 5 files changed, 65 insertions(+), 1 deletion(-) diff --git a/drivers/input/touchscreen/focaltech_touch_v3/Android.mk b/drivers/input/touchscreen/focaltech_touch_v3/Android.mk index aa89a896e353..05b378e586bb 100644 --- a/drivers/input/touchscreen/focaltech_touch_v3/Android.mk +++ b/drivers/input/touchscreen/focaltech_touch_v3/Android.mk @@ -11,6 +11,9 @@ endif ifeq ($(BOARD_USES_DOUBLE_TAP),true) KBUILD_OPTIONS += CONFIG_INPUT_FOCALTECH_V3_MMI_ENABLE_DOUBLE_TAP=y +ifeq ($(FTS_DOUBLE_TAP_CONTROL),true) + KBUILD_OPTIONS += CONFIG_FTS_DOUBLE_TAP_CONTROL=y +endif endif ifneq ($(BOARD_USES_TOUCH_PALM),) diff --git a/drivers/input/touchscreen/focaltech_touch_v3/Kbuild b/drivers/input/touchscreen/focaltech_touch_v3/Kbuild index e3504feebcb1..35bce3c382a3 100644 --- a/drivers/input/touchscreen/focaltech_touch_v3/Kbuild +++ b/drivers/input/touchscreen/focaltech_touch_v3/Kbuild @@ -51,9 +51,13 @@ ifneq ($(filter m y, $(CONFIG_FTS_NOISE_TEST_P2P)),) EXTRA_CFLAGS += -DCONFIG_FTS_NOISE_TEST_P2P endif -ifneq ($(filter m y, $(CONFIG_FTS_NOISE_TEST_P2P)),) +ifneq ($(filter m y, $(CONFIG_FTS_COMPATIBLE_WITH_GKI)),) EXTRA_CFLAGS += -DCONFIG_FTS_COMPATIBLE_WITH_GKI endif +ifneq ($(filter m y, $(CONFIG_FTS_DOUBLE_TAP_CONTROL)),) + EXTRA_CFLAGS += -DCONFIG_FTS_DOUBLE_TAP_CONTROL +endif + KBUILD_EXTRA_SYMBOLS += $(CURDIR)/../../kernel/msm-$(MODULE_KERNEL_VERSION)/Module.symvers KBUILD_EXTRA_SYMBOLS += $(CURDIR)/$(KBUILD_EXTMOD)/../../../mmi_info/$(GKI_OBJ_MODULE_DIR)/Module.symvers diff --git a/drivers/input/touchscreen/focaltech_touch_v3/focaltech_core.h b/drivers/input/touchscreen/focaltech_touch_v3/focaltech_core.h index 9407b12a90e3..8e8cbf3080c8 100644 --- a/drivers/input/touchscreen/focaltech_touch_v3/focaltech_core.h +++ b/drivers/input/touchscreen/focaltech_touch_v3/focaltech_core.h @@ -266,6 +266,7 @@ struct fts_ts_data { #ifdef FOCALTECH_SENSOR_EN bool wakeable; #endif + u8 gsx_cmd; #ifdef FOCALTECH_PALM_SENSOR_EN bool palm_detection_enabled; diff --git a/drivers/input/touchscreen/focaltech_touch_v3/focaltech_gesture.c b/drivers/input/touchscreen/focaltech_touch_v3/focaltech_gesture.c index fafb9d2e7e66..54584269aa21 100644 --- a/drivers/input/touchscreen/focaltech_touch_v3/focaltech_gesture.c +++ b/drivers/input/touchscreen/focaltech_touch_v3/focaltech_gesture.c @@ -51,12 +51,14 @@ #define KEY_GESTURE_V KEY_V #define KEY_GESTURE_C KEY_C #define KEY_GESTURE_Z KEY_Z +#define KEY_GESTURE_F1 KEY_F1 #define GESTURE_LEFT 0x20 #define GESTURE_RIGHT 0x21 #define GESTURE_UP 0x22 #define GESTURE_DOWN 0x23 #define GESTURE_DOUBLECLICK 0x24 +#define GESTURE_SINGLECLICK 0x27 #define GESTURE_O 0x30 #define GESTURE_W 0x31 #define GESTURE_M 0x32 @@ -280,6 +282,9 @@ static void fts_gesture_report(struct input_dev *input_dev, int gesture_id) case GESTURE_DOUBLECLICK: gesture = KEY_GESTURE_U; break; + case GESTURE_SINGLECLICK: + gesture = KEY_GESTURE_F1; + break; case GESTURE_O: gesture = KEY_GESTURE_O; break; @@ -319,6 +324,31 @@ static void fts_gesture_report(struct input_dev *input_dev, int gesture_id) FTS_INFO("Gesture got but wakeable not set. Skip this gesture."); return; } +#ifdef CONFIG_FTS_DOUBLE_TAP_CONTROL + /* report double tap */ + if (gesture == KEY_GESTURE_U) { + if (fts_data->imports && fts_data->imports->report_gesture) { + struct gesture_event_data event; + + FTS_INFO("invoke imported report double tap gesture function\n"); + event.evcode = 4; + /* call class method */ + ret = fts_data->imports->report_gesture(&event); + ++report_cnt; + } + /* report single tap */ + } else if (gesture == KEY_GESTURE_F1) { + if (fts_data->imports && fts_data->imports->report_gesture) { + struct gesture_event_data event; + + FTS_INFO("invoke imported report single tap gesture function\n"); + event.evcode = 1; + /* call class method */ + ret = fts_data->imports->report_gesture(&event); + ++report_cnt; + } + } +#else /* report single tap */ if (gesture == KEY_GESTURE_U) { if (fts_data->imports && fts_data->imports->report_gesture) { @@ -331,6 +361,7 @@ static void fts_gesture_report(struct input_dev *input_dev, int gesture_id) ++report_cnt; } } +#endif FTS_INFO("input report: %d", report_cnt); if (report_cnt >= REPORT_MAX_COUNT) @@ -438,7 +469,11 @@ int fts_gesture_suspend(struct fts_ts_data *ts_data) } for (i = 0; i < 5; i++) { +#ifdef CONFIG_FTS_DOUBLE_TAP_CONTROL + fts_write_reg(0xD1, ts_data->gsx_cmd); +#else fts_write_reg(0xD1, 0xFF); +#endif fts_write_reg(0xD2, 0xFF); fts_write_reg(0xD5, 0xFF); fts_write_reg(0xD6, 0xFF); diff --git a/drivers/input/touchscreen/focaltech_touch_v3/focaltech_ts_mmi.c b/drivers/input/touchscreen/focaltech_touch_v3/focaltech_ts_mmi.c index d34fdb525ed6..4f84977d7edc 100644 --- a/drivers/input/touchscreen/focaltech_touch_v3/focaltech_ts_mmi.c +++ b/drivers/input/touchscreen/focaltech_touch_v3/focaltech_ts_mmi.c @@ -235,6 +235,7 @@ static int fts_mmi_panel_state(struct device *dev, struct fts_ts_platform_data *pdata; struct fts_ts_data *ts_data; int ret = 0; + static u8 gesture_command = 0; GET_TS_DATA(dev); pdata = ts_data->pdata; @@ -259,6 +260,26 @@ static int fts_mmi_panel_state(struct device *dev, #endif break; + case TS_MMI_PM_GESTURE_CLI_SINGLE: + gesture_command |= (1 << 7); + FTS_INFO("Enable GESTURE_CLI_SINGLE command: %02x", gesture_command); + break; + + case TS_MMI_PM_GESTURE_CLI_DOUBLE: + gesture_command |= (1 << 4); + FTS_INFO("Enable GESTURE_CLI_DOUBLE command: %02x", gesture_command); + break; + + case TS_MMI_PM_GESTURE_SWITCH: + FTS_INFO("CLI GESTURE SWITCH command: %02x", gesture_command); + ts_data->gsx_cmd = gesture_command; + if (fts_gesture_suspend(ts_data) == 0) { + ts_data->wakeable = true; + ts_data->gesture_support = true; + } + gesture_command = 0; + break; + case TS_MMI_PM_ACTIVE: break; default: