diff options
author | Super Liu <supercjliu@google.com> | 2022-12-05 04:06:09 +0000 |
---|---|---|
committer | Super Liu <supercjliu@google.com> | 2022-12-21 06:40:37 +0000 |
commit | af670a799c8981ba4f170e7848c808dca0679577 (patch) | |
tree | 63ddd2376c9e58bba15a455f034da740a2fc72e0 | |
parent | 0bc000489400f8f96bf08cb60ed6e1d684a46c2c (diff) | |
download | novatek_touch-af670a799c8981ba4f170e7848c808dca0679577.tar.gz |
touch/novatek: Support GTI_CMD_GET_SENSOR_DATA_MANUAL command.
Bug: 261098160
Change-Id: Iaa8c73b92c05d3dbe5892c1a0e35817790b86c5b
Signed-off-by: Super Liu <supercjliu@google.com>
-rw-r--r-- | nt36xxx/nt36xxx.c | 2 | ||||
-rw-r--r-- | nt36xxx/nt36xxx.h | 2 | ||||
-rw-r--r-- | nt36xxx/nt36xxx_ext_proc.c | 6 | ||||
-rw-r--r-- | nt36xxx/nt36xxx_goog.c | 103 |
4 files changed, 108 insertions, 5 deletions
diff --git a/nt36xxx/nt36xxx.c b/nt36xxx/nt36xxx.c index c1a63aa..fa6c3dd 100644 --- a/nt36xxx/nt36xxx.c +++ b/nt36xxx/nt36xxx.c @@ -286,7 +286,7 @@ void nvt_irq_enable(bool enable) } } else { if (ts->irq_enabled) { - disable_irq(ts->client->irq); + disable_irq_nosync(ts->client->irq); ts->irq_enabled = false; } } diff --git a/nt36xxx/nt36xxx.h b/nt36xxx/nt36xxx.h index 8c43cf8..a3a47ad 100644 --- a/nt36xxx/nt36xxx.h +++ b/nt36xxx/nt36xxx.h @@ -403,6 +403,8 @@ int32_t nvt_write_addr(uint32_t addr, uint8_t data); extern void update_firmware_release(void); extern int32_t nvt_update_firmware(const char *firmware_name, uint8_t full); extern void nvt_change_mode(uint8_t mode); +extern void nvt_get_xdata_info(int32_t **ptr, int *size); +extern void nvt_read_mdata(uint32_t xdata_addr, uint32_t xdata_btn_addr); extern int8_t nvt_switch_FreqHopEnDis(uint8_t FreqHopEnDis); extern uint8_t nvt_get_fw_pipe(void); extern void nvt_read_fw_history(uint32_t addr); diff --git a/nt36xxx/nt36xxx_ext_proc.c b/nt36xxx/nt36xxx_ext_proc.c index 2f24039..52811e1 100644 --- a/nt36xxx/nt36xxx_ext_proc.c +++ b/nt36xxx/nt36xxx_ext_proc.c @@ -59,6 +59,12 @@ static struct proc_dir_entry *NVT_proc_pen_2d_baseline_entry; static struct proc_dir_entry *NVT_proc_pen_2d_diff_entry; static struct proc_dir_entry *NVT_proc_pen_1d_diff_entry; +void nvt_get_xdata_info(int32_t **ptr, int *size) +{ + *ptr = xdata; + *size = sizeof(xdata); +} + /******************************************************* Description: Novatek touchscreen change mode function. diff --git a/nt36xxx/nt36xxx_goog.c b/nt36xxx/nt36xxx_goog.c index 5696d21..bb8e67d 100644 --- a/nt36xxx/nt36xxx_goog.c +++ b/nt36xxx/nt36xxx_goog.c @@ -7,6 +7,7 @@ #include "nt36xxx.h" #include <linux/input/mt.h> #include <samsung/exynos_drm_connector.h> /* to_exynos_connector_state() */ +#include "../../../gs-google/drivers/soc/google/vh/kernel/systrace.h" void nvt_heatmap_decode( const uint8_t *in, const uint32_t in_sz, @@ -149,6 +150,78 @@ int nvt_get_channel_data(void *private_data, return ret; } +int nvt_test_mode_read(struct nvt_ts_data *ts, struct gti_sensor_data_cmd *cmd) +{ + char trace_tag[128]; + int ret = 0; + + scnprintf(trace_tag, sizeof(trace_tag), "%s: type=%#x\n", + __func__, cmd->type); + ATRACE_BEGIN(trace_tag); + + NVT_DBG("++\n"); + if (mutex_lock_interruptible(&ts->lock)) { + ret = -ERESTARTSYS; + goto err_read; + } + +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif /* #if NVT_TOUCH_ESD_PROTECT */ + + if (nvt_clear_fw_status()) { + ret = -EAGAIN; + goto err_read; + } + + nvt_change_mode(TEST_MODE_2); + + if (nvt_check_fw_status()) { + ret = -EAGAIN; + goto err_read; + } + + if (nvt_get_fw_info()) { + ret = -EAGAIN; + goto err_read; + } + + switch (cmd->type) { + case GTI_SENSOR_DATA_TYPE_MS_RAW: + if (nvt_get_fw_pipe() == 0) + nvt_read_mdata(ts->mmap->RAW_PIPE0_ADDR, ts->mmap->RAW_BTN_PIPE0_ADDR); + else + nvt_read_mdata(ts->mmap->RAW_PIPE1_ADDR, ts->mmap->RAW_BTN_PIPE1_ADDR); + break; + case GTI_SENSOR_DATA_TYPE_MS_BASELINE: + nvt_read_mdata(ts->mmap->BASELINE_ADDR, ts->mmap->BASELINE_BTN_ADDR); + break; + case GTI_SENSOR_DATA_TYPE_MS_DIFF: + if (nvt_get_fw_pipe() == 0) + nvt_read_mdata(ts->mmap->DIFF_PIPE0_ADDR, ts->mmap->DIFF_BTN_PIPE0_ADDR); + else + nvt_read_mdata(ts->mmap->DIFF_PIPE1_ADDR, ts->mmap->DIFF_BTN_PIPE1_ADDR); + break; + default: + NVT_ERR("invalid type %#x.\n", cmd->type); + ret = -ENODATA; + break; + } + +err_read: + nvt_change_mode(NORMAL_MODE); + if (ret == -EAGAIN) { + NVT_LOG("Reload FW to recover unexcepted return!"); + nvt_update_firmware(get_fw_name(), 1); + } + mutex_unlock(&ts->lock); + NVT_DBG("--, ret(%d)\n", ret); + + ATRACE_END(); + return ret; +} + + int nvt_callback(void *private_data, enum gti_cmd_type cmd_type, struct gti_union_cmd_data *cmd) { @@ -269,10 +342,32 @@ int nvt_callback(void *private_data, break; case GTI_CMD_GET_SENSOR_DATA_MANUAL: - if (cmd->manual_sensor_data_cmd.type == GTI_SENSOR_DATA_TYPE_MS_DIFF) { - cmd->manual_sensor_data_cmd.buffer = ts->heatmap_out_buf; - cmd->manual_sensor_data_cmd.size = ts->heatmap_out_buf_size; - ret = 0; + if (display_state_on == false || + !(cmd->manual_sensor_data_cmd.type & TOUCH_SCAN_TYPE_MUTUAL)) { + ret = -ENODATA; + } else { + int16_t *out = (int16_t *)ts->extra_spi_buf; + int out_sz = ts->x_num * ts->y_num * sizeof(int16_t); + int32_t *in = NULL; + int in_sz = 0; + + nvt_get_xdata_info(&in, &in_sz); + if (in && out && + out_sz <= in_sz && + out_sz <= ts->extra_spi_buf_size) { + int i, j; + int idx = 0; + + ret = nvt_test_mode_read(ts, &cmd->manual_sensor_data_cmd); + if (!ret) { + for (i = 0; i < ts->y_num; i++) + for (j = 0; j < ts->x_num; j++) + out[idx++] = (int16_t)in[i * ts->x_num + j]; + + cmd->manual_sensor_data_cmd.buffer = ts->extra_spi_buf; + cmd->manual_sensor_data_cmd.size = out_sz; + } + } } break; |