diff options
author | Wendly Li <wendlyli@google.com> | 2022-08-12 03:54:16 +0000 |
---|---|---|
committer | Wendly Li <wendlyli@google.com> | 2022-08-15 05:32:23 +0000 |
commit | 455bcd18a27f5abcf19be0061b601900946c9f61 (patch) | |
tree | 71e2f58456ab35dceddae3f7a9333e697f6fd6fc /goodix_brl_hw.c | |
parent | a0d41eae06d6e3593b713e855d36a86210e307ba (diff) | |
download | goodix_touch-455bcd18a27f5abcf19be0061b601900946c9f61.tar.gz |
touch/goodix: Support MS, SS and selftest for gti
Bug: 214118904
Test: Check dumpstate works properly
Change-Id: I8a94def8811b2ea34b80e47affac8b50b615eecc
Signed-off-by: Wendly Li <wendlyli@google.com>
Diffstat (limited to 'goodix_brl_hw.c')
-rw-r--r-- | goodix_brl_hw.c | 132 |
1 files changed, 132 insertions, 0 deletions
diff --git a/goodix_brl_hw.c b/goodix_brl_hw.c index 5367f5e..29fa48d 100644 --- a/goodix_brl_hw.c +++ b/goodix_brl_hw.c @@ -1651,6 +1651,136 @@ int brl_get_screen_protector_mode_enabled( return ret; } +int brl_get_mutual_data(struct goodix_ts_core *cd, enum frame_data_type type) +{ + int ret = 0; + u8 val; + int tx = cd->ic_info.parm.drv_num; + int rx = cd->ic_info.parm.sen_num; + u32 mutual_addr; + u32 flag_addr = cd->ic_info.misc.frame_data_addr; + int retry = 20; + struct goodix_ts_cmd cmd = { 0 }; + + mutual_addr = cd->ic_info.misc.frame_data_addr + + cd->ic_info.misc.frame_data_head_len + + cd->ic_info.misc.fw_attr_len + + cd->ic_info.misc.fw_log_len + 8; + + cmd.cmd = GOODIX_CMD_SET_FRAMEDATA_ENABLED; + cmd.len = 5; + cmd.data[0] = type; + ret = cd->hw_ops->send_cmd(cd, &cmd); + if (ret < 0) { + ts_err("report rawdata failed, exit!"); + goto exit; + } + + /* clean touch event flag */ + val = 0; + ret = cd->hw_ops->write(cd, flag_addr, &val, 1); + if (ret < 0) { + ts_err("clean touch event failed, exit!"); + goto exit; + } + + while (retry--) { + usleep_range(2000, 2100); + ret = cd->hw_ops->read(cd, flag_addr, &val, 1); + if (!ret && (val & 0x80)) + break; + } + if (retry < 0) { + ts_err("framedata is not ready val:0x%02x, exit!", val); + ret = -EINVAL; + goto exit; + } + + ret = cd->hw_ops->read(cd, mutual_addr, (u8*)cd->mutual_data, tx * rx * 2); + if (ret < 0) { + ts_err("read frame data failed"); + goto exit; + } + + goodix_rotate_abcd2cbad(tx, rx, (s16 *)cd->mutual_data, + (s16 *)cd->mutual_data_manual); + +exit: + cmd.cmd = GOODIX_CMD_SET_FRAMEDATA_ENABLED; + cmd.data[0] = 0; + cmd.len = 5; + if (ret == 0) { + ret = cd->hw_ops->send_cmd(cd, &cmd); + } else { + cd->hw_ops->send_cmd(cd, &cmd); + } + return ret; +} + +int brl_get_self_sensing_data(struct goodix_ts_core *cd, enum frame_data_type type) +{ + int ret = 0; + u8 val; + int tx = cd->ic_info.parm.drv_num; + int rx = cd->ic_info.parm.sen_num; + u32 self_addr; + u32 flag_addr = cd->ic_info.misc.frame_data_addr; + int retry = 20; + struct goodix_ts_cmd cmd = { 0 }; + + self_addr = cd->ic_info.misc.frame_data_addr + + cd->ic_info.misc.frame_data_head_len + + cd->ic_info.misc.fw_attr_len + cd->ic_info.misc.fw_log_len + + cd->ic_info.misc.mutual_struct_len + 10; + + cmd.cmd = GOODIX_CMD_SET_FRAMEDATA_ENABLED; + cmd.len = 5; + cmd.data[0] = type; + ret = cd->hw_ops->send_cmd(cd, &cmd); + if (ret < 0) { + ts_err("report rawdata failed, exit!"); + goto exit; + } + + /* clean touch event flag */ + val = 0; + ret = cd->hw_ops->write(cd, flag_addr, &val, 1); + if (ret < 0) { + ts_err("clean touch event failed, exit!"); + goto exit; + } + + while (retry--) { + usleep_range(2000, 2100); + ret = cd->hw_ops->read(cd, flag_addr, &val, 1); + if (!ret && (val & 0x80)) + break; + } + if (retry < 0) { + ts_err("framedata is not ready val:0x%02x, exit!", val); + ret = -EINVAL; + goto exit; + } + + ret = cd->hw_ops->read(cd, self_addr, (u8*)cd->self_sensing_data_manual, + (tx + rx) * 2); + if (ret < 0) { + ts_err("read frame data failed"); + goto exit; + } + +exit: + cmd.cmd = GOODIX_CMD_SET_FRAMEDATA_ENABLED; + cmd.data[0] = 0; + cmd.len = 5; + if (ret == 0) { + ret = cd->hw_ops->send_cmd(cd, &cmd); + } else { + cd->hw_ops->send_cmd(cd, &cmd); + } + return ret; +} + static struct goodix_ts_hw_ops brl_hw_ops = { .power_on = brl_power_on, .resume = brl_resume, @@ -1683,6 +1813,8 @@ static struct goodix_ts_hw_ops brl_hw_ops = { brl_set_screen_protector_mode_enabled, .get_screen_protector_mode_enabled = brl_get_screen_protector_mode_enabled, + .get_mutual_data = brl_get_mutual_data, + .get_self_sensing_data = brl_get_self_sensing_data, }; struct goodix_ts_hw_ops *goodix_get_hw_ops(void) |