summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHyungwoo Yang <hyungwooyang@google.com>2023-09-20 16:50:04 +0000
committerHyungwoo Yang <hyungwooyang@google.com>2023-10-19 00:08:50 +0000
commit9c300628056906cad993af033a05a9b669e8e2c5 (patch)
tree4cc2eded5a240c43f774d033d27d7b5d4ede0710
parent9a801c0096b74d27921c58e16f2899817c4d799d (diff)
downloadnovatek_touch-9c300628056906cad993af033a05a9b669e8e2c5.tar.gz
touch/novatek: support per-model(VID/PID) parameters
The TIC supports upto 5 per-model(VID/PID) tuning parameters but the TIC loses which set of parameters are being used after power cycle. This change is to restore the index of the set to TIC during the resume. Bug: 268144549 Test: via the kernel log, the index of the tuning table changes between differnt stylus models Change-Id: I1572659fb04634c0e9b88bcb14c453f0b132c6aa Signed-off-by: Hyungwoo Yang <hyungwooyang@google.com>
-rw-r--r--nt36xxx/nt36xxx.c12
-rw-r--r--nt36xxx/nt36xxx.h32
-rw-r--r--nt36xxx/nt36xxx_ext_usi.c25
3 files changed, 51 insertions, 18 deletions
diff --git a/nt36xxx/nt36xxx.c b/nt36xxx/nt36xxx.c
index 2ce9dd1..9a9e48f 100644
--- a/nt36xxx/nt36xxx.c
+++ b/nt36xxx/nt36xxx.c
@@ -1569,6 +1569,7 @@ static void process_usi_responses(uint16_t info_buf_flags, const uint8_t *info_b
if (info_buf_flags & USI_GID_FLAG) {
nvt_usi_store_gid(info_buf + USI_GID_OFFSET);
nvt_usi_get_serial_number(&pen_serial_high, &pen_serial_low);
+ nvt_usi_store_pen_model_index(info_buf + USI_PEN_MODEL_IDX_OFFSET);
if (ts->pen_serial_high != pen_serial_high ||
ts->pen_serial_low != pen_serial_low) {
int idx = 0;
@@ -3218,7 +3219,8 @@ int nvt_ts_resume(struct device *dev)
/* Restore fast-pairing configuration. */
if (ts->pen_support) {
- uint8_t buf[7], hash_id[2], session_id[2], fw_version[2], freq_seed = 0;
+ uint8_t buf[7], hash_id[2], session_id[2], fw_version[2];
+ uint8_t freq_seed = 0, pen_model_index = 0;
uint16_t validity_flags = 0;
if (nvt_usi_get_hash_id(hash_id)) {
@@ -3244,6 +3246,7 @@ int nvt_ts_resume(struct device *dev)
msleep(20);
+ nvt_usi_get_pen_model_index(&pen_model_index);
nvt_usi_get_freq_seed(&freq_seed);
if (nvt_usi_get_fw_version(fw_version)){
fw_version[0] = 0; /* set 0 if error */
@@ -3256,9 +3259,10 @@ int nvt_ts_resume(struct device *dev)
buf[3] = freq_seed;
buf[4] = fw_version[0];
buf[5] = fw_version[1];
- CTP_SPI_WRITE(ts->client, buf, 6);
- NVT_LOG("Write pen_freq_seed = %02X, pen_fw_ver = 0x%02X%02X\n",
- freq_seed, fw_version[1], fw_version[0]);
+ buf[6] = pen_model_index;
+ CTP_SPI_WRITE(ts->client, buf, 7);
+ NVT_LOG("Write pen_freq_seed = %02X, pen_fw_ver = 0x%02X%02X, model_idx = %d\n",
+ freq_seed, fw_version[1], fw_version[0], pen_model_index);
msleep(20);
nvt_usi_get_validity_flags(&validity_flags);
diff --git a/nt36xxx/nt36xxx.h b/nt36xxx/nt36xxx.h
index a6beede..986586a 100644
--- a/nt36xxx/nt36xxx.h
+++ b/nt36xxx/nt36xxx.h
@@ -424,6 +424,7 @@ extern int32_t nvt_usi_store_gid(const uint8_t *buf_gid);
extern int32_t nvt_usi_store_hash_id(const uint8_t *buf_hash_id);
extern int32_t nvt_usi_store_session_id(const uint8_t *buf_session_id);
extern int32_t nvt_usi_store_freq_seed(const uint8_t *buf_freq_seed);
+extern int32_t nvt_usi_store_pen_model_index(const uint8_t *buf_model_idx);
extern int32_t nvt_usi_get_battery(uint8_t *bat);
extern int32_t nvt_usi_get_fw_version(uint8_t *buf_fw_ver);
@@ -433,6 +434,7 @@ extern int32_t nvt_usi_get_hash_id(uint8_t *buf_hash_id);
extern int32_t nvt_usi_get_session_id(uint8_t *buf_session_id);
extern int32_t nvt_usi_get_freq_seed(uint8_t *buf_freq_seed);
extern int32_t nvt_usi_get_validity_flags(uint16_t *validity_flags);
+extern int32_t nvt_usi_get_pen_model_index(uint8_t *model_idx);
/* Flags for the responses of the USI read commands */
enum {
@@ -462,7 +464,8 @@ enum {
USI_CRC_FAIL_SIZE = 2,
USI_FAST_PAIR_SIZE = 2,
USI_NORMAL_PAIR_SIZE = 2,
- USI_RESERVED1_SIZE = 22,
+ USI_PEN_MODEL_IDX_SIZE = 1,
+ USI_RESERVED1_SIZE = 21,
USI_HASH_ID_SIZE = 2,
USI_SESSION_ID_SIZE = 2,
USI_FREQ_SEED_SIZE = 1,
@@ -472,19 +475,20 @@ enum {
/* location of the data in the response buffer */
enum {
- USI_GID_OFFSET = 1,
- USI_BATTERY_OFFSET = USI_GID_OFFSET + USI_GID_SIZE,
- USI_FW_VERSION_OFFSET = USI_BATTERY_OFFSET + USI_BATTERY_SIZE,
- USI_CAPABILITY_OFFSET = USI_FW_VERSION_OFFSET + USI_FW_VERSION_SIZE,
- USI_CRC_FAIL_OFFSET = USI_CAPABILITY_OFFSET + USI_CAPABILITY_SIZE,
- USI_FAST_PAIR_OFFSET = USI_CRC_FAIL_OFFSET + USI_CRC_FAIL_SIZE,
- USI_NORMAL_PAIR_OFFSET = USI_FAST_PAIR_OFFSET + USI_FAST_PAIR_SIZE,
- USI_RESERVED1_OFFSET = USI_NORMAL_PAIR_OFFSET + USI_NORMAL_PAIR_SIZE,
- USI_HASH_ID_OFFSET = USI_RESERVED1_OFFSET + USI_RESERVED1_SIZE,
- USI_SESSION_ID_OFFSET = USI_HASH_ID_OFFSET + USI_HASH_ID_SIZE,
- USI_FREQ_SEED_OFFSET = USI_SESSION_ID_OFFSET + USI_SESSION_ID_SIZE,
- USI_RESERVED2_OFFSET = USI_FREQ_SEED_OFFSET + USI_FREQ_SEED_SIZE,
- USI_INFO_FLAG_OFFSET = USI_RESERVED2_OFFSET + USI_RESERVED2_SIZE,
+ USI_GID_OFFSET = 1,
+ USI_BATTERY_OFFSET = USI_GID_OFFSET + USI_GID_SIZE,
+ USI_FW_VERSION_OFFSET = USI_BATTERY_OFFSET + USI_BATTERY_SIZE,
+ USI_CAPABILITY_OFFSET = USI_FW_VERSION_OFFSET + USI_FW_VERSION_SIZE,
+ USI_CRC_FAIL_OFFSET = USI_CAPABILITY_OFFSET + USI_CAPABILITY_SIZE,
+ USI_FAST_PAIR_OFFSET = USI_CRC_FAIL_OFFSET + USI_CRC_FAIL_SIZE,
+ USI_NORMAL_PAIR_OFFSET = USI_FAST_PAIR_OFFSET + USI_FAST_PAIR_SIZE,
+ USI_PEN_MODEL_IDX_OFFSET = USI_NORMAL_PAIR_OFFSET + USI_NORMAL_PAIR_SIZE,
+ USI_RESERVED1_OFFSET = USI_PEN_MODEL_IDX_OFFSET + USI_PEN_MODEL_IDX_SIZE,
+ USI_HASH_ID_OFFSET = USI_RESERVED1_OFFSET + USI_RESERVED1_SIZE,
+ USI_SESSION_ID_OFFSET = USI_HASH_ID_OFFSET + USI_HASH_ID_SIZE,
+ USI_FREQ_SEED_OFFSET = USI_SESSION_ID_OFFSET + USI_SESSION_ID_SIZE,
+ USI_RESERVED2_OFFSET = USI_FREQ_SEED_OFFSET + USI_FREQ_SEED_SIZE,
+ USI_INFO_FLAG_OFFSET = USI_RESERVED2_OFFSET + USI_RESERVED2_SIZE,
};
#endif
diff --git a/nt36xxx/nt36xxx_ext_usi.c b/nt36xxx/nt36xxx_ext_usi.c
index 3712b4e..22c6416 100644
--- a/nt36xxx/nt36xxx_ext_usi.c
+++ b/nt36xxx/nt36xxx_ext_usi.c
@@ -485,6 +485,7 @@ struct nvt_usi_context {
uint8_t stylus_hash_id[USI_HASH_ID_SIZE];
uint8_t stylus_session_id[USI_SESSION_ID_SIZE];
uint8_t stylus_freq_seed;
+ uint8_t pen_model_index;
};
static struct nvt_usi_context *usi_ctx;
@@ -596,6 +597,30 @@ int32_t nvt_usi_get_fw_version(uint8_t *buf_fw_ver)
return 0;
}
+int32_t nvt_usi_store_pen_model_index(const uint8_t *buf_model_idx)
+{
+ if (!usi_ctx)
+ return -EINVAL;
+
+ usi_ctx->pen_model_index = buf_model_idx[0];
+
+ return 0;
+}
+
+
+int32_t nvt_usi_get_pen_model_index(uint8_t *model_idx)
+{
+ if (!usi_ctx)
+ return -EINVAL;
+
+ if (!(usi_ctx->stylus_read_map & USI_GID_FLAG))
+ return -ENODATA;
+
+ *model_idx = usi_ctx->pen_model_index;
+
+ return 0;
+}
+
int32_t nvt_usi_store_capability(const uint8_t *buf_cap)
{
if (!usi_ctx)