diff options
author | Super Liu <supercjliu@google.com> | 2020-07-20 14:37:20 +0800 |
---|---|---|
committer | Super Liu <supercjliu@google.com> | 2020-07-30 08:05:13 +0800 |
commit | e09e00a8f03392752ce2d81e95670ad8aa44a3f4 (patch) | |
tree | 3241b4952e2983237c0b58084ee2fb4376d93365 | |
parent | fcb5c0228bd97322a9b6c2f806aabef2302dd55c (diff) | |
download | sec_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.h | 1 | ||||
-rw-r--r-- | sec_ts_fn.c | 155 | ||||
-rw-r--r-- | sec_ts_fw.c | 53 |
3 files changed, 92 insertions, 117 deletions
@@ -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 |