diff options
author | Alex Hong <rurumihong@google.com> | 2021-10-15 19:43:39 +0800 |
---|---|---|
committer | Alex Hong <rurumihong@google.com> | 2021-10-15 19:43:45 +0800 |
commit | a37c57a288565a29b45c1578842643f6cc8cad5f (patch) | |
tree | eaeecab8f01708a81ddbe4e91b3d8ddc37925d72 | |
parent | 778dcf7f2af7696ec067f57e5b1b1f5c27afeea4 (diff) | |
parent | a27f955c5f5daa04e640634b33fb64a57cc4f3bc (diff) | |
download | fts_touch-a37c57a288565a29b45c1578842643f6cc8cad5f.tar.gz |
Merge android12-gs-pixel-5.10-sc-v2 into android13-gs-pixel-5.10
Bug: 199698959
Change-Id: I9ccabf0109f1db4afe428e5c56f423e0365cc80e
Signed-off-by: Alex Hong <rurumihong@google.com>
-rw-r--r-- | ftm5/fts.c | 99 | ||||
-rw-r--r-- | ftm5/fts.h | 1 | ||||
-rw-r--r-- | ftm5/fts_lib/ftsSoftware.h | 3 |
3 files changed, 83 insertions, 20 deletions
@@ -4192,8 +4192,13 @@ static void fts_populate_mutual_channel(struct fts_ts_info *info, data_type = MS_BASELINE; break; } - mutual_strength->tx_size = getForceLen(info); - mutual_strength->rx_size = getSenseLen(info); + if (info->board->tx_rx_dir_swap) { + mutual_strength->tx_size = getSenseLen(info); + mutual_strength->rx_size = getForceLen(info); + } else { + mutual_strength->tx_size = getForceLen(info); + mutual_strength->rx_size = getSenseLen(info); + } mutual_strength->header.channel_type = frame->channel_type[channel]; mutual_strength->header.channel_size = TOUCH_OFFLOAD_FRAME_SIZE_2D(mutual_strength->rx_size, @@ -4204,13 +4209,8 @@ static void fts_populate_mutual_channel(struct fts_ts_info *info, dev_err(info->dev, "getMSFrame3 failed with result=0x%08X.\n", result); } else { - if (info->board->tx_rx_dir_swap) { - max_x = mutual_strength->rx_size; - max_y = mutual_strength->tx_size; - } else { - max_x = mutual_strength->tx_size; - max_y = mutual_strength->rx_size; - } + max_x = mutual_strength->tx_size; + max_y = mutual_strength->rx_size; for (y = 0; y < max_y; y++) { for (x = 0; x < max_x; x++) { @@ -4253,12 +4253,18 @@ static void fts_populate_self_channel(struct fts_ts_info *info, int channel) { SelfSenseFrame ss_frame = { 0 }; + int i; int result; uint32_t data_type = 0; struct TouchOffloadData1d *self_strength = (struct TouchOffloadData1d *)frame->channel_data[channel]; - self_strength->tx_size = getForceLen(info); - self_strength->rx_size = getSenseLen(info); + if (info->board->tx_rx_dir_swap) { + self_strength->tx_size = getSenseLen(info); + self_strength->rx_size = getForceLen(info); + } else { + self_strength->tx_size = getForceLen(info); + self_strength->rx_size = getSenseLen(info); + } self_strength->header.channel_type = frame->channel_type[channel]; self_strength->header.channel_size = TOUCH_OFFLOAD_FRAME_SIZE_1D(self_strength->rx_size, @@ -4283,10 +4289,36 @@ static void fts_populate_self_channel(struct fts_ts_info *info, dev_err(info->dev, "getSSFrame3 failed with result=0x%08X.\n", result); } else { - memcpy(self_strength->data, ss_frame.force_data, - 2 * self_strength->tx_size); - memcpy(&self_strength->data[2 * self_strength->tx_size], - ss_frame.sense_data, 2 * self_strength->rx_size); + uint16_t *tx_src, *rx_src, *tx_dst, *rx_dst; + if (info->board->tx_rx_dir_swap) { + tx_src = ss_frame.sense_data; + rx_src = ss_frame.force_data; + } else { + tx_src = ss_frame.force_data; + rx_src = ss_frame.sense_data; + } + /* tx, rx data order is fixed in TouchOffloadData1d */ + tx_dst = (uint16_t *)self_strength->data; + rx_dst = (uint16_t *)&self_strength->data[ + 2 * self_strength->tx_size]; + + /* If the tx data is flipped, copy in left-to-right order */ + if (info->board->sensor_inverted_x) { + for (i = 0; i < self_strength->tx_size; i++) + tx_dst[i] = + tx_src[self_strength->tx_size - 1 - i]; + } else { + memcpy(tx_dst, tx_src, 2 * self_strength->tx_size); + } + + /* If the rx data is flipped, copy in top-to-bottom order */ + if (info->board->sensor_inverted_y) { + for (i = 0; i < self_strength->rx_size; i++) + rx_dst[i] = + rx_src[self_strength->rx_size - 1 - i]; + } else { + memcpy(rx_dst, rx_src, 2 * self_strength->rx_size); + } } kfree(ss_frame.force_data); kfree(ss_frame.sense_data); @@ -4904,7 +4936,15 @@ static int fts_fw_update(struct fts_ts_info *info) #ifdef COMPUTE_INIT_METHOD || ((info->systemInfo.u8_mpFlag != MP_FLAG_BOOT) && (info->systemInfo.u8_mpFlag != MP_FLAG_FACTORY) && - (info->systemInfo.u8_mpFlag != MP_FLAG_NEED_FPI)) + (info->systemInfo.u8_mpFlag != MP_FLAG_NEED_FPI) && + /* If skip_fpi_for_unset_mpflag is not set, + * bypass MP_FLAG_UNSET check. + * If skip_fpi_for_unset_mpflag is set, + * then check if mpFlag != MP_FLAG_UNSET. + */ + ((info->board->skip_fpi_for_unset_mpflag == false) || + (info->systemInfo.u8_mpFlag != MP_FLAG_UNSET)) + ) #endif ) { init_type = SPECIAL_FULL_PANEL_INIT; @@ -6160,6 +6200,8 @@ static int parse_dt(struct device *dev, struct fts_hw_platform_data *bdata) u32 coords[2]; #if IS_ENABLED(CONFIG_TOUCHSCREEN_OFFLOAD) u8 offload_id[4]; + + struct fts_ts_info *info = dev_get_drvdata(dev); #endif if (of_property_read_u8_array(np, "st,dchip_id", bdata->dchip_id, 2)) { @@ -6227,6 +6269,12 @@ static int parse_dt(struct device *dev, struct fts_hw_platform_data *bdata) dev_info(dev, "Separate \"Save Golden MS Raw\" command from PI command.\n"); } + bdata->skip_fpi_for_unset_mpflag = false; + if (of_property_read_bool(np, "st,skip-fpi-for-unset-mpflag")) { + bdata->skip_fpi_for_unset_mpflag = true; + dev_info(dev, "Skip boot-time FPI for unset MP flag.\n"); + } + #if IS_ENABLED(CONFIG_TOUCHSCREEN_HEATMAP) bdata->heatmap_mode_full_init = false; if (of_property_read_bool(np, "st,heatmap_mode_full")) { @@ -6290,8 +6338,16 @@ static int parse_dt(struct device *dev, struct fts_hw_platform_data *bdata) bdata->device_name = NULL; of_property_read_string(np, "st,device_name", &bdata->device_name); - if(!bdata->device_name) + if(!bdata->device_name) { bdata->device_name = FTS_TS_DRV_NAME; +#if IS_ENABLED(CONFIG_TOUCHSCREEN_OFFLOAD) + scnprintf(info->offload.device_name, 32, "touch_offload"); + } else { + scnprintf(info->offload.device_name, 32, "touch_offload_%s", + info->board->device_name); + info->offload.multiple_panels = true; +#endif + } dev_info(dev, "device_name = %s\n", bdata->device_name); if (of_property_read_u8(np, "st,grip_area", &bdata->fw_grip_area)) @@ -6641,8 +6697,13 @@ static int fts_probe(struct spi_device *client) info->offload.caps.device_id = info->board->offload_id; info->offload.caps.display_width = info->board->x_axis_max; info->offload.caps.display_height = info->board->y_axis_max; - info->offload.caps.tx_size = getForceLen(info); - info->offload.caps.rx_size = getSenseLen(info); + if (info->board->tx_rx_dir_swap) { + info->offload.caps.tx_size = getSenseLen(info); + info->offload.caps.rx_size = getForceLen(info); + } else { + info->offload.caps.tx_size = getForceLen(info); + info->offload.caps.rx_size = getSenseLen(info); + } info->offload.caps.bus_type = BUS_TYPE_SPI; info->offload.caps.bus_speed_hz = 10000000; info->offload.caps.heatmap_size = HEATMAP_SIZE_FULL; @@ -315,6 +315,7 @@ struct fts_hw_platform_data { int udfps_y; bool auto_fw_update; bool separate_save_golden_ms_raw_cmd; + bool skip_fpi_for_unset_mpflag; bool sensor_inverted_x; bool sensor_inverted_y; bool tx_rx_dir_swap; /* Set as TRUE if Tx direction is same as x-axis. */ diff --git a/ftm5/fts_lib/ftsSoftware.h b/ftm5/fts_lib/ftsSoftware.h index 720430f..862bbd3 100644 --- a/ftm5/fts_lib/ftsSoftware.h +++ b/ftm5/fts_lib/ftsSoftware.h @@ -525,7 +525,8 @@ enum { * a full panel initialization which pass all the tests. * @{ */ - +#define MP_FLAG_UNSET 0x00 /* /< Original value when a panel module + * just got built. */ #define MP_FLAG_FACTORY 0xA5 /* /< Full Panel Init done in factory */ #define MP_FLAG_BOOT 0x5A /* /< Full Panel Init done at boot */ #define MP_FLAG_OTHERS 0xFF /* /< Full Panel Init done somewhere else */ |