summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSuper Liu <supercjliu@google.com>2020-07-20 14:37:20 +0800
committerSuper Liu <supercjliu@google.com>2020-07-30 08:05:13 +0800
commite09e00a8f03392752ce2d81e95670ad8aa44a3f4 (patch)
tree3241b4952e2983237c0b58084ee2fb4376d93365
parentfcb5c0228bd97322a9b6c2f806aabef2302dd55c (diff)
downloadsec_touch-e09e00a8f03392752ce2d81e95670ad8aa44a3f4.tar.gz
sec_touch: refine mis-calibration check
Unify the entry to do the mis-calibration check. This include the sufficient delay to lock the active mode before trigger this check. And, add run_cal_check sysfs for mis-calibration check and debug analysis. Bug: 161424891 Bug: 161890987 Change-Id: Ic64abce28c3861a27086b841617f44af99840eb3 Signed-off-by: Super Liu <supercjliu@google.com>
-rw-r--r--sec_ts.h1
-rw-r--r--sec_ts_fn.c155
-rw-r--r--sec_ts_fw.c53
3 files changed, 92 insertions, 117 deletions
diff --git a/sec_ts.h b/sec_ts.h
index da8b820..9901d63 100644
--- a/sec_ts.h
+++ b/sec_ts.h
@@ -1129,6 +1129,7 @@ int execute_selftest(struct sec_ts_data *ts, u32 option);
int execute_p2ptest(struct sec_ts_data *ts);
int sec_ts_read_raw_data(struct sec_ts_data *ts,
struct sec_cmd_data *sec, struct sec_ts_test_mode *mode);
+u8 sec_ts_run_cal_check(struct sec_ts_data *ts);
#if (1)//!defined(CONFIG_SAMSUNG_PRODUCT_SHIP)
int sec_ts_raw_device_init(struct sec_ts_data *ts);
diff --git a/sec_ts_fn.c b/sec_ts_fn.c
index bc5f2d2..ad9ba71 100644
--- a/sec_ts_fn.c
+++ b/sec_ts_fn.c
@@ -113,6 +113,7 @@ static void set_noise_mode_enable(void *device_data);
static void set_continuous_report_enable(void *device_data);
static void set_charger_nb_enable(void *device_data);
static void set_print_format(void *device_data);
+static void run_cal_check(void *device_data);
static struct sec_cmd sec_cmds[] = {
{SEC_CMD("fw_update", fw_update),},
@@ -222,6 +223,7 @@ static struct sec_cmd sec_cmds[] = {
set_continuous_report_enable),},
{SEC_CMD("set_charger_nb_enable", set_charger_nb_enable),},
{SEC_CMD("set_print_format", set_print_format),},
+ {SEC_CMD("run_cal_check", run_cal_check),},
{SEC_CMD("not_support_cmd", not_support_cmd),},
};
@@ -1269,10 +1271,18 @@ int sec_ts_fix_tmode(struct sec_ts_data *ts, u8 mode, u8 state)
__func__, mode, state);
ret = ts->sec_ts_write(ts, SEC_TS_CMD_STATEMANAGE_ON, onoff, 1);
+ if (ret < 0)
+ input_err(true, &ts->client->dev,
+ "%s: write reg %#x failed, return %i\n",
+ __func__, SEC_TS_CMD_STATEMANAGE_ON, ret);
sec_ts_delay(20);
ret = ts->sec_ts_write(ts, SEC_TS_CMD_CHG_SYSMODE, tBuff,
sizeof(tBuff));
+ if (ret < 0)
+ input_err(true, &ts->client->dev,
+ "%s: write reg %#x failed, return %i\n",
+ __func__, SEC_TS_CMD_CHG_SYSMODE, ret);
sec_ts_delay(20);
return ret;
@@ -1286,6 +1296,10 @@ int sec_ts_release_tmode(struct sec_ts_data *ts)
input_info(true, &ts->client->dev, "%s\n", __func__);
ret = ts->sec_ts_write(ts, SEC_TS_CMD_STATEMANAGE_ON, onoff, 1);
+ if (ret < 0)
+ input_err(true, &ts->client->dev,
+ "%s: write reg %#x failed, return %i\n",
+ __func__, SEC_TS_CMD_STATEMANAGE_ON, ret);
sec_ts_delay(20);
return ret;
@@ -5229,7 +5243,6 @@ static void run_force_calibration(void *device_data)
u8 img_ver[4];
#endif
struct sec_ts_test_mode mode;
- char mis_cal_data = 0xF0;
sec_ts_set_bus_ref(ts, SEC_TS_BUS_REF_SYSFS, true);
@@ -5268,72 +5281,19 @@ static void run_force_calibration(void *device_data)
"%s: fail to write PRESSURE CAL!\n", __func__);
#endif
- if (ts->plat_data->mis_cal_check) {
- buff[0] = 0;
- rc = ts->sec_ts_write(ts, SEC_TS_CMD_STATEMANAGE_ON,
- buff, 1);
- if (rc < 0) {
- input_err(true, &ts->client->dev,
- "%s: mis_cal_check error[1] ret: %d\n",
- __func__, rc);
- }
-
- buff[0] = 0x2;
- buff[1] = 0x2;
- rc = ts->sec_ts_write(ts, SEC_TS_CMD_CHG_SYSMODE,
- buff, 2);
- if (rc < 0) {
- input_err(true, &ts->client->dev,
- "%s: mis_cal_check error[2] ret: %d\n",
- __func__, rc);
- }
-
- input_err(true, &ts->client->dev,
- "%s: try mis Cal. check\n", __func__);
- rc = ts->sec_ts_write(ts, SEC_TS_CMD_MIS_CAL_CHECK,
- NULL, 0);
- if (rc < 0) {
- input_err(true, &ts->client->dev,
- "%s: mis_cal_check error[3] ret: %d\n",
- __func__, rc);
- }
- sec_ts_delay(200);
-
- rc = ts->sec_ts_read(ts, SEC_TS_CMD_MIS_CAL_READ,
- &mis_cal_data, 1);
- if (rc < 0) {
- input_err(true, &ts->client->dev,
- "%s: fail!, %d\n", __func__, rc);
- mis_cal_data = 0xF3;
- } else {
- input_info(true, &ts->client->dev,
- "%s: miss cal data : %d\n",
- __func__, mis_cal_data);
- }
-
- buff[0] = 1;
- rc = ts->sec_ts_write(ts, SEC_TS_CMD_STATEMANAGE_ON,
- buff, 1);
- if (rc < 0) {
- input_err(true, &ts->client->dev,
- "%s: mis_cal_check error[4] ret: %d\n",
- __func__, rc);
- }
-
- if (mis_cal_data) {
- memset(&mode, 0x00,
- sizeof(struct sec_ts_test_mode));
- mode.type = TYPE_AMBIENT_DATA;
- mode.allnode = TEST_MODE_ALL_NODE;
-
- sec_ts_read_raw_data(ts, NULL, &mode);
- snprintf(buff, sizeof(buff), "%s", "MIS CAL");
- sec->cmd_state = SEC_CMD_STATUS_FAIL;
+ if (ts->plat_data->mis_cal_check &&
+ sec_ts_run_cal_check(ts)) {
+ memset(&mode, 0x00,
+ sizeof(struct sec_ts_test_mode));
+ mode.type = TYPE_AMBIENT_DATA;
+ mode.allnode = TEST_MODE_ALL_NODE;
- enable_irq(ts->client->irq);
+ sec_ts_read_raw_data(ts, NULL, &mode);
+ snprintf(buff, sizeof(buff), "%s", "MIS CAL");
+ sec->cmd_state = SEC_CMD_STATUS_FAIL;
- goto out_force_cal;
- }
+ enable_irq(ts->client->irq);
+ goto out_force_cal;
}
#ifdef PAT_CONTROL
@@ -7431,6 +7391,71 @@ static void set_print_format(void *device_data)
sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff)));
}
+u8 sec_ts_run_cal_check(struct sec_ts_data *ts)
+{
+ int rc = 0;
+ u8 mis_cal_data = 0xF0;
+
+ if (ts->plat_data->mis_cal_check) {
+ rc = sec_ts_fix_tmode(ts, TOUCH_SYSTEM_MODE_TOUCH,
+ TOUCH_MODE_STATE_TOUCH);
+ if (rc < 0)
+ input_err(true, &ts->client->dev,
+ "%s: failed#1 ret: %d\n", __func__, rc);
+
+ rc = ts->sec_ts_write(ts, SEC_TS_CMD_MIS_CAL_CHECK,
+ NULL, 0);
+ if (rc < 0)
+ input_err(true, &ts->client->dev,
+ "%s: failed#2 ret: %d\n", __func__, rc);
+ sec_ts_delay(200);
+
+ rc = ts->sec_ts_read(ts, SEC_TS_CMD_MIS_CAL_READ,
+ &mis_cal_data, 1);
+ if (rc < 0) {
+ input_err(true, &ts->client->dev,
+ "%s: failed#3 ret: %d\n", __func__, rc);
+ mis_cal_data = 0xF3;
+ } else {
+ input_info(true, &ts->client->dev,
+ "%s: mis cal data : %d\n",
+ __func__, mis_cal_data);
+ }
+
+ rc = sec_ts_release_tmode(ts);
+ if (rc < 0)
+ input_err(true, &ts->client->dev,
+ "%s: failed#4 ret: %d\n", __func__, rc);
+ } else {
+ input_info(true, &ts->client->dev,
+ "%s: not support!\n", __func__);
+ mis_cal_data = 0xF1;
+ }
+
+ return mis_cal_data;
+}
+
+static void run_cal_check(void *device_data)
+{
+ struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data;
+ struct sec_ts_data *ts = container_of(sec, struct sec_ts_data, sec);
+ char buff[SEC_CMD_STR_LEN] = { 0 };
+ u8 ret;
+
+ sec_ts_set_bus_ref(ts, SEC_TS_BUS_REF_SYSFS, true);
+ sec_cmd_set_default_result(sec);
+
+ ret = sec_ts_run_cal_check(ts);
+ if (ret)
+ scnprintf(buff, sizeof(buff), "FAIL(%#x)\n", ret);
+ else
+ scnprintf(buff, sizeof(buff), "OK\n");
+
+ sec->cmd_state = SEC_CMD_STATUS_OK;
+ sec_cmd_set_cmd_result(sec, buff, strnlen(buff, sizeof(buff)));
+ sec_ts_set_bus_ref(ts, SEC_TS_BUS_REF_SYSFS, false);
+}
+
static void not_support_cmd(void *device_data)
{
struct sec_cmd_data *sec = (struct sec_cmd_data *)device_data;
diff --git a/sec_ts_fw.c b/sec_ts_fw.c
index 8db5b58..b02ab38 100644
--- a/sec_ts_fw.c
+++ b/sec_ts_fw.c
@@ -1005,58 +1005,7 @@ static int sec_ts_firmware_update(struct sec_ts_data *ts, const u8 *data,
#endif
/* check mis-cal */
- if (ts->plat_data->mis_cal_check) {
- u8 buff[2];
- u8 mis_cal_data;
-
- buff[0] = STATE_MANAGE_OFF;
- ret = ts->sec_ts_write(ts,
- SEC_TS_CMD_STATEMANAGE_ON, buff, 1);
- if (ret < 0)
- input_err(true, &ts->client->dev,
- "%s: mis_cal_check error[1] ret: %d\n",
- __func__, ret);
-
- buff[0] = TOUCH_SYSTEM_MODE_TOUCH;
- buff[1] = TOUCH_MODE_STATE_TOUCH;
- ret = ts->sec_ts_write(ts,
- SEC_TS_CMD_CHG_SYSMODE, buff, 2);
- if (ret < 0)
- input_err(true, &ts->client->dev,
- "%s: mis_cal_check error[2] ret: %d\n",
- __func__, ret);
-
- input_info(true, &ts->client->dev,
- "%s: mis_cal check\n", __func__);
- ret = ts->sec_ts_write(ts,
- SEC_TS_CMD_MIS_CAL_CHECK, NULL, 0);
- if (ret < 0)
- input_err(true, &ts->client->dev,
- "%s: mis_cal_check error[3] ret: %d\n",
- __func__, ret);
- sec_ts_delay(200);
-
- ret = ts->sec_ts_read(ts,
- SEC_TS_CMD_MIS_CAL_READ,
- &mis_cal_data, 1);
- if (ret < 0)
- input_err(true, &ts->client->dev,
- "%s: fail!, %d\n",
- __func__, ret);
- else
- input_info(true, &ts->client->dev,
- "%s: mis_cal data : %d\n",
- __func__, mis_cal_data);
-
- buff[0] = STATE_MANAGE_ON;
- ret = ts->sec_ts_write(ts,
- SEC_TS_CMD_STATEMANAGE_ON, buff, 1);
- if (ret < 0)
- input_err(true, &ts->client->dev,
- "%s: mis_cal_check error[4] ret: %d\n",
- __func__, ret);
- }
-
+ sec_ts_run_cal_check(ts);
/* Update calibration report */
sec_ts_read_calibration_report(ts);
} else