diff options
author | Wendly Li <wendlyli@google.com> | 2022-03-25 11:21:45 +0000 |
---|---|---|
committer | Wendly Li <wendlyli@google.com> | 2022-05-06 05:23:32 +0000 |
commit | 50e3b783953806368fc40afd989f1b872733d89f (patch) | |
tree | 4a4fea0733b31c4a6220315f551427dfb8e5a31d /goodix_ts_proc.c | |
parent | e2758577ef0cf2c03f2db83d2adff4a0725dcaf9 (diff) | |
download | goodix_touch-50e3b783953806368fc40afd989f1b872733d89f.tar.gz |
goodix: Import v1.0.5 driver
Bug: 214118944
Test: Be able to wake up device by gestures.
Change-Id: Ie499faa169a9b395c89a7e3e6bd3238a133fd0e0
Signed-off-by: Wendly Li <wendlyli@google.com>
Diffstat (limited to 'goodix_ts_proc.c')
-rw-r--r-- | goodix_ts_proc.c | 684 |
1 files changed, 519 insertions, 165 deletions
diff --git a/goodix_ts_proc.c b/goodix_ts_proc.c index afc94ba..5e8f4ae 100644 --- a/goodix_ts_proc.c +++ b/goodix_ts_proc.c @@ -21,6 +21,7 @@ #define CMD_GET_SELF_BASEDATA "get_self_base" #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_CHARGE_MODE "set_charge_mode" #define CMD_SET_IRQ_ENABLE "set_irq_enable" #define CMD_SET_ESD_ENABLE "set_esd_enable" @@ -32,16 +33,25 @@ #define CMD_GET_TX_FREQ "get_tx_freq" #define CMD_RESET "reset" #define CMD_SET_SENSE_ENABLE "set_sense_enable" +#define CMD_GET_CONFIG "get_config" +#define CMD_GET_FW_STATUS "get_fw_status" +#define CMD_SET_HIGHSENSE_MODE "set_highsense_mode" +#define CMD_SET_GRIP_DATA "set_grip_data" +#define CMD_SET_PALM_MODE "set_palm_mode" +#define CMD_SET_NOISE_MODE "set_noise_mode" +#define CMD_SET_WATER_MODE "set_water_mode" char *cmd_list[] = { CMD_FW_UPDATE, CMD_AUTO_TEST, CMD_OPEN_TEST, CMD_SELF_OPEN_TEST, CMD_NOISE_TEST, CMD_AUTO_NOISE_TEST, CMD_SHORT_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_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_ENABLE, NULL }; + CMD_SET_LONG_PRESS, 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_ENABLE, 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, NULL }; /* test limits keyword */ #define CSV_TP_SPECIAL_RAW_MIN "special_raw_min" @@ -54,6 +64,10 @@ char *cmd_list[] = { CMD_FW_UPDATE, CMD_AUTO_TEST, CMD_OPEN_TEST, #define CSV_TP_SELFNOISE_LIMIT "noise_selfdata_limit" #define CSV_TP_TEST_CONFIG "test_config" +#define PALM_FUNC 0 +#define NOISE_FUNC 1 +#define WATER_FUNC 2 + #define SHORT_SIZE 100 #define LARGE_SIZE 4096 #define MAX_FRAME_CNT 50 @@ -991,140 +1005,140 @@ static void goodix_save_header(void) index += sprintf(&rbuf[index], "</ItemList>\n"); } -static void goodix_save_limits(void) -{ - int tx = cd->ic_info.parm.drv_num; - int rx = cd->ic_info.parm.sen_num; - int i; - int chn1; - int chn2; - int r; - - index += sprintf(&rbuf[index], "<TestItems>\n"); - - /* save short result */ - if (ts_test->item[GTP_SHORT_TEST]) { - index += sprintf(&rbuf[index], "<Item name=\"Short Test\">\n"); - index += sprintf(&rbuf[index], "<ShortNum>%d</ShortNum>\n", - ts_test->short_res.short_num); - for (i = 0; i < ts_test->short_res.short_num; i++) { - chn1 = ts_test->short_res.short_msg[4 * i]; - chn2 = ts_test->short_res.short_msg[4 * i + 1]; - r = (ts_test->short_res.short_msg[4 * i + 2] << 8) + - ts_test->short_res.short_msg[4 * i + 3]; - if (chn1 == CHN_VDD) - index += sprintf(&rbuf[index], - "<ShortMess Chn1=\"VDD\" "); - else if (chn1 == CHN_GND) - index += sprintf(&rbuf[index], - "<ShortMess Chn1=\"GND\" "); - else if (chn1 & DRV_CHANNEL_FLAG) - index += sprintf(&rbuf[index], - "<ShortMess Chn1=\"Tx%d\" ", - chn1 & 0x7f); - else - index += sprintf(&rbuf[index], - "<ShortMess Chn1=\"Rx%d\" ", - chn1 & 0x7f); - if (chn2 == CHN_VDD) - index += sprintf(&rbuf[index], - "Chn2=\"VDD\" ShortResistor= \"%dKom\"/>\n", - r); - else if (chn2 == CHN_GND) - index += sprintf(&rbuf[index], - "Chn2=\"GND\" ShortResistor= \"%dKom\"/>\n", - r); - else if (chn2 & DRV_CHANNEL_FLAG) - index += sprintf(&rbuf[index], - "Chn2=\"Tx%d\" ShortResistor= \"%dKom\"/>\n", - chn2 & 0x7f, r); - else - index += sprintf(&rbuf[index], - "Chn2=\"Rx%d\" ShortResistor= \"%dKom\"/>\n", - chn2 & 0x7f, r); - } - index += sprintf(&rbuf[index], "</Item>\n"); - } - - /* save open limits */ - if (ts_test->item[GTP_CAP_TEST]) { - index += sprintf( - &rbuf[index], "<Item name=\"Rawdata Test Sets\">\n"); - index += sprintf(&rbuf[index], - "<TotalFrameCnt>%d</TotalFrameCnt>\n", raw_data_cnt); - /* rawdata max limit */ - index += sprintf(&rbuf[index], "<MaxRawLimit>\n"); - for (i = 0; i < tx * rx; i++) { - index += sprintf( - &rbuf[index], "%d,", ts_test->max_limits[i]); - if ((i + 1) % tx == 0) - index += sprintf(&rbuf[index], "\n"); - } - index += sprintf(&rbuf[index], "</MaxRawLimit>\n"); - /* rawdata min limit */ - index += sprintf(&rbuf[index], "<MinRawLimit>\n"); - for (i = 0; i < tx * rx; i++) { - index += sprintf( - &rbuf[index], "%d,", ts_test->min_limits[i]); - if ((i + 1) % tx == 0) - index += sprintf(&rbuf[index], "\n"); - } - index += sprintf(&rbuf[index], "</MinRawLimit>\n"); - /* Max Accord limit */ - index += sprintf(&rbuf[index], "<MaxAccordLimit>\n"); - for (i = 0; i < tx * rx; i++) { - index += sprintf(&rbuf[index], "%d,", - ts_test->deviation_limits[i]); - if ((i + 1) % tx == 0) - index += sprintf(&rbuf[index], "\n"); - } - index += sprintf(&rbuf[index], "</MaxAccordLimit>\n"); - index += sprintf(&rbuf[index], "</Item>\n"); - } - - /* save noise limit */ - if (ts_test->item[GTP_NOISE_TEST]) { - index += sprintf( - &rbuf[index], "<Item name=\"Diffdata Test Sets\">\n"); - index += sprintf(&rbuf[index], - "<TotalFrameCnt>%d</TotalFrameCnt>\n", noise_data_cnt); - index += sprintf(&rbuf[index], - "<MaxJitterLimit>%d</MaxJitterLimit>\n", - ts_test->noise_threshold); - index += sprintf(&rbuf[index], "</Item>\n"); - } - - /* save self rawdata limit */ - if (ts_test->item[GTP_SELFCAP_TEST]) { - index += sprintf(&rbuf[index], - "<Item name=\"Self Rawdata Test Sets\">\n"); - index += sprintf( - &rbuf[index], "<TotalFrameCnt>1</TotalFrameCnt>\n"); - index += sprintf(&rbuf[index], "<MaxRawLimit>\n"); - for (i = 0; i < tx + rx; i++) { - index += sprintf(&rbuf[index], "%d,", - ts_test->self_max_limits[i]); - if ((i + 1) % tx == 0) - index += sprintf(&rbuf[index], "\n"); - } - if ((tx + rx) % tx != 0) - index += sprintf(&rbuf[index], "\n"); - index += sprintf(&rbuf[index], "</MaxRawLimit>\n"); - index += sprintf(&rbuf[index], "<MinRawLimit>\n"); - for (i = 0; i < tx + rx; i++) { - index += sprintf(&rbuf[index], "%d,", - ts_test->self_min_limits[i]); - if ((i + 1) % tx == 0) - index += sprintf(&rbuf[index], "\n"); - } - if ((tx + rx) % tx != 0) - index += sprintf(&rbuf[index], "\n"); - index += sprintf(&rbuf[index], "</MinRawLimit>\n"); - index += sprintf(&rbuf[index], "</Item>\n"); - } - - index += sprintf(&rbuf[index], "</TestItems>\n"); -} +//static void goodix_save_limits(void) +//{ +// int tx = cd->ic_info.parm.drv_num; +// int rx = cd->ic_info.parm.sen_num; +// int i; +// int chn1; +// int chn2; +// int r; +// +// index += sprintf(&rbuf[index], "<TestItems>\n"); +// +// /* save short result */ +// if (ts_test->item[GTP_SHORT_TEST]) { +// index += sprintf(&rbuf[index], "<Item name=\"Short Test\">\n"); +// index += sprintf(&rbuf[index], "<ShortNum>%d</ShortNum>\n", +// ts_test->short_res.short_num); +// for (i = 0; i < ts_test->short_res.short_num; i++) { +// chn1 = ts_test->short_res.short_msg[4 * i]; +// chn2 = ts_test->short_res.short_msg[4 * i + 1]; +// r = (ts_test->short_res.short_msg[4 * i + 2] << 8) + +// ts_test->short_res.short_msg[4 * i + 3]; +// if (chn1 == CHN_VDD) +// index += sprintf(&rbuf[index], +// "<ShortMess Chn1=\"VDD\" "); +// else if (chn1 == CHN_GND) +// index += sprintf(&rbuf[index], +// "<ShortMess Chn1=\"GND\" "); +// else if (chn1 & DRV_CHANNEL_FLAG) +// index += sprintf(&rbuf[index], +// "<ShortMess Chn1=\"Tx%d\" ", +// chn1 & 0x7f); +// else +// index += sprintf(&rbuf[index], +// "<ShortMess Chn1=\"Rx%d\" ", +// chn1 & 0x7f); +// if (chn2 == CHN_VDD) +// index += sprintf(&rbuf[index], +// "Chn2=\"VDD\" ShortResistor= \"%dKom\"/>\n", +// r); +// else if (chn2 == CHN_GND) +// index += sprintf(&rbuf[index], +// "Chn2=\"GND\" ShortResistor= \"%dKom\"/>\n", +// r); +// else if (chn2 & DRV_CHANNEL_FLAG) +// index += sprintf(&rbuf[index], +// "Chn2=\"Tx%d\" ShortResistor= \"%dKom\"/>\n", +// chn2 & 0x7f, r); +// else +// index += sprintf(&rbuf[index], +// "Chn2=\"Rx%d\" ShortResistor= \"%dKom\"/>\n", +// chn2 & 0x7f, r); +// } +// index += sprintf(&rbuf[index], "</Item>\n"); +// } +// +// /* save open limits */ +// if (ts_test->item[GTP_CAP_TEST]) { +// index += sprintf( +// &rbuf[index], "<Item name=\"Rawdata Test Sets\">\n"); +// index += sprintf(&rbuf[index], +// "<TotalFrameCnt>%d</TotalFrameCnt>\n", raw_data_cnt); +// /* rawdata max limit */ +// index += sprintf(&rbuf[index], "<MaxRawLimit>\n"); +// for (i = 0; i < tx * rx; i++) { +// index += sprintf( +// &rbuf[index], "%d,", ts_test->max_limits[i]); +// if ((i + 1) % tx == 0) +// index += sprintf(&rbuf[index], "\n"); +// } +// index += sprintf(&rbuf[index], "</MaxRawLimit>\n"); +// /* rawdata min limit */ +// index += sprintf(&rbuf[index], "<MinRawLimit>\n"); +// for (i = 0; i < tx * rx; i++) { +// index += sprintf( +// &rbuf[index], "%d,", ts_test->min_limits[i]); +// if ((i + 1) % tx == 0) +// index += sprintf(&rbuf[index], "\n"); +// } +// index += sprintf(&rbuf[index], "</MinRawLimit>\n"); +// /* Max Accord limit */ +// index += sprintf(&rbuf[index], "<MaxAccordLimit>\n"); +// for (i = 0; i < tx * rx; i++) { +// index += sprintf(&rbuf[index], "%d,", +// ts_test->deviation_limits[i]); +// if ((i + 1) % tx == 0) +// index += sprintf(&rbuf[index], "\n"); +// } +// index += sprintf(&rbuf[index], "</MaxAccordLimit>\n"); +// index += sprintf(&rbuf[index], "</Item>\n"); +// } +// +// /* save noise limit */ +// if (ts_test->item[GTP_NOISE_TEST]) { +// index += sprintf( +// &rbuf[index], "<Item name=\"Diffdata Test Sets\">\n"); +// index += sprintf(&rbuf[index], +// "<TotalFrameCnt>%d</TotalFrameCnt>\n", noise_data_cnt); +// index += sprintf(&rbuf[index], +// "<MaxJitterLimit>%d</MaxJitterLimit>\n", +// ts_test->noise_threshold); +// index += sprintf(&rbuf[index], "</Item>\n"); +// } +// +// /* save self rawdata limit */ +// if (ts_test->item[GTP_SELFCAP_TEST]) { +// index += sprintf(&rbuf[index], +// "<Item name=\"Self Rawdata Test Sets\">\n"); +// index += sprintf( +// &rbuf[index], "<TotalFrameCnt>1</TotalFrameCnt>\n"); +// index += sprintf(&rbuf[index], "<MaxRawLimit>\n"); +// for (i = 0; i < tx + rx; i++) { +// index += sprintf(&rbuf[index], "%d,", +// ts_test->self_max_limits[i]); +// if ((i + 1) % tx == 0) +// index += sprintf(&rbuf[index], "\n"); +// } +// if ((tx + rx) % tx != 0) +// index += sprintf(&rbuf[index], "\n"); +// index += sprintf(&rbuf[index], "</MaxRawLimit>\n"); +// index += sprintf(&rbuf[index], "<MinRawLimit>\n"); +// for (i = 0; i < tx + rx; i++) { +// index += sprintf(&rbuf[index], "%d,", +// ts_test->self_min_limits[i]); +// if ((i + 1) % tx == 0) +// index += sprintf(&rbuf[index], "\n"); +// } +// if ((tx + rx) % tx != 0) +// index += sprintf(&rbuf[index], "\n"); +// index += sprintf(&rbuf[index], "</MinRawLimit>\n"); +// index += sprintf(&rbuf[index], "</Item>\n"); +// } +// +// index += sprintf(&rbuf[index], "</TestItems>\n"); +//} static void goodix_data_cal(s16 *data, size_t data_size, s16 *stat_result) { @@ -1242,12 +1256,38 @@ static void goodix_save_tail(void) index += sprintf(&rbuf[index], "</TESTLOG>\n"); } -static void goodix_save_test_result(void) +static void goodix_save_test_result(bool is_brief) { - goodix_save_header(); - goodix_save_limits(); - goodix_save_data(); - goodix_save_tail(); + if (is_brief) { + if (ts_test->item[GTP_CAP_TEST]) { + index += sprintf(&rbuf[index], "Open test:\n"); + index += sprintf(&rbuf[index], "%s\n", + ts_test->result[GTP_CAP_TEST] ? "PASS" + : "FAIL"); + } + if (ts_test->item[GTP_SHORT_TEST]) { + index += sprintf(&rbuf[index], "Short test:\n"); + index += sprintf(&rbuf[index], "%s\n", + ts_test->result[GTP_SHORT_TEST] ? "PASS" + : "FAIL"); + } + if (ts_test->item[GTP_NOISE_TEST]) { + index += sprintf(&rbuf[index], "Noise test:\n"); + index += sprintf(&rbuf[index], "%s\n", + ts_test->result[GTP_NOISE_TEST] ? "PASS" + : "FAIL"); + } + if (ts_test->item[GTP_SELFCAP_TEST]) { + index += sprintf(&rbuf[index], "Self test:\n"); + index += sprintf(&rbuf[index], "%s\n", + ts_test->result[GTP_SELFCAP_TEST] ? "PASS" + : "FAIL"); + } + } else { + goodix_save_header(); + goodix_save_data(); + goodix_save_tail(); + } } static void goto_next_line(char **ptr) @@ -1793,7 +1833,7 @@ exit: return ret; } -static int goodix_auto_test(void) +static int goodix_auto_test(bool is_brief) { struct goodix_ts_cmd temp_cmd; int ret; @@ -1839,7 +1879,7 @@ static int goodix_auto_test(void) cd->hw_ops->irq_enable(cd, true); goodix_ts_blocking_notify(NOTIFY_ESD_ON, NULL); - goodix_save_test_result(); + goodix_save_test_result(is_brief); return 0; } @@ -1854,6 +1894,7 @@ static void goodix_auto_noise_test(u16 cnt, int threshold) int tmp_val; u8 status; int retry = 10; + int err_cnt = 0; int i; raw_addr = cd->ic_info.misc.frame_data_addr + @@ -1885,15 +1926,46 @@ static void goodix_auto_noise_test(u16 cnt, int threshold) } cd->hw_ops->read(cd, raw_addr, (u8 *)tmp_buf, tx * rx * 2); + goodix_rotate_abcd2cbad(tx, rx, tmp_buf); + index += sprintf(&rbuf[index], "max:\n"); for (i = 0; i < tx * rx; i++) { tmp_val = tmp_buf[i]; - tmp_val = ABS(tmp_val); - if (tmp_val > threshold) { - index = sprintf(rbuf, "FAIL\n"); - goto exit; - } + index += sprintf(&rbuf[index], "%3d,", tmp_val); + if ((i + 1) % tx == 0) + index += sprintf(&rbuf[index], "\n"); + if (ABS(tmp_val) > threshold) + err_cnt++; } - index = sprintf(rbuf, "PASS\n"); + + status = 0; + cd->hw_ops->write(cd, sync_addr, &status, 1); + retry = 10; + while (retry--) { + cd->hw_ops->read(cd, sync_addr, &status, 1); + if (status == 0x80) + break; + usleep_range(5000, 5100); + } + if (retry < 0) { + ts_err("noise data not ready, status[%x]", status); + goto exit; + } + cd->hw_ops->read(cd, raw_addr, (u8 *)tmp_buf, tx * rx * 2); + goodix_rotate_abcd2cbad(tx, rx, tmp_buf); + index += sprintf(&rbuf[index], "min:\n"); + for (i = 0; i < tx * rx; i++) { + tmp_val = tmp_buf[i]; + index += sprintf(&rbuf[index], "%3d,", tmp_val); + if ((i + 1) % tx == 0) + index += sprintf(&rbuf[index], "\n"); + if (ABS(tmp_val) > threshold) + err_cnt++; + } + + if (err_cnt > 0) + index += sprintf(&rbuf[index], "Result: FAIL\n"); + else + index += sprintf(&rbuf[index], "Result: PASS\n"); exit: cd->hw_ops->reset(cd, 100); @@ -2053,19 +2125,31 @@ static void goodix_set_scan_mode(u8 val) struct goodix_ts_cmd temp_cmd; if (val == 0) { + 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; 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; ts_info("set scan mode to active"); index = sprintf(rbuf, "set scan mode to active\n"); } - temp_cmd.len = 5; - temp_cmd.cmd = 0x9F; - temp_cmd.data[0] = val; cd->hw_ops->send_cmd(cd, &temp_cmd); } @@ -2119,11 +2203,151 @@ static void goodix_set_continue_mode(u8 val) } temp_cmd.len = 5; - temp_cmd.cmd = 0xC3; + temp_cmd.cmd = 0xC6; temp_cmd.data[0] = val; cd->hw_ops->send_cmd(cd, &temp_cmd); } +static void goodix_read_config(void) +{ + int ret; + int i; + u8 cfg_buf[2500]; + + ret = cd->hw_ops->read_config(cd, cfg_buf, sizeof(cfg_buf)); + if (ret < 0) { + ts_err("read config failed"); + return; + } + + for (i = 0; i < 200; i++) { // only print 200 bytes + index += sprintf(&rbuf[index], "%02x,", cfg_buf[i]); + if ((i + 1) % 20 == 0) + index += sprintf(&rbuf[index], "\n"); + } +} + +static void goodix_get_fw_status(void) +{ + u32 status_addr; + u32 noise_lv_addr; + u32 offset; + u8 val; + + offset = cd->ic_info.misc.frame_data_addr + + cd->ic_info.misc.frame_data_head_len + + cd->ic_info.misc.fw_attr_len; + status_addr = offset + 38; + noise_lv_addr = offset + 65; + + cd->hw_ops->read(cd, status_addr, &val, 1); + ts_info("addr:0x%04x fw_status:0x%02X", status_addr, val); + index += sprintf( + &rbuf[index], "touch[%d] ", (val & (0x01 << 0)) ? 1 : 0); + index += + sprintf(&rbuf[index], "game[%d] ", (val & (0x01 << 1)) ? 1 : 0); + index += + sprintf(&rbuf[index], "palm[%d] ", (val & (0x01 << 2)) ? 1 : 0); + index += sprintf( + &rbuf[index], "water[%d] ", (val & (0x01 << 3)) ? 1 : 0); + index += sprintf( + &rbuf[index], "charge[%d] ", (val & (0x01 << 4)) ? 1 : 0); + index += sprintf( + &rbuf[index], "lowtemp[%d] ", (val & (0x01 << 5)) ? 1 : 0); + + cd->hw_ops->read(cd, noise_lv_addr, &val, 1); + ts_info("noise level addr: 0x%04x", noise_lv_addr); + index += sprintf(&rbuf[index], "noise-lv[%d]\n", val); +} + +static void goodix_set_highsense_mode(u8 val) +{ + struct goodix_ts_cmd temp_cmd; + static bool flag = false; + + if (val == 0 && flag) { + flag = false; + ts_info("exit highsense mode"); + index = sprintf(rbuf, "exit highsense mode\n"); + } else if (val == 1 && !flag) { + flag = true; + ts_info("enter highsense mode"); + index = sprintf(rbuf, "enter highsense mode\n"); + } else { + ts_info("have already %s", val ? "ON" : "OFF"); + return; + } + + temp_cmd.len = 5; + temp_cmd.cmd = 0x72; + temp_cmd.data[0] = val; + cd->hw_ops->send_cmd(cd, &temp_cmd); +} + +static void goodix_set_grip_data(u8 val) +{ + struct goodix_ts_cmd temp_cmd; + + if (val == 0) { + ts_info("portrait mode"); + index = sprintf(rbuf, "portrait mode\n"); + temp_cmd.len = 4; + temp_cmd.cmd = 0x18; + } else if (val == 1) { + ts_info("landscape left"); + index = sprintf(rbuf, "landscape left\n"); + temp_cmd.len = 5; + temp_cmd.cmd = 0x17; + temp_cmd.data[0] = 0; + } else if (val == 2) { + ts_info("landscape right"); + index = sprintf(rbuf, "landscape right\n"); + temp_cmd.len = 5; + temp_cmd.cmd = 0x17; + temp_cmd.data[0] = 1; + } else { + ts_err("invalid grip data, %d", val); + return; + } + + cd->hw_ops->send_cmd(cd, &temp_cmd); +} + +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; + } else { + ts_err("invalid val, %d", val); + return; + } + + cd->hw_ops->send_cmd(cd, &temp_cmd); +} + static ssize_t driver_test_write( struct file *file, const char __user *buf, size_t count, loff_t *pos) { @@ -2155,9 +2379,9 @@ static ssize_t driver_test_write( if (!strncmp(p, CMD_FW_UPDATE, strlen(CMD_FW_UPDATE))) { rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL); - ret = goodix_do_fw_update( - NULL, UPDATE_MODE_BLOCK | UPDATE_MODE_FORCE | - UPDATE_MODE_SRC_REQUEST); + ret = goodix_do_fw_update(cd->ic_configs[CONFIG_TYPE_NORMAL], + UPDATE_MODE_BLOCK | UPDATE_MODE_FORCE | + UPDATE_MODE_SRC_REQUEST); if (ret < 0) { index = sprintf(rbuf, "%s: NG\n", CMD_FW_UPDATE); } else { @@ -2287,6 +2511,33 @@ static ssize_t driver_test_write( goto exit; } + if (!strncmp(p, CMD_SET_LONG_PRESS, strlen(CMD_SET_LONG_PRESS))) { + rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL); + token = strsep(&p, ","); + if (!token || !p) { + index = sprintf(rbuf, "%s: invalid cmd param\n", + CMD_SET_LONG_PRESS); + goto exit; + } + if (kstrtos32(p, 10, &cmd_val)) { + index = sprintf(rbuf, "%s: invalid cmd param\n", + CMD_SET_LONG_PRESS); + goto exit; + } + if (cmd_val == 0) { + cd->gesture_type &= ~GESTURE_FOD_PRESS; + index = sprintf( + rbuf, "%s: disable OK\n", CMD_SET_LONG_PRESS); + ts_info("disable single tap"); + } else { + cd->gesture_type |= GESTURE_FOD_PRESS; + index = sprintf( + rbuf, "%s: enable OK\n", CMD_SET_LONG_PRESS); + ts_info("enable single tap"); + } + goto exit; + } + if (!strncmp(p, CMD_SET_IRQ_ENABLE, strlen(CMD_SET_IRQ_ENABLE))) { rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL); token = strsep(&p, ","); @@ -2365,7 +2616,7 @@ static ssize_t driver_test_write( if (!strncmp(p, CMD_AUTO_TEST, strlen(CMD_AUTO_TEST))) { raw_data_cnt = 16; noise_data_cnt = 1; - rbuf = kzalloc(HUGE_SIZE, GFP_KERNEL); + rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL); ret = malloc_test_resource(); if (ret < 0) { ts_err("malloc test resource failed"); @@ -2375,7 +2626,7 @@ static ssize_t driver_test_write( ts_test->item[GTP_NOISE_TEST] = true; ts_test->item[GTP_SELFCAP_TEST] = true; ts_test->item[GTP_SHORT_TEST] = true; - goodix_auto_test(); + goodix_auto_test(true); goto exit; } @@ -2448,7 +2699,7 @@ static ssize_t driver_test_write( goto exit; } ts_test->item[GTP_NOISE_TEST] = true; - goodix_auto_test(); + goodix_auto_test(false); goto exit; } @@ -2471,7 +2722,7 @@ static ssize_t driver_test_write( ts_err("%s: invalid cmd param", CMD_AUTO_NOISE_TEST); goto exit; } - rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL); + rbuf = kzalloc(HUGE_SIZE, GFP_KERNEL); goodix_auto_noise_test(cmd_val, cmd_val2); goto exit; } @@ -2570,7 +2821,7 @@ static ssize_t driver_test_write( } ts_test->item[GTP_CAP_TEST] = true; ts_test->freq = cmd_val2; - goodix_auto_test(); + goodix_auto_test(false); goto exit; } @@ -2582,7 +2833,7 @@ static ssize_t driver_test_write( goto exit; } ts_test->item[GTP_SELFCAP_TEST] = true; - goodix_auto_test(); + goodix_auto_test(false); goto exit; } @@ -2594,7 +2845,110 @@ static ssize_t driver_test_write( goto exit; } ts_test->item[GTP_SHORT_TEST] = true; - goodix_auto_test(); + goodix_auto_test(false); + goto exit; + } + + if (!strncmp(p, CMD_GET_CONFIG, strlen(CMD_GET_CONFIG))) { + rbuf = kzalloc(LARGE_SIZE, GFP_KERNEL); + goodix_read_config(); + goto exit; + } + + if (!strncmp(p, CMD_GET_FW_STATUS, strlen(CMD_GET_FW_STATUS))) { + rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL); + goodix_get_fw_status(); + goto exit; + } + + if (!strncmp(p, CMD_SET_HIGHSENSE_MODE, + strlen(CMD_SET_HIGHSENSE_MODE))) { + rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL); + token = strsep(&p, ","); + if (!token || !p) { + index = sprintf(rbuf, "%s: invalid cmd param\n", + CMD_SET_HIGHSENSE_MODE); + goto exit; + } + if (kstrtos32(p, 10, &cmd_val)) { + index = sprintf(rbuf, "%s: invalid cmd param\n", + CMD_SET_HIGHSENSE_MODE); + goto exit; + } + if (cmd_val > 1 || cmd_val < 0) { + index = sprintf(rbuf, "%s: invalid cmd param\n", + CMD_SET_HIGHSENSE_MODE); + goto exit; + } + goodix_set_highsense_mode(cmd_val); + goto exit; + } + + if (!strncmp(p, CMD_SET_GRIP_DATA, strlen(CMD_SET_GRIP_DATA))) { + rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL); + token = strsep(&p, ","); + if (!token || !p) { + index = sprintf(rbuf, "%s: invalid cmd param\n", + CMD_SET_GRIP_DATA); + goto exit; + } + if (kstrtos32(p, 10, &cmd_val)) { + index = sprintf(rbuf, "%s: invalid cmd param\n", + CMD_SET_GRIP_DATA); + goto exit; + } + goodix_set_grip_data(cmd_val); + goto exit; + } + + if (!strncmp(p, CMD_SET_PALM_MODE, strlen(CMD_SET_PALM_MODE))) { + rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL); + token = strsep(&p, ","); + if (!token || !p) { + index = sprintf(rbuf, "%s: invalid cmd param\n", + CMD_SET_PALM_MODE); + goto exit; + } + if (kstrtos32(p, 10, &cmd_val)) { + index = sprintf(rbuf, "%s: invalid cmd param\n", + CMD_SET_PALM_MODE); + goto exit; + } + goodix_set_custom_mode(PALM_FUNC, cmd_val); + goto exit; + } + + if (!strncmp(p, CMD_SET_NOISE_MODE, strlen(CMD_SET_NOISE_MODE))) { + rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL); + token = strsep(&p, ","); + if (!token || !p) { + index = sprintf(rbuf, "%s: invalid cmd param\n", + CMD_SET_NOISE_MODE); + goto exit; + } + if (kstrtos32(p, 10, &cmd_val)) { + index = sprintf(rbuf, "%s: invalid cmd param\n", + CMD_SET_NOISE_MODE); + goto exit; + } + goodix_set_custom_mode(NOISE_FUNC, cmd_val); + goto exit; + } + + if (!strncmp(p, CMD_SET_WATER_MODE, strlen(CMD_SET_WATER_MODE))) { + rbuf = kzalloc(SHORT_SIZE, GFP_KERNEL); + token = strsep(&p, ","); + if (!token || !p) { + index = sprintf(rbuf, "%s: invalid cmd param\n", + CMD_SET_WATER_MODE); + goto exit; + } + if (kstrtos32(p, 10, &cmd_val)) { + index = sprintf(rbuf, "%s: invalid cmd param\n", + CMD_SET_WATER_MODE); + goto exit; + } + goodix_set_custom_mode(WATER_FUNC, cmd_val); goto exit; } |