--- /dev/null
+/*\r
+ * Copyright (c) @CompanyNameMagicTag 2021-2022. All rights reserved.\r
+ * Description: cst92xx touch driver.\r
+ * Author: @CompanyNameTag\r
+ * Create: 2022-04-12\r
+ */\r
+\r
+#include "cst92xx_ctrl.h"\r
+#include "securec.h"\r
+#include "cmsis_os2.h"\r
+#include "soc_osal.h"\r
+#include "common_def.h"\r
+#include "pinctrl.h"\r
+#include "chip_io.h"\r
+#include "tcxo.h"\r
+#include "time.h"\r
+#include "i2c.h"\r
+#include "gpio.h"\r
+#include "hal_gpio.h"\r
+#include "hal_i2c.h"\r
+#include "touch_screen_def.h"\r
+\r
+bool g_host_dev_init_flag = TD_FALSE;\r
+cst92xx_ctrl_attr g_ctrl_attr;\r
+touch_callback g_cst92xx_callback = NULL;\r
+static uint8_t g_tp_send_buf[CST92XX_REG_WRITE_LEN] = {0};\r
+static uint8_t g_tp_recv_buf[CST92XX_INPUT_SIZE] = {0};\r
+\r
+static void cst92xx_gpio_isr_handle(pin_t pin, uintptr_t param)\r
+{\r
+ unused(pin);\r
+ unused(param);\r
+ if (g_cst92xx_callback != NULL) {\r
+ g_cst92xx_callback();\r
+ }\r
+}\r
+\r
+ext_errno cst92xx_register_handle(const cst92xx_ctrl_ops *peri_data, touch_callback func)\r
+{\r
+ unused(peri_data);\r
+ ext_errno ret;\r
+\r
+ g_cst92xx_callback = func;\r
+ /* register int io interrupt handler */\r
+ uapi_gpio_init();\r
+ gpio_select_core(CST92XX_INT_GPIO, CORE);\r
+ uapi_gpio_set_dir(CST92XX_INT_GPIO, GPIO_DIRECTION_INPUT);\r
+ ret = uapi_gpio_register_isr_func(CST92XX_INT_GPIO, GPIO_INTERRUPT_FALLING_EDGE, cst92xx_gpio_isr_handle);\r
+ if (ret != 0) {\r
+ tp_err("cst92xx int callback register fail! ret=0x%x", ret);\r
+ return ret;\r
+ }\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno cst92xx_unregister_handle(const cst92xx_ctrl_ops *peri_data)\r
+{\r
+ unused(peri_data);\r
+ ext_errno ret;\r
+\r
+ /* unregister interrupt handler */\r
+ uapi_gpio_unregister_isr_func(CST92XX_INT_GPIO);\r
+ g_cst92xx_callback = NULL;\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static ext_errno tp_peripheral_init_status_check(void)\r
+{\r
+ if (g_host_dev_init_flag != TD_TRUE) {\r
+ return EXT_ERR_TP_DEV_INFO_NOT_REGISTER;\r
+ }\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+// static ext_errno cst92xx_ctrl_attr_check(const cst92xx_ctrl_attr *device_attr)\r
+// {\r
+// unused(device_attr);\r
+// return EXT_ERR_SUCCESS;\r
+// }\r
+\r
+static ext_errno cst92xx_tp_i2c_rd_wr_param_check(const uint8_t *data_buf, uint32_t data_len)\r
+{\r
+ unused(data_buf);\r
+ unused(data_len);\r
+ ext_errno ret = tp_peripheral_init_status_check();\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ return ret;\r
+ }\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno cst92xx_tp_i2c_data_read(uint32_t reg_addr, uint8_t reg_len, uint8_t *data_buf, uint32_t data_len)\r
+{\r
+ errcode_t ret;\r
+ uint32_t retry;\r
+ i2c_data_t data = {0};\r
+\r
+ uint8_t reg_addr_buf[4] = {0};\r
+\r
+ ret = cst92xx_tp_i2c_rd_wr_param_check(data_buf, data_len);\r
+ if (ret != 0) {\r
+ tp_err("tp data read param invalid! ret=0x%x", ret);\r
+ return ret;\r
+ }\r
+\r
+ if (memset_s(g_tp_recv_buf, data_len, 0, data_len) != EOK) {\r
+ tp_err("tp read buff set fail!");\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+\r
+ // printf("reg_addr : 0x%x\n",reg_addr);\r
+ // for(int i = 0; i < reg_len; i++)\r
+ // {\r
+ // data.send_buf[i] = ((uint8_t*)®_addr)[i];\r
+ // }\r
+\r
+ uint8_t reg_buf[4] = {0};\r
+\r
+ switch (reg_len) {\r
+ case 1: \r
+ reg_buf[0] = reg_addr & 0xFF;\r
+ break;\r
+ case 2: \r
+ reg_buf[0] = (reg_addr >> 8) & 0xFF;\r
+ reg_buf[1] = reg_addr & 0xFF;\r
+ break;\r
+ case 3:\r
+ reg_buf[0] = (reg_addr >> 16) & 0xFF;\r
+ reg_buf[1] = (reg_addr >> 8) & 0xFF;\r
+ reg_buf[2] = reg_addr & 0xFF;\r
+ break;\r
+ case 4:\r
+ reg_buf[0] = (reg_addr >> 24) & 0xFF;\r
+ reg_buf[1] = (reg_addr >> 16) & 0xFF;\r
+ reg_buf[2] = (reg_addr >> 8) & 0xFF;\r
+ reg_buf[3] = reg_addr & 0xFF;\r
+ break;\r
+ default:\r
+ return EXT_ERR_INVALID_PARAM;\r
+ }\r
+\r
+\r
+ data.send_buf = reg_buf;\r
+ data.send_len = reg_len;\r
+ data.receive_buf = g_tp_recv_buf;\r
+ data.receive_len = data_len;\r
+\r
+ // printf("send_buf[0]:[%x] send_buf[1]:[%x] send_buf[2]:[%x] send_buf[3]:[%x]\n",data.send_buf[0],data.send_buf[1],data.send_buf[2],data.send_buf[3]);\r
+\r
+ for (retry = 0; retry < CST92XX_I2C_TIME_MAX; retry++) {\r
+ ret = uapi_i2c_master_writeread(CST92XX_I2C_BUS, CST92XX_I2C_ADDR, &data);\r
+ if (ret == EXT_ERR_SUCCESS) {\r
+ break;\r
+ }\r
+ }\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("tp data read fail! ret=0x%x", ret);\r
+ return ret;\r
+ }\r
+\r
+ ret = (uint32_t)memcpy_s(data_buf, data_len, g_tp_recv_buf, data_len);\r
+ if (ret != EOK) {\r
+ tp_err("tp data buf content copy fail! ret=0x%x", ret);\r
+ return ret;\r
+ }\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno cst92xx_tp_i2c_cmd_write(uint16_t cmd)\r
+{\r
+ errcode_t ret;\r
+ uint32_t retry;\r
+ i2c_data_t data;\r
+\r
+ ret = tp_peripheral_init_status_check();\r
+ if (ret != 0) {\r
+ tp_err("host peripheral not init! ret=0x%x", ret);\r
+ return ret;\r
+ }\r
+ g_tp_send_buf[CST92XX_I2C_SEND_INDEX0] = cmd & 0xff;\r
+ data.send_buf = g_tp_send_buf;\r
+ data.send_len = CST92XX_CMD_SEND_LEN;\r
+ data.receive_buf = NULL;\r
+ data.receive_len = 0;\r
+\r
+ for (retry = 0; retry < CST92XX_I2C_TIME_MAX; retry++) {\r
+ ret = uapi_i2c_master_write(CST92XX_I2C_BUS, CST92XX_I2C_ADDR, &data);\r
+ if (ret == EXT_ERR_SUCCESS) {\r
+ break;\r
+ }\r
+ }\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("tp data write fail! ret=0x%x", ret);\r
+ return ret;\r
+ }\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno cst92xx_tp_i2c_reg_write(uint16_t reg_addr, uint16_t reg_cfg)\r
+{\r
+ errcode_t ret;\r
+ uint32_t retry;\r
+ i2c_data_t data;\r
+\r
+ ret = tp_peripheral_init_status_check();\r
+ if (ret != 0) {\r
+ tp_err("host peripheral not init! ret=0x%x", ret);\r
+ return ret;\r
+ }\r
+\r
+ g_tp_send_buf[CST92XX_I2C_SEND_INDEX0] = reg_addr & 0xff;\r
+ g_tp_send_buf[1] = reg_cfg & 0xff;\r
+ \r
+ data.send_buf = g_tp_send_buf;\r
+ data.send_len = CST92XX_REG_WRITE_LEN;\r
+ data.receive_buf = NULL;\r
+ data.receive_len = 0;\r
+\r
+ for (retry = 0; retry < CST92XX_I2C_TIME_MAX; retry++) {\r
+ ret = uapi_i2c_master_write(CST92XX_I2C_BUS, CST92XX_I2C_ADDR, &data);\r
+ if (ret == EXT_ERR_SUCCESS) {\r
+ break;\r
+ }\r
+ }\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("tp reg write fail! ret=0x%x", ret);\r
+ return ret;\r
+ }\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno cst92xx_tp_i2c_data_write(uint8_t *data_buf, uint32_t data_len)\r
+{\r
+ errcode_t ret;\r
+ uint32_t retry;\r
+ i2c_data_t data;\r
+ uint8_t *write_data = NULL;\r
+ uint32_t send_len;\r
+\r
+ ret = cst92xx_tp_i2c_rd_wr_param_check(data_buf, data_len);\r
+ if (ret != 0) {\r
+ tp_err("tp data write param invalid! ret=0x%x", ret);\r
+ return ret;\r
+ }\r
+\r
+ send_len = data_len;\r
+\r
+ write_data = (uint8_t *)osal_kmalloc(send_len, OSAL_GFP_KERNEL);\r
+ if (write_data == NULL) {\r
+ tp_err("tp send buff malloc fail!");\r
+ return EXT_ERR_MALLOC_FAILURE;\r
+ }\r
+\r
+ ret = (uint32_t)memcpy_s(write_data, send_len , data_buf, data_len);\r
+ if (ret != EOK) {\r
+ tp_err("tp send_buf content copy fail! ret=0x%x", ret);\r
+ osal_kfree(write_data);\r
+ return ret;\r
+ }\r
+\r
+ data.send_buf = write_data;\r
+ data.send_len = send_len;\r
+ data.receive_buf = NULL;\r
+ data.receive_len = 0;\r
+\r
+ for (retry = 0; retry < CST92XX_I2C_TIME_MAX; retry++) {\r
+ ret = uapi_i2c_master_write(CST92XX_I2C_BUS, CST92XX_I2C_ADDR, &data);\r
+ if (ret == EXT_ERR_SUCCESS) {\r
+ break;\r
+ }\r
+ }\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("tp data write fail! ret=0x%x", ret);\r
+ osal_kfree(write_data);\r
+ return ret;\r
+ }\r
+\r
+ osal_kfree(write_data);\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno cst92xx_host_peripheral_init(cst92xx_ctrl_attr *attr)\r
+{\r
+ ext_errno ret;\r
+\r
+ if (attr == NULL) {\r
+ tp_err("cst92xx communication interface cfg is empty!");\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+ // ret = cst92xx_ctrl_attr_check(attr);\r
+ // if (ret != EXT_ERR_SUCCESS) {\r
+ // tp_err("tp invalid dev attr! ret=0x%x", ret);\r
+ // return ret;\r
+ // }\r
+\r
+ // ret = (ext_errno)memcpy_s(&(g_ctrl_attr), sizeof(cst92xx_ctrl_attr), attr, sizeof(cst92xx_ctrl_attr));\r
+ // if (ret != EOK) {\r
+ // tp_err("tp attr content copy fail! ret=0x%x", ret);\r
+ // return ret;\r
+ // }\r
+\r
+ /* init i2c */\r
+ errcode_t result;\r
+ result = uapi_i2c_master_init(CST92XX_I2C_BUS, 100000, I2C_SPEED_MODE_SS); /* 400000: 400KHz */\r
+ if (result != EXT_ERR_SUCCESS) {\r
+ tp_err("tp i2c init fail! ret=0x%x", result);\r
+ return EXT_ERR_SUCCESS;\r
+ }\r
+\r
+ tp_warning("TOUCH:i2c_id = %d i2c_speed = %d slave_addr = 0x%x \r\n",\r
+ CST92XX_I2C_BUS, 100000, CST92XX_I2C_ADDR);\r
+ g_host_dev_init_flag = true;\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno cst92xx_host_init_sample(void)\r
+{\r
+ ext_errno ret;\r
+ tp_warning("cst92xx_host_init_sample");\r
+ ret = cst92xx_host_peripheral_init(&g_ctrl_attr);\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("tp host init fail! ret=0x%x", ret);\r
+ return ret;\r
+ }\r
+ ret = cst92xx_init(NULL);\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("tp init fail! ret=0x%x", ret);\r
+ return ret;\r
+ }\r
+ \r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno cst92xx_reset(void)\r
+{\r
+ uapi_gpio_set_dir(CST92XX_RESET_GPIO, GPIO_DIRECTION_OUTPUT);\r
+ /* Config Gpio For Reset Pin */\r
+ // uapi_gpio_set_val(CST92XX_RESET_GPIO, GPIO_LEVEL_HIGH);\r
+ // /* reset high delay 20ms */\r
+ // osDelay(1);\r
+ uapi_gpio_set_val(CST92XX_RESET_GPIO, GPIO_LEVEL_LOW);\r
+ /* reset low delay 100ms */\r
+ osDelay(8);\r
+ uapi_gpio_set_val(CST92XX_RESET_GPIO, GPIO_LEVEL_HIGH);\r
+ /* reset high delay 200ms */\r
+ // osDelay(100);\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+void cst92xx_resume_reset(void)\r
+{\r
+ uapi_gpio_set_dir(CST92XX_RESET_GPIO, GPIO_DIRECTION_OUTPUT);\r
+ /* drvdata is global variable point and no need to handle null */\r
+ uapi_gpio_set_val(CST92XX_RESET_GPIO, GPIO_LEVEL_HIGH);\r
+ osDelay(1);\r
+ uapi_gpio_set_val(CST92XX_RESET_GPIO, GPIO_LEVEL_LOW);\r
+ /* delay 10ms */\r
+ osDelay(10);\r
+ uapi_gpio_set_val(CST92XX_RESET_GPIO, GPIO_LEVEL_HIGH);\r
+ /* delay 100ms */\r
+ osDelay(100);\r
+ // uapi_gpio_set_dir(CST92XX_RESET_GPIO, GPIO_DIRECTION_INPUT);\r
+}
\ No newline at end of file
--- /dev/null
+#include "cst92xx_touch1.h"\r
+#include "time.h"\r
+#include "soc_osal.h"\r
+#include "osal_timer.h"\r
+#include "osal_mutex.h"\r
+#include "securec.h"\r
+#include "cst92xx_ctrl.h"\r
+#include "tcxo.h"\r
+#include "cmsis_os2.h"\r
+#include "common_def.h"\r
+#include "hal_gpio.h"\r
+\r
+#define CST92XX_I2C_BUS I2C_BUS_1\r
+\r
+\r
+#define BOOT_I2C_ADDR (0x5A)\r
+#define MAIN_I2C_ADDR (0x5A)\r
+#define RW_REG_LEN (2)\r
+\r
+#define MAX_FINGER (2)\r
+\r
+#define CST92XX_BIN_SIZE (0x7F80)\r
+\r
+#define HYNITRON_PROGRAM_PAGE_SIZE (128)\r
+\r
+#ifdef BOARD_FD272\r
+#define LCD_VDD_EN S_AGPIO_L18\r
+#endif\r
+\r
+static uint32_t point_count=0;\r
+\r
+static struct hyn_ts_data *hyn_92xxdata = NULL;\r
+\r
+static int hyn_wr_reg(struct hyn_ts_data *hyn_92xxdata, uint32_t reg_addr, uint8_t reg_len, uint8_t *rbuf, uint16_t rlen);\r
+static int hyn_write_data(struct hyn_ts_data *hyn_92xxdata,uint8_t *buf, uint8_t reg_len, uint16_t len);\r
+// static void cst92xx_reset(void);\r
+static void hyn_set_i2c_addr(struct hyn_ts_data *ts_data,uint8_t addr);\r
+static void hyn_delay_ms(int cnt);\r
+static int cst92xx_updata_judge(uint8_t *p_fw, uint16_t len);\r
+static uint32_t cst92xx_read_checksum(void);\r
+static int cst92xx_updata_tpinfo(void);\r
+static int cst92xx_enter_boot(void);\r
+\r
+\r
+static int cst92xx_report(void);\r
+\r
+static void hyn_irq_set(struct hyn_ts_data *hyn_92xxdata,bool cmd)\r
+{\r
+ uapi_pin_set_ie(CST92XX_INT_GPIO,cmd);\r
+}\r
+\r
+static void hyn_set_i2c_addr(struct hyn_ts_data *ts_data,uint8_t addr)\r
+{\r
+ ts_data->salve_addr = addr;\r
+}\r
+\r
+static void hyn_delay_ms(int cnt)\r
+{\r
+ LOS_Mdelay(cnt);\r
+}\r
+\r
+static int hyn_write_data(struct hyn_ts_data *hyn_92xxdata,uint8_t *buf, uint8_t reg_len, uint16_t len)\r
+{\r
+ cst92xx_tp_i2c_data_write(buf,reg_len+len);\r
+\r
+ return 0;\r
+}\r
+\r
+static int hyn_wr_reg(struct hyn_ts_data *hyn_92xxdata, uint32_t reg_addr, uint8_t reg_len, uint8_t *rbuf, uint16_t rlen)\r
+{\r
+ cst92xx_tp_i2c_data_read(reg_addr,reg_len,rbuf,rlen);\r
+ return 0;\r
+}\r
+\r
+// cst92xx_drv_data g_cst92xx_drv = {\r
+// .chip_status = CST92XX_NOT_READY,\r
+// .ops_mux = {0},\r
+// .int_mask = CST92XX_INT_MASK,\r
+// .work_status = CST92XX_WORK_INVALID,\r
+// .fw_upgrade_flag = TD_FALSE,\r
+// .gesture_wakeup = TD_FALSE,\r
+// .host_dev_init_flag = TD_FALSE,\r
+// .chip_info = CST92XX_DEVICE_INFO,\r
+// .p_void = NULL,\r
+// };\r
+\r
+\r
+ext_errno cst92xx_irq_callback(uint8_t *data_buf, uint8_t data_len)\r
+{\r
+ unused(data_len);\r
+ ext_errno ret;\r
+ int32_t mem_ret;\r
+ uint16_t reg_write;\r
+\r
+ if(hyn_92xxdata == NULL)\r
+ {\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+\r
+ if (hyn_92xxdata->power_is_on != 1) {\r
+ tp_warning("TOUCH: not ready skip read");\r
+ return EXT_ERR_SUCCESS;\r
+ }\r
+\r
+ hyn_92xxdata->rp_buf.pos_info->event = MC_TP_INVALID;\r
+\r
+\r
+ if (hyn_92xxdata->work_mode == NOMAL_MODE) {\r
+ hyn_92xxdata->irq_cnt++;\r
+ ret = cst92xx_report();\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ cst92xx_reset();\r
+ tp_err("TOUCH: parse input fail, ret = 0x%x", ret);\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+ }\r
+\r
+ mem_ret = memcpy_s(data_buf, sizeof(input_event_info), &(hyn_92xxdata->touch_msg), sizeof(input_event_info));\r
+ if (mem_ret != EOK) {\r
+ tp_err("TOUCH:mem cpy error, ret = 0x%x", mem_ret);\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+// static ext_errno cst92xx_configuration(void)\r
+// {\r
+// ext_errno ret;\r
+// uint16_t reg_read;\r
+ \r
+// tp_print("ctp_cst0_init enter ");\r
+\r
+// /* Read Firmware Version */\r
+// reg_read = 0;\r
+// ret = cst92xx_tp_i2c_data_read(CST92XX_FIRMWARE_VERSION, (uint8_t *)®_read, 1);\r
+// if (ret != EXT_ERR_SUCCESS) {\r
+// return EXT_ERR_FAILURE;\r
+// }\r
+// g_cst92xx_drv.firmware_version = reg_read;\r
+\r
+// /* Read Minor Firmware Version */\r
+// reg_read = 0;\r
+// ret = cst92xx_tp_i2c_data_read(CST92XX_FACTORY_ID, (uint8_t *)®_read, 1);\r
+// if (ret != EXT_ERR_SUCCESS) {\r
+// return EXT_ERR_FAILURE;\r
+// }\r
+// g_cst92xx_drv.vendor_id = reg_read;\r
+\r
+// /* Read Hw ID */\r
+// reg_read = 0;\r
+// ret = cst92xx_tp_i2c_data_read(CST92XX_HW_ID, (uint8_t *)®_read, 1);\r
+// if (ret != EXT_ERR_SUCCESS) {\r
+// tp_err("configuration error (read chip id) 0x%x", ret);\r
+// return EXT_ERR_FAILURE;\r
+// }\r
+// g_cst92xx_drv.chip_id = reg_read;\r
+// tp_print("chip_id = 0x%x FW_ver = 0x%x factory_id = 0x%x",\r
+// g_cst92xx_drv.chip_id,\r
+// g_cst92xx_drv.firmware_version,\r
+// g_cst92xx_drv.vendor_id);\r
+\r
+// return EXT_ERR_SUCCESS;\r
+// }\r
+\r
+#if HYN_POWER_ON_UPDATA\r
+#include "cst92xx_fw.h"\r
+int cst92xx_init(struct hyn_ts_data* ts_data)\r
+{\r
+ int ret = 0;\r
+ HYN_ENTER();\r
+ hyn_92xxdata = ts_data;\r
+ hyn_set_i2c_addr(hyn_92xxdata,MAIN_I2C_ADDR);\r
+ cst92xx_reset();\r
+ msleep(40);\r
+ ret = cst92xx_updata_tpinfo();\r
+ if(ret == FALSE){\r
+ HYN_INFO("cst92xx_updata_tpinfo failed");\r
+ hyn_92xxdata->work_mode=ENTER_BOOT_MODE;\r
+ ret = cst92xx_enter_boot();\r
+ if(ret){\r
+ HYN_ERROR("cst92xx_ic check failed\r\n");\r
+ return FALSE;\r
+ }\r
+ cst92xx_reset();\r
+ }\r
+ hyn_92xxdata->fw_updata_addr = (uint8_t*)fw_bin;\r
+ hyn_92xxdata->fw_updata_len = CST92XX_BIN_SIZE;\r
+ hyn_92xxdata->need_updata_fw = cst92xx_updata_judge((uint8_t*)fw_bin,CST92XX_BIN_SIZE);\r
+ HYN_INFO("cst92xx_init done !!!");\r
+ return TRUE;\r
+}\r
+#else\r
+int cst92xx_init(struct hyn_ts_data* ts_data)\r
+{\r
+ if(hyn_92xxdata == NULL)\r
+ hyn_92xxdata = (struct hyn_ts_data*)malloc(sizeof(struct hyn_ts_data));\r
+\r
+ if(hyn_92xxdata == NULL)\r
+ {\r
+ printf("hyn_92xxdata malloc failed, tp init failed\n ");\r
+ return -1;\r
+ }\r
+\r
+#ifdef BOARD_FD272\r
+ uapi_gpio_set_dir(LCD_VDD_EN, GPIO_DIRECTION_OUTPUT);\r
+\r
+ uapi_gpio_set_val(LCD_VDD_EN, GPIO_LEVEL_HIGH);\r
+ uapi_tcxo_delay_ms(10); /* delay 10 ms */\r
+#endif\r
+\r
+ int ret = 0;\r
+ HYN_ENTER();\r
+\r
+ cst92xx_reset();\r
+\r
+ hyn_delay_ms(40);\r
+\r
+ ret = cst92xx_updata_tpinfo();\r
+ if(ret == FALSE){\r
+ HYN_INFO("cst92xx_updata_tpinfo failed");\r
+ }\r
+ ret |= cst92xx_set_workmode(NOMAL_MODE,0);\r
+\r
+ hyn_92xxdata->power_is_on = 1;\r
+\r
+ return ret;\r
+}\r
+#endif\r
+\r
+static int cst92xx_enter_boot(void)\r
+{\r
+ if(hyn_92xxdata == NULL)\r
+ {\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+\r
+ int ok = FALSE,t,retry = 3;\r
+ uint8_t i2c_buf[4] = {0};\r
+ hyn_set_i2c_addr(hyn_92xxdata,BOOT_I2C_ADDR);\r
+ for (t = 10;; t += 2)\r
+ {\r
+ if(t >= 30 || retry==0){\r
+ return FALSE;\r
+ }\r
+\r
+ // cst92xx_reset();\r
+ cst92xx_reset();\r
+ hyn_delay_ms(t);\r
+\r
+ ok = hyn_wr_reg(hyn_92xxdata, 0xA001AA, 3, i2c_buf, 2);\r
+ if(ok == FALSE || (i2c_buf[0]==0x5A && i2c_buf[1]==0x5A)){\r
+ if(ok==TRUE && retry){\r
+ retry--;\r
+ t = 10;\r
+ }\r
+ continue;\r
+ }\r
+ hyn_delay_ms(1);\r
+ ok = hyn_wr_reg(hyn_92xxdata, 0xA002, 2, i2c_buf, 2);\r
+ if(ok == FALSE){\r
+ continue;\r
+ }\r
+ if ((i2c_buf[0] == 0x55) && (i2c_buf[1] == 0xB0)) {\r
+ break;\r
+ }\r
+ }\r
+ ok = hyn_wr_reg(hyn_92xxdata, 0xA00100, 3, i2c_buf, 2);\r
+ if(ok == FALSE){\r
+ return FALSE;\r
+ }\r
+ return TRUE;\r
+}\r
+\r
+static int erase_all_mem(void)\r
+{\r
+ if(hyn_92xxdata == NULL)\r
+ {\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+\r
+ int ok = FALSE,t;\r
+ uint8_t i2c_buf[8];\r
+\r
+ //erase_all_mem\r
+ ok = hyn_wr_reg(hyn_92xxdata, 0xA0140000, 4, i2c_buf, 2);\r
+ if (ok == FALSE){\r
+ return FALSE;\r
+ }\r
+ ok = hyn_wr_reg(hyn_92xxdata, 0xA00C807F, 4, i2c_buf, 2);\r
+ if (ok == FALSE){\r
+ return FALSE;\r
+ }\r
+ ok = hyn_wr_reg(hyn_92xxdata, 0xA004EC, 3, i2c_buf, 2);\r
+ if (ok == FALSE){\r
+ return FALSE;\r
+ }\r
+ \r
+ hyn_delay_ms(300);\r
+ for (t = 0;; t += 10) {\r
+ if (t >= 1000) {\r
+ return FALSE;\r
+ }\r
+\r
+ hyn_delay_ms(10);\r
+\r
+ ok = hyn_wr_reg(hyn_92xxdata, 0xA005, 2, i2c_buf, 1);\r
+ if (ok == FALSE) {\r
+ continue;\r
+ }\r
+\r
+ if (i2c_buf[0] == 0x88) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ return TRUE;\r
+}\r
+\r
+\r
+static int write_mem_page(uint16_t addr, uint8_t *buf, uint16_t len)\r
+{\r
+ int ok = FALSE,t;\r
+ uint8_t i2c_buf[1024+2] = {0};\r
+\r
+ i2c_buf[0] = 0xA0;\r
+ i2c_buf[1] = 0x0C;\r
+ i2c_buf[2] = len;\r
+ i2c_buf[3] = len >> 8;\r
+ //ok = hyn_i2c_write_r16(HYN_BOOT_I2C_ADDR, 0xA00C, i2c_buf, 2);\r
+ ok = hyn_write_data(hyn_92xxdata, i2c_buf,RW_REG_LEN, 4);\r
+ if(ok == FALSE){\r
+ return FALSE;\r
+ }\r
+\r
+\r
+ i2c_buf[0] = 0xA0;\r
+ i2c_buf[1] = 0x14;\r
+ i2c_buf[2] = addr;\r
+ i2c_buf[3] = addr >> 8;\r
+ ok = hyn_write_data(hyn_92xxdata, i2c_buf,RW_REG_LEN, 4);\r
+ if(ok == FALSE) {\r
+ return FALSE;\r
+ }\r
+\r
+\r
+ i2c_buf[0] = 0xA0;\r
+ i2c_buf[1] = 0x18;\r
+ memcpy(i2c_buf + 2, buf, len); \r
+ ok = hyn_write_data(hyn_92xxdata, i2c_buf,RW_REG_LEN, len+2);\r
+ if(ok == FALSE){\r
+ return FALSE;\r
+ }\r
+\r
+\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xA004EE,3,i2c_buf,2);\r
+ if(ok == FALSE){\r
+ return FALSE;\r
+ }\r
+\r
+ for (t = 0;; t += 10) {\r
+ if (t >= 1000) {\r
+ return FALSE;\r
+ }\r
+\r
+ hyn_delay_ms(5);\r
+\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xA005,2,i2c_buf,1);\r
+ if(ok == FALSE){\r
+ continue;\r
+ } \r
+\r
+ if (i2c_buf[0] == 0x55) {\r
+ break;\r
+ }\r
+ }\r
+\r
+ return TRUE;\r
+}\r
+\r
+\r
+static int write_code(uint8_t *bin_addr,uint8_t retry)\r
+{\r
+ uint8_t data[HYNITRON_PROGRAM_PAGE_SIZE+4];//= (uint8_t *)bin_addr;\r
+ uint16_t addr = 0;\r
+ uint16_t remain_len = CST92XX_BIN_SIZE;\r
+ int ret;\r
+ \r
+ while (remain_len > 0) {\r
+ uint16_t cur_len = remain_len;\r
+ if (cur_len > HYNITRON_PROGRAM_PAGE_SIZE) {\r
+ cur_len = HYNITRON_PROGRAM_PAGE_SIZE;\r
+ }\r
+ \r
+ if(0 == hyn_92xxdata->fw_file_name[0]){\r
+ memcpy(data, bin_addr + addr, HYNITRON_PROGRAM_PAGE_SIZE);\r
+ }else{\r
+ ret = copy_for_updata(hyn_92xxdata,data,addr,HYNITRON_PROGRAM_PAGE_SIZE);\r
+ if(ret == FALSE){\r
+ HYN_ERROR("copy_for_updata error");\r
+ return FALSE; \r
+ }\r
+ }\r
+ //HYN_INFO("write_code addr 0x%x 0x%x",addr,*data);\r
+ if (write_mem_page(addr, data, cur_len) == FALSE) {\r
+ return FALSE;\r
+ }\r
+ //data += cur_len;\r
+ addr += cur_len;\r
+ remain_len -= cur_len;\r
+ }\r
+ return TRUE;\r
+}\r
+\r
+\r
+static uint32_t cst92xx_read_checksum(void)\r
+{\r
+ int ok = FALSE;\r
+ uint8_t i2c_buf[4] = {0};\r
+ uint32_t chip_checksum = 0;\r
+ uint8_t retry = 5;\r
+ \r
+ ok = hyn_wr_reg(hyn_92xxdata,0xA00300,3,i2c_buf,2);\r
+ if (ok == FALSE) {\r
+ return FALSE;\r
+ } \r
+ hyn_delay_ms(2); \r
+ while(retry--){\r
+ hyn_delay_ms(5);\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xA000,2,i2c_buf,1);\r
+ if (ok == FALSE) {\r
+ continue;\r
+ }\r
+ if(i2c_buf[0]!=0) break;\r
+ }\r
+\r
+ hyn_delay_ms(1);\r
+ if(i2c_buf[0] == 0x01){\r
+ memset(i2c_buf,0,sizeof(i2c_buf));\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xA008,2,i2c_buf,4);\r
+ if (ok == FALSE) {\r
+ return FALSE;\r
+ } \r
+ chip_checksum = uint8_tTO32(i2c_buf[3],i2c_buf[2],i2c_buf[1],i2c_buf[0]);\r
+ }\r
+ else{\r
+ hyn_92xxdata->need_updata_fw = 1;\r
+ }\r
+\r
+ return chip_checksum;\r
+}\r
+\r
+\r
+static int cst92xx_updata_fw(uint8_t *bin_addr, uint16_t len)\r
+{ \r
+ #define CHECKSUM_OFFECT (0x7F6C)\r
+ int retry = 0;\r
+ int ok_copy = TRUE;\r
+ int ok = FALSE;\r
+ uint8_t i2c_buf[4];\r
+\r
+ uint32_t fw_checksum=0;\r
+ HYN_ENTER();\r
+\r
+ if(len < CST92XX_BIN_SIZE){\r
+ HYN_ERROR("len = %d",len);\r
+ goto UPDATA_END;\r
+ }\r
+ if(len > CST92XX_BIN_SIZE) len = CST92XX_BIN_SIZE;\r
+\r
+ if(0 != hyn_92xxdata->fw_file_name[0]){\r
+ //node to update\r
+ ok = copy_for_updata(hyn_92xxdata,i2c_buf,CST92XX_BIN_SIZE-20,4);\r
+ fw_checksum = uint8_tTO32(i2c_buf[3],i2c_buf[2],i2c_buf[1],i2c_buf[0]);\r
+ if(hyn_92xxdata->hw_info.ic_fw_checksum == fw_checksum || ok != 0){\r
+ HYN_INFO("no update,fw_checksum is same:0x%04x",fw_checksum);\r
+ goto UPDATA_END;\r
+ }\r
+ }else{\r
+ fw_checksum = uint8_tTO32(bin_addr[CHECKSUM_OFFECT+3],bin_addr[CHECKSUM_OFFECT+2],bin_addr[CHECKSUM_OFFECT+1],bin_addr[CHECKSUM_OFFECT+0]);\r
+ }\r
+ HYN_INFO("updating fw checksum:0x%04x",fw_checksum);\r
+\r
+ hyn_irq_set(hyn_92xxdata,DISABLE);\r
+ // hyn_esdcheck_switch(hyn_92xxdata,DISABLE);\r
+ hyn_set_i2c_addr(hyn_92xxdata,BOOT_I2C_ADDR);\r
+ \r
+ HYN_INFO("updata_fw start");\r
+ for(retry = 1; retry<5; retry++){\r
+ hyn_92xxdata->fw_updata_process = 0;\r
+ ok = cst92xx_enter_boot();\r
+ if (ok == FALSE){\r
+ continue;\r
+ }\r
+ hyn_92xxdata->fw_updata_process = 10;\r
+ ok = erase_all_mem();\r
+ if (ok == FALSE){\r
+ continue;\r
+ }\r
+ hyn_92xxdata->fw_updata_process = 20;\r
+ ok = write_code(bin_addr,retry);\r
+ if (ok == FALSE){\r
+ continue;\r
+ }\r
+ hyn_92xxdata->fw_updata_process = 30;\r
+ hyn_92xxdata->hw_info.ic_fw_checksum = cst92xx_read_checksum();\r
+ if(fw_checksum != hyn_92xxdata->hw_info.ic_fw_checksum){\r
+ HYN_INFO("out data fw checksum err:0x%04x",hyn_92xxdata->hw_info.ic_fw_checksum);\r
+ hyn_92xxdata->fw_updata_process |= 0x80;\r
+ continue;\r
+ }\r
+ hyn_92xxdata->fw_updata_process = 100; \r
+ if(retry>=5){\r
+ ok_copy = FALSE;\r
+ break;\r
+ }\r
+ break;\r
+ }\r
+\r
+ hyn_wr_reg(hyn_92xxdata,0xA006EE,3,i2c_buf,2); //exit boot\r
+ hyn_delay_ms(2);\r
+\r
+UPDATA_END: \r
+ cst92xx_reset();\r
+ hyn_delay_ms(50);\r
+\r
+ hyn_set_i2c_addr(hyn_92xxdata,MAIN_I2C_ADDR); \r
+\r
+ if(ok_copy == TRUE){\r
+ cst92xx_updata_tpinfo();\r
+ HYN_INFO("updata_fw success");\r
+ }\r
+ else{\r
+ HYN_INFO("updata_fw failed");\r
+ }\r
+\r
+ hyn_irq_set(hyn_92xxdata,ENABLE);\r
+\r
+ return ok_copy;\r
+}\r
+\r
+static int cst92xx_updata_tpinfo(void)\r
+{\r
+ if(hyn_92xxdata == NULL)\r
+ return -1;\r
+\r
+ uint8_t buf[30],retry=8;\r
+ struct tp_info *ic = &hyn_92xxdata->hw_info;\r
+ if(ic == NULL)\r
+ return -1;\r
+\r
+ int ret = 0;\r
+ hyn_92xxdata->boot_is_pass = 0;\r
+ while(retry--){\r
+ cst92xx_set_workmode(0xff,DISABLE);\r
+ ret = hyn_wr_reg(hyn_92xxdata,0xD101,2,buf,2);\r
+ if(ret) continue;\r
+ ret = hyn_wr_reg(hyn_92xxdata,0xD1F4,2,buf,28);\r
+ printf("buf[19] :0x%x\n",buf[19]);\r
+ if(ret==0 && (buf[19]==0x92||buf[19]==0x91)){\r
+ break;\r
+ }\r
+ ret = -1;\r
+ }\r
+ if(ret){\r
+ return FALSE;\r
+ }\r
+ hyn_92xxdata->boot_is_pass = 1;\r
+ ic->fw_project_id = ((uint16_t)buf[17] <<8) + buf[16];\r
+ ic->fw_chip_type = ((uint16_t)buf[19] <<8) + buf[18];\r
+\r
+ //firmware_version\r
+ ic->fw_ver = (buf[23]<<24)|(buf[22]<<16)|(buf[21]<<8)|buf[20];\r
+ //tx_num rx_num key_num\r
+ ic->fw_sensor_txnum = ((uint16_t)buf[1]<<8) + buf[0];\r
+ ic->fw_sensor_rxnum = buf[2];\r
+ ic->fw_key_num = buf[3];\r
+\r
+ ic->fw_res_y = (buf[7]<<8)|buf[6];\r
+ ic->fw_res_x = (buf[5]<<8)|buf[4];\r
+\r
+ //fw_checksum\r
+ ic->ic_fw_checksum = (buf[27]<<24)|(buf[26]<<16)|(buf[25]<<8)|buf[24];\r
+ HYN_INFO("IC_info project_id:%04x ictype:%04x fw_ver:%x checksum:%#x",ic->fw_project_id,ic->fw_chip_type,ic->fw_ver,ic->ic_fw_checksum);\r
+ \r
+ cst92xx_set_workmode(NOMAL_MODE,ENABLE);\r
+ \r
+ return TRUE;\r
+}\r
+\r
+static int cst92xx_updata_judge(uint8_t *p_fw, uint16_t len)\r
+{\r
+ uint32_t f_checksum,f_fw_ver,f_ictype,f_fw_project_id;\r
+ uint8_t *p_data = p_fw + len - 28; //7F64\r
+ struct tp_info *ic = &hyn_92xxdata->hw_info;\r
+\r
+ f_fw_project_id = uint8_tTO16(p_data[1],p_data[0]);\r
+ f_ictype = uint8_tTO16(p_data[3],p_data[2]);\r
+\r
+ f_fw_ver = uint8_tTO16(p_data[7],p_data[6]);\r
+ f_fw_ver = (f_fw_ver<<16)|uint8_tTO16(p_data[5],p_data[4]);\r
+\r
+ f_checksum = uint8_tTO16(p_data[11],p_data[10]);\r
+ f_checksum = (f_checksum << 16)|uint8_tTO16(p_data[9],p_data[8]);\r
+\r
+\r
+ HYN_INFO("Bin_info project_id:0x%04x ictype:0x%04x fw_ver:0x%x checksum:0x%x",f_fw_project_id,f_ictype,f_fw_ver,f_checksum);\r
+ if(\r
+ (f_checksum != ic->ic_fw_checksum && f_fw_ver >= ic->fw_ver && f_ictype == ic->fw_chip_type)\r
+ || (hyn_92xxdata->boot_is_pass==0) //empty chip\r
+ ){\r
+ HYN_INFO("need update!");\r
+ return 1; //need updata\r
+ }\r
+ HYN_INFO("cst92xx_updata_judge done, no need update");\r
+ return 0;\r
+}\r
+\r
+//------------------------------------------------------------------------------//\r
+\r
+int cst92xx_set_workmode(uint8_t mode,uint8_t enable)\r
+{\r
+ // printf("mode : %d\n",mode);\r
+ int ok = FALSE;\r
+ uint8_t i2c_buf[4] = {0};\r
+ uint8_t i = 0;\r
+ hyn_92xxdata->work_mode = mode;\r
+\r
+ for(i=0;i<3;i++){\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD11E,2,i2c_buf,2);\r
+ LOS_Udelay(200);\r
+ ok |= hyn_wr_reg(hyn_92xxdata,0x0002,2,i2c_buf,2);\r
+ printf("i2c_buf[1] :0x%x\n",i2c_buf[1]);\r
+ if(ok==TRUE && i2c_buf[1] == 0x1E){\r
+ break;\r
+ } \r
+ } \r
+ // hyn_esdcheck_switch(hyn_92xxdata,enable);\r
+ switch(mode){\r
+ case NOMAL_MODE:\r
+ hyn_irq_set(hyn_92xxdata,ENABLE);\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD109,2,i2c_buf,2);\r
+ break;\r
+ case GESTURE_MODE:\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD104,2,i2c_buf,2);\r
+ break;\r
+ case LP_MODE:\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD107,2,i2c_buf,2);\r
+ break;\r
+ case DIFF_MODE:\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD10D,2,i2c_buf,2);\r
+ break;\r
+ case RAWDATA_MODE:\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD10A,2,i2c_buf,2);\r
+ break;\r
+ case FAC_TEST_MODE:\r
+ hyn_wr_reg(hyn_92xxdata,0xD114,2,i2c_buf,2);\r
+ msleep(50);\r
+ break;\r
+ case CHARGE_EXIT:\r
+ case CHARGE_ENTER:\r
+ hyn_92xxdata->charge_is_enable = mode&0x01;\r
+ ok = hyn_wr_reg(hyn_92xxdata,(mode&0x01)? 0xD01F:0xD020,2,i2c_buf,2); //charg mode\r
+ mode = hyn_92xxdata->work_mode; //not switch work mode\r
+ HYN_INFO("set_charge:%d",hyn_92xxdata->charge_is_enable);\r
+ break;\r
+ case ENTER_BOOT_MODE:\r
+ ok = cst92xx_enter_boot();\r
+ break;\r
+ case DEEPSLEEP:\r
+ hyn_wr_reg(hyn_92xxdata,0xD105,2,i2c_buf,2);\r
+ break;\r
+ default :\r
+ hyn_92xxdata->work_mode = NOMAL_MODE;\r
+ ok = -2;\r
+ break;\r
+ }\r
+ if(ok != -2){\r
+ hyn_92xxdata->work_mode = mode;\r
+ }\r
+ HYN_INFO("set_workmode:%d ret:%d",mode,ok);\r
+ return ok;\r
+}\r
+\r
+static int cst92xx_supend(void)\r
+{\r
+ HYN_ENTER();\r
+ cst92xx_set_workmode(DEEPSLEEP,0);\r
+ return 0;\r
+}\r
+\r
+\r
+static int cst92xx_resum(void)\r
+{\r
+ cst92xx_reset();\r
+ msleep(50);\r
+ cst92xx_set_workmode(NOMAL_MODE,1);\r
+ return 0;\r
+}\r
+\r
+\r
+ // if (model == 0)\r
+ // {\r
+ // g_cst92xx_drv.touch_msg.tp_event = MC_TP_RELEASE;\r
+ // point_count=0;\r
+ // }else{\r
+ // if (point_count==0)\r
+ // {\r
+ // g_cst92xx_drv.touch_msg.tp_event = MC_TP_PRESS;\r
+ // }else{\r
+ // g_cst92xx_drv.touch_msg.tp_event = MC_TP_MOVE;\r
+ // }\r
+ // point_count++;\r
+ // }\r
+ \r
+ // g_cst92xx_drv.touch_msg.tp_event_info.x_axis[0] = x_axis;\r
+ // g_cst92xx_drv.touch_msg.tp_event_info.y_axis[0] = y_axis;\r
+ // g_cst92xx_drv.touch_msg.tv_usec = (uint32_t)uapi_tcxo_get_ms();\r
+ \r
+ // // } else {\r
+ // // g_cst92xx_drv.touch_msg.tp_event = MC_TP_INVALID;\r
+ // // tp_warning("TOUCH:parse wrong touchstatus %d", touch_status);\r
+ // // return EXT_ERR_SUCCESS;\r
+ // // }\r
+\r
+ // return EXT_ERR_SUCCESS;\r
+\r
+static int cst92xx_report(void)\r
+{\r
+ if(hyn_92xxdata == NULL)\r
+ {\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+ int ret = FALSE;\r
+ uint8_t i2c_buf[MAX_FINGER*5+5] = {0};\r
+ uint8_t finger_num = 0,key_state=0,retry=3,re_len=0,ges_state;\r
+\r
+ while(--retry){\r
+ hyn_wr_reg(hyn_92xxdata,0xD000,2,i2c_buf,2); //wakeup\r
+ LOS_Udelay(200);\r
+ ret = hyn_wr_reg(hyn_92xxdata,0xD000,2,i2c_buf,7);\r
+ if(ret || i2c_buf[6]!=0xAB || i2c_buf[0]==0xAB){\r
+ ret = -1;\r
+ continue;\r
+ }\r
+ finger_num = i2c_buf[5] & 0x7F;\r
+ printf("finger_num : %d\n",finger_num);\r
+ if(finger_num > MAX_FINGER){\r
+ ret = -2;\r
+ continue;\r
+ }\r
+ key_state = i2c_buf[5]>>7;\r
+ printf("key_state : %d\n",key_state);\r
+ re_len = ((finger_num>1 ? finger_num-1:0)+key_state)*5;\r
+ if(re_len){\r
+ ret = hyn_wr_reg(hyn_92xxdata,0xD007,2,i2c_buf+7,re_len);\r
+ if(ret){\r
+ ret = -2;\r
+ continue;\r
+ }\r
+ }\r
+ ret = hyn_wr_reg(hyn_92xxdata,0xD000AB,3,i2c_buf,2); //write end flag\r
+ if(ret){\r
+ ret = -3;\r
+ continue;\r
+ }\r
+ else{\r
+ break;\r
+ }\r
+ }\r
+ \r
+ if(ret){\r
+ HYN_ERROR("read point erro:%d\r\n",ret);\r
+ hyn_wr_reg(hyn_92xxdata,0xD000AB,3,i2c_buf,2); //write end flag\r
+ return ret;\r
+ }\r
+\r
+ ges_state = i2c_buf[4]>>4;\r
+ // printf("ges_state :%d\n",ges_state);\r
+ if(ges_state){ //gesture\r
+ if((ges_state&0x80) == 0x80){ //palm\r
+ hyn_92xxdata->gesture_id = IDX_POWER;//IDX_Z;// palm \r
+ }\r
+ else{ //other gesture\r
+ hyn_92xxdata->gesture_id = IDX_POWER;//GESTURE wakeup\r
+ }\r
+ HYN_INFO("gesture buf4:%#x\r\n",i2c_buf[4]);\r
+ hyn_92xxdata->rp_buf.report_need |= REPORT_GES;\r
+ printf("111 hyn_92xxdata->rp_buf.report_need |= REPORT_GES \n");\r
+ }\r
+ // printf("key_state :%d\n",key_state);\r
+ if(key_state){\r
+ uint8_t *data_ptr = i2c_buf;\r
+ if(finger_num){\r
+ data_ptr += (finger_num*5+2);\r
+ }\r
+ if( hyn_92xxdata->rp_buf.report_need==REPORT_NONE){\r
+ hyn_92xxdata->rp_buf.report_need |= REPORT_KEY;\r
+ }\r
+ hyn_92xxdata->rp_buf.key_id = (data_ptr[1]>>4)-1; //0x17 0x27 0x37\r
+ hyn_92xxdata->rp_buf.key_state = data_ptr[0]==0x83 ? 1:0; //0x83 0x80\r
+ printf("hyn_92xxdata->rp_buf.key_id : %d\n",hyn_92xxdata->rp_buf.key_id);\r
+ printf("hyn_92xxdata->rp_buf.key_state : %d\n",hyn_92xxdata->rp_buf.key_state);\r
+ }\r
+\r
+ if(finger_num){\r
+ uint8_t i = 0,index = 0,id = 0;\r
+ uint8_t *data_ptr = i2c_buf;\r
+ if( hyn_92xxdata->rp_buf.report_need==REPORT_NONE){\r
+ hyn_92xxdata->rp_buf.report_need |= REPORT_POS;\r
+ }\r
+ for (i = 0; i < finger_num; i++) {\r
+ id = data_ptr[0] >> 4;\r
+ \r
+ hyn_92xxdata->rp_buf.pos_info[index].pos_id = id;\r
+ hyn_92xxdata->rp_buf.pos_info[index].event = (data_ptr[0]&0x0F) ? 1 : 0; \r
+ hyn_92xxdata->rp_buf.pos_info[index].pos_x = (data_ptr[1] << 4) | (data_ptr[3] >> 4);\r
+ hyn_92xxdata->rp_buf.pos_info[index].pos_y = (data_ptr[2] << 4) | (data_ptr[3] & 0x0F);\r
+ hyn_92xxdata->rp_buf.pos_info[index].pres_z = (data_ptr[4] & 0x7F);\r
+\r
+ data_ptr += (i==0 ? 7:5);\r
+\r
+\r
+ printf("hyn_92xxdata->rp_buf.pos_info[index].event : %d index:%d\n",hyn_92xxdata->rp_buf.pos_info[index].event,index);\r
+ uint8_t event = hyn_92xxdata->rp_buf.pos_info[index].event; // 事件标识(0=抬起,1=有效)\r
+ uint16_t curr_x = hyn_92xxdata->rp_buf.pos_info[index].pos_x; // 当前X坐标\r
+ uint16_t curr_y = hyn_92xxdata->rp_buf.pos_info[index].pos_y; // 当前Y坐标\r
+\r
+ printf("curr_x:%d,curr_y:%d\n",curr_x,curr_y);\r
+ if(curr_x >= 466 || curr_y >= 466)\r
+ continue;\r
+\r
+ \r
+ hyn_92xxdata->touch_msg.tp_event_info.x_axis[0] = curr_x;\r
+ hyn_92xxdata->touch_msg.tp_event_info.y_axis[0] = curr_y;\r
+ hyn_92xxdata->touch_msg.tv_usec = (uint32_t)uapi_tcxo_get_ms();\r
+\r
+ if(event == 0)\r
+ {\r
+ point_count = 0;\r
+ hyn_92xxdata->touch_msg.tp_event = MC_TP_RELEASE;\r
+ }\r
+ else\r
+ {\r
+ if(point_count == 0)\r
+ hyn_92xxdata->touch_msg.tp_event = MC_TP_PRESS;\r
+ else \r
+ hyn_92xxdata->touch_msg.tp_event = MC_TP_MOVE;\r
+\r
+ point_count++;\r
+ }\r
+\r
+ printf("hyn_92xxdata->touch_msg.tp_event %d\n",hyn_92xxdata->touch_msg.tp_event);\r
+\r
+ index++;\r
+ }\r
+ hyn_92xxdata->rp_buf.rep_num = index;\r
+\r
+ \r
+ \r
+ }\r
+\r
+\r
+ return 0;\r
+}\r
+\r
+\r
+static uint32_t cst92xx_check_esd(void)\r
+{\r
+ int ok = FALSE;\r
+ uint8_t i2c_buf[6], retry;\r
+ uint32_t esd_value = 0;\r
+ retry = 4;\r
+ while (retry--){\r
+ hyn_wr_reg(hyn_92xxdata,0xD048,2,i2c_buf,2);\r
+ LOS_Udelay(200);\r
+ ok = hyn_wr_reg(hyn_92xxdata,0xD048,2,i2c_buf,1);\r
+ if (ok == 0 &&((i2c_buf[0]&0xF0) == 0x20 || (i2c_buf[0]&0xF0) == 0xA0)&&(i2c_buf[0]&0x0F)<10){\r
+ break;\r
+ }\r
+ else{\r
+ ok = -2;\r
+ }\r
+ }\r
+ if(-2==ok){ //esdcheck failed rest system\r
+ hyn_92xxdata->esd_fail_cnt = 3;\r
+ esd_value = hyn_92xxdata->esd_last_value;\r
+ }\r
+ else{\r
+ esd_value = hyn_92xxdata->esd_last_value+1;\r
+ }\r
+ return esd_value;\r
+}\r
+\r
+\r
+static int cst92xx_prox_handle(uint8_t cmd)\r
+{\r
+ return TRUE;\r
+}\r
+\r
+\r
+static int cst92xx_get_dbg_data(uint8_t *buf, uint16_t len)\r
+{\r
+ int ret = -1; \r
+ uint16_t read_len = (hyn_92xxdata->hw_info.fw_sensor_txnum * hyn_92xxdata->hw_info.fw_sensor_rxnum)*2;\r
+ uint16_t total_len = read_len + (hyn_92xxdata->hw_info.fw_sensor_txnum + hyn_92xxdata->hw_info.fw_sensor_rxnum)*2;\r
+ HYN_ENTER();\r
+ if(total_len > len){\r
+ HYN_ERROR("buf too small");\r
+ return -1;\r
+ }\r
+ switch(hyn_92xxdata->work_mode){\r
+ case DIFF_MODE:\r
+ case RAWDATA_MODE:\r
+ ret = hyn_wr_reg(hyn_92xxdata,0x1000,2,buf,read_len); //mt \r
+\r
+ buf += read_len;\r
+ read_len = hyn_92xxdata->hw_info.fw_sensor_rxnum*2;\r
+ ret |= hyn_wr_reg(hyn_92xxdata,0x7000,2,buf,read_len); //rx\r
+\r
+ buf += read_len;\r
+ read_len = hyn_92xxdata->hw_info.fw_sensor_txnum*2;\r
+ ret |= hyn_wr_reg(hyn_92xxdata,0x7200,2,buf,read_len); //tx\r
+\r
+ ret |= hyn_wr_reg(hyn_92xxdata,0x000500,3,buf,2); //end\r
+ break;\r
+ default:\r
+ HYN_ERROR("work_mode:%d",hyn_92xxdata->work_mode);\r
+ break;\r
+ }\r
+ return ret==0 ? total_len:-1;\r
+}\r
+\r
+\r
+#define FACTEST_PATH "/sdcard/hyn_fac_test_cfg.ini"\r
+#define FACTEST_LOG_PATH "/sdcard/hyn_fac_test.log"\r
+#define FACTEST_ITEM (MULTI_OPEN_TEST|MULTI_SHORT_TEST)\r
+\r
+static int cst92xx_get_test_result(uint8_t *buf, uint16_t len)\r
+{\r
+ int ret = 0;\r
+ struct tp_info *ic = &hyn_92xxdata->hw_info;\r
+ uint16_t scap_len = (ic->fw_sensor_txnum + ic->fw_sensor_rxnum)*2;\r
+ uint16_t mt_len = ic->fw_sensor_rxnum*ic->fw_sensor_txnum*2,i = 0;\r
+ uint16_t *raw_s;\r
+\r
+ HYN_ENTER();\r
+ if((mt_len*3 + scap_len) > len || mt_len==0){\r
+ HYN_ERROR("buf too small");\r
+ return FAC_GET_DATA_FAIL;\r
+ }\r
+ HYN_INFO("---open_higdrv---");\r
+ hyn_wr_reg(hyn_92xxdata,0xD110,2,buf,2); ////test open high\r
+ hyn_wait_irq_timeout(hyn_92xxdata,7000);\r
+ if(hyn_wr_reg(hyn_92xxdata,0x3000,2,buf,mt_len)){ //open high\r
+ ret = FAC_GET_DATA_FAIL;\r
+ HYN_ERROR("read open high failed");\r
+ goto selftest_end;\r
+ }\r
+ hyn_wr_reg(hyn_92xxdata,0x000005,3,buf,2); \r
+\r
+ HYN_INFO("---open_low---");\r
+ hyn_wr_reg(hyn_92xxdata,0xD111,2,buf,2); ////test open low\r
+ hyn_wait_irq_timeout(hyn_92xxdata,7000);\r
+ if(hyn_wr_reg(hyn_92xxdata,0x1000,2,buf + mt_len,mt_len)){ //open low\r
+ ret = FAC_GET_DATA_FAIL;\r
+ HYN_ERROR("read open low failed");\r
+ goto selftest_end;\r
+ }\r
+ hyn_wr_reg(hyn_92xxdata,0x000005,3,buf,2); \r
+\r
+ //short test\r
+ HYN_INFO("---short---");\r
+ hyn_wr_reg(hyn_92xxdata,0xD112,2,buf,2); //// short test\r
+ hyn_wait_irq_timeout(hyn_92xxdata,7000);\r
+ if(hyn_wr_reg(hyn_92xxdata,0x5000,2,buf+(mt_len*2),scap_len)){\r
+ ret = FAC_GET_DATA_FAIL;\r
+ HYN_ERROR("read fac short failed");\r
+ goto selftest_end;\r
+ }\r
+ else{\r
+ raw_s = (uint16_t*)(buf + mt_len*2);\r
+ HYN_INFO("raw_s start data = %d",*(raw_s));\r
+ for(i = 0; i< ic->fw_sensor_rxnum+ic->fw_sensor_txnum; i++){\r
+ HYN_INFO("short raw data = %d %d",i,*(raw_s+i));\r
+ if(U16REV((uint16_t)*raw_s) != 0) *raw_s = 2000 / U16REV((uint16_t)*raw_s);\r
+ else *raw_s =0;\r
+ HYN_INFO("short reprocess data = %d %d",i,*(raw_s+i));\r
+ raw_s++;\r
+ }\r
+ }\r
+\r
+ //read data finlish start test\r
+ ret = factory_multitest(hyn_92xxdata ,FACTEST_PATH, buf,(int16_t*)(buf+scap_len+mt_len*2),FACTEST_ITEM);\r
+\r
+selftest_end:\r
+ if(0 == fac_test_log_save(FACTEST_LOG_PATH,hyn_92xxdata,(int16_t*)buf,ret,FACTEST_ITEM)){\r
+ HYN_INFO("fac_test log save success");\r
+ } \r
+ cst92xx_resum();\r
+\r
+ return ret;\r
+}\r
+\r
+const struct hyn_ts_fuc cst92xx_fuc = {\r
+ .tp_rest = cst92xx_reset,\r
+ .tp_report = cst92xx_report,\r
+ .tp_supend = cst92xx_supend,\r
+ .tp_resum = cst92xx_resum,\r
+ .tp_chip_init = cst92xx_init,\r
+ .tp_updata_fw = cst92xx_updata_fw,\r
+ .tp_set_workmode = cst92xx_set_workmode,\r
+ .tp_check_esd = cst92xx_check_esd,\r
+ .tp_prox_handle = cst92xx_prox_handle,\r
+ .tp_get_dbg_data = cst92xx_get_dbg_data,\r
+ .tp_get_test_result = cst92xx_get_test_result\r
+};\r
+\r
+\r