From ad4da241e57a6b1ab4e5f0d6764d3f1c89e199d6 Mon Sep 17 00:00:00 2001 From: Wendly Li Date: Sun, 28 Aug 2022 17:39:39 +0000 Subject: touch/goodix: Import v1.1.0 driver Bug: 243908592 Test: Check FATP APIs work peoprly Change-Id: Id853e7e44eae8e6b62b1fad3812d71677a0cd575 Signed-off-by: Wendly Li --- goodix_brl_hw.c | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'goodix_brl_hw.c') diff --git a/goodix_brl_hw.c b/goodix_brl_hw.c index 29fa48d..b057c62 100644 --- a/goodix_brl_hw.c +++ b/goodix_brl_hw.c @@ -828,6 +828,10 @@ static int convert_ic_info(struct goodix_ic_info *info, const u8 *data) LE16_TO_CPU(misc->stylus_rawdata_len); LE32_TO_CPU(misc->noise_data_addr); 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; } @@ -896,6 +900,10 @@ 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( @@ -1218,6 +1226,7 @@ static int brl_event_handler( CHECKSUM_MODE_U8_LE)) { ts_debug("touch head checksum err[%*ph]", IRQ_EVENT_HEAD_LEN, event_data); + hw_ops->after_event_handler(cd); return -EINVAL; } -- cgit v1.2.3 From 15c53c7da7b3e943cd4b39cb1b29000cff4cf661 Mon Sep 17 00:00:00 2001 From: Wendly Li Date: Mon, 5 Sep 2022 04:24:53 +0000 Subject: touch/goodix: Import v1.1.1 driver Bug: 245028037 Test: Check esd checker will not be enabled when device is suspended Change-Id: I64268295f8373b95864dd4fa8bdebe0579ffed81 Signed-off-by: Wendly Li --- goodix_brl_hw.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) (limited to 'goodix_brl_hw.c') diff --git a/goodix_brl_hw.c b/goodix_brl_hw.c index b057c62..be127d4 100644 --- a/goodix_brl_hw.c +++ b/goodix_brl_hw.c @@ -994,7 +994,7 @@ static int brl_esd_check(struct goodix_ts_core *cd) return ret; } - if (esd_value == GOODIX_ESD_TICK_WRITE_DATA) { + if (esd_value != 0xFF) { ts_err("esd check failed, 0x%x", esd_value); return -EINVAL; } @@ -1134,12 +1134,10 @@ static int goodix_touch_handler(struct goodix_ts_core *cd, point_type = event_data->data[0] & 0x0F; if (point_type == POINT_TYPE_STYLUS || point_type == POINT_TYPE_STYLUS_HOVER) { - ret = checksum_cmp(event_data->data, - BYTES_PER_POINT * 2 + 2, CHECKSUM_MODE_U8_LE); + ret = checksum_cmp(event_data->data, 16 + 2, CHECKSUM_MODE_U8_LE); if (ret) { ts_debug("touch data checksum error"); - ts_debug("data:%*ph", BYTES_PER_POINT * 2 + 2, - event_data->data); + ts_debug("data:%*ph", 16 + 2, event_data->data); return -EINVAL; } } else { -- cgit v1.2.3 From 85b735eaeab35de64f7349fa1dbacf3dc24a0b58 Mon Sep 17 00:00:00 2001 From: Wendly Li Date: Wed, 28 Sep 2022 16:27:06 +0000 Subject: touch/goodix: Import v1.1.3 driver Bug: 249448774 Test: touch works properly Change-Id: Ie98e58fe9f5c53f068351541d86f7ad3c28e71cb Signed-off-by: Wendly Li --- goodix_brl_hw.c | 30 +++++++++++++++++------------- 1 file changed, 17 insertions(+), 13 deletions(-) (limited to 'goodix_brl_hw.c') diff --git a/goodix_brl_hw.c b/goodix_brl_hw.c index be127d4..46018dc 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,7 @@ 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; /* read status event */ if (event_data->status_changed) hw_ops->read(cd, 0x1021C, (u8 *)&ts_event->status_data, @@ -1290,16 +1285,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 +1309,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 +1340,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( -- cgit v1.2.3 From 731f5bf21d19a3761d3d88a55b21ab837bc5ca03 Mon Sep 17 00:00:00 2001 From: Wendly Li Date: Thu, 13 Oct 2022 11:14:54 +0000 Subject: touch/goodix: Fix brl_set_scan_mode Bug: 253539023 Test: echo 1 > /sys/devices/platform/goodix_ts.0/scan_mode Change-Id: If5f6c967c2c84db1aa1c990d7bf11eb563a088aa Signed-off-by: Wendly Li --- goodix_brl_hw.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'goodix_brl_hw.c') diff --git a/goodix_brl_hw.c b/goodix_brl_hw.c index 46018dc..5ff8e77 100644 --- a/goodix_brl_hw.c +++ b/goodix_brl_hw.c @@ -1519,10 +1519,19 @@ int brl_get_scan_mode(struct goodix_ts_core *cd, enum raw_scan_mode* mode) int brl_set_scan_mode(struct goodix_ts_core *cd, enum raw_scan_mode mode) { struct goodix_ts_cmd cmd; + static const uint8_t raw_scan_mode_cmd_codes[] ={ + [RAW_SCAN_MODE_AUTO] = 0x00, + [RAW_SCAN_MODE_NORMAL_ACTIVE] = 0x02, + [RAW_SCAN_MODE_NORMAL_IDLE] = 0x03, + [RAW_SCAN_MODE_LOW_POWER_ACTIVE] = 0x00, + [RAW_SCAN_MODE_LOW_POWER_IDLE] = 0x00, + [RAW_SCAN_MODE_SLEEP] = 0x00, + }; + cmd.cmd = GOODIX_CMD_SET_SCAN_MODE; cmd.len = 5; - cmd.data[0] = mode; + cmd.data[0] = raw_scan_mode_cmd_codes[mode]; if (cd->hw_ops->send_cmd(cd, &cmd)) ts_err("failed set scan mode cmd"); -- cgit v1.2.3 From 01bc79a67eafe0013dbbb9843301e6e1ba8b97ac Mon Sep 17 00:00:00 2001 From: Wendly Li Date: Thu, 12 Jan 2023 10:23:55 +0000 Subject: touch/goodix: Move heatmap read protection to GTI Bug: 262053705 Bug: 267991839 Test: check heatmap works properly Change-Id: I1a0dd4dc746037ad4f05e2734e73bce225af5ddd Signed-off-by: Wendly Li --- goodix_brl_hw.c | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'goodix_brl_hw.c') diff --git a/goodix_brl_hw.c b/goodix_brl_hw.c index 1e3bc1a..5e282ad 100644 --- a/goodix_brl_hw.c +++ b/goodix_brl_hw.c @@ -344,7 +344,7 @@ static int brl_irq_enable(struct goodix_ts_core *cd, bool enable) } if (!enable && atomic_cmpxchg(&cd->irq_enabled, 1, 0)) { - disable_irq_nosync(cd->irq); + disable_irq(cd->irq); ts_debug("Irq disabled"); return 0; } @@ -352,6 +352,15 @@ static int brl_irq_enable(struct goodix_ts_core *cd, bool enable) return 0; } +static int brl_disable_irq_nosync(struct goodix_ts_core *cd) +{ + if (atomic_cmpxchg(&cd->irq_enabled, 1, 0)) { + disable_irq_nosync(cd->irq); + ts_debug("Irq disabled"); + } + return 0; +} + static int brl_read(struct goodix_ts_core *cd, unsigned int addr, unsigned char *data, unsigned int len) { @@ -1830,6 +1839,7 @@ static struct goodix_ts_hw_ops brl_hw_ops = { .gesture = brl_gesture, .reset = brl_reset, .irq_enable = brl_irq_enable, + .disable_irq_nosync = brl_disable_irq_nosync, .read = brl_read, .read_fast = brl_read_fast, .write = brl_write, -- cgit v1.2.3 From 9a1bdd15f21249e755ef38ce2439e6ca407ca54c Mon Sep 17 00:00:00 2001 From: Wendly Li Date: Thu, 16 Feb 2023 08:36:54 +0000 Subject: touch/goodix: fix double reset ESD check will fail on firmware reset. When ESD check is failed, it will reset firmware again. Skip ESD check to avoid double reset. Double reset may cause self-test failure and other unexpected issues. Bug: 267991839 Test: Check self-test works properly Change-Id: I17063445e71832077766d3d9aa3e6457f4b9e4b7 Signed-off-by: Wendly Li --- goodix_brl_hw.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'goodix_brl_hw.c') diff --git a/goodix_brl_hw.c b/goodix_brl_hw.c index 5e282ad..505e8ec 100644 --- a/goodix_brl_hw.c +++ b/goodix_brl_hw.c @@ -324,6 +324,12 @@ static int brl_reset(struct goodix_ts_core *cd, int delay) { ts_info("chip_reset"); + /* + * ESD check will fail on firmware reset. When ESD check is failed, + * it will reset firmware again. Skip ESD check to avoid double reset. + */ + cd->ts_esd.skip_once = true; + gpio_direction_output(cd->board_data.reset_gpio, 0); usleep_range(2000, 2100); gpio_direction_output(cd->board_data.reset_gpio, 1); -- cgit v1.2.3 From 2bd13df74a08330dc9d781b113c4cd1e80cfa097 Mon Sep 17 00:00:00 2001 From: Wendly Li Date: Thu, 12 Jan 2023 10:06:03 +0000 Subject: touch/goodix: Import v1.2.3 driver Bug: 269560367 Test: Check coordinate filter works properly Change-Id: I3e2da8cadd2ee07c3e3bcb4b69189559f63796de Signed-off-by: Wendly Li --- goodix_brl_hw.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'goodix_brl_hw.c') 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, -- cgit v1.2.3 From 43c3130d20f6553cd581c5489046f435de09d7c4 Mon Sep 17 00:00:00 2001 From: Wendly Li Date: Fri, 24 Feb 2023 09:50:19 +0000 Subject: touch/goodix: Support coordinate filter Bug: 269560367 Test: Check coordinate filter works properly Change-Id: I2fbf972d1d67f3c28b090a9db1569e52e407c384 Signed-off-by: Wendly Li --- goodix_brl_hw.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'goodix_brl_hw.c') diff --git a/goodix_brl_hw.c b/goodix_brl_hw.c index 435658a..d6e2fbf 100644 --- a/goodix_brl_hw.c +++ b/goodix_brl_hw.c @@ -1616,6 +1616,7 @@ int brl_set_heatmap_enabled(struct goodix_ts_core *cd, bool enabled) #define CUSTOM_MODE_MASK_PALM 0x02 #define CUSTOM_MODE_MASK_GRIP 0x04 #define CUSTOM_MODE_MASK_SCREEN_PROTECTOR 0x40 +#define CUSTOM_MODE_MASK_COORD_FILTER 0x80 int brl_set_palm_enabled(struct goodix_ts_core *cd, bool enabled) { struct goodix_ts_cmd cmd = { 0 }; @@ -1839,6 +1840,41 @@ exit: return ret; } +#define GOODIX_CMD_SET_COORD_FILTER 0xCA +static int brl_set_coord_filter_enabled( + struct goodix_ts_core *cd, bool enabled) +{ + struct goodix_ts_cmd cmd = { 0 }; + int ret = 0; + + cmd.cmd = GOODIX_CMD_SET_COORD_FILTER; + cmd.len = 5; + cmd.data[0] = enabled ? 0 : 1; + + ret = cd->hw_ops->send_cmd(cd, &cmd); + if (ret != 0) + ts_err("failed to %s coordinate filter", + enabled ? "enable" : "disable"); + + return ret; +} + +static int brl_get_coord_filter_enabled( + struct goodix_ts_core *cd, bool *enabled) +{ + int ret = 0; + u8 val; + + ret = cd->hw_ops->read(cd, GOODIX_FEATURE_STATUS_ADDR, &val, 1); + if (ret != 0) { + ts_err("failed to get coordinate filter enabled, ret: %d", ret); + *enabled = false; + return ret; + } + *enabled = (val & CUSTOM_MODE_MASK_COORD_FILTER) == 0; + return ret; +} + static struct goodix_ts_hw_ops brl_hw_ops = { .power_on = brl_power_on, .resume = brl_resume, @@ -1874,6 +1910,8 @@ static struct goodix_ts_hw_ops brl_hw_ops = { brl_get_screen_protector_mode_enabled, .get_mutual_data = brl_get_mutual_data, .get_self_sensing_data = brl_get_self_sensing_data, + .set_coord_filter_enabled = brl_set_coord_filter_enabled, + .get_coord_filter_enabled = brl_get_coord_filter_enabled, }; struct goodix_ts_hw_ops *goodix_get_hw_ops(void) -- cgit v1.2.3 From 933393b821e38f6662cfda95657a688bd4362b58 Mon Sep 17 00:00:00 2001 From: Wendly Li Date: Tue, 14 Mar 2023 10:12:45 +0000 Subject: touch/goodix: Support for setting report rate Bug: 273148352 Test: Trun on/off smooth display in settings Change-Id: I27c4bcf6df89b52c1a38ce4c5e9ff03ee90f72f1 Signed-off-by: Wendly Li --- goodix_brl_hw.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'goodix_brl_hw.c') diff --git a/goodix_brl_hw.c b/goodix_brl_hw.c index d6e2fbf..acfd294 100644 --- a/goodix_brl_hw.c +++ b/goodix_brl_hw.c @@ -1875,6 +1875,32 @@ static int brl_get_coord_filter_enabled( return ret; } +#define GOODIX_CMD_SET_REPORT_RATE 0x9D +#define GOODIX_REPORT_RATE_240HZ 0 +#define GOODIX_REPORT_RATE_120HZ 2 +static int brl_set_report_rate( + struct goodix_ts_core *cd, u32 rate) +{ + struct goodix_ts_cmd cmd = { 0 }; + int ret = 0; + + ts_info("set report rate %d", rate); + if ((rate != 120) && (rate != 240)) { + ts_info("Report Rate: %dHz is not support", rate); + return -EOPNOTSUPP; + } + + cmd.cmd = GOODIX_CMD_SET_REPORT_RATE; + cmd.len = 5; + cmd.data[0] = rate == 240 ? + GOODIX_REPORT_RATE_240HZ : GOODIX_REPORT_RATE_120HZ; + + ret = cd->hw_ops->send_cmd(cd, &cmd); + if (ret != 0) + ts_err("failed to set report rate"); + return ret; +} + static struct goodix_ts_hw_ops brl_hw_ops = { .power_on = brl_power_on, .resume = brl_resume, @@ -1912,6 +1938,7 @@ static struct goodix_ts_hw_ops brl_hw_ops = { .get_self_sensing_data = brl_get_self_sensing_data, .set_coord_filter_enabled = brl_set_coord_filter_enabled, .get_coord_filter_enabled = brl_get_coord_filter_enabled, + .set_report_rate = brl_set_report_rate, }; struct goodix_ts_hw_ops *goodix_get_hw_ops(void) -- cgit v1.2.3