summaryrefslogtreecommitdiff
path: root/goodix_ts_proc.c
diff options
context:
space:
mode:
authorWendly Li <wendlyli@google.com>2022-05-11 04:26:56 +0000
committerWendly Li <wendlyli@google.com>2022-05-24 13:08:44 +0000
commit4d5d4a97a95d7958ba0060212beadd3bb7adffb5 (patch)
tree74b86ae2477b67a780d6cd10686d92b797abd034 /goodix_ts_proc.c
parentf5dc04e05ad88202465c7bfdfa5785975d3e0951 (diff)
downloadgoodix_touch-4d5d4a97a95d7958ba0060212beadd3bb7adffb5.tar.gz
goodix: Import v1.0.8 driver
Bug: 214118837 Test: Check heatmap works Change-Id: Iabf7fcff4183f4bdfae4622765bba795fc8a01a0 Signed-off-by: Wendly Li <wendlyli@google.com>
Diffstat (limited to 'goodix_ts_proc.c')
-rw-r--r--goodix_ts_proc.c332
1 files changed, 177 insertions, 155 deletions
diff --git a/goodix_ts_proc.c b/goodix_ts_proc.c
index 777eb3d..c24fbe2 100644
--- a/goodix_ts_proc.c
+++ b/goodix_ts_proc.c
@@ -22,7 +22,8 @@
#define CMD_SET_DOUBLE_TAP "set_double_tap"
#define CMD_SET_SINGLE_TAP "set_single_tap"
#define CMD_SET_LONG_PRESS "set_long_press"
-#define CMD_SET_GESTURE_PARAM "set_gesture_param"
+#define CMD_SET_ST_PARAM "set_st_param"
+#define CMD_SET_LP_PARAM "set_lp_param"
#define CMD_SET_CHARGE_MODE "set_charge_mode"
#define CMD_SET_IRQ_ENABLE "set_irq_enable"
#define CMD_SET_ESD_ENABLE "set_esd_enable"
@@ -48,13 +49,13 @@ char *cmd_list[] = { CMD_FW_UPDATE, CMD_AUTO_TEST, CMD_OPEN_TEST,
CMD_GET_PACKAGE_ID, CMD_GET_VERSION, CMD_GET_RAWDATA, CMD_GET_DIFFDATA,
CMD_GET_BASEDATA, CMD_GET_SELF_RAWDATA, CMD_GET_SELF_DIFFDATA,
CMD_GET_SELF_BASEDATA, CMD_SET_DOUBLE_TAP, CMD_SET_SINGLE_TAP,
- CMD_SET_LONG_PRESS, CMD_SET_GESTURE_PARAM, CMD_SET_CHARGE_MODE,
- CMD_SET_IRQ_ENABLE, CMD_SET_ESD_ENABLE, CMD_SET_DEBUG_LOG,
- CMD_SET_SCAN_MODE, CMD_GET_SCAN_MODE, CMD_SET_CONTINUE_MODE,
- CMD_GET_CHANNEL_NUM, CMD_GET_TX_FREQ, CMD_RESET, CMD_SET_SENSE_MODE,
- CMD_GET_CONFIG, CMD_GET_FW_STATUS, CMD_SET_HIGHSENSE_MODE,
- CMD_SET_GRIP_DATA, CMD_SET_PALM_MODE, CMD_SET_NOISE_MODE,
- CMD_SET_WATER_MODE, CMD_SET_HEATMAP, NULL };
+ CMD_SET_LONG_PRESS, CMD_SET_ST_PARAM, CMD_SET_LP_PARAM,
+ CMD_SET_CHARGE_MODE, CMD_SET_IRQ_ENABLE, CMD_SET_ESD_ENABLE,
+ CMD_SET_DEBUG_LOG, CMD_SET_SCAN_MODE, CMD_GET_SCAN_MODE,
+ CMD_SET_CONTINUE_MODE, CMD_GET_CHANNEL_NUM, CMD_GET_TX_FREQ, CMD_RESET,
+ CMD_SET_SENSE_MODE, CMD_GET_CONFIG, CMD_GET_FW_STATUS,
+ CMD_SET_HIGHSENSE_MODE, CMD_SET_GRIP_DATA, CMD_SET_PALM_MODE,
+ CMD_SET_NOISE_MODE, CMD_SET_WATER_MODE, CMD_SET_HEATMAP, NULL };
/* test limits keyword */
#define CSV_TP_SPECIAL_RAW_MIN "special_raw_min"
@@ -100,9 +101,12 @@ static uint32_t index;
#define MAX_SEN_NUM 35
#define MAX_SHORT_NUM 15
+#define GESTURE_STTW 0
+#define GESTURE_LPTW 1
typedef union __attribute__((packed)) {
struct {
- u16 length;
+ u8 length;
+ u8 type;
u16 st_min_x;
u16 st_max_x;
u16 st_min_y;
@@ -111,6 +115,16 @@ typedef union __attribute__((packed)) {
u16 st_max_count;
u16 st_motion_tolerance;
u16 st_max_size;
+ u16 checksum;
+ };
+ u8 buf[20];
+} gesture_param_st_t;
+static gesture_param_st_t gesture_param_st;
+
+typedef union __attribute__((packed)) {
+ struct {
+ u8 length;
+ u8 type;
u16 lp_min_x;
u16 lp_max_x;
u16 lp_min_y;
@@ -130,9 +144,9 @@ typedef union __attribute__((packed)) {
u16 lp_motion_tolerance_outer;
u16 checksum;
};
- u8 buf[50];
-} gesture_param_t;
-static gesture_param_t gesture_param;
+ u8 buf[34];
+} gesture_param_lp_t;
+static gesture_param_lp_t gesture_param_lp;
typedef struct __attribute__((packed)) {
u8 result;
@@ -2144,7 +2158,6 @@ static void goodix_set_sense_mode(u8 val)
if (val == 1) {
/* normal mode */
index = sprintf(rbuf, "switch to coordinate mode\n");
- cd->hw_ops->resume(cd);
cd->hw_ops->send_cmd(cd, &temp_cmd);
goodix_ts_blocking_notify(NOTIFY_ESD_ON, NULL);
cd->hw_ops->irq_enable(cd, true);
@@ -2153,7 +2166,6 @@ static void goodix_set_sense_mode(u8 val)
/* gesture mode */
index = sprintf(rbuf, "switch to gesture mode\n");
goodix_ts_blocking_notify(NOTIFY_ESD_OFF, NULL);
- cd->hw_ops->resume(cd);
cd->hw_ops->gesture(cd, 0);
cd->hw_ops->irq_enable(cd, true);
atomic_set(&cd->suspended, 1);
@@ -2170,32 +2182,19 @@ static void goodix_set_scan_mode(u8 val)
{
struct goodix_ts_cmd temp_cmd;
+ temp_cmd.len = 5;
+ temp_cmd.cmd = 0x9F;
+
if (val == 0) {
- temp_cmd.len = 5;
- temp_cmd.cmd = 0x9F;
- temp_cmd.data[0] = 0;
- cd->hw_ops->send_cmd(cd, &temp_cmd);
- temp_cmd.len = 6;
- temp_cmd.cmd = 0x25;
temp_cmd.data[0] = 0;
- temp_cmd.data[1] = 0;
ts_info("set scan mode to default");
index = sprintf(rbuf, "set scan mode to default\n");
} else if (val == 1) {
- temp_cmd.len = 5;
- temp_cmd.cmd = 0x9F;
- temp_cmd.data[0] = 1;
+ temp_cmd.data[0] = 3;
ts_info("set scan mode to idle");
index = sprintf(rbuf, "set scan mode to idle\n");
} else {
- temp_cmd.len = 5;
- temp_cmd.cmd = 0x9F;
- temp_cmd.data[0] = 0;
- cd->hw_ops->send_cmd(cd, &temp_cmd);
- temp_cmd.len = 6;
- temp_cmd.cmd = 0x25;
- temp_cmd.data[0] = 0xff;
- temp_cmd.data[1] = 0xff;
+ temp_cmd.data[0] = 2;
ts_info("set scan mode to active");
index = sprintf(rbuf, "set scan mode to active\n");
}
@@ -2205,38 +2204,23 @@ static void goodix_set_scan_mode(u8 val)
static void goodix_get_scan_mode(void)
{
- u32 cmd_addr = cd->ic_info.misc.cmd_addr;
- u8 cmd_buf[] = { 0x00, 0x00, 0x05, 0xC5, 0x01, 0xCB, 0x00 };
- u8 rcv_buf[2];
- int retry = 20;
+ u8 status;
- cd->hw_ops->write(cd, cmd_addr, cmd_buf, sizeof(cmd_buf));
- while (retry--) {
- usleep_range(2000, 2100);
- cd->hw_ops->read(cd, cmd_addr, rcv_buf, sizeof(rcv_buf));
- if (rcv_buf[0] == 0x80 && rcv_buf[1] == 0x80)
- break;
- }
- if (retry < 0) {
- ts_err("failed get scan mode, sta[%x] ack[%x]", rcv_buf[0],
- rcv_buf[1]);
- return;
- }
- cd->hw_ops->read(cd, 0x10184, rcv_buf, sizeof(rcv_buf));
- ts_info("rcv_buf:%x %x", rcv_buf[0], rcv_buf[1]);
+ cd->hw_ops->read(cd, 0x10218, &status, 1);
+ ts_info("ic status:%d", status);
- if (rcv_buf[1] == 1) {
+ if (status == 1) {
index = sprintf(rbuf, "normal active\n");
- } else if (rcv_buf[1] == 2) {
+ } else if (status == 2) {
index = sprintf(rbuf, "normal idle\n");
- } else if (rcv_buf[1] == 3) {
+ } else if (status == 3) {
index = sprintf(rbuf, "lowpower active\n");
- } else if (rcv_buf[1] == 4) {
+ } else if (status == 4) {
index = sprintf(rbuf, "lowpower idle\n");
- } else if (rcv_buf[1] == 5) {
+ } else if (status == 5) {
index = sprintf(rbuf, "sleep\n");
} else {
- index = sprintf(rbuf, "invalid mode %d\n", rcv_buf[1]);
+ index = sprintf(rbuf, "invalid mode %d\n", status);
}
}
@@ -2367,34 +2351,31 @@ static void goodix_set_custom_mode(u8 type, u8 val)
{
struct goodix_ts_cmd temp_cmd;
- temp_cmd.len = 6;
- temp_cmd.cmd = 0xC7;
- temp_cmd.data[0] = type;
-
- if (type == PALM_FUNC)
- index += sprintf(&rbuf[index], "palm ");
- else if (type == NOISE_FUNC)
- index += sprintf(&rbuf[index], "noise ");
- else if (type == WATER_FUNC)
- index += sprintf(&rbuf[index], "water ");
- else {
- ts_err("invalid type, %d", type);
- return;
- }
-
- if (val == 1) {
- ts_info("restore");
- index += sprintf(&rbuf[index], "restore\n");
- temp_cmd.data[1] = 0;
- } else if (val == 0) {
- ts_info("disabled");
- index += sprintf(&rbuf[index], "disabled\n");
- temp_cmd.data[1] = 1;
+ if (type == PALM_FUNC) {
+ index = sprintf(&rbuf[index], "set palm %s\n",
+ val ? "disabled" : "restore");
+ } else if (type == NOISE_FUNC) {
+ if (val == 0) {
+ index = sprintf(&rbuf[index], "set noise restore\n");
+ } else if (val == 1) {
+ index = sprintf(&rbuf[index], "set noise disabled\n");
+ } else if (val == 2) {
+ index = sprintf(&rbuf[index], "set noise lv0\n");
+ } else {
+ index = sprintf(&rbuf[index], "set noise lv1\n");
+ }
+ } else if (type == WATER_FUNC) {
+ index = sprintf(&rbuf[index], "set water %s\n",
+ val ? "disabled" : "restore");
} else {
- ts_err("invalid val, %d", val);
+ ts_err("invalid type, %d", type);
return;
}
+ temp_cmd.len = 6;
+ temp_cmd.cmd = 0xC7;
+ temp_cmd.data[0] = type;
+ temp_cmd.data[1] = val;
cd->hw_ops->send_cmd(cd, &temp_cmd);
}
@@ -2415,86 +2396,105 @@ static int obtain_param(char **buf)
return val;
}
-static int goodix_parse_gesture_param(char **buf)
+static int goodix_parse_gesture_param(u8 type, char **buf)
{
- gesture_param.length = 50;
- gesture_param.st_min_x = obtain_param(buf);
- gesture_param.st_max_x = obtain_param(buf);
- gesture_param.st_min_y = obtain_param(buf);
- gesture_param.st_max_y = obtain_param(buf);
- gesture_param.st_min_count = obtain_param(buf);
- gesture_param.st_max_count = obtain_param(buf);
- gesture_param.st_motion_tolerance = obtain_param(buf);
- gesture_param.st_max_size = obtain_param(buf);
- gesture_param.lp_min_x = obtain_param(buf);
- gesture_param.lp_max_x = obtain_param(buf);
- gesture_param.lp_min_y = obtain_param(buf);
- gesture_param.lp_max_y = obtain_param(buf);
- gesture_param.lp_min_count = obtain_param(buf);
- gesture_param.lp_max_size = obtain_param(buf);
- gesture_param.lp_marginal_min_x = obtain_param(buf);
- gesture_param.lp_marginal_max_x = obtain_param(buf);
- gesture_param.lp_marginal_min_y = obtain_param(buf);
- gesture_param.lp_marginal_max_y = obtain_param(buf);
- gesture_param.lp_monitor_chan_min_tx = obtain_param(buf);
- gesture_param.lp_monitor_chan_max_tx = obtain_param(buf);
- gesture_param.lp_monitor_chan_min_rx = obtain_param(buf);
- gesture_param.lp_monitor_chan_max_rx = obtain_param(buf);
- gesture_param.lp_min_node_count = obtain_param(buf);
- gesture_param.lp_motion_tolerance_inner = obtain_param(buf);
- gesture_param.lp_motion_tolerance_outer = obtain_param(buf);
- goodix_append_checksum(gesture_param.buf, 48, CHECKSUM_MODE_U8_LE);
-
- ts_info("st_min_x: %d", gesture_param.st_min_x);
- ts_info("st_max_x: %d", gesture_param.st_max_x);
- ts_info("st_min_y: %d", gesture_param.st_min_y);
- ts_info("st_max_y: %d", gesture_param.st_max_y);
- ts_info("st_min_count: %d", gesture_param.st_min_count);
- ts_info("st_max_count: %d", gesture_param.st_max_count);
- ts_info("st_motion_tolerance: %d",
- gesture_param.st_motion_tolerance);
- ts_info("st_max_size: %d", gesture_param.st_max_size);
- ts_info("lp_min_x: %d", gesture_param.lp_min_x);
- ts_info("lp_max_x: %d", gesture_param.lp_max_x);
- ts_info("lp_min_y: %d", gesture_param.lp_min_y);
- ts_info("lp_max_y: %d", gesture_param.lp_max_y);
- ts_info("lp_min_count: %d", gesture_param.lp_min_count);
- ts_info("lp_max_size: %d", gesture_param.lp_max_size);
- ts_info("lp_marginal_min_x: %d",
- gesture_param.lp_marginal_min_x);
- ts_info("lp_marginal_max_x: %d",
- gesture_param.lp_marginal_max_x);
- ts_info("lp_marginal_min_y: %d",
- gesture_param.lp_marginal_min_y);
- ts_info("lp_marginal_max_y: %d",
- gesture_param.lp_marginal_max_y);
- ts_info("lp_monitor_chan_min_tx: %d",
- gesture_param.lp_monitor_chan_min_tx);
- ts_info("lp_monitor_chan_max_tx: %d",
- gesture_param.lp_monitor_chan_max_tx);
- ts_info("lp_monitor_chan_min_rx: %d",
- gesture_param.lp_monitor_chan_min_rx);
- ts_info("lp_monitor_chan_max_rx: %d",
- gesture_param.lp_monitor_chan_max_rx);
- ts_info("lp_min_node_count: %d",
- gesture_param.lp_min_node_count);
- ts_info("lp_motion_tolerance_inner: %d",
- gesture_param.lp_motion_tolerance_inner);
- ts_info("lp_motion_tolerance_outer: %d",
- gesture_param.lp_motion_tolerance_outer);
+ if (type == GESTURE_STTW) {
+ gesture_param_st.length = sizeof(gesture_param_st);
+ gesture_param_st.type = type;
+ gesture_param_st.st_min_x = obtain_param(buf);
+ gesture_param_st.st_max_x = obtain_param(buf);
+ gesture_param_st.st_min_y = obtain_param(buf);
+ gesture_param_st.st_max_y = obtain_param(buf);
+ gesture_param_st.st_min_count = obtain_param(buf);
+ gesture_param_st.st_max_count = obtain_param(buf);
+ gesture_param_st.st_motion_tolerance = obtain_param(buf);
+ gesture_param_st.st_max_size = obtain_param(buf);
+ goodix_append_checksum(gesture_param_st.buf,
+ sizeof(gesture_param_st) - 2, CHECKSUM_MODE_U8_LE);
+ ts_info("st_min_x: %d",
+ gesture_param_st.st_min_x);
+ ts_info("st_max_x: %d",
+ gesture_param_st.st_max_x);
+ ts_info("st_min_y: %d",
+ gesture_param_st.st_min_y);
+ ts_info("st_max_y: %d",
+ gesture_param_st.st_max_y);
+ ts_info("st_min_count: %d",
+ gesture_param_st.st_min_count);
+ ts_info("st_max_count: %d",
+ gesture_param_st.st_max_count);
+ ts_info("st_motion_tolerance: %d",
+ gesture_param_st.st_motion_tolerance);
+ ts_info("st_max_size: %d",
+ gesture_param_st.st_max_size);
+ } else {
+ gesture_param_lp.length = sizeof(gesture_param_lp);
+ gesture_param_lp.type = type;
+ gesture_param_lp.lp_min_x = obtain_param(buf);
+ gesture_param_lp.lp_max_x = obtain_param(buf);
+ gesture_param_lp.lp_min_y = obtain_param(buf);
+ gesture_param_lp.lp_max_y = obtain_param(buf);
+ gesture_param_lp.lp_min_count = obtain_param(buf);
+ gesture_param_lp.lp_max_size = obtain_param(buf);
+ gesture_param_lp.lp_marginal_min_x = obtain_param(buf);
+ gesture_param_lp.lp_marginal_max_x = obtain_param(buf);
+ gesture_param_lp.lp_marginal_min_y = obtain_param(buf);
+ gesture_param_lp.lp_marginal_max_y = obtain_param(buf);
+ gesture_param_lp.lp_monitor_chan_min_tx = obtain_param(buf);
+ gesture_param_lp.lp_monitor_chan_max_tx = obtain_param(buf);
+ gesture_param_lp.lp_monitor_chan_min_rx = obtain_param(buf);
+ gesture_param_lp.lp_monitor_chan_max_rx = obtain_param(buf);
+ gesture_param_lp.lp_min_node_count = obtain_param(buf);
+ gesture_param_lp.lp_motion_tolerance_inner = obtain_param(buf);
+ gesture_param_lp.lp_motion_tolerance_outer = obtain_param(buf);
+ goodix_append_checksum(gesture_param_lp.buf,
+ sizeof(gesture_param_lp) - 2, CHECKSUM_MODE_U8_LE);
+ ts_info("lp_min_x: %d",
+ gesture_param_lp.lp_min_x);
+ ts_info("lp_max_x: %d",
+ gesture_param_lp.lp_max_x);
+ ts_info("lp_min_y: %d",
+ gesture_param_lp.lp_min_y);
+ ts_info("lp_max_y: %d",
+ gesture_param_lp.lp_max_y);
+ ts_info("lp_min_count: %d",
+ gesture_param_lp.lp_min_count);
+ ts_info("lp_max_size: %d",
+ gesture_param_lp.lp_max_size);
+ ts_info("lp_marginal_min_x: %d",
+ gesture_param_lp.lp_marginal_min_x);
+ ts_info("lp_marginal_max_x: %d",
+ gesture_param_lp.lp_marginal_max_x);
+ ts_info("lp_marginal_min_y: %d",
+ gesture_param_lp.lp_marginal_min_y);
+ ts_info("lp_marginal_max_y: %d",
+ gesture_param_lp.lp_marginal_max_y);
+ ts_info("lp_monitor_chan_min_tx: %d",
+ gesture_param_lp.lp_monitor_chan_min_tx);
+ ts_info("lp_monitor_chan_max_tx: %d",
+ gesture_param_lp.lp_monitor_chan_max_tx);
+ ts_info("lp_monitor_chan_min_rx: %d",
+ gesture_param_lp.lp_monitor_chan_min_rx);
+ ts_info("lp_monitor_chan_max_rx: %d",
+ gesture_param_lp.lp_monitor_chan_max_rx);
+ ts_info("lp_min_node_count: %d",
+ gesture_param_lp.lp_min_node_count);
+ ts_info("lp_motion_tolerance_inner: %d",
+ gesture_param_lp.lp_motion_tolerance_inner);
+ ts_info("lp_motion_tolerance_outer: %d",
+ gesture_param_lp.lp_motion_tolerance_outer);
+ }
return 0;
}
-static void goodix_set_gesture_param(void)
+static void goodix_set_gesture_param(u8 type)
{
struct goodix_ts_cmd temp_cmd;
u32 cmd_reg = cd->ic_info.misc.cmd_addr;
int retry;
u8 status;
- ts_info("param:%*ph", 50, gesture_param.buf);
-
temp_cmd.len = 4;
temp_cmd.cmd = 0xC8;
cd->hw_ops->send_cmd(cd, &temp_cmd);
@@ -2510,8 +2510,17 @@ static void goodix_set_gesture_param(void)
status);
goto exit;
}
- cd->hw_ops->write(
- cd, 0x13D80, gesture_param.buf, sizeof(gesture_param));
+ 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,
+ 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,
+ sizeof(gesture_param_lp));
+ }
temp_cmd.len = 4;
temp_cmd.cmd = 0x05;
@@ -3167,16 +3176,29 @@ static ssize_t driver_test_write(
goto exit;
}
- if (!strncmp(p, CMD_SET_GESTURE_PARAM, strlen(CMD_SET_GESTURE_PARAM))) {
+ if (!strncmp(p, CMD_SET_ST_PARAM, strlen(CMD_SET_ST_PARAM))) {
+ rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL);
+ token = strsep(&p, ",");
+ if (!token || !p) {
+ index = sprintf(rbuf, "%s: invalid cmd param\n",
+ CMD_SET_ST_PARAM);
+ goto exit;
+ }
+ goodix_parse_gesture_param(GESTURE_STTW, &p);
+ goodix_set_gesture_param(GESTURE_STTW);
+ goto exit;
+ }
+
+ if (!strncmp(p, CMD_SET_LP_PARAM, strlen(CMD_SET_LP_PARAM))) {
rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL);
token = strsep(&p, ",");
if (!token || !p) {
index = sprintf(rbuf, "%s: invalid cmd param\n",
- CMD_SET_GESTURE_PARAM);
+ CMD_SET_LP_PARAM);
goto exit;
}
- goodix_parse_gesture_param(&p);
- goodix_set_gesture_param();
+ goodix_parse_gesture_param(GESTURE_LPTW, &p);
+ goodix_set_gesture_param(GESTURE_LPTW);
goto exit;
}