diff options
author | Hyungwoo Yang <hyungwooyang@google.com> | 2023-09-20 16:50:04 +0000 |
---|---|---|
committer | Hyungwoo Yang <hyungwooyang@google.com> | 2023-10-19 00:08:50 +0000 |
commit | 9c300628056906cad993af033a05a9b669e8e2c5 (patch) | |
tree | 4cc2eded5a240c43f774d033d27d7b5d4ede0710 | |
parent | 9a801c0096b74d27921c58e16f2899817c4d799d (diff) | |
download | novatek_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.c | 12 | ||||
-rw-r--r-- | nt36xxx/nt36xxx.h | 32 | ||||
-rw-r--r-- | nt36xxx/nt36xxx_ext_usi.c | 25 |
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) |