From a4c7f23c615a888eaf904d6ef3bd34e98302a445 Mon Sep 17 00:00:00 2001 From: wengjun1 Date: Thu, 12 Jul 2018 15:43:35 +0800 Subject: [PATCH] DLKM: Change novatek touch driver Update novatek touch driver base code for nt36672a Change-Id: I455b4a49345a117ff76009a3a630ad09351d12c9 Signed-off-by: wengjun1 Reviewed-on: https://gerrit.mot.com/1208690 SLTApproved: Slta Waiver SME-Granted: SME Approvals Granted Tested-by: Jira Key Reviewed-by: Jialei Hao Reviewed-by: Wei Deng Reviewed-by: Huosheng Liao Submit-Approved: Jira Key --- drivers/input/touchscreen/nova_mmi/nt36xxx.c | 586 ++++++++------ drivers/input/touchscreen/nova_mmi/nt36xxx.h | 103 ++- .../touchscreen/nova_mmi/nt36xxx_ext_proc.c | 164 ++-- .../touchscreen/nova_mmi/nt36xxx_fw_update.c | 575 ++++++++----- .../touchscreen/nova_mmi/nt36xxx_mem_map.h | 208 ----- .../touchscreen/nova_mmi/nt36xxx_mp_ctrlram.c | 705 +++++++++------- .../touchscreen/nova_mmi/nt36xxx_mp_ctrlram.h | 755 +++--------------- 7 files changed, 1479 insertions(+), 1617 deletions(-) delete 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 9694ac589075..d3922f9ac784 100644 --- a/drivers/input/touchscreen/nova_mmi/nt36xxx.c +++ b/drivers/input/touchscreen/nova_mmi/nt36xxx.c @@ -1,8 +1,8 @@ /* * Copyright (C) 2010 - 2017 Novatek, Inc. * - * $Revision: 23175 $ - * $Date: 2018-02-12 16:26:21 +0800 (Mon, 12 Feb 2018) $ + * $Revision: 14651 $ + * $Date: 2017-07-21 14:58:50 +0800 (周五, 21 七月 2017) $ * * 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 @@ -15,6 +15,18 @@ * more details. * */ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + #include #include #include @@ -24,9 +36,14 @@ #include #include #include +#include #include #include +#if defined(CONFIG_HQ_DEV_INFO) +#include +#endif + #if defined(CONFIG_FB) #include #include @@ -35,23 +52,27 @@ #endif #include "nt36xxx.h" -#if NVT_TOUCH_ESD_PROTECT -#include -#endif /* #if NVT_TOUCH_ESD_PROTECT */ #if NVT_TOUCH_ESD_PROTECT +#include + 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; uint8_t esd_retry_max = 5; -#endif /* #if NVT_TOUCH_ESD_PROTECT */ +#endif #if NVT_TOUCH_EXT_PROC extern int32_t nvt_extra_proc_init(void); #endif +#if NVT_TOUCH_FW +extern int32_t nvt_fw_sysfs_init(void); +extern int32_t nvt_fw_sysfs_deinit(void); +#endif + #if NVT_TOUCH_MP extern int32_t nvt_mp_proc_init(void); #endif @@ -72,6 +93,171 @@ 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, @@ -82,19 +268,19 @@ const uint16_t touch_key_array[TOUCH_KEY_NUM] = { #if WAKEUP_GESTURE const uint16_t gesture_key_array[] = { - 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 + 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, }; #endif @@ -125,8 +311,7 @@ int32_t CTP_I2C_READ(struct i2c_client *client, uint16_t address, uint8_t *buf, while (retries < 5) { ret = i2c_transfer(client->adapter, msgs, 2); - if (ret == 2) - break; + if (ret == 2) break; retries++; } @@ -138,6 +323,25 @@ 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. @@ -184,7 +388,7 @@ void nvt_sw_reset_idle(void) { uint8_t buf[4] = {0}; - //---write i2c cmds to reset idle--- + /* ---write i2c cmds to reset idle--- */ buf[0] = 0x00; buf[1] = 0xA5; CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); @@ -202,15 +406,12 @@ return: void nvt_bootloader_reset(void) { uint8_t buf[8] = {0}; - NVT_LOG("enter %s start\n", __func__); - //---write i2c cmds to reset--- + NVT_ERR("xlixiang---enter-%s\n", __func__); buf[0] = 0x00; buf[1] = 0x69; CTP_I2C_WRITE(ts->client, I2C_HW_Address, buf, 2); - // need 35ms delay after bootloader reset msleep(35); - NVT_LOG("exit %s end\n", __func__); } /******************************************************* @@ -227,18 +428,15 @@ 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); @@ -251,7 +449,7 @@ int32_t nvt_clear_fw_status(void) if (i >= retry) { NVT_ERR("failed, i=%d, buf[1]=0x%02X\n", i, buf[1]); - return -EPERM; + return -1; } else { return 0; } @@ -271,13 +469,11 @@ 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); @@ -290,7 +486,7 @@ int32_t nvt_check_fw_status(void) if (i >= retry) { NVT_ERR("failed, i=%d, buf[1]=0x%02X\n", i, buf[1]); - return -EPERM; + return -1; } else { return 0; } @@ -308,12 +504,10 @@ 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_LOG("enter %s start\n", __func__); - + NVT_ERR("xlixiang---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); @@ -330,7 +524,6 @@ int32_t nvt_check_fw_reset_state(RST_COMPLETE_STATE check_reset_state) break; } } - NVT_LOG("exit %s end\n", __func__); return ret; } @@ -348,13 +541,11 @@ 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; @@ -380,16 +571,13 @@ int32_t nvt_get_fw_info(void) uint8_t buf[64] = {0}; uint32_t retry_count = 0; int32_t ret = 0; - NVT_LOG("enter %s start\n", __func__); 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]; @@ -399,7 +587,6 @@ 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; @@ -424,9 +611,7 @@ info_retry: ret = 0; } - //---Get Novatek PID--- nvt_read_pid(); - NVT_LOG("exit %s end\n", __func__); return ret; } @@ -461,19 +646,14 @@ 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 /* #if NVT_TOUCH_ESD_PROTECT */ +#endif i2c_wr = str[0] >> 7; - if (i2c_wr == 0) { //I2C write + if (i2c_wr == 0) { while (retries < 20) { ret = CTP_I2C_WRITE(ts->client, (str[0] & 0x7F), &str[2], str[1]); if (ret == 1) @@ -490,7 +670,7 @@ static ssize_t nvt_flash_read(struct file *file, char __user *buff, size_t count } return ret; - } else if (i2c_wr == 1) { //I2C read + } else if (i2c_wr == 1) { while (retries < 20) { ret = CTP_I2C_READ(ts->client, (str[0] & 0x7F), &str[2], str[1]); if (ret == 2) @@ -501,7 +681,6 @@ 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; @@ -592,28 +771,21 @@ 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 -/* customized gesture id */ -#define DATA_PROTOCOL 30 - -/* function page definition */ -#define FUNCPAGE_GESTURE 1 - -#define NVT_TS_HOLD_TIME 5000 -static struct wakeup_source gestrue_wakelock; +#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 +static struct wake_lock gestrue_wakelock; /******************************************************* Description: @@ -622,76 +794,66 @@ Description: return: n.a. *******************************************************/ -void nvt_ts_wakeup_gesture_report(uint8_t gesture_id, uint8_t *data) +void nvt_ts_wakeup_gesture_report(uint8_t gesture_id) { 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); - switch (gesture_id) { - case GESTURE_WORD_C: + switch (gesture_id) { + case GESTURE_WORD_C: NVT_LOG("Gesture : Word-C.\n"); keycode = gesture_key_array[0]; break; - case GESTURE_WORD_W: + case GESTURE_WORD_W: NVT_LOG("Gesture : Word-W.\n"); keycode = gesture_key_array[1]; break; - case GESTURE_WORD_V: + case GESTURE_WORD_V: NVT_LOG("Gesture : Word-V.\n"); keycode = gesture_key_array[2]; break; - case GESTURE_DOUBLE_CLICK: + case GESTURE_DOUBLE_CLICK: NVT_LOG("Gesture : Double Click.\n"); keycode = gesture_key_array[3]; break; - case GESTURE_WORD_Z: + case GESTURE_WORD_Z: NVT_LOG("Gesture : Word-Z.\n"); keycode = gesture_key_array[4]; break; - case GESTURE_WORD_M: + case GESTURE_WORD_M: NVT_LOG("Gesture : Word-M.\n"); keycode = gesture_key_array[5]; break; - case GESTURE_WORD_O: + case GESTURE_WORD_O: NVT_LOG("Gesture : Word-O.\n"); keycode = gesture_key_array[6]; break; - case GESTURE_WORD_e: + case GESTURE_WORD_e: NVT_LOG("Gesture : Word-e.\n"); keycode = gesture_key_array[7]; break; - case GESTURE_WORD_S: + case GESTURE_WORD_S: NVT_LOG("Gesture : Word-S.\n"); keycode = gesture_key_array[8]; break; - case GESTURE_SLIDE_UP: + case GESTURE_SLIDE_UP: NVT_LOG("Gesture : Slide UP.\n"); keycode = gesture_key_array[9]; break; - case GESTURE_SLIDE_DOWN: + case GESTURE_SLIDE_DOWN: NVT_LOG("Gesture : Slide DOWN.\n"); keycode = gesture_key_array[10]; break; - case GESTURE_SLIDE_LEFT: + case GESTURE_SLIDE_LEFT: NVT_LOG("Gesture : Slide LEFT.\n"); keycode = gesture_key_array[11]; break; - case GESTURE_SLIDE_RIGHT: + case GESTURE_SLIDE_RIGHT: NVT_LOG("Gesture : Slide RIGHT.\n"); keycode = gesture_key_array[12]; break; - default: + default: break; } @@ -715,22 +877,14 @@ return: static void nvt_parse_dt(struct device *dev) { struct device_node *np = dev->of_node; - NVT_LOG("enter %s start\n", __func__); -#if NVT_TOUCH_SUPPORT_HW_RST - ts->reset_gpio = of_get_named_gpio_flags(np, "novatek,reset-gpio", 0, &ts->reset_flags); - NVT_LOG("novatek,reset-gpio=%d\n", ts->reset_gpio); -#endif ts->irq_gpio = of_get_named_gpio_flags(np, "novatek,irq-gpio", 0, &ts->irq_flags); NVT_LOG("novatek,irq-gpio=%d\n", ts->irq_gpio); - NVT_LOG("exit %s end\n", __func__); + } #else static void nvt_parse_dt(struct device *dev) { -#if NVT_TOUCH_SUPPORT_HW_RST - ts->reset_gpio = NVTTOUCH_RST_PIN; -#endif ts->irq_gpio = NVTTOUCH_INT_PIN; } #endif @@ -745,17 +899,6 @@ return: static int nvt_gpio_config(struct nvt_ts_data *ts) { int32_t ret = 0; - NVT_LOG("enter %s start\n", __func__); -#if NVT_TOUCH_SUPPORT_HW_RST - /* request RST-pin (Output/High) */ - if (gpio_is_valid(ts->reset_gpio)) { - ret = gpio_request_one(ts->reset_gpio, GPIOF_OUT_INIT_HIGH, "NVT-tp-rst"); - if (ret) { - NVT_ERR("Failed to request NVT-tp-rst GPIO\n"); - goto err_request_reset_gpio; - } - } -#endif /* request INT-pin (Input) */ if (gpio_is_valid(ts->irq_gpio)) { @@ -765,18 +908,10 @@ static int nvt_gpio_config(struct nvt_ts_data *ts) goto err_request_irq_gpio; } } - NVT_LOG("exit %s end\n", __func__); return ret; err_request_irq_gpio: -#if NVT_TOUCH_SUPPORT_HW_RST - if (gpio_is_valid(ts->reset_gpio)) - gpio_free(ts->reset_gpio); -err_request_reset_gpio: -#endif - NVT_LOG("exit %s abnormal end\n", __func__); - return ret; } @@ -797,7 +932,7 @@ static uint8_t nvt_fw_recovery(uint8_t *point_data) uint8_t detected = true; /* check pattern */ - for (i = 1; i < 7; i++) { + for (i = 1 ; i < 7 ; i++) { if (point_data[i] != 0x77) { detected = false; break; @@ -811,13 +946,13 @@ static void nvt_esd_check_func(struct work_struct *work) { unsigned int timer = jiffies_to_msecs(jiffies - irq_timer); - //NVT_ERR("esd_check = %d (retry %d/%d)\n", esd_check, esd_retry, esd_retry_max); //DEBUG if (esd_retry >= esd_retry_max) nvt_esd_check_enable(false); if ((timer > NVT_TOUCH_ESD_CHECK_PERIOD) && esd_check) { NVT_ERR("do ESD recovery, timer = %d, retry = %d\n", timer, esd_retry); + printk("do ESD recovery, timer = %d, retry = %d\n", timer, esd_retry); /* do esd recovery, bootloader reset */ nvt_bootloader_reset(); /* update interrupt timer */ @@ -829,7 +964,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 /* #if NVT_TOUCH_ESD_PROTECT */ +#endif #define POINT_DATA_LEN 65 /******************************************************* @@ -862,25 +997,19 @@ static void nvt_ts_work_func(struct work_struct *work) NVT_ERR("CTP_I2C_READ failed.(%d)\n", ret); goto XFER_ERROR; } -/* - //--- dump I2C buf --- - for (i = 0; i < 10; i++) { - printk("%02X %02X %02X %02X %02X %02X ", point_data[1+i*6], point_data[2+i*6], point_data[3+i*6], point_data[4+i*6], point_data[5+i*6], point_data[6+i*6]); - } - printk("\n"); -*/ #if NVT_TOUCH_ESD_PROTECT + if (nvt_fw_recovery(point_data)) { nvt_esd_check_enable(true); goto XFER_ERROR; } -#endif /* #if NVT_TOUCH_ESD_PROTECT */ +#endif #if WAKEUP_GESTURE if (bTouchIsAwake == 0) { input_id = (uint8_t)(point_data[1] >> 3); - nvt_ts_wakeup_gesture_report(input_id, point_data); + nvt_ts_wakeup_gesture_report(input_id); enable_irq(ts->client->irq); mutex_unlock(&ts->lock); return; @@ -895,11 +1024,11 @@ static void nvt_ts_work_func(struct work_struct *work) if ((input_id == 0) || (input_id > ts->max_touch_num)) continue; - if (((point_data[position] & 0x07) == 0x01) || ((point_data[position] & 0x07) == 0x02)) { //finger down (enter & moving) + if (((point_data[position] & 0x07) == 0x01) || ((point_data[position] & 0x07) == 0x02)) { #if NVT_TOUCH_ESD_PROTECT - /* update interrupt timer */ - irq_timer = jiffies; -#endif /* #if NVT_TOUCH_ESD_PROTECT */ + /* 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); if ((input_x < 0) || (input_y < 0)) @@ -962,10 +1091,6 @@ 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)); } @@ -997,7 +1122,7 @@ static irqreturn_t nvt_ts_irq_handler(int32_t irq, void *dev_id) #if WAKEUP_GESTURE if (bTouchIsAwake == 0) { - __pm_wakeup_event(&gestrue_wakelock, NVT_TS_HOLD_TIME); + wake_lock_timeout(&gestrue_wakelock, msecs_to_jiffies(5000)); } #endif @@ -1006,6 +1131,7 @@ 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. @@ -1018,36 +1144,29 @@ 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)) || ((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; @@ -1057,7 +1176,6 @@ 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; @@ -1092,12 +1210,11 @@ static int8_t nvt_ts_check_chip_ver_trim(void) int32_t i = 0; int32_t found_nvt_chip = 0; int32_t ret = -1; - NVT_LOG("enter %s start\n", __func__); - 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; @@ -1121,11 +1238,9 @@ 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]); - // 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]) @@ -1139,6 +1254,17 @@ 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"); + } +#endif ts->mmap = trim_id_table[list].mmap; ts->carrier_system = trim_id_table[list].carrier_system; ret = 0; @@ -1149,19 +1275,17 @@ static int8_t nvt_ts_check_chip_ver_trim(void) } } - //---Stop CRC check to prevent IC auto reboot--- 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); } out: - NVT_LOG("exit %s end\n", __func__); return ret; } + /******************************************************* Description: Novatek touchscreen driver probe function. @@ -1176,13 +1300,7 @@ static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_i int32_t retry = 0; #endif - NVT_LOG("enter %s start\n", __func__); - //---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; - } + NVT_LOG("start\n"); ts = kmalloc(sizeof(struct nvt_ts_data), GFP_KERNEL); if (ts == NULL) { @@ -1193,20 +1311,22 @@ 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"); goto err_gpio_config_failed; } - // need 10ms delay after POR(power on reset) + 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; + } + msleep(10); - //---check chip version trim--- + ret = nvt_ts_check_chip_ver_trim(); if (ret) { NVT_ERR("chip is not identified\n"); @@ -1222,7 +1342,6 @@ 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"); @@ -1231,8 +1350,6 @@ 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"); @@ -1248,8 +1365,6 @@ 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); @@ -1258,19 +1373,18 @@ 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); //pressure = TOUCH_FORCE_NUM + input_set_abs_params(ts->input_dev, ABS_MT_PRESSURE, 0, TOUCH_FORCE_NUM, 0, 0); #if TOUCH_MAX_FINGER_NUM > 1 - 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_TOUCH_MAJOR, 0, 255, 0, 0); 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 //MT_PROTOCOL_B -#endif //TOUCH_MAX_FINGER_NUM > 1 +#endif +#endif #if TOUCH_KEY_NUM > 0 for (retry = 0; retry < ts->max_button_num; retry++) { @@ -1282,22 +1396,20 @@ static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_i for (retry = 0; retry < (sizeof(gesture_key_array) / sizeof(gesture_key_array[0])); retry++) { input_set_capability(ts->input_dev, EV_KEY, gesture_key_array[retry]); } - wakeup_source_init(&gestrue_wakelock, "gestrue-wake-lock"); + wake_lock_init(&gestrue_wakelock, WAKE_LOCK_SUSPEND, "poll-wake-lock"); #endif - snprintf(ts->phys, 9, "input/ts"); + sprintf(ts->phys, "input/ts"); ts->input_dev->name = NVT_TS_NAME; 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); @@ -1324,7 +1436,6 @@ 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 @@ -1332,10 +1443,9 @@ static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_i INIT_DELAYED_WORK(&nvt_esd_check_work, nvt_esd_check_func); nvt_esd_check_wq = create_workqueue("nvt_esd_check_wq"); queue_delayed_work(nvt_esd_check_wq, &nvt_esd_check_work, - msecs_to_jiffies(NVT_TOUCH_ESD_CHECK_PERIOD)); -#endif /* #if NVT_TOUCH_ESD_PROTECT */ + msecs_to_jiffies(NVT_TOUCH_ESD_CHECK_PERIOD)); +#endif - //---set device node--- #if NVT_TOUCH_PROC ret = nvt_flash_proc_init(); if (ret != 0) { @@ -1352,6 +1462,18 @@ static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_i } #endif +#if NVT_TOUCH_FW + ts->suspended = 0; + ts->force_reflash = 0; + ts->loading_fw = 0; + + ret = nvt_fw_sysfs_init(); + if (ret != 0) { + NVT_ERR("nvt fw class init failed. ret=%d\n", ret); + goto err_init_NVT_ts; + } +#endif + #if NVT_TOUCH_MP ret = nvt_mp_proc_init(); if (ret != 0) { @@ -1379,7 +1501,7 @@ static int32_t nvt_ts_probe(struct i2c_client *client, const struct i2c_device_i #endif bTouchIsAwake = 1; - NVT_LOG("exit %s normal end\n", __func__); + NVT_LOG("end\n"); enable_irq(client->irq); @@ -1392,11 +1514,11 @@ err_register_early_suspend_failed: #endif #if (NVT_TOUCH_PROC || NVT_TOUCH_EXT_PROC || NVT_TOUCH_MP) err_init_NVT_ts: -#endif -#if BOOT_UPDATE_FIRMWARE - err_create_nvt_fwu_wq_failed: #endif free_irq(client->irq, ts); +#if BOOT_UPDATE_FIRMWARE +err_create_nvt_fwu_wq_failed: +#endif err_int_request_failed: err_input_register_device_failed: input_free_device(ts->input_dev); @@ -1404,18 +1526,11 @@ err_input_dev_alloc_failed: err_create_nvt_wq_failed: mutex_destroy(&ts->lock); err_chipvertrim_failed: -#if NVT_TOUCH_SUPPORT_HW_RST - if (gpio_is_valid(ts->reset_gpio)) - gpio_free(ts->reset_gpio); -#endif - if (gpio_is_valid(ts->irq_gpio)) - gpio_free(ts->irq_gpio); +err_check_functionality_failed: + gpio_free(ts->irq_gpio); err_gpio_config_failed: i2c_set_clientdata(client, NULL); kfree(ts); -err_check_functionality_failed: - - NVT_LOG("exit %s abnormal end\n", __func__); return ret; } @@ -1428,7 +1543,6 @@ return: *******************************************************/ static int32_t nvt_ts_remove(struct i2c_client *client) { - //struct nvt_ts_data *ts = i2c_get_clientdata(client); #if defined(CONFIG_FB) if (fb_unregister_client(&ts->fb_notif)) @@ -1437,6 +1551,10 @@ static int32_t nvt_ts_remove(struct i2c_client *client) unregister_early_suspend(&ts->early_suspend); #endif +#if NVT_TOUCH_FW + nvt_fw_sysfs_deinit(); +#endif + mutex_destroy(&ts->lock); NVT_LOG("Removing driver...\n"); @@ -1471,19 +1589,19 @@ static int32_t nvt_ts_suspend(struct device *dev) mutex_lock(&ts->lock); NVT_LOG("start\n"); - +#if NVT_TOUCH_FW + 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 NVT_TOUCH_ESD_PROTECT */ +#endif #if WAKEUP_GESTURE - //---write i2c command to enter "wakeup gesture mode"--- buf[0] = EVENT_MAP_HOST_CMD; buf[1] = 0x13; -#if 0 // Do not set 0xFF first, ToDo +#if 0 buf[2] = 0xFF; buf[3] = 0xFF; CTP_I2C_WRITE(ts->client, I2C_FW_Address, buf, 4); @@ -1495,14 +1613,13 @@ static int32_t nvt_ts_suspend(struct device *dev) NVT_LOG("Enabled touch wakeup gesture\n"); -#else // WAKEUP_GESTURE +#else 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 // WAKEUP_GESTURE +#endif /* release all touches */ #if MT_PROTOCOL_B @@ -1537,21 +1654,23 @@ return: *******************************************************/ static int32_t nvt_ts_resume(struct device *dev) { + int res = 0; + if (bTouchIsAwake) { NVT_LOG("Touch is already resume\n"); return 0; } + msleep(10); + mutex_lock(&ts->lock); NVT_LOG("start\n"); - // please make sure display reset(RESX) sequence and mipi dsi cmds sent before this -#if NVT_TOUCH_SUPPORT_HW_RST - gpio_set_value(ts->reset_gpio, 1); -#endif nvt_bootloader_reset(); - nvt_check_fw_reset_state(RESET_STATE_REK); + res = nvt_check_fw_reset_state(RESET_STATE_REK); + + NVT_ERR("xlixiang---enter-%s-----res=%d\n", __func__, res); #if !WAKEUP_GESTURE enable_irq(ts->client->irq); @@ -1559,10 +1678,12 @@ static int32_t nvt_ts_resume(struct device *dev) #if NVT_TOUCH_ESD_PROTECT queue_delayed_work(nvt_esd_check_wq, &nvt_esd_check_work, - msecs_to_jiffies(NVT_TOUCH_ESD_CHECK_PERIOD)); -#endif /* #if NVT_TOUCH_ESD_PROTECT */ - + msecs_to_jiffies(NVT_TOUCH_ESD_CHECK_PERIOD)); +#endif bTouchIsAwake = 1; +#if NVT_TOUCH_FW + ts->suspended = 0; +#endif mutex_unlock(&ts->lock); @@ -1587,7 +1708,8 @@ 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) { + if (*blank == FB_BLANK_UNBLANK || + (*blank == FB_BLANK_NORMAL && 0 == bTouchIsAwake)) { nvt_ts_resume(&ts->client->dev); } } @@ -1649,8 +1771,6 @@ static struct i2c_board_info __initdata nvt_i2c_boardinfo[] = { static struct i2c_driver nvt_i2c_driver = { .probe = nvt_ts_probe, .remove = nvt_ts_remove, -// .suspend = nvt_ts_suspend, -// .resume = nvt_ts_resume, .id_table = nvt_ts_id, .driver = { .name = NVT_I2C_NAME, @@ -1678,7 +1798,6 @@ 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__); @@ -1709,14 +1828,13 @@ 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); -#endif /* #if NVT_TOUCH_ESD_PROTECT */ +#endif + } -//late_initcall(nvt_driver_init); module_init(nvt_driver_init); module_exit(nvt_driver_exit); diff --git a/drivers/input/touchscreen/nova_mmi/nt36xxx.h b/drivers/input/touchscreen/nova_mmi/nt36xxx.h index c640665e6cbc..739283f1ddb6 100644 --- a/drivers/input/touchscreen/nova_mmi/nt36xxx.h +++ b/drivers/input/touchscreen/nova_mmi/nt36xxx.h @@ -1,8 +1,8 @@ /* * Copyright (C) 2010 - 2017 Novatek, Inc. * - * $Revision: 22429 $ - * $Date: 2018-01-30 19:42:59 +0800 (Tue, 30 Jan 2018) $ + * $Revision: 17989 $ + * $Date: 2017-10-31 21:25:50 +0800 (週二, 31 十月 2017) $ * * 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 @@ -25,22 +25,12 @@ #include #endif -#include "nt36xxx_mem_map.h" +#define NVT_DEBUG 1 -#define NVT_DEBUG 0 - -//---GPIO number--- -#define NVTTOUCH_RST_PIN 980 #define NVTTOUCH_INT_PIN 943 - -//---INT trigger mode--- -//#define IRQ_TYPE_EDGE_RISING 1 -//#define IRQ_TYPE_EDGE_FALLING 2 #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 @@ -53,13 +43,10 @@ #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 720 -#define TOUCH_DEFAULT_MAX_HEIGHT 1512 +#define TOUCH_DEFAULT_MAX_WIDTH 1080 +#define TOUCH_DEFAULT_MAX_HEIGHT 2246 #define TOUCH_MAX_FINGER_NUM 10 #define TOUCH_KEY_NUM 0 #if TOUCH_KEY_NUM > 0 @@ -67,13 +54,11 @@ extern const uint16_t touch_key_array[TOUCH_KEY_NUM]; #endif #define TOUCH_FORCE_NUM 1000 -/* Enable only when module have tp reset pin and connected to host */ -#define NVT_TOUCH_SUPPORT_HW_RST 1 - -//---Customerized func.--- #define NVT_TOUCH_PROC 1 #define NVT_TOUCH_EXT_PROC 1 +#define NVT_TOUCH_FW 1 #define NVT_TOUCH_MP 1 +#define NVT_TOUCH_MP_LENOVO 1 #define MT_PROTOCOL_B 1 #define WAKEUP_GESTURE 0 #if WAKEUP_GESTURE @@ -81,10 +66,35 @@ extern const uint16_t gesture_key_array[]; #endif #define BOOT_UPDATE_FIRMWARE 0 #define BOOT_UPDATE_FIRMWARE_NAME "novatek_ts_fw.bin" +/* ---ESD Protect.--- */ +#define NVT_TOUCH_ESD_PROTECT 1 +#define NVT_TOUCH_ESD_CHECK_PERIOD 2000 /* ms */ -//---ESD Protect.--- -#define NVT_TOUCH_ESD_PROTECT 0 -#define NVT_TOUCH_ESD_CHECK_PERIOD 1500 /* 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; @@ -114,8 +124,19 @@ struct nvt_ts_data { const struct nvt_ts_mem_map *mmap; uint8_t carrier_system; uint16_t nvt_pid; +#if NVT_TOUCH_FW + int8_t product_id[10]; + uint8_t suspended; + uint8_t force_reflash; + uint8_t loading_fw; +#endif }; +#if NVT_TOUCH_FW +#define FW_NAME_MAX_LEN 80 +#define VENDOR_NAME "novatek_ts" +#endif + #if NVT_TOUCH_PROC struct nvt_flash_data{ rwlock_t lock; @@ -124,10 +145,10 @@ struct nvt_flash_data{ #endif typedef enum { - RESET_STATE_INIT = 0xA0,// IC reset - RESET_STATE_REK, // ReK baseline - RESET_STATE_REK_FINISH, // baseline is ready - RESET_STATE_NORMAL_RUN, // normal run + RESET_STATE_INIT = 0xA0, + RESET_STATE_REK, + RESET_STATE_REK_FINISH, + RESET_STATE_NORMAL_RUN, RESET_STATE_MAX = 0xAF } RST_COMPLETE_STATE; @@ -137,12 +158,28 @@ typedef enum { EVENT_MAP_RESET_COMPLETE = 0x60, EVENT_MAP_FWINFO = 0x78, EVENT_MAP_PROJECTID = 0x9A, + EVENT_MAP_FWDATE = 0x9C, } I2C_EVENT_MAP; -//---extern structures--- +#if NVT_TOUCH_MP_LENOVO +typedef enum { + MP_RESULT_SHIFT_SHORT = 0x00, + MP_RESULT_SHIFT_SHORT_DIFF, + MP_RESULT_SHIFT_SHORT_BASE, + MP_RESULT_SHIFT_OPEN, + MP_RESULT_SHIFT_RAWDATA, + MP_RESULT_SHIFT_CC, + MP_RESULT_SHIFT_CC_I, + MP_RESULT_SHIFT_CC_Q, + MP_RESULT_SHIFT_NOISE, + MP_RESULT_SHIFT_DIFF_MAX, + MP_RESULT_SHIFT_DIFF_MIN, +/* MP_RESULT_SHIFT_READFAIL,*/ +} MP_TEST_RESULT; +#endif + 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); @@ -151,9 +188,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 /* #if NVT_TOUCH_ESD_PROTECT */ -extern void nvt_stop_crc_reboot(void); +#endif #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 07df0d63d398..b5d7c28ecf51 100644 --- a/drivers/input/touchscreen/nova_mmi/nt36xxx_ext_proc.c +++ b/drivers/input/touchscreen/nova_mmi/nt36xxx_ext_proc.c @@ -1,8 +1,8 @@ /* * Copyright (C) 2010 - 2017 Novatek, Inc. * - * $Revision: 20251 $ - * $Date: 2017-12-13 17:41:29 +0800 (Wed, 13 Dec 2017) $ + * $Revision: 15382 $ + * $Date: 2017-08-15 09:19:01 +0800 (周二, 15 八月 2017) $ * * 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 @@ -37,11 +37,12 @@ #define HANDSHAKING_HOST_READY 0xBB #define XDATA_SECTOR_SIZE 256 +#define XDATA_BUF_SIZE 2048 -static uint8_t xdata_tmp[2048] = {0}; -static int32_t xdata[2048] = {0}; -static int32_t xdata_i[2048] = {0}; -static int32_t xdata_q[2048] = {0}; +static uint8_t xdata_tmp[XDATA_BUF_SIZE] = {0}; +static int32_t xdata[XDATA_BUF_SIZE] = {0}; +static int32_t xdata_i[XDATA_BUF_SIZE] = {0}; +static int32_t xdata_q[XDATA_BUF_SIZE] = {0}; static struct proc_dir_entry *NVT_proc_fw_version_entry; static struct proc_dir_entry *NVT_proc_baseline_entry; @@ -59,13 +60,11 @@ 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); @@ -89,22 +88,86 @@ 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); } +/******************************************************* +Description: + Novatek touchscreen read mass data function. + +return: + n.a. +*******************************************************/ +int32_t nvt_read_mass_data(uint8_t i2c_addr, uint8_t *temp_buf, uint32_t count) +{ + int32_t i = 0; + int32_t j = 0; + int32_t k = 0; + uint8_t i2c_buf[I2C_TANSFER_LENGTH + 1] = {0}; + uint32_t xdata_addr = 0; + uint32_t head_addr = 0; + int32_t dummy_len = 0; + int32_t data_len = 0; + int32_t residual_len = 0; + + 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; + data_len = (int32_t)((temp_buf[1] << 8) + temp_buf[2]); + residual_len = (head_addr + dummy_len + data_len) % XDATA_SECTOR_SIZE; + + if (data_len > XDATA_BUF_SIZE) + return -EINVAL; + + for (i = 0; i < ((dummy_len + data_len) / XDATA_SECTOR_SIZE); i++) { + 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); + for (j = 0; j < (XDATA_SECTOR_SIZE / I2C_TANSFER_LENGTH); j++) { + i2c_buf[0] = I2C_TANSFER_LENGTH * j; + CTP_I2C_READ(ts->client, (uint16_t)i2c_addr, i2c_buf, I2C_TANSFER_LENGTH + 1); + for (k = 0; k < I2C_TANSFER_LENGTH; k++) { + xdata_tmp[XDATA_SECTOR_SIZE * i + I2C_TANSFER_LENGTH * j + k] = i2c_buf[k + 1]; + } + } + } + + if (residual_len != 0) { + 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); + for (j = 0; j < (residual_len / I2C_TANSFER_LENGTH + 1); j++) { + i2c_buf[0] = I2C_TANSFER_LENGTH * j; + CTP_I2C_READ(ts->client, (uint16_t)i2c_addr, i2c_buf, I2C_TANSFER_LENGTH + 1); + 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]; + } + } + } + + 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); + + for (i = 0; i < data_len; i++) { + *(temp_buf + i) = xdata_tmp[dummy_len + i]; + } + + return data_len; +} + /******************************************************* Description: Novatek touchscreen read meta data function. @@ -123,84 +186,61 @@ 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; @@ -352,6 +392,36 @@ Description: return: n.a. *******************************************************/ +static int32_t nvt_info_open(struct inode *inode, struct file *file) +{ + if (mutex_lock_interruptible(&ts->lock)) { + return -ERESTARTSYS; + } + + NVT_LOG("++\n"); +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif + if (nvt_get_fw_info()) { + mutex_unlock(&ts->lock); + return -EAGAIN; + } + + mutex_unlock(&ts->lock); + + NVT_LOG("--\n"); + + return seq_open(file, &nvt_fw_version_seq_ops); +} + +static const struct file_operations nvt_info_proc_fops = { + .owner = THIS_MODULE, + .open = nvt_info_open, + .read = seq_read, + .llseek = seq_lseek, + .release = seq_release, +}; + static int32_t nvt_fw_version_open(struct inode *inode, struct file *file) { if (mutex_lock_interruptible(&ts->lock)) { @@ -359,11 +429,9 @@ static int32_t nvt_fw_version_open(struct inode *inode, struct file *file) } NVT_LOG("++\n"); - #if NVT_TOUCH_ESD_PROTECT - nvt_esd_check_enable(false); -#endif /* #if NVT_TOUCH_ESD_PROTECT */ - + nvt_esd_check_enable(false); +#endif if (nvt_get_fw_info()) { mutex_unlock(&ts->lock); return -EAGAIN; @@ -398,11 +466,9 @@ static int32_t nvt_baseline_open(struct inode *inode, struct file *file) } NVT_LOG("++\n"); - #if NVT_TOUCH_ESD_PROTECT - nvt_esd_check_enable(false); -#endif /* #if NVT_TOUCH_ESD_PROTECT */ - + nvt_esd_check_enable(false); +#endif if (nvt_clear_fw_status()) { mutex_unlock(&ts->lock); return -EAGAIN; @@ -458,11 +524,9 @@ static int32_t nvt_raw_open(struct inode *inode, struct file *file) } NVT_LOG("++\n"); - #if NVT_TOUCH_ESD_PROTECT - nvt_esd_check_enable(false); -#endif /* #if NVT_TOUCH_ESD_PROTECT */ - + nvt_esd_check_enable(false); +#endif if (nvt_clear_fw_status()) { mutex_unlock(&ts->lock); return -EAGAIN; @@ -525,11 +589,9 @@ static int32_t nvt_diff_open(struct inode *inode, struct file *file) } NVT_LOG("++\n"); - #if NVT_TOUCH_ESD_PROTECT - nvt_esd_check_enable(false); -#endif /* #if NVT_TOUCH_ESD_PROTECT */ - + nvt_esd_check_enable(false); +#endif if (nvt_clear_fw_status()) { mutex_unlock(&ts->lock); return -EAGAIN; diff --git a/drivers/input/touchscreen/nova_mmi/nt36xxx_fw_update.c b/drivers/input/touchscreen/nova_mmi/nt36xxx_fw_update.c index 4d331ef8b917..be3b910db923 100644 --- a/drivers/input/touchscreen/nova_mmi/nt36xxx_fw_update.c +++ b/drivers/input/touchscreen/nova_mmi/nt36xxx_fw_update.c @@ -1,8 +1,8 @@ /* * Copyright (C) 2010 - 2017 Novatek, Inc. * - * $Revision: 20544 $ - * $Date: 2017-12-20 11:08:15 +0800 (Wed, 20 Dec 2017) $ + * $Revision: 12034 $ + * $Date: 2017-05-04 17:49:58 +0800 (周四, 04 五月 2017) $ * * 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 @@ -21,7 +21,7 @@ #include "nt36xxx.h" -#if BOOT_UPDATE_FIRMWARE +#if (BOOT_UPDATE_FIRMWARE || NVT_TOUCH_FW) #define FW_BIN_SIZE_116KB 118784 #define FW_BIN_SIZE FW_BIN_SIZE_116KB @@ -45,7 +45,7 @@ int32_t update_firmware_request(char *filename) int32_t ret = 0; if (NULL == filename) { - return -EPERM; + return -1; } NVT_LOG("filename is %s\n", filename); @@ -56,13 +56,11 @@ 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)); @@ -100,7 +98,6 @@ 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; @@ -110,7 +107,6 @@ int32_t Check_FW_Ver(void) return ret; } - //read Firmware Version buf[0] = EVENT_MAP_FWINFO; buf[1] = 0x00; buf[2] = 0x00; @@ -124,13 +120,11 @@ 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 @@ -150,7 +144,6 @@ 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); @@ -159,7 +152,6 @@ int32_t Resume_PD(void) return ret; } - // Check 0xAA (Resume Command) retry = 0; while (1) { msleep(1); @@ -176,7 +168,7 @@ int32_t Resume_PD(void) retry++; if (unlikely(retry > 20)) { NVT_ERR("Check 0xAA (Resume Command) error!! status=0x%02X\n", buf[1]); - return -EPERM; + return -1; } } msleep(10); @@ -208,14 +200,13 @@ int32_t Check_CheckSum(void) if (Resume_PD()) { NVT_ERR("Resume PD error!!\n"); - return -EPERM; + return -1; } fw_bin_size = fw_entry->size; 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++) { @@ -223,7 +214,6 @@ 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; @@ -236,7 +226,6 @@ 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); @@ -253,10 +242,9 @@ int32_t Check_CheckSum(void) retry++; if (unlikely(retry > 5)) { NVT_ERR("Check 0xAA (Fast Read Command) failed, buf[1]=0x%02X, retry=%d\n", buf[1], retry); - return -EPERM; + return -1; } } - // Read Checksum (write addr high byte & middle byte) buf[0] = 0xFF; buf[1] = XDATA_Addr >> 16; buf[2] = (XDATA_Addr >> 8) & 0xFF; @@ -265,7 +253,6 @@ 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; @@ -302,10 +289,8 @@ 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; @@ -315,7 +300,6 @@ int32_t Init_BootLoader(void) return ret; } - // Check 0xAA (Initiate Flash Block) retry = 0; while (1) { msleep(1); @@ -332,7 +316,7 @@ int32_t Init_BootLoader(void) retry++; if (unlikely(retry > 20)) { NVT_ERR("Check 0xAA (Inittial Flash Block) error!! status=0x%02X\n", buf[1]); - return -EPERM; + return -1; } } @@ -358,7 +342,6 @@ 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); @@ -366,7 +349,6 @@ 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); @@ -383,11 +365,10 @@ int32_t Erase_Flash(void) retry++; if (unlikely(retry > 20)) { NVT_ERR("Check 0xAA (Write Enable for Write Status Register) error!! status=0x%02X\n", buf[1]); - return -EPERM; + return -1; } } - // Write Status Register buf[0] = 0x00; buf[1] = 0x01; buf[2] = 0x00; @@ -396,7 +377,6 @@ 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); @@ -413,11 +393,10 @@ int32_t Erase_Flash(void) retry++; if (unlikely(retry > 20)) { NVT_ERR("Check 0xAA (Write Status Register) error!! status=0x%02X\n", buf[1]); - return -EPERM; + return -1; } } - // Read Status retry = 0; while (1) { mdelay(5); @@ -429,7 +408,6 @@ int32_t Erase_Flash(void) return ret; } - // Check 0xAA (Read Status) buf[0] = 0x00; buf[1] = 0x00; buf[2] = 0x00; @@ -444,7 +422,7 @@ int32_t Erase_Flash(void) retry++; if (unlikely(retry > 100)) { NVT_ERR("Check 0xAA (Read Status for Write Status Register) failed, buf[1]=0x%02X, buf[2]=0x%02X, retry=%d\n", buf[1], buf[2], retry); - return -EPERM; + return -1; } } @@ -454,7 +432,6 @@ int32_t Erase_Flash(void) count = fw_entry->size / FLASH_SECTOR_SIZE; 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); @@ -462,7 +439,6 @@ 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); @@ -479,15 +455,14 @@ int32_t Erase_Flash(void) retry++; if (unlikely(retry > 20)) { NVT_ERR("Check 0xAA (Write Enable) error!! status=0x%02X\n", buf[1]); - return -EPERM; + return -1; } } Flash_Address = i * FLASH_SECTOR_SIZE; - // Sector Erase buf[0] = 0x00; - buf[1] = 0x20; // Command : Sector Erase + buf[1] = 0x20; buf[2] = ((Flash_Address >> 16) & 0xFF); buf[3] = ((Flash_Address >> 8) & 0xFF); buf[4] = (Flash_Address & 0xFF); @@ -496,7 +471,6 @@ 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); @@ -513,11 +487,10 @@ int32_t Erase_Flash(void) retry++; if (unlikely(retry > 20)) { NVT_ERR("Check 0xAA (Sector Erase) failed, buf[1]=0x%02X, retry=%d\n", buf[1], retry); - return -EPERM; + return -1; } } - // Read Status retry = 0; while (1) { mdelay(5); @@ -529,7 +502,6 @@ int32_t Erase_Flash(void) return ret; } - // Check 0xAA (Read Status) buf[0] = 0x00; buf[1] = 0x00; buf[2] = 0x00; @@ -544,7 +516,7 @@ int32_t Erase_Flash(void) retry++; if (unlikely(retry > 100)) { NVT_ERR("Check 0xAA (Read Status) failed, buf[1]=0x%02X, buf[2]=0x%02X, retry=%d\n", buf[1], buf[2], retry); - return -EPERM; + return -1; } } } @@ -571,7 +543,6 @@ 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; @@ -589,7 +560,6 @@ 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); @@ -597,7 +567,6 @@ 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); @@ -614,11 +583,10 @@ int32_t Write_Flash(void) retry++; if (unlikely(retry > 20)) { NVT_ERR("Check 0xAA (Write Enable) error!! status=0x%02X\n", buf[1]); - return -EPERM; + return -1; } } - // 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++) { @@ -640,7 +608,6 @@ int32_t Write_Flash(void) tmpvalue = 255 - tmpvalue + 1; - // Page Program buf[0] = 0x00; buf[1] = 0x02; buf[2] = ((Flash_Address >> 16) & 0xFF); @@ -654,7 +621,6 @@ 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); @@ -671,15 +637,14 @@ int32_t Write_Flash(void) retry++; if (unlikely(retry > 20)) { NVT_ERR("Check 0xAA (Page Program) failed, buf[1]=0x%02X, retry=%d\n", buf[1], retry); - return -EPERM; + return -1; } } if (buf[1] == 0xEA) { NVT_ERR("Page Program error!! i=%d\n", i); - return -ESRCH; + return -3; } - // Read Status retry = 0; while (1) { mdelay(5); @@ -691,7 +656,6 @@ int32_t Write_Flash(void) return ret; } - // Check 0xAA (Read Status) buf[0] = 0x00; buf[1] = 0x00; buf[2] = 0x00; @@ -706,12 +670,12 @@ int32_t Write_Flash(void) retry++; if (unlikely(retry > 100)) { NVT_ERR("Check 0xAA (Read Status) failed, buf[1]=0x%02X, buf[2]=0x%02X, retry=%d\n", buf[1], buf[2], retry); - return -EPERM; + return -1; } } if (buf[1] == 0xEA) { NVT_ERR("Page Program error!! i=%d\n", i); - return -EINTR; + return -4; } NVT_LOG("Programming...%2d%%\r", ((i * 100) / count)); @@ -747,7 +711,6 @@ 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++) { @@ -755,7 +718,6 @@ 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; @@ -768,7 +730,6 @@ 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); @@ -785,10 +746,9 @@ int32_t Verify_Flash(void) retry++; if (unlikely(retry > 5)) { NVT_ERR("Check 0xAA (Fast Read Command) failed, buf[1]=0x%02X, retry=%d\n", buf[1], retry); - return -EPERM; + return -1; } } - // Read Checksum (write addr high byte & middle byte) buf[0] = 0xFF; buf[1] = XDATA_Addr >> 16; buf[2] = (XDATA_Addr >> 8) & 0xFF; @@ -797,7 +757,6 @@ 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; @@ -811,7 +770,7 @@ int32_t Verify_Flash(void) if (WR_Filechksum[i] != RD_Filechksum[i]) { NVT_ERR("Verify Fail%d!!\n", i); NVT_ERR("RD_Filechksum[%d]=0x%04X, WR_Filechksum[%d]=0x%04X\n", i, RD_Filechksum[i], i, WR_Filechksum[i]); - return -EPERM; + return -1; } } } @@ -831,144 +790,39 @@ 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; } +#endif -/******************************************************* -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 -EPERM; - } - - 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 - strlcpy(nvt_end_flag, &buf[3], sizeof(nvt_end_flag)); - 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; - } -} - +#if BOOT_UPDATE_FIRMWARE /******************************************************* Description: Novatek touchscreen update firmware when booting @@ -982,9 +836,8 @@ void Boot_Update_Firmware(struct work_struct *work) int32_t ret = 0; char firmware_name[256] = ""; - snprintf(firmware_name, sizeof(firmware_name), BOOT_UPDATE_FIRMWARE_NAME); + 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); @@ -992,36 +845,386 @@ void Boot_Update_Firmware(struct work_struct *work) } mutex_lock(&ts->lock); - #if NVT_TOUCH_ESD_PROTECT nvt_esd_check_enable(false); -#endif /* #if NVT_TOUCH_ESD_PROTECT */ - +#endif +#if NVT_TOUCH_FW + ts->loading_fw = 1; +#endif nvt_sw_reset_idle(); ret = Check_CheckSum(); - if (ret < 0) { // read firmware checksum failed + if (ret < 0) { NVT_ERR("read firmware checksum failed\n"); Update_Firmware(); - } else if ((ret == 0) && (Check_FW_Ver() == 0)) { // (fw checksum not match) && (bin fw version >= ic fw version) + } else if ((ret == 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(); - ret = nvt_check_fw_reset_state(RESET_STATE_INIT); - if (ret) { - NVT_LOG("check fw reset state failed\n"); - Update_Firmware(); - } + nvt_check_fw_reset_state(RESET_STATE_INIT); } +#if NVT_TOUCH_FW + ts->loading_fw = 0; +#endif mutex_unlock(&ts->lock); update_firmware_release(); } #endif /* BOOT_UPDATE_FIRMWARE */ + +#if NVT_TOUCH_FW +static ssize_t nvt_poweron_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + bool val; + + mutex_lock(&ts->lock); + val = ts->suspended; + mutex_unlock(&ts->lock); + + return scnprintf(buf, PAGE_SIZE, "%d\n", + val == 0); +} + +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); +} + +static DEVICE_ATTR(ic_ver, 0444, nvt_ic_ver_show, NULL); + +static ssize_t nvt_productinfo_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ +/* Update script use as $touch_product_id in fw name ==> (chip id from Lenovo&script) OR (vendor name from Focaltech) OR (project ID from Longcheer&Himax) + Project ID ?? ( - Jeter - Hannah) + Chip ID ?? (NVT-ts or NVTCapacitiveTouchScreen or NT36xxx) */ + return scnprintf(buf, PAGE_SIZE, "%s\n", + ts->product_id); +} + +static DEVICE_ATTR(productinfo, 0444, nvt_productinfo_show, NULL); + +static ssize_t nvt_force_reflash_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + unsigned int input; + + if (sscanf(buf, "%u", &input) != 1) + return -EINVAL; + + ts->force_reflash = (input == 0) ? false : true; + + return count; +} + +static DEVICE_ATTR(forcereflash, 0220, NULL, nvt_force_reflash_store); + +static ssize_t nvt_flashprog_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return scnprintf(buf, PAGE_SIZE, "%d\n", + (ts->loading_fw) ? 1 : 0); +} + +static DEVICE_ATTR(flashprog, 0444, nvt_flashprog_show, NULL); + +static ssize_t nvt_do_reflash_store(struct device *dev, + struct device_attribute *attr, const char *buf, size_t count) +{ + int retval; + char prefix[FW_NAME_MAX_LEN] = VENDOR_NAME; + char template[FW_NAME_MAX_LEN]; + char firmware_name[256] = ""; + + if (count > FW_NAME_MAX_LEN) { + NVT_ERR("FW filename is too long\n"); + retval = -EINVAL; + goto exit; + } + + if (ts->suspended) { + NVT_ERR("In suspend state, try again later\n"); + retval = -EINVAL; + goto exit; + } + + if (ts->loading_fw) { + NVT_ERR("In FW flashing state, try again later\n"); + retval = -EINVAL; + goto exit; + } + + if (!ts->force_reflash) { + if (strncmp(buf, prefix, + strnlen(prefix, sizeof(prefix)))) { + NVT_ERR("FW does not belong to Novatek\n"); + retval = -EINVAL; + goto exit; + } + + snprintf(template, sizeof(template), "-%s-", + ts->product_id); + if (!strnstr(buf + strnlen(prefix, sizeof(prefix)), template, + count)) { + NVT_ERR("FW does not belong to %s\n", ts->product_id); + retval = -EINVAL; + goto exit; + } + } + + strlcpy(firmware_name, buf, count); + NVT_LOG("FW filename: %s\n", firmware_name); + + retval = update_firmware_request(firmware_name); + if (retval) { + NVT_ERR("update_firmware_request failed. (%d)\n", retval); + goto exit; + } + + mutex_lock(&ts->lock); +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif + ts->loading_fw = 1; + nvt_sw_reset_idle(); + + retval = Check_CheckSum(); + + if (retval < 0) { + NVT_ERR("read firmware checksum failed\n"); + Update_Firmware(); + } else if ((retval == 0) && (Check_FW_Ver() == 0)) { + NVT_LOG("firmware version not match\n"); + Update_Firmware(); + } else { + /* Bootloader Reset */ + nvt_bootloader_reset(); + nvt_check_fw_reset_state(RESET_STATE_INIT); + } + + ts->loading_fw = 0; + mutex_unlock(&ts->lock); + + update_firmware_release(); + + retval = count; +exit: + return retval; +} + +static DEVICE_ATTR(doreflash, 0220, NULL, nvt_do_reflash_store); + +static ssize_t nvt_build_id_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ +/* Update script use for comparing $str_cfg_id_latest in fw name */ + uint8_t tmp_buf[4] = {0}; + uint8_t fw_version = 0; + uint8_t date_Y = 0; + uint8_t date_M = 0; + uint8_t date_D = 0; + + tmp_buf[0] = 0xFF; + tmp_buf[1] = (ts->mmap->EVENT_BUF_ADDR >> 16) & 0xFF; + tmp_buf[2] = (ts->mmap->EVENT_BUF_ADDR >> 8) & 0xFF; + CTP_I2C_WRITE(ts->client, I2C_FW_Address, tmp_buf, 3); + + tmp_buf[0] = EVENT_MAP_FWINFO; + CTP_I2C_READ(ts->client, I2C_FW_Address, tmp_buf, 2); + fw_version = tmp_buf[1]; + + tmp_buf[0] = EVENT_MAP_FWDATE; + CTP_I2C_READ(ts->client, I2C_FW_Address, tmp_buf, 4); + date_Y = tmp_buf[1]; + date_M = tmp_buf[2]; + date_D = tmp_buf[3]; + + return scnprintf(buf, PAGE_SIZE, "%02x-%02d%02d%02d\n", + fw_version, date_Y, date_M, date_D); +} + +static DEVICE_ATTR(buildid, 0444, nvt_build_id_show, NULL); + + +#include +#include +#include + +/* Attribute: path (RO) */ +static ssize_t path_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + ssize_t blen; + const char *path; + + path = kobject_get_path(&ts->client->dev.kobj, GFP_KERNEL); + blen = scnprintf(buf, PAGE_SIZE, "%s", path ? path : "na"); + kfree(path); + return blen; +} + +/* Attribute: vendor (RO) */ +static ssize_t vendor_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + return scnprintf(buf, PAGE_SIZE, VENDOR_NAME); +} + +static struct device_attribute touchscreen_attributes[] = { + __ATTR_RO(path), + __ATTR_RO(vendor), + __ATTR_NULL +}; + +#define TSDEV_MINOR_BASE 128 +#define TSDEV_MINOR_MAX 32 + +/******************************************************* +Description: + Novatek touchscreen FW function class. file node + initial function. + +return: + Executive outcomes. 0---succeed. -1---failed. +*******************************************************/ +int32_t nvt_fw_class_init(bool create) +{ + struct device_attribute *attrs = touchscreen_attributes; + int i, error = 0; + static struct class *touchscreen_class; + static struct device *ts_class_dev; + static int minor; + + if (create) { + minor = input_get_new_minor(ts->client->addr, + 1, false); + if (minor < 0) + minor = input_get_new_minor(TSDEV_MINOR_BASE, + TSDEV_MINOR_MAX, true); + NVT_LOG("assigned minor %d\n", minor); + + touchscreen_class = class_create(THIS_MODULE, "touchscreen"); + if (IS_ERR(touchscreen_class)) { + error = PTR_ERR(touchscreen_class); + touchscreen_class = NULL; + return error; + } + + ts_class_dev = device_create(touchscreen_class, NULL, + MKDEV(INPUT_MAJOR, minor), + ts, NVT_I2C_NAME); + if (IS_ERR(ts_class_dev)) { + error = PTR_ERR(ts_class_dev); + ts_class_dev = NULL; + return error; + } + + for (i = 0; attrs[i].attr.name != NULL; ++i) { + error = device_create_file(ts_class_dev, &attrs[i]); + if (error) + break; + } + + if (error) + goto device_destroy; + else + NVT_LOG("create /sys/class/touchscreen/%s Succeeded!\n", NVT_I2C_NAME); + } else { + if (!touchscreen_class || !ts_class_dev) + return -ENODEV; + + for (i = 0; attrs[i].attr.name != NULL; ++i) + device_remove_file(ts_class_dev, &attrs[i]); + + device_unregister(ts_class_dev); + class_unregister(touchscreen_class); + } + + return 0; + +device_destroy: + for (--i; i >= 0; --i) + device_remove_file(ts_class_dev, &attrs[i]); + device_destroy(touchscreen_class, MKDEV(INPUT_MAJOR, minor)); + ts_class_dev = NULL; + class_unregister(touchscreen_class); + NVT_ERR("error creating touchscreen class\n"); + + return -ENODEV; +} + +int nvt_fw_sysfs_init(void) +{ + int ret; + struct i2c_client *client = ts->client; + + ret = nvt_fw_class_init(true); + if (ret != 0) { + NVT_ERR("fw class init failed. ret=%d\n", ret); + return ret; + } + + ret = device_create_file(&client->dev, &dev_attr_forcereflash); + if (ret) { + NVT_ERR("create_file dev_attr_forcereflash failed\n"); + return ret; + } + + ret = device_create_file(&client->dev, &dev_attr_flashprog); + if (ret) { + NVT_ERR("create_file dev_attr_flashprog failed\n"); + return ret; + } + ret = device_create_file(&client->dev, &dev_attr_doreflash); + if (ret) { + NVT_ERR("create_file dev_attr_doreflash failed\n"); + return ret; + } + + ret = device_create_file(&client->dev, &dev_attr_buildid); + if (ret) { + NVT_ERR("create_file dev_attr_buildid failed\n"); + return ret; + } + + ret = device_create_file(&client->dev, &dev_attr_productinfo); + if (ret) { + NVT_ERR("create_file dev_attr_productinfo failed\n"); + return ret; + } + + ret = device_create_file(&client->dev, &dev_attr_poweron); + if (ret) { + NVT_ERR("create_file dev_attr_poweron failed\n"); + return ret; + } + + ret = device_create_file(&client->dev, &dev_attr_ic_ver); + if (ret) { + NVT_ERR("create_file dev_attr_ic_ver failed\n"); + return ret; + } + + return 0; +} +void nvt_fw_sysfs_deinit(void) +{ + struct i2c_client *client = ts->client; + device_remove_file(&client->dev, &dev_attr_forcereflash); + device_remove_file(&client->dev, &dev_attr_flashprog); + device_remove_file(&client->dev, &dev_attr_doreflash); + device_remove_file(&client->dev, &dev_attr_buildid); + device_remove_file(&client->dev, &dev_attr_productinfo); + device_remove_file(&client->dev, &dev_attr_poweron); + device_remove_file(&client->dev, &dev_attr_ic_ver); + nvt_fw_class_init(false); +} +#endif diff --git a/drivers/input/touchscreen/nova_mmi/nt36xxx_mem_map.h b/drivers/input/touchscreen/nova_mmi/nt36xxx_mem_map.h deleted file mode 100644 index 90d62dd70a08..000000000000 --- a/drivers/input/touchscreen/nova_mmi/nt36xxx_mem_map.h +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright (C) 2010 - 2017 Novatek, Inc. - * - * $Revision: 20544 $ - * $Date: 2017-12-20 11:08:15 +0800 (Wed, 20 Dec 2017) $ - * - * 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, 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} -}; diff --git a/drivers/input/touchscreen/nova_mmi/nt36xxx_mp_ctrlram.c b/drivers/input/touchscreen/nova_mmi/nt36xxx_mp_ctrlram.c index 5da8b38b334c..3fd5dbadd688 100644 --- a/drivers/input/touchscreen/nova_mmi/nt36xxx_mp_ctrlram.c +++ b/drivers/input/touchscreen/nova_mmi/nt36xxx_mp_ctrlram.c @@ -1,8 +1,8 @@ /* * Copyright (C) 2010 - 2017 Novatek, Inc. * - * $Revision: 21288 $ - * $Date: 2018-01-05 11:38:47 +0800 (Fri, 05 Jan 2018) $ + * $Revision: 17989 $ + * $Date: 2017-10-31 21:25:50 +0800 (週二, 31 十月 2017) $ * * 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 @@ -82,14 +82,17 @@ static int32_t *RawData_FW_CC; static int32_t *RawData_FW_CC_I; static int32_t *RawData_FW_CC_Q; -static struct proc_dir_entry *NVT_proc_selftest_entry; +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; +#endif static int8_t nvt_mp_test_result_printed; 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); -void nvt_mp_parse_dt(struct device_node *root, const char *node_compatible); +extern int32_t nvt_read_mass_data(uint32_t xdata_addr, uint8_t *temp_buf, uint32_t len); /******************************************************* Description: @@ -250,60 +253,65 @@ static void nvt_print_criteria(void) NVT_LOG("++\n"); if (ts->carrier_system) { - //---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); + 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 */ } else { - //---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); + 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_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) { - //---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); + 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 */ } else { - //---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_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_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); + 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 */ NVT_LOG("--\n"); } @@ -313,88 +321,27 @@ static int32_t nvt_save_rawdata_to_csv(int32_t *rawdata, uint8_t x_ch, uint8_t y int32_t x = 0; int32_t y = 0; int32_t iArrayIndex = 0; - struct file *fp = NULL; - char *fbufp = NULL; - mm_segment_t org_fs; - int32_t write_ret = 0; - uint32_t output_len = 0; - loff_t pos = 0; #if TOUCH_KEY_NUM > 0 int32_t k = 0; - int32_t keydata_output_offset = 0; #endif /* #if TOUCH_KEY_NUM > 0 */ - printk("%s:++\n", __func__); - fbufp = (char *)kzalloc(8192, GFP_KERNEL); - if (!fbufp) { - NVT_ERR("kzalloc for fbufp failed!\n"); - return -ENOMEM; - } + printk("%s:++%s\n", __func__, file_path); for (y = 0; y < y_ch; y++) { for (x = 0; x < x_ch; x++) { iArrayIndex = y * x_ch + x; printk("%5d, ", rawdata[iArrayIndex]); - snprintf(fbufp + iArrayIndex * 7 + y * 2, 7, "%5d, ", rawdata[iArrayIndex]); } printk("\n"); - snprintf(fbufp + (iArrayIndex + 1) * 7 + y * 2, 2, "\r\n"); } #if TOUCH_KEY_NUM > 0 - keydata_output_offset = y_ch * x_ch * 7 + y_ch * 2; for (k = 0; k < Key_Channel; k++) { iArrayIndex = y_ch * x_ch + k; printk("%5d, ", rawdata[iArrayIndex]); - snprintf(fbufp + keydata_output_offset + k * 7, 7, "%5d, ", rawdata[iArrayIndex]); } printk("\n"); - snprintf(fbufp + y_ch * x_ch * 7 + y_ch * 2 + Key_Channel * 7, 2, "\r\n"); #endif /* #if TOUCH_KEY_NUM > 0 */ - org_fs = get_fs(); - set_fs(KERNEL_DS); - /*fp = filp_open(file_path, O_RDWR | O_CREAT, 0644);*/ - if (fp == NULL || IS_ERR(fp)) { - NVT_ERR("open %s failed\n", file_path); - set_fs(org_fs); - if (fbufp) { - kfree(fbufp); - fbufp = NULL; - } - return -EPERM; - } - -#if TOUCH_KEY_NUM > 0 - output_len = y_ch * x_ch * 7 + y_ch * 2 + Key_Channel * 7 + 2; -#else - output_len = y_ch * x_ch * 7 + y_ch * 2; -#endif /* #if TOUCH_KEY_NUM > 0 */ - pos = offset; - write_ret = vfs_write(fp, (char __user *)fbufp, output_len, &pos); - if (write_ret <= 0) { - NVT_ERR("write %s failed\n", file_path); - set_fs(org_fs); - if (fp) { - filp_close(fp, NULL); - fp = NULL; - } - if (fbufp) { - kfree(fbufp); - fbufp = NULL; - } - return -EPERM; - } - - set_fs(org_fs); - if (fp) { - filp_close(fp, NULL); - fp = NULL; - } - if (fbufp) { - kfree(fbufp); - fbufp = NULL; - } - printk("%s:--\n", __func__); return 0; @@ -407,13 +354,11 @@ 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); @@ -426,23 +371,7 @@ 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 -EPERM; + return -1; } else { return 0; } @@ -457,13 +386,11 @@ 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); @@ -527,7 +454,6 @@ 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; @@ -588,7 +514,6 @@ 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; @@ -599,13 +524,11 @@ 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; @@ -621,13 +544,11 @@ 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; @@ -651,7 +572,6 @@ static int32_t nvt_read_fw_noise(int32_t *xdata) NVT_LOG("++\n"); - //---Enter Test Mode--- if (nvt_clear_fw_status()) { return -EAGAIN; } @@ -661,7 +581,6 @@ 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()) { @@ -704,11 +623,9 @@ 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; @@ -721,7 +638,6 @@ 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; @@ -737,13 +653,11 @@ 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; @@ -756,13 +670,11 @@ 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; @@ -785,7 +697,6 @@ static int32_t nvt_read_fw_open(int32_t *xdata) NVT_LOG("++\n"); - //---Enter Test Mode--- if (nvt_clear_fw_status()) { return -EAGAIN; } @@ -812,7 +723,6 @@ 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); @@ -827,7 +737,6 @@ 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); @@ -856,12 +765,10 @@ 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; @@ -888,7 +795,6 @@ static int32_t nvt_read_fw_short(int32_t *xdata) NVT_LOG("++\n"); - //---Enter Test Mode--- if (nvt_clear_fw_status()) { return -EAGAIN; } @@ -910,7 +816,6 @@ 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) @@ -920,7 +825,6 @@ 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); @@ -931,7 +835,6 @@ 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) @@ -940,7 +843,6 @@ 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); @@ -963,13 +865,10 @@ 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); @@ -979,10 +878,8 @@ 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); @@ -1011,14 +908,13 @@ 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; @@ -1030,7 +926,6 @@ 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; @@ -1042,6 +937,76 @@ 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. @@ -1063,7 +1028,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; // default value for PASS + RecordResult[iArrayIndex] = 0x00; if (rawdata[iArrayIndex] > Rawdata_Limit_Postive[iArrayIndex]) RecordResult[iArrayIndex] |= 0x01; @@ -1076,7 +1041,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; // default value for PASS + RecordResult[iArrayIndex] = 0x00; if (rawdata[iArrayIndex] > Rawdata_Limit_Postive[iArrayIndex]) RecordResult[iArrayIndex] |= 0x01; @@ -1086,7 +1051,6 @@ 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) { @@ -1106,7 +1070,7 @@ static int32_t RawDataTest_SinglePoint_Sub(int32_t rawdata[], uint8_t RecordResu #endif /* #if TOUCH_KEY_NUM > 0 */ if (isPass == false) { - return -EPERM; + return -1; } else { return 0; } @@ -1128,16 +1092,16 @@ void print_selftest_result(struct seq_file *m, int32_t TestResult, uint8_t Recor int32_t k = 0; #endif /* #if TOUCH_KEY_NUM > 0 */ - switch (TestResult) { - case 0: + switch (TestResult) { + case 0: nvt_mp_seq_printf(m, " PASS!\n"); break; - case 1: + case 1: nvt_mp_seq_printf(m, " ERROR! Read Data FAIL!\n"); break; - case -1: + case -1: nvt_mp_seq_printf(m, " FAIL!\n"); nvt_mp_seq_printf(m, "RecordResult:\n"); for (i = 0; i < y_len; i++) { @@ -1170,7 +1134,7 @@ void print_selftest_result(struct seq_file *m, int32_t TestResult, uint8_t Recor nvt_mp_seq_printf(m, "\n"); #endif /* #if TOUCH_KEY_NUM > 0 */ break; - } + } nvt_mp_seq_printf(m, "\n"); } @@ -1184,14 +1148,18 @@ return: *******************************************************/ static int32_t c_show_selftest(struct seq_file *m, void *v) { - NVT_LOG("++\n"); +#if NVT_TOUCH_MP_LENOVO + MP_TEST_RESULT mp_result = 0; +#endif + NVT_LOG("++\n"); +#if !NVT_TOUCH_MP_LENOVO nvt_mp_seq_printf(m, "FW Version: %d\n\n", ts->fw_ver); 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 { // TestResult_Short is -1 + } else { if (ts->carrier_system) { nvt_mp_seq_printf(m, " FAIL!\n"); if (TestResult_Short_Diff == -1) { @@ -1213,7 +1181,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 { // TestResult_FW_Rawdata is -1 + } else { nvt_mp_seq_printf(m, " FAIL!\n"); if (TestResult_FWMutual == -1) { nvt_mp_seq_printf(m, "FW Mutual"); @@ -1239,7 +1207,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 { // TestResult_Noise is -1 + } else { nvt_mp_seq_printf(m, " FAIL!\n"); if (TestResult_FW_DiffMax == -1) { @@ -1251,7 +1219,53 @@ static int32_t c_show_selftest(struct seq_file *m, void *v) print_selftest_result(m, TestResult_FW_DiffMin, RecordResult_FW_DiffMin, RawData_Diff_Min, X_Channel, Y_Channel); } } +#else + /* short */ + if (TestResult_Short >= 0) + mp_result |= (!!TestResult_Short << MP_RESULT_SHIFT_SHORT); + else { + if (ts->carrier_system) { + mp_result |= (!!TestResult_Short_Diff << MP_RESULT_SHIFT_SHORT_DIFF); + mp_result |= (!!TestResult_Short_Base << MP_RESULT_SHIFT_SHORT_BASE); + } else { + mp_result |= (!!TestResult_Short << MP_RESULT_SHIFT_SHORT); + } + } + /* open */ + mp_result |= (!!TestResult_Open << MP_RESULT_SHIFT_OPEN); + + /* raw data & cc */ + if (TestResult_FW_Rawdata >= 0) + mp_result |= (!!TestResult_FWMutual << MP_RESULT_SHIFT_RAWDATA); + else { + if (TestResult_FWMutual == -1) { + mp_result |= (!!TestResult_FWMutual << MP_RESULT_SHIFT_RAWDATA); + } + if (TestResult_FW_CC == -1) { + if (ts->carrier_system) { + mp_result |= (!!TestResult_FW_CC_I << MP_RESULT_SHIFT_CC_I); + mp_result |= (!!TestResult_FW_CC_Q << MP_RESULT_SHIFT_CC_Q); + } else { + mp_result |= (!!TestResult_FW_CC << MP_RESULT_SHIFT_CC); + } + } + } + + /* noise */ + if (TestResult_Noise >= 0) + mp_result |= (!!TestResult_FW_DiffMax << MP_RESULT_SHIFT_DIFF_MAX); + else { + if (TestResult_FW_DiffMax == -1) { + mp_result |= (!!TestResult_FW_DiffMax << MP_RESULT_SHIFT_DIFF_MAX); + } + if (TestResult_FW_DiffMin == -1) { + mp_result |= (!!TestResult_FW_DiffMin << MP_RESULT_SHIFT_DIFF_MIN); + } + } + + nvt_mp_seq_printf(m, "%d", mp_result); +#endif nvt_mp_test_result_printed = 1; NVT_LOG("--\n"); @@ -1318,9 +1332,6 @@ 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; @@ -1339,35 +1350,11 @@ 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); -#endif /* #if NVT_TOUCH_ESD_PROTECT */ + nvt_esd_check_enable(false); +#endif - 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); - - nvt_mp_parse_dt(np, mpcriteria); - } else { - NVT_LOG("Not found novatek,mp-support-dt, use default setting\n"); - //---Print Test Criteria--- - nvt_print_criteria(); - } + nvt_print_criteria(); if (nvt_switch_FreqHopEnDis(FREQ_HOP_DISABLE)) { mutex_unlock(&ts->lock); @@ -1383,7 +1370,6 @@ 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"); @@ -1398,7 +1384,12 @@ static int32_t nvt_selftest_open(struct inode *inode, struct file *file) return -EAGAIN; } - //---FW Rawdata Test--- + if (nvt_get_fw_info()) { + mutex_unlock(&ts->lock); + NVT_ERR("get fw info failed!\n"); + return -EAGAIN; + } + if (nvt_read_baseline(RawData_FWMutual) != 0) { TestResult_FWMutual = 1; } else { @@ -1413,17 +1404,20 @@ static int32_t nvt_selftest_open(struct inode *inode, struct file *file) } } else { if (ts->carrier_system) { - 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); + 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); 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_SinglePoint_Sub(RawData_FW_CC, RecordResult_FW_CC, X_Channel, Y_Channel, - PS_Config_Lmt_FW_CC_P, PS_Config_Lmt_FW_CC_N); + 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); } } @@ -1436,24 +1430,23 @@ 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; // 1: ERROR + TestResult_Noise = 1; TestResult_FW_DiffMax = 1; TestResult_FW_DiffMin = 1; } else { - 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); + 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); - // for carrier sensing system, only positive noise data if (ts->carrier_system) { TestResult_FW_DiffMin = 0; } else { - 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); + 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); } if ((TestResult_FW_DiffMax == -1) || (TestResult_FW_DiffMin == -1)) @@ -1462,41 +1455,39 @@ 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; // 1:ERROR + TestResult_Short = 1; 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_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); + 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); if ((TestResult_Short_Diff == -1) || (TestResult_Short_Base == -1)) TestResult_Short = -1; else TestResult_Short = 0; } else { - 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); + 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); } } - //---Open Test--- if (nvt_read_fw_open(RawData_Open) != 0) { - TestResult_Open = 1; // 1:ERROR + TestResult_Open = 1; } 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); @@ -1516,6 +1507,132 @@ static const struct file_operations nvt_selftest_fops = { .release = seq_release, }; +#if NVT_TOUCH_MP_LENOVO +/******************************************************* +Description: + Novatek touchscreen /proc/NVTflash read function. + +return: + Executive outcomes. 2---succeed. -5,-14---failed. +*******************************************************/ +static ssize_t nvt_data_read(struct file *file, char __user *buff, size_t count, loff_t *offp) +{ + uint8_t *str; + int32_t ret = -1; + int32_t retries = 0; + int8_t i2c_wr = 0; + uint8_t i2c_addr = 0; + uint32_t data_len = 0; + + NVT_LOG("++\n"); + + if (count > (X_Channel * (Y_Channel + 4) * 2 + 7)) { + NVT_ERR("error count=%zu\n", count); + return -EFAULT; + } + + str = kmalloc(X_Channel * (Y_Channel + 4) * 2 + 7, GFP_KERNEL); + if (str == NULL) { + NVT_ERR("failed to allocated memory for input data\n"); + return -ENOMEM; + } + + if (copy_from_user(str, buff, count)) { + NVT_ERR("copy from user error\n"); + return -EFAULT; + } + +#if NVT_TOUCH_ESD_PROTECT + nvt_esd_check_enable(false); +#endif + + i2c_wr = str[0] >> 7; + i2c_addr = str[0] & 0x7F; + data_len = (int32_t)((str[1] << 8) + str[2]); + + if (i2c_wr == 0) { + return -ENOTSUPP; + } else if (i2c_wr == 1) { + while (retries < 20) { + ret = nvt_read_mass_data(i2c_addr, str, data_len); + if (ret == data_len) + break; + else + NVT_ERR("error, retries=%d, ret=%d, data_len=%d\n", retries, ret, data_len); + + retries++; + } + + if (retries < 20) { + ret = copy_to_user(buff, str, data_len); + if (ret) { + NVT_ERR("error, copy_to_user, ret=%d, data_len=%d\n", ret, data_len); + return -EFAULT; + } + } + + if (unlikely(retries == 20)) { + NVT_ERR("error, ret = %d\n", ret); + return -EIO; + } + } else { + NVT_ERR("Call error, str[0]=%d\n", str[0]); + return -EFAULT; + } + + kfree(str); + NVT_LOG("--\n"); + return ret; +} + +/******************************************************* +Description: + Novatek touchscreen /proc/NVTflash open function. + +return: + Executive outcomes. 0---succeed. -12---failed. +*******************************************************/ +static int32_t nvt_data_open(struct inode *inode, struct file *file) +{ + struct nvt_flash_data *dev; + + dev = kmalloc(sizeof(struct nvt_flash_data), GFP_KERNEL); + if (dev == NULL) { + NVT_ERR("Failed to allocate memory for nvt flash data\n"); + return -ENOMEM; + } + + rwlock_init(&dev->lock); + file->private_data = dev; + + return 0; +} + +/******************************************************* +Description: + Novatek touchscreen /proc/NVTflash close function. + +return: + Executive outcomes. 0---succeed. +*******************************************************/ +static int32_t nvt_data_close(struct inode *inode, struct file *file) +{ + struct nvt_flash_data *dev = file->private_data; + + if (dev) + kfree(dev); + + return 0; +} + +static const struct file_operations nvt_read_data_fops = { + .owner = THIS_MODULE, + .open = nvt_data_open, + .release = nvt_data_close, + .read = nvt_data_read, +}; +#endif + #ifdef CONFIG_OF /******************************************************* Description: @@ -1533,6 +1650,7 @@ 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); } else { @@ -1611,18 +1729,17 @@ void nvt_mp_parse_array(struct device_node *np, const char *name, int32_t *array printk("[NVT-ts] "); for (i = 0; i < X_Channel; i++) { iArrayIndex = j * X_Channel + i; - printk("%5d, ", array[iArrayIndex]); + printk("%d ", array[iArrayIndex]); } printk("\n"); } -#if TOUCH_KEY_NUM > 0 - printk("[NVT-ts] "); + for (i = 0; i < Key_Channel; i++) { iArrayIndex++; - printk("%5d, ", array[iArrayIndex]); + printk("%d ", array[iArrayIndex]); } + printk("\n"); -#endif #endif } } @@ -1650,19 +1767,13 @@ void nvt_mp_parse_dt(struct device_node *root, const char *node_compatible) break; } } - if (child == NULL) { - NVT_ERR("Not found compatible node %s, use default setting!\n", node_compatible); - return; - } /* MP Config*/ nvt_mp_parse_u32(np, "IC_X_CFG_SIZE", &IC_X_CFG_SIZE); nvt_mp_parse_u32(np, "IC_Y_CFG_SIZE", &IC_Y_CFG_SIZE); -#if TOUCH_KEY_NUM > 0 nvt_mp_parse_u32(np, "IC_KEY_CFG_SIZE", &IC_KEY_CFG_SIZE); -#endif nvt_mp_parse_u32(np, "X_Channel", &X_Channel); @@ -1677,25 +1788,29 @@ void nvt_mp_parse_dt(struct device_node *root, const char *node_compatible) #endif /* MP Criteria */ - if (ts->carrier_system) { - nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Diff_P", PS_Config_Lmt_Short_Diff_P, - X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_u32(np, "PS_Config_Lmt_Short_Rawdata_P", &PS_Config_Lmt_Short_Rawdata_P); - nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Diff_N", PS_Config_Lmt_Short_Diff_N, - X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_u32(np, "PS_Config_Lmt_Short_Rawdata_N", &PS_Config_Lmt_Short_Rawdata_N); - nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Base_P", PS_Config_Lmt_Short_Base_P, - X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_Short_Rawdata_P", &PS_Config_Lmt_Key_Short_Rawdata_P); - nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Base_N", PS_Config_Lmt_Short_Base_N, - X_Channel * Y_Channel + Key_Channel); - } else { - nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Rawdata_P", PS_Config_Lmt_Short_Rawdata_P, - X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_Short_Rawdata_N", &PS_Config_Lmt_Key_Short_Rawdata_N); - nvt_mp_parse_array(np, "PS_Config_Lmt_Short_Rawdata_N", PS_Config_Lmt_Short_Rawdata_N, - X_Channel * Y_Channel + Key_Channel); - } + nvt_mp_parse_u32(np, "PS_Config_Lmt_Short_Diff_P", &PS_Config_Lmt_Short_Diff_P); + + nvt_mp_parse_u32(np, "PS_Config_Lmt_Short_Diff_N", &PS_Config_Lmt_Short_Diff_N); + + nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_Short_Diff_P", &PS_Config_Lmt_Key_Short_Diff_P); + + nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_Short_Diff_N", &PS_Config_Lmt_Key_Short_Diff_N); + + nvt_mp_parse_u32(np, "PS_Config_Lmt_Short_Base_P", &PS_Config_Lmt_Short_Base_P); + + nvt_mp_parse_u32(np, "PS_Config_Lmt_Short_Base_N", &PS_Config_Lmt_Short_Base_N); + + nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_Short_Base_P", &PS_Config_Lmt_Key_Short_Base_P); + + nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_Short_Base_N", &PS_Config_Lmt_Key_Short_Base_N); nvt_mp_parse_array(np, "PS_Config_Lmt_Open_Rawdata_P", PS_Config_Lmt_Open_Rawdata_P, X_Channel * Y_Channel + Key_Channel); @@ -1709,37 +1824,39 @@ void nvt_mp_parse_dt(struct device_node *root, const char *node_compatible) nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Rawdata_N", PS_Config_Lmt_FW_Rawdata_N, X_Channel * Y_Channel + Key_Channel); - nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_P", PS_Config_Lmt_FW_CC_P, - X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_u32(np, "PS_Config_Lmt_FW_CC_P", &PS_Config_Lmt_FW_CC_P); - nvt_mp_parse_array(np, "PS_Config_Lmt_FW_CC_N", PS_Config_Lmt_FW_CC_N, - X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_u32(np, "PS_Config_Lmt_FW_CC_N", &PS_Config_Lmt_FW_CC_N); - if (ts->carrier_system) { - 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); + nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_FW_CC_P", &PS_Config_Lmt_Key_FW_CC_P); - 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); + nvt_mp_parse_u32(np, "PS_Config_Lmt_Key_FW_CC_N", &PS_Config_Lmt_Key_FW_CC_N); - 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); + nvt_mp_parse_u32(np, "PS_Config_Lmt_FW_CC_I_P", &PS_Config_Lmt_FW_CC_I_P); - 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); - } + nvt_mp_parse_u32(np, "PS_Config_Lmt_FW_CC_I_N", &PS_Config_Lmt_FW_CC_I_N); - nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Diff_P", PS_Config_Lmt_FW_Diff_P, - X_Channel * Y_Channel + Key_Channel); + nvt_mp_parse_u32(np, "PS_Config_Lmt_FW_CC_Q_P", &PS_Config_Lmt_FW_CC_Q_P); - nvt_mp_parse_array(np, "PS_Config_Lmt_FW_Diff_N", PS_Config_Lmt_FW_Diff_N, - X_Channel * Y_Channel + Key_Channel); + 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); NVT_LOG("Parse mp criteria done!\n"); } -#endif /* #ifdef CONFIG_OF */ +#endif /******************************************************* Description: @@ -1751,19 +1868,53 @@ 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"); - return -EPERM; + ret = -1; } else { if (nvt_mp_buffer_init()) { NVT_ERR("Allocate mp memory failed\n"); - return -EPERM; + ret = -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"); } - return 0; + ret = 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"); + } + } +#endif + return ret; } #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 ed068d741d48..0ce674b40362 100644 --- a/drivers/input/touchscreen/nova_mmi/nt36xxx_mp_ctrlram.h +++ b/drivers/input/touchscreen/nova_mmi/nt36xxx_mp_ctrlram.h @@ -1,8 +1,8 @@ /* * Copyright (C) 2010 - 2017 Novatek, Inc. * - * $Revision: 19587 $ - * $Date: 2017-11-28 21:00:30 +0800 (Tue, 28 Nov 2017) $ + * $Revision: 14590 $ + * $Date: 2017-07-20 11:14:42 +0800 (周四, 20 七月 2017) $ * * 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 @@ -30,345 +30,130 @@ static uint8_t AIN_Y[40] = {31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 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[40 * 40] = { - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, - 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, 20000, -#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] = { - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, - 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, 11550, -#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, -#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, -#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, -#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, -#if TOUCH_KEY_NUM > 0 - -2000, -2000, -2000, -#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_Open_Rawdata_P[40 * 40] = { - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, - 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, 13000, + 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, #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] = { - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, - 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, 6500, + 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, #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] = { - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, - 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, 800, #if TOUCH_KEY_NUM > 0 - 2000, 2000, 2000, + 800, 800, 800, #endif /* #if TOUCH_KEY_NUM > 0 */ }; @@ -410,309 +195,23 @@ static int32_t PS_Config_Lmt_FW_Rawdata_N[40 * 40] = { #endif /* #if TOUCH_KEY_NUM > 0 */ }; -static int32_t PS_Config_Lmt_FW_CC_P[40 * 40] = { - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, -#if TOUCH_KEY_NUM > 0 - 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] = { - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, -#if TOUCH_KEY_NUM > 0 - 9, 9, 9, -#endif /* #if TOUCH_KEY_NUM > 0 */ -}; - -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, -#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, -#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, -#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, -#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] = { - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, -#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] = { - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, - -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -35, -#if TOUCH_KEY_NUM > 0 - -35, -35, -35, -#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_Diff_Test_Frame = 50;