summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPixelBot AutoMerger <android-nexus-securitybot@system.gserviceaccount.com>2022-06-19 18:41:00 -0700
committerRobin Peng <robinpeng@google.com>2022-06-21 08:56:30 +0000
commitf03f25010d4e4d393561d74a4df1fb1b40c40261 (patch)
treeddd1a490026fb42ee5b4b4e9d9e926646f0c8a57
parent55da83fbe74c744b1179f01b2318d19858f5bbc9 (diff)
parent340be58866809463c7ea9a11a5ae9e9a9756e1c3 (diff)
downloadfocaltech_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.h2
-rw-r--r--ft3658/focaltech_core.c80
-rw-r--r--ft3658/focaltech_core.h2
-rw-r--r--ft3658/focaltech_test/focaltech_test.c13
-rw-r--r--ft3658/focaltech_test/supported_ic/focaltech_test_ft3658u.c20
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;
}