diff options
author | davidycchen <davidycchen@google.com> | 2022-03-30 10:51:41 +0800 |
---|---|---|
committer | davidycchen <davidycchen@google.com> | 2022-05-11 12:48:08 +0800 |
commit | 6f4670c7013b792875b8ce24fc66162c0a4f8009 (patch) | |
tree | 83fbea188d076b6d8ae05752d4e102e71e7c126f | |
parent | 921d8675e43f11ab8ec2b41b22824ba18439bf88 (diff) | |
download | synaptics_touch-6f4670c7013b792875b8ce24fc66162c0a4f8009.tar.gz |
synaptics: Support touch orientation
Update the vendor driver to v1.2.7 to support touch orientation and
google defined major/minor.
Add the touch offload capability for orientation.
Bug: 227402881.
Test: Check the touch reports by getevent.
Signed-off-by: davidycchen <davidycchen@google.com>
Change-Id: I42277e0e717b22c56ec0482fcb42c962b1d910d7
-rw-r--r-- | syna_tcm2.c | 108 | ||||
-rw-r--r-- | syna_tcm2.h | 19 | ||||
-rw-r--r-- | tcm/synaptics_touchcom_core_dev.h | 6 | ||||
-rw-r--r-- | tcm/synaptics_touchcom_core_v1.c | 7 | ||||
-rw-r--r-- | tcm/synaptics_touchcom_func_base.c | 3 | ||||
-rw-r--r-- | tcm/synaptics_touchcom_func_touch.c | 3 |
6 files changed, 114 insertions, 32 deletions
diff --git a/syna_tcm2.c b/syna_tcm2.c index 7f52ec5..80e4da2 100644 --- a/syna_tcm2.c +++ b/syna_tcm2.c @@ -440,29 +440,47 @@ static int syna_dev_parse_custom_touch_data_cb(const unsigned char code, const unsigned char *report, unsigned int *report_offset, unsigned int report_size, void *callback_data) { - /** - * sample code to demonstrate how to parse the custom touch entity - * from the touch report, additional modifications will be needed. - * - * struct syna_tcm *tcm = (struct syna_tcm *)callback_data; - * unsigned int data; - * unsigned int bits; - * - * switch (code) { - * case CUSTOM_ENTITY_CODE: - * bits = config[(*config_offset)++]; - * syna_tcm_get_touch_data(report, report_size, - * *report_offset, bits, &data); - * - * *report_offset += bits; - * return bits; - * default: - * LOGW("Unknown touch config code (idx:%d 0x%02x)\n", - * *config_offset, code); - * return (-EINVAL); - * } - * - */ + struct syna_tcm *tcm = (struct syna_tcm *)callback_data; + struct tcm_touch_data_blob *touch_data; + struct tcm_objects_data_blob *object_data; + unsigned int data; + unsigned int bits; + + touch_data = &tcm->tp_data; + object_data = touch_data->object_data; + + switch (code) { + case TOUCH_ENTITY_CUSTOM_ANGLE: + bits = config[(*config_offset)++]; + syna_tcm_get_touch_data(report, report_size, + *report_offset, bits, &data); + + object_data[touch_data->obji].custom_data[CUSTOM_DATA_ANGLE] = data; + + *report_offset += bits; + return bits; + case TOUCH_ENTITY_CUSTOM_MAJOR: + bits = config[(*config_offset)++]; + syna_tcm_get_touch_data(report, report_size, + *report_offset, bits, &data); + + object_data[touch_data->obji].custom_data[CUSTOM_DATA_MAJOR] = data; + + *report_offset += bits; + return bits; + case TOUCH_ENTITY_CUSTOM_MINOR: + bits = config[(*config_offset)++]; + syna_tcm_get_touch_data(report, report_size, + *report_offset, bits, &data); + + object_data[touch_data->obji].custom_data[CUSTOM_DATA_MINOR] = data; + *report_offset += bits; + return bits; + default: + LOGW("Unknown touch config code (idx:%d 0x%02x)\n", + *config_offset, code); + return (-EINVAL); + } return (-EINVAL); } @@ -630,8 +648,15 @@ static void syna_dev_report_input_events(struct syna_tcm *tcm) unsigned int x; unsigned int y; unsigned int z; +#ifdef ENABLE_CUSTOM_TOUCH_ENTITY + int major; + int minor; + int angle; +#else int wx; int wy; +#endif + unsigned int status; unsigned int touch_count; struct input_dev *input_dev = tcm->input_dev; @@ -694,12 +719,22 @@ static void syna_dev_report_input_events(struct syna_tcm *tcm) case PALM: x = object_data[idx].x_pos; y = object_data[idx].y_pos; +#ifdef ENABLE_CUSTOM_TOUCH_ENTITY + major = object_data[idx].custom_data[CUSTOM_DATA_MAJOR]; + minor = object_data[idx].custom_data[CUSTOM_DATA_MINOR]; + angle = object_data[idx].custom_data[CUSTOM_DATA_ANGLE]; + LOGD("Finger %d: major = %d, minor = %d, angle = %d.\n", + idx, major, minor, (s8) angle); + /* Report major and minor in display pixels. */ + major = major * tcm->hw_if->pixels_per_mm; + minor = minor * tcm->hw_if->pixels_per_mm; +#else wx = object_data[idx].x_width; wy = object_data[idx].y_width; - /* Report major and minor in display pixels. */ wx = wx * tcm->hw_if->pixels_per_mm; wy = wy * tcm->hw_if->pixels_per_mm; +#endif if (object_data[idx].z == 0) { z = 1; @@ -723,8 +758,14 @@ static void syna_dev_report_input_events(struct syna_tcm *tcm) tcm->offload.coords[idx].x = x; tcm->offload.coords[idx].y = y; tcm->offload.coords[idx].pressure = z; - tcm->offload.coords[idx].major = wx; - tcm->offload.coords[idx].minor = wy; +#ifdef ENABLE_CUSTOM_TOUCH_ENTITY + tcm->offload.coords[idx].major = major; + tcm->offload.coords[idx].minor = minor; + tcm->offload.coords[idx].rotation = (s16) (((s8) angle) * 2048 / 45); +#else + tcm->offload.coords[idx].major = MAX(wx, wy); + tcm->offload.coords[idx].minor = MIN(wx, wy); +#endif if (!tcm->offload.offload_running) { #endif #ifdef TYPE_B_PROTOCOL @@ -738,11 +779,20 @@ static void syna_dev_report_input_events(struct syna_tcm *tcm) input_report_abs(input_dev, ABS_MT_POSITION_Y, y); input_report_abs(input_dev, ABS_MT_PRESSURE, z); #ifdef REPORT_TOUCH_WIDTH +#ifdef ENABLE_CUSTOM_TOUCH_ENTITY + input_report_abs(input_dev, + ABS_MT_TOUCH_MAJOR, major); + input_report_abs(input_dev, + ABS_MT_TOUCH_MINOR, minor); + input_report_abs(input_dev, + ABS_MT_ORIENTATION, (s16) (((s8) angle) * 2048 / 45)); +#else input_report_abs(input_dev, ABS_MT_TOUCH_MAJOR, MAX(wx, wy)); input_report_abs(input_dev, ABS_MT_TOUCH_MINOR, MIN(wx, wy)); #endif +#endif #ifndef TYPE_B_PROTOCOL input_mt_sync(input_dev); #endif @@ -856,6 +906,9 @@ static int syna_dev_create_input_device(struct syna_tcm *tcm) ABS_MT_TOUCH_MINOR, 0, tcm_dev->max_y, 0, 0); #endif + input_set_abs_params(input_dev, + ABS_MT_ORIENTATION, -4096, 4096, 0, 0); + tcm->input_dev_params.max_x = tcm_dev->max_x; tcm->input_dev_params.max_y = tcm_dev->max_y; tcm->input_dev_params.max_objects = tcm_dev->max_objects; @@ -1063,6 +1116,8 @@ static void syna_offload_report(void *handle, report->coords[i].minor); input_report_abs(tcm->input_dev, ABS_MT_PRESSURE, report->coords[i].pressure); + input_report_abs(tcm->input_dev, ABS_MT_ORIENTATION, + report->coords[i].rotation); } else { input_mt_slot(tcm->input_dev, i); input_report_abs(tcm->input_dev, ABS_MT_PRESSURE, 0); @@ -2824,6 +2879,7 @@ static int syna_dev_probe(struct platform_device *pdev) tcm->offload.caps.noise_reporting = false; tcm->offload.caps.cancel_reporting = false; tcm->offload.caps.size_reporting = true; + tcm->offload.caps.rotation_reporting = true; tcm->offload.caps.filter_grip = true; tcm->offload.caps.filter_palm = true; tcm->offload.caps.num_sensitivity_settings = 1; diff --git a/syna_tcm2.h b/syna_tcm2.h index 908ddaa..b453be6 100644 --- a/syna_tcm2.h +++ b/syna_tcm2.h @@ -70,7 +70,7 @@ #define SYNAPTICS_TCM_DRIVER_ID (1 << 0) #define SYNAPTICS_TCM_DRIVER_VERSION 1 -#define SYNAPTICS_TCM_DRIVER_SUBVER "2.6" +#define SYNAPTICS_TCM_DRIVER_SUBVER "2.7" /** * @section: Driver Configurations @@ -380,6 +380,23 @@ enum custom_gesture_type { }; #endif +#if defined(ENABLE_CUSTOM_TOUCH_ENTITY) +/** + * @brief: Custom touch entity code + */ +enum custom_gesture_type { + TOUCH_ENTITY_CUSTOM_ANGLE = 0xD1, + TOUCH_ENTITY_CUSTOM_MAJOR = 0xD2, + TOUCH_ENTITY_CUSTOM_MINOR = 0xD3, +}; + +enum custom_data { + CUSTOM_DATA_ANGLE = 0x0, + CUSTOM_DATA_MAJOR = 0x1, + CUSTOM_DATA_MINOR = 0x2, +}; +#endif + /** * @brief: context of the synaptics linux-based driver * diff --git a/tcm/synaptics_touchcom_core_dev.h b/tcm/synaptics_touchcom_core_dev.h index 0871dbc..c42607d 100644 --- a/tcm/synaptics_touchcom_core_dev.h +++ b/tcm/synaptics_touchcom_core_dev.h @@ -44,7 +44,7 @@ #include "syna_tcm2_platform.h" -#define SYNA_TCM_CORE_LIB_VERSION 0x0118 +#define SYNA_TCM_CORE_LIB_VERSION 0x0119 /** @@ -515,6 +515,7 @@ struct tcm_objects_data_blob { unsigned int z; unsigned int tx_pos; unsigned int rx_pos; + unsigned int custom_data[5]; }; struct tcm_gesture_data_blob { union { @@ -533,6 +534,7 @@ struct tcm_gesture_data_blob { struct tcm_touch_data_blob { /* for each active objects */ + unsigned int obji; unsigned int num_of_active_objects; struct tcm_objects_data_blob object_data[MAX_NUM_OBJECTS]; @@ -982,7 +984,6 @@ static inline void syna_tcm_buf_lock(struct tcm_buffer *pbuf) { if (pbuf->ref_cnt != 0) { LOGE("Buffer access out-of balance, %d\n", pbuf->ref_cnt); - return; } syna_pal_mutex_lock(&pbuf->buf_mutex); @@ -1003,7 +1004,6 @@ static inline void syna_tcm_buf_unlock(struct tcm_buffer *pbuf) { if (pbuf->ref_cnt != 1) { LOGE("Buffer access out-of balance, %d\n", pbuf->ref_cnt); - return; } pbuf->ref_cnt--; diff --git a/tcm/synaptics_touchcom_core_v1.c b/tcm/synaptics_touchcom_core_v1.c index 17a7ca4..3030187 100644 --- a/tcm/synaptics_touchcom_core_v1.c +++ b/tcm/synaptics_touchcom_core_v1.c @@ -1079,10 +1079,13 @@ check_response: if (resp_code) *resp_code = tcm_msg->status_report_code; - if (tcm_msg->response_code != STATUS_OK) + if (tcm_msg->response_code != STATUS_OK) { + LOGE("Received code 0x%02x (command 0x%02x)\n", + tcm_msg->status_report_code, tcm_msg->command); retval = _EIO; - else + } else { retval = 0; + } exit: tcm_msg->command = CMD_NONE; diff --git a/tcm/synaptics_touchcom_func_base.c b/tcm/synaptics_touchcom_func_base.c index 22b63e6..c82e0f5 100644 --- a/tcm/synaptics_touchcom_func_base.c +++ b/tcm/synaptics_touchcom_func_base.c @@ -1658,6 +1658,9 @@ int syna_tcm_send_command(struct tcm_dev *tcm_dev, payload_length, code, delay_ms_resp); + if (retval < 0) { + LOGE("Fail to run command 0x%02x\n", command); + } LOGD("Status code returned: 0x%02x\n", *code); diff --git a/tcm/synaptics_touchcom_func_touch.c b/tcm/synaptics_touchcom_func_touch.c index d4fd617..137169f 100644 --- a/tcm/synaptics_touchcom_func_touch.c +++ b/tcm/synaptics_touchcom_func_touch.c @@ -164,6 +164,8 @@ static int syna_tcm_get_gesture_data(const unsigned char *report, } switch (gesture_id) { + case GESTURE_ID_NONE: + break; case GESTURE_ID_DOUBLE_TAP: case GESTURE_ID_ACTIVE_TAP_AND_HOLD: case GESTURE_ID_ACTIVE_SINGLE_TAP: @@ -334,6 +336,7 @@ int syna_tcm_parse_touch_report(struct tcm_dev *tcm_dev, return retval; } obj = data; + touch_data->obji = data; offset += bits; break; case TOUCH_REPORT_OBJECT_N_CLASSIFICATION: |