diff options
author | Super Liu <supercjliu@google.com> | 2022-10-05 15:30:21 +0800 |
---|---|---|
committer | Super Liu <supercjliu@google.com> | 2022-10-05 15:58:59 +0800 |
commit | 0717d32c11c0b86202d5aa56b6b592f19c9f184d (patch) | |
tree | 491ab6d20872cbcb9777b28f38f567a357bde000 | |
parent | 45264c04302c3d53c0d5f445d3d563dd5f5f3a55 (diff) | |
download | novatek_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.c | 145 | ||||
-rw-r--r-- | nt36xxx/nt36xxx.h | 18 | ||||
-rw-r--r-- | nt36xxx/nt36xxx_goog.c | 8 |
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); } |