summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordavidycchen <davidycchen@google.com>2022-03-30 10:51:41 +0800
committerdavidycchen <davidycchen@google.com>2022-05-11 12:48:08 +0800
commit6f4670c7013b792875b8ce24fc66162c0a4f8009 (patch)
tree83fbea188d076b6d8ae05752d4e102e71e7c126f
parent921d8675e43f11ab8ec2b41b22824ba18439bf88 (diff)
downloadsynaptics_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.c108
-rw-r--r--syna_tcm2.h19
-rw-r--r--tcm/synaptics_touchcom_core_dev.h6
-rw-r--r--tcm/synaptics_touchcom_core_v1.c7
-rw-r--r--tcm/synaptics_touchcom_func_base.c3
-rw-r--r--tcm/synaptics_touchcom_func_touch.c3
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: