diff options
author | PixelBot AutoMerger <android-nexus-securitybot@system.gserviceaccount.com> | 2022-06-19 18:41:00 -0700 |
---|---|---|
committer | Robin Peng <robinpeng@google.com> | 2022-06-21 08:56:30 +0000 |
commit | f03f25010d4e4d393561d74a4df1fb1b40c40261 (patch) | |
tree | ddd1a490026fb42ee5b4b4e9d9e926646f0c8a57 | |
parent | 55da83fbe74c744b1179f01b2318d19858f5bbc9 (diff) | |
parent | 340be58866809463c7ea9a11a5ae9e9a9756e1c3 (diff) | |
download | focaltech_touch-f03f25010d4e4d393561d74a4df1fb1b40c40261.tar.gz |
Merge android13-gs-pixel-5.10-tm-d1 into android13-gs-pixel-5.10-tm-qpr1
Bug: 233569354
SBMerger: 442815275
Change-Id: If9ddc4ad828da7045d9cde49dc35e506c1f28eec
Signed-off-by: SecurityBot <android-nexus-securitybot@system.gserviceaccount.com>
-rw-r--r-- | ft3658/focaltech_common.h | 2 | ||||
-rw-r--r-- | ft3658/focaltech_core.c | 80 | ||||
-rw-r--r-- | ft3658/focaltech_core.h | 2 | ||||
-rw-r--r-- | ft3658/focaltech_test/focaltech_test.c | 13 | ||||
-rw-r--r-- | ft3658/focaltech_test/supported_ic/focaltech_test_ft3658u.c | 20 |
5 files changed, 69 insertions, 48 deletions
diff --git a/ft3658/focaltech_common.h b/ft3658/focaltech_common.h index 34c3d42..4688d96 100644 --- a/ft3658/focaltech_common.h +++ b/ft3658/focaltech_common.h @@ -146,6 +146,8 @@ // bit 7 : LPWG #define FTS_CAP_DATA_LEN 91 #define FTS_SELF_DATA_LEN 68 +#define FTS_FULL_HEATMAP_RAW_SIZE(tx_num, rx_num) \ + (FTS_CAP_DATA_LEN + ((tx_num) * (rx_num) + FTS_SELF_DATA_LEN * 2) * sizeof(u16)) #define FTS_PRESSURE_SCALE 85 // 255 / 3 #define FTS_CUSTOMER_STATUS_LEN 4 #define FTS_CUSTOMER_STATUS1_MASK 0x0F diff --git a/ft3658/focaltech_core.c b/ft3658/focaltech_core.c index 2e57c56..f982bd7 100644 --- a/ft3658/focaltech_core.c +++ b/ft3658/focaltech_core.c @@ -821,7 +821,7 @@ static int fts_read_touchdata(struct fts_ts_data *data) ret = fts_get_heatmap(data); if (ret < 0) return ret; - memcpy(buf + 1,data->heatmap_raw, data->pnt_buf_size - 1); + memcpy(buf + 1, data->heatmap_raw, data->pnt_buf_size - 1); #else ret = fts_read(cmd, 1, buf + 1, data->pnt_buf_size - 1); if (ret < 0) { @@ -1488,12 +1488,20 @@ static int fts_get_heatmap(struct fts_ts_data *ts_data) { /* Total touch data: (cap header(91) + heatmap(N-MS + W-SS + N-SS)). */ total_data_size = FTS_CAP_DATA_LEN + self_data_size * 2 + mutual_data_size; + + if (total_data_size > ts_data->heatmap_raw_size) { + FTS_DEBUG("Warning : The total touch data size is %d!!", + total_data_size); + total_data_size = ts_data->heatmap_raw_size; + } + ret = fts_read(cmd, 1, ts_data->heatmap_raw, total_data_size); if (ret < 0) { FTS_ERROR("Failed to get heatmap raw data, ret=%d.", ret); ret = -EIO; goto exit; } + /* Get the self-sensing type. */ ts_data->self_sensing_type = ts_data->heatmap_raw[FTS_CAP_DATA_LEN - 1] & 0x80; @@ -1511,40 +1519,52 @@ static int fts_get_heatmap(struct fts_ts_data *ts_data) { * |- 91 -|- 68*2 -|- 68*2 -|- (B2[1]<<8+B2[2])*2 -| */ + if (ts_data->compress_heatmap_wlen < 0 || + (ts_data->compress_heatmap_wlen * sizeof(u16)) > mutual_data_size) { + FTS_DEBUG("Warning : The compressed heatmap size is %d!!", + ts_data->compress_heatmap_wlen); + ts_data->compress_heatmap_wlen = 0; + memset(ts_data->trans_raw, 0, ts_data->trans_raw_size); + } + /* Total touch data:(cap header + W-SS + N-SS + compressed heatmap(N-MS) */ total_data_size = FTS_CAP_DATA_LEN + self_data_size * 2 + ts_data->compress_heatmap_wlen * sizeof(u16); + if (total_data_size > ts_data->heatmap_raw_size) { + FTS_DEBUG("Warning : The total touch data size is %d!!", + total_data_size); + total_data_size = ts_data->heatmap_raw_size; + } + ret = fts_read(cmd, 1, ts_data->heatmap_raw, total_data_size); if (ret < 0) { FTS_ERROR("Failed to get compressed heatmap raw data,ret=%d.", ret); ret = -EIO; goto exit; } - if (ts_data->compress_heatmap_wlen == 0) { - FTS_DEBUG("Warning : The compressed heatmap length is 0!!"); - goto exit; - } /* Get the self-sensing type. */ ts_data->self_sensing_type = ts_data->heatmap_raw[FTS_CAP_DATA_LEN - 1] & 0x80; - /* decode the compressed data from heatmap_raw to heatmap_buff. */ - fts_ptflib_decoder(ts_data, - (u16*)(&ts_data->heatmap_raw[idx_ms_raw]), - ts_data->compress_heatmap_wlen, - ts_data->heatmap_buff, - mutual_data_size / sizeof(u16)); - - /* MS: Transform the order from RX->TX. */ - /* After decoding, the data become to little-endian, but the output of - * transpose_raw is big-endian. - */ - transpose_raw(&((u8*)ts_data->heatmap_buff)[0], ts_data->trans_raw, - tx, rx, false); + if (ts_data->compress_heatmap_wlen > 0) { + /* decode the compressed data from heatmap_raw to heatmap_buff. */ + fts_ptflib_decoder(ts_data, + (u16*)(&ts_data->heatmap_raw[idx_ms_raw]), + ts_data->compress_heatmap_wlen, + ts_data->heatmap_buff, + mutual_data_size / sizeof(u16)); + + /* MS: Transform the order from RX->TX. */ + /* After decoding, the data become to little-endian, but the output of + * transpose_raw is big-endian. + */ + transpose_raw(&((u8*)ts_data->heatmap_buff)[0], ts_data->trans_raw, + tx, rx, false); + } } #if IS_ENABLED(GOOGLE_HEATMAP_DEBUG) FTS_DEBUG("Copy matual data,idx_buff=%d,idx_ms_raw=%d.", @@ -2801,6 +2821,8 @@ static int fts_ts_probe_entry(struct fts_ts_data *ts_data) spin_lock_init(&ts_data->irq_lock); mutex_init(&ts_data->report_mutex); mutex_init(&ts_data->bus_lock); + mutex_init(&ts_data->reg_lock); + ts_data->is_deepsleep = false; #if IS_ENABLED(CONFIG_TOUCHSCREEN_PANEL_BRIDGE) ts_data->power_status = FTS_TS_STATE_POWER_ON; @@ -3430,14 +3452,18 @@ int fts_set_continuous_mode(struct fts_ts_data *ts_data, bool en) u8 value = en ? ENABLE : DISABLE; u8 reg = FTS_REG_CONTINUOUS_EN; - ret = fts_write_reg_safe(reg, value); - if (ret == 0) { - ts_data->set_continuously_report = value; - fts_update_host_feature_setting(ts_data, en, FW_CONTINUOUS); - } + mutex_lock(&ts_data->reg_lock); + if (!ts_data->is_deepsleep) { + ret = fts_write_reg_safe(reg, value); + if (ret == 0) { + ts_data->set_continuously_report = value; + fts_update_host_feature_setting(ts_data, en, FW_CONTINUOUS); + } - PR_LOGD("%s fw_continuous %s.\n", en ? "Enable" : "Disable", - (ret == 0) ? "successfully" : "unsuccessfully"); + PR_LOGD("%s fw_continuous %s.\n", en ? "Enable" : "Disable", + (ret == 0) ? "successfully" : "unsuccessfully"); + } + mutex_unlock(&ts_data->reg_lock); return ret; } @@ -3526,7 +3552,10 @@ static int fts_ts_suspend(struct device *dev) fts_set_heatmap_mode(ts_data, FW_HEATMAP_MODE_DISABLE); #endif FTS_DEBUG("make TP enter into sleep mode"); + mutex_lock(&ts_data->reg_lock); ret = fts_write_reg(FTS_REG_POWER_MODE, FTS_REG_POWER_MODE_SLEEP); + ts_data->is_deepsleep = true; + mutex_unlock(&ts_data->reg_lock); if (ret < 0) FTS_ERROR("set TP to sleep mode fail, ret=%d", ret); @@ -3575,6 +3604,7 @@ static int fts_ts_resume(struct device *dev) return ret; } + ts_data->is_deepsleep = false; fts_ex_mode_recovery(ts_data); #if FTS_ESDCHECK_EN diff --git a/ft3658/focaltech_core.h b/ft3658/focaltech_core.h index 8c7c0e2..d63d493 100644 --- a/ft3658/focaltech_core.h +++ b/ft3658/focaltech_core.h @@ -223,6 +223,7 @@ struct fts_ts_data { spinlock_t irq_lock; struct mutex report_mutex; struct mutex bus_lock; + struct mutex reg_lock; struct mutex device_mutex; struct completion bus_resumed; unsigned long intr_jiffies; @@ -289,6 +290,7 @@ struct fts_ts_data { * touch IC, acquired during hard interrupt, in * CLOCK_MONOTONIC */ ktime_t coords_timestamp; + bool is_deepsleep; #if IS_ENABLED(CONFIG_TOUCHSCREEN_OFFLOAD) || \ IS_ENABLED(CONFIG_TOUCHSCREEN_HEATMAP) u8 *heatmap_raw; diff --git a/ft3658/focaltech_test/focaltech_test.c b/ft3658/focaltech_test/focaltech_test.c index 9fc6d79..c2f3c15 100644 --- a/ft3658/focaltech_test/focaltech_test.c +++ b/ft3658/focaltech_test/focaltech_test.c @@ -2618,7 +2618,7 @@ static const struct file_operations proc_test_int_fops = { extern int fts_test_get_raw(int *raw, u8 tx, u8 rx); extern int fts_test_get_baseline(int *raw,int *base_raw, u8 tx, u8 rx); -extern int fts_test_get_strength(u8 *base_raw, u8 tx, u8 rx); +extern int fts_test_get_strength(u8 *base_raw, u16 base_raw_size); extern int fts_test_get_uniformity_data(int *rawdata_linearity, u8 tx, u8 rx); extern int fts_test_get_scap_raw(int *scap_raw, u8 tx, u8 rx, int *fwcheck); extern int fts_test_get_scap_cb(int *scap_cb, u8 tx, u8 rx, int *fwcheck); @@ -2853,7 +2853,7 @@ static int proc_test_strength_show(struct seq_file *s, void *v) u8 *base_raw = NULL; u8 *trans_raw = NULL; - int base_raw_len = 0; + int base_raw_size = 0; int base = 0; int fast_events_x = 0; int fast_events_y = 0; @@ -2868,10 +2868,9 @@ static int proc_test_strength_show(struct seq_file *s, void *v) node_num = tx * rx; self_node = tx + rx; - base_raw_len = - FTS_CAP_DATA_LEN + (FTS_SELF_DATA_LEN * 2 + node_num) * sizeof(u16); - FTS_DEBUG("heapmap base_raw length = %d", base_raw_len); - base_raw = fts_malloc(base_raw_len); + base_raw_size = FTS_FULL_HEATMAP_RAW_SIZE(tx, rx); + FTS_DEBUG("heapmap base_raw size = %d", base_raw_size); + base_raw = fts_malloc(base_raw_size); if (!base_raw) { FTS_ERROR("malloc memory for raw fails"); ret = -ENOMEM; @@ -2886,7 +2885,7 @@ static int proc_test_strength_show(struct seq_file *s, void *v) } /* get strength data. */ - ret = fts_test_get_strength(base_raw, tx, rx); + ret = fts_test_get_strength(base_raw, base_raw_size); if (ret < 0) { FTS_ERROR("get strength fails"); goto exit; diff --git a/ft3658/focaltech_test/supported_ic/focaltech_test_ft3658u.c b/ft3658/focaltech_test/supported_ic/focaltech_test_ft3658u.c index 0d9617a..719dc29 100644 --- a/ft3658/focaltech_test/supported_ic/focaltech_test_ft3658u.c +++ b/ft3658/focaltech_test/supported_ic/focaltech_test_ft3658u.c @@ -2037,31 +2037,19 @@ test_err: return ret; } -int fts_test_get_strength(u8 *base_raw, u8 tx, u8 rx) +int fts_test_get_strength(u8 *base_raw, u16 base_raw_size) { int ret = 0; - struct fts_ts_data *ts_data = fts_data; - int self_cap_offset = 91; - int self_cap_len = 68; - int self_data_len = self_cap_len * 2; /* cap and cap_off */ - int fast_num_len = self_cap_offset + - ((tx * rx) + self_data_len) * sizeof(u16); - u8 id_cmd[4] = {0}; + u8 id_cmd[1] = {0}; FTS_TEST_INFO("====== Test Item: strength test start\n"); - id_cmd[0] = 0x01; - /* Enable uncompressed heatmap. */ - fts_set_heatmap_mode(ts_data, FW_HEATMAP_MODE_UNCOMPRESSED); + id_cmd[0] = FTS_CMD_READ_TOUCH_DATA; sys_delay(500); - FTS_TEST_DBG("Allocate heatmap length = %d.\n", fast_num_len); - ret = fts_read(id_cmd, 1, base_raw, fast_num_len); - + ret = fts_read(id_cmd, 1, base_raw, base_raw_size); if (ret < 0) { FTS_TEST_ERROR("get strength fail,ret=%d\n", ret); } - /* Enable compressed heatmap. */ - fts_set_heatmap_mode(ts_data, FW_HEATMAP_MODE_COMPRESSED); FTS_TEST_INFO("====== Test Item: strength test end\n"); return ret; } |