summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWendly Li <wendlyli@google.com>2023-03-08 09:47:07 +0000
committerAndroid Partner Code Review <android-gerrit-partner@google.com>2023-03-08 09:47:07 +0000
commitf1f49bd734cb33ed7aea62d6c71fd0e6274bbda4 (patch)
tree65b8cb2e8b2738818a998c03716207efc2c6c328
parentd779bd663b3e55e0a4e6e12120a62713e8c05b1c (diff)
parent008f0d1b2a19772fb92b035b10474031e2118c26 (diff)
downloadgoodix_touch-f1f49bd734cb33ed7aea62d6c71fd0e6274bbda4.tar.gz
Merge changes I2b155400,I3e2da8ca,I4fb79170 into android14-gs-pixel-5.15
* changes: touch/goodix: Import v1.2.4 driver touch/goodix: Import v1.2.3 driver touch: goodix: Update report stylus event
-rw-r--r--goodix_brl_hw.c3
-rw-r--r--goodix_ts_core.c37
-rw-r--r--goodix_ts_core.h24
-rw-r--r--goodix_ts_proc.c33
4 files changed, 81 insertions, 16 deletions
diff --git a/goodix_brl_hw.c b/goodix_brl_hw.c
index 505e8ec..435658a 100644
--- a/goodix_brl_hw.c
+++ b/goodix_brl_hw.c
@@ -1242,7 +1242,8 @@ static int brl_event_handler(
memset(ts_event, 0, sizeof(*ts_event));
ts_event->event_type = EVENT_INVALID;
- ts_event->clear_count = event_data->clear_count;
+ ts_event->clear_count1 = event_data->clear_count1;
+ ts_event->clear_count2 = event_data->clear_count2;
/* read status event */
if (event_data->status_changed)
hw_ops->read(cd, 0x1021C, (u8 *)&ts_event->status_data,
diff --git a/goodix_ts_core.c b/goodix_ts_core.c
index 83044a4..036200d 100644
--- a/goodix_ts_core.c
+++ b/goodix_ts_core.c
@@ -1582,15 +1582,25 @@ static int goodix_parse_dt(
#endif
static void goodix_ts_report_pen(
- struct input_dev *dev, struct goodix_pen_data *pen_data)
+ struct goodix_ts_core *cd, struct goodix_pen_data *pen_data)
{
+ struct input_dev *dev = cd->pen_dev;
int i;
static unsigned int pen_pressure;
struct goodix_hid_hogp *hogp;
+ char trace_tag[128];
+ ktime_t pen_ktime;
mutex_lock(&dev->mutex);
+ input_set_timestamp(dev, cd->coords_timestamp);
+ pen_ktime = ktime_get();
if (pen_data->coords.status == TS_TOUCH) {
+ scnprintf(trace_tag, sizeof(trace_tag),
+ "stylus-active: IN_TS=%lld TS=%lld DELTA=%lld ns.\n",
+ ktime_to_ns(cd->coords_timestamp), ktime_to_ns(pen_ktime),
+ ktime_to_ns(ktime_sub(pen_ktime, cd->coords_timestamp)));
+ ATRACE_BEGIN(trace_tag);
input_report_key(dev, BTN_TOUCH, 1);
input_report_key(dev, pen_data->coords.tool_type, 1);
input_report_abs(dev, ABS_X, pen_data->coords.x);
@@ -1605,7 +1615,8 @@ static void goodix_ts_report_pen(
goodix_ble_data.hogp_ready = 0;
mutex_unlock(&goodix_ble_data.lock);
- pen_data->coords.p = pen_pressure;
+ if (pen_data->coords.p && pen_pressure)
+ pen_data->coords.p = pen_pressure;
input_report_abs(dev, ABS_PRESSURE, pen_data->coords.p);
if (pen_data->coords.p == 0)
input_report_abs(dev, ABS_DISTANCE, 1);
@@ -1621,6 +1632,11 @@ static void goodix_ts_report_pen(
pen_data->keys[0].status == TS_TOUCH ? 1 : 0,
pen_data->keys[1].status == TS_TOUCH ? 1 : 0);
} else {
+ scnprintf(trace_tag, sizeof(trace_tag),
+ "stylus-inactive: IN_TS=%lld TS=%lld DELTA=%lld ns.\n",
+ ktime_to_ns(cd->coords_timestamp), ktime_to_ns(pen_ktime),
+ ktime_to_ns(ktime_sub(pen_ktime, cd->coords_timestamp)));
+ ATRACE_BEGIN(trace_tag);
pen_pressure = 0;
input_report_key(dev, BTN_TOUCH, 0);
input_report_key(dev, pen_data->coords.tool_type, 0);
@@ -1632,8 +1648,8 @@ static void goodix_ts_report_pen(
else
input_report_key(dev, pen_data->keys[i].code, 0);
}
-
input_sync(dev);
+ ATRACE_END();
mutex_unlock(&dev->mutex);
}
@@ -1850,10 +1866,13 @@ void goodix_ts_report_status(struct goodix_ts_core *core_data,
st->grip_change, st->noise_lv_change, st->palm_change,
st->soft_reset, st->base_update, st->hop_change,
st->water_change);
- ts_info("water_status[%d] before_factorA[%d] after_factorA[%d] base_update_type[0x%x] soft_reset_type[0x%x] palm_status[%d] noise_lv[%d] grip_type[%d] event_id[%d] clear_count[%d]",
- st->water_sta, st->before_factorA, st->after_factorA,
- st->base_update_type, st->soft_reset_type, st->palm_sta,
- st->noise_lv, st->grip_type, st->event_id, ts_event->clear_count);
+ ts_info("water_status[%d] before_factorA[%d] after_factorA[%d]" \
+ " base_update_type[0x%x] soft_reset_type[0x%x] palm_status[%d]" \
+ " noise_lv[%d] grip_type[%d] event_id[%d] clear_count1[%d]" \
+ " clear_count2[%d]", st->water_sta, st->before_factorA,
+ st->after_factorA, st->base_update_type, st->soft_reset_type,
+ st->palm_sta, st->noise_lv, st->grip_type, st->event_id,
+ ts_event->clear_count1, ts_event->clear_count2);
#if IS_ENABLED(CONFIG_GOOG_TOUCH_INTERFACE)
if (st->soft_reset)
goog_notify_fw_status_changed(core_data->gti, GTI_FW_STATUS_RESET,
@@ -1947,8 +1966,8 @@ static irqreturn_t goodix_ts_threadirq_func(int irq, void *data)
}
if (core_data->board_data.pen_enable &&
ts_event->event_type & EVENT_PEN) {
- goodix_ts_report_pen(
- core_data->pen_dev, &ts_event->pen_data);
+ core_data->coords_timestamp = core_data->isr_timestamp;
+ goodix_ts_report_pen(core_data, &ts_event->pen_data);
}
if (ts_event->event_type & EVENT_REQUEST)
goodix_ts_request_handle(core_data, ts_event);
diff --git a/goodix_ts_core.h b/goodix_ts_core.h
index 44f136c..74382a2 100644
--- a/goodix_ts_core.h
+++ b/goodix_ts_core.h
@@ -47,10 +47,16 @@
#if IS_ENABLED(CONFIG_GOOG_TOUCH_INTERFACE)
#include <goog_touch_interface.h>
#endif
+#if IS_ENABLED(CONFIG_VH_SYSTRACE)
+#include <trace/hooks/systrace.h>
+#else
+#define ATRACE_BEGIN(f)
+#define ATRACE_END()
+#endif
#define GOODIX_CORE_DRIVER_NAME "goodix_ts"
#define GOODIX_PEN_DRIVER_NAME "goodix_ts,pen"
-#define GOODIX_DRIVER_VERSION "v1.2.2"
+#define GOODIX_DRIVER_VERSION "v1.2.4"
#define GOODIX_MAX_TOUCH 10
#define GOODIX_PEN_MAX_PRESSURE 4096
#define GOODIX_MAX_PEN_KEY 2
@@ -499,13 +505,16 @@ struct goodix_pen_data {
/*
* struct goodix_ts_event - touch event struct
+ * @clear_count1: clear count for old firmware
+ * @clear_count2: clear count for latest firmware
* @event_type: touch event type, touch data or
* request event
* @event_data: event data
*/
struct goodix_ts_event {
enum ts_event_type event_type;
- u8 clear_count;
+ u8 clear_count1;
+ u8 clear_count2;
u8 fp_flag; /* finger print DOWN flag */
u8 request_code; /* represent the request type */
u8 request_data[GOODIX_REQUEST_DATA_LEN];
@@ -524,7 +533,10 @@ struct goodix_ts_event_data {
u8 int_count;
u8 reserved3;
u8 reserved4 : 4;
- u8 clear_count : 4;
+ u8 clear_count1 : 4;
+ u8 reserved5;
+ u8 reserved6 : 4;
+ u8 clear_count2 : 4;
};
struct goodix_ts_request_event_data {
@@ -556,8 +568,10 @@ struct goodix_ts_touch_event_data {
u8 reset_int : 1;
u8 custom_coor_info_flag : 1;
u8 reserved3 : 3;
- u8 clear_count : 4;
- u16 reserved4;
+ u8 clear_count1 : 4;
+ u8 reserved4;
+ u8 reserved5 : 4;
+ u8 clear_count2 : 4;
u16 checksum;
u8 data[0];
};
diff --git a/goodix_ts_proc.c b/goodix_ts_proc.c
index 90031e9..3b2019c 100644
--- a/goodix_ts_proc.c
+++ b/goodix_ts_proc.c
@@ -50,6 +50,7 @@
#define CMD_GET_DUMP_LOG "get_dump_log"
#define CMD_GET_STYLUS_DATA "get_stylus_data"
#define CMD_SET_FREQ_INDEX "set_freq_index"
+#define CMD_DISABLE_FILTER "disable_filter"
char *cmd_list[] = { CMD_FW_UPDATE, CMD_AUTO_TEST, CMD_OPEN_TEST,
CMD_SELF_OPEN_TEST, CMD_NOISE_TEST, CMD_AUTO_NOISE_TEST, CMD_SHORT_TEST,
@@ -65,7 +66,7 @@ char *cmd_list[] = { CMD_FW_UPDATE, CMD_AUTO_TEST, CMD_OPEN_TEST,
CMD_SET_GRIP_MODE, CMD_SET_PALM_MODE, CMD_SET_NOISE_MODE,
CMD_SET_WATER_MODE, CMD_SET_HEATMAP, CMD_GET_SELF_COMPEN,
CMD_SET_REPORT_RATE, CMD_GET_DUMP_LOG, CMD_GET_STYLUS_DATA,
- CMD_SET_FREQ_INDEX, NULL };
+ CMD_SET_FREQ_INDEX, CMD_DISABLE_FILTER, NULL };
/* test limits keyword */
#define CSV_TP_SPECIAL_RAW_MIN "special_raw_min"
@@ -2593,6 +2594,8 @@ static void goodix_get_fw_status(void)
cd->hw_ops->read(cd, 0x1021A, &val, 1);
index += sprintf(
+ &rbuf[index], "coordfilter_status[%d] ", (val >> 7) & 0x01);
+ index += sprintf(
&rbuf[index], "set_highsense_mode[%d] ", (val >> 6) & 0x01);
index +=
sprintf(&rbuf[index], "set_noise_mode[%d] ", (val >> 4) & 0x03);
@@ -3161,6 +3164,17 @@ static void goodix_set_freq_index(int freq)
cd->hw_ops->send_cmd(cd, &temp_cmd);
}
+static void goodix_disable_coor_filter(int val)
+{
+ struct goodix_ts_cmd temp_cmd;
+
+ index = sprintf(rbuf, "disable coordinate filter %d\n", val);
+ temp_cmd.len = 5;
+ temp_cmd.cmd = 0xCA;
+ temp_cmd.data[0] = val ? 1 : 0;
+ cd->hw_ops->send_cmd(cd, &temp_cmd);
+}
+
static ssize_t driver_test_write(
struct file *file, const char __user *buf, size_t count, loff_t *pos)
{
@@ -4047,6 +4061,23 @@ static ssize_t driver_test_write(
goto exit;
}
+ if (!strncmp(p, CMD_DISABLE_FILTER, strlen(CMD_DISABLE_FILTER))) {
+ rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL);
+ token = strsep(&p, ",");
+ if (!token || !p) {
+ index = sprintf(rbuf, "%s: invalid cmd param\n",
+ CMD_DISABLE_FILTER);
+ goto exit;
+ }
+ if (kstrtos32(p, 10, &cmd_val)) {
+ index = sprintf(rbuf, "%s: invalid cmd param\n",
+ CMD_DISABLE_FILTER);
+ goto exit;
+ }
+ goodix_disable_coor_filter(cmd_val);
+ goto exit;
+ }
+
rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL);
if (!rbuf) {
ts_err("failed to alloc rbuf");