summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuper Liu <supercjliu@google.com>2022-12-05 04:06:09 +0000
committerSuper Liu <supercjliu@google.com>2022-12-21 06:40:37 +0000
commitaf670a799c8981ba4f170e7848c808dca0679577 (patch)
tree63ddd2376c9e58bba15a455f034da740a2fc72e0
parent0bc000489400f8f96bf08cb60ed6e1d684a46c2c (diff)
downloadnovatek_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.c2
-rw-r--r--nt36xxx/nt36xxx.h2
-rw-r--r--nt36xxx/nt36xxx_ext_proc.c6
-rw-r--r--nt36xxx/nt36xxx_goog.c103
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;