From 6496483dae3a6c847c00f852d0de11a20f6ea110 Mon Sep 17 00:00:00 2001 From: Mason Wang Date: Fri, 15 Jul 2022 17:32:51 +0800 Subject: touch/focaltech: support to report SS_WATER data. Currently the driver only reports the SS_NORMAL data, but focaltech firmware supports SS_WATER data as well. So the driver change to support it. Bug: 230031445 Test: Touch works well. Signed-off-by: Mason Wang Change-Id: If65ee680c15ea572e4c24c0dc350fb461571dac4 --- ft3658/focaltech_core.c | 32 ++++++++++++++++++++++++++------ ft3658/focaltech_core.h | 5 +++++ 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/ft3658/focaltech_core.c b/ft3658/focaltech_core.c index 5d3ebad..7068959 100644 --- a/ft3658/focaltech_core.c +++ b/ft3658/focaltech_core.c @@ -1780,8 +1780,12 @@ static void fts_populate_mutual_channel(struct fts_ts_data *ts_data, static void fts_populate_self_channel(struct fts_ts_data *ts_data, struct touch_offload_frame *frame, int channel) { - int i; - int idx = 0; + u8 ss_type = 0; + int idx_ss_normal = ts_data->pdata->tx_ch_num * ts_data->pdata->rx_ch_num; + int idx_ss_water = ts_data->pdata->tx_ch_num * ts_data->pdata->rx_ch_num + + ts_data->pdata->tx_ch_num + ts_data->pdata->rx_ch_num; + int ss_size = + (ts_data->pdata->tx_ch_num + ts_data->pdata->rx_ch_num) * sizeof(u16); struct TouchOffloadData1d *self_strength = (struct TouchOffloadData1d *)frame->channel_data[channel]; @@ -1791,10 +1795,25 @@ static void fts_populate_self_channel(struct fts_ts_data *ts_data, self_strength->header.channel_size = TOUCH_OFFLOAD_FRAME_SIZE_1D(self_strength->rx_size, self_strength->tx_size); - idx = ts_data->pdata->tx_ch_num * ts_data->pdata->rx_ch_num; - for (i = 0; i < ts_data->pdata->tx_ch_num + ts_data->pdata->rx_ch_num; i++) { - ((u16 *) self_strength->data)[i] = - ((u16 *) ts_data->heatmap_buff)[idx + i]; + + switch (frame->channel_type[channel] & ~TOUCH_SCAN_TYPE_SELF) { + case TOUCH_DATA_TYPE_FILTERED: + ss_type = SS_WATER; + break; + case TOUCH_DATA_TYPE_STRENGTH: + default: + ss_type = SS_NORMAL; + break; + } + + if (ss_type == SS_WATER) { + /* Copy Water-SS. */ + memcpy(self_strength->data, ts_data->heatmap_buff + idx_ss_water, + ss_size); + } else { + /* Copy Normal-SS. */ + memcpy(self_strength->data, ts_data->heatmap_buff + idx_ss_normal, + ss_size); } } @@ -2922,6 +2941,7 @@ static int fts_ts_probe_entry(struct fts_ts_data *ts_data) ts_data->offload.caps.heatmap_size = HEATMAP_SIZE_FULL; ts_data->offload.caps.touch_data_types = TOUCH_DATA_TYPE_COORD | TOUCH_DATA_TYPE_STRENGTH | + TOUCH_DATA_TYPE_FILTERED | TOUCH_DATA_TYPE_RAW; ts_data->offload.caps.touch_scan_types = TOUCH_SCAN_TYPE_MUTUAL | TOUCH_SCAN_TYPE_SELF; diff --git a/ft3658/focaltech_core.h b/ft3658/focaltech_core.h index 515d28a..a665e5c 100644 --- a/ft3658/focaltech_core.h +++ b/ft3658/focaltech_core.h @@ -224,6 +224,11 @@ struct fts_gesture_st { int orientation[FTS_GESTURE_POINTS_MAX]; }; +enum SS_TYPE { + SS_NORMAL, + SS_WATER, +}; + struct fts_ts_data { struct i2c_client *client; struct spi_device *spi; -- cgit v1.2.3