summaryrefslogtreecommitdiff
path: root/goodix_brl_hw.c
diff options
context:
space:
mode:
authorWendly Li <wendlyli@google.com>2022-08-12 03:54:16 +0000
committerWendly Li <wendlyli@google.com>2022-08-15 05:32:23 +0000
commit455bcd18a27f5abcf19be0061b601900946c9f61 (patch)
tree71e2f58456ab35dceddae3f7a9333e697f6fd6fc /goodix_brl_hw.c
parenta0d41eae06d6e3593b713e855d36a86210e307ba (diff)
downloadgoodix_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.c132
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)