272加入tp驱动
authorpenglei <1624952103@qq.com>
Fri, 7 Nov 2025 10:10:53 +0000 (18:10 +0800)
committerpenglei <1624952103@qq.com>
Fri, 7 Nov 2025 10:10:53 +0000 (18:10 +0800)
12 files changed:
code/sdk/application/brandy/brandy_standard/thread_pri_init.c
code/sdk/build/config/target_config/brandy/config.py
code/sdk/drivers/boards/brandy_evb/product/product_evb4_standard.h
code/sdk/drivers/drivers/driver/touch/CMakeLists.txt
code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_ctrl.c [new file with mode: 0644]
code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_ctrl.h [new file with mode: 0644]
code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_drv1.c [new file with mode: 0644]
code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_drv1.h [new file with mode: 0644]
code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_touch1.c [new file with mode: 0644]
code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_touch1.h [new file with mode: 0644]
code/sdk/drivers/drivers/driver/touch/touch_screen_drv.c
code/sdk/zhihui/services/factorytest_service/factorytest_protocol.c

index 8d0f885..2e726b4 100644 (file)
@@ -40,6 +40,8 @@
 #include "ft6x46_touch1.h"\r
 #elif defined(TPTYPE_CST86XX)\r
 #include "cst86xx_touch1.h"\r
+#elif defined(TPTYPE_CST92XX)\r
+#include "cst92xx_touch1.h"\r
 #else\r
 #include "ztw523_touch1.h"\r
 #endif\r
@@ -166,13 +168,19 @@ static void sample_gfx_init(void)
     ft6x46_host_init_sample();\r
 #elif defined(TPTYPE_CST86XX)\r
     cst86xx_host_init_sample();\r
+#elif defined(TPTYPE_CST92XX)\r
+    cst92xx_host_init_sample();\r
+    printf("cst92xx_host_init_sample \n");\r
 #else\r
     ztw523_host_init_sample();\r
 #endif\r
 #endif\r
+    printf("11111  \n");\r
     uapi_lcd_init();\r
     uapi_vau_module_init();\r
+    printf("22222  \n");\r
     uapi_dpu_module_init();\r
+    printf("33333  \n");\r
 #ifdef SUPPORT_GPU_JPEG\r
     uapi_jpeg_module_init();\r
 #endif\r
index 7fd0294..418c8a4 100644 (file)
@@ -1127,7 +1127,7 @@ target = {
             'SUPPORT_CHARGER_PLUG_DETECTION_NOTIFICATION',
             # 'SUPPORT_AT_CUSTOMUTILS',
             'SUPPORT_BLE_SERVICE',
-            'SUPPORT_MAG_SERVICE',
+            # 'SUPPORT_MAG_SERVICE',
             'SUPPORT_PPG_SERVICE',
             'SUPPORT_CYWEE_SERVICE',
             'SUPPORT_BATTERY_SERVICE',
@@ -1142,7 +1142,8 @@ target = {
             'CFG_FLASH_SIZE=16',
             'CONFIG_NORFLASH_SIZE=16',
             'SINGLE_USER_PARTITION',
-            'TPTYPE_FT6X46',
+            # 'TPTYPE_FT6X46',
+            'TPTYPE_CST92XX',
             # 'ROTARYENCODER_HX3507',
             'NANDFLASH_DS35X',
             'BLE_INSTRUCT',
@@ -1166,7 +1167,7 @@ target = {
                            "ppg_sensor_hx3695",
                           "ppgBleService",
                         #    "mag_sensor_mmc5603",
-                        "mag_sensor_qmc6309",
+                        # "mag_sensor_qmc6309",
                           "vibrator",
                           "vibrator_service",
                         #   "-:lwip",
@@ -1197,7 +1198,7 @@ target = {
                         #    "hid_service",
                            "producttest",
                             "ppg_hal",
-                            "mag_service",
+                            # "mag_service",
                             "cywee_dml",
                             "cyweeBleService",
                             "charge_ic_hp4570",
@@ -1219,7 +1220,8 @@ target = {
                     'BOARD_FD272',
                     'FT_SINGLE_UART',
                     'NANDFLASH_DS35X',
-                    'TPTYPE_FT6X46',
+                    # 'TPTYPE_FT6X46',
+                    'TPTYPE_CST92XX',
                     'CFG_FLASH_SIZE=16',
                     'CONFIG_NORFLASH_SIZE=16',
                     'CUSTOM_ZHIHUI',
index f753c29..9c041e0 100644 (file)
 #define CST86XX_INT_GPIO                     S_AGPIO_R5
 #define CST86XX_RESET_GPIO                   S_AGPIO_R4
 
+#define CST92XX_I2C_BUS                      I2C_BUS_1
+#define CST92XX_INT_GPIO                     S_AGPIO_R5
+#define CST92XX_RESET_GPIO                   S_AGPIO_R4
+
 //GNSS Config
 #define GNSS_RESET_PIN
 // TRACK MODE
index db020dc..d676828 100644 (file)
@@ -33,6 +33,12 @@ set(SOURCES ${SOURCES}
     ${CMAKE_CURRENT_SOURCE_DIR}/cst86xx_touch/cst86xx_drv1.c
     ${CMAKE_CURRENT_SOURCE_DIR}/cst86xx_touch/cst86xx_touch1.c
 )
+elseif("TPTYPE_CST92XX" IN_LIST DEFINES)
+set(SOURCES ${SOURCES}
+    ${CMAKE_CURRENT_SOURCE_DIR}/cst92xx_touch/cst92xx_ctrl.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/cst92xx_touch/cst92xx_drv1.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/cst92xx_touch/cst92xx_touch1.c
+)
 else()
 set(SOURCES ${SOURCES}
     ${CMAKE_CURRENT_SOURCE_DIR}/ztw523_touch/ztw523_ctrl.c
@@ -65,6 +71,12 @@ set(PUBLIC_HEADER
     ${CMAKE_CURRENT_SOURCE_DIR}/cst86xx_touch
     ${ROOT_DIR}/middleware/services/gui/hal/input/include
 )
+elseif("TPTYPE_CST92XX" IN_LIST DEFINES)
+set(PUBLIC_HEADER
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/cst92xx_touch
+    ${ROOT_DIR}/middleware/services/gui/hal/input/include
+)
 else()
 set(PUBLIC_HEADER
     ${CMAKE_CURRENT_SOURCE_DIR}
diff --git a/code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_ctrl.c b/code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_ctrl.c
new file mode 100644 (file)
index 0000000..46e2f6a
--- /dev/null
@@ -0,0 +1,371 @@
+/*\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*)&reg_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
diff --git a/code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_ctrl.h b/code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_ctrl.h
new file mode 100644 (file)
index 0000000..6b940ea
--- /dev/null
@@ -0,0 +1,82 @@
+/*\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
+#ifndef CST92XX_CTRL_H\r
+#define CST92XX_CTRL_H\r
+\r
+#include "stdio.h"\r
+#include "debug_print.h"\r
+#include "stdint.h"\r
+#include "product.h"\r
+#include "td_base.h"\r
+#include "platform_core.h"\r
+#include "cst92xx_touch1.h"\r
+#include "touch_screen_def.h"\r
+\r
+\r
+//_TODO:\r
+#define CTP_USE_SW_I2C                      0       //hard i2c:0 gpio i2c:1\r
+#define CTP_SLAVER_ADDR                     (0x5A)  //(8bit write addr  0x15<<1)\r
+\r
+#define CTP_HYNITRON_AUTO_UPDATE            0       // enable update\r
+#define CTP_HYNITRON_CST816S_UPDATE         0       //820S 816S\r
+#define CTP_HYNITRON_CST816T_UPDATE         0       //820 816t 816D\r
+#define CTP_HYNITRON_CST78xx_UPDATE         0       //716 830 826 836U\r
+\r
+#define CTP_TRUE    (0)\r
+#define CTP_FALSE   (-1)\r
+\r
+#define OUTPUT 1\r
+#define INPUT 0\r
+\r
+\r
+#define DBG_CTP\r
+#ifdef DBG_CTP\r
+#define ctp_dbg_print(fmt,args...)   printf("[HYN]"fmt"\n\r", ##args)\r
+#else\r
+#define ctp_dbg_print(...)\r
+#endif\r
+\r
+\r
+/* host peripheral definitions */\r
+#define CST92XX_I2C_ADDR           0x5A\r
+#define CST92XX_I2C_SPEED          I2C_SPEED_MODE_SS\r
+#define CST92XX_REG_WRITE_LEN      4\r
+#define CST92XX_CMD_SEND_LEN       1\r
+#define CST92XX_REG_DATA_LEN       1\r
+#define CST92XX_I2C_TIME_MAX       3\r
+#define CST92XX_INPUT_SIZE         64\r
+#define CST92XX_I2C_SEND_INDEX0    0\r
+// #define CST92XX_I2C_SEND_INDEX1    1\r
+// #define CST92XX_I2C_SEND_INDEX2    2\r
+// #define CST92XX_I2C_SEND_INDEX3    3\r
+typedef struct {\r
+    uint32_t int_gpio;\r
+    i2c_bus_t i2c_id;\r
+    uint32_t i2c_speed;\r
+} cst92xx_ctrl_attr;\r
+\r
+typedef ext_errno (*cst92xx_bus_init)(cst92xx_ctrl_attr *attr);\r
+\r
+typedef struct {\r
+    cst92xx_ctrl_attr attr;\r
+    cst92xx_bus_init bus_init;\r
+} cst92xx_ctrl_ops;\r
+\r
+ext_errno cst92xx_host_peripheral_init(cst92xx_ctrl_attr *attr);\r
+ext_errno cst92xx_register_handle(const cst92xx_ctrl_ops *peri_data, touch_callback func);\r
+ext_errno cst92xx_unregister_handle(const cst92xx_ctrl_ops *peri_data);\r
+ext_errno cst92xx_reset(void);\r
+void cst92xx_resume_reset(void);\r
+void cst92xx_delay(uint32_t ms);\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
+ext_errno cst92xx_tp_i2c_cmd_write(uint16_t cmd);\r
+ext_errno cst92xx_tp_i2c_reg_write(uint16_t reg_addr, uint16_t reg_cfg);\r
+ext_errno cst92xx_tp_i2c_data_write(uint8_t *data_buf, uint32_t data_len);\r
+\r
+#endif\r
diff --git a/code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_drv1.c b/code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_drv1.c
new file mode 100644 (file)
index 0000000..5e7629d
--- /dev/null
@@ -0,0 +1,112 @@
+/*\r
+ * @Author: penglei 1624952103@qq.com\r
+ * @Date: 2025-11-07 10:11:38\r
+ * @LastEditors: penglei 1624952103@qq.com\r
+ * @LastEditTime: 2025-11-07 11:41:11\r
+ * @FilePath: /FD230/code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_drv1.c\r
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
+ */\r
+/*\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_drv1.h"\r
+#include "touch_screen_def.h"\r
+#include "cst92xx_ctrl.h"\r
+#include "cst92xx_touch1.h"\r
+#include "i2c.h"\r
+#include "debug_print.h"\r
+#include "hal_i2c.h"\r
+\r
+static ext_errno cst92xx_drv_init(cst92xx_ctrl_ops *config)\r
+{\r
+    ext_errno ret;\r
+    cst92xx_ctrl_ops *ops = config;\r
+\r
+    if (ops == NULL) {\r
+        tp_err("peripheral ops is empty!");\r
+        return EXT_ERR_FAILURE;\r
+    }\r
+\r
+    if (ops->bus_init == NULL) {\r
+        tp_err("peripheral bus_init func is empty!");\r
+        return EXT_ERR_FAILURE;\r
+    }\r
+\r
+    ret = ops->bus_init(&(ops->attr));\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        tp_err("CST92XX bus_init fail! ret = 0x%x", ret);\r
+        return ret;\r
+    }\r
+\r
+    ret = cst92xx_init(NULL);\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        tp_err("CST92XX init fail! ret = 0x%x", ret);\r
+        return ret;\r
+    }\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static ext_errno cst92xx_drv_deinit(void)\r
+{\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static ext_errno cst92xx_drv_get_info(uint8_t *data, uint8_t data_len)\r
+{\r
+    return cst92xx_irq_callback(data, data_len);\r
+}\r
+\r
+static ext_errno cst92xx_drv_suspend(void)\r
+{\r
+    return cst92xx_set_workmode(DEEPSLEEP,1);\r
+}\r
+\r
+static ext_errno cst92xx_drv_resume(void)\r
+{\r
+    cst92xx_reset();\r
+    osDelay(50);\r
+    cst92xx_set_workmode(NOMAL_MODE,1);\r
+    return 0;\r
+    // return cst92xx_set_power_mode(MC_TP_RESUME_SCAN);\r
+}\r
+\r
+static ext_errno cst92xx_drv_sleep(void)\r
+{\r
+    return cst92xx_set_workmode(DEEPSLEEP,1);\r
+}\r
+\r
+touch_peripheral_api g_cst92xx_api = {\r
+    .touch_init = cst92xx_drv_init,\r
+    .touch_deinit = cst92xx_drv_deinit,\r
+    .touch_get_tpinfo = cst92xx_drv_get_info,\r
+    .touch_suspend = cst92xx_drv_suspend,\r
+    .touch_resume = cst92xx_drv_resume,\r
+    .touch_sleep = cst92xx_drv_sleep,\r
+    .touch_bus_init = cst92xx_host_peripheral_init,\r
+    .register_callback = cst92xx_register_handle,\r
+    .unregister_callback = cst92xx_unregister_handle,\r
+};\r
+\r
+cst92xx_ctrl_ops g_cst92xx_ctrl = {\r
+    .attr = {\r
+        .int_gpio = CST92XX_INT_GPIO,\r
+        .i2c_id = CST92XX_I2C_BUS,\r
+        .i2c_speed = I2C_SPEED_MODE_SS,\r
+    },\r
+    .bus_init = (cst92xx_bus_init)cst92xx_host_peripheral_init,\r
+};\r
+\r
+void *touch_screen_get_api(void)\r
+{\r
+    return ((void *)&g_cst92xx_api);\r
+}\r
+\r
+void *touch_screen_get_peri_attr(void)\r
+{\r
+    return ((void *)&g_cst92xx_ctrl);\r
+}
\ No newline at end of file
diff --git a/code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_drv1.h b/code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_drv1.h
new file mode 100644 (file)
index 0000000..f22bb90
--- /dev/null
@@ -0,0 +1,22 @@
+/*\r
+ * @Author: penglei 1624952103@qq.com\r
+ * @Date: 2025-11-07 10:12:23\r
+ * @LastEditors: penglei 1624952103@qq.com\r
+ * @LastEditTime: 2025-11-07 10:12:47\r
+ * @FilePath: /FD230/code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_drv1.h\r
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE\r
+ */\r
+/*\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
+#ifndef CST92XX_DRV1_H\r
+#define CST92XX_DRV1_H\r
+\r
+void *touch_screen_get_api(void);\r
+void *touch_screen_get_peri_attr(void);\r
+\r
+#endif
\ No newline at end of file
diff --git a/code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_touch1.c b/code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_touch1.c
new file mode 100644 (file)
index 0000000..ef6fee6
--- /dev/null
@@ -0,0 +1,1019 @@
+#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 *)&reg_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 *)&reg_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 *)&reg_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
diff --git a/code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_touch1.h b/code/sdk/drivers/drivers/driver/touch/cst92xx_touch/cst92xx_touch1.h
new file mode 100644 (file)
index 0000000..f853281
--- /dev/null
@@ -0,0 +1,237 @@
+#ifndef HYNITRON_CORE_H
+#define HYNITRON_CORE_H
+
+#include <stdint.h>
+#include <stdbool.h>
+#include "touch_screen_def.h"
+
+// #include "hyn_cfg.h"
+
+#define HYN_INFO(fmt, args...)   printf("[HYN]"fmt"\n", ##args)
+#define HYN_INFO2(fmt, args...)  if(hyn_data->log_level > 0)printf("[HYN]"fmt"\n", ##args)
+#define HYN_INFO3(fmt, args...)  if(hyn_data->log_level > 1)printf("[HYN]"fmt"\n", ##args)
+#define HYN_INFO4(fmt, args...)  if(hyn_data->log_level > 2)printf("[HYN]"fmt"\n", ##args)
+#define HYN_ERROR(fmt, args...)  printf("[HYN][Error]%s:"fmt"\n",__func__,##args)
+#define HYN_ENTER()              printf("[HYN][enter]%s\n",__func__)
+
+#define HYN_POWER_ON_UPDATA     (0) //touch fw updata
+
+#define MAX_POINTS_REPORT       (5) //max report point  
+
+#define HYN_DRIVER_VERSION      "== Hynitron V2.10 20241111 =="
+
+// #define IS_ERR_OR_NULL(x)  (x <= 0)
+#define U8TO16(x1,x2) ((((x1)&0xFF)<<8)|((x2)&0xFF))
+#define U8TO32(x1,x2,x3,x4) ((((x1)&0xFF)<<24)|(((x2)&0xFF)<<16)|(((x3)&0xFF)<<8)|((x4)&0xFF))
+#define U16REV(x)  ((((x)<<8)&0xFF00)|(((x)>>8)&0x00FF))
+
+#define CST92XX_TOUCHINFO_LEN      (6)
+
+#undef DISABLE
+#undef ENABLE
+
+#define DISABLE (0)
+#define ENABLE  (1)
+
+#define HIGH   (1)
+
+
+#define PS_FAR_AWAY    1
+#define PS_NEAR        0
+
+#define MULTI_OPEN_TEST     (0x80)
+#define MULTI_SHORT_TEST    (0x01)
+#define MULTI_SCAP_TEST        (0x02)
+
+
+
+enum work_mode{
+    NOMAL_MODE = 0,
+    GESTURE_MODE = 1,
+    LP_MODE = 2,
+    DEEPSLEEP = 3,
+    DIFF_MODE = 4,
+    RAWDATA_MODE = 5,
+    BASELINE_MODE = 6,
+    CALIBRATE_MODE = 7,
+    FAC_TEST_MODE = 8,
+    GLOVE_EXIT = 0x10,
+    GLOVE_ENTER = 0x11,
+    CHARGE_EXIT = 0x12,
+    CHARGE_ENTER = 0x13,
+    ENTER_BOOT_MODE = 0xCA,
+};
+
+enum report_typ{
+    REPORT_NONE = 0,
+    REPORT_POS = 0x01,
+    REPORT_KEY = 0x02,
+    REPORT_GES = 0x04,
+    REPORT_PROX = 0x08
+};
+
+enum fac_test_ero{
+    FAC_TEST_PASS = 0,
+    FAC_GET_DATA_FAIL = -1,
+    FAC_GET_CFG_FAIL = -4,
+    FAC_TEST_OPENL_FAIL = -5,
+    FAC_TEST_OPENH_FAIL = -7,
+    FAC_TEST_SHORT_FAIL = -6,
+    FAC_TEST_SCAP_FAIL = -8,
+};
+
+typedef enum {
+    CST92XX_POWERDOWN = 0,
+    CST92XX_POWERUP,
+} cst92xx_sw_power_status;
+
+
+enum ges_idx{
+    IDX_U = 0,
+    IDX_UP,
+    IDX_DOWN,
+    IDX_LEFT,
+    IDX_RIGHT,
+    IDX_O,
+    IDX_e,
+    IDX_M,
+    IDX_L,
+    IDX_W,
+    IDX_S,
+    IDX_V,
+    IDX_C,
+    IDX_Z,
+    IDX_POWER,
+    IDX_NULL = 0xFF,
+};
+
+
+struct hyn_plat_data {
+    int reset_gpio;
+    int irq_gpio;
+
+    uint32_t x_resolution;
+       uint32_t y_resolution;
+    int swap_xy;
+       int reverse_x;
+       int reverse_y;
+
+    int max_touch_num;
+    int key_num;
+       uint32_t  key_x_coords[8]; // max support 8 keys
+       uint32_t  key_y_coords;
+       uint32_t  key_code[8];
+};
+
+struct hyn_chip_series{
+    uint32_t part_no;
+    uint32_t moudle_id;
+    uint8_t chip_name[20];
+    uint8_t* fw_bin;
+};
+
+struct ts_frame{
+    uint8_t rep_num;
+    enum report_typ report_need;
+    uint8_t key_id;
+    uint8_t key_state;
+    struct {
+        uint8_t pos_id;
+        uint8_t event;
+        uint16_t pos_x;
+        uint16_t pos_y;
+        uint16_t pres_z;
+    }pos_info[MAX_POINTS_REPORT];
+};
+
+struct tp_info{
+    uint8_t  fw_sensor_txnum;
+    uint8_t  fw_sensor_rxnum;
+    uint8_t  fw_key_num;
+    uint8_t  reserve;
+    uint16_t fw_res_y;
+    uint16_t fw_res_x;
+    uint32_t fw_boot_time;
+    uint32_t fw_project_id;
+    uint32_t fw_chip_type;
+    uint32_t fw_ver;
+    uint32_t ic_fw_checksum;
+    uint32_t fw_module_id;
+};
+
+
+struct hyn_ts_data {
+    uint16_t bus_type;
+    uint8_t salve_addr;
+    int gpio_irq;
+    int esd_fail_cnt;
+    uint32_t esd_last_value;
+    enum work_mode work_mode;
+
+    int power_is_on;
+    uint8_t  hyn_irq_flg;
+    struct hyn_plat_data plat_data;
+    struct tp_info hw_info;
+    struct ts_frame rp_buf;
+
+    int boot_is_pass;
+    int need_updata_fw;
+    uint8_t fw_file_name[128];
+    uint8_t *fw_updata_addr;
+    int fw_updata_len;
+    int fw_dump_state;
+    uint8_t fw_updata_process;
+    uint8_t host_cmd_save[16];
+
+    uint8_t log_level;
+    uint8_t prox_is_enable;
+    uint8_t prox_state;
+    
+    uint8_t gesture_is_enable;
+    uint8_t gesture_id;
+    const struct hyn_ts_fuc *hyn_fuc_used;
+    uint8_t charge_is_enable;
+    uint8_t glove_is_enable;
+    input_event_info touch_msg;
+    int irq_cnt;
+};
+
+struct hyn_ts_fuc{
+    void (*tp_rest)(void);
+    int (*tp_report)(void);
+    int (*tp_supend)(void);
+    int (*tp_resum)(void);
+    int (*tp_chip_init)(struct hyn_ts_data *ts_data);
+    int (*tp_updata_fw)(uint8_t *bin_addr, uint16_t len);
+    int (*tp_set_workmode)(enum work_mode mode,uint8_t enable);
+    uint32_t (*tp_check_esd)(void);
+    int (*tp_prox_handle)(uint8_t cmd);
+    int (*tp_get_dbg_data)(uint8_t *buf,uint16_t len);
+    int (*tp_get_test_result)(uint8_t *buf,uint16_t len);
+};
+
+// void hyn_irq_set(struct hyn_ts_data *ts_data, uint8_t value);
+// void hyn_esdcheck_switch(struct hyn_ts_data *ts_data, uint8_t enable);
+// int copy_for_updata(struct hyn_ts_data *ts_data,uint8_t *buf,uint32_t offset,uint16_t len);
+
+// int hyn_wait_irq_timeout(struct hyn_ts_data *ts_data,int msec);
+// int factory_multitest(struct hyn_ts_data *ts_data ,char *cfg_path, uint8_t *data,s16 *test_th,uint8_t test_item);
+// int fac_test_log_save(char *log_name,struct hyn_ts_data *ts_data,s16 *test_data, int test_ret, uint8_t test_item);
+// uint16_t hyn_sum16(int val, uint8_t* buf,uint16_t len);
+// uint32_t hyn_sum32(int val, uint32_t* buf,uint16_t len);
+
+
+int cst92xx_init(struct hyn_ts_data* ts_data);
+int cst92xx_set_workmode(uint8_t mode,uint8_t enable);
+
+//ic type
+extern const struct hyn_ts_fuc cst1xx_fuc;
+extern const struct hyn_ts_fuc cst3xx_fuc;
+extern const struct hyn_ts_fuc cst66xx_fuc;
+extern const struct hyn_ts_fuc cst7xx_fuc;
+extern const struct hyn_ts_fuc cst8xxT_fuc;
+extern const struct hyn_ts_fuc cst92xx_fuc;
+extern const struct hyn_ts_fuc cst3240_fuc;
+extern const struct hyn_ts_fuc cst226se_fuc;
+
+#endif
index b0a5e6a..a8a8ac4 100644 (file)
@@ -24,6 +24,9 @@
 #elif defined(TPTYPE_CST86XX)\r
 #include "cst86xx_drv1.h"\r
 #include "cst86xx_ctrl.h"\r
+#elif defined(TPTYPE_CST92XX)\r
+#include "cst92xx_drv1.h"\r
+#include "cst92xx_ctrl.h"\r
 #else\r
 #include "ztw523_drv1.h"\r
 #include "ztw523_ctrl.h"\r
 #define TOUCH_I2C_BUS            CST86XX_I2C_BUS\r
 #define TOUCH_INT_GPIO           CST86XX_INT_GPIO\r
 #define TOUCH_RESET_GPIO         CST86XX_RESET_GPIO\r
+#elif defined(TPTYPE_CST92XX)\r
+#define TOUCH_I2C_BUS            CST92XX_I2C_BUS\r
+#define TOUCH_INT_GPIO           CST92XX_INT_GPIO\r
+#define TOUCH_RESET_GPIO         CST92XX_RESET_GPIO\r
 #else\r
 #define TOUCH_I2C_BUS            ZTW523_I2C_BUS\r
 #define TOUCH_INT_GPIO           ZTW523_INT_GPIO\r
@@ -469,6 +476,10 @@ void touch_screen_resume(void)
     touch_peripheral_api *touch_ptr = (touch_peripheral_api*)touch_screen_get_api();\r
     ext_errno ret = touch_ptr->touch_resume();\r
     if (ret != EXT_ERR_SUCCESS) { tp_err("touch resume ret=0x%x", ret); }\r
+#elif defined(TPTYPE_CST92XX)\r
+    touch_peripheral_api *touch_ptr = (touch_peripheral_api*)touch_screen_get_api();\r
+    ext_errno ret = touch_ptr->touch_resume();\r
+    if (ret != EXT_ERR_SUCCESS) { tp_err("touch resume ret=0x%x", ret); }\r
 #elif defined(TPTYPE_FT6X46)\r
     if( ft6x46_resume() != ERRCODE_SUCC)\r
     {\r
@@ -502,6 +513,10 @@ void touch_screen_restart(void)
     touch_peripheral_api *touch_ptr = (touch_peripheral_api*)touch_screen_get_api();\r
     ext_errno ret = touch_ptr->touch_resume();\r
     if (ret != EXT_ERR_SUCCESS) { tp_err("touch resume ret=0x%x", ret); }\r
+#elif defined(TPTYPE_CST92XX)\r
+    touch_peripheral_api *touch_ptr = (touch_peripheral_api*)touch_screen_get_api();\r
+    ext_errno ret = touch_ptr->touch_resume();\r
+    if (ret != EXT_ERR_SUCCESS) { tp_err("touch resume ret=0x%x", ret); }\r
 #elif defined(TPTYPE_FT6X46)\r
     ft6x46_resume();\r
 #else\r
index 46e4c29..ba9263c 100644 (file)
@@ -2,7 +2,7 @@
  * @Author: penglei 1624952103@qq.com\r
  * @Date: 2024-06-17 14:31:08\r
  * @LastEditors: penglei 1624952103@qq.com\r
- * @LastEditTime: 2025-11-02 10:40:05\r
+ * @LastEditTime: 2025-11-07 12:21:41\r
  * @FilePath: /FD230/code/sdk/application/wearable/service/factorytest_service/factorytest_protocol.c\r
  * @Description: \r
  * \r
@@ -39,7 +39,9 @@
 #endif\r
 #include "power_display_service.h"\r
 #include "efuse.h"\r
+#ifdef SUPPORT_MAG_SERVICE\r
 #include "mag_service.h"\r
+#endif\r
 #include "nandflash_config.h"\r
 #include "string.h"\r
 #include "custom_runtime.h"\r
@@ -599,12 +601,14 @@ void aging_task(void)
                 return;\r
             }\r
             uapi_get_timestampe_ss(&current_time);\r
+#ifdef SUPPORT_MAG_SERVICE\r
             do_mag_service_check_msg(MAG_SERVICE_CMD_START_CHECK);\r
             LOS_Msleep(1000);\r
-#ifdef SUPPORT_MAG_SERVICE\r
+\r
             mag_get_fAzimuth(&fAzimuth);\r
-#endif\r
+\r
             do_mag_service_check_msg(MAG_SERVICE_CMD_STOP_CHECK);\r
+#endif\r
             if(fAzimuth < 0)\r
             {\r
                 aging_t.mag_error++;\r