summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuper Liu <supercjliu@google.com>2022-10-05 15:30:21 +0800
committerSuper Liu <supercjliu@google.com>2022-10-05 15:58:59 +0800
commit0717d32c11c0b86202d5aa56b6b592f19c9f184d (patch)
tree491ab6d20872cbcb9777b28f38f567a357bde000
parent45264c04302c3d53c0d5f445d3d563dd5f5f3a55 (diff)
downloadnovatek_touch-0717d32c11c0b86202d5aa56b6b592f19c9f184d.tar.gz
touch/novatek: support Single Tap to Wakeup(STTW) gesture.
Bug: 250997952 Signed-off-by: Super Liu <supercjliu@google.com> Change-Id: I8a66d26d5b045c55026977c142142904162eb157
-rw-r--r--nt36xxx/nt36xxx.c145
-rw-r--r--nt36xxx/nt36xxx.h18
-rw-r--r--nt36xxx/nt36xxx_goog.c8
3 files changed, 71 insertions, 100 deletions
diff --git a/nt36xxx/nt36xxx.c b/nt36xxx/nt36xxx.c
index 09b806c..4f2006f 100644
--- a/nt36xxx/nt36xxx.c
+++ b/nt36xxx/nt36xxx.c
@@ -111,24 +111,43 @@ const uint16_t touch_key_array[TOUCH_KEY_NUM] = {
};
#endif
-const uint16_t gesture_key_array[] = {
- KEY_POWER, //GESTURE_WORD_C
- KEY_POWER, //GESTURE_WORD_W
- KEY_POWER, //GESTURE_WORD_V
#if defined(CONFIG_SOC_GOOGLE)
- KEY_WAKEUP, //GESTURE_DOUBLE_CLICK
+const unsigned int gesture_keycode[GESTURE_ID_MAX] = {
+ [GESTURE_SINGLE_TAP] = KEY_WAKEUP,
+ [GESTURE_DOUBLE_TAP] = KEY_WAKEUP,
+};
#else
- KEY_POWER, //GESTURE_DOUBLE_CLICK
-#endif
- KEY_POWER, //GESTURE_WORD_Z
- KEY_POWER, //GESTURE_WORD_M
- KEY_POWER, //GESTURE_WORD_O
- KEY_POWER, //GESTURE_WORD_e
- KEY_POWER, //GESTURE_WORD_S
- KEY_POWER, //GESTURE_SLIDE_UP
- KEY_POWER, //GESTURE_SLIDE_DOWN
- KEY_POWER, //GESTURE_SLIDE_LEFT
- KEY_POWER, //GESTURE_SLIDE_RIGHT
+const unsigned int gesture_keycode[GESTURE_ID_MAX] = {
+ [GESTURE_WORD_C] = KEY_POWER,
+ [GESTURE_WORD_W] = KEY_POWER,
+ [GESTURE_SINGLE_TAP] = KEY_POWER,
+ [GESTURE_DOUBLE_TAP] = KEY_POWER,
+ [GESTURE_WORD_Z] = KEY_POWER,
+ [GESTURE_WORD_M] = KEY_POWER,
+ [GESTURE_WORD_O] = KEY_POWER,
+ [GESTURE_WORD_e] = KEY_POWER,
+ [GESTURE_WORD_S] = KEY_POWER,
+ [GESTURE_SLIDE_UP] = KEY_POWER,
+ [GESTURE_SLIDE_DOWN] = KEY_POWER,
+ [GESTURE_SLIDE_LEFT] = KEY_POWER,
+ [GESTURE_SLIDE_RIGHT] = KEY_POWER,
+};
+#endif
+
+const char *gesture_string[GESTURE_ID_MAX] = {
+ [GESTURE_WORD_C] = "Word-C",
+ [GESTURE_WORD_W] = "Word-W",
+ [GESTURE_SINGLE_TAP] = "Single Tap",
+ [GESTURE_DOUBLE_TAP] = "Double Tap",
+ [GESTURE_WORD_Z] = "Word-Z",
+ [GESTURE_WORD_M] = "Word-M",
+ [GESTURE_WORD_O] = "Word-O",
+ [GESTURE_WORD_e] = "Word-e",
+ [GESTURE_WORD_S] = "Word-S",
+ [GESTURE_SLIDE_UP] = "Slide UP",
+ [GESTURE_SLIDE_DOWN] = "Slide DOWN",
+ [GESTURE_SLIDE_LEFT] = "Slide LEFT",
+ [GESTURE_SLIDE_RIGHT] = "Slide UP",
};
#ifdef CONFIG_MTK_SPI
@@ -1064,19 +1083,6 @@ static void nvt_flash_proc_deinit(void)
}
#endif
-#define GESTURE_WORD_C 12
-#define GESTURE_WORD_W 13
-#define GESTURE_WORD_V 14
-#define GESTURE_DOUBLE_CLICK 15
-#define GESTURE_WORD_Z 16
-#define GESTURE_WORD_M 17
-#define GESTURE_WORD_O 18
-#define GESTURE_WORD_e 19
-#define GESTURE_WORD_S 20
-#define GESTURE_SLIDE_UP 21
-#define GESTURE_SLIDE_DOWN 22
-#define GESTURE_SLIDE_LEFT 23
-#define GESTURE_SLIDE_RIGHT 24
/* customized gesture id */
#define DATA_PROTOCOL 30
@@ -1092,83 +1098,29 @@ return:
*******************************************************/
void nvt_ts_wakeup_gesture_report(uint8_t gesture_id, uint8_t *data)
{
- uint32_t keycode = 0;
+ unsigned int keycode = 0;
uint8_t func_type = data[2];
uint8_t func_id = data[3];
- /* support fw specifal data protocol */
+ /* support fw special data protocol */
if ((gesture_id == DATA_PROTOCOL) && (func_type == FUNCPAGE_GESTURE)) {
gesture_id = func_id;
- } else if (gesture_id > DATA_PROTOCOL) {
- NVT_ERR("gesture_id %d is invalid, func_type=%d, func_id=%d\n", gesture_id,
+ } else if (gesture_id > DATA_PROTOCOL || gesture_id >= GESTURE_ID_MAX) {
+ NVT_ERR("gesture_id %d is invalid, func_type %d, func_id %d\n", gesture_id,
func_type, func_id);
return;
}
- NVT_LOG("gesture_id = %d\n", gesture_id);
-
- switch (gesture_id) {
- case GESTURE_WORD_C:
- NVT_LOG("Gesture : Word-C.\n");
- keycode = gesture_key_array[0];
- break;
- case GESTURE_WORD_W:
- NVT_LOG("Gesture : Word-W.\n");
- keycode = gesture_key_array[1];
- break;
- case GESTURE_WORD_V:
- NVT_LOG("Gesture : Word-V.\n");
- keycode = gesture_key_array[2];
- break;
- case GESTURE_DOUBLE_CLICK:
- NVT_LOG("Gesture : Double Click.\n");
- keycode = gesture_key_array[3];
- break;
- case GESTURE_WORD_Z:
- NVT_LOG("Gesture : Word-Z.\n");
- keycode = gesture_key_array[4];
- break;
- case GESTURE_WORD_M:
- NVT_LOG("Gesture : Word-M.\n");
- keycode = gesture_key_array[5];
- break;
- case GESTURE_WORD_O:
- NVT_LOG("Gesture : Word-O.\n");
- keycode = gesture_key_array[6];
- break;
- case GESTURE_WORD_e:
- NVT_LOG("Gesture : Word-e.\n");
- keycode = gesture_key_array[7];
- break;
- case GESTURE_WORD_S:
- NVT_LOG("Gesture : Word-S.\n");
- keycode = gesture_key_array[8];
- break;
- case GESTURE_SLIDE_UP:
- NVT_LOG("Gesture : Slide UP.\n");
- keycode = gesture_key_array[9];
- break;
- case GESTURE_SLIDE_DOWN:
- NVT_LOG("Gesture : Slide DOWN.\n");
- keycode = gesture_key_array[10];
- break;
- case GESTURE_SLIDE_LEFT:
- NVT_LOG("Gesture : Slide LEFT.\n");
- keycode = gesture_key_array[11];
- break;
- case GESTURE_SLIDE_RIGHT:
- NVT_LOG("Gesture : Slide RIGHT.\n");
- keycode = gesture_key_array[12];
- break;
- default:
- break;
- }
-
- if (keycode > 0) {
+ keycode = gesture_keycode[gesture_id];
+ if (keycode) {
+ NVT_LOG("Gesture: %s(%d) triggered and report keycode(%d).\n",
+ gesture_string[gesture_id], gesture_id, keycode);
input_report_key(ts->input_dev, keycode, 1);
input_sync(ts->input_dev);
input_report_key(ts->input_dev, keycode, 0);
input_sync(ts->input_dev);
+ } else {
+ NVT_ERR("invalid gesture_id %d!\n", gesture_id);
}
}
@@ -2355,12 +2307,11 @@ static int32_t nvt_ts_probe(struct spi_device *client)
#if WAKEUP_GESTURE
for (retry = 0;
- retry < (sizeof(gesture_key_array) / sizeof(gesture_key_array[0]));
+ retry < ARRAY_SIZE(gesture_keycode);
retry++) {
- input_set_capability(ts->input_dev, EV_KEY, gesture_key_array[retry]);
+ if (gesture_keycode[retry])
+ input_set_capability(ts->input_dev, EV_KEY, gesture_keycode[retry]);
}
-#elif defined(CONFIG_SOC_GOOGLE)
- input_set_capability(ts->input_dev, EV_KEY, KEY_WAKEUP);
#endif
snprintf(ts->phys, sizeof(ts->phys), "input/ts");
diff --git a/nt36xxx/nt36xxx.h b/nt36xxx/nt36xxx.h
index e6531a0..9d06636 100644
--- a/nt36xxx/nt36xxx.h
+++ b/nt36xxx/nt36xxx.h
@@ -117,7 +117,6 @@ extern const uint16_t touch_key_array[TOUCH_KEY_NUM];
#define REPORT_PROTOCOL_B 0
#define NVT_TOUCH_MP 1
#define WAKEUP_GESTURE 1
-extern const uint16_t gesture_key_array[];
#define BOOT_UPDATE_FIRMWARE 1
#define BOOT_UPDATE_FIRMWARE_MS_DELAY 100
#define BOOT_UPDATE_FIRMWARE_NAME "novatek_ts_fw.bin"
@@ -179,6 +178,23 @@ enum {
/* FW History */
#define NVT_HISTORY_BUF_LEN (65 * 4)
+enum gesture_id : u8 {
+ GESTURE_WORD_C = 12,
+ GESTURE_WORD_W = 13,
+ GESTURE_SINGLE_TAP = 14,
+ GESTURE_DOUBLE_TAP = 15,
+ GESTURE_WORD_Z = 16,
+ GESTURE_WORD_M = 17,
+ GESTURE_WORD_O = 18,
+ GESTURE_WORD_e = 19,
+ GESTURE_WORD_S = 20,
+ GESTURE_SLIDE_UP = 21,
+ GESTURE_SLIDE_DOWN = 22,
+ GESTURE_SLIDE_LEFT = 23,
+ GESTURE_SLIDE_RIGHT = 24,
+ GESTURE_ID_MAX,
+};
+
struct nvt_ts_data {
struct spi_device *client;
struct input_dev *input_dev;
diff --git a/nt36xxx/nt36xxx_goog.c b/nt36xxx/nt36xxx_goog.c
index d55ecb7..71eb3ff 100644
--- a/nt36xxx/nt36xxx_goog.c
+++ b/nt36xxx/nt36xxx_goog.c
@@ -157,7 +157,7 @@ int nvt_callback(void *private_data,
static bool grip_enabled;
static bool palm_enabled;
static bool sensing_enabled = true;
-
+ static bool display_state_on = true;
switch (cmd_type) {
case GTI_CMD_PING:
@@ -325,8 +325,10 @@ int nvt_callback(void *private_data,
* Need to have post-delay for touch FW to complete before return
* to display driver after GTI scheduled the suspend workqueue.
*/
- msleep(NVT_SUSPEND_POST_MS_DELAY);
+ if (display_state_on)
+ msleep(NVT_SUSPEND_POST_MS_DELAY);
NVT_LOG("GTI_DISPLAY_STATE_OFF\n");
+ display_state_on = false;
} else if (cmd->display_state_cmd.setting == GTI_DISPLAY_STATE_ON) {
u32 locks = goog_pm_wake_get_locks(ts->gti);
@@ -341,8 +343,10 @@ int nvt_callback(void *private_data,
NVT_LOG("reenable touch for locks %#x.", locks);
nvt_ts_suspend(&ts->client->dev);
nvt_ts_resume(&ts->client->dev);
+ sensing_enabled = true;
}
NVT_LOG("GTI_DISPLAY_STATE_ON");
+ display_state_on = true;
} else {
NVT_ERR("invalid setting %d!\n", cmd->display_state_cmd.setting);
}