From 09e1d33c187623c3faf0807f71a2619fcb22dfb8 Mon Sep 17 00:00:00 2001 From: wengjun1 Date: Fri, 3 Aug 2018 16:27:12 +0800 Subject: [PATCH] DLKM: Update base code for novatek Change code base for keep consistency. - Add comments for code readability. - Remove redundant code. - Set initial value for global variables. - Move memory map and trim id table to one file. (nt36xxx_mem_map.h) - Refine gesture part to fit latest FW protocol. - Refine ESD function. - Refine trim ID and product id part. - Add CRC support function. - Refine FW update routine. - Refine selftest function and add support for notch panel. Change-Id: Id7dfd3d5d29d44deaccb8f7666094c0ff5e1f8d3 Signed-off-by: wengjun1 Reviewed-on: https://gerrit.mot.com/1220466 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Jialei Hao Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- drivers/input/touchscreen/nova_mmi/nt36xxx.c | 424 ++++----- drivers/input/touchscreen/nova_mmi/nt36xxx.h | 57 +- .../touchscreen/nova_mmi/nt36xxx_ext_proc.c | 52 + .../touchscreen/nova_mmi/nt36xxx_fw_update.c | 183 +++- .../touchscreen/nova_mmi/nt36xxx_mem_map.h | 218 +++++ .../touchscreen/nova_mmi/nt36xxx_mp_ctrlram.c | 712 +++++++------- .../touchscreen/nova_mmi/nt36xxx_mp_ctrlram.h | 897 ++++++++++++++---- 7 files changed, 1748 insertions(+), 795 deletions(-) create mode 100644 drivers/input/touchscreen/nova_mmi/nt36xxx_mem_map.h diff --git a/drivers/input/touchscreen/nova_mmi/nt36xxx.c b/drivers/input/touchscreen/nova_mmi/nt36xxx.c index af3daba3bede..6213f0f272a9 100644 --- a/drivers/input/touchscreen/nova_mmi/nt36xxx.c +++ b/drivers/input/touchscreen/nova_mmi/nt36xxx.c @@ -23,9 +23,7 @@ #include #include #include -#include #include -#include #include #include @@ -59,11 +57,11 @@ static struct delayed_work nvt_esd_check_work; static struct workqueue_struct *nvt_esd_check_wq; -static unsigned long irq_timer; -uint8_t esd_check; -uint8_t esd_retry; +static unsigned long irq_timer = 0; +uint8_t esd_check = false; +uint8_t esd_retry = 0; uint8_t esd_retry_max = 5; -#endif +#endif /* #if NVT_TOUCH_ESD_PROTECT */ #if NVT_TOUCH_EXT_PROC extern int32_t nvt_extra_proc_init(void); @@ -94,171 +92,6 @@ static void nvt_ts_early_suspend(struct early_suspend *h); static void nvt_ts_late_resume(struct early_suspend *h); #endif -static const struct nvt_ts_mem_map NT36672A_memory_map = { - .EVENT_BUF_ADDR = 0x21C00, - .RAW_PIPE0_ADDR = 0x20000, - .RAW_PIPE0_Q_ADDR = 0, - .RAW_PIPE1_ADDR = 0x23000, - .RAW_PIPE1_Q_ADDR = 0, - .BASELINE_ADDR = 0x20BFC, - .BASELINE_Q_ADDR = 0, - .BASELINE_BTN_ADDR = 0x23BFC, - .BASELINE_BTN_Q_ADDR = 0, - .DIFF_PIPE0_ADDR = 0x206DC, - .DIFF_PIPE0_Q_ADDR = 0, - .DIFF_PIPE1_ADDR = 0x236DC, - .DIFF_PIPE1_Q_ADDR = 0, - .RAW_BTN_PIPE0_ADDR = 0x20510, - .RAW_BTN_PIPE0_Q_ADDR = 0, - .RAW_BTN_PIPE1_ADDR = 0x23510, - .RAW_BTN_PIPE1_Q_ADDR = 0, - .DIFF_BTN_PIPE0_ADDR = 0x20BF0, - .DIFF_BTN_PIPE0_Q_ADDR = 0, - .DIFF_BTN_PIPE1_ADDR = 0x23BF0, - .DIFF_BTN_PIPE1_Q_ADDR = 0, - .READ_FLASH_CHECKSUM_ADDR = 0x24000, - .RW_FLASH_DATA_ADDR = 0x24002, -}; - -static const struct nvt_ts_mem_map NT36772_memory_map = { - .EVENT_BUF_ADDR = 0x11E00, - .RAW_PIPE0_ADDR = 0x10000, - .RAW_PIPE0_Q_ADDR = 0, - .RAW_PIPE1_ADDR = 0x12000, - .RAW_PIPE1_Q_ADDR = 0, - .BASELINE_ADDR = 0x10E70, - .BASELINE_Q_ADDR = 0, - .BASELINE_BTN_ADDR = 0x12E70, - .BASELINE_BTN_Q_ADDR = 0, - .DIFF_PIPE0_ADDR = 0x10830, - .DIFF_PIPE0_Q_ADDR = 0, - .DIFF_PIPE1_ADDR = 0x12830, - .DIFF_PIPE1_Q_ADDR = 0, - .RAW_BTN_PIPE0_ADDR = 0x10E60, - .RAW_BTN_PIPE0_Q_ADDR = 0, - .RAW_BTN_PIPE1_ADDR = 0x12E60, - .RAW_BTN_PIPE1_Q_ADDR = 0, - .DIFF_BTN_PIPE0_ADDR = 0x10E68, - .DIFF_BTN_PIPE0_Q_ADDR = 0, - .DIFF_BTN_PIPE1_ADDR = 0x12E68, - .DIFF_BTN_PIPE1_Q_ADDR = 0, - .READ_FLASH_CHECKSUM_ADDR = 0x14000, - .RW_FLASH_DATA_ADDR = 0x14002, -}; - -static const struct nvt_ts_mem_map NT36525_memory_map = { - .EVENT_BUF_ADDR = 0x11A00, - .RAW_PIPE0_ADDR = 0x10000, - .RAW_PIPE0_Q_ADDR = 0, - .RAW_PIPE1_ADDR = 0x12000, - .RAW_PIPE1_Q_ADDR = 0, - .BASELINE_ADDR = 0x10B08, - .BASELINE_Q_ADDR = 0, - .BASELINE_BTN_ADDR = 0x12B08, - .BASELINE_BTN_Q_ADDR = 0, - .DIFF_PIPE0_ADDR = 0x1064C, - .DIFF_PIPE0_Q_ADDR = 0, - .DIFF_PIPE1_ADDR = 0x1264C, - .DIFF_PIPE1_Q_ADDR = 0, - .RAW_BTN_PIPE0_ADDR = 0x10634, - .RAW_BTN_PIPE0_Q_ADDR = 0, - .RAW_BTN_PIPE1_ADDR = 0x12634, - .RAW_BTN_PIPE1_Q_ADDR = 0, - .DIFF_BTN_PIPE0_ADDR = 0x10AFC, - .DIFF_BTN_PIPE0_Q_ADDR = 0, - .DIFF_BTN_PIPE1_ADDR = 0x12AFC, - .DIFF_BTN_PIPE1_Q_ADDR = 0, - .READ_FLASH_CHECKSUM_ADDR = 0x14000, - .RW_FLASH_DATA_ADDR = 0x14002, -}; - -static const struct nvt_ts_mem_map NT36870_memory_map = { - .EVENT_BUF_ADDR = 0x25000, - .RAW_PIPE0_ADDR = 0x20000, - .RAW_PIPE0_Q_ADDR = 0x204C8, - .RAW_PIPE1_ADDR = 0x23000, - .RAW_PIPE1_Q_ADDR = 0x234C8, - .BASELINE_ADDR = 0x21350, - .BASELINE_Q_ADDR = 0x21818, - .BASELINE_BTN_ADDR = 0x24350, - .BASELINE_BTN_Q_ADDR = 0x24358, - .DIFF_PIPE0_ADDR = 0x209B0, - .DIFF_PIPE0_Q_ADDR = 0x20E78, - .DIFF_PIPE1_ADDR = 0x239B0, - .DIFF_PIPE1_Q_ADDR = 0x23E78, - .RAW_BTN_PIPE0_ADDR = 0x20990, - .RAW_BTN_PIPE0_Q_ADDR = 0x20998, - .RAW_BTN_PIPE1_ADDR = 0x23990, - .RAW_BTN_PIPE1_Q_ADDR = 0x23998, - .DIFF_BTN_PIPE0_ADDR = 0x21340, - .DIFF_BTN_PIPE0_Q_ADDR = 0x21348, - .DIFF_BTN_PIPE1_ADDR = 0x24340, - .DIFF_BTN_PIPE1_Q_ADDR = 0x24348, - .READ_FLASH_CHECKSUM_ADDR = 0x24000, - .RW_FLASH_DATA_ADDR = 0x24002, -}; - -static const struct nvt_ts_mem_map NT36676F_memory_map = { - .EVENT_BUF_ADDR = 0x11A00, - .RAW_PIPE0_ADDR = 0x10000, - .RAW_PIPE0_Q_ADDR = 0, - .RAW_PIPE1_ADDR = 0x12000, - .RAW_PIPE1_Q_ADDR = 0, - .BASELINE_ADDR = 0x10B08, - .BASELINE_Q_ADDR = 0, - .BASELINE_BTN_ADDR = 0x12B08, - .BASELINE_BTN_Q_ADDR = 0, - .DIFF_PIPE0_ADDR = 0x1064C, - .DIFF_PIPE0_Q_ADDR = 0, - .DIFF_PIPE1_ADDR = 0x1264C, - .DIFF_PIPE1_Q_ADDR = 0, - .RAW_BTN_PIPE0_ADDR = 0x10634, - .RAW_BTN_PIPE0_Q_ADDR = 0, - .RAW_BTN_PIPE1_ADDR = 0x12634, - .RAW_BTN_PIPE1_Q_ADDR = 0, - .DIFF_BTN_PIPE0_ADDR = 0x10AFC, - .DIFF_BTN_PIPE0_Q_ADDR = 0, - .DIFF_BTN_PIPE1_ADDR = 0x12AFC, - .DIFF_BTN_PIPE1_Q_ADDR = 0, - .READ_FLASH_CHECKSUM_ADDR = 0x14000, - .RW_FLASH_DATA_ADDR = 0x14002, -}; - -#define NVT_ID_BYTE_MAX 6 -struct nvt_ts_trim_id_table { - uint8_t id[NVT_ID_BYTE_MAX]; - uint8_t mask[NVT_ID_BYTE_MAX]; - const struct nvt_ts_mem_map *mmap; - uint8_t carrier_system; -}; - -static const struct nvt_ts_trim_id_table trim_id_table[] = { - {.id = {0x0A, 0xFF, 0xFF, 0x72, 0x66, 0x03}, .mask = {1, 0, 0, 1, 1, 1}, - .mmap = &NT36672A_memory_map, .carrier_system = 0}, - {.id = {0x55, 0x00, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1}, - .mmap = &NT36772_memory_map, .carrier_system = 0}, - {.id = {0x55, 0x72, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1}, - .mmap = &NT36772_memory_map, .carrier_system = 0}, - {.id = {0xAA, 0x00, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1}, - .mmap = &NT36772_memory_map, .carrier_system = 0}, - {.id = {0xAA, 0x72, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1}, - .mmap = &NT36772_memory_map, .carrier_system = 0}, - {.id = {0xFF, 0xFF, 0xFF, 0x72, 0x67, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, - .mmap = &NT36772_memory_map, .carrier_system = 0}, - {.id = {0xFF, 0xFF, 0xFF, 0x70, 0x66, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, - .mmap = &NT36772_memory_map, .carrier_system = 0}, - {.id = {0xFF, 0xFF, 0xFF, 0x70, 0x67, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, - .mmap = &NT36772_memory_map, .carrier_system = 0}, - {.id = {0xFF, 0xFF, 0xFF, 0x72, 0x66, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, - .mmap = &NT36772_memory_map, .carrier_system = 0}, - {.id = {0xFF, 0xFF, 0xFF, 0x25, 0x65, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, - .mmap = &NT36525_memory_map, .carrier_system = 0}, - {.id = {0xFF, 0xFF, 0xFF, 0x70, 0x68, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, - .mmap = &NT36870_memory_map, .carrier_system = 1}, - {.id = {0xFF, 0xFF, 0xFF, 0x76, 0x66, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, - .mmap = &NT36676F_memory_map, .carrier_system = 0} -}; - #if TOUCH_KEY_NUM > 0 const uint16_t touch_key_array[TOUCH_KEY_NUM] = { KEY_BACK, @@ -269,23 +102,23 @@ const uint16_t touch_key_array[TOUCH_KEY_NUM] = { #if WAKEUP_GESTURE const uint16_t gesture_key_array[] = { - KEY_POWER, - KEY_POWER, - KEY_POWER, - KEY_POWER, - KEY_POWER, - KEY_POWER, - KEY_POWER, - KEY_POWER, - KEY_POWER, - KEY_POWER, - KEY_POWER, - KEY_POWER, - KEY_POWER, + KEY_POWER, /*GESTURE_WORD_C*/ + KEY_POWER, /*GESTURE_WORD_W*/ + KEY_POWER, /*GESTURE_WORD_V*/ + KEY_POWER, /*GESTURE_DOUBLE_CLICK*/ + KEY_POWER, /*GESTURE_WORD_Z*/ + KEY_POWER, /*GESTURE_WORD_M*/ + KEY_POWER, /*GESTURE_WORD_O*/ + KEY_POWER, /*GESTURE_WORD_e*/ + KEY_POWER, /*GESTURE_WORD_S*/ + KEY_POWER, /*GESTURE_SLIDE_UP*/ + KEY_POWER, /*GESTURE_SLIDE_DOWN*/ + KEY_POWER, /*GESTURE_SLIDE_LEFT*/ + KEY_POWER, /*GESTURE_SLIDE_RIGHT*/ }; #endif -static uint8_t bTouchIsAwake; +static uint8_t bTouchIsAwake = 0; /******************************************************* Description: @@ -324,25 +157,6 @@ int32_t CTP_I2C_READ(struct i2c_client *client, uint16_t address, uint8_t *buf, return ret; } -/******************************************************* -Description: - Novatek touchscreen i2c dummy read function. - -return: - Executive outcomes. 1---succeed. -5---I/O error -*******************************************************/ -int32_t CTP_I2C_READ_DUMMY(struct i2c_client *client, uint16_t address) -{ - uint8_t buf[8] = {0}; - int32_t ret = -1; - - ret = CTP_I2C_READ(client, address, buf, 2); - if (ret < 0) - NVT_ERR("CTP_I2C_READ_DUMMY failed.(%d)\n", ret); - - return ret; -} - /******************************************************* Description: Novatek touchscreen i2c write function. @@ -390,8 +204,8 @@ void nvt_sw_reset_idle(void) uint8_t buf[4] = {0}; /* ---write i2c cmds to reset idle--- */ - buf[0] = 0x00; - buf[1] = 0xA5; + buf[0]=0x00; + buf[1]=0xA5; CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); msleep(15); @@ -407,11 +221,13 @@ return: void nvt_bootloader_reset(void) { uint8_t buf[8] = {0}; - NVT_ERR("xlixiang---enter-%s\n", __func__); + NVT_LOG("enter-%s\n", __func__); + /*---write i2c cmds to reset---*/ buf[0] = 0x00; buf[1] = 0x69; CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + /* need 35ms delay after bootloader reset*/ msleep(35); } @@ -429,15 +245,18 @@ int32_t nvt_clear_fw_status(void) const int32_t retry = 20; for (i = 0; i < retry; i++) { + /*---set xdata index to EVENT BUF ADDR---*/ buf[0] = 0xFF; buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---clear fw status---*/ buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE; buf[1] = 0x00; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2); + /*---read fw status---*/ buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE; buf[1] = 0xFF; CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 2); @@ -470,11 +289,13 @@ int32_t nvt_check_fw_status(void) const int32_t retry = 50; for (i = 0; i < retry; i++) { + /*---set xdata index to EVENT BUF ADDR---*/ buf[0] = 0xFF; buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---read fw status---*/ buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE; buf[1] = 0x00; CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 2); @@ -505,10 +326,11 @@ int32_t nvt_check_fw_reset_state(RST_COMPLETE_STATE check_reset_state) uint8_t buf[8] = {0}; int32_t ret = 0; int32_t retry = 0; - NVT_ERR("xlixiang---enter-%s\n", __func__); + NVT_LOG("enter-%s\n", __func__); while (1) { msleep(10); + /*---read reset state---*/ buf[0] = EVENT_MAP_RESET_COMPLETE; buf[1] = 0x00; CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 6); @@ -542,11 +364,13 @@ int32_t nvt_read_pid(void) uint8_t buf[3] = {0}; int32_t ret = 0; + /*---set xdata index to EVENT BUF ADDR---*/ buf[0] = 0xFF; buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---read project id---*/ buf[0] = EVENT_MAP_PROJECTID; buf[1] = 0x00; buf[2] = 0x00; @@ -574,11 +398,13 @@ int32_t nvt_get_fw_info(void) int32_t ret = 0; info_retry: + /*---set xdata index to EVENT BUF ADDR---*/ buf[0] = 0xFF; buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---read fw info---*/ buf[0] = EVENT_MAP_FWINFO; CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 17); ts->fw_ver = buf[1]; @@ -588,6 +414,7 @@ info_retry: ts->abs_y_max = (uint16_t)((buf[7] << 8) | buf[8]); ts->max_button_num = buf[11]; + /*---clear x_num, y_num if fw info is broken---*/ if ((buf[1] + buf[2]) != 0xFF) { NVT_ERR("FW info is broken! fw_ver=0x%02X, ~fw_ver=0x%02X\n", buf[1], buf[2]); ts->fw_ver = 0; @@ -597,7 +424,7 @@ info_retry: ts->abs_y_max = TOUCH_DEFAULT_MAX_HEIGHT; ts->max_button_num = TOUCH_KEY_NUM; - if (retry_count < 3) { + if(retry_count < 3) { retry_count++; NVT_ERR("retry_count=%d\n", retry_count); goto info_retry; @@ -612,6 +439,7 @@ info_retry: ret = 0; } + /*---Get Novatek PID---*/ nvt_read_pid(); return ret; @@ -647,14 +475,19 @@ static ssize_t nvt_flash_read(struct file *file, char __user *buff, size_t count NVT_ERR("copy from user error\n"); return -EFAULT; } + #if NVT_TOUCH_ESD_PROTECT + /* + * stop esd check work to avoid case that 0x77 report righ after here to enable esd check again + * finally lead to trigger esd recovery bootloader reset + */ cancel_delayed_work_sync(&nvt_esd_check_work); nvt_esd_check_enable(false); #endif i2c_wr = str[0] >> 7; - if (i2c_wr == 0) { + if (i2c_wr == 0) { /*I2C write*/ while (retries < 20) { ret = CTP_I2C_WRITE(ts->client, (str[0] & 0x7F), &str[2], str[1]); if (ret == 1) @@ -671,7 +504,7 @@ static ssize_t nvt_flash_read(struct file *file, char __user *buff, size_t count } return ret; - } else if (i2c_wr == 1) { + } else if (i2c_wr == 1) { /*I2C read*/ while (retries < 20) { ret = CTP_I2C_READ(ts->client, (str[0] & 0x7F), &str[2], str[1]); if (ret == 2) @@ -682,6 +515,7 @@ static ssize_t nvt_flash_read(struct file *file, char __user *buff, size_t count retries++; } + /* copy buff to user if i2c transfer*/ if (retries < 20) { if (copy_to_user(buff, str, count)) return -EFAULT; @@ -772,19 +606,24 @@ static int32_t nvt_flash_proc_init(void) #endif #if WAKEUP_GESTURE -#define GESTURE_WORD_C 12 -#define GESTURE_WORD_W 13 -#define GESTURE_WORD_V 14 -#define GESTURE_DOUBLE_CLICK 15 -#define GESTURE_WORD_Z 16 -#define GESTURE_WORD_M 17 -#define GESTURE_WORD_O 18 -#define GESTURE_WORD_e 19 -#define GESTURE_WORD_S 20 -#define GESTURE_SLIDE_UP 21 -#define GESTURE_SLIDE_DOWN 22 -#define GESTURE_SLIDE_LEFT 23 -#define GESTURE_SLIDE_RIGHT 24 +#define GESTURE_WORD_C 12 +#define GESTURE_WORD_W 13 +#define GESTURE_WORD_V 14 +#define GESTURE_DOUBLE_CLICK 15 +#define GESTURE_WORD_Z 16 +#define GESTURE_WORD_M 17 +#define GESTURE_WORD_O 18 +#define GESTURE_WORD_e 19 +#define GESTURE_WORD_S 20 +#define GESTURE_SLIDE_UP 21 +#define GESTURE_SLIDE_DOWN 22 +#define GESTURE_SLIDE_LEFT 23 +#define GESTURE_SLIDE_RIGHT 24 +/* customized gesture id */ +#define DATA_PROTOCOL 30 + +/* function page definition */ +#define FUNCPAGE_GESTURE 1 static struct wake_lock gestrue_wakelock; @@ -795,9 +634,19 @@ Description: return: n.a. *******************************************************/ -void nvt_ts_wakeup_gesture_report(uint8_t gesture_id) +void nvt_ts_wakeup_gesture_report(uint8_t gesture_id, uint8_t *data) { uint32_t keycode = 0; + uint8_t func_type = data[2]; + uint8_t func_id = data[3]; + + /* support fw specifal data protocol */ + if ((gesture_id == DATA_PROTOCOL) && (func_type == FUNCPAGE_GESTURE)) { + gesture_id = func_id; + } else if (gesture_id > DATA_PROTOCOL) { + NVT_ERR("gesture_id %d is invalid, func_type=%d, func_id=%d\n", gesture_id, func_type, func_id); + return; + } NVT_LOG("gesture_id = %d\n", gesture_id); @@ -919,12 +768,12 @@ err_request_irq_gpio: #if NVT_TOUCH_ESD_PROTECT void nvt_esd_check_enable(uint8_t enable) { - /* enable/disable esd check flag */ - esd_check = enable; /* update interrupt timer */ irq_timer = jiffies; /* clear esd_retry counter, if protect function is enabled */ esd_retry = enable ? 0 : esd_retry; + /* enable/disable esd check flag */ + esd_check = enable; } static uint8_t nvt_fw_recovery(uint8_t *point_data) @@ -947,7 +796,6 @@ static void nvt_esd_check_func(struct work_struct *work) { unsigned int timer = jiffies_to_msecs(jiffies - irq_timer); - if (esd_retry >= esd_retry_max) nvt_esd_check_enable(false); @@ -965,7 +813,7 @@ static void nvt_esd_check_func(struct work_struct *work) queue_delayed_work(nvt_esd_check_wq, &nvt_esd_check_work, msecs_to_jiffies(NVT_TOUCH_ESD_CHECK_PERIOD)); } -#endif +#endif /* #if NVT_TOUCH_ESD_PROTECT */ #define POINT_DATA_LEN 65 /******************************************************* @@ -1000,7 +848,6 @@ static void nvt_ts_work_func(struct work_struct *work) } #if NVT_TOUCH_ESD_PROTECT - if (nvt_fw_recovery(point_data)) { nvt_esd_check_enable(true); goto XFER_ERROR; @@ -1010,7 +857,7 @@ static void nvt_ts_work_func(struct work_struct *work) #if WAKEUP_GESTURE if (bTouchIsAwake == 0) { input_id = (uint8_t)(point_data[1] >> 3); - nvt_ts_wakeup_gesture_report(input_id); + nvt_ts_wakeup_gesture_report(input_id, point_data); enable_irq(ts->client->irq); mutex_unlock(&ts->lock); return; @@ -1027,8 +874,8 @@ static void nvt_ts_work_func(struct work_struct *work) if (((point_data[position] & 0x07) == 0x01) || ((point_data[position] & 0x07) == 0x02)) { #if NVT_TOUCH_ESD_PROTECT - /* update interrupt timer */ - irq_timer = jiffies; + /* update interrupt timer */ + irq_timer = jiffies; #endif input_x = (uint32_t)(point_data[position + 1] << 4) + (uint32_t) (point_data[position + 3] >> 4); input_y = (uint32_t)(point_data[position + 2] << 4) + (uint32_t) (point_data[position + 3] & 0x0F); @@ -1092,6 +939,10 @@ static void nvt_ts_work_func(struct work_struct *work) #if TOUCH_KEY_NUM > 0 if (point_data[61] == 0xF8) { +#if NVT_TOUCH_ESD_PROTECT + /* update interrupt timer */ + irq_timer = jiffies; +#endif /* #if NVT_TOUCH_ESD_PROTECT */ for (i = 0; i < ts->max_button_num; i++) { input_report_key(ts->input_dev, touch_key_array[i], ((point_data[62] >> i) & 0x01)); } @@ -1132,7 +983,6 @@ static irqreturn_t nvt_ts_irq_handler(int32_t irq, void *dev_id) return IRQ_HANDLED; } - /******************************************************* Description: Novatek touchscreen check and stop crc reboot loop. @@ -1145,29 +995,36 @@ void nvt_stop_crc_reboot(void) uint8_t buf[8] = {0}; int32_t retry = 0; + /* read dummy buffer to check CRC fail reboot is happening or not*/ + + /* ---change I2C index to prevent geting 0xFF, but not 0xFC---*/ buf[0] = 0xFF; buf[1] = 0x01; buf[2] = 0xF6; CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3); + /* ---read to check if buf is 0xFC which means IC is in CRC reboot ---*/ buf[0] = 0x4E; CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 4); - if (((buf[1] == 0xFC) && (buf[2] == 0xFC) && (buf[3] == 0xFC)) || + if ((buf[1] == 0xFC) || ((buf[1] == 0xFF) && (buf[2] == 0xFF) && (buf[3] == 0xFF))) { - /* IC is in CRC fail reboot loop, needs to be stopped! */ + /* IC is in CRC fail reboot loop, needs to be stopped!*/ for (retry = 5; retry > 0; retry--) { + /* ---write i2c cmds to reset idle : 1st---*/ buf[0] = 0x00; buf[1] = 0xA5; CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + /* ---write i2c cmds to reset idle : 2rd---*/ buf[0] = 0x00; buf[1] = 0xA5; CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); msleep(1); + /* ---clear CRC_ERR_FLAG---*/ buf[0] = 0xFF; buf[1] = 0x03; buf[2] = 0xF1; @@ -1177,6 +1034,7 @@ void nvt_stop_crc_reboot(void) buf[1] = 0xA5; CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 2); + /* ---check CRC_ERR_FLAG---*/ buf[0] = 0xFF; buf[1] = 0x03; buf[2] = 0xF1; @@ -1211,11 +1069,31 @@ static int8_t nvt_ts_check_chip_ver_trim(void) int32_t i = 0; int32_t found_nvt_chip = 0; int32_t ret = -1; +#if NVT_TOUCH_FW + const char* product_id_table[] = { + "NT36572A", /* 0*/ + "NT36672A", + "NT36682A", + "NT36670A", + "NT36670B", + "NT36772A", /* 5*/ + "NT36772", + "NT36772", + "NT36772", + "NT36772", + "NT36772", /* 10*/ + "NT36670", + "NT36770", + "NT36672", + "NT36525", + "NT36870", /* 15*/ + "NT36676" + }; +#endif + nvt_bootloader_reset(); /* NOT in retry loop*/ - nvt_bootloader_reset(); - + //---Check for 5 times--- for (retry = 5; retry > 0; retry--) { - nvt_sw_reset_idle(); buf[0] = 0x00; @@ -1239,9 +1117,18 @@ static int8_t nvt_ts_check_chip_ver_trim(void) NVT_LOG("buf[1]=0x%02X, buf[2]=0x%02X, buf[3]=0x%02X, buf[4]=0x%02X, buf[5]=0x%02X, buf[6]=0x%02X\n", buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]); + /* ---Stop CRC check to prevent IC auto reboot---*/ + if ((buf[1] == 0xFC) || + ((buf[1] == 0xFF) && (buf[2] == 0xFF) && (buf[3] == 0xFF))) { + nvt_stop_crc_reboot(); + continue; + } + + /* compare read chip id on supported list*/ for (list = 0; list < (sizeof(trim_id_table) / sizeof(struct nvt_ts_trim_id_table)); list++) { found_nvt_chip = 0; + /* compare each byte*/ for (i = 0; i < NVT_ID_BYTE_MAX; i++) { if (trim_id_table[list].mask[i]) { if (buf[i + 1] != trim_id_table[list].id[i]) @@ -1256,15 +1143,7 @@ static int8_t nvt_ts_check_chip_ver_trim(void) if (found_nvt_chip) { NVT_LOG("This is NVT touch IC\n"); #if NVT_TOUCH_FW - if (list == 8) { - snprintf(ts->product_id, sizeof(ts->product_id), "NT36525"); - } else if (list == 9) { - snprintf(ts->product_id, sizeof(ts->product_id), "NT36870"); - } else if (list == 10) { - snprintf(ts->product_id, sizeof(ts->product_id), "NT36676F"); - } else { - snprintf(ts->product_id, sizeof(ts->product_id), "NT36772"); - } + snprintf(ts->product_id, sizeof(ts->product_id), product_id_table[list]); #endif ts->mmap = trim_id_table[list].mmap; ts->carrier_system = trim_id_table[list].carrier_system; @@ -1276,13 +1155,14 @@ static int8_t nvt_ts_check_chip_ver_trim(void) } } - if (((buf[1] == 0xFC) && (buf[2] == 0xFC) && (buf[3] == 0xFC)) || - ((buf[1] == 0xFF) && (buf[2] == 0xFF) && (buf[3] == 0xFF))) { - nvt_stop_crc_reboot(); - } msleep(10); } +#if NVT_TOUCH_FW + if (ret == -1) { + snprintf(ts->product_id, sizeof(ts->product_id), "NA"); + } +#endif out: return ret; } @@ -1313,8 +1193,10 @@ static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_i ts->client = client; i2c_set_clientdata(client, ts); + /*---parse dts---*/ nvt_parse_dt(&client->dev); + /*---request and config GPIOs---*/ ret = nvt_gpio_config(ts); if (ret) { NVT_ERR("gpio config error!\n"); @@ -1327,14 +1209,17 @@ static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_i NVT_LOG("pinctrl failed err %ld\n", error); } + /*---check i2c func.---*/ if (!i2c_check_functionality(client->adapter, I2C_FUNC_I2C)) { NVT_ERR("i2c_check_functionality failed. (no I2C_FUNC_I2C)\n"); ret = -ENODEV; goto err_check_functionality_failed; } + /* need 10ms delay after POR(power on reset)*/ msleep(10); + /*---check chip version trim---*/ ret = nvt_ts_check_chip_ver_trim(); if (ret) { NVT_ERR("chip is not identified\n"); @@ -1350,6 +1235,7 @@ static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_i nvt_get_fw_info(); mutex_unlock(&ts->lock); + /*---create workqueue---*/ nvt_wq = create_workqueue("nvt_wq"); if (!nvt_wq) { NVT_ERR("nvt_wq create workqueue failed\n"); @@ -1358,6 +1244,7 @@ static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_i } INIT_WORK(&ts->nvt_work, nvt_ts_work_func); + /*---allocate input device---*/ ts->input_dev = input_allocate_device(); if (ts->input_dev == NULL) { NVT_ERR("allocate input device failed\n"); @@ -1373,6 +1260,7 @@ static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_i ts->int_trigger_type = INT_TRIGGER_TYPE; + /*---set input device info.---*/ ts->input_dev->evbit[0] = BIT_MASK(EV_SYN) | BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS) ; ts->input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH); ts->input_dev->propbit[0] = BIT(INPUT_PROP_DIRECT); @@ -1381,18 +1269,19 @@ static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_i input_mt_init_slots(ts->input_dev, ts->max_touch_num, 0); #endif - input_set_abs_params(ts->input_dev, ABS_MT_PRESSURE, 0, TOUCH_FORCE_NUM, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_PRESSURE, 0, TOUCH_FORCE_NUM, 0, 0); /*pressure = TOUCH_FORCE_NUM*/ #if TOUCH_MAX_FINGER_NUM > 1 - input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); + input_set_abs_params(ts->input_dev, ABS_MT_TOUCH_MAJOR, 0, 255, 0, 0); /*area = 255*/ input_set_abs_params(ts->input_dev, ABS_MT_POSITION_X, 0, ts->abs_x_max, 0, 0); input_set_abs_params(ts->input_dev, ABS_MT_POSITION_Y, 0, ts->abs_y_max, 0, 0); #if MT_PROTOCOL_B + /* no need to set ABS_MT_TRACKING_ID, input_mt_init_slots() already set it*/ #else input_set_abs_params(ts->input_dev, ABS_MT_TRACKING_ID, 0, ts->max_touch_num, 0, 0); -#endif -#endif +#endif /*MT_PROTOCOL_B*/ +#endif /*TOUCH_MAX_FINGER_NUM > 1*/ #if TOUCH_KEY_NUM > 0 for (retry = 0; retry < ts->max_button_num; retry++) { @@ -1412,12 +1301,14 @@ static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_i ts->input_dev->phys = ts->phys; ts->input_dev->id.bustype = BUS_I2C; + /*---register input device---*/ ret = input_register_device(ts->input_dev); if (ret) { NVT_ERR("register input device (%s) failed. ret=%d\n", ts->input_dev->name, ret); goto err_input_register_device_failed; } + /*---set int-pin & request irq---*/ client->irq = gpio_to_irq(ts->irq_gpio); if (client->irq) { NVT_LOG("int_trigger_type=%d\n", ts->int_trigger_type); @@ -1444,6 +1335,7 @@ static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_i goto err_create_nvt_fwu_wq_failed; } INIT_DELAYED_WORK(&ts->nvt_fwu_work, Boot_Update_Firmware); + /* please make sure boot update start after display reset(RESX) sequence*/ queue_delayed_work(nvt_fwu_wq, &ts->nvt_fwu_work, msecs_to_jiffies(14000)); #endif @@ -1453,7 +1345,7 @@ static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_i queue_delayed_work(nvt_esd_check_wq, &nvt_esd_check_work, msecs_to_jiffies(NVT_TOUCH_ESD_CHECK_PERIOD)); #endif - + /*---set device node---*/ #if NVT_TOUCH_PROC ret = nvt_flash_proc_init(); if (ret != 0) { @@ -1601,15 +1493,17 @@ static int32_t nvt_ts_suspend(struct device *dev) ts->suspended = 1; #endif bTouchIsAwake = 0; + #if NVT_TOUCH_ESD_PROTECT cancel_delayed_work_sync(&nvt_esd_check_work); nvt_esd_check_enable(false); #endif #if WAKEUP_GESTURE + /*---write i2c command to enter "wakeup gesture mode"---*/ buf[0] = EVENT_MAP_HOST_CMD; buf[1] = 0x13; -#if 0 +#if 0 /* Do not set 0xFF first, ToDo*/ buf[2] = 0xFF; buf[3] = 0xFF; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 4); @@ -1621,13 +1515,14 @@ static int32_t nvt_ts_suspend(struct device *dev) NVT_LOG("Enabled touch wakeup gesture\n"); -#else +#else /* WAKEUP_GESTURE*/ disable_irq(ts->client->irq); + /*---write i2c command to enter "deep sleep mode"---*/ buf[0] = EVENT_MAP_HOST_CMD; buf[1] = 0x11; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2); -#endif +#endif /* WAKEUP_GESTURE*/ /* release all touches */ #if MT_PROTOCOL_B @@ -1675,10 +1570,11 @@ static int32_t nvt_ts_resume(struct device *dev) NVT_LOG("start\n"); + /* please make sure display reset(RESX) sequence and mipi dsi cmds sent before this*/ nvt_bootloader_reset(); res = nvt_check_fw_reset_state(RESET_STATE_REK); - NVT_ERR("xlixiang---enter-%s-----res=%d\n", __func__, res); + NVT_LOG("enter-%s-----res=%d\n", __func__, res); #if !WAKEUP_GESTURE enable_irq(ts->client->irq); @@ -1717,7 +1613,7 @@ static int fb_notifier_callback(struct notifier_block *self, unsigned long event } else if (evdata && evdata->data && event == FB_EVENT_BLANK) { blank = evdata->data; if (*blank == FB_BLANK_UNBLANK || - (*blank == FB_BLANK_NORMAL && 0 == bTouchIsAwake)) { + (*blank == FB_BLANK_NORMAL && 0 == bTouchIsAwake)) { nvt_ts_resume(&ts->client->dev); } } @@ -1806,13 +1702,14 @@ static int32_t __init nvt_driver_init(void) int32_t ret = 0; NVT_LOG("start\n"); + /*---add i2c driver---*/ ret = i2c_add_driver(&nvt_i2c_driver); if (ret) { pr_err("%s: failed to add i2c driver", __func__); goto err_driver; } - pr_info("%s: finished\n", __func__); + NVT_LOG("%s: finished\n", __func__); err_driver: return ret; @@ -1836,6 +1733,7 @@ static void __exit nvt_driver_exit(void) if (nvt_fwu_wq) destroy_workqueue(nvt_fwu_wq); #endif + #if NVT_TOUCH_ESD_PROTECT if (nvt_esd_check_wq) destroy_workqueue(nvt_esd_check_wq); diff --git a/drivers/input/touchscreen/nova_mmi/nt36xxx.h b/drivers/input/touchscreen/nova_mmi/nt36xxx.h index 739283f1ddb6..59a7778cfe86 100644 --- a/drivers/input/touchscreen/nova_mmi/nt36xxx.h +++ b/drivers/input/touchscreen/nova_mmi/nt36xxx.h @@ -15,8 +15,8 @@ * more details. * */ -#ifndef _LINUX_NVT_TOUCH_H -#define _LINUX_NVT_TOUCH_H +#ifndef _LINUX_NVT_TOUCH_H +#define _LINUX_NVT_TOUCH_H #include #include @@ -25,12 +25,19 @@ #include #endif -#define NVT_DEBUG 1 +#include "nt36xxx_mem_map.h" +#define NVT_DEBUG 0 + +/*---GPIO number---*/ #define NVTTOUCH_INT_PIN 943 + +/*---INT trigger mode---*/ #define INT_TRIGGER_TYPE IRQ_TYPE_EDGE_RISING + +/*---I2C driver info.---*/ #define NVT_I2C_NAME "NVT-ts" #define I2C_BLDR_Address 0x01 #define I2C_FW_Address 0x01 @@ -39,12 +46,15 @@ #if NVT_DEBUG #define NVT_LOG(fmt, args...) pr_err("[%s] %s %d: " fmt, NVT_I2C_NAME, __func__, __LINE__, ##args) #else -#define NVT_LOG(fmt, args...) pr_info("[%s] %s %d: " fmt, NVT_I2C_NAME, __func__, __LINE__, ##args) +#define NVT_LOG(fmt, args...) pr_debug("[%s] %s %d: " fmt, NVT_I2C_NAME, __func__, __LINE__, ##args) #endif #define NVT_ERR(fmt, args...) pr_err("[%s] %s %d: " fmt, NVT_I2C_NAME, __func__, __LINE__, ##args) +/*---Input device info.---*/ #define NVT_TS_NAME "NVTCapacitiveTouchScreen" + +/*---Touch info.---*/ #define TOUCH_DEFAULT_MAX_WIDTH 1080 #define TOUCH_DEFAULT_MAX_HEIGHT 2246 #define TOUCH_MAX_FINGER_NUM 10 @@ -54,6 +64,7 @@ extern const uint16_t touch_key_array[TOUCH_KEY_NUM]; #endif #define TOUCH_FORCE_NUM 1000 +/*---Customerized func.---*/ #define NVT_TOUCH_PROC 1 #define NVT_TOUCH_EXT_PROC 1 #define NVT_TOUCH_FW 1 @@ -70,32 +81,6 @@ extern const uint16_t gesture_key_array[]; #define NVT_TOUCH_ESD_PROTECT 1 #define NVT_TOUCH_ESD_CHECK_PERIOD 2000 /* ms */ -struct nvt_ts_mem_map { - uint32_t EVENT_BUF_ADDR; - uint32_t RAW_PIPE0_ADDR; - uint32_t RAW_PIPE0_Q_ADDR; - uint32_t RAW_PIPE1_ADDR; - uint32_t RAW_PIPE1_Q_ADDR; - uint32_t BASELINE_ADDR; - uint32_t BASELINE_Q_ADDR; - uint32_t BASELINE_BTN_ADDR; - uint32_t BASELINE_BTN_Q_ADDR; - uint32_t DIFF_PIPE0_ADDR; - uint32_t DIFF_PIPE0_Q_ADDR; - uint32_t DIFF_PIPE1_ADDR; - uint32_t DIFF_PIPE1_Q_ADDR; - uint32_t RAW_BTN_PIPE0_ADDR; - uint32_t RAW_BTN_PIPE0_Q_ADDR; - uint32_t RAW_BTN_PIPE1_ADDR; - uint32_t RAW_BTN_PIPE1_Q_ADDR; - uint32_t DIFF_BTN_PIPE0_ADDR; - uint32_t DIFF_BTN_PIPE0_Q_ADDR; - uint32_t DIFF_BTN_PIPE1_ADDR; - uint32_t DIFF_BTN_PIPE1_Q_ADDR; - uint32_t READ_FLASH_CHECKSUM_ADDR; - uint32_t RW_FLASH_DATA_ADDR; -}; - struct nvt_ts_data { struct i2c_client *client; struct input_dev *input_dev; @@ -145,9 +130,9 @@ struct nvt_flash_data{ #endif typedef enum { - RESET_STATE_INIT = 0xA0, - RESET_STATE_REK, - RESET_STATE_REK_FINISH, + RESET_STATE_INIT = 0xA0,/* IC reset*/ + RESET_STATE_REK, /* ReK baseline*/ + RESET_STATE_REK_FINISH, /* baseline is ready*/ RESET_STATE_NORMAL_RUN, RESET_STATE_MAX = 0xAF } RST_COMPLETE_STATE; @@ -178,8 +163,10 @@ typedef enum { } MP_TEST_RESULT; #endif +/*---extern structures---*/ extern struct nvt_ts_data *ts; +/*---extern functions---*/ extern int32_t CTP_I2C_READ(struct i2c_client *client, uint16_t address, uint8_t *buf, uint16_t len); extern int32_t CTP_I2C_WRITE(struct i2c_client *client, uint16_t address, uint8_t *buf, uint16_t len); extern void nvt_bootloader_reset(void); @@ -188,9 +175,9 @@ extern int32_t nvt_check_fw_reset_state(RST_COMPLETE_STATE check_reset_state); extern int32_t nvt_get_fw_info(void); extern int32_t nvt_clear_fw_status(void); extern int32_t nvt_check_fw_status(void); - #if NVT_TOUCH_ESD_PROTECT extern void nvt_esd_check_enable(uint8_t enable); -#endif +#endif /* #if NVT_TOUCH_ESD_PROTECT */ +extern void nvt_stop_crc_reboot(void); #endif /* _LINUX_NVT_TOUCH_H */ diff --git a/drivers/input/touchscreen/nova_mmi/nt36xxx_ext_proc.c b/drivers/input/touchscreen/nova_mmi/nt36xxx_ext_proc.c index b5d7c28ecf51..7943fc3d5dbe 100644 --- a/drivers/input/touchscreen/nova_mmi/nt36xxx_ext_proc.c +++ b/drivers/input/touchscreen/nova_mmi/nt36xxx_ext_proc.c @@ -60,11 +60,13 @@ void nvt_change_mode(uint8_t mode) { uint8_t buf[8] = {0}; + /*---set xdata index to EVENT BUF ADDR---*/ buf[0] = 0xFF; buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---set mode---*/ buf[0] = EVENT_MAP_HOST_CMD; buf[1] = mode; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2); @@ -88,15 +90,19 @@ uint8_t nvt_get_fw_pipe(void) { uint8_t buf[8] = {0}; + /*---set xdata index to EVENT BUF ADDR---*/ buf[0] = 0xFF; buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---read fw status---*/ buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE; buf[1] = 0x00; CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 2); + /*NVT_LOG("FW pipe=%d, buf[1]=0x%02X\n", (buf[1]&0x01), buf[1]);*/ + return (buf[1] & 0x01); } @@ -119,6 +125,7 @@ int32_t nvt_read_mass_data(uint8_t i2c_addr, uint8_t *temp_buf, uint32_t count) int32_t data_len = 0; int32_t residual_len = 0; + /*---set xdata sector address & length---*/ xdata_addr = (temp_buf[3] << 24) + (temp_buf[4] << 16) + (temp_buf[5] << 8) + temp_buf[6]; head_addr = xdata_addr - (xdata_addr % XDATA_SECTOR_SIZE); dummy_len = xdata_addr - head_addr; @@ -128,39 +135,61 @@ int32_t nvt_read_mass_data(uint8_t i2c_addr, uint8_t *temp_buf, uint32_t count) if (data_len > XDATA_BUF_SIZE) return -EINVAL; + /*NVT_LOG("head_addr=0x%05X, dummy_len=0x%05X, data_len=0x%05X, residual_len=0x%05X\n", head_addr, dummy_len, data_len, residual_len);*/ + + /*read xdata : step 1*/ for (i = 0; i < ((dummy_len + data_len) / XDATA_SECTOR_SIZE); i++) { + /*---change xdata index---*/ i2c_buf[0] = 0xFF; i2c_buf[1] = ((head_addr + XDATA_SECTOR_SIZE * i) >> 16) & 0xFF; i2c_buf[2] = ((head_addr + XDATA_SECTOR_SIZE * i) >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, (uint16_t)i2c_addr, i2c_buf, 3); + + /*---read xdata by I2C_TANSFER_LENGTH*/ for (j = 0; j < (XDATA_SECTOR_SIZE / I2C_TANSFER_LENGTH); j++) { + /*---read data---*/ i2c_buf[0] = I2C_TANSFER_LENGTH * j; CTP_I2C_READ(ts->client, (uint16_t)i2c_addr, i2c_buf, I2C_TANSFER_LENGTH + 1); + + /*---copy buf to xdata_tmp---*/ for (k = 0; k < I2C_TANSFER_LENGTH; k++) { xdata_tmp[XDATA_SECTOR_SIZE * i + I2C_TANSFER_LENGTH * j + k] = i2c_buf[k + 1]; + //NVT_LOG("0x%02X, 0x%04X\n", i2c_buf[k+1], (XDATA_SECTOR_SIZE*i + I2C_TANSFER_LENGTH*j + k)); } } + /*NVT_LOG("addr=0x%05X\n", (head_addr+XDATA_SECTOR_SIZE*i));*/ } + /*read xdata : step2*/ if (residual_len != 0) { + /*---change xdata index---*/ i2c_buf[0] = 0xFF; i2c_buf[1] = ((xdata_addr + data_len - residual_len) >> 16) & 0xFF; i2c_buf[2] = ((xdata_addr + data_len - residual_len) >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, (uint16_t)i2c_addr, i2c_buf, 3); + + /*---read xdata by I2C_TANSFER_LENGTH*/ for (j = 0; j < (residual_len / I2C_TANSFER_LENGTH + 1); j++) { + /*---read data---*/ i2c_buf[0] = I2C_TANSFER_LENGTH * j; CTP_I2C_READ(ts->client, (uint16_t)i2c_addr, i2c_buf, I2C_TANSFER_LENGTH + 1); + + /*---copy buf to xdata_tmp---*/ for (k = 0; k < I2C_TANSFER_LENGTH; k++) { xdata_tmp[(dummy_len + data_len - residual_len) + I2C_TANSFER_LENGTH * j + k] = i2c_buf[k + 1]; + /*printk("0x%02X, 0x%04x\n", buf[k+1], ((dummy_len+data_len-residual_len) + I2C_TANSFER_LENGTH*j + k));*/ } } + /*printk("addr=0x%05X\n", (xdata_addr+data_len-residual_len));*/ } + /*---set xdata index to EVENT BUF ADDR---*/ i2c_buf[0] = 0xFF; i2c_buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; i2c_buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, (uint16_t)i2c_addr, i2c_buf, 3); + /*---remove dummy data and copy to caller buffer---*/ for (i = 0; i < data_len; i++) { *(temp_buf + i) = xdata_tmp[dummy_len + i]; } @@ -186,61 +215,84 @@ void nvt_read_mdata(uint32_t xdata_addr, uint32_t xdata_btn_addr) int32_t data_len = 0; int32_t residual_len = 0; + /*---set xdata sector address & length---*/ head_addr = xdata_addr - (xdata_addr % XDATA_SECTOR_SIZE); dummy_len = xdata_addr - head_addr; data_len = ts->x_num * ts->y_num * 2; residual_len = (head_addr + dummy_len + data_len) % XDATA_SECTOR_SIZE; + /*printk("head_addr=0x%05X, dummy_len=0x%05X, data_len=0x%05X, residual_len=0x%05X\n", head_addr, dummy_len, data_len, residual_len);*/ + + /*read xdata : step 1*/ for (i = 0; i < ((dummy_len + data_len) / XDATA_SECTOR_SIZE); i++) { + /*---change xdata index---*/ buf[0] = 0xFF; buf[1] = ((head_addr + XDATA_SECTOR_SIZE * i) >> 16) & 0xFF; buf[2] = ((head_addr + XDATA_SECTOR_SIZE * i) >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---read xdata by I2C_TANSFER_LENGTH*/ for (j = 0; j < (XDATA_SECTOR_SIZE / I2C_TANSFER_LENGTH); j++) { + /*---read data---*/ buf[0] = I2C_TANSFER_LENGTH * j; CTP_I2C_READ(ts->client, I2C_FW_Address, buf, I2C_TANSFER_LENGTH + 1); + /*---copy buf to xdata_tmp---*/ for (k = 0; k < I2C_TANSFER_LENGTH; k++) { xdata_tmp[XDATA_SECTOR_SIZE * i + I2C_TANSFER_LENGTH * j + k] = buf[k + 1]; + /*printk("0x%02X, 0x%04X\n", buf[k+1], (XDATA_SECTOR_SIZE*i + I2C_TANSFER_LENGTH*j + k));*/ } } + /*printk("addr=0x%05X\n", (head_addr+XDATA_SECTOR_SIZE*i));*/ } + /*read xdata : step2*/ if (residual_len != 0) { + /*---change xdata index---*/ buf[0] = 0xFF; buf[1] = ((xdata_addr + data_len - residual_len) >> 16) & 0xFF; buf[2] = ((xdata_addr + data_len - residual_len) >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---read xdata by I2C_TANSFER_LENGTH*/ for (j = 0; j < (residual_len / I2C_TANSFER_LENGTH + 1); j++) { + /*---read data---*/ buf[0] = I2C_TANSFER_LENGTH * j; CTP_I2C_READ(ts->client, I2C_FW_Address, buf, I2C_TANSFER_LENGTH + 1); + /*---copy buf to xdata_tmp---*/ for (k = 0; k < I2C_TANSFER_LENGTH; k++) { xdata_tmp[(dummy_len + data_len - residual_len) + I2C_TANSFER_LENGTH * j + k] = buf[k + 1]; + /*printk("0x%02X, 0x%04x\n", buf[k+1], ((dummy_len+data_len-residual_len) + I2C_TANSFER_LENGTH*j + k));*/ } } + /*printk("addr=0x%05X\n", (xdata_addr+data_len-residual_len));*/ } + /*---remove dummy data and 2bytes-to-1data---*/ for (i = 0; i < (data_len / 2); i++) { xdata[i] = (int16_t)(xdata_tmp[dummy_len + i * 2] + 256 * xdata_tmp[dummy_len + i * 2 + 1]); } #if TOUCH_KEY_NUM > 0 + /*read button xdata : step3*/ + /*---change xdata index---*/ buf[0] = 0xFF; buf[1] = (xdata_btn_addr >> 16) & 0xFF; buf[2] = ((xdata_btn_addr >> 8) & 0xFF); CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---read data---*/ buf[0] = (xdata_btn_addr & 0xFF); CTP_I2C_READ(ts->client, I2C_FW_Address, buf, (TOUCH_KEY_NUM * 2 + 1)); + /*---2bytes-to-1data---*/ for (i = 0; i < TOUCH_KEY_NUM; i++) { xdata[ts->x_num * ts->y_num + i] = (int16_t)(buf[1 + i * 2] + 256 * buf[1 + i * 2 + 1]); } #endif + /*---set xdata index to EVENT BUF ADDR---*/ buf[0] = 0xFF; buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; diff --git a/drivers/input/touchscreen/nova_mmi/nt36xxx_fw_update.c b/drivers/input/touchscreen/nova_mmi/nt36xxx_fw_update.c index be3b910db923..7d08169c6ba6 100644 --- a/drivers/input/touchscreen/nova_mmi/nt36xxx_fw_update.c +++ b/drivers/input/touchscreen/nova_mmi/nt36xxx_fw_update.c @@ -31,7 +31,7 @@ #define SIZE_64KB 65536 #define BLOCK_64KB_NUM 4 -const struct firmware *fw_entry; +const struct firmware *fw_entry = NULL; /******************************************************* Description: @@ -56,11 +56,13 @@ int32_t update_firmware_request(char *filename) return ret; } + /* check bin file size (116kb)*/ if (fw_entry->size != FW_BIN_SIZE) { NVT_ERR("bin file size not match. (%zu)\n", fw_entry->size); return -EINVAL; } + /* check if FW version add FW version bar equals 0xFF*/ if (*(fw_entry->data + FW_BIN_VER_OFFSET) + *(fw_entry->data + FW_BIN_VER_BAR_OFFSET) != 0xFF) { NVT_ERR("bin file FW_VER + FW_VER_BAR should be 0xFF!\n"); NVT_ERR("FW_VER=0x%02X, FW_VER_BAR=0x%02X\n", *(fw_entry->data+FW_BIN_VER_OFFSET), *(fw_entry->data+FW_BIN_VER_BAR_OFFSET)); @@ -98,6 +100,7 @@ int32_t Check_FW_Ver(void) uint8_t buf[16] = {0}; int32_t ret = 0; + /*write i2c index to EVENT BUF ADDR*/ buf[0] = 0xFF; buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; @@ -107,6 +110,7 @@ int32_t Check_FW_Ver(void) return ret; } + /*read Firmware Version*/ buf[0] = EVENT_MAP_FWINFO; buf[1] = 0x00; buf[2] = 0x00; @@ -120,11 +124,13 @@ int32_t Check_FW_Ver(void) NVT_LOG("Bin FW Ver = 0x%02X, FW ver Bar = 0x%02X\n", fw_entry->data[FW_BIN_VER_OFFSET], fw_entry->data[FW_BIN_VER_BAR_OFFSET]); + /* check IC FW_VER + FW_VER_BAR equals 0xFF or not, need to update if not*/ if ((buf[1] + buf[2]) != 0xFF) { NVT_ERR("IC FW_VER + FW_VER_BAR not equals to 0xFF!\n"); return 0; } + /* compare IC and binary FW version*/ if (buf[1] == fw_entry->data[FW_BIN_VER_OFFSET]) return 1; else @@ -144,6 +150,7 @@ int32_t Resume_PD(void) int32_t ret = 0; int32_t retry = 0; + /* Resume Command*/ buf[0] = 0x00; buf[1] = 0xAB; ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); @@ -152,6 +159,7 @@ int32_t Resume_PD(void) return ret; } + /* Check 0xAA (Resume Command)*/ retry = 0; while (1) { msleep(1); @@ -207,6 +215,7 @@ int32_t Check_CheckSum(void) for (i = 0; i < BLOCK_64KB_NUM; i++) { if (fw_bin_size > (i * SIZE_64KB)) { + /* Calculate WR_Filechksum of each 64KB block*/ len_in_blk = min(fw_bin_size - i * SIZE_64KB, (size_t)SIZE_64KB); WR_Filechksum[i] = i + 0x00 + 0x00 + (((len_in_blk - 1) >> 8) & 0xFF) + ((len_in_blk - 1) & 0xFF); for (k = 0; k < len_in_blk; k++) { @@ -214,6 +223,7 @@ int32_t Check_CheckSum(void) } WR_Filechksum[i] = 65535 - WR_Filechksum[i] + 1; + /* Fast Read Command*/ buf[0] = 0x00; buf[1] = 0x07; buf[2] = i; @@ -226,6 +236,7 @@ int32_t Check_CheckSum(void) NVT_ERR("Fast Read Command error!!(%d)\n", ret); return ret; } + /* Check 0xAA (Fast Read Command)*/ retry = 0; while (1) { msleep(80); @@ -245,6 +256,7 @@ int32_t Check_CheckSum(void) return -1; } } + /* Read Checksum (write addr high byte & middle byte)*/ buf[0] = 0xFF; buf[1] = XDATA_Addr >> 16; buf[2] = (XDATA_Addr >> 8) & 0xFF; @@ -253,6 +265,7 @@ int32_t Check_CheckSum(void) NVT_ERR("Read Checksum (write addr high byte & middle byte) error!!(%d)\n", ret); return ret; } + /* Read Checksum*/ buf[0] = (XDATA_Addr) & 0xFF; buf[1] = 0x00; buf[2] = 0x00; @@ -289,8 +302,10 @@ int32_t Init_BootLoader(void) int32_t ret = 0; int32_t retry = 0; + /* SW Reset & Idle*/ nvt_sw_reset_idle(); + /* Initiate Flash Block*/ buf[0] = 0x00; buf[1] = 0x00; buf[2] = I2C_FW_Address; @@ -300,6 +315,7 @@ int32_t Init_BootLoader(void) return ret; } + /* Check 0xAA (Initiate Flash Block)*/ retry = 0; while (1) { msleep(1); @@ -342,6 +358,7 @@ int32_t Erase_Flash(void) int32_t Flash_Address = 0; int32_t retry = 0; + /* Write Enable*/ buf[0] = 0x00; buf[1] = 0x06; ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); @@ -349,6 +366,7 @@ int32_t Erase_Flash(void) NVT_ERR("Write Enable (for Write Status Register) error!!(%d)\n", ret); return ret; } + /* Check 0xAA (Write Enable)*/ retry = 0; while (1) { mdelay(1); @@ -369,6 +387,7 @@ int32_t Erase_Flash(void) } } + /* Write Status Register*/ buf[0] = 0x00; buf[1] = 0x01; buf[2] = 0x00; @@ -377,6 +396,7 @@ int32_t Erase_Flash(void) NVT_ERR("Write Status Register error!!(%d)\n", ret); return ret; } + /* Check 0xAA (Write Status Register)*/ retry = 0; while (1) { mdelay(1); @@ -397,6 +417,7 @@ int32_t Erase_Flash(void) } } + /* Read Status*/ retry = 0; while (1) { mdelay(5); @@ -408,6 +429,7 @@ int32_t Erase_Flash(void) return ret; } + /* Check 0xAA (Read Status)*/ buf[0] = 0x00; buf[1] = 0x00; buf[2] = 0x00; @@ -431,7 +453,8 @@ int32_t Erase_Flash(void) else count = fw_entry->size / FLASH_SECTOR_SIZE; - for (i = 0; i < count; i++) { + for(i = 0; i < count; i++) { + /* Write Enable*/ buf[0] = 0x00; buf[1] = 0x06; ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); @@ -439,6 +462,7 @@ int32_t Erase_Flash(void) NVT_ERR("Write Enable error!!(%d,%d)\n", ret, i); return ret; } + /* Check 0xAA (Write Enable)*/ retry = 0; while (1) { mdelay(1); @@ -461,8 +485,9 @@ int32_t Erase_Flash(void) Flash_Address = i * FLASH_SECTOR_SIZE; + /* Sector Erase*/ buf[0] = 0x00; - buf[1] = 0x20; + buf[1] = 0x20; /* Command : Sector Erase*/ buf[2] = ((Flash_Address >> 16) & 0xFF); buf[3] = ((Flash_Address >> 8) & 0xFF); buf[4] = (Flash_Address & 0xFF); @@ -471,6 +496,7 @@ int32_t Erase_Flash(void) NVT_ERR("Sector Erase error!!(%d,%d)\n", ret, i); return ret; } + /* Check 0xAA (Sector Erase)*/ retry = 0; while (1) { mdelay(1); @@ -491,6 +517,7 @@ int32_t Erase_Flash(void) } } + /* Read Status*/ retry = 0; while (1) { mdelay(5); @@ -502,6 +529,7 @@ int32_t Erase_Flash(void) return ret; } + /* Check 0xAA (Read Status)*/ buf[0] = 0x00; buf[1] = 0x00; buf[2] = 0x00; @@ -543,6 +571,7 @@ int32_t Write_Flash(void) int32_t ret = 0; int32_t retry = 0; + /* change I2C buffer index*/ buf[0] = 0xFF; buf[1] = XDATA_Addr >> 16; buf[2] = (XDATA_Addr >> 8) & 0xFF; @@ -560,6 +589,7 @@ int32_t Write_Flash(void) for (i = 0; i < count; i++) { Flash_Address = i * 256; + /* Write Enable*/ buf[0] = 0x00; buf[1] = 0x06; ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); @@ -567,6 +597,7 @@ int32_t Write_Flash(void) NVT_ERR("Write Enable error!!(%d)\n", ret); return ret; } + /* Check 0xAA (Write Enable)*/ retry = 0; while (1) { udelay(100); @@ -587,6 +618,7 @@ int32_t Write_Flash(void) } } + /* Write Page : 256 bytes*/ for (j = 0; j < min(fw_entry->size - i * 256, (size_t)256); j += 32) { buf[0] = (XDATA_Addr + j) & 0xFF; for (k = 0; k < 32; k++) { @@ -608,6 +640,7 @@ int32_t Write_Flash(void) tmpvalue = 255 - tmpvalue + 1; + /* Page Program*/ buf[0] = 0x00; buf[1] = 0x02; buf[2] = ((Flash_Address >> 16) & 0xFF); @@ -621,6 +654,7 @@ int32_t Write_Flash(void) NVT_ERR("Page Program error!!(%d), i=%d\n", ret, i); return ret; } + /* Check 0xAA (Page Program)*/ retry = 0; while (1) { mdelay(1); @@ -645,6 +679,7 @@ int32_t Write_Flash(void) return -3; } + /* Read Status*/ retry = 0; while (1) { mdelay(5); @@ -656,6 +691,7 @@ int32_t Write_Flash(void) return ret; } + /* Check 0xAA (Read Status)*/ buf[0] = 0x00; buf[1] = 0x00; buf[2] = 0x00; @@ -711,6 +747,7 @@ int32_t Verify_Flash(void) for (i = 0; i < BLOCK_64KB_NUM; i++) { if (fw_bin_size > (i * SIZE_64KB)) { + /* Calculate WR_Filechksum of each 64KB block*/ len_in_blk = min(fw_bin_size - i * SIZE_64KB, (size_t)SIZE_64KB); WR_Filechksum[i] = i + 0x00 + 0x00 + (((len_in_blk - 1) >> 8) & 0xFF) + ((len_in_blk - 1) & 0xFF); for (k = 0; k < len_in_blk; k++) { @@ -718,6 +755,7 @@ int32_t Verify_Flash(void) } WR_Filechksum[i] = 65535 - WR_Filechksum[i] + 1; + /* Fast Read Command*/ buf[0] = 0x00; buf[1] = 0x07; buf[2] = i; @@ -730,6 +768,7 @@ int32_t Verify_Flash(void) NVT_ERR("Fast Read Command error!!(%d)\n", ret); return ret; } + /* Check 0xAA (Fast Read Command)*/ retry = 0; while (1) { msleep(80); @@ -749,6 +788,7 @@ int32_t Verify_Flash(void) return -1; } } + /* Read Checksum (write addr high byte & middle byte)*/ buf[0] = 0xFF; buf[1] = XDATA_Addr >> 16; buf[2] = (XDATA_Addr >> 8) & 0xFF; @@ -757,6 +797,7 @@ int32_t Verify_Flash(void) NVT_ERR("Read Checksum (write addr high byte & middle byte) error!!(%d)\n", ret); return ret; } + /* Read Checksum*/ buf[0] = (XDATA_Addr) & 0xFF; buf[1] = 0x00; buf[2] = 0x00; @@ -790,36 +831,143 @@ int32_t Update_Firmware(void) { int32_t ret = 0; + /* ---Stop CRC check to prevent IC auto reboot---*/ + nvt_stop_crc_reboot(); + + /* Step 1 : initial bootloader*/ ret = Init_BootLoader(); if (ret) { return ret; } + /* Step 2 : Resume PD*/ ret = Resume_PD(); if (ret) { return ret; } + /* Step 3 : Erase*/ ret = Erase_Flash(); if (ret) { return ret; } + /* Step 4 : Program*/ ret = Write_Flash(); if (ret) { return ret; } + /* Step 5 : Verify*/ ret = Verify_Flash(); if (ret) { return ret; } + /*Step 6 : Bootloader Reset*/ nvt_bootloader_reset(); nvt_check_fw_reset_state(RESET_STATE_INIT); return ret; } + +/******************************************************* +Description: + Novatek touchscreen check flash end flag function. + +return: + Executive outcomes. 0---succeed. 1,negative---failed. +*******************************************************/ +#define NVT_FLASH_END_FLAG_LEN 3 +#define NVT_FLASH_END_FLAG_ADDR 0x1AFFD +int32_t nvt_check_flash_end_flag(void) +{ + uint8_t buf[8] = {0}; + uint8_t nvt_end_flag[NVT_FLASH_END_FLAG_LEN + 1] = {0}; + int32_t ret = 0; + + /* Step 1 : initial bootloader*/ + ret = Init_BootLoader(); + if (ret) { + return ret; + } + + /* Step 2 : Resume PD*/ + ret = Resume_PD(); + if (ret) { + return ret; + } + + /* Step 3 : unlock*/ + buf[0] = 0x00; + buf[1] = 0x35; + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); + if (ret < 0) { + NVT_ERR("write unlock error!!(%d)\n", ret); + return ret; + } + msleep(10); + + /* Step 4 : Flash Read Command*/ + buf[0] = 0x00; + buf[1] = 0x03; + buf[2] = (NVT_FLASH_END_FLAG_ADDR >> 16) & 0xFF; //Addr_H + buf[3] = (NVT_FLASH_END_FLAG_ADDR >> 8) & 0xFF; //Addr_M + buf[4] = NVT_FLASH_END_FLAG_ADDR & 0xFF; //Addr_L + buf[5] = (NVT_FLASH_END_FLAG_LEN >> 8) & 0xFF; //Len_H + buf[6] = NVT_FLASH_END_FLAG_LEN & 0xFF; //Len_L + ret = CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 7); + if (ret < 0) { + NVT_ERR("write Read Command error!!(%d)\n", ret); + return ret; + } + msleep(10); + + /* Check 0xAA (Read Command)*/ + buf[0] = 0x00; + buf[1] = 0x00; + ret = CTP_I2C_READ(ts->client, I2C_HW_Address, buf, 2); + if (ret < 0) { + NVT_ERR("Check 0xAA (Read Command) error!!(%d)\n", ret); + return ret; + } + if (buf[1] != 0xAA) { + NVT_ERR("Check 0xAA (Read Command) error!! status=0x%02X\n", buf[1]); + return -1; + } + + msleep(10); + + /* Step 5 : Read Flash Data*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->READ_FLASH_CHECKSUM_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->READ_FLASH_CHECKSUM_ADDR >> 8) & 0xFF; + ret = CTP_I2C_WRITE(ts->client, I2C_BLDR_Address, buf, 3); + if (ret < 0) { + NVT_ERR("change index error!! (%d)\n", ret); + return ret; + } + msleep(10); + + /* Read Back*/ + buf[0] = ts->mmap->READ_FLASH_CHECKSUM_ADDR & 0xFF; + ret = CTP_I2C_READ(ts->client, I2C_BLDR_Address, buf, 6); + if (ret < 0) { + NVT_ERR("Read Back error!! (%d)\n", ret); + return ret; + } + + /* buf[3:5] => NVT End Flag*/ + strncpy(nvt_end_flag, &buf[3], NVT_FLASH_END_FLAG_LEN); + NVT_LOG("nvt_end_flag=%s (%02X %02X %02X)\n", nvt_end_flag, buf[3], buf[4], buf[5]); + + if (strncmp(nvt_end_flag, "NVT", 3) == 0) { + return 0; + } else { + NVT_ERR("\"NVT\" end flag not found!\n"); + return 1; + } +} #endif #if BOOT_UPDATE_FIRMWARE @@ -838,6 +986,7 @@ void Boot_Update_Firmware(struct work_struct *work) char firmware_name[256] = ""; sprintf(firmware_name, BOOT_UPDATE_FIRMWARE_NAME); + /* request bin file in "/etc/firmware"*/ ret = update_firmware_request(firmware_name); if (ret) { NVT_ERR("update_firmware_request failed. (%d)\n", ret); @@ -855,17 +1004,26 @@ void Boot_Update_Firmware(struct work_struct *work) ret = Check_CheckSum(); - if (ret < 0) { + if (ret < 0) { /* read firmware checksum failed*/ NVT_ERR("read firmware checksum failed\n"); Update_Firmware(); - } else if ((ret == 0) && (Check_FW_Ver() == 0)) { + } else if ((ret == 0) && (Check_FW_Ver() == 0)) { /* (fw checksum not match) && (bin fw version >= ic fw version)*/ NVT_LOG("firmware version not match\n"); Update_Firmware(); + } else if (nvt_check_flash_end_flag()) { + NVT_LOG("check flash end flag failed\n"); + Update_Firmware(); } else { + /* Bootloader Reset*/ nvt_bootloader_reset(); - nvt_check_fw_reset_state(RESET_STATE_INIT); + ret = nvt_check_fw_reset_state(RESET_STATE_INIT); + if (ret) { + NVT_LOG("check fw reset state failed\n"); + Update_Firmware(); + } } + #if NVT_TOUCH_FW ts->loading_fw = 0; #endif @@ -894,8 +1052,8 @@ static DEVICE_ATTR(poweron, 0444, nvt_poweron_show, NULL); static ssize_t nvt_ic_ver_show(struct device *dev, struct device_attribute *attr, char *buf) { - return scnprintf(buf, PAGE_SIZE, "[FW]%02x,[IC]NT36525\n", - ts->fw_ver); + return scnprintf(buf, PAGE_SIZE, "[FW]%02x,[IC]%s\n", + ts->fw_ver, ts->product_id); } static DEVICE_ATTR(ic_ver, 0444, nvt_ic_ver_show, NULL); @@ -1004,10 +1162,17 @@ static ssize_t nvt_do_reflash_store(struct device *dev, } else if ((retval == 0) && (Check_FW_Ver() == 0)) { NVT_LOG("firmware version not match\n"); Update_Firmware(); + } else if (nvt_check_flash_end_flag()) { + NVT_LOG("check flash end flag failed\n"); + Update_Firmware(); } else { /* Bootloader Reset */ nvt_bootloader_reset(); - nvt_check_fw_reset_state(RESET_STATE_INIT); + retval = nvt_check_fw_reset_state(RESET_STATE_INIT); + if (retval) { + NVT_LOG("check fw reset state failed\n"); + Update_Firmware(); + } } ts->loading_fw = 0; diff --git a/drivers/input/touchscreen/nova_mmi/nt36xxx_mem_map.h b/drivers/input/touchscreen/nova_mmi/nt36xxx_mem_map.h new file mode 100644 index 000000000000..b5292406ac51 --- /dev/null +++ b/drivers/input/touchscreen/nova_mmi/nt36xxx_mem_map.h @@ -0,0 +1,218 @@ +/* + * Copyright (C) 2010 - 2017 Novatek, Inc. + * + * $Revision: 26970 $ + * $Date: 2018-04-25 09:34:01 +0800 (ι€±δΈ‰, 25 ε››ζœˆ 2018) $ + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + */ + +struct nvt_ts_mem_map { + uint32_t EVENT_BUF_ADDR; + uint32_t RAW_PIPE0_ADDR; + uint32_t RAW_PIPE0_Q_ADDR; + uint32_t RAW_PIPE1_ADDR; + uint32_t RAW_PIPE1_Q_ADDR; + uint32_t BASELINE_ADDR; + uint32_t BASELINE_Q_ADDR; + uint32_t BASELINE_BTN_ADDR; + uint32_t BASELINE_BTN_Q_ADDR; + uint32_t DIFF_PIPE0_ADDR; + uint32_t DIFF_PIPE0_Q_ADDR; + uint32_t DIFF_PIPE1_ADDR; + uint32_t DIFF_PIPE1_Q_ADDR; + uint32_t RAW_BTN_PIPE0_ADDR; + uint32_t RAW_BTN_PIPE0_Q_ADDR; + uint32_t RAW_BTN_PIPE1_ADDR; + uint32_t RAW_BTN_PIPE1_Q_ADDR; + uint32_t DIFF_BTN_PIPE0_ADDR; + uint32_t DIFF_BTN_PIPE0_Q_ADDR; + uint32_t DIFF_BTN_PIPE1_ADDR; + uint32_t DIFF_BTN_PIPE1_Q_ADDR; + uint32_t READ_FLASH_CHECKSUM_ADDR; + uint32_t RW_FLASH_DATA_ADDR; +}; + +static const struct nvt_ts_mem_map NT36672A_memory_map = { + .EVENT_BUF_ADDR = 0x21C00, + .RAW_PIPE0_ADDR = 0x20000, + .RAW_PIPE0_Q_ADDR = 0, + .RAW_PIPE1_ADDR = 0x23000, + .RAW_PIPE1_Q_ADDR = 0, + .BASELINE_ADDR = 0x20BFC, + .BASELINE_Q_ADDR = 0, + .BASELINE_BTN_ADDR = 0x23BFC, + .BASELINE_BTN_Q_ADDR = 0, + .DIFF_PIPE0_ADDR = 0x206DC, + .DIFF_PIPE0_Q_ADDR = 0, + .DIFF_PIPE1_ADDR = 0x236DC, + .DIFF_PIPE1_Q_ADDR = 0, + .RAW_BTN_PIPE0_ADDR = 0x20510, + .RAW_BTN_PIPE0_Q_ADDR = 0, + .RAW_BTN_PIPE1_ADDR = 0x23510, + .RAW_BTN_PIPE1_Q_ADDR = 0, + .DIFF_BTN_PIPE0_ADDR = 0x20BF0, + .DIFF_BTN_PIPE0_Q_ADDR = 0, + .DIFF_BTN_PIPE1_ADDR = 0x23BF0, + .DIFF_BTN_PIPE1_Q_ADDR = 0, + .READ_FLASH_CHECKSUM_ADDR = 0x24000, + .RW_FLASH_DATA_ADDR = 0x24002, +}; + +static const struct nvt_ts_mem_map NT36772_memory_map = { + .EVENT_BUF_ADDR = 0x11E00, + .RAW_PIPE0_ADDR = 0x10000, + .RAW_PIPE0_Q_ADDR = 0, + .RAW_PIPE1_ADDR = 0x12000, + .RAW_PIPE1_Q_ADDR = 0, + .BASELINE_ADDR = 0x10E70, + .BASELINE_Q_ADDR = 0, + .BASELINE_BTN_ADDR = 0x12E70, + .BASELINE_BTN_Q_ADDR = 0, + .DIFF_PIPE0_ADDR = 0x10830, + .DIFF_PIPE0_Q_ADDR = 0, + .DIFF_PIPE1_ADDR = 0x12830, + .DIFF_PIPE1_Q_ADDR = 0, + .RAW_BTN_PIPE0_ADDR = 0x10E60, + .RAW_BTN_PIPE0_Q_ADDR = 0, + .RAW_BTN_PIPE1_ADDR = 0x12E60, + .RAW_BTN_PIPE1_Q_ADDR = 0, + .DIFF_BTN_PIPE0_ADDR = 0x10E68, + .DIFF_BTN_PIPE0_Q_ADDR = 0, + .DIFF_BTN_PIPE1_ADDR = 0x12E68, + .DIFF_BTN_PIPE1_Q_ADDR = 0, + .READ_FLASH_CHECKSUM_ADDR = 0x14000, + .RW_FLASH_DATA_ADDR = 0x14002, +}; + +static const struct nvt_ts_mem_map NT36525_memory_map = { + .EVENT_BUF_ADDR = 0x11A00, + .RAW_PIPE0_ADDR = 0x10000, + .RAW_PIPE0_Q_ADDR = 0, + .RAW_PIPE1_ADDR = 0x12000, + .RAW_PIPE1_Q_ADDR = 0, + .BASELINE_ADDR = 0x10B08, + .BASELINE_Q_ADDR = 0, + .BASELINE_BTN_ADDR = 0x12B08, + .BASELINE_BTN_Q_ADDR = 0, + .DIFF_PIPE0_ADDR = 0x1064C, + .DIFF_PIPE0_Q_ADDR = 0, + .DIFF_PIPE1_ADDR = 0x1264C, + .DIFF_PIPE1_Q_ADDR = 0, + .RAW_BTN_PIPE0_ADDR = 0x10634, + .RAW_BTN_PIPE0_Q_ADDR = 0, + .RAW_BTN_PIPE1_ADDR = 0x12634, + .RAW_BTN_PIPE1_Q_ADDR = 0, + .DIFF_BTN_PIPE0_ADDR = 0x10AFC, + .DIFF_BTN_PIPE0_Q_ADDR = 0, + .DIFF_BTN_PIPE1_ADDR = 0x12AFC, + .DIFF_BTN_PIPE1_Q_ADDR = 0, + .READ_FLASH_CHECKSUM_ADDR = 0x14000, + .RW_FLASH_DATA_ADDR = 0x14002, +}; + +static const struct nvt_ts_mem_map NT36870_memory_map = { + .EVENT_BUF_ADDR = 0x25000, + .RAW_PIPE0_ADDR = 0x20000, + .RAW_PIPE0_Q_ADDR = 0x204C8, + .RAW_PIPE1_ADDR = 0x23000, + .RAW_PIPE1_Q_ADDR = 0x234C8, + .BASELINE_ADDR = 0x21350, + .BASELINE_Q_ADDR = 0x21818, + .BASELINE_BTN_ADDR = 0x24350, + .BASELINE_BTN_Q_ADDR = 0x24358, + .DIFF_PIPE0_ADDR = 0x209B0, + .DIFF_PIPE0_Q_ADDR = 0x20E78, + .DIFF_PIPE1_ADDR = 0x239B0, + .DIFF_PIPE1_Q_ADDR = 0x23E78, + .RAW_BTN_PIPE0_ADDR = 0x20990, + .RAW_BTN_PIPE0_Q_ADDR = 0x20998, + .RAW_BTN_PIPE1_ADDR = 0x23990, + .RAW_BTN_PIPE1_Q_ADDR = 0x23998, + .DIFF_BTN_PIPE0_ADDR = 0x21340, + .DIFF_BTN_PIPE0_Q_ADDR = 0x21348, + .DIFF_BTN_PIPE1_ADDR = 0x24340, + .DIFF_BTN_PIPE1_Q_ADDR = 0x24348, + .READ_FLASH_CHECKSUM_ADDR = 0x24000, + .RW_FLASH_DATA_ADDR = 0x24002, +}; + +static const struct nvt_ts_mem_map NT36676F_memory_map = { + .EVENT_BUF_ADDR = 0x11A00, + .RAW_PIPE0_ADDR = 0x10000, + .RAW_PIPE0_Q_ADDR = 0, + .RAW_PIPE1_ADDR = 0x12000, + .RAW_PIPE1_Q_ADDR = 0, + .BASELINE_ADDR = 0x10B08, + .BASELINE_Q_ADDR = 0, + .BASELINE_BTN_ADDR = 0x12B08, + .BASELINE_BTN_Q_ADDR = 0, + .DIFF_PIPE0_ADDR = 0x1064C, + .DIFF_PIPE0_Q_ADDR = 0, + .DIFF_PIPE1_ADDR = 0x1264C, + .DIFF_PIPE1_Q_ADDR = 0, + .RAW_BTN_PIPE0_ADDR = 0x10634, + .RAW_BTN_PIPE0_Q_ADDR = 0, + .RAW_BTN_PIPE1_ADDR = 0x12634, + .RAW_BTN_PIPE1_Q_ADDR = 0, + .DIFF_BTN_PIPE0_ADDR = 0x10AFC, + .DIFF_BTN_PIPE0_Q_ADDR = 0, + .DIFF_BTN_PIPE1_ADDR = 0x12AFC, + .DIFF_BTN_PIPE1_Q_ADDR = 0, + .READ_FLASH_CHECKSUM_ADDR = 0x14000, + .RW_FLASH_DATA_ADDR = 0x14002, +}; + +#define NVT_ID_BYTE_MAX 6 +struct nvt_ts_trim_id_table { + uint8_t id[NVT_ID_BYTE_MAX]; + uint8_t mask[NVT_ID_BYTE_MAX]; + const struct nvt_ts_mem_map *mmap; + uint8_t carrier_system; +}; + +static const struct nvt_ts_trim_id_table trim_id_table[] = { + {.id = {0x0A, 0xFF, 0xFF, 0x72, 0x65, 0x03}, .mask = {1, 0, 0, 1, 1, 1}, + .mmap = &NT36672A_memory_map, .carrier_system = 0}, + {.id = {0x0A, 0xFF, 0xFF, 0x72, 0x66, 0x03}, .mask = {1, 0, 0, 1, 1, 1}, + .mmap = &NT36672A_memory_map, .carrier_system = 0}, + {.id = {0x0A, 0xFF, 0xFF, 0x82, 0x66, 0x03}, .mask = {1, 0, 0, 1, 1, 1}, + .mmap = &NT36672A_memory_map, .carrier_system = 0}, + {.id = {0x0A, 0xFF, 0xFF, 0x70, 0x66, 0x03}, .mask = {1, 0, 0, 1, 1, 1}, + .mmap = &NT36672A_memory_map, .carrier_system = 0}, + {.id = {0x0B, 0xFF, 0xFF, 0x70, 0x66, 0x03}, .mask = {1, 0, 0, 1, 1, 1}, + .mmap = &NT36672A_memory_map, .carrier_system = 0}, + {.id = {0x0A, 0xFF, 0xFF, 0x72, 0x67, 0x03}, .mask = {1, 0, 0, 1, 1, 1}, + .mmap = &NT36672A_memory_map, .carrier_system = 0}, + {.id = {0x55, 0x00, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0}, + {.id = {0x55, 0x72, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0}, + {.id = {0xAA, 0x00, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0}, + {.id = {0xAA, 0x72, 0xFF, 0x00, 0x00, 0x00}, .mask = {1, 1, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0}, + {.id = {0xFF, 0xFF, 0xFF, 0x72, 0x67, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0}, + {.id = {0xFF, 0xFF, 0xFF, 0x70, 0x66, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0}, + {.id = {0xFF, 0xFF, 0xFF, 0x70, 0x67, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0}, + {.id = {0xFF, 0xFF, 0xFF, 0x72, 0x66, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, + .mmap = &NT36772_memory_map, .carrier_system = 0}, + {.id = {0xFF, 0xFF, 0xFF, 0x25, 0x65, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, + .mmap = &NT36525_memory_map, .carrier_system = 0}, + {.id = {0xFF, 0xFF, 0xFF, 0x70, 0x68, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, + .mmap = &NT36870_memory_map, .carrier_system = 1}, + {.id = {0xFF, 0xFF, 0xFF, 0x76, 0x66, 0x03}, .mask = {0, 0, 0, 1, 1, 1}, + .mmap = &NT36676F_memory_map, .carrier_system = 0} +}; diff --git a/drivers/input/touchscreen/nova_mmi/nt36xxx_mp_ctrlram.c b/drivers/input/touchscreen/nova_mmi/nt36xxx_mp_ctrlram.c index 3fd5dbadd688..8c5404264bd8 100644 --- a/drivers/input/touchscreen/nova_mmi/nt36xxx_mp_ctrlram.c +++ b/drivers/input/touchscreen/nova_mmi/nt36xxx_mp_ctrlram.c @@ -46,53 +46,54 @@ printk(fmt, ##args); \ } while (0) -static uint8_t *RecordResult_Short; -static uint8_t *RecordResult_Short_Diff; -static uint8_t *RecordResult_Short_Base; -static uint8_t *RecordResult_Open; -static uint8_t *RecordResult_FWMutual; -static uint8_t *RecordResult_FW_CC; -static uint8_t *RecordResult_FW_CC_I; -static uint8_t *RecordResult_FW_CC_Q; -static uint8_t *RecordResult_FW_DiffMax; -static uint8_t *RecordResult_FW_DiffMin; +static uint8_t *RecordResult_Short = NULL; +static uint8_t *RecordResult_Short_Diff = NULL; +static uint8_t *RecordResult_Short_Base = NULL; +static uint8_t *RecordResult_Open = NULL; +static uint8_t *RecordResult_FWMutual = NULL; +static uint8_t *RecordResult_FW_CC = NULL; +static uint8_t *RecordResult_FW_CC_I = NULL; +static uint8_t *RecordResult_FW_CC_Q = NULL; +static uint8_t *RecordResult_FW_DiffMax = NULL; +static uint8_t *RecordResult_FW_DiffMin = NULL; -static int32_t TestResult_Short; -static int32_t TestResult_Short_Diff; -static int32_t TestResult_Short_Base; -static int32_t TestResult_Open; -static int32_t TestResult_FW_Rawdata; -static int32_t TestResult_FWMutual; -static int32_t TestResult_FW_CC; -static int32_t TestResult_FW_CC_I; -static int32_t TestResult_FW_CC_Q; -static int32_t TestResult_Noise; -static int32_t TestResult_FW_DiffMax; -static int32_t TestResult_FW_DiffMin; +static int32_t TestResult_Short = 0; +static int32_t TestResult_Short_Diff = 0; +static int32_t TestResult_Short_Base = 0; +static int32_t TestResult_Open = 0; +static int32_t TestResult_FW_Rawdata = 0; +static int32_t TestResult_FWMutual = 0; +static int32_t TestResult_FW_CC = 0; +static int32_t TestResult_FW_CC_I = 0; +static int32_t TestResult_FW_CC_Q = 0; +static int32_t TestResult_Noise = 0; +static int32_t TestResult_FW_DiffMax = 0; +static int32_t TestResult_FW_DiffMin = 0; -static int32_t *RawData_Short; -static int32_t *RawData_Short_Diff; -static int32_t *RawData_Short_Base; -static int32_t *RawData_Open; -static int32_t *RawData_Diff; -static int32_t *RawData_Diff_Min; -static int32_t *RawData_Diff_Max; -static int32_t *RawData_FWMutual; -static int32_t *RawData_FW_CC; -static int32_t *RawData_FW_CC_I; -static int32_t *RawData_FW_CC_Q; +static int32_t *RawData_Short = NULL; +static int32_t *RawData_Short_Diff = NULL; +static int32_t *RawData_Short_Base = NULL; +static int32_t *RawData_Open = NULL; +static int32_t *RawData_Diff = NULL; +static int32_t *RawData_Diff_Min = NULL; +static int32_t *RawData_Diff_Max = NULL; +static int32_t *RawData_FWMutual = NULL; +static int32_t *RawData_FW_CC = NULL; +static int32_t *RawData_FW_CC_I = NULL; +static int32_t *RawData_FW_CC_Q = NULL; static struct proc_dir_entry *NVT_proc_selftest_entry = NULL; #if NVT_TOUCH_MP_LENOVO -static struct proc_dir_entry *NVT_proc_selftest_read_data; +static struct proc_dir_entry *NVT_proc_selftest_read_data = NULL; #endif -static int8_t nvt_mp_test_result_printed; +static int8_t nvt_mp_test_result_printed = 0; extern void nvt_change_mode(uint8_t mode); extern uint8_t nvt_get_fw_pipe(void); extern void nvt_read_mdata(uint32_t xdata_addr, uint32_t xdata_btn_addr); extern void nvt_get_mdata(int32_t *buf, uint8_t *m_x_num, uint8_t *m_y_num); extern int32_t nvt_read_mass_data(uint32_t xdata_addr, uint8_t *temp_buf, uint32_t len); +int32_t nvt_mp_parse_dt(struct device_node *root, const char *node_compatible); /******************************************************* Description: @@ -219,6 +220,54 @@ static int nvt_mp_buffer_init(void) return 0; } +static void nvt_print_data_log_in_one_line(int32_t *data, int32_t data_num) +{ + char *tmp_log = NULL; + int32_t i = 0; + + tmp_log = (char *)kzalloc(data_num * 7 + 1, GFP_KERNEL); + if (!tmp_log) { + NVT_ERR("kzalloc for tmp_log failed!\n "); + return; + } + + for (i = 0; i < data_num; i++) { + sprintf(tmp_log + i * 7, "%5d, ", data[i]); + } + tmp_log[data_num * 7] = '\0'; + printk("%s", tmp_log); + if (tmp_log) { + kfree(tmp_log); + tmp_log = NULL; + } + + return; +} + +static void nvt_print_result_log_in_one_line(uint8_t *result, int32_t result_num) +{ + char *tmp_log = NULL; + int32_t i = 0; + + tmp_log = (char *)kzalloc(result_num * 6 + 1, GFP_KERNEL); + if (!tmp_log) { + NVT_ERR("kzalloc for tmp_log failed!\n "); + return; + } + + for (i = 0; i < result_num; i++) { + sprintf(tmp_log + i * 6, "0x%02X, ", result[i]); + } + tmp_log[result_num * 6] = '\0'; + printk("%s", tmp_log); + if (tmp_log) { + kfree(tmp_log); + tmp_log = NULL; + } + + return; +} + /******************************************************* Description: Novatek touchscreen self-test criteria print function. @@ -228,22 +277,14 @@ return: *******************************************************/ static void nvt_print_lmt_array(int32_t *array, int32_t x_ch, int32_t y_ch) { - int32_t i = 0; int32_t j = 0; -#if TOUCH_KEY_NUM > 0 - int32_t k = 0; -#endif /* #if TOUCH_KEY_NUM > 0 */ for (j = 0; j < y_ch; j++) { - for (i = 0; i < x_ch; i++) { - printk("%5d, ", array[j * x_ch + i]); - } + nvt_print_data_log_in_one_line(array + j * x_ch, x_ch); printk("\n"); } #if TOUCH_KEY_NUM > 0 - for (k = 0; k < Key_Channel; k++) { - printk("%5d, ", array[y_ch * x_ch + k]); - } + nvt_print_data_log_in_one_line(array + y_ch * x_ch, Key_Channel); printk("\n"); #endif /* #if TOUCH_KEY_NUM > 0 */ } @@ -253,65 +294,60 @@ static void nvt_print_criteria(void) NVT_LOG("++\n"); if (ts->carrier_system) { - printk("PS_Config_Lmt_Short_Diff_P: %5d\n", PS_Config_Lmt_Short_Diff_P); - printk("PS_Config_Lmt_Short_Diff_N: %5d\n", PS_Config_Lmt_Short_Diff_N); -#if TOUCH_KEY_NUM > 0 - printk("PS_Config_Lmt_Key_Short_Diff_P: %5d\n", PS_Config_Lmt_Key_Short_Diff_P); - printk("PS_Config_Lmt_Key_Short_Diff_N: %5d\n", PS_Config_Lmt_Key_Short_Diff_N); -#endif /* #if TOUCH_KEY_NUM > 0 */ - printk("PS_Config_Lmt_Short_Base_P: %5d\n", PS_Config_Lmt_Short_Base_P); - printk("PS_Config_Lmt_Short_Base_N: %5d\n", PS_Config_Lmt_Short_Base_N); -#if TOUCH_KEY_NUM > 0 - printk("PS_Config_Lmt_Key_Short_Base_P: %5d\n", PS_Config_Lmt_Key_Short_Base_P); - printk("PS_Config_Lmt_Key_Short_Base_N: %5d\n", PS_Config_Lmt_Key_Short_Base_N); -#endif /* #if TOUCH_KEY_NUM > 0 */ + /*---PS_Config_Lmt_Short_Diff---*/ + printk("PS_Config_Lmt_Short_Diff_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_Short_Diff_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_Short_Diff_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_Short_Diff_N, X_Channel, Y_Channel); + /*---PS_Config_Lmt_Short_Base---*/ + printk("PS_Config_Lmt_Short_Base_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_Short_Base_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_Short_Base_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_Short_Base_N, X_Channel, Y_Channel); } else { - printk("PS_Config_Lmt_Short_Rawdata_P: %5d\n", PS_Config_Lmt_Short_Rawdata_P); - printk("PS_Config_Lmt_Short_Rawdata_N: %5d\n", PS_Config_Lmt_Short_Rawdata_N); -#if TOUCH_KEY_NUM > 0 - printk("PS_Config_Lmt_Key_Short_Rawdata_P: %5d\n", PS_Config_Lmt_Key_Short_Rawdata_P); - printk("PS_Config_Lmt_Key_Short_Rawdata_N: %5d\n", PS_Config_Lmt_Key_Short_Rawdata_N); -#endif /* #if TOUCH_KEY_NUM > 0 */ + /*---PS_Config_Lmt_Short_Rawdata---*/ + printk("PS_Config_Lmt_Short_Rawdata_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_Short_Rawdata_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_Short_Rawdata_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_Short_Rawdata_N, X_Channel, Y_Channel); } + /*---PS_Config_Lmt_Open_Rawdata---*/ printk("PS_Config_Lmt_Open_Rawdata_P:\n"); nvt_print_lmt_array(PS_Config_Lmt_Open_Rawdata_P, X_Channel, Y_Channel); printk("PS_Config_Lmt_Open_Rawdata_N:\n"); nvt_print_lmt_array(PS_Config_Lmt_Open_Rawdata_N, X_Channel, Y_Channel); + /*---PS_Config_Lmt_FW_Rawdata---*/ printk("PS_Config_Lmt_FW_Rawdata_P:\n"); nvt_print_lmt_array(PS_Config_Lmt_FW_Rawdata_P, X_Channel, Y_Channel); printk("PS_Config_Lmt_FW_Rawdata_N:\n"); nvt_print_lmt_array(PS_Config_Lmt_FW_Rawdata_N, X_Channel, Y_Channel); if (ts->carrier_system) { - printk("PS_Config_Lmt_FW_CC_I_P: %5d\n", PS_Config_Lmt_FW_CC_I_P); - printk("PS_Config_Lmt_FW_CC_I_N: %5d\n", PS_Config_Lmt_FW_CC_I_N); -#if TOUCH_KEY_NUM > 0 - printk("PS_Config_Lmt_Key_FW_CC_I_P: %5d\n", PS_Config_Lmt_Key_FW_CC_I_P); - printk("PS_Config_Lmt_Key_FW_CC_I_N: %5d\n", PS_Config_Lmt_Key_FW_CC_I_N); -#endif /* #if TOUCH_KEY_NUM > 0 */ - printk("PS_Config_Lmt_FW_CC_Q_P: %5d\n", PS_Config_Lmt_FW_CC_Q_P); - printk("PS_Config_Lmt_FW_CC_Q_N: %5d\n", PS_Config_Lmt_FW_CC_Q_N); -#if TOUCH_KEY_NUM > 0 - printk("PS_Config_Lmt_Key_FW_CC_Q_P: %5d\n", PS_Config_Lmt_Key_FW_CC_Q_P); - printk("PS_Config_Lmt_Key_FW_CC_Q_N: %5d\n", PS_Config_Lmt_Key_FW_CC_Q_N); -#endif /* #if TOUCH_KEY_NUM > 0 */ + /*---PS_Config_Lmt_FW_CC_I---*/ + printk("PS_Config_Lmt_FW_CC_I_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_CC_I_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_FW_CC_I_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_CC_I_N, X_Channel, Y_Channel); + /*---PS_Config_Lmt_FW_CC_Q---*/ + printk("PS_Config_Lmt_FW_CC_Q_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_CC_Q_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_FW_CC_Q_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_CC_Q_N, X_Channel, Y_Channel); } else { - printk("PS_Config_Lmt_FW_CC_P: %5d\n", PS_Config_Lmt_FW_CC_P); - printk("PS_Config_Lmt_FW_CC_N: %5d\n", PS_Config_Lmt_FW_CC_N); -#if TOUCH_KEY_NUM > 0 - printk("PS_Config_Lmt_Key_FW_CC_P: %5d\n", PS_Config_Lmt_Key_FW_CC_P); - printk("PS_Config_Lmt_Key_FW_CC_N: %5d\n", PS_Config_Lmt_Key_FW_CC_N); -#endif /* #if TOUCH_KEY_NUM > 0 */ + /*---PS_Config_Lmt_FW_CC---*/ + printk("PS_Config_Lmt_FW_CC_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_CC_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_FW_CC_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_CC_N, X_Channel, Y_Channel); } - printk("PS_Config_Lmt_FW_Diff_P: %5d\n", PS_Config_Lmt_FW_Diff_P); - printk("PS_Config_Lmt_FW_Diff_N: %5d\n", PS_Config_Lmt_FW_Diff_N); -#if TOUCH_KEY_NUM > 0 - printk("PS_Config_Lmt_Key_FW_Diff_P: %5d\n", PS_Config_Lmt_Key_FW_Diff_P); - printk("PS_Config_Lmt_Key_FW_Diff_N: %5d\n", PS_Config_Lmt_Key_FW_Diff_N); -#endif /* #if TOUCH_KEY_NUM > 0 */ + /*---PS_Config_Lmt_FW_Diff---*/ + printk("PS_Config_Lmt_FW_Diff_P:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_Diff_P, X_Channel, Y_Channel); + printk("PS_Config_Lmt_FW_Diff_N:\n"); + nvt_print_lmt_array(PS_Config_Lmt_FW_Diff_N, X_Channel, Y_Channel); NVT_LOG("--\n"); } @@ -330,15 +366,15 @@ static int32_t nvt_save_rawdata_to_csv(int32_t *rawdata, uint8_t x_ch, uint8_t y for (y = 0; y < y_ch; y++) { for (x = 0; x < x_ch; x++) { iArrayIndex = y * x_ch + x; - printk("%5d, ", rawdata[iArrayIndex]); } + nvt_print_data_log_in_one_line(rawdata + y * x_ch, x_ch); printk("\n"); } #if TOUCH_KEY_NUM > 0 for (k = 0; k < Key_Channel; k++) { iArrayIndex = y_ch * x_ch + k; - printk("%5d, ", rawdata[iArrayIndex]); } + nvt_print_data_log_in_one_line(rawdata + y_ch * x_ch, Key_Channel); printk("\n"); #endif /* #if TOUCH_KEY_NUM > 0 */ @@ -354,11 +390,13 @@ static int32_t nvt_polling_hand_shake_status(void) const int32_t retry = 50; for (i = 0; i < retry; i++) { + /*---set xdata index to EVENT BUF ADDR---*/ buf[0] = 0xFF; buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---read fw status---*/ buf[0] = EVENT_MAP_HANDSHAKING_or_SUB_CMD_BYTE; buf[1] = 0x00; CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 2); @@ -371,6 +409,22 @@ static int32_t nvt_polling_hand_shake_status(void) if (i >= retry) { NVT_ERR("polling hand shake status failed, buf[1]=0x%02X\n", buf[1]); + + /*Read back 5 bytes from offset EVENT_MAP_HOST_CMD for debug check*/ + buf[0] = 0xFF; + buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + + buf[0] = EVENT_MAP_HOST_CMD; + buf[1] = 0x00; + buf[2] = 0x00; + buf[3] = 0x00; + buf[4] = 0x00; + buf[5] = 0x00; + CTP_I2C_READ(ts->client, I2C_FW_Address, buf, 6); + NVT_ERR("Read back 5 bytes from offset EVENT_MAP_HOST_CMD: 0x%02X, 0x%02X, 0x%02X, 0x%02X, 0x%02X\n", buf[1], buf[2], buf[3], buf[4], buf[5]); + return -1; } else { return 0; @@ -386,11 +440,13 @@ static int8_t nvt_switch_FreqHopEnDis(uint8_t FreqHopEnDis) NVT_LOG("++\n"); for (retry = 0; retry < 20; retry++) { + /*---set xdata index to EVENT BUF ADDR---*/ buf[0] = 0xFF; buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---switch FreqHopEnDis---*/ buf[0] = EVENT_MAP_HOST_CMD; buf[1] = FreqHopEnDis; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 2); @@ -454,6 +510,7 @@ static int32_t nvt_read_baseline(int32_t *xdata) #endif /* #if TOUCH_KEY_NUM > 0 */ printk("%s:\n", __func__); + /* Save Rawdata to CSV file*/ if (nvt_save_rawdata_to_csv(xdata, X_Channel, Y_Channel, FW_RAWDATA_CSV_FILE, 0) < 0) { NVT_ERR("save rawdata to CSV file failed\n"); return -EAGAIN; @@ -514,6 +571,7 @@ static int32_t nvt_read_CC(int32_t *xdata) printk("%s:\n", __func__); if (ts->carrier_system) { printk("%s:RawData_CC_I:\n", __func__); + /* Save Rawdata to CSV file*/ if (nvt_save_rawdata_to_csv(RawData_FW_CC_I, X_Channel, Y_Channel, FW_CC_CSV_FILE, 0) < 0) { NVT_ERR("save rawdata to CSV file failed\n"); return -EAGAIN; @@ -524,11 +582,13 @@ static int32_t nvt_read_CC(int32_t *xdata) rawdata_cc_q_offset = Y_Channel * X_Channel * 7 + Y_Channel * 2; #endif /* #if TOUCH_KEY_NUM > 0 */ printk("%s:RawData_CC_Q:\n", __func__); + /* Save Rawdata to CSV file*/ if (nvt_save_rawdata_to_csv(RawData_FW_CC_Q, X_Channel, Y_Channel, FW_CC_CSV_FILE, rawdata_cc_q_offset) < 0) { NVT_ERR("save rawdata to CSV file failed\n"); return -EAGAIN; } } else { + /* Save Rawdata to CSV file*/ if (nvt_save_rawdata_to_csv(xdata, X_Channel, Y_Channel, FW_CC_CSV_FILE, 0) < 0) { NVT_ERR("save rawdata to CSV file failed\n"); return -EAGAIN; @@ -544,11 +604,13 @@ static void nvt_enable_noise_collect(int32_t frame_num) { uint8_t buf[8] = {0}; + /*---set xdata index to EVENT BUF ADDR---*/ buf[0] = 0xFF; buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---enable noise collect---*/ buf[0] = EVENT_MAP_HOST_CMD; buf[1] = 0x47; buf[2] = 0xAA; @@ -572,6 +634,7 @@ static int32_t nvt_read_fw_noise(int32_t *xdata) NVT_LOG("++\n"); + /*---Enter Test Mode---*/ if (nvt_clear_fw_status()) { return -EAGAIN; } @@ -581,6 +644,7 @@ static int32_t nvt_read_fw_noise(int32_t *xdata) frame_num = 1; printk("%s: frame_num=%d\n", __func__, frame_num); nvt_enable_noise_collect(frame_num); + /* need wait PS_Config_Diff_Test_Frame * 8.3ms*/ msleep(frame_num * 83); if (nvt_polling_hand_shake_status()) { @@ -623,9 +687,11 @@ static int32_t nvt_read_fw_noise(int32_t *xdata) } #endif /* #if TOUCH_KEY_NUM > 0 */ + /*---Leave Test Mode---*/ nvt_change_mode(NORMAL_MODE); printk("%s:RawData_Diff_Max:\n", __func__); + /* Save Rawdata to CSV file*/ if (nvt_save_rawdata_to_csv(RawData_Diff_Max, X_Channel, Y_Channel, NOISE_TEST_CSV_FILE, 0) < 0) { NVT_ERR("save rawdata to CSV file failed\n"); return -EAGAIN; @@ -638,6 +704,7 @@ static int32_t nvt_read_fw_noise(int32_t *xdata) rawdata_diff_min_offset = Y_Channel * X_Channel * 7 + Y_Channel * 2; #endif /* #if TOUCH_KEY_NUM > 0 */ printk("%s:RawData_Diff_Min:\n", __func__); + /* Save Rawdata to CSV file*/ if (nvt_save_rawdata_to_csv(RawData_Diff_Min, X_Channel, Y_Channel, NOISE_TEST_CSV_FILE, rawdata_diff_min_offset) < 0) { NVT_ERR("save rawdata to CSV file failed\n"); return -EAGAIN; @@ -653,11 +720,13 @@ static void nvt_enable_open_test(void) { uint8_t buf[8] = {0}; + /*---set xdata index to EVENT BUF ADDR---*/ buf[0] = 0xFF; buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---enable open test---*/ buf[0] = EVENT_MAP_HOST_CMD; buf[1] = 0x45; buf[2] = 0xAA; @@ -670,11 +739,13 @@ static void nvt_enable_short_test(void) { uint8_t buf[8] = {0}; + /*---set xdata index to EVENT BUF ADDR---*/ buf[0] = 0xFF; buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 3); + /*---enable short test---*/ buf[0] = EVENT_MAP_HOST_CMD; buf[1] = 0x43; buf[2] = 0xAA; @@ -697,6 +768,7 @@ static int32_t nvt_read_fw_open(int32_t *xdata) NVT_LOG("++\n"); + /*---Enter Test Mode---*/ if (nvt_clear_fw_status()) { return -EAGAIN; } @@ -723,6 +795,7 @@ static int32_t nvt_read_fw_open(int32_t *xdata) raw_pipe_addr = ts->mmap->RAW_PIPE1_ADDR; for (y = 0; y < IC_Y_CFG_SIZE; y++) { + /*---change xdata index---*/ buf[0] = 0xFF; buf[1] = (uint8_t)(((raw_pipe_addr + y * IC_X_CFG_SIZE * 2) >> 16) & 0xFF); buf[2] = (uint8_t)(((raw_pipe_addr + y * IC_X_CFG_SIZE * 2) >> 8) & 0xFF); @@ -737,6 +810,7 @@ static int32_t nvt_read_fw_open(int32_t *xdata) else raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE1_ADDR; + /*---change xdata index---*/ buf[0] = 0xFF; buf[1] = (uint8_t)((raw_btn_pipe_addr >> 16) & 0xFF); buf[2] = (uint8_t)((raw_btn_pipe_addr >> 8) & 0xFF); @@ -765,10 +839,12 @@ static int32_t nvt_read_fw_open(int32_t *xdata) rawdata_buf = NULL; } + /*---Leave Test Mode---*/ nvt_change_mode(NORMAL_MODE); printk("%s:RawData_Open\n", __func__); + /* Save RawData to CSV file*/ if (nvt_save_rawdata_to_csv(xdata, X_Channel, Y_Channel, OPEN_TEST_CSV_FILE, 0) < 0) { NVT_ERR("save rawdata to CSV file failed\n"); return -EAGAIN; @@ -795,6 +871,7 @@ static int32_t nvt_read_fw_short(int32_t *xdata) NVT_LOG("++\n"); + /*---Enter Test Mode---*/ if (nvt_clear_fw_status()) { return -EAGAIN; } @@ -816,6 +893,7 @@ static int32_t nvt_read_fw_short(int32_t *xdata) } if (ts->carrier_system) { + /* to get short diff rawdata at pipe0*/ raw_pipe_addr = ts->mmap->RAW_PIPE0_ADDR; } else { if (nvt_get_fw_pipe() == 0) @@ -825,6 +903,7 @@ static int32_t nvt_read_fw_short(int32_t *xdata) } for (y = 0; y < Y_Channel; y++) { + /*---change xdata index---*/ buf[0] = 0xFF; buf[1] = (uint8_t)(((raw_pipe_addr + y * X_Channel * 2) >> 16) & 0xFF); buf[2] = (uint8_t)(((raw_pipe_addr + y * X_Channel * 2) >> 8) & 0xFF); @@ -835,6 +914,7 @@ static int32_t nvt_read_fw_short(int32_t *xdata) } #if TOUCH_KEY_NUM > 0 if (ts->carrier_system) { + /* to get button short diff rawdata at pipe0*/ raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE0_ADDR; } else { if (nvt_get_fw_pipe() == 0) @@ -843,6 +923,7 @@ static int32_t nvt_read_fw_short(int32_t *xdata) raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE1_ADDR; } + /*---change xdata index---*/ buf[0] = 0xFF; buf[1] = (uint8_t)((raw_btn_pipe_addr >> 16) & 0xFF); buf[2] = (uint8_t)((raw_btn_pipe_addr >> 8) & 0xFF); @@ -865,10 +946,13 @@ static int32_t nvt_read_fw_short(int32_t *xdata) } #endif /* #if TOUCH_KEY_NUM > 0 */ + /* for carrier sensing system to get short baseline rawdata*/ if (ts->carrier_system) { + /* to get short baseline rawdata at pipe1*/ raw_pipe_addr = ts->mmap->RAW_PIPE1_ADDR; for (y = 0; y < Y_Channel; y++) { + /*---change xdata index---*/ buf[0] = 0xFF; buf[1] = (uint8_t)(((raw_pipe_addr + y * X_Channel * 2) >> 16) & 0xFF); buf[2] = (uint8_t)(((raw_pipe_addr + y * X_Channel * 2) >> 8) & 0xFF); @@ -878,8 +962,10 @@ static int32_t nvt_read_fw_short(int32_t *xdata) memcpy(rawdata_buf + y * X_Channel * 2, buf + 1, X_Channel * 2); } #if TOUCH_KEY_NUM > 0 + /* to get button short baseline rawdata at pipe1*/ raw_btn_pipe_addr = ts->mmap->RAW_BTN_PIPE1_ADDR; + /*---change xdata index---*/ buf[0] = 0xFF; buf[1] = (uint8_t)((raw_btn_pipe_addr >> 16) & 0xFF); buf[2] = (uint8_t)((raw_btn_pipe_addr >> 8) & 0xFF); @@ -908,13 +994,14 @@ static int32_t nvt_read_fw_short(int32_t *xdata) rawdata_buf = NULL; } + /*---Leave Test Mode---*/ nvt_change_mode(NORMAL_MODE); if (ts->carrier_system) printk("%s:RawData_Short_Diff:\n", __func__); else printk("%s:RawData_Short\n", __func__); - + /* Save Rawdata to CSV file*/ if (nvt_save_rawdata_to_csv(xdata, X_Channel, Y_Channel, SHORT_TEST_CSV_FILE, 0) < 0) { NVT_ERR("save rawdata to CSV file failed\n"); return -EAGAIN; @@ -926,6 +1013,7 @@ static int32_t nvt_read_fw_short(int32_t *xdata) rawdata_short_base_offset = Y_Channel * X_Channel * 7 + Y_Channel * 2; #endif /* #if TOUCH_KEY_NUM > 0 */ printk("%s:RawData_Short_Base:\n", __func__); + /* Save Rawdata to CSV file*/ if (nvt_save_rawdata_to_csv(RawData_Short_Base, X_Channel, Y_Channel, SHORT_TEST_CSV_FILE, rawdata_short_base_offset) < 0) { NVT_ERR("save rawdata to CSV file failed\n"); return -EAGAIN; @@ -937,76 +1025,6 @@ static int32_t nvt_read_fw_short(int32_t *xdata) return 0; } -/******************************************************* -Description: - Novatek touchscreen raw data test function. - -return: - Executive outcomes. 0---passed. negative---failed. -*******************************************************/ -static int32_t RawDataTest_Sub(int32_t rawdata[], uint8_t RecordResult[], uint8_t x_ch, uint8_t y_ch, int32_t Rawdata_Limit_Postive, int32_t Rawdata_Limit_Negative, - int32_t Rawdata_Limit_Key_Postive, int32_t Rawdata_Limit_Key_Negative) -{ - int32_t i = 0; - int32_t j = 0; -#if TOUCH_KEY_NUM > 0 - int32_t k = 0; -#endif /* #if TOUCH_KEY_NUM > 0 */ - int32_t iArrayIndex = 0; - bool isPass = true; - - for (j = 0; j < y_ch; j++) { - for (i = 0; i < x_ch; i++) { - iArrayIndex = j * x_ch + i; - - RecordResult[iArrayIndex] = 0x00; - - if (rawdata[iArrayIndex] > Rawdata_Limit_Postive) - RecordResult[iArrayIndex] |= 0x01; - - if (rawdata[iArrayIndex] < Rawdata_Limit_Negative) - RecordResult[iArrayIndex] |= 0x02; - } - } -#if TOUCH_KEY_NUM > 0 - for (k = 0; k < Key_Channel; k++) { - iArrayIndex = y_ch * x_ch + k; - - RecordResult[iArrayIndex] = 0x00; - - if (rawdata[iArrayIndex] > Rawdata_Limit_Key_Postive) - RecordResult[iArrayIndex] |= 0x01; - - if (rawdata[iArrayIndex] < Rawdata_Limit_Key_Negative) - RecordResult[iArrayIndex] |= 0x02; - } -#endif /* #if TOUCH_KEY_NUM > 0 */ - - for (j = 0; j < y_ch; j++) { - for (i = 0; i < x_ch; i++) { - if (RecordResult[j * x_ch + i] != 0) { - isPass = false; - break; - } - } - } -#if TOUCH_KEY_NUM > 0 - for (k = 0; k < Key_Channel; k++) { - iArrayIndex = y_ch * x_ch + k; - if (RecordResult[iArrayIndex] != 0) { - isPass = false; - break; - } - } -#endif /* #if TOUCH_KEY_NUM > 0 */ - - if (isPass == false) { - return -1; - } else { - return 0; - } -} - /******************************************************* Description: Novatek touchscreen raw data test for each single point function. @@ -1028,7 +1046,7 @@ static int32_t RawDataTest_SinglePoint_Sub(int32_t rawdata[], uint8_t RecordResu for (i = 0; i < x_ch; i++) { iArrayIndex = j * x_ch + i; - RecordResult[iArrayIndex] = 0x00; + RecordResult[iArrayIndex] = 0x00; /* default value for PASS*/ if (rawdata[iArrayIndex] > Rawdata_Limit_Postive[iArrayIndex]) RecordResult[iArrayIndex] |= 0x01; @@ -1041,7 +1059,7 @@ static int32_t RawDataTest_SinglePoint_Sub(int32_t rawdata[], uint8_t RecordResu for (k = 0; k < Key_Channel; k++) { iArrayIndex = y_ch * x_ch + k; - RecordResult[iArrayIndex] = 0x00; + RecordResult[iArrayIndex] = 0x00; /* default value for PASS*/ if (rawdata[iArrayIndex] > Rawdata_Limit_Postive[iArrayIndex]) RecordResult[iArrayIndex] |= 0x01; @@ -1051,6 +1069,7 @@ static int32_t RawDataTest_SinglePoint_Sub(int32_t rawdata[], uint8_t RecordResu } #endif /* #if TOUCH_KEY_NUM > 0 */ + /*---Check RecordResult---*/ for (j = 0; j < y_ch; j++) { for (i = 0; i < x_ch; i++) { if (RecordResult[j * x_ch + i] != 0) { @@ -1070,9 +1089,9 @@ static int32_t RawDataTest_SinglePoint_Sub(int32_t rawdata[], uint8_t RecordResu #endif /* #if TOUCH_KEY_NUM > 0 */ if (isPass == false) { - return -1; + return -1; /* FAIL*/ } else { - return 0; + return 0; /* PASS*/ } } @@ -1107,30 +1126,38 @@ void print_selftest_result(struct seq_file *m, int32_t TestResult, uint8_t Recor for (i = 0; i < y_len; i++) { for (j = 0; j < x_len; j++) { iArrayIndex = i * x_len + j; - nvt_mp_seq_printf(m, "0x%02X, ", RecordResult[iArrayIndex]); + seq_printf(m, "0x%02X, ", RecordResult[iArrayIndex]); } + if (!nvt_mp_test_result_printed) + nvt_print_result_log_in_one_line(RecordResult + i * x_len, x_len); nvt_mp_seq_printf(m, "\n"); } #if TOUCH_KEY_NUM > 0 for (k = 0; k < Key_Channel; k++) { iArrayIndex = y_len * x_len + k; - nvt_mp_seq_printf(m, "0x%02X, ", RecordResult[iArrayIndex]); + seq_printf(m, "0x%02X, ", RecordResult[iArrayIndex]); } + if (!nvt_mp_test_result_printed) + nvt_print_result_log_in_one_line(RecordResult + y_len * x_len, Key_Channel); nvt_mp_seq_printf(m, "\n"); #endif /* #if TOUCH_KEY_NUM > 0 */ nvt_mp_seq_printf(m, "ReadData:\n"); for (i = 0; i < y_len; i++) { for (j = 0; j < x_len; j++) { iArrayIndex = i * x_len + j; - nvt_mp_seq_printf(m, "%5d, ", rawdata[iArrayIndex]); + seq_printf(m, "%5d, ", rawdata[iArrayIndex]); } + if (!nvt_mp_test_result_printed) + nvt_print_data_log_in_one_line(rawdata + i * x_len, x_len); nvt_mp_seq_printf(m, "\n"); } #if TOUCH_KEY_NUM > 0 for (k = 0; k < Key_Channel; k++) { iArrayIndex = y_len * x_len + k; - nvt_mp_seq_printf(m, "%5d, ", rawdata[iArrayIndex]); + seq_printf(m, "%5d, ", rawdata[iArrayIndex]); } + if (!nvt_mp_test_result_printed) + nvt_print_data_log_in_one_line(rawdata + y_len * x_len, Key_Channel); nvt_mp_seq_printf(m, "\n"); #endif /* #if TOUCH_KEY_NUM > 0 */ break; @@ -1159,7 +1186,7 @@ static int32_t c_show_selftest(struct seq_file *m, void *v) nvt_mp_seq_printf(m, "Short Test"); if ((TestResult_Short == 0) || (TestResult_Short == 1)) { print_selftest_result(m, TestResult_Short, RecordResult_Short, RawData_Short, X_Channel, Y_Channel); - } else { + } else { /* TestResult_Short is -1*/ if (ts->carrier_system) { nvt_mp_seq_printf(m, " FAIL!\n"); if (TestResult_Short_Diff == -1) { @@ -1181,7 +1208,7 @@ static int32_t c_show_selftest(struct seq_file *m, void *v) nvt_mp_seq_printf(m, "FW Rawdata Test"); if ((TestResult_FW_Rawdata == 0) || (TestResult_FW_Rawdata == 1)) { print_selftest_result(m, TestResult_FWMutual, RecordResult_FWMutual, RawData_FWMutual, X_Channel, Y_Channel); - } else { + } else { /* TestResult_FW_Rawdata is -1*/ nvt_mp_seq_printf(m, " FAIL!\n"); if (TestResult_FWMutual == -1) { nvt_mp_seq_printf(m, "FW Mutual"); @@ -1207,7 +1234,7 @@ static int32_t c_show_selftest(struct seq_file *m, void *v) nvt_mp_seq_printf(m, "Noise Test"); if ((TestResult_Noise == 0) || (TestResult_Noise == 1)) { print_selftest_result(m, TestResult_FW_DiffMax, RecordResult_FW_DiffMax, RawData_Diff_Max, X_Channel, Y_Channel); - } else { + } else { /* TestResult_Noise is -1*/ nvt_mp_seq_printf(m, " FAIL!\n"); if (TestResult_FW_DiffMax == -1) { @@ -1332,6 +1359,9 @@ return: *******************************************************/ static int32_t nvt_selftest_open(struct inode *inode, struct file *file) { + struct device_node *np = ts->client->dev.of_node; + unsigned char mpcriteria[32] = {0}; /*novatek-mp-criteria-default*/ + TestResult_Short = 0; TestResult_Short_Diff = 0; TestResult_Short_Base = 0; @@ -1350,10 +1380,40 @@ static int32_t nvt_selftest_open(struct inode *inode, struct file *file) if (mutex_lock_interruptible(&ts->lock)) { return -ERESTARTSYS; } + #if NVT_TOUCH_ESD_PROTECT - nvt_esd_check_enable(false); + nvt_esd_check_enable(false); #endif +#ifdef CONFIG_OF + if (nvt_get_fw_info()) { + mutex_unlock(&ts->lock); + NVT_ERR("get fw info failed!\n"); + return -EAGAIN; + } + + /* Parsing criteria from dts */ + if (of_property_read_bool(np, "novatek,mp-support-dt")) { + /* + * Parsing Criteria by Novatek PID + * The string rule is "novatek-mp-criteria-" + * nvt_pid is 2 bytes (show hex). + * + * Ex. nvt_pid = 500A + * mpcriteria = "novatek-mp-criteria-500A" + */ + snprintf(mpcriteria, PAGE_SIZE, "novatek-mp-criteria-%04X", ts->nvt_pid); + + if (nvt_mp_parse_dt(np, mpcriteria)) { + mutex_unlock(&ts->lock); + NVT_ERR("mp parse device tree failed!\n"); + return -EINVAL; + } + } else { + NVT_LOG("Not found novatek,mp-support-dt, use default setting\n"); + } +#endif + /*---Print Test Criteria---*/ nvt_print_criteria(); if (nvt_switch_FreqHopEnDis(FREQ_HOP_DISABLE)) { @@ -1370,6 +1430,7 @@ static int32_t nvt_selftest_open(struct inode *inode, struct file *file) msleep(100); + /*---Enter Test Mode---*/ if (nvt_clear_fw_status()) { mutex_unlock(&ts->lock); NVT_ERR("clear fw status failed!\n"); @@ -1384,12 +1445,7 @@ static int32_t nvt_selftest_open(struct inode *inode, struct file *file) return -EAGAIN; } - if (nvt_get_fw_info()) { - mutex_unlock(&ts->lock); - NVT_ERR("get fw info failed!\n"); - return -EAGAIN; - } - + /*---FW Rawdata Test---*/ if (nvt_read_baseline(RawData_FWMutual) != 0) { TestResult_FWMutual = 1; } else { @@ -1404,20 +1460,17 @@ static int32_t nvt_selftest_open(struct inode *inode, struct file *file) } } else { if (ts->carrier_system) { - TestResult_FW_CC_I = RawDataTest_Sub(RawData_FW_CC_I, RecordResult_FW_CC_I, X_Channel, Y_Channel, - PS_Config_Lmt_FW_CC_I_P, PS_Config_Lmt_FW_CC_I_N, - PS_Config_Lmt_Key_FW_CC_I_P, PS_Config_Lmt_Key_FW_CC_I_N); - TestResult_FW_CC_Q = RawDataTest_Sub(RawData_FW_CC_Q, RecordResult_FW_CC_Q, X_Channel, Y_Channel, - PS_Config_Lmt_FW_CC_Q_P, PS_Config_Lmt_FW_CC_Q_N, - PS_Config_Lmt_Key_FW_CC_Q_P, PS_Config_Lmt_Key_FW_CC_Q_N); + TestResult_FW_CC_I = RawDataTest_SinglePoint_Sub(RawData_FW_CC_I, RecordResult_FW_CC_I, X_Channel, Y_Channel, + PS_Config_Lmt_FW_CC_I_P, PS_Config_Lmt_FW_CC_I_N); + TestResult_FW_CC_Q = RawDataTest_SinglePoint_Sub(RawData_FW_CC_Q, RecordResult_FW_CC_Q, X_Channel, Y_Channel, + PS_Config_Lmt_FW_CC_Q_P, PS_Config_Lmt_FW_CC_Q_N); if ((TestResult_FW_CC_I == -1) || (TestResult_FW_CC_Q == -1)) TestResult_FW_CC = -1; else TestResult_FW_CC = 0; } else { - TestResult_FW_CC = RawDataTest_Sub(RawData_FW_CC, RecordResult_FW_CC, X_Channel, Y_Channel, - PS_Config_Lmt_FW_CC_P, PS_Config_Lmt_FW_CC_N, - PS_Config_Lmt_Key_FW_CC_P, PS_Config_Lmt_Key_FW_CC_N); + TestResult_FW_CC = RawDataTest_SinglePoint_Sub(RawData_FW_CC, RecordResult_FW_CC, X_Channel, Y_Channel, + PS_Config_Lmt_FW_CC_P, PS_Config_Lmt_FW_CC_N); } } @@ -1430,23 +1483,24 @@ static int32_t nvt_selftest_open(struct inode *inode, struct file *file) TestResult_FW_Rawdata = 0; } + /*---Leave Test Mode---*/ nvt_change_mode(NORMAL_MODE); + /*---Noise Test---*/ if (nvt_read_fw_noise(RawData_Diff) != 0) { - TestResult_Noise = 1; + TestResult_Noise = 1; /* 1: ERROR*/ TestResult_FW_DiffMax = 1; TestResult_FW_DiffMin = 1; } else { - TestResult_FW_DiffMax = RawDataTest_Sub(RawData_Diff_Max, RecordResult_FW_DiffMax, X_Channel, Y_Channel, - PS_Config_Lmt_FW_Diff_P, PS_Config_Lmt_FW_Diff_N, - PS_Config_Lmt_Key_FW_Diff_P, PS_Config_Lmt_Key_FW_Diff_N); + TestResult_FW_DiffMax = RawDataTest_SinglePoint_Sub(RawData_Diff_Max, RecordResult_FW_DiffMax, X_Channel, Y_Channel, + PS_Config_Lmt_FW_Diff_P, PS_Config_Lmt_FW_Diff_N); + /* for carrier sensing system, only positive noise data*/ if (ts->carrier_system) { TestResult_FW_DiffMin = 0; } else { - TestResult_FW_DiffMin = RawDataTest_Sub(RawData_Diff_Min, RecordResult_FW_DiffMin, X_Channel, Y_Channel, - PS_Config_Lmt_FW_Diff_P, PS_Config_Lmt_FW_Diff_N, - PS_Config_Lmt_Key_FW_Diff_P, PS_Config_Lmt_Key_FW_Diff_N); + TestResult_FW_DiffMin = RawDataTest_SinglePoint_Sub(RawData_Diff_Min, RecordResult_FW_DiffMin, X_Channel, Y_Channel, + PS_Config_Lmt_FW_Diff_P, PS_Config_Lmt_FW_Diff_N); } if ((TestResult_FW_DiffMax == -1) || (TestResult_FW_DiffMin == -1)) @@ -1455,39 +1509,41 @@ static int32_t nvt_selftest_open(struct inode *inode, struct file *file) TestResult_Noise = 0; } + /*--Short Test---*/ if (nvt_read_fw_short(RawData_Short) != 0) { - TestResult_Short = 1; + TestResult_Short = 1; /* 1:ERROR*/ if (ts->carrier_system) { TestResult_Short_Diff = 1; TestResult_Short_Base = 1; } } else { + /*---Self Test Check --- 0:PASS, -1:FAIL*/ if (ts->carrier_system) { - TestResult_Short_Diff = RawDataTest_Sub(RawData_Short_Diff, RecordResult_Short_Diff, X_Channel, Y_Channel, - PS_Config_Lmt_Short_Diff_P, PS_Config_Lmt_Short_Diff_N, - PS_Config_Lmt_Key_Short_Diff_P, PS_Config_Lmt_Key_Short_Diff_N); - TestResult_Short_Base = RawDataTest_Sub(RawData_Short_Base, RecordResult_Short_Base, X_Channel, Y_Channel, - PS_Config_Lmt_Short_Base_P, PS_Config_Lmt_Short_Base_N, - PS_Config_Lmt_Key_Short_Base_P, PS_Config_Lmt_Key_Short_Base_N); + TestResult_Short_Diff = RawDataTest_SinglePoint_Sub(RawData_Short_Diff, RecordResult_Short_Diff, X_Channel, Y_Channel, + PS_Config_Lmt_Short_Diff_P, PS_Config_Lmt_Short_Diff_N); + TestResult_Short_Base = RawDataTest_SinglePoint_Sub(RawData_Short_Base, RecordResult_Short_Base, X_Channel, Y_Channel, + PS_Config_Lmt_Short_Base_P, PS_Config_Lmt_Short_Base_N); if ((TestResult_Short_Diff == -1) || (TestResult_Short_Base == -1)) TestResult_Short = -1; else TestResult_Short = 0; } else { - TestResult_Short = RawDataTest_Sub(RawData_Short, RecordResult_Short, X_Channel, Y_Channel, - PS_Config_Lmt_Short_Rawdata_P, PS_Config_Lmt_Short_Rawdata_N, - PS_Config_Lmt_Key_Short_Rawdata_P, PS_Config_Lmt_Key_Short_Rawdata_N); + TestResult_Short = RawDataTest_SinglePoint_Sub(RawData_Short, RecordResult_Short, X_Channel, Y_Channel, + PS_Config_Lmt_Short_Rawdata_P, PS_Config_Lmt_Short_Rawdata_N); } } + /*---Open Test---*/ if (nvt_read_fw_open(RawData_Open) != 0) { - TestResult_Open = 1; + TestResult_Open = 1; /* 1:ERROR*/ } else { + /*---Self Test Check --- 0:PASS, -1:FAIL*/ TestResult_Open = RawDataTest_SinglePoint_Sub(RawData_Open, RecordResult_Open, X_Channel, Y_Channel, PS_Config_Lmt_Open_Rawdata_P, PS_Config_Lmt_Open_Rawdata_N); } + /*---Reset IC---*/ nvt_bootloader_reset(); mutex_unlock(&ts->lock); @@ -1641,7 +1697,7 @@ Description: return: n.a. *******************************************************/ -void nvt_mp_parse_ain(struct device_node *np, const char *name, uint8_t *array, int32_t size) +int32_t nvt_mp_parse_ain(struct device_node *np, const char *name, uint8_t *array, int32_t size) { struct property *data; int32_t len, ret; @@ -1650,15 +1706,15 @@ void nvt_mp_parse_ain(struct device_node *np, const char *name, uint8_t *array, data = of_find_property(np, name, &len); len /= sizeof(u32); - if ((!data) || (!len) || (len != size)) { NVT_ERR("error find %s. len=%d\n", name, len); + return -1; } else { NVT_LOG("%s. len=%d\n", name, len); ret = of_property_read_u32_array(np, name, tmp, len); if (ret) { NVT_ERR("error reading %s. ret=%d\n", name, ret); - return; + return -1; } for (i = 0; i < len; i++) @@ -1666,12 +1722,12 @@ void nvt_mp_parse_ain(struct device_node *np, const char *name, uint8_t *array, #if NVT_DEBUG printk("[NVT-ts] %s = ", name); - for (i = 0; i < len; i++) { - printk("%02d ", array[i]); - } + nvt_print_result_log_in_one_line(array, len); printk("\n"); #endif } + + return 0; } /******************************************************* @@ -1681,18 +1737,21 @@ Description: return: n.a. *******************************************************/ -void nvt_mp_parse_u32(struct device_node *np, const char *name, int32_t *para) +int32_t nvt_mp_parse_u32(struct device_node *np, const char *name, int32_t *para) { int32_t ret; ret = of_property_read_u32(np, name, para); - if (ret) + if (ret) { NVT_ERR("error reading %s. ret=%d\n", name, ret); - else { + return -1; + } else { #if NVT_DEBUG NVT_LOG("%s=%d\n", name, *para); #endif } + + return 0; } /******************************************************* @@ -1702,46 +1761,42 @@ Description: return: n.a. *******************************************************/ -void nvt_mp_parse_array(struct device_node *np, const char *name, int32_t *array, +int32_t nvt_mp_parse_array(struct device_node *np, const char *name, int32_t *array, int32_t size) { struct property *data; int32_t len, ret; #if NVT_DEBUG - int32_t i, j, iArrayIndex = 0; + int32_t j = 0; #endif data = of_find_property(np, name, &len); len /= sizeof(u32); if ((!data) || (!len) || (len < size)) { NVT_ERR("error find %s. len=%d\n", name, len); + return -1; } else { NVT_LOG("%s. len=%d\n", name, len); ret = of_property_read_u32_array(np, name, array, len); if (ret) { NVT_ERR("error reading %s. ret=%d\n", name, ret); - return; + return -1; } #if NVT_DEBUG NVT_LOG("%s =\n", name); for (j = 0; j < Y_Channel; j++) { - printk("[NVT-ts] "); - for (i = 0; i < X_Channel; i++) { - iArrayIndex = j * X_Channel + i; - printk("%d ", array[iArrayIndex]); - } + nvt_print_data_log_in_one_line(array + j * X_Channel, X_Channel); printk("\n"); } - - for (i = 0; i < Key_Channel; i++) { - iArrayIndex++; - printk("%d ", array[iArrayIndex]); - } - +#if TOUCH_KEY_NUM > 0 + nvt_print_data_log_in_one_line(array + Y_Channel * X_Channel, Key_Channel); printk("\n"); +#endif #endif } + + return 0; } /******************************************************* @@ -1751,7 +1806,7 @@ Description: return: n.a. *******************************************************/ -void nvt_mp_parse_dt(struct device_node *root, const char *node_compatible) +int32_t nvt_mp_parse_dt(struct device_node *root, const char *node_compatible) { struct device_node *np = root; struct device_node *child = NULL; @@ -1767,96 +1822,125 @@ void nvt_mp_parse_dt(struct device_node *root, const char *node_compatible) break; } } + if (child == NULL) { + NVT_ERR("Not found compatible node %s!\n", node_compatible); + return -1; + } /* MP Config*/ - nvt_mp_parse_u32(np, "IC_X_CFG_SIZE", &IC_X_CFG_SIZE); + if (nvt_mp_parse_u32(np, "IC_X_CFG_SIZE", &IC_X_CFG_SIZE)) + return -1; - nvt_mp_parse_u32(np, "IC_Y_CFG_SIZE", &IC_Y_CFG_SIZE); - - nvt_mp_parse_u32(np, "IC_KEY_CFG_SIZE", &IC_KEY_CFG_SIZE); - - nvt_mp_parse_u32(np, "X_Channel", &X_Channel); - - nvt_mp_parse_u32(np, "Y_Channel", &Y_Channel); - - nvt_mp_parse_ain(np, "AIN_X", AIN_X, IC_X_CFG_SIZE); - - nvt_mp_parse_ain(np, "AIN_Y", AIN_Y, IC_Y_CFG_SIZE); + if (nvt_mp_parse_u32(np, "IC_Y_CFG_SIZE", &IC_Y_CFG_SIZE)) + return -1; #if TOUCH_KEY_NUM > 0 - nvt_mp_parse_ain(np, "AIN_KEY", AIN_KEY, IC_KEY_CFG_SIZE); + if (nvt_mp_parse_u32(np, "IC_KEY_CFG_SIZE", &IC_KEY_CFG_SIZE)) + return -1; +#endif + + if (nvt_mp_parse_u32(np, "X_Channel", &X_Channel)) + return -1; + + if (nvt_mp_parse_u32(np, "Y_Channel", &Y_Channel)) + return -1; + + if (nvt_mp_parse_ain(np, "AIN_X", AIN_X, IC_X_CFG_SIZE)) + return -1; + + if (nvt_mp_parse_ain(np, "AIN_Y", AIN_Y, IC_Y_CFG_SIZE)) + return -1; + +#if TOUCH_KEY_NUM > 0 + if (nvt_mp_parse_ain(np, "AIN_KEY", AIN_KEY, IC_KEY_CFG_SIZE)) + return -1; #endif /* MP Criteria */ - nvt_mp_parse_u32(np, "PS_Config_Lmt_Short_Rawdata_P", &PS_Config_Lmt_Short_Rawdata_P); + if (ts->carrier_system) { + if (nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Diff_P", PS_Config_Lmt_Short_Diff_P, + X_Channel * Y_Channel + Key_Channel)) + return -1; - nvt_mp_parse_u32(np, "PS_Config_Lmt_Short_Rawdata_N", &PS_Config_Lmt_Short_Rawdata_N); + if (nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Diff_N", PS_Config_Lmt_Short_Diff_N, + X_Channel * Y_Channel + Key_Channel)) + return -1; - nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_Short_Rawdata_P", &PS_Config_Lmt_Key_Short_Rawdata_P); + if (nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Base_P", PS_Config_Lmt_Short_Base_P, + X_Channel * Y_Channel + Key_Channel)) + return -1; - nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_Short_Rawdata_N", &PS_Config_Lmt_Key_Short_Rawdata_N); + if (nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Base_N", PS_Config_Lmt_Short_Base_N, + X_Channel * Y_Channel + Key_Channel)) + return -1; + } else { + if (nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Rawdata_P", PS_Config_Lmt_Short_Rawdata_P, + X_Channel * Y_Channel + Key_Channel)) + return -1; - nvt_mp_parse_u32(np, "PS_Config_Lmt_Short_Diff_P", &PS_Config_Lmt_Short_Diff_P); + if (nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Rawdata_N", PS_Config_Lmt_Short_Rawdata_N, + X_Channel * Y_Channel + Key_Channel)) + return -1; + } - nvt_mp_parse_u32(np, "PS_Config_Lmt_Short_Diff_N", &PS_Config_Lmt_Short_Diff_N); + if (nvt_mp_parse_array(np, "PS_Config_Lmt_Open_Rawdata_P", PS_Config_Lmt_Open_Rawdata_P, + X_Channel * Y_Channel + Key_Channel)) + return -1; - nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_Short_Diff_P", &PS_Config_Lmt_Key_Short_Diff_P); + if (nvt_mp_parse_array(np, "PS_Config_Lmt_Open_Rawdata_N", PS_Config_Lmt_Open_Rawdata_N, + X_Channel * Y_Channel + Key_Channel)) + return -1; - nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_Short_Diff_N", &PS_Config_Lmt_Key_Short_Diff_N); + if (nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Rawdata_P", PS_Config_Lmt_FW_Rawdata_P, + X_Channel * Y_Channel + Key_Channel)) + return -1; - nvt_mp_parse_u32(np, "PS_Config_Lmt_Short_Base_P", &PS_Config_Lmt_Short_Base_P); + if (nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Rawdata_N", PS_Config_Lmt_FW_Rawdata_N, + X_Channel * Y_Channel + Key_Channel)) + return -1; - nvt_mp_parse_u32(np, "PS_Config_Lmt_Short_Base_N", &PS_Config_Lmt_Short_Base_N); + if (ts->carrier_system) { + if (nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_I_P", PS_Config_Lmt_FW_CC_I_P, + X_Channel * Y_Channel + Key_Channel)) + return -1; - nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_Short_Base_P", &PS_Config_Lmt_Key_Short_Base_P); + if (nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_I_N", PS_Config_Lmt_FW_CC_I_N, + X_Channel * Y_Channel + Key_Channel)) + return -1; - nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_Short_Base_N", &PS_Config_Lmt_Key_Short_Base_N); + if (nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_Q_P", PS_Config_Lmt_FW_CC_Q_P, + X_Channel * Y_Channel + Key_Channel)) + return -1; - nvt_mp_parse_array(np, "PS_Config_Lmt_Open_Rawdata_P", PS_Config_Lmt_Open_Rawdata_P, - X_Channel * Y_Channel + Key_Channel); + if (nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_Q_N", PS_Config_Lmt_FW_CC_Q_N, + X_Channel * Y_Channel + Key_Channel)) + return -1; + } else { + if (nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_P", PS_Config_Lmt_FW_CC_P, + X_Channel * Y_Channel + Key_Channel)) + return -1; - nvt_mp_parse_array(np, "PS_Config_Lmt_Open_Rawdata_N", PS_Config_Lmt_Open_Rawdata_N, - X_Channel * Y_Channel + Key_Channel); + if (nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_N", PS_Config_Lmt_FW_CC_N, + X_Channel * Y_Channel + Key_Channel)) + return -1; + } - nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Rawdata_P", PS_Config_Lmt_FW_Rawdata_P, - X_Channel * Y_Channel + Key_Channel); + if (nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Diff_P", PS_Config_Lmt_FW_Diff_P, + X_Channel * Y_Channel + Key_Channel)) + return -1; - nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Rawdata_N", PS_Config_Lmt_FW_Rawdata_N, - X_Channel * Y_Channel + Key_Channel); + if (nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Diff_N", PS_Config_Lmt_FW_Diff_N, + X_Channel * Y_Channel + Key_Channel)) + return -1; - nvt_mp_parse_u32(np, "PS_Config_Lmt_FW_CC_P", &PS_Config_Lmt_FW_CC_P); - - nvt_mp_parse_u32(np, "PS_Config_Lmt_FW_CC_N", &PS_Config_Lmt_FW_CC_N); - - nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_FW_CC_P", &PS_Config_Lmt_Key_FW_CC_P); - - nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_FW_CC_N", &PS_Config_Lmt_Key_FW_CC_N); - - nvt_mp_parse_u32(np, "PS_Config_Lmt_FW_CC_I_P", &PS_Config_Lmt_FW_CC_I_P); - - nvt_mp_parse_u32(np, "PS_Config_Lmt_FW_CC_I_N", &PS_Config_Lmt_FW_CC_I_N); - - nvt_mp_parse_u32(np, "PS_Config_Lmt_FW_CC_Q_P", &PS_Config_Lmt_FW_CC_Q_P); - - nvt_mp_parse_u32(np, "PS_Config_Lmt_FW_CC_Q_N", &PS_Config_Lmt_FW_CC_Q_N); - - nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_FW_CC_I_P", &PS_Config_Lmt_Key_FW_CC_I_P); - - nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_FW_CC_I_N", &PS_Config_Lmt_Key_FW_CC_I_N); - - nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_FW_CC_Q_P", &PS_Config_Lmt_Key_FW_CC_Q_P); - - nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_FW_CC_Q_N", &PS_Config_Lmt_Key_FW_CC_Q_N); - - nvt_mp_parse_u32(np, "PS_Config_Lmt_FW_Diff_P", &PS_Config_Lmt_FW_Diff_P); - - nvt_mp_parse_u32(np, "PS_Config_Lmt_FW_Diff_N", &PS_Config_Lmt_FW_Diff_N); - - nvt_mp_parse_u32(np, "PS_Config_Diff_Test_Frame", &PS_Config_Diff_Test_Frame); + if (nvt_mp_parse_u32(np, "PS_Config_Diff_Test_Frame", &PS_Config_Diff_Test_Frame)) + return -1; NVT_LOG("Parse mp criteria done!\n"); + + return 0; } -#endif +#endif /* #ifdef CONFIG_OF */ /******************************************************* Description: @@ -1868,53 +1952,29 @@ return: *******************************************************/ int32_t nvt_mp_proc_init(void) { - int32_t ret = 0; - struct device_node *np = ts->client->dev.of_node; - unsigned char mpcriteria[32] = {0}; - NVT_proc_selftest_entry = proc_create("nvt_selftest", 0444, NULL, &nvt_selftest_fops); if (NVT_proc_selftest_entry == NULL) { NVT_ERR("create /proc/nvt_selftest Failed!\n"); - ret = -1; + return -1; } else { if (nvt_mp_buffer_init()) { NVT_ERR("Allocate mp memory failed\n"); - ret = -1; + return -1; } else { -#ifdef CONFIG_OF - /* Parsing criteria from dts */ - if (of_property_read_bool(np, "novatek,mp-support-dt")) { - /* - * Parsing Criteria by Novatek PID - * The string rule is "novatek-mp-criteria-" - * nvt_pid is 2 bytes (show hex). - * - * Ex. nvt_pid = 500A - * mpcriteria = "novatek-mp-criteria-500A" - */ - snprintf(mpcriteria, PAGE_SIZE, "novatek-mp-criteria-%04X", ts->nvt_pid); - - nvt_mp_parse_dt(np, mpcriteria); - } else { - NVT_LOG("Not found novatek,mp-support-dt, use default setting\n"); - } -#endif NVT_LOG("create /proc/nvt_selftest Succeeded!\n"); } - ret = 0; + return 0; } #if NVT_TOUCH_MP_LENOVO - if (ret == 0) { - NVT_proc_selftest_read_data = proc_create("nvt_read_data", 0444, NULL, &nvt_read_data_fops); - if (NVT_proc_selftest_read_data == NULL) { - NVT_ERR("create /proc/nvt_read_data Failed!\n"); - ret = -1; - } else { - NVT_LOG("create /proc/nvt_read_data Succeeded!\n"); - } + NVT_proc_selftest_read_data = proc_create("nvt_read_data", 0444, NULL, &nvt_read_data_fops); + if (NVT_proc_selftest_read_data == NULL) { + NVT_ERR("create /proc/nvt_read_data Failed!\n"); + return -1; + } else { + NVT_LOG("create /proc/nvt_read_data Succeeded!\n"); } #endif - return ret; + return 0; } #endif /* #if NVT_TOUCH_MP */ diff --git a/drivers/input/touchscreen/nova_mmi/nt36xxx_mp_ctrlram.h b/drivers/input/touchscreen/nova_mmi/nt36xxx_mp_ctrlram.h index 0ce674b40362..6c915cca2739 100644 --- a/drivers/input/touchscreen/nova_mmi/nt36xxx_mp_ctrlram.h +++ b/drivers/input/touchscreen/nova_mmi/nt36xxx_mp_ctrlram.h @@ -19,199 +19,772 @@ #if NVT_TOUCH_MP static uint32_t IC_X_CFG_SIZE = 18; -static uint32_t IC_Y_CFG_SIZE = 32; +static uint32_t IC_Y_CFG_SIZE = 36; static uint32_t IC_KEY_CFG_SIZE = 4; static uint32_t X_Channel = 18; -static uint32_t Y_Channel = 32; +static uint32_t Y_Channel = 36; static uint32_t Key_Channel = TOUCH_KEY_NUM; -static uint8_t AIN_X[40] = {17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; -static uint8_t AIN_Y[40] = {31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0}; +static uint8_t AIN_X[40] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17}; +static uint8_t AIN_Y[40] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35}; #if TOUCH_KEY_NUM > 0 static uint8_t AIN_KEY[8] = {0, 1, 2, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; #endif /* #if TOUCH_KEY_NUM > 0 */ -static int32_t PS_Config_Lmt_Short_Rawdata_P = 13500; -static int32_t PS_Config_Lmt_Short_Rawdata_N = 11500; -static int32_t PS_Config_Lmt_Key_Short_Rawdata_P = 20000; -static int32_t PS_Config_Lmt_Key_Short_Rawdata_N = 11550; -static int32_t PS_Config_Lmt_Short_Diff_P = 6300; -static int32_t PS_Config_Lmt_Short_Diff_N; -static int32_t PS_Config_Lmt_Key_Short_Diff_P = 6300; -static int32_t PS_Config_Lmt_Key_Short_Diff_N; -static int32_t PS_Config_Lmt_Short_Base_P = 2000; -static int32_t PS_Config_Lmt_Short_Base_N = -2000; -static int32_t PS_Config_Lmt_Key_Short_Base_P = 2000; -static int32_t PS_Config_Lmt_Key_Short_Base_N = -2000; +static int32_t PS_Config_Lmt_Short_Rawdata_P[40 * 40] = { + 65535, 14008, 14008, 14008, 14008, 14008, 65535, 65535, 65535, 65535, 65535, 65535, 14008, 14008, 14008, 14008, 14008, 65535, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, + 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, 14008, +#if TOUCH_KEY_NUM > 0 + 20000, 20000, 20000, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_Short_Rawdata_N[40 * 40] = { + -65535, 11376, 11376, 11376, 11376, 11376, -65535, -65535, -65535, -65535, -65535, -65535, 11376, 11376, 11376, 11376, 11376, -65535, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, + 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, 11376, +#if TOUCH_KEY_NUM > 0 + 11550, 11550, 11550, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_Short_Diff_P[40 * 40] = { + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, + 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, 6300, +#if TOUCH_KEY_NUM > 0 + 6300, 6300, 6300, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_Short_Diff_N[40 * 40] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +#if TOUCH_KEY_NUM > 0 + 0, 0, 0, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_Short_Base_P[40 * 40] = { + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, +#if TOUCH_KEY_NUM > 0 + 2000, 2000, 2000, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_Short_Base_N[40 * 40] = { + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, + -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, -2000, +#if TOUCH_KEY_NUM > 0 + -2000, -2000, -2000, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; static int32_t PS_Config_Lmt_Open_Rawdata_P[40 * 40] = { - 5149, 5167, 5201, 5164, 5204, 5167, 5201, 5177, 5233, 5217, 5168, 5193, 5161, 5187, 5161, 5190, 5154, 5145, - 4926, 4937, 4968, 4929, 4970, 4933, 4967, 4942, 4998, 4986, 4936, 4964, 4933, 4962, 4933, 4965, 4927, 4929, - 4901, 4907, 4937, 4898, 4936, 4901, 4934, 4908, 4965, 4959, 4910, 4936, 4905, 4936, 4905, 4936, 4902, 4904, - 4865, 4868, 4901, 4862, 4898, 4865, 4896, 4871, 4927, 4901, 4852, 4877, 4848, 4877, 4846, 4876, 4845, 4842, - 4860, 4865, 4895, 4858, 4892, 4861, 4892, 4867, 4921, 4911, 4864, 4887, 4860, 4889, 4858, 4886, 4855, 4852, - 4862, 4870, 4898, 4862, 4895, 4865, 4895, 4873, 4924, 4905, 4860, 4882, 4855, 4882, 4854, 4880, 4852, 4845, - 4860, 4867, 4893, 4861, 4890, 4864, 4889, 4868, 4920, 4904, 4861, 4880, 4855, 4880, 4855, 4879, 4852, 4842, - 4858, 4867, 4890, 4861, 4887, 4862, 4887, 4868, 4917, 4902, 4861, 4877, 4855, 4879, 4854, 4876, 4854, 4839, - 4854, 4864, 4885, 4858, 4882, 4860, 4880, 4864, 4910, 4905, 4865, 4879, 4858, 4880, 4858, 4877, 4858, 4842, - 4867, 4877, 4895, 4871, 4893, 4873, 4892, 4877, 4923, 4907, 4867, 4879, 4861, 4879, 4860, 4877, 4861, 4840, - 4858, 4870, 4887, 4862, 4885, 4865, 4883, 4870, 4914, 4899, 4861, 4871, 4855, 4873, 4854, 4870, 4855, 4835, - 4857, 4867, 4885, 4861, 4882, 4864, 4882, 4867, 4911, 4902, 4864, 4874, 4857, 4877, 4855, 4873, 4858, 4837, - 4858, 4870, 4886, 4864, 4885, 4865, 4883, 4870, 4914, 4896, 4860, 4870, 4854, 4871, 4851, 4867, 4854, 4832, - 4855, 4867, 4883, 4862, 4880, 4862, 4880, 4867, 4911, 4902, 4864, 4874, 4858, 4876, 4857, 4871, 4858, 4836, - 4855, 4867, 4883, 4861, 4880, 4864, 4880, 4867, 4911, 4892, 4855, 4864, 4848, 4867, 4848, 4862, 4851, 4826, - 4852, 4864, 4882, 4860, 4879, 4861, 4877, 4864, 4907, 4895, 4858, 4867, 4852, 4870, 4851, 4865, 4854, 4829, - 4846, 4864, 4883, 4861, 4879, 4861, 4879, 4864, 4908, 4885, 4854, 4864, 4849, 4865, 4848, 4864, 4851, 4827, - 4843, 4858, 4877, 4855, 4871, 4855, 4871, 4858, 4901, 4895, 4862, 4871, 4858, 4874, 4855, 4873, 4861, 4835, - 4849, 4862, 4882, 4860, 4876, 4860, 4877, 4862, 4907, 4885, 4851, 4860, 4846, 4862, 4843, 4861, 4851, 4824, - 4836, 4849, 4868, 4848, 4864, 4848, 4864, 4852, 4895, 4883, 4851, 4858, 4846, 4862, 4843, 4861, 4849, 4823, - 4839, 4852, 4870, 4849, 4865, 4851, 4865, 4852, 4895, 4880, 4848, 4855, 4843, 4860, 4840, 4858, 4848, 4820, - 4840, 4854, 4871, 4851, 4865, 4851, 4867, 4854, 4896, 4877, 4846, 4854, 4840, 4857, 4839, 4857, 4846, 4818, - 4826, 4839, 4857, 4836, 4851, 4836, 4852, 4839, 4882, 4871, 4840, 4848, 4836, 4852, 4833, 4851, 4842, 4812, - 4830, 4845, 4862, 4843, 4857, 4842, 4857, 4845, 4887, 4864, 4835, 4842, 4830, 4845, 4827, 4845, 4836, 4807, - 4827, 4842, 4860, 4839, 4852, 4839, 4854, 4842, 4885, 4862, 4832, 4839, 4827, 4842, 4824, 4842, 4835, 4804, - 4821, 4836, 4852, 4833, 4846, 4833, 4848, 4836, 4879, 4864, 4835, 4842, 4829, 4843, 4827, 4845, 4837, 4808, - 4821, 4837, 4855, 4835, 4848, 4833, 4848, 4836, 4879, 4858, 4830, 4837, 4826, 4840, 4824, 4842, 4836, 4804, - 4818, 4833, 4852, 4830, 4845, 4830, 4846, 4833, 4876, 4855, 4826, 4835, 4821, 4837, 4820, 4839, 4830, 4799, - 4818, 4835, 4854, 4832, 4849, 4830, 4849, 4833, 4880, 4862, 4832, 4843, 4827, 4846, 4826, 4848, 4837, 4805, - 4870, 4882, 4904, 4879, 4898, 4877, 4899, 4882, 4930, 4912, 4879, 4893, 4874, 4896, 4874, 4898, 4885, 4857, - 4854, 4860, 4876, 4851, 4868, 4849, 4870, 4857, 4904, 4876, 4845, 4855, 4839, 4857, 4837, 4861, 4855, 4833, - 4995, 4993, 4986, 4967, 4964, 4964, 4976, 4974, 5017, 4996, 4971, 4967, 4958, 4968, 4961, 4982, 5002, 4989, + 65535, 5073, 5699, 4902, 4158, 3372, 65535, 65535, 65535, 65535, 65535, 65535, 3252, 4097, 4856, 5603, 5211, 65535, + 2067, 1988, 1973, 1943, 1928, 1889, 1887, 1788, 1748, 1742, 1779, 1871, 1892, 1923, 1944, 1986, 2018, 2258, + 1811, 1848, 1842, 1826, 1820, 1797, 1850, 1874, 1835, 1874, 1908, 1886, 1836, 1859, 1875, 1905, 1920, 1967, + 1838, 1869, 1863, 1844, 1844, 1824, 1875, 1898, 1860, 1826, 1863, 1844, 1797, 1812, 1827, 1854, 1869, 1889, + 1803, 1833, 1829, 1818, 1814, 1793, 1847, 1865, 1826, 1809, 1844, 1827, 1778, 1799, 1811, 1835, 1845, 1866, + 1844, 1866, 1854, 1845, 1836, 1821, 1874, 1890, 1856, 1826, 1862, 1853, 1788, 1814, 1826, 1848, 1865, 1890, + 1829, 1851, 1838, 1826, 1820, 1805, 1859, 1872, 1838, 1872, 1904, 1898, 1841, 1863, 1874, 1895, 1914, 1947, + 1821, 1832, 1826, 1824, 1817, 1800, 1853, 1871, 1833, 1830, 1865, 1865, 1802, 1820, 1841, 1857, 1866, 1899, + 1824, 1833, 1833, 1827, 1821, 1800, 1863, 1874, 1833, 1829, 1856, 1859, 1799, 1814, 1826, 1848, 1854, 1896, + 1803, 1809, 1806, 1805, 1796, 1770, 1842, 1848, 1806, 1817, 1847, 1847, 1785, 1805, 1818, 1836, 1848, 1887, + 1818, 1829, 1820, 1817, 1812, 1790, 1862, 1862, 1823, 1802, 1832, 1830, 1770, 1793, 1802, 1823, 1824, 1871, + 1805, 1814, 1800, 1800, 1793, 1776, 1844, 1844, 1805, 1796, 1818, 1821, 1755, 1778, 1793, 1809, 1823, 1865, + 1805, 1812, 1802, 1793, 1788, 1772, 1844, 1844, 1797, 1805, 1829, 1829, 1755, 1776, 1791, 1809, 1820, 1865, + 1790, 1802, 1793, 1791, 1785, 1766, 1836, 1838, 1791, 1769, 1793, 1802, 1730, 1746, 1758, 1770, 1790, 1824, + 1763, 1790, 1766, 1755, 1752, 1736, 1806, 1806, 1760, 1770, 1769, 1793, 1721, 1733, 1745, 1763, 1809, 1811, + 1757, 1809, 1751, 1748, 1742, 1731, 1800, 1796, 1751, 1737, 1754, 1770, 1695, 1713, 1730, 1742, 1800, 1784, + 1749, 1802, 1746, 1740, 1736, 1721, 1796, 1802, 1742, 1748, 1776, 1781, 1707, 1721, 1736, 1748, 1809, 1793, + 1746, 1797, 1740, 1737, 1730, 1715, 1794, 1782, 1737, 1703, 1716, 1737, 1665, 1679, 1698, 1706, 1761, 1755, + 1713, 1760, 1710, 1691, 1677, 1656, 1731, 1716, 1667, 1715, 1725, 1743, 1661, 1674, 1686, 1731, 1752, 1749, + 1688, 1734, 1725, 1673, 1659, 1637, 1719, 1697, 1662, 1698, 1704, 1725, 1644, 1661, 1673, 1730, 1734, 1725, + 1695, 1736, 1727, 1677, 1665, 1643, 1722, 1697, 1670, 1685, 1689, 1718, 1628, 1643, 1656, 1710, 1725, 1715, + 1677, 1710, 1704, 1653, 1644, 1625, 1704, 1674, 1640, 1664, 1659, 1697, 1613, 1623, 1635, 1695, 1697, 1691, + 1671, 1706, 1701, 1643, 1632, 1614, 1694, 1668, 1626, 1664, 1667, 1701, 1611, 1623, 1641, 1689, 1698, 1692, + 1640, 1668, 1656, 1616, 1595, 1578, 1658, 1634, 1589, 1653, 1655, 1694, 1601, 1617, 1664, 1683, 1688, 1682, + 1623, 1650, 1643, 1631, 1575, 1559, 1641, 1617, 1566, 1619, 1628, 1670, 1571, 1584, 1641, 1650, 1653, 1656, + 1625, 1647, 1641, 1634, 1578, 1557, 1646, 1620, 1566, 1586, 1610, 1638, 1551, 1563, 1620, 1626, 1626, 1629, + 1605, 1629, 1628, 1619, 1560, 1542, 1628, 1607, 1542, 1584, 1613, 1640, 1556, 1563, 1622, 1628, 1628, 1631, + 1611, 1631, 1625, 1611, 1566, 1535, 1623, 1607, 1539, 1548, 1589, 1614, 1524, 1577, 1602, 1611, 1610, 1607, + 1563, 1596, 1584, 1578, 1568, 1497, 1592, 1547, 1494, 1487, 1532, 1565, 1466, 1535, 1544, 1551, 1553, 1548, + 1568, 1593, 1587, 1578, 1568, 1497, 1592, 1551, 1494, 1502, 1550, 1587, 1487, 1556, 1565, 1571, 1571, 1571, + 1542, 1563, 1554, 1551, 1538, 1469, 1565, 1526, 1473, 1487, 1529, 1569, 1466, 1535, 1544, 1550, 1559, 1548, + 1526, 1551, 1547, 1535, 1526, 1455, 1551, 1511, 1455, 1446, 1488, 1529, 1430, 1497, 1508, 1512, 1515, 1508, + 1521, 1550, 1542, 1533, 1524, 1451, 1547, 1508, 1448, 1422, 1458, 1500, 1400, 1470, 1478, 1487, 1487, 1481, + 1491, 1511, 1505, 1497, 1485, 1409, 1511, 1469, 1415, 1401, 1437, 1475, 1383, 1454, 1461, 1467, 1475, 1466, + 1497, 1518, 1503, 1494, 1484, 1406, 1508, 1461, 1404, 1424, 1469, 1512, 1413, 1484, 1493, 1500, 1512, 1514, + 1800, 1806, 1758, 1733, 1709, 1620, 1721, 1680, 1620, 1599, 1643, 1683, 1586, 1661, 1688, 1718, 1754, 1710, #if TOUCH_KEY_NUM > 0 13000, 13000, 13000, #endif /* #if TOUCH_KEY_NUM > 0 */ }; static int32_t PS_Config_Lmt_Open_Rawdata_N[40 * 40] = { - 3821, 3827, 3839, 3826, 3841, 3827, 3839, 3831, 3851, 3845, 3828, 3837, 3825, 3835, 3825, 3836, 3822, 3819, - 3740, 3745, 3756, 3741, 3756, 3743, 3755, 3746, 3766, 3762, 3744, 3754, 3743, 3754, 3743, 3755, 3741, 3741, - 3731, 3733, 3745, 3730, 3744, 3731, 3744, 3734, 3755, 3753, 3735, 3744, 3733, 3744, 3733, 3744, 3732, 3732, - 3719, 3720, 3731, 3718, 3730, 3719, 3730, 3721, 3741, 3731, 3714, 3723, 3712, 3723, 3712, 3722, 3711, 3710, - 3716, 3719, 3729, 3716, 3728, 3717, 3728, 3719, 3739, 3735, 3718, 3727, 3716, 3727, 3716, 3726, 3715, 3714, - 3718, 3720, 3730, 3718, 3729, 3719, 3729, 3721, 3740, 3733, 3716, 3724, 3715, 3724, 3714, 3724, 3714, 3711, - 3716, 3719, 3729, 3717, 3728, 3718, 3727, 3720, 3738, 3732, 3717, 3724, 3715, 3724, 3715, 3723, 3714, 3710, - 3716, 3719, 3728, 3717, 3727, 3718, 3727, 3720, 3737, 3732, 3717, 3723, 3715, 3723, 3714, 3722, 3714, 3709, - 3714, 3718, 3725, 3716, 3724, 3716, 3724, 3718, 3735, 3733, 3719, 3723, 3716, 3724, 3716, 3723, 3716, 3710, - 3719, 3723, 3729, 3721, 3729, 3721, 3728, 3723, 3739, 3733, 3719, 3723, 3717, 3723, 3716, 3723, 3717, 3710, - 3716, 3720, 3727, 3718, 3725, 3719, 3725, 3720, 3736, 3731, 3717, 3721, 3715, 3721, 3714, 3720, 3715, 3707, - 3715, 3719, 3725, 3717, 3724, 3718, 3724, 3719, 3735, 3732, 3718, 3722, 3715, 3723, 3715, 3721, 3716, 3709, - 3716, 3720, 3726, 3718, 3725, 3719, 3725, 3720, 3736, 3730, 3716, 3720, 3714, 3721, 3713, 3719, 3714, 3706, - 3715, 3719, 3725, 3718, 3724, 3718, 3724, 3719, 3735, 3732, 3718, 3722, 3716, 3722, 3715, 3721, 3716, 3708, - 3715, 3719, 3725, 3717, 3724, 3718, 3724, 3719, 3735, 3728, 3715, 3718, 3712, 3719, 3712, 3718, 3713, 3704, - 3714, 3718, 3724, 3716, 3723, 3717, 3723, 3718, 3733, 3729, 3716, 3719, 3714, 3720, 3713, 3719, 3714, 3705, - 3712, 3718, 3725, 3717, 3723, 3717, 3723, 3718, 3734, 3725, 3714, 3718, 3713, 3719, 3712, 3718, 3713, 3705, - 3711, 3716, 3723, 3715, 3721, 3715, 3721, 3716, 3731, 3729, 3718, 3721, 3716, 3722, 3715, 3721, 3717, 3707, - 3713, 3718, 3724, 3716, 3722, 3716, 3723, 3718, 3733, 3725, 3713, 3716, 3712, 3718, 3711, 3717, 3713, 3704, - 3708, 3713, 3720, 3712, 3718, 3712, 3718, 3714, 3729, 3725, 3713, 3716, 3712, 3718, 3711, 3717, 3713, 3703, - 3709, 3714, 3720, 3713, 3719, 3713, 3719, 3714, 3729, 3724, 3712, 3715, 3711, 3716, 3710, 3716, 3712, 3702, - 3710, 3714, 3721, 3713, 3719, 3713, 3719, 3714, 3730, 3723, 3712, 3714, 3710, 3715, 3709, 3715, 3712, 3702, - 3704, 3709, 3715, 3708, 3713, 3708, 3714, 3709, 3724, 3721, 3710, 3712, 3708, 3714, 3707, 3713, 3710, 3700, - 3706, 3711, 3718, 3711, 3715, 3710, 3715, 3711, 3727, 3718, 3707, 3710, 3706, 3711, 3705, 3711, 3708, 3697, - 3705, 3710, 3716, 3709, 3714, 3709, 3714, 3710, 3725, 3718, 3706, 3709, 3705, 3710, 3704, 3710, 3707, 3696, - 3703, 3708, 3714, 3707, 3712, 3707, 3712, 3708, 3723, 3718, 3707, 3710, 3705, 3711, 3705, 3711, 3709, 3698, - 3703, 3709, 3715, 3707, 3712, 3707, 3712, 3708, 3723, 3716, 3706, 3709, 3704, 3710, 3704, 3710, 3708, 3696, - 3702, 3707, 3714, 3706, 3711, 3706, 3712, 3707, 3722, 3715, 3704, 3707, 3703, 3709, 3702, 3709, 3706, 3695, - 3702, 3707, 3714, 3706, 3713, 3706, 3713, 3707, 3724, 3718, 3706, 3711, 3705, 3712, 3704, 3712, 3709, 3697, - 3720, 3724, 3732, 3723, 3730, 3723, 3731, 3724, 3742, 3736, 3723, 3729, 3722, 3730, 3722, 3730, 3725, 3715, - 3714, 3716, 3722, 3713, 3720, 3713, 3720, 3715, 3732, 3722, 3711, 3715, 3709, 3715, 3709, 3717, 3715, 3707, - 3765, 3765, 3762, 3755, 3754, 3754, 3758, 3758, 3773, 3766, 3757, 3755, 3752, 3756, 3753, 3760, 3768, 3763, + -65535, 1691, 1900, 1634, 1386, 1124, -65535, -65535, -65535, -65535, -65535, -65535, 1084, 1366, 1619, 1868, 1737, -65535, + 689, 663, 658, 648, 643, 630, 629, 596, 583, 581, 593, 624, 631, 641, 648, 662, 673, 753, + 604, 616, 614, 609, 607, 599, 617, 625, 612, 625, 636, 629, 612, 620, 625, 635, 640, 656, + 613, 623, 621, 615, 615, 608, 625, 633, 620, 609, 621, 615, 599, 604, 609, 618, 623, 630, + 601, 611, 610, 606, 605, 598, 616, 622, 609, 603, 615, 609, 593, 600, 604, 612, 615, 622, + 615, 622, 618, 615, 612, 607, 625, 630, 619, 609, 621, 618, 596, 605, 609, 616, 622, 630, + 610, 617, 613, 609, 607, 602, 620, 624, 613, 624, 635, 633, 614, 621, 625, 632, 638, 649, + 607, 611, 609, 608, 606, 600, 618, 624, 611, 610, 622, 622, 601, 607, 614, 619, 622, 633, + 608, 611, 611, 609, 607, 600, 621, 625, 611, 610, 619, 620, 600, 605, 609, 616, 618, 632, + 601, 603, 602, 602, 599, 590, 614, 616, 602, 606, 616, 616, 595, 602, 606, 612, 616, 629, + 606, 610, 607, 606, 604, 597, 621, 621, 608, 601, 611, 610, 590, 598, 601, 608, 608, 624, + 602, 605, 600, 600, 598, 592, 615, 615, 602, 599, 606, 607, 585, 593, 598, 603, 608, 622, + 602, 604, 601, 598, 596, 591, 615, 615, 599, 602, 610, 610, 585, 592, 597, 603, 607, 622, + 597, 601, 598, 597, 595, 589, 612, 613, 597, 590, 598, 601, 577, 582, 586, 590, 597, 608, + 588, 597, 589, 585, 584, 579, 602, 602, 587, 590, 590, 598, 574, 578, 582, 588, 603, 604, + 586, 603, 584, 583, 581, 577, 600, 599, 584, 579, 585, 590, 565, 571, 577, 581, 600, 595, + 583, 601, 582, 580, 579, 574, 599, 601, 581, 583, 592, 594, 569, 574, 579, 583, 603, 598, + 582, 599, 580, 579, 577, 572, 598, 594, 579, 568, 572, 579, 555, 560, 566, 569, 587, 585, + 571, 587, 570, 564, 559, 552, 577, 572, 556, 572, 575, 581, 554, 558, 562, 577, 584, 583, + 563, 578, 575, 558, 553, 546, 573, 566, 554, 566, 568, 575, 548, 554, 558, 577, 578, 575, + 565, 579, 576, 559, 555, 548, 574, 566, 557, 562, 563, 573, 543, 548, 552, 570, 575, 572, + 559, 570, 568, 551, 548, 542, 568, 558, 547, 555, 553, 566, 538, 541, 545, 565, 566, 564, + 557, 569, 567, 548, 544, 538, 565, 556, 542, 555, 556, 567, 537, 541, 547, 563, 566, 564, + 547, 556, 552, 539, 532, 526, 553, 545, 530, 551, 552, 565, 534, 539, 555, 561, 563, 561, + 541, 550, 548, 544, 525, 520, 547, 539, 522, 540, 543, 557, 524, 528, 547, 550, 551, 552, + 542, 549, 547, 545, 526, 519, 549, 540, 522, 529, 537, 546, 517, 521, 540, 542, 542, 543, + 535, 543, 543, 540, 520, 514, 543, 536, 514, 528, 538, 547, 519, 521, 541, 543, 543, 544, + 537, 544, 542, 537, 522, 512, 541, 536, 513, 516, 530, 538, 508, 526, 534, 537, 537, 536, + 521, 532, 528, 526, 523, 499, 531, 516, 498, 496, 511, 522, 489, 512, 515, 517, 518, 516, + 523, 531, 529, 526, 523, 499, 531, 517, 498, 501, 517, 529, 496, 519, 522, 524, 524, 524, + 514, 521, 518, 517, 513, 490, 522, 509, 491, 496, 510, 523, 489, 512, 515, 517, 520, 516, + 509, 517, 516, 512, 509, 485, 517, 504, 485, 482, 496, 510, 477, 499, 503, 504, 505, 503, + 507, 517, 514, 511, 508, 484, 516, 503, 483, 474, 486, 500, 467, 490, 493, 496, 496, 494, + 497, 504, 502, 499, 495, 470, 504, 490, 472, 467, 479, 492, 461, 485, 487, 489, 492, 489, + 499, 506, 501, 498, 495, 469, 503, 487, 468, 475, 490, 504, 471, 495, 498, 500, 504, 505, + 600, 602, 586, 578, 570, 540, 574, 560, 540, 533, 548, 561, 529, 554, 563, 573, 585, 570, #if TOUCH_KEY_NUM > 0 6500, 6500, 6500, #endif /* #if TOUCH_KEY_NUM > 0 */ }; static int32_t PS_Config_Lmt_FW_Rawdata_P[40 * 40] = { - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, - 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 65535, 1799, 1581, 1847, 1749, 1634, 65535, 65535, 65535, 65535, 65535, 65535, 1744, 1708, 1596, 1659, 1588, 65535, + 1819, 1726, 1831, 1721, 1715, 1715, 1795, 1761, 1704, 1821, 1819, 1679, 1763, 1761, 1827, 1840, 1830, 1709, + 1597, 1638, 1652, 1574, 1515, 1610, 1625, 1546, 1674, 1530, 1648, 1540, 1554, 1506, 1520, 1572, 1606, 1670, + 1589, 1665, 1639, 1585, 1616, 1737, 1565, 1630, 1609, 1746, 1736, 1632, 1641, 1644, 1674, 1571, 1585, 1595, + 1694, 1680, 1686, 1700, 1638, 1786, 1662, 1618, 1751, 1660, 1705, 1733, 1831, 1634, 1760, 1729, 1715, 1775, + 1541, 1613, 1726, 1760, 1568, 1813, 1651, 1761, 1726, 1610, 1562, 1659, 1560, 1653, 1548, 1653, 1691, 1529, + 1786, 1817, 1767, 1781, 1641, 1777, 1683, 1621, 1593, 1697, 1774, 1721, 1775, 1736, 1781, 1750, 1599, 1861, + 1708, 1674, 1516, 1558, 1747, 1670, 1758, 1663, 1708, 1590, 1809, 1691, 1812, 1646, 1739, 1680, 1834, 1795, + 1568, 1589, 1623, 1662, 1688, 1593, 1582, 1569, 1679, 1618, 1620, 1525, 1655, 1547, 1567, 1637, 1632, 1576, + 1603, 1620, 1607, 1673, 1658, 1669, 1589, 1659, 1651, 1607, 1635, 1606, 1652, 1621, 1632, 1541, 1557, 1645, + 1736, 1630, 1856, 1704, 1655, 1800, 1849, 1624, 1751, 1842, 1809, 1635, 1809, 1813, 1711, 1659, 1765, 1739, + 1690, 1716, 1595, 1677, 1679, 1656, 1597, 1719, 1653, 1744, 1840, 1659, 1781, 1781, 1807, 1719, 1823, 1774, + 1672, 1588, 1589, 1623, 1663, 1564, 1511, 1646, 1646, 1513, 1617, 1674, 1540, 1529, 1649, 1644, 1548, 1680, + 1597, 1651, 1557, 1697, 1729, 1793, 1716, 1632, 1672, 1550, 1779, 1743, 1803, 1732, 1679, 1586, 1644, 1842, + 1579, 1540, 1665, 1480, 1553, 1644, 1652, 1553, 1627, 1572, 1602, 1578, 1512, 1606, 1718, 1712, 1567, 1597, + 1582, 1632, 1578, 1618, 1625, 1715, 1670, 1701, 1651, 1621, 1824, 1831, 1834, 1758, 1788, 1712, 1779, 1637, + 1607, 1693, 1659, 1683, 1770, 1656, 1824, 1648, 1721, 1596, 1742, 1751, 1739, 1630, 1560, 1513, 1571, 1830, + 1686, 1763, 1756, 1673, 1698, 1749, 1803, 1694, 1711, 1728, 1725, 1697, 1824, 1723, 1730, 1848, 1837, 1831, + 1716, 1525, 1660, 1645, 1511, 1536, 1795, 1620, 1749, 1785, 1767, 1513, 1637, 1663, 1637, 1638, 1666, 1737, + 1558, 1669, 1649, 1704, 1735, 1574, 1564, 1568, 1627, 1537, 1621, 1651, 1700, 1662, 1630, 1571, 1527, 1715, + 1732, 1557, 1520, 1574, 1628, 1684, 1652, 1653, 1665, 1810, 1627, 1852, 1604, 1554, 1807, 1778, 1823, 1679, + 1684, 1568, 1569, 1618, 1655, 1652, 1614, 1592, 1662, 1683, 1595, 1597, 1623, 1511, 1662, 1645, 1642, 1613, + 1770, 1588, 1754, 1655, 1733, 1858, 1792, 1802, 1620, 1855, 1635, 1624, 1646, 1690, 1788, 1701, 1718, 1562, + 1870, 1649, 1665, 1691, 1704, 1847, 1770, 1866, 1593, 1656, 1873, 1750, 1611, 1828, 1796, 1782, 1744, 1704, + 1732, 1492, 1658, 1485, 1523, 1655, 1672, 1572, 1611, 1715, 1558, 1735, 1687, 1550, 1532, 1677, 1518, 1567, + 1788, 1870, 1610, 1607, 1705, 1837, 1863, 1658, 1609, 1854, 1879, 1785, 1718, 1551, 1852, 1861, 1793, 1610, + 1793, 1606, 1651, 1681, 1792, 1876, 1709, 1763, 1646, 1644, 1809, 1585, 1620, 1795, 1676, 1618, 1593, 1798, + 1550, 1513, 1554, 1539, 1628, 1716, 1739, 1690, 1617, 1597, 1733, 1585, 1548, 1543, 1625, 1645, 1597, 1571, + 1742, 1715, 1858, 1732, 1708, 1806, 1700, 1781, 1676, 1831, 1693, 1824, 1712, 1831, 1709, 1827, 1863, 1820, + 1632, 1803, 1830, 1851, 1534, 1632, 1674, 1777, 1680, 1823, 1865, 1536, 1726, 1660, 1579, 1562, 1562, 1700, + 1666, 1632, 1740, 1639, 1576, 1712, 1728, 1609, 1590, 1653, 1550, 1529, 1751, 1645, 1546, 1628, 1593, 1733, + 1715, 1870, 1870, 1761, 1715, 1844, 1721, 1729, 1744, 1729, 1637, 1628, 1827, 1723, 1817, 1735, 1733, 1642, + 1708, 1764, 1694, 1781, 1866, 1575, 1736, 1700, 1611, 1812, 1557, 1684, 1730, 1669, 1578, 1792, 1686, 1634, + 1651, 1595, 1597, 1656, 1578, 1628, 1611, 1670, 1609, 1551, 1585, 1562, 1568, 1494, 1637, 1725, 1562, 1523, + 1700, 1610, 1880, 1670, 1763, 1795, 1582, 1623, 1609, 1576, 1721, 1739, 1816, 1744, 1655, 1842, 1603, 1722, + 1653, 1600, 1723, 1728, 1754, 1827, 1617, 1667, 1592, 1847, 1810, 1653, 1712, 1800, 1735, 1679, 1744, 1596, +#if TOUCH_KEY_NUM > 0 + 1500, 1500, 1500, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_Rawdata_N[40 * 40] = { + -65535, 771, 677, 791, 749, 700, -65535, -65535, -65535, -65535, -65535, -65535, 748, 732, 684, 711, 680, -65535, + 779, 740, 785, 737, 735, 735, 769, 755, 730, 781, 779, 719, 755, 755, 783, 788, 784, 733, + 685, 702, 708, 674, 649, 690, 697, 662, 718, 656, 706, 660, 666, 646, 652, 674, 688, 716, + 681, 713, 703, 679, 692, 745, 671, 698, 689, 748, 744, 700, 703, 704, 718, 673, 679, 683, + 726, 720, 722, 728, 702, 766, 712, 694, 751, 712, 731, 743, 785, 700, 754, 741, 735, 761, + 661, 691, 740, 754, 672, 777, 707, 755, 740, 690, 670, 711, 668, 709, 664, 709, 725, 655, + 766, 779, 757, 763, 703, 761, 721, 695, 683, 727, 760, 737, 761, 744, 763, 750, 685, 797, + 732, 718, 650, 668, 749, 716, 754, 713, 732, 682, 775, 725, 776, 706, 745, 720, 786, 769, + 672, 681, 695, 712, 724, 683, 678, 673, 719, 694, 694, 653, 709, 663, 671, 701, 700, 676, + 687, 694, 689, 717, 710, 715, 681, 711, 707, 689, 701, 688, 708, 695, 700, 661, 667, 705, + 744, 698, 796, 730, 709, 772, 793, 696, 751, 790, 775, 701, 775, 777, 733, 711, 757, 745, + 724, 736, 683, 719, 719, 710, 685, 737, 709, 748, 788, 711, 763, 763, 775, 737, 781, 760, + 716, 680, 681, 695, 713, 670, 647, 706, 706, 649, 693, 718, 660, 655, 707, 704, 664, 720, + 685, 707, 667, 727, 741, 769, 736, 700, 716, 664, 763, 747, 773, 742, 719, 680, 704, 790, + 677, 660, 713, 634, 665, 704, 708, 665, 697, 674, 686, 676, 648, 688, 736, 734, 671, 685, + 678, 700, 676, 694, 697, 735, 716, 729, 707, 695, 782, 785, 786, 754, 766, 734, 763, 701, + 689, 725, 711, 721, 758, 710, 782, 706, 737, 684, 746, 751, 745, 698, 668, 649, 673, 784, + 722, 755, 752, 717, 728, 749, 773, 726, 733, 740, 739, 727, 782, 739, 742, 792, 787, 785, + 736, 653, 712, 705, 647, 658, 769, 694, 749, 765, 757, 649, 701, 713, 701, 702, 714, 745, + 668, 715, 707, 730, 743, 674, 670, 672, 697, 659, 695, 707, 728, 712, 698, 673, 655, 735, + 742, 667, 652, 674, 698, 722, 708, 709, 713, 776, 697, 794, 688, 666, 775, 762, 781, 719, + 722, 672, 673, 694, 709, 708, 692, 682, 712, 721, 683, 685, 695, 647, 712, 705, 704, 691, + 758, 680, 752, 709, 743, 796, 768, 772, 694, 795, 701, 696, 706, 724, 766, 729, 736, 670, + 802, 707, 713, 725, 730, 791, 758, 800, 683, 710, 803, 750, 691, 784, 770, 764, 748, 730, + 742, 640, 710, 637, 653, 709, 716, 674, 691, 735, 668, 743, 723, 664, 656, 719, 650, 671, + 766, 802, 690, 689, 731, 787, 799, 710, 689, 794, 805, 765, 736, 665, 794, 797, 769, 690, + 769, 688, 707, 721, 768, 804, 733, 755, 706, 704, 775, 679, 694, 769, 718, 694, 683, 770, + 664, 649, 666, 659, 698, 736, 745, 724, 693, 685, 743, 679, 664, 661, 697, 705, 685, 673, + 746, 735, 796, 742, 732, 774, 728, 763, 718, 785, 725, 782, 734, 785, 733, 783, 799, 780, + 700, 773, 784, 793, 658, 700, 718, 761, 720, 781, 799, 658, 740, 712, 677, 670, 670, 728, + 714, 700, 746, 703, 676, 734, 740, 689, 682, 709, 664, 655, 751, 705, 662, 698, 683, 743, + 735, 802, 802, 755, 735, 790, 737, 741, 748, 741, 701, 698, 783, 739, 779, 743, 743, 704, + 732, 756, 726, 763, 800, 675, 744, 728, 691, 776, 667, 722, 742, 715, 676, 768, 722, 700, + 707, 683, 685, 710, 676, 698, 691, 716, 689, 665, 679, 670, 672, 640, 701, 739, 670, 653, + 728, 690, 806, 716, 755, 769, 678, 695, 689, 676, 737, 745, 778, 748, 709, 790, 687, 738, + 709, 686, 739, 740, 752, 783, 693, 715, 682, 791, 776, 709, 734, 772, 743, 719, 748, 684, #if TOUCH_KEY_NUM > 0 800, 800, 800, #endif /* #if TOUCH_KEY_NUM > 0 */ }; -static int32_t PS_Config_Lmt_FW_Rawdata_N[40 * 40] = { - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, - 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, 400, +static int32_t PS_Config_Lmt_FW_CC_P[40 * 40] = { + 65535, 116, 116, 113, 115, 116, 65535, 65535, 65535, 65535, 65535, 65535, 116, 116, 116, 116, 119, 65535, + 115, 119, 116, 116, 117, 117, 116, 117, 115, 113, 116, 116, 116, 116, 115, 115, 116, 117, + 116, 116, 115, 115, 116, 115, 115, 116, 112, 120, 122, 122, 122, 123, 122, 122, 123, 124, + 120, 117, 116, 116, 117, 116, 117, 117, 115, 116, 119, 119, 119, 119, 117, 119, 120, 122, + 117, 116, 115, 115, 116, 115, 116, 116, 112, 116, 117, 117, 116, 119, 116, 116, 117, 119, + 122, 119, 116, 116, 119, 116, 117, 116, 113, 116, 119, 119, 119, 119, 119, 117, 119, 122, + 119, 116, 115, 115, 116, 115, 116, 116, 113, 117, 119, 120, 119, 120, 119, 119, 122, 122, + 119, 116, 116, 116, 116, 116, 116, 116, 113, 116, 116, 119, 116, 117, 116, 116, 116, 119, + 122, 119, 117, 117, 119, 119, 120, 119, 115, 117, 119, 122, 119, 120, 119, 117, 119, 122, + 122, 119, 117, 117, 119, 117, 120, 117, 115, 117, 117, 120, 117, 117, 117, 117, 119, 120, + 117, 116, 113, 115, 116, 115, 116, 116, 112, 119, 119, 122, 119, 119, 119, 119, 119, 122, + 119, 116, 116, 116, 116, 116, 119, 116, 113, 119, 116, 119, 116, 116, 116, 116, 116, 119, + 120, 119, 117, 117, 117, 119, 122, 119, 115, 122, 119, 119, 117, 117, 116, 116, 117, 119, + 119, 116, 116, 116, 116, 116, 119, 119, 113, 122, 119, 119, 116, 116, 116, 116, 116, 116, + 117, 116, 115, 116, 116, 116, 117, 119, 112, 124, 122, 123, 122, 120, 119, 119, 120, 122, + 119, 116, 116, 116, 116, 116, 119, 119, 113, 122, 119, 119, 116, 116, 116, 116, 116, 119, + 119, 116, 116, 116, 116, 117, 119, 120, 113, 122, 119, 119, 116, 116, 116, 116, 116, 116, + 120, 117, 117, 119, 119, 119, 120, 120, 115, 119, 116, 117, 115, 115, 115, 113, 113, 115, + 116, 116, 115, 115, 116, 116, 116, 116, 111, 122, 119, 122, 119, 117, 117, 117, 117, 119, + 119, 116, 116, 116, 116, 117, 120, 119, 115, 122, 117, 119, 116, 116, 116, 116, 116, 116, + 116, 116, 116, 116, 116, 116, 119, 116, 113, 122, 119, 119, 119, 119, 116, 116, 116, 119, + 119, 117, 117, 117, 117, 119, 122, 119, 115, 120, 116, 119, 116, 116, 115, 115, 115, 116, + 116, 116, 115, 116, 116, 116, 119, 116, 113, 122, 119, 122, 119, 117, 116, 116, 116, 119, + 116, 116, 116, 116, 116, 116, 119, 116, 113, 122, 116, 120, 119, 116, 116, 116, 116, 117, + 116, 116, 115, 116, 116, 116, 119, 117, 112, 119, 117, 119, 116, 116, 116, 115, 116, 117, + 119, 116, 119, 119, 119, 119, 122, 122, 116, 116, 116, 119, 116, 116, 113, 113, 113, 116, + 116, 116, 116, 116, 116, 116, 120, 119, 113, 116, 119, 122, 119, 116, 116, 116, 116, 116, + 123, 122, 122, 122, 122, 122, 124, 124, 117, 113, 119, 122, 119, 117, 116, 116, 116, 117, + 119, 117, 116, 117, 119, 119, 123, 120, 115, 111, 117, 119, 116, 115, 115, 113, 113, 115, + 122, 119, 119, 119, 122, 122, 124, 122, 116, 111, 116, 122, 116, 116, 116, 116, 116, 116, + 119, 117, 116, 117, 119, 119, 122, 120, 115, 115, 122, 124, 119, 119, 119, 117, 119, 119, + 119, 116, 116, 117, 119, 119, 123, 120, 115, 112, 119, 122, 116, 116, 115, 115, 115, 116, + 120, 119, 119, 119, 119, 122, 124, 122, 116, 113, 122, 123, 119, 119, 119, 116, 117, 119, + 122, 120, 120, 120, 122, 122, 127, 123, 117, 112, 117, 122, 116, 116, 115, 113, 115, 116, + 119, 119, 116, 119, 119, 119, 127, 122, 116, 116, 122, 126, 119, 119, 119, 116, 119, 119, + 116, 116, 115, 116, 116, 116, 124, 119, 113, 111, 119, 124, 117, 116, 116, 115, 115, 116, #if TOUCH_KEY_NUM > 0 - 400, 400, 400, + 38, 38, 38, #endif /* #if TOUCH_KEY_NUM > 0 */ }; -static int32_t PS_Config_Lmt_FW_CC_P = 130; -static int32_t PS_Config_Lmt_FW_CC_N = 80; -static int32_t PS_Config_Lmt_Key_FW_CC_P = 38; -static int32_t PS_Config_Lmt_Key_FW_CC_N = 9; -static int32_t PS_Config_Lmt_FW_CC_I_P = 25; -static int32_t PS_Config_Lmt_FW_CC_I_N; -static int32_t PS_Config_Lmt_FW_CC_Q_P = 25; -static int32_t PS_Config_Lmt_FW_CC_Q_N; -static int32_t PS_Config_Lmt_Key_FW_CC_I_P = 25; -static int32_t PS_Config_Lmt_Key_FW_CC_I_N; -static int32_t PS_Config_Lmt_Key_FW_CC_Q_P = 25; -static int32_t PS_Config_Lmt_Key_FW_CC_Q_N; +static int32_t PS_Config_Lmt_FW_CC_N[40 * 40] = { + -65535, 56, 56, 55, 55, 56, -65535, -65535, -65535, -65535, -65535, -65535, 56, 56, 56, 56, 57, -65535, + 55, 57, 56, 56, 57, 57, 56, 57, 55, 55, 56, 56, 56, 56, 55, 55, 56, 57, + 56, 56, 55, 55, 56, 55, 55, 56, 54, 58, 59, 59, 59, 59, 59, 59, 59, 60, + 58, 57, 56, 56, 57, 56, 57, 57, 55, 56, 57, 57, 57, 57, 57, 57, 58, 59, + 57, 56, 55, 55, 56, 55, 56, 56, 54, 56, 57, 57, 56, 57, 56, 56, 57, 57, + 59, 57, 56, 56, 57, 56, 57, 56, 55, 56, 57, 57, 57, 57, 57, 57, 57, 59, + 57, 56, 55, 55, 56, 55, 56, 56, 55, 57, 57, 58, 57, 58, 57, 57, 59, 59, + 57, 56, 56, 56, 56, 56, 56, 56, 55, 56, 56, 57, 56, 57, 56, 56, 56, 57, + 59, 57, 57, 57, 57, 57, 58, 57, 55, 57, 57, 59, 57, 58, 57, 57, 57, 59, + 59, 57, 57, 57, 57, 57, 58, 57, 55, 57, 57, 58, 57, 57, 57, 57, 57, 58, + 57, 56, 55, 55, 56, 55, 56, 56, 54, 57, 57, 59, 57, 57, 57, 57, 57, 59, + 57, 56, 56, 56, 56, 56, 57, 56, 55, 57, 56, 57, 56, 56, 56, 56, 56, 57, + 58, 57, 57, 57, 57, 57, 59, 57, 55, 59, 57, 57, 57, 57, 56, 56, 57, 57, + 57, 56, 56, 56, 56, 56, 57, 57, 55, 59, 57, 57, 56, 56, 56, 56, 56, 56, + 57, 56, 55, 56, 56, 56, 57, 57, 54, 60, 59, 59, 59, 58, 57, 57, 58, 59, + 57, 56, 56, 56, 56, 56, 57, 57, 55, 59, 57, 57, 56, 56, 56, 56, 56, 57, + 57, 56, 56, 56, 56, 57, 57, 58, 55, 59, 57, 57, 56, 56, 56, 56, 56, 56, + 58, 57, 57, 57, 57, 57, 58, 58, 55, 57, 56, 57, 55, 55, 55, 55, 55, 55, + 56, 56, 55, 55, 56, 56, 56, 56, 53, 59, 57, 59, 57, 57, 57, 57, 57, 57, + 57, 56, 56, 56, 56, 57, 58, 57, 55, 59, 57, 57, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 57, 56, 55, 59, 57, 57, 57, 57, 56, 56, 56, 57, + 57, 57, 57, 57, 57, 57, 59, 57, 55, 58, 56, 57, 56, 56, 55, 55, 55, 56, + 56, 56, 55, 56, 56, 56, 57, 56, 55, 59, 57, 59, 57, 57, 56, 56, 56, 57, + 56, 56, 56, 56, 56, 56, 57, 56, 55, 59, 56, 58, 57, 56, 56, 56, 56, 57, + 56, 56, 55, 56, 56, 56, 57, 57, 54, 57, 57, 57, 56, 56, 56, 55, 56, 57, + 57, 56, 57, 57, 57, 57, 59, 59, 56, 56, 56, 57, 56, 56, 55, 55, 55, 56, + 56, 56, 56, 56, 56, 56, 58, 57, 55, 56, 57, 59, 57, 56, 56, 56, 56, 56, + 59, 59, 59, 59, 59, 59, 60, 60, 57, 55, 57, 59, 57, 57, 56, 56, 56, 57, + 57, 57, 56, 57, 57, 57, 59, 58, 55, 53, 57, 57, 56, 55, 55, 55, 55, 55, + 59, 57, 57, 57, 59, 59, 60, 59, 56, 53, 56, 59, 56, 56, 56, 56, 56, 56, + 57, 57, 56, 57, 57, 57, 59, 58, 55, 55, 59, 60, 57, 57, 57, 57, 57, 57, + 57, 56, 56, 57, 57, 57, 59, 58, 55, 54, 57, 59, 56, 56, 55, 55, 55, 56, + 58, 57, 57, 57, 57, 59, 60, 59, 56, 55, 59, 59, 57, 57, 57, 56, 57, 57, + 59, 58, 58, 58, 59, 59, 61, 59, 57, 54, 57, 59, 56, 56, 55, 55, 55, 56, + 57, 57, 56, 57, 57, 57, 61, 59, 56, 56, 59, 60, 57, 57, 57, 56, 57, 57, + 56, 56, 55, 56, 56, 56, 60, 57, 55, 53, 57, 60, 57, 56, 56, 55, 55, 56, +#if TOUCH_KEY_NUM > 0 + 9, 9, 9, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; -static int32_t PS_Config_Lmt_FW_Diff_P = 35; -static int32_t PS_Config_Lmt_FW_Diff_N = -35; -static int32_t PS_Config_Lmt_Key_FW_Diff_P = 35; -static int32_t PS_Config_Lmt_Key_FW_Diff_N = -35; +static int32_t PS_Config_Lmt_FW_CC_I_P[40 * 40] = { + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +#if TOUCH_KEY_NUM > 0 + 25, 25, 25, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_CC_I_N[40 * 40] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +#if TOUCH_KEY_NUM > 0 + 0, 0, 0, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_CC_Q_P[40 * 40] = { + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, +#if TOUCH_KEY_NUM > 0 + 25, 25, 25, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_CC_Q_N[40 * 40] = { + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +#if TOUCH_KEY_NUM > 0 + 0, 0, 0, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_Diff_P[40 * 40] = { + 65535, 50, 50, 50, 50, 50, 65535, 65535, 65535, 65535, 65535, 65535, 50, 50, 50, 50, 50, 65535, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, +#if TOUCH_KEY_NUM > 0 + 35, 35, 35, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; + +static int32_t PS_Config_Lmt_FW_Diff_N[40 *40] = { + -65535, -50, -50, -50, -50, -50, -65535, -65535, -65535, -65535, -65535, -65535, -50, -50, -50, -50, -50, -65535, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, + -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, -50, +#if TOUCH_KEY_NUM > 0 + -35, -35, -35, +#endif /* #if TOUCH_KEY_NUM > 0 */ +}; static int32_t PS_Config_Diff_Test_Frame = 50;