summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWendly Li <wendlyli@google.com>2022-09-28 16:27:06 +0000
committerWendly Li <wendlyli@google.com>2022-09-29 05:53:25 +0000
commitdc19f9097c08e2c851954e50b10879d36ec680a2 (patch)
tree2956f36b381b6a9a30e63c2a427caf85e7de19ea
parent52213616bba2a66e773cd0f6dde1a1265bf53f2a (diff)
downloadgoodix_touch-dc19f9097c08e2c851954e50b10879d36ec680a2.tar.gz
touch/goodix: Import v1.1.3 driver
Bug: 249448774 Test: touch works properly Change-Id: Ie98e58fe9f5c53f068351541d86f7ad3c28e71cb Signed-off-by: Wendly Li <wendlyli@google.com>
-rw-r--r--goodix_brl_hw.c31
-rw-r--r--goodix_ts_core.c4
-rw-r--r--goodix_ts_core.h16
-rw-r--r--goodix_ts_proc.c109
4 files changed, 109 insertions, 51 deletions
diff --git a/goodix_brl_hw.c b/goodix_brl_hw.c
index be127d4..0614d8b 100644
--- a/goodix_brl_hw.c
+++ b/goodix_brl_hw.c
@@ -830,8 +830,6 @@ static int convert_ic_info(struct goodix_ic_info *info, const u8 *data)
LE32_TO_CPU(misc->esd_addr);
LE32_TO_CPU(misc->auto_scan_cmd_addr);
LE32_TO_CPU(misc->auto_scan_info_addr);
- LE32_TO_CPU(misc->self_tx_cfg_addr);
- LE32_TO_CPU(misc->self_rx_cfg_addr);
return 0;
}
@@ -900,10 +898,6 @@ static void print_ic_info(struct goodix_ic_info *ic_info)
misc->stylus_rawdata_addr, misc->stylus_rawdata_len);
ts_info("esd_addr: 0x%04X", misc->esd_addr);
ts_info("frame_data_addr: 0x%04X", misc->frame_data_addr);
- ts_info("self_tx_cfg_addr: 0x%04x",
- misc->self_tx_cfg_addr);
- ts_info("self_rx_cfg_addr: 0x%04x",
- misc->self_rx_cfg_addr);
}
static int brl_get_ic_info(
@@ -1232,6 +1226,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;
+ event_data->status_changed = true;
/* read status event */
if (event_data->status_changed)
hw_ops->read(cd, 0x1021C, (u8 *)&ts_event->status_data,
@@ -1290,16 +1286,20 @@ static int brld_get_framedata(
unsigned char val;
int retry = 20;
struct frame_head *frame_head;
- unsigned char frame_buf[GOODIX_MAX_FRAMEDATA_LEN];
+ u8 *frame_buf;
unsigned char *cur_ptr;
unsigned int flag_addr = cd->ic_info.misc.frame_data_addr;
+ frame_buf = kzalloc(GOODIX_MAX_FRAMEDATA_LEN, GFP_KERNEL);
+ if (frame_buf == NULL)
+ return -ENOMEM;
+
/* clean touch event flag */
val = 0;
ret = brl_write(cd, flag_addr, &val, 1);
if (ret < 0) {
ts_err("clean touch event failed, exit!");
- return ret;
+ goto exit;
}
while (retry--) {
@@ -1310,26 +1310,29 @@ static int brld_get_framedata(
}
if (retry < 0) {
ts_err("framedata is not ready val:0x%02x, exit!", val);
- return -EINVAL;
+ ret = -EINVAL;
+ goto exit;
}
ret = brl_read(cd, flag_addr, frame_buf, GOODIX_MAX_FRAMEDATA_LEN);
if (ret < 0) {
ts_err("read frame data failed");
- return ret;
+ goto exit;
}
if (checksum_cmp(frame_buf, cd->ic_info.misc.frame_data_head_len,
CHECKSUM_MODE_U8_LE)) {
ts_err("frame head checksum error");
- return -EINVAL;
+ ret = -EINVAL;
+ goto exit;
}
frame_head = (struct frame_head *)frame_buf;
if (checksum_cmp(frame_buf, frame_head->cur_frame_len,
CHECKSUM_MODE_U16_LE)) {
ts_err("frame body checksum error");
- return -EINVAL;
+ ret = -EINVAL;
+ goto exit;
}
cur_ptr = frame_buf;
cur_ptr += cd->ic_info.misc.frame_data_head_len;
@@ -1338,7 +1341,9 @@ static int brld_get_framedata(
memcpy((u8 *)(info->buff + info->used_size), cur_ptr + 8,
cd->ic_info.misc.mutual_struct_len - 8);
- return 0;
+exit:
+ kfree(frame_buf);
+ return ret;
}
static int brld_get_cap_data(
diff --git a/goodix_ts_core.c b/goodix_ts_core.c
index 15c6969..8d0b448 100644
--- a/goodix_ts_core.c
+++ b/goodix_ts_core.c
@@ -1691,10 +1691,10 @@ 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]",
+ 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->noise_lv, st->grip_type, st->event_id, ts_event->clear_count);
#if IS_ENABLED(CONFIG_GOOG_TOUCH_INTERFACE)
if (st->soft_reset)
goog_notify_fw_status_changed(core_data->gti, GTI_FW_STATUE_RESET,
diff --git a/goodix_ts_core.h b/goodix_ts_core.h
index 932d4e9..5ecaddd 100644
--- a/goodix_ts_core.h
+++ b/goodix_ts_core.h
@@ -49,7 +49,7 @@
#define GOODIX_CORE_DRIVER_NAME "goodix_ts"
#define GOODIX_PEN_DRIVER_NAME "goodix_ts,pen"
-#define GOODIX_DRIVER_VERSION "v1.1.1"
+#define GOODIX_DRIVER_VERSION "v1.1.3"
#define GOODIX_MAX_TOUCH 10
#define GOODIX_PEN_MAX_PRESSURE 4096
#define GOODIX_MAX_PEN_KEY 2
@@ -57,7 +57,7 @@
#define GOODIX_CFG_MAX_SIZE 4096
#define GOODIX_FW_MAX_SIEZE (300 * 1024)
#define GOODIX_MAX_STR_LABEL_LEN 32
-#define GOODIX_MAX_FRAMEDATA_LEN 1700
+#define GOODIX_MAX_FRAMEDATA_LEN (3 * 1024)
#define GOODIX_GESTURE_DATA_LEN 16
#define GOODIX_NORMAL_RESET_DELAY_MS 100
@@ -268,8 +268,6 @@ struct goodix_ic_info_misc { /* other data */
u32 esd_addr;
u32 auto_scan_cmd_addr;
u32 auto_scan_info_addr;
- u32 self_tx_cfg_addr;
- u32 self_rx_cfg_addr;
};
struct goodix_ic_info {
@@ -393,7 +391,8 @@ struct goodix_status_data {
u8 palm_sta;
u8 noise_lv;
u8 grip_type;
- u8 res[10];
+ u8 res[9];
+ u8 event_id;
u8 checksum;
};
@@ -501,6 +500,7 @@ struct goodix_pen_data {
*/
struct goodix_ts_event {
enum ts_event_type event_type;
+ u8 clear_count;
u8 fp_flag; /* finger print DOWN flag */
u8 request_code; /* represent the request type */
struct goodix_gesture_data gesture_data;
@@ -516,6 +516,9 @@ struct goodix_ts_event_data {
u8 fp_flag : 1;
u8 type : 4;
u8 int_count;
+ u8 reserved3;
+ u8 reserved4 : 4;
+ u8 clear_count : 4;
};
struct goodix_ts_request_event_data {
@@ -545,7 +548,8 @@ struct goodix_ts_touch_event_data {
u8 edge_flag : 1;
u8 reset_int : 1;
u8 custom_coor_info_flag : 1;
- u8 reserved3 : 7;
+ u8 reserved3 : 3;
+ u8 clear_count : 4;
u16 reserved4;
u16 checksum;
u8 data[0];
diff --git a/goodix_ts_proc.c b/goodix_ts_proc.c
index 1cebb46..7fd954d 100644
--- a/goodix_ts_proc.c
+++ b/goodix_ts_proc.c
@@ -93,7 +93,7 @@ static char *rbuf;
static uint32_t index;
/* factory test */
-#define ABS(x) ((x >= 0) ? x : -x)
+#define ABS(x) (((x) >= 0) ? (x) : -(x))
#define MAX(a, b) ((a > b) ? a : b)
#define GTP_CAP_TEST 1
@@ -1900,7 +1900,7 @@ static int goodix_delta_test(void)
static int goodix_open_test(void)
{
- unsigned char tmp_buf[GOODIX_MAX_FRAMEDATA_LEN];
+ u8 *tmp_buf;
struct goodix_ts_cmd temp_cmd;
int tx = cd->ic_info.parm.drv_num;
int rx = cd->ic_info.parm.sen_num;
@@ -1919,6 +1919,10 @@ static int goodix_open_test(void)
cd->ic_info.misc.fw_attr_len + cd->ic_info.misc.fw_log_len +
8;
+ tmp_buf = kzalloc(GOODIX_MAX_FRAMEDATA_LEN, GFP_KERNEL);
+ if (tmp_buf == NULL)
+ return -ENOMEM;
+
/* open test prepare */
temp_cmd.cmd = 0x90;
temp_cmd.data[0] = 0x84;
@@ -1926,7 +1930,7 @@ static int goodix_open_test(void)
ret = cd->hw_ops->send_cmd(cd, &temp_cmd);
if (ret < 0) {
ts_err("send rawdata cmd failed");
- return ret;
+ goto exit;
}
/* switch freq */
@@ -1940,7 +1944,7 @@ static int goodix_open_test(void)
ret = cd->hw_ops->send_cmd(cd, &temp_cmd);
if (ret < 0) {
ts_err("set freq %d failed", ts_test->freq);
- return ret;
+ goto exit;
}
}
@@ -1998,12 +2002,13 @@ static int goodix_open_test(void)
ts_test->result[GTP_DELTA_TEST] = TEST_OK;
exit:
+ kfree(tmp_buf);
return ret;
}
static int goodix_self_open_test(void)
{
- unsigned char tmp_buf[GOODIX_MAX_FRAMEDATA_LEN];
+ u8 *tmp_buf;
struct goodix_ts_cmd temp_cmd;
int tx = cd->ic_info.parm.drv_num;
int rx = cd->ic_info.parm.sen_num;
@@ -2020,6 +2025,10 @@ static int goodix_self_open_test(void)
cd->ic_info.misc.fw_attr_len + cd->ic_info.misc.fw_log_len +
cd->ic_info.misc.mutual_struct_len + 10;
+ tmp_buf = kzalloc(GOODIX_MAX_FRAMEDATA_LEN, GFP_KERNEL);
+ if (tmp_buf == NULL)
+ return -ENOMEM;
+
/* test prepare */
temp_cmd.cmd = 0x90;
temp_cmd.data[0] = 0x84;
@@ -2027,7 +2036,7 @@ static int goodix_self_open_test(void)
ret = cd->hw_ops->send_cmd(cd, &temp_cmd);
if (ret < 0) {
ts_err("send rawdata cmd failed");
- return ret;
+ goto exit;
}
/* discard the first few frames */
@@ -2071,12 +2080,13 @@ static int goodix_self_open_test(void)
}
exit:
+ kfree(tmp_buf);
return ret;
}
static int goodix_noise_test(void)
{
- unsigned char tmp_buf[GOODIX_MAX_FRAMEDATA_LEN];
+ u8 *tmp_buf;
struct goodix_ts_cmd temp_cmd;
int tx = cd->ic_info.parm.drv_num;
int rx = cd->ic_info.parm.sen_num;
@@ -2093,6 +2103,10 @@ static int goodix_noise_test(void)
cd->ic_info.misc.fw_attr_len + cd->ic_info.misc.fw_log_len +
8;
+ tmp_buf = kzalloc(GOODIX_MAX_FRAMEDATA_LEN, GFP_KERNEL);
+ if (tmp_buf == NULL)
+ return -ENOMEM;
+
/* open test prepare */
temp_cmd.cmd = 0x90;
temp_cmd.data[0] = 0x82;
@@ -2100,7 +2114,7 @@ static int goodix_noise_test(void)
ret = cd->hw_ops->send_cmd(cd, &temp_cmd);
if (ret < 0) {
ts_err("send rawdata cmd failed");
- return ret;
+ goto exit;
}
/* discard the first few frames */
@@ -2149,6 +2163,7 @@ static int goodix_noise_test(void)
}
exit:
+ kfree(tmp_buf);
return ret;
}
@@ -2205,6 +2220,7 @@ static int goodix_auto_test(bool is_brief)
static void goodix_auto_noise_test(u16 cnt, int threshold)
{
struct goodix_ts_cmd temp_cmd;
+ struct goodix_ts_cmd rb_cmd;
u32 sync_addr = cd->ic_info.misc.frame_data_addr;
u32 raw_addr;
int tx = cd->ic_info.parm.drv_num;
@@ -2212,6 +2228,8 @@ static void goodix_auto_noise_test(u16 cnt, int threshold)
s16 *tmp_buf;
int tmp_val;
u8 status;
+ int test_try = 2;
+ int ret = 0;
int retry = 10;
int err_cnt = 0;
int i;
@@ -2228,23 +2246,28 @@ static void goodix_auto_noise_test(u16 cnt, int threshold)
cd->hw_ops->irq_enable(cd, false);
goodix_ts_blocking_notify(NOTIFY_ESD_OFF, NULL);
+restart:
temp_cmd.len = 0x07;
temp_cmd.cmd = 0x90;
temp_cmd.data[0] = 0x86;
temp_cmd.data[1] = cnt & 0xFF;
temp_cmd.data[2] = (cnt >> 8) & 0xFF;
cd->hw_ops->send_cmd(cd, &temp_cmd);
+ cd->hw_ops->read(
+ cd, cd->ic_info.misc.cmd_addr, rb_cmd.buf, sizeof(rb_cmd));
+ ts_info("rb_cmd:%*ph", (int)sizeof(rb_cmd), rb_cmd.buf);
msleep(cnt * 20);
while (retry--) {
cd->hw_ops->read(cd, sync_addr, &status, 1);
- if (status == 0x80)
+ if (status & 0x80)
break;
usleep_range(5000, 5100);
}
if (retry < 0) {
ts_err("noise data not ready, status[%x]", status);
+ ret = -EINVAL;
goto exit;
}
@@ -2265,12 +2288,13 @@ static void goodix_auto_noise_test(u16 cnt, int threshold)
retry = 10;
while (retry--) {
cd->hw_ops->read(cd, sync_addr, &status, 1);
- if (status == 0x80)
+ if (status & 0x80)
break;
usleep_range(5000, 5100);
}
if (retry < 0) {
ts_err("noise data not ready, status[%x]", status);
+ ret = -EINVAL;
goto exit;
}
cd->hw_ops->read(cd, raw_addr, (u8 *)tmp_buf, tx * rx * 2);
@@ -2291,8 +2315,14 @@ static void goodix_auto_noise_test(u16 cnt, int threshold)
index += sprintf(&rbuf[index], "Result: PASS\n");
exit:
- kfree(tmp_buf);
cd->hw_ops->reset(cd, 100);
+ if (ret < 0 && --test_try > 0) {
+ ts_err("auto noise running failed, retry:%d", test_try);
+ ret = 0;
+ index = 0;
+ goto restart;
+ }
+ kfree(tmp_buf);
cd->hw_ops->irq_enable(cd, true);
goodix_ts_blocking_notify(NOTIFY_ESD_ON, NULL);
}
@@ -2304,7 +2334,7 @@ static int get_cap_data(uint8_t *type)
int rx = cd->ic_info.parm.sen_num;
u8 val;
int retry = 20;
- u8 frame_buf[GOODIX_MAX_FRAMEDATA_LEN];
+ u8 *frame_buf;
u32 flag_addr = cd->ic_info.misc.frame_data_addr;
u32 mutual_addr;
u32 self_addr;
@@ -2325,6 +2355,10 @@ static int get_cap_data(uint8_t *type)
cd->ic_info.misc.fw_attr_len +
cd->ic_info.misc.fw_log_len + 2;
+ frame_buf = kzalloc(GOODIX_MAX_FRAMEDATA_LEN, GFP_KERNEL);
+ if (frame_buf == NULL)
+ return -ENOMEM;
+
/* disable irq & close esd */
cd->hw_ops->irq_enable(cd, false);
goodix_ts_blocking_notify(NOTIFY_ESD_OFF, NULL);
@@ -2411,6 +2445,7 @@ static int get_cap_data(uint8_t *type)
}
exit:
+ kfree(frame_buf);
temp_cmd.cmd = 0x90;
temp_cmd.data[0] = 0;
temp_cmd.len = 5;
@@ -2789,6 +2824,7 @@ static void goodix_set_gesture_param(u8 type)
{
struct goodix_ts_cmd temp_cmd;
u32 cmd_reg = cd->ic_info.misc.cmd_addr;
+ u32 fw_buffer_addr = cd->ic_info.misc.fw_buffer_addr;
int retry;
u8 status;
@@ -2810,12 +2846,12 @@ static void goodix_set_gesture_param(u8 type)
if (type == GESTURE_STTW) {
ts_info("STTW param:%*ph", gesture_param_st.length,
gesture_param_st.buf);
- cd->hw_ops->write(cd, 0x13D80, gesture_param_st.buf,
+ cd->hw_ops->write(cd, fw_buffer_addr, gesture_param_st.buf,
sizeof(gesture_param_st));
} else {
ts_info("LPTW param:%*ph", gesture_param_lp.length,
gesture_param_lp.buf);
- cd->hw_ops->write(cd, 0x13D80, gesture_param_lp.buf,
+ cd->hw_ops->write(cd, fw_buffer_addr, gesture_param_lp.buf,
sizeof(gesture_param_lp));
}
@@ -2974,7 +3010,7 @@ static void goodix_get_dump_log(void)
static void goodix_get_stylus_data(void)
{
struct goodix_stylus_data stylus_data;
- u8 temp_buf[320] = {0};
+ u8 temp_buf[320] = { 0 };
u32 flag_addr = cd->ic_info.misc.touch_data_addr;
int tx = cd->ic_info.parm.drv_num;
int rx = cd->ic_info.parm.sen_num;
@@ -2990,8 +3026,8 @@ static void goodix_get_stylus_data(void)
int i;
if (cd->bus->ic_type != IC_TYPE_BERLIN_B) {
- index = sprintf(rbuf, "not support stylus data\n");
- return;
+ index = sprintf(rbuf, "not support stylus data\n");
+ return;
}
/* disable irq & close esd */
@@ -3012,7 +3048,8 @@ static void goodix_get_stylus_data(void)
break;
}
if (retry < 0) {
- ts_err("touch data is not ready val:0x%02x, exit!", temp_buf[0]);
+ ts_err("touch data is not ready val:0x%02x, exit!",
+ temp_buf[0]);
ret = -EINVAL;
goto exit;
}
@@ -3034,10 +3071,11 @@ static void goodix_get_stylus_data(void)
angle_y = le16_to_cpup((__le16 *)(temp_buf + 18)) / 100;
stylus_struct_addr = cd->ic_info.misc.frame_data_addr +
- cd->ic_info.misc.frame_data_head_len +
- cd->ic_info.misc.fw_attr_len +
- cd->ic_info.misc.fw_log_len;
- ret = cd->hw_ops->read(cd, stylus_struct_addr, temp_buf, sizeof(stylus_data));
+ cd->ic_info.misc.frame_data_head_len +
+ cd->ic_info.misc.fw_attr_len +
+ cd->ic_info.misc.fw_log_len;
+ ret = cd->hw_ops->read(
+ cd, stylus_struct_addr, temp_buf, sizeof(stylus_data));
if (ret < 0) {
ts_err("read stylus struct data failed");
goto exit;
@@ -3060,22 +3098,27 @@ static void goodix_get_stylus_data(void)
index += sprintf(&rbuf[index], "%d,", stylus_data.rx2[i]);
index += sprintf(&rbuf[index], "\nTx1_coordinate_X/Tx1_coordinate_Y\n");
- index += sprintf(&rbuf[index], "%d,%d", tx1_coor_x, tx1_coor_y);
+ index += sprintf(&rbuf[index], "%d,%d", tx1_coor_x, tx1_coor_y);
index += sprintf(&rbuf[index], "\nTx2_coordinate_X/Tx2_coordinate_Y\n");
- index += sprintf(&rbuf[index], "%d,%d", stylus_data.angle_coord_x, stylus_data.angle_coord_y);
+ index += sprintf(&rbuf[index], "%d,%d", stylus_data.angle_coord_x,
+ stylus_data.angle_coord_y);
index += sprintf(&rbuf[index], "\nRing_delta_X/Ring_delta_Y\n");
- index += sprintf(&rbuf[index], "%d,%d", stylus_data.delta_x, stylus_data.delta_y);
+ index += sprintf(&rbuf[index], "%d,%d", stylus_data.delta_x,
+ stylus_data.delta_y);
index += sprintf(&rbuf[index], "\nRing_Angle_X/Y\n");
index += sprintf(&rbuf[index], "%d,%d", angle_x, angle_y);
- index += sprintf(&rbuf[index], "\nfreq_indexA/freq_indexB/freq1_noise_level/freq2_noise_level/freq3_noise_level/freq4_noise_level\n");
+ index += sprintf(&rbuf[index],
+ "\nfreq_indexA/freq_indexB/freq1_noise_level/freq2_noise_level/freq3_noise_level/freq4_noise_level\n");
index += sprintf(&rbuf[index], "%d,%d,%d,%d,%d,%d\n",
- stylus_data.freq_indexA, stylus_data.freq_indexB,
- stylus_data.stylus_noise_value[0], stylus_data.stylus_noise_value[1],
- stylus_data.stylus_noise_value[2], stylus_data.stylus_noise_value[3]);
+ stylus_data.freq_indexA, stylus_data.freq_indexB,
+ stylus_data.stylus_noise_value[0],
+ stylus_data.stylus_noise_value[1],
+ stylus_data.stylus_noise_value[2],
+ stylus_data.stylus_noise_value[3]);
exit:
/* enable irq & esd */
@@ -3138,7 +3181,7 @@ static ssize_t driver_test_write(
}
cd->hw_ops->read_version(cd, &fw_ver);
cd->hw_ops->get_ic_info(cd, &ic_info);
- index = sprintf(rbuf, "%s: %02x%02x%02x%02x %x\n",
+ index = sprintf(rbuf, "%s: 0x%02x%02x%02x%02x 0x%x\n",
CMD_GET_VERSION, fw_ver.patch_vid[0],
fw_ver.patch_vid[1], fw_ver.patch_vid[2],
fw_ver.patch_vid[3], ic_info.version.config_id);
@@ -3954,6 +3997,12 @@ static ssize_t driver_test_write(
}
+ if (!strncmp(p, CMD_GET_STYLUS_DATA, strlen(CMD_GET_STYLUS_DATA))) {
+ rbuf = kzalloc(LARGE_SIZE, GFP_KERNEL);
+ goodix_get_stylus_data();
+ goto exit;
+ }
+
rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL);
if (!rbuf) {
ts_err("failed to alloc rbuf");