diff options
author | Wendly Li <wendlyli@google.com> | 2022-11-01 17:46:27 +0000 |
---|---|---|
committer | Wendly Li <wendlyli@google.com> | 2022-11-02 10:23:16 +0000 |
commit | f9bee783875869fb4ef9c6fa163c45d9d0ebdd4d (patch) | |
tree | 5de948f0fe37111528da90e1d4affe2a35b8fc5a | |
parent | 731f5bf21d19a3761d3d88a55b21ab837bc5ca03 (diff) | |
download | goodix_touch-f9bee783875869fb4ef9c6fa163c45d9d0ebdd4d.tar.gz |
touch/goodix: Import v1.1.4 driver
Bug: 255896624
Test: echo fw_update > /proc/goodix_ts/driver_test
Change-Id: Ic7b0dae0e4b1456ff23b580b3f90872045e922cf
Signed-off-by: Wendly Li <wendlyli@google.com>
-rw-r--r-- | goodix_ts_core.h | 2 | ||||
-rw-r--r-- | goodix_ts_proc.c | 71 | ||||
-rw-r--r-- | goodix_ts_tools.c | 31 |
3 files changed, 89 insertions, 15 deletions
diff --git a/goodix_ts_core.h b/goodix_ts_core.h index 1c6e823..3636357 100644 --- a/goodix_ts_core.h +++ b/goodix_ts_core.h @@ -50,7 +50,7 @@ #define GOODIX_CORE_DRIVER_NAME "goodix_ts" #define GOODIX_PEN_DRIVER_NAME "goodix_ts,pen" -#define GOODIX_DRIVER_VERSION "v1.1.3" +#define GOODIX_DRIVER_VERSION "v1.1.4" #define GOODIX_MAX_TOUCH 10 #define GOODIX_PEN_MAX_PRESSURE 4096 #define GOODIX_MAX_PEN_KEY 2 diff --git a/goodix_ts_proc.c b/goodix_ts_proc.c index ea1e967..1688dea 100644 --- a/goodix_ts_proc.c +++ b/goodix_ts_proc.c @@ -49,6 +49,7 @@ #define CMD_SET_REPORT_RATE "set_report_rate" #define CMD_GET_DUMP_LOG "get_dump_log" #define CMD_GET_STYLUS_DATA "get_stylus_data" +#define CMD_SET_FREQ_INDEX "set_freq_index" 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, @@ -63,7 +64,8 @@ char *cmd_list[] = { CMD_FW_UPDATE, CMD_AUTO_TEST, CMD_OPEN_TEST, CMD_GET_FW_STATUS, CMD_SET_HIGHSENSE_MODE, CMD_SET_GRIP_DATA, 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, NULL }; + CMD_SET_REPORT_RATE, CMD_GET_DUMP_LOG, CMD_GET_STYLUS_DATA, + CMD_SET_FREQ_INDEX, NULL }; /* test limits keyword */ #define CSV_TP_SPECIAL_RAW_MIN "special_raw_min" @@ -2551,7 +2553,7 @@ static void goodix_set_continue_mode(u8 val) static void goodix_read_config(void) { int ret; - u8* cfg_buf; + u8 *cfg_buf; u32 cfg_id; u8 cfg_ver; @@ -3124,6 +3126,41 @@ exit: goodix_ts_blocking_notify(NOTIFY_ESD_ON, NULL); } +static void goodix_force_update(void) +{ + int i; + int ret; + + for (i = 0; i < GOODIX_MAX_CONFIG_GROUP; i++) { + kfree(cd->ic_configs[i]); + cd->ic_configs[i] = NULL; + } + + ret = goodix_get_config_proc(cd); + if (ret < 0) + ts_err("not found valid config"); + + ret = goodix_do_fw_update(cd->ic_configs[CONFIG_TYPE_NORMAL], + UPDATE_MODE_BLOCK | UPDATE_MODE_FORCE | + UPDATE_MODE_SRC_REQUEST); + if (ret < 0) + index = sprintf(rbuf, "%s: NG\n", CMD_FW_UPDATE); + else + index = sprintf(rbuf, "%s: OK\n", CMD_FW_UPDATE); +} + +static void goodix_set_freq_index(int freq) +{ + struct goodix_ts_cmd temp_cmd; + + index = sprintf(rbuf, "set frequency index %d\n", freq); + ts_info("set frequency index %d", freq); + temp_cmd.len = 5; + temp_cmd.cmd = 0x9C; + temp_cmd.data[0] = freq; + 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) { @@ -3156,18 +3193,7 @@ static ssize_t driver_test_write( if (!strncmp(p, CMD_FW_UPDATE, strlen(CMD_FW_UPDATE))) { rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL); - if (!rbuf) { - ts_err("failed to alloc rbuf"); - goto exit; - } - ret = goodix_do_fw_update(cd->ic_configs[CONFIG_TYPE_NORMAL], - UPDATE_MODE_BLOCK | UPDATE_MODE_FORCE | - UPDATE_MODE_SRC_REQUEST); - if (ret < 0) { - index = sprintf(rbuf, "%s: NG\n", CMD_FW_UPDATE); - } else { - index = sprintf(rbuf, "%s: OK\n", CMD_FW_UPDATE); - } + goodix_force_update(); goto exit; } @@ -4004,6 +4030,23 @@ static ssize_t driver_test_write( goto exit; } + if (!strncmp(p, CMD_SET_FREQ_INDEX, strlen(CMD_SET_FREQ_INDEX))) { + rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL); + token = strsep(&p, ","); + if (!token || !p) { + index = sprintf(rbuf, "%s: invalid cmd param\n", + CMD_SET_FREQ_INDEX); + goto exit; + } + if (kstrtos32(p, 10, &cmd_val)) { + index = sprintf(rbuf, "%s: invalid cmd param\n", + CMD_SET_FREQ_INDEX); + goto exit; + } + goodix_set_freq_index(cmd_val); + goto exit; + } + rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL); if (!rbuf) { ts_err("failed to alloc rbuf"); diff --git a/goodix_ts_tools.c b/goodix_ts_tools.c index d370cf8..5fb175f 100644 --- a/goodix_ts_tools.c +++ b/goodix_ts_tools.c @@ -69,6 +69,8 @@ struct goodix_tools_dev { unsigned int ops_mode; struct goodix_ts_cmd rawdiffcmd, normalcmd; wait_queue_head_t wq; + bool is_clean_flag; + struct delayed_work sync_work; struct mutex mutex; atomic_t in_use; struct goodix_ext_module module; @@ -217,6 +219,9 @@ static int async_write(struct goodix_tools_dev *dev, void __user *arg) ret = length; } + if (reg_addr == ts_core->ic_info.misc.touch_data_addr) + dev->is_clean_flag = true; + err_out: kfree(databuf); return ret; @@ -249,6 +254,29 @@ static int init_cfg_data(struct goodix_ic_config *cfg, void __user *arg) return 0; } +static void goodix_ctrl_sync_work(struct work_struct *work) +{ + struct goodix_ts_core *cd = goodix_tools_dev->ts_core; + static int cnt; + + if (atomic_read(&goodix_tools_dev->in_use) == 0) + return; + + if (cd->tools_ctrl_sync && !goodix_tools_dev->is_clean_flag) { + cnt++; + if (cnt >= 2) { + cnt = 0; + cd->tools_ctrl_sync = false; + ts_info("restore tools sync flag to 0"); + } + } else { + cnt = 0; + } + + goodix_tools_dev->is_clean_flag = false; + schedule_delayed_work(&goodix_tools_dev->sync_work, 5 * HZ); +} + /** * goodix_tools_ioctl - ioctl implementation * @@ -400,6 +428,7 @@ static int goodix_tools_open(struct inode *inode, struct file *filp) goodix_ts_blocking_notify(NOTIFY_ESD_OFF, NULL); filp->private_data = goodix_tools_dev; atomic_set(&goodix_tools_dev->in_use, 1); + schedule_delayed_work(&goodix_tools_dev->sync_work, 5 * HZ); return 0; } @@ -409,6 +438,7 @@ static int goodix_tools_release(struct inode *inode, struct file *filp) /* when the last close this dev node unregister the module */ goodix_tools_dev->ts_core->tools_ctrl_sync = false; atomic_set(&goodix_tools_dev->in_use, 0); + cancel_delayed_work_sync(&goodix_tools_dev->sync_work); goodix_ts_blocking_notify(NOTIFY_ESD_ON, NULL); ret = goodix_unregister_ext_module(&goodix_tools_dev->module); return ret; @@ -486,6 +516,7 @@ int goodix_tools_init(void) goodix_tools_dev->module.name = GOODIX_TOOLS_NAME; goodix_tools_dev->module.priv_data = goodix_tools_dev; goodix_tools_dev->module.priority = EXTMOD_PRIO_DBGTOOL; + INIT_DELAYED_WORK(&goodix_tools_dev->sync_work, goodix_ctrl_sync_work); ret = misc_register(&goodix_tools_miscdev); if (ret) |