diff options
author | Wendly Li <wendlyli@google.com> | 2022-09-28 16:27:06 +0000 |
---|---|---|
committer | Wendly Li <wendlyli@google.com> | 2022-09-29 05:53:25 +0000 |
commit | dc19f9097c08e2c851954e50b10879d36ec680a2 (patch) | |
tree | 2956f36b381b6a9a30e63c2a427caf85e7de19ea | |
parent | 52213616bba2a66e773cd0f6dde1a1265bf53f2a (diff) | |
download | goodix_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.c | 31 | ||||
-rw-r--r-- | goodix_ts_core.c | 4 | ||||
-rw-r--r-- | goodix_ts_core.h | 16 | ||||
-rw-r--r-- | goodix_ts_proc.c | 109 |
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"); |