summaryrefslogtreecommitdiff
path: root/goodix_brl_hw.c
diff options
context:
space:
mode:
authorWendly Li <wendlyli@google.com>2022-04-20 03:26:42 +0000
committerWendly Li <wendlyli@google.com>2022-05-11 06:01:08 +0000
commitf5dc04e05ad88202465c7bfdfa5785975d3e0951 (patch)
tree5b4bcf39c31a0b86575ddd3675c6527cf65751b7 /goodix_brl_hw.c
parent50e3b783953806368fc40afd989f1b872733d89f (diff)
downloadgoodix_touch-f5dc04e05ad88202465c7bfdfa5785975d3e0951.tar.gz
goodix: Import v1.0.6 driver
Bug: 214118837 Test: Check gesture and heatamp work well Change-Id: I3eb304c2802bb2122871497dfaf38093cb71e242 Signed-off-by: Wendly Li <wendlyli@google.com>
Diffstat (limited to 'goodix_brl_hw.c')
-rw-r--r--goodix_brl_hw.c56
1 files changed, 46 insertions, 10 deletions
diff --git a/goodix_brl_hw.c b/goodix_brl_hw.c
index 34675bf..e22ce0d 100644
--- a/goodix_brl_hw.c
+++ b/goodix_brl_hw.c
@@ -265,9 +265,26 @@ int brl_resume(struct goodix_ts_core *cd)
{
u32 cmd_reg = cd->ic_info.misc.cmd_addr;
u8 cmd_buf[] = { 0x00, 0x00, 0x05, 0xC4, 0x00, 0xC9, 0x00 };
+ int retry = 20;
+ u8 rcv_buf[2];
+
+ cd->hw_ops->write(cd, cmd_reg, cmd_buf, sizeof(cmd_buf));
+
+ while (retry--) {
+ usleep_range(5000, 5100);
+ cd->hw_ops->read(cd, cmd_reg, rcv_buf, sizeof(rcv_buf));
+ if (rcv_buf[0] == 0x80 && rcv_buf[1] == 0x80)
+ break;
+ }
+ if (retry < 0) {
+ ts_err("failed to exit sleep mode, status[%X] ack[%X]",
+ rcv_buf[0], rcv_buf[1]);
+ return -EINVAL;
+ } else {
+ ts_info("Secceed to exit sleep mode with retry: %d", 19 - retry);
+ }
- return cd->hw_ops->write(cd, cmd_reg, cmd_buf, sizeof(cmd_buf));
- // return cd->hw_ops->reset(cd, GOODIX_NORMAL_RESET_DELAY_MS);
+ return 0;
}
#define GOODIX_GESTURE_CMD_BA 0x12
@@ -275,12 +292,18 @@ int brl_resume(struct goodix_ts_core *cd)
int brl_gesture(struct goodix_ts_core *cd, int gesture_type)
{
struct goodix_ts_cmd cmd;
- u8 val = 0xff;
+ u8 val;
- if (cd->gesture_type & GESTURE_SINGLE_TAP)
- val &= ~(0x01 << 0);
- if (cd->gesture_type & GESTURE_FOD_PRESS)
- val &= ~(0x01 << 1);
+ if ((cd->gesture_type & GESTURE_SINGLE_TAP) &&
+ (cd->gesture_type & GESTURE_FOD_PRESS)) {
+ val = 0x0F;
+ } else if (cd->gesture_type & GESTURE_SINGLE_TAP) {
+ val = 0x2F;
+ } else if (cd->gesture_type & GESTURE_FOD_PRESS) {
+ val = 0x1F;
+ } else {
+ val = 0xFF;
+ }
if (cd->bus->ic_type == IC_TYPE_BERLIN_A)
cmd.cmd = GOODIX_GESTURE_CMD_BA;
@@ -323,7 +346,7 @@ static int brl_irq_enable(struct goodix_ts_core *cd, bool enable)
ts_debug("Irq disabled");
return 0;
}
- ts_info("warnning: irq deepth inbalance!");
+ // ts_info("warnning: irq deepth inbalance!");
return 0;
}
@@ -382,8 +405,6 @@ static int brl_send_cmd(struct goodix_ts_core *cd, struct goodix_ts_cmd *cmd)
ts_debug("cmd ack data %*ph", (int)sizeof(cmd_ack),
cmd_ack.buf);
if (cmd_ack.ack == CMD_ACK_OK) {
- // msleep(40); // wait for cmd response
- usleep_range(6000, 6100);
return 0;
}
if (cmd_ack.ack == CMD_ACK_BUSY ||
@@ -1155,10 +1176,23 @@ static int brl_event_handler(
struct goodix_ts_hw_ops *hw_ops = cd->hw_ops;
struct goodix_ic_info_misc *misc = &cd->ic_info.misc;
int pre_read_len;
+ int tx = cd->ic_info.parm.drv_num;
+ int rx = cd->ic_info.parm.sen_num;
u8 pre_buf[38];
u8 event_status;
+ u32 mutual_addr;
int ret;
+ if (cd->heatmap_buffer) {
+ 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;
+ brl_read(
+ cd, mutual_addr, (u8 *)cd->heatmap_buffer, tx * rx * 2);
+ goodix_rotate_abcd2cbad(tx, rx, cd->heatmap_buffer);
+ }
+
pre_read_len = IRQ_EVENT_HEAD_LEN + BYTES_PER_POINT * 2 +
COOR_DATA_CHECKSUM_SIZE + 4;
ret = hw_ops->read(cd, misc->touch_data_addr, pre_buf, pre_read_len);
@@ -1178,6 +1212,8 @@ static int brl_event_handler(
return -EINVAL;
}
+ ts_event->event_type = EVENT_INVALID;
+
event_status = pre_buf[0];
if (event_status & GOODIX_TOUCH_EVENT)
return goodix_touch_handler(