+++ /dev/null
-{
- "files.associations": {
- "*.def": "cpp",
- "limits": "cpp",
- "*.tcc": "cpp",
- "type_traits": "cpp",
- "iterator": "cpp",
- "pm_core.h": "c",
- "pm_veto.h": "c",
- "chip_io.h": "c",
- "pm.h": "c",
- "tyhx_hrv_alg.h": "c",
- "tyhx_hrs_custom.h": "c",
- "osal_timer.h": "c",
- "debug_print.h": "c",
- "platform_core.h": "c",
- "*.inc": "c",
- "ohosfwk_at_process.h": "c",
- "pm_clocks.h": "c",
- "pmu_cmu.h": "c",
- "pm_control.h": "c",
- "__functional_base": "c",
- "__functional_base_03": "c",
- "__hash_table": "c",
- "__tree": "c",
- "__tuple": "c",
- "algorithm": "c",
- "array": "c",
- "chrono": "c",
- "cstddef": "c",
- "filesystem": "c",
- "forward_list": "c",
- "functional": "c",
- "memory": "c",
- "random": "c",
- "ratio": "c",
- "tuple": "c",
- "utility": "c",
- "istream": "c",
- "ostream": "c",
- "soc_osal.h": "c",
- "lis2doc_reg.h": "c",
- "string.h": "c",
- "clocks_config_priv.h": "c",
- "lis2doc_at_cmd.h": "c",
- "customer.h": "c",
- "pinctrl.h": "c",
- "at_cmd_api.h": "c",
- "ios": "cpp",
- "vibrator.h": "c",
- "gpio_porting.h": "c",
- "arch.h": "c",
- "opt.h": "c",
- "debug.h": "c",
- "lwipopts.h": "c",
- "cc.h": "c",
- "sys_arch.h": "c",
- "nv_key.h": "c",
- "common.h": "c",
- "custom_utils.h": "c",
- "key_id.h": "c",
- "custom_utils_cmd.h": "c",
- "timer.h": "c",
- "future": "cpp",
- "__bit_reference": "c",
- "bitset": "c",
- "map": "c",
- "set": "c",
- "unordered_map": "c",
- "unordered_set": "c",
- "lis2doc_porting.h": "c",
- "acc_service.h": "c",
- "mmc5603.h": "c",
- "mag_service.h": "c",
- "mmc5603_hal.h": "c",
- "clocks_config.h": "c",
- "clocks_types.h": "c",
- "nandflash_w25n01g.h": "c",
- "nandflash_config.h": "c",
- "hal_nandflash.h": "c",
- "stddef.h": "c",
- "nandflash_f35uqa001g.h": "c",
- "alarmclocktimerconfig.h": "c",
- "board_w9.h": "c"
- }
-}
\ No newline at end of file
#include "ztw523_touch1.h"\r
#elif defined(TPTYPE_FT6X46)\r
#include "ft6x46_touch1.h"\r
+#elif defined(TPTYPE_CST86XX)\r
+#include "cst86xx_touch1.h"\r
#else\r
#include "ztw523_touch1.h"\r
#endif\r
ztw523_host_init_sample();\r
#elif defined(TPTYPE_FT6X46)\r
ft6x46_host_init_sample();\r
+#elif defined(TPTYPE_CST86XX)\r
+ cst86xx_host_init_sample();\r
#else\r
ztw523_host_init_sample();\r
#endif\r
'FT_SINGLE_UART',
'SUPPORT_AUTO_OTA_SERVER',
'CONFIG_DFX_SUPPORT_DIAG_UP_MACHINE=1',
- 'TPTYPE_FT6X46',
+ 'TPTYPE_CST86XX',
'NANDFLASH_F35UQA'
],
#添加自定义应用
'FT_SINGLE_UART',
'SUPPORT_AUTO_OTA_SERVER',
'CONFIG_DFX_SUPPORT_DIAG_UP_MACHINE=1',
- 'TPTYPE_FT6X46',
+ 'TPTYPE_CST86XX',
'NANDFLASH_F35UQA'
],
#添加自定义应用
#define FT6X46_INT_GPIO S_AGPIO_R5
#define FT6X46_RESET_GPIO S_AGPIO_R4
+#define CST86XX_I2C_BUS I2C_BUS_1
+#define CST86XX_INT_GPIO S_AGPIO_R5
+#define CST86XX_RESET_GPIO S_AGPIO_R4
+
+
// TRACK MODE
#define SND_TRACK_MODE_BT_MUSIC 0 // 参考 soc_uapi_sound.h 中 UAPI_SND_TRACK_STEREO 枚举
#define SND_TRACK_MODE_BT_SCO 1 // 参考 soc_uapi_sound.h 中 UAPI_SND_TRACK_DOUBLE_MONO 枚举
${CMAKE_CURRENT_SOURCE_DIR}/ft6x46_touch/ft6x46_drv1.c
${CMAKE_CURRENT_SOURCE_DIR}/ft6x46_touch/ft6x46_touch1.c
)
+elseif("TPTYPE_CST86XX" IN_LIST DEFINES)
+set(SOURCES ${SOURCES}
+ ${CMAKE_CURRENT_SOURCE_DIR}/cst86xx_touch/cst86xx_ctrl.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/cst86xx_touch/cst86xx_drv1.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/cst86xx_touch/cst86xx_touch1.c
+)
else()
set(SOURCES ${SOURCES}
${CMAKE_CURRENT_SOURCE_DIR}/ztw523_touch/ztw523_ctrl.c
${CMAKE_CURRENT_SOURCE_DIR}/ft6x46_touch
${ROOT_DIR}/middleware/services/gui/hal/input/include
)
+elseif("TPTYPE_CST86XX" IN_LIST DEFINES)
+set(PUBLIC_HEADER
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_SOURCE_DIR}/cst86xx_touch
+ ${ROOT_DIR}/middleware/services/gui/hal/input/include
+)
else()
set(PUBLIC_HEADER
${CMAKE_CURRENT_SOURCE_DIR}
--- /dev/null
+/*\r
+ * Copyright (c) @CompanyNameMagicTag 2021-2022. All rights reserved.\r
+ * Description: cst86xx touch driver.\r
+ * Author: @CompanyNameTag\r
+ * Create: 2022-04-12\r
+ */\r
+\r
+#include "cst86xx_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
+cst86xx_ctrl_attr g_ctrl_attr;\r
+touch_callback g_cst86xx_callback = NULL;\r
+static uint8_t g_tp_send_buf[CST86XX_REG_WRITE_LEN] = {0};\r
+static uint8_t g_tp_recv_buf[CST86XX_INPUT_SIZE] = {0};\r
+\r
+static void cst86xx_gpio_isr_handle(pin_t pin, uintptr_t param)\r
+{\r
+ unused(pin);\r
+ unused(param);\r
+ if (g_cst86xx_callback != NULL) {\r
+ g_cst86xx_callback();\r
+ }\r
+}\r
+\r
+ext_errno cst86xx_register_handle(const cst86xx_ctrl_ops *peri_data, touch_callback func)\r
+{\r
+ unused(peri_data);\r
+ ext_errno ret;\r
+\r
+ g_cst86xx_callback = func;\r
+ /* register int io interrupt handler */\r
+ uapi_gpio_init();\r
+ gpio_select_core(CST86XX_INT_GPIO, CORE);\r
+ uapi_gpio_set_dir(CST86XX_INT_GPIO, GPIO_DIRECTION_INPUT);\r
+ ret = uapi_gpio_register_isr_func(CST86XX_INT_GPIO, GPIO_INTERRUPT_FALLING_EDGE, cst86xx_gpio_isr_handle);\r
+ if (ret != 0) {\r
+ tp_err("cst86xx int callback register fail! ret=0x%x", ret);\r
+ return ret;\r
+ }\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno cst86xx_unregister_handle(const cst86xx_ctrl_ops *peri_data)\r
+{\r
+ unused(peri_data);\r
+ ext_errno ret;\r
+\r
+ /* unregister interrupt handler */\r
+ uapi_gpio_unregister_isr_func(CST86XX_INT_GPIO);\r
+ g_cst86xx_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 cst86xx_ctrl_attr_check(const cst86xx_ctrl_attr *device_attr)\r
+// {\r
+// unused(device_attr);\r
+// return EXT_ERR_SUCCESS;\r
+// }\r
+\r
+static ext_errno cst86xx_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 cst86xx_tp_i2c_data_read(uint16_t reg_addr, uint8_t *data_buf, uint32_t data_len)\r
+{\r
+ errcode_t ret;\r
+ uint32_t retry;\r
+ i2c_data_t data;\r
+\r
+ ret = cst86xx_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! ret=0x%x", ret);\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+ g_tp_send_buf[CST86XX_I2C_SEND_INDEX0] = reg_addr & 0xff;\r
+ data.send_buf = g_tp_send_buf;\r
+ data.send_len = CST86XX_CMD_SEND_LEN;\r
+ data.receive_buf = g_tp_recv_buf;\r
+ data.receive_len = data_len;\r
+ for (retry = 0; retry < CST86XX_I2C_TIME_MAX; retry++) {\r
+ ret = uapi_i2c_master_writeread(CST86XX_I2C_BUS, CST86XX_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 cst86xx_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[CST86XX_I2C_SEND_INDEX0] = cmd & 0xff;\r
+ data.send_buf = g_tp_send_buf;\r
+ data.send_len = CST86XX_CMD_SEND_LEN;\r
+ data.receive_buf = NULL;\r
+ data.receive_len = 0;\r
+\r
+ for (retry = 0; retry < CST86XX_I2C_TIME_MAX; retry++) {\r
+ ret = uapi_i2c_master_write(CST86XX_I2C_BUS, CST86XX_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 cst86xx_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[CST86XX_I2C_SEND_INDEX0] = reg_addr & 0xff;\r
+ \r
+ data.send_buf = g_tp_send_buf;\r
+ data.send_len = CST86XX_REG_WRITE_LEN;\r
+ data.receive_buf = NULL;\r
+ data.receive_len = 0;\r
+\r
+ for (retry = 0; retry < CST86XX_I2C_TIME_MAX; retry++) {\r
+ ret = uapi_i2c_master_write(CST86XX_I2C_BUS, CST86XX_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 cst86xx_tp_i2c_data_write(uint16_t reg_addr, 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 = cst86xx_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 + sizeof(uint16_t);\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
+ write_data[CST86XX_I2C_SEND_INDEX0] = reg_addr & 0xff;\r
+ ret = (uint32_t)memcpy_s(write_data + sizeof(uint16_t), send_len - sizeof(uint16_t), 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 < CST86XX_I2C_TIME_MAX; retry++) {\r
+ ret = uapi_i2c_master_write(CST86XX_I2C_BUS, CST86XX_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 cst86xx_host_peripheral_init(cst86xx_ctrl_attr *attr)\r
+{\r
+ ext_errno ret;\r
+\r
+ if (attr == NULL) {\r
+ tp_err("cst86xx communication interface cfg is empty!");\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+ // ret = cst86xx_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(cst86xx_ctrl_attr), attr, sizeof(cst86xx_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(CST86XX_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
+ CST86XX_I2C_BUS, 100000, CST86XX_I2C_ADDR);\r
+ g_host_dev_init_flag = true;\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno cst86xx_host_init_sample(void)\r
+{\r
+ ext_errno ret;\r
+ tp_warning("cst86xx_host_init_sample");\r
+ ret = cst86xx_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 = cst86xx_init();\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 cst86xx_reset(void)\r
+{\r
+ uapi_gpio_set_dir(CST86XX_RESET_GPIO, GPIO_DIRECTION_OUTPUT);\r
+ /* Config Gpio For Reset Pin */\r
+ uapi_gpio_set_val(CST86XX_RESET_GPIO, GPIO_LEVEL_HIGH);\r
+ /* reset high delay 20ms */\r
+ osDelay(1);\r
+ uapi_gpio_set_val(CST86XX_RESET_GPIO, GPIO_LEVEL_LOW);\r
+ /* reset low delay 100ms */\r
+ osDelay(10);\r
+ uapi_gpio_set_val(CST86XX_RESET_GPIO, GPIO_LEVEL_HIGH);\r
+ /* reset high delay 200ms */\r
+ osDelay(100);\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+void cst86xx_resume_reset(void)\r
+{\r
+ uapi_gpio_set_dir(CST86XX_RESET_GPIO, GPIO_DIRECTION_OUTPUT);\r
+ /* drvdata is global variable point and no need to handle null */\r
+ uapi_gpio_set_val(CST86XX_RESET_GPIO, GPIO_LEVEL_HIGH);\r
+ osDelay(1);\r
+ uapi_gpio_set_val(CST86XX_RESET_GPIO, GPIO_LEVEL_LOW);\r
+ /* delay 10ms */\r
+ osDelay(10);\r
+ uapi_gpio_set_val(CST86XX_RESET_GPIO, GPIO_LEVEL_HIGH);\r
+ /* delay 100ms */\r
+ osDelay(100);\r
+ // uapi_gpio_set_dir(CST86XX_RESET_GPIO, GPIO_DIRECTION_INPUT);\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) @CompanyNameMagicTag 2021-2022. All rights reserved.\r
+ * Description: cst86xx touch driver.\r
+ * Author: @CompanyNameTag\r
+ * Create: 2022-04-12\r
+ */\r
+\r
+#ifndef CST86XX_CTRL_H\r
+#define CST86XX_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 "cst86xx_touch1.h"\r
+\r
+\r
+\r
+//_TODO:\r
+#define CTP_USE_SW_I2C 0 //hard i2c:0 gpio i2c:1\r
+#define CTP_SLAVER_ADDR (0x2A) //(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 CST86XX_I2C_ADDR 0x15\r
+#define CST86XX_I2C_SPEED I2C_SPEED_MODE_SS\r
+#define CST86XX_REG_WRITE_LEN 2\r
+#define CST86XX_CMD_SEND_LEN 1\r
+#define CST86XX_REG_DATA_LEN 1\r
+#define CST86XX_I2C_TIME_MAX 3\r
+#define CST86XX_INPUT_SIZE 6\r
+#define CST86XX_I2C_SEND_INDEX0 0\r
+// #define CST86XX_I2C_SEND_INDEX1 1\r
+// #define CST86XX_I2C_SEND_INDEX2 2\r
+// #define CST86XX_I2C_SEND_INDEX3 3\r
+typedef struct {\r
+ uint32_t int_gpio;\r
+ i2c_bus_t i2c_id;\r
+ uint32_t i2c_speed;\r
+} cst86xx_ctrl_attr;\r
+\r
+typedef ext_errno (*cst86xx_bus_init)(cst86xx_ctrl_attr *attr);\r
+\r
+typedef struct {\r
+ cst86xx_ctrl_attr attr;\r
+ cst86xx_bus_init bus_init;\r
+} cst86xx_ctrl_ops;\r
+\r
+ext_errno cst86xx_host_peripheral_init(cst86xx_ctrl_attr *attr);\r
+ext_errno cst86xx_register_handle(const cst86xx_ctrl_ops *peri_data, touch_callback func);\r
+ext_errno cst86xx_unregister_handle(const cst86xx_ctrl_ops *peri_data);\r
+ext_errno cst86xx_reset(void);\r
+void cst86xx_resume_reset(void);\r
+void cst86xx_delay(uint32_t ms);\r
+\r
+ext_errno cst86xx_tp_i2c_data_read(uint16_t reg_addr, uint8_t *data_buf, uint32_t data_len);\r
+ext_errno cst86xx_tp_i2c_cmd_write(uint16_t cmd);\r
+ext_errno cst86xx_tp_i2c_reg_write(uint16_t reg_addr, uint16_t reg_cfg);\r
+ext_errno cst86xx_tp_i2c_data_write(uint16_t reg_addr, uint8_t *data_buf, uint32_t data_len);\r
+\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) @CompanyNameMagicTag 2021-2022. All rights reserved.\r
+ * Description: cst86xx touch driver.\r
+ * Author: @CompanyNameTag\r
+ * Create: 2022-04-12\r
+ */\r
+\r
+#include "cst86xx_drv1.h"\r
+#include "touch_screen_def.h"\r
+#include "cst86xx_ctrl.h"\r
+#include "i2c.h"\r
+#include "debug_print.h"\r
+#include "hal_i2c.h"\r
+\r
+static ext_errno cst86xx_drv_init(cst86xx_ctrl_ops *config)\r
+{\r
+ ext_errno ret;\r
+ cst86xx_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("CST86XX bus_init fail! ret = 0x%x", ret);\r
+ return ret;\r
+ }\r
+\r
+ ret = cst86xx_init();\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("CST86XX init fail! ret = 0x%x", ret);\r
+ return ret;\r
+ }\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static ext_errno cst86xx_drv_deinit(void)\r
+{\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static ext_errno cst86xx_drv_get_info(uint8_t *data, uint8_t data_len)\r
+{\r
+ return cst86xx_irq_callback(data, data_len);\r
+}\r
+\r
+static ext_errno cst86xx_drv_suspend(void)\r
+{\r
+ return cst86xx_set_power_mode(MC_TP_SUSPEND_SCAN);\r
+}\r
+\r
+static ext_errno cst86xx_drv_resume(void)\r
+{\r
+ return cst86xx_set_power_mode(MC_TP_RESUME_SCAN);\r
+}\r
+\r
+static ext_errno cst86xx_drv_sleep(void)\r
+{\r
+ return cst86xx_set_power_mode(MC_TP_SLEEP_WORK_MODE);\r
+}\r
+\r
+touch_peripheral_api g_cst86xx_api = {\r
+ .touch_init = cst86xx_drv_init,\r
+ .touch_deinit = cst86xx_drv_deinit,\r
+ .touch_get_tpinfo = cst86xx_drv_get_info,\r
+ .touch_suspend = cst86xx_drv_suspend,\r
+ .touch_resume = cst86xx_drv_resume,\r
+ .touch_sleep = cst86xx_drv_sleep,\r
+ .touch_bus_init = cst86xx_host_peripheral_init,\r
+ .register_callback = cst86xx_register_handle,\r
+ .unregister_callback = cst86xx_unregister_handle,\r
+};\r
+\r
+cst86xx_ctrl_ops g_cst86xx_ctrl = {\r
+ .attr = {\r
+ .int_gpio = CST86XX_INT_GPIO,\r
+ .i2c_id = CST86XX_I2C_BUS,\r
+ .i2c_speed = I2C_SPEED_MODE_SS,\r
+ },\r
+ .bus_init = (cst86xx_bus_init)cst86xx_host_peripheral_init,\r
+};\r
+\r
+void *touch_screen_get_api(void)\r
+{\r
+ return ((void *)&g_cst86xx_api);\r
+}\r
+\r
+void *touch_screen_get_peri_attr(void)\r
+{\r
+ return ((void *)&g_cst86xx_ctrl);\r
+}
\ No newline at end of file
--- /dev/null
+/*\r
+ * Copyright (c) @CompanyNameMagicTag 2021-2022. All rights reserved.\r
+ * Description: cst86xx touch driver.\r
+ * Author: @CompanyNameTag\r
+ * Create: 2022-04-12\r
+ */\r
+\r
+#ifndef CST86XX_DRV1_H\r
+#define CST86XX_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
--- /dev/null
+/*\r
+ * Copyright (c) @CompanyNameMagicTag 2021-2022. All rights reserved.\r
+ * Description: cst86xx touch driver.\r
+ * Author: @CompanyNameTag\r
+ * Create: 2021-05-29\r
+ */\r
+\r
+#include "cst86xx_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 "cst86xx_ctrl.h"\r
+#include "tcxo.h"\r
+#include "cmsis_os2.h"\r
+#include "common_def.h"\r
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+extern "C" {\r
+#endif\r
+#endif\r
+\r
+cst86xx_drv_data g_cst86xx_drv = {\r
+ .chip_status = CST86XX_NOT_READY,\r
+ .ops_mux = {0},\r
+ .int_mask = CST86XX_INT_MASK,\r
+ .work_status = CST86XX_WORK_INVALID,\r
+ .fw_upgrade_flag = TD_FALSE,\r
+ .gesture_wakeup = TD_FALSE,\r
+ .host_dev_init_flag = TD_FALSE,\r
+ .chip_info = CST86XX_DEVICE_INFO,\r
+ .p_void = NULL,\r
+};\r
+\r
+static ext_errno cst86xx_config(void);\r
+\r
+static ext_errno cst86xx_parse_input(void)\r
+{\r
+ static uint8_t touch_input[CST86XX_TOUCHINFO_LEN] = { 0 };\r
+ uint16_t touch_status;\r
+ uint16_t x_axis;\r
+ uint16_t y_axis;\r
+ uint8_t model;\r
+ static uint32_t point_count=0;\r
+\r
+ ext_errno ret = cst86xx_tp_i2c_data_read(CST86XX_POINT_STATUS_REG, touch_input, CST86XX_TOUCHINFO_LEN);\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("TOUCH:touch input read error! ret = 0x%x", ret);\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+ model = touch_input[1];\r
+ tp_print("TOUCH:ctp_get_data finger_num=%d", model);\r
+ /*\r
+ 0 fingure meas UP EVENT, so return FALSE;\r
+ And now we only support FIVE fingures at most, so if more than 5 fingures also return FALSE \r
+ */ \r
+ if (model > 2)\r
+ {\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+ \r
+ x_axis = (((uint16_t)(touch_input[2]&0x0f))<<8) | touch_input[3];\r
+ y_axis = (((uint16_t)(touch_input[4]&0x0f))<<8) | touch_input[5];\r
+ tp_print("TOUCH:finger[%d], x:%d, y:%d", model, x_axis, y_axis);\r
+ \r
+ if (model == 0)\r
+ {\r
+ g_cst86xx_drv.touch_msg.tp_event = MC_TP_RELEASE;\r
+ point_count=0;\r
+ }else{\r
+ if (point_count==0)\r
+ {\r
+ g_cst86xx_drv.touch_msg.tp_event = MC_TP_PRESS;\r
+ }else{\r
+ g_cst86xx_drv.touch_msg.tp_event = MC_TP_MOVE;\r
+ }\r
+ point_count++;\r
+ }\r
+ \r
+ g_cst86xx_drv.touch_msg.tp_event_info.x_axis[0] = x_axis;\r
+ g_cst86xx_drv.touch_msg.tp_event_info.y_axis[0] = y_axis;\r
+ g_cst86xx_drv.touch_msg.tv_usec = (uint32_t)uapi_tcxo_get_ms();\r
+ \r
+ // } else {\r
+ // g_cst86xx_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
+\r
+ext_errno cst86xx_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
+ if (g_cst86xx_drv.chip_status != CST86XX_READY) {\r
+ tp_warning("TOUCH: not ready skip read");\r
+ return EXT_ERR_SUCCESS;\r
+ }\r
+\r
+ g_cst86xx_drv.touch_msg.tp_event = MC_TP_INVALID;\r
+\r
+ if ((g_cst86xx_drv.work_status == CST86XX_WORK_NORMAL) || (g_cst86xx_drv.work_status == CST86XX_WORK_STANDBY)) {\r
+ g_cst86xx_drv.irq_count++;\r
+ ret = cst86xx_parse_input();\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ cst86xx_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), &(g_cst86xx_drv.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 cst86xx_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 = cst86xx_tp_i2c_data_read(CST86XX_FIRMWARE_VERSION, (uint8_t *)®_read, 1);\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+ g_cst86xx_drv.firmware_version = reg_read;\r
+\r
+ /* Read Minor Firmware Version */\r
+ reg_read = 0;\r
+ ret = cst86xx_tp_i2c_data_read(CST86XX_FACTORY_ID, (uint8_t *)®_read, 1);\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+ g_cst86xx_drv.vendor_id = reg_read;\r
+\r
+ /* Read Hw ID */\r
+ reg_read = 0;\r
+ ret = cst86xx_tp_i2c_data_read(CST86XX_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_cst86xx_drv.chip_id = reg_read;\r
+ tp_print("chip_id = 0x%x FW_ver = 0x%x factory_id = 0x%x",\r
+ g_cst86xx_drv.chip_id,\r
+ g_cst86xx_drv.firmware_version,\r
+ g_cst86xx_drv.vendor_id);\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static ext_errno cst86xx_suspend(void)\r
+{\r
+ ext_errno ret;\r
+ uint16_t reg_write;\r
+ uint8_t retry_times = 0;\r
+\r
+ if (g_cst86xx_drv.work_status == CST86XX_WORK_SLEEP) {\r
+ tp_print("TOUCH:alread suspend");\r
+ return EXT_ERR_SUCCESS;\r
+ }\r
+ \r
+ /* Send Sleep Cmd */\r
+ reg_write = CST86XX_SLEEP_CMD;\r
+ for (retry_times = 0; retry_times < CST86XX_INIT_RETRY_TIMERS; retry_times++) {\r
+ ret = cst86xx_tp_i2c_reg_write(CST86XX_SLEEP_CMD,0x03);\r
+ if (ret == EXT_ERR_SUCCESS) {\r
+ break;\r
+ }\r
+ osDelay(CST86XX_GENERAL_DELAY_10);\r
+ }\r
+ if (retry_times == CST86XX_INIT_RETRY_TIMERS) {\r
+ tp_err("suspend: overtimes %d", retry_times);\r
+ goto suspend_exit;\r
+ }\r
+ osDelay(CST86XX_GENERAL_DELAY_10);\r
+\r
+ g_cst86xx_drv.work_status = CST86XX_WORK_SLEEP;\r
+\r
+ return EXT_ERR_SUCCESS;\r
+\r
+suspend_exit:\r
+\r
+ tp_err("TOUCH:suspend failed 0x%x", ret);\r
+\r
+ return EXT_ERR_FAILURE;\r
+}\r
+\r
+ext_errno cst86xx_resume(void)\r
+{\r
+ ext_errno ret;\r
+ uint8_t retry_times = 0;\r
+\r
+ g_cst86xx_drv.work_status = CST86XX_WORK_RESUME;\r
+\r
+ for (; retry_times < CST86XX_INIT_RETRY_TIMERS; retry_times++) {\r
+ ret = cst86xx_config();\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("resume: post err %d", ret);\r
+ /* retry delay 200ms */\r
+ osDelay(CST86XX_GENERAL_DELAY_200);\r
+ } else {\r
+ break;\r
+ }\r
+ }\r
+\r
+ if (retry_times == CST86XX_INIT_RETRY_TIMERS) {\r
+ tp_err("resume: overtimes %d", retry_times);\r
+ goto resume_exit;\r
+ }\r
+\r
+ g_cst86xx_drv.work_status = CST86XX_WORK_NORMAL;\r
+\r
+ /* Enable Irq */\r
+ // cst86xx_set_irq_mode(CST86XX_IRQ_ENABLE, CST86XX_INT_MASK);\r
+\r
+ return EXT_ERR_SUCCESS;\r
+\r
+resume_exit:\r
+\r
+ /* Enable Irq */\r
+ // cst86xx_set_irq_mode(CST86XX_IRQ_DISABLE, CST86XX_INT_MASK);\r
+\r
+ tp_err("resume failed 0x%x", ret);\r
+\r
+ return EXT_ERR_FAILURE;\r
+}\r
+\r
+ext_errno cst86xx_get_power_mode(uint32_t *power_mode)\r
+{\r
+ if (power_mode == NULL) {\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+\r
+ *power_mode = (uint32_t)(g_cst86xx_drv.work_status);\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static ext_errno cst86xx_set_standby_mode(void)\r
+{\r
+ ext_errno ret;\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static ext_errno cst86xx_set_sleep_mode(void)\r
+{\r
+ ext_errno ret;\r
+\r
+ ret = cst86xx_suspend();\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("TOUCH:cst86xx set suspend fail 0x%x", ret);\r
+ }\r
+\r
+ g_cst86xx_drv.work_status = CST86XX_WORK_SLEEP;\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static ext_errno cst86xx_set_normal_mode(void)\r
+{\r
+ ext_errno ret;\r
+ uint16_t reg_write;\r
+\r
+ if (g_cst86xx_drv.work_status == CST86XX_WORK_NORMAL) {\r
+ return EXT_ERR_SUCCESS;\r
+ }\r
+\r
+ ret = cst86xx_config();\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+ // cst86xx_set_irq_mode(CST86XX_IRQ_ENABLE, CST86XX_INT_MASK);\r
+ g_cst86xx_drv.work_status = CST86XX_WORK_NORMAL;\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno cst86xx_set_power_mode(tp_work_mode power_mode)\r
+{\r
+ ext_errno ret = EXT_ERR_SUCCESS;\r
+\r
+ switch (power_mode) {\r
+ case MC_TP_SLEEP_WORK_MODE:\r
+ case MC_TP_SUSPEND_SCAN:\r
+ ret = cst86xx_set_sleep_mode();\r
+ break;\r
+ case MC_TP_NORMAL_WORK_MODE:\r
+ case MC_TP_RESUME_SCAN:\r
+ ret = cst86xx_set_normal_mode();\r
+ break;\r
+ case MC_TP_STANDBY_WORK_MODE:\r
+ ret = cst86xx_set_standby_mode();\r
+ break;\r
+ default:\r
+ tp_err("TOUCH:cst86xx not support powermode 0x%x", power_mode);\r
+ ret = EXT_ERR_FAILURE;\r
+ break;\r
+ }\r
+\r
+ return ret;\r
+}\r
+\r
+static ext_errno cst86xx_config(void)\r
+{\r
+ ext_errno ret;\r
+\r
+ /* Step 1 hardware reset */\r
+ ret = cst86xx_reset();\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("TOUCH:Init reset fail 0x%x", ret);\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+\r
+ /* Step 3 configuration */\r
+ ret = cst86xx_configuration();\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("TOUCH:init config fail 0x%x", ret);\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+\r
+ /* Record Status For Init */\r
+ g_cst86xx_drv.chip_status = CST86XX_READY;\r
+ g_cst86xx_drv.work_status = CST86XX_WORK_NORMAL;\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static ext_errno cst86xx_resource_deinit(void)\r
+{\r
+ g_cst86xx_drv.work_status = CST86XX_WORK_INVALID;\r
+ g_cst86xx_drv.fw_upgrade_flag = TD_FALSE;\r
+ osal_mutex_destroy(&g_cst86xx_drv.ops_mux);\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno cst86xx_init(void)\r
+{\r
+ ext_errno ret = EXT_ERR_FAILURE;\r
+ ext_errno err_ret;\r
+\r
+ /* create tp operation mutex */\r
+ if (g_cst86xx_drv.ops_mux.mutex == NULL) {\r
+ ret = osal_mutex_init(&(g_cst86xx_drv.ops_mux));\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("TOUCH:cst86xx init create mux lock fail 0x%x", ret);\r
+ return EXT_ERR_FAILURE;\r
+ }\r
+ }\r
+\r
+ /* get tp operater mutex */\r
+ ret = osal_mutex_lock_timeout(&g_cst86xx_drv.ops_mux, CST86XX_OPERATER_MUTEX_WAIT_TIME);\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("TOUCH:cst86xx init wait mux lock fail 0x%x", ret);\r
+ goto init_fail;\r
+ }\r
+\r
+ /* tp hardware reset and init */\r
+ ret = cst86xx_config();\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("TOUCH:cst86xx init fail 0x%x", ret);\r
+ goto init_fail;\r
+ }\r
+\r
+ /* release tp operater mutex */\r
+ osal_mutex_unlock(&g_cst86xx_drv.ops_mux);\r
+\r
+ tp_print("TOUCH:cst86xx init succ!");\r
+ return EXT_ERR_SUCCESS;\r
+\r
+init_fail:\r
+ /* release tp operater mutex */\r
+ osal_mutex_unlock(&g_cst86xx_drv.ops_mux);\r
+ err_ret = cst86xx_resource_deinit();\r
+ if (err_ret != EXT_ERR_SUCCESS) {\r
+ tp_err("TOUCH:delete mux lock err! ret = 0x%x", err_ret);\r
+ }\r
+ return ret;\r
+}\r
+\r
+ext_errno cst86xx_deinit(void)\r
+{\r
+ ext_errno ret = cst86xx_resource_deinit();\r
+ if (ret != EXT_ERR_SUCCESS) {\r
+ tp_err("TOUCH: cst86xx deinit fail! ret = 0x%x", ret);\r
+ return ret;\r
+ }\r
+\r
+ return EXT_ERR_SUCCESS;\r
+}\r
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+ }\r
+#endif\r
+#endif\r
--- /dev/null
+/*\r
+ * Copyright (c) @CompanyNameMagicTag 2021-2022. All rights reserved.\r
+ * Description: cst86xx touch driver.\r
+ * Author: @CompanyNameTag\r
+ * Create: 2021-05-29\r
+ */\r
+\r
+#ifndef CST86XX_TOUCH1_H\r
+#define CST86XX_TOUCH1_H\r
+\r
+#include "stdio.h"\r
+#include "soc_errno.h"\r
+#include "soc_osal.h"\r
+#include "touch_screen_def.h"\r
+#include "platform_core.h"\r
+\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+extern "C" {\r
+#endif\r
+#endif\r
+\r
+/* cst86xx definitions */\r
+/* max wait time */\r
+#define CST86XX_OPERATER_MUTEX_WAIT_TIME 3000 /* operater tp mutex timeout ms */\r
+#define CST86XX_CMCP_WAIT_TIMEOUT 1000\r
+/* define some properties value */\r
+#define CST86XX_ENABLE 0x0001\r
+#define CST86XX_DISABLE 0x0000\r
+#define CST86XX_DATA_LEN 2\r
+#define CST86XX_POWERON_DELAY 100\r
+#define CST86XX_POWEROFF_DELAY 100\r
+#define CST86XX_RESETHIGH_DELAY 10\r
+#define CST86XX_CLEARINT_DELAY 10\r
+#define CST86XX_FIRMWAREON_DELAY 200\r
+#define CST86XX_INIT_RETRY_TIMERS 3\r
+#define CST86XX_SETMODE_RETRY_TIMERS 3\r
+#define CST86XX_SOFTRESET_RETRY_TIMES 10\r
+#define CST86XX_RETRY_TIMES 10\r
+#define CST86XX_DEVICE_INFO "cst,cst86xx"\r
+#define CST86XX_DEVICE_INFO_SIZE sizeof(CST86XX_DEVICE_INFO)\r
+#define CST86XX_MAX_SUPPORTED_FINGER_NUM 1\r
+#define CST86XX_POINT_MODE 1\r
+#define CST86XX_CALIB_TOUCH_MODE 0x07\r
+#define CST86XX_REGDATA_SHIFT 8\r
+#define CST86XX_GENERAL_DELAY_1 1\r
+#define CST86XX_GENERAL_DELAY_5 5\r
+#define CST86XX_GENERAL_DELAY_10 10\r
+#define CST86XX_GENERAL_DELAY_20 20\r
+#define CST86XX_GENERAL_DELAY_25 25\r
+#define CST86XX_GENERAL_DELAY_30 30\r
+#define CST86XX_GENERAL_DELAY_50 50\r
+#define CST86XX_GENERAL_DELAY_100 100\r
+#define CST86XX_GENERAL_DELAY_200 200\r
+#define CST86XX_GENERAL_DELAY_500 500\r
+#define CST86XX_GENERAL_RETRY_1 1\r
+#define CST86XX_GENERAL_RETRY_2 2\r
+#define CST86XX_GENERAL_RETRY_3 3\r
+#define CST86XX_GENERAL_RETRY_4 4\r
+#define CST86XX_GENERAL_RETRY_10 10\r
+#define CST86XX_RAWDATA_DELAY_FOR_HOST 100\r
+#define CST86XX_FW_JUMP_CODE 0x0048\r
+#define CST86XX_REPORT_RATE 60\r
+#define CST86XX_PIXEL_THRESHOLD 5\r
+\r
+#ifndef CST86XX_RES_MAX_X\r
+#define CST86XX_RES_MAX_X 453\r
+#endif\r
+\r
+#ifndef CST86XX_RES_MAX_Y\r
+#define CST86XX_RES_MAX_Y 453\r
+#endif\r
+\r
+#ifndef CST86XX_POINT_TRESHHOLD\r
+#define CST86XX_POINT_TRESHHOLD 0x19\r
+#endif\r
+\r
+#define CST86XX_TOUCHINFO_LEN (6)\r
+\r
+#define CST86XX_INT_NONE 0x0000\r
+#define CST86XX_INT_MASK 0x081F\r
+#define CST86XX_PALM_MASK 0x0010\r
+#define CST86XX_FIRMWARE_SIZE 48\r
+#define ZTW_PAGE_SIZE_128 128\r
+#define ZTW_PAGE_SIZE_64 64\r
+#define ZTW_SECTOR_SIZE 8\r
+#define ZTW_CHIPID_F400 0xF400\r
+#define ZTW_CHIPID_E240 0xE240\r
+#define ZTW_CHIPID_E700 0xE700\r
+#define ZTW_CHIPID_E548 0xE548\r
+#define ZTW_CHIPID_E538 0xE538\r
+#define ZTW_CHIPID_E532 0xE532\r
+#define ZTW_VENDOR_ID 0x5A49\r
+#define CST86XX_CHIP_ID 0xE628\r
+/* define touch info offset */\r
+#define CST86XX_STATUSL_OFFSET 0\r
+#define CST86XX_STATUSH_OFFSET 1\r
+#define CST86XX_EVENTL_OFFSET 2\r
+#define CST86XX_EVENTH_OFFSET 3\r
+#define CST86XX_XL_OFFSET 4\r
+#define CST86XX_XH_OFFSET 5\r
+#define CST86XX_YL_OFFSET 6\r
+#define CST86XX_YH_OFFSET 7\r
+#define CST86XX_WIDTH_OFFSET 8\r
+#define CST86XX_SUBSTATUS_OFFSET 9\r
+/* define data shift and mask */\r
+#define CST86XX_SHIFT_8_BIT 8\r
+#define CST86XX_SHIFT_16_BIT 16\r
+#define CST86XX_SHIFT_24_BIT 24\r
+#define CST86XX_MASK_BYTE 0xFF\r
+/* define CST86XX_HIGH_SPEED_DMA rely on iic dma support */\r
+#ifdef CST86XX_HIGH_SPEED_DMA\r
+#define CST86XX_TOUCH_POINT_MODE 0\r
+#else\r
+#define CST86XX_TOUCH_POINT_MODE 1\r
+#endif\r
+\r
+#define CST86XX_SEC_MODE 48\r
+#define CST86XX_NORMAL_MODE 5\r
+#define CST86XX_DND_MODE 11 /* mutual cap */\r
+#define CST86XX_SELF_DND_MODE 17 /* self cap */\r
+#define CST86XX_DNDSKIP_CNT 1\r
+#define CST86XX_SELFDNDSKIP_CNT 1\r
+/* Config Reg Info */\r
+#define CST86XX_REG_CMD_ENABLE 0xC000\r
+#define CST86XX_REG_CHIP_ID 0xCC00\r
+#define CST86XX_REG_INTN_CLEAR 0xC004\r
+#define CST86XX_REG_NVM 0xC002\r
+#define CST86XX_REG_NVM_VPP 0xC003\r
+#define CST86XX_REG_NVM_WP 0xC104\r
+#define CST86XX_REG_PROGRAM_START 0xC001\r
+#define CST86XX_POWER_CTL_BEGIN 0x000A\r
+#define CST86XX_POWER_CTL_END 0x000B\r
+#define CST86XX_CALIB_CTL1 0xC003\r
+#define CST86XX_CALIB_CTL2 0xC104\r
+#define CST86XX_SDRAM_RESET 0x0FF8\r
+#define CST86XX_REPORT_REG 0x0186 /* 设置中断上报频率 */\r
+#define CST86XX_PIXEL_THRESHOLD_REG 0x00C3\r
+/* Register Map */\r
+#define CST86XX_SLEEP_CMD 0xA5\r
+#define CST86XX_FIRMWARE_VERSION 0xA9\r
+#define CST86XX_FACTORY_ID 0xAA\r
+#define CST86XX_HW_ID 0xA7\r
+#define CST86XX_POINT_STATUS_REG 0x01\r
+\r
+#ifndef CST86XX_TSP_X_CHANNEL_NUM\r
+#define CST86XX_TSP_X_CHANNEL_NUM 6\r
+#endif\r
+\r
+#ifndef CST86XX_TSP_Y_CHANNEL_NUM\r
+#define CST86XX_TSP_Y_CHANNEL_NUM 6\r
+#endif\r
+\r
+#define CST86XX_TSP_DND_NUM (CST86XX_TSP_X_CHANNEL_NUM * CST86XX_TSP_Y_CHANNEL_NUM)\r
+#define CST86XX_TSP_SELFDND_NUM (CST86XX_TSP_X_CHANNEL_NUM + CST86XX_TSP_Y_CHANNEL_NUM)\r
+\r
+/* firmware info */\r
+#define CST86XX_FIRMWARE_VERSION_L 0\r
+#define CST86XX_FIRMWARE_VERSION_H 1\r
+#define CST86XX_FIRMWARE_VERSION_OFFSET 52\r
+#define CST86XX_FIRMWARE_MINOR_VERSION_OFFSET 56\r
+#define CST86XX_FIRMWARE_DATA_VERSION_OFFSET 60\r
+#define CST86XX_FIRMWARE_OFFSET_ZERO 0\r
+#define CST86XX_FIRMWARE_CONVERT_DATA_STEP 2\r
+#define CST86XX_FIRMWARE_CONVERT_DATA_OFFSET 1\r
+/* file op code */\r
+#define CST86XX_FILE_ERROR (-1)\r
+#define CST86XX_FILE_OK 0\r
+/* upgrade info */\r
+#define CST86XX_FWGRADE_CMD_NUM 3\r
+/* rawdata info */\r
+#define CST86XX_RAWDATA_CMD_NUM 2\r
+\r
+/* self_dnd dnd parameter */\r
+#define CST86XX_SEC_SELF_DND_N_COUNT 15\r
+#define CST86XX_SEC_SELF_DND_U_COUNT 2\r
+#define CST86XX_SEC_SELF_DND_FREQUENCY 80\r
+\r
+#define CST86XX_SEC_DND_N_COUNT 27\r
+#define CST86XX_SEC_DND_U_COUNT 3\r
+#define CST86XX_SEC_DND_FREQUENCY 240\r
+\r
+/* host peripheral typedef */\r
+typedef ext_errno (*tp_irq_callback)(void);\r
+\r
+/* CST86XX driver typedef */\r
+typedef enum {\r
+ CST86XX_POWERDOWN = 0,\r
+ CST86XX_POWERUP,\r
+} cst86xx_sw_power_status;\r
+\r
+typedef enum {\r
+ CST86XX_WORK_NORMAL = 0,\r
+ CST86XX_WORK_STANDBY,\r
+ CST86XX_WORK_GETCMCP,\r
+ CST86XX_WORK_SLEEP,\r
+ CST86XX_WORK_SUSPEND,\r
+ CST86XX_WORK_RESUME,\r
+ CST86XX_WORK_INVALID,\r
+} cst86xx_work_status;\r
+\r
+typedef enum {\r
+ CST86XX_NOT_READY = 0,\r
+ CST86XX_READY,\r
+} cst86xx_device_status;\r
+\r
+typedef enum {\r
+ MC_BUTTON_RELEASE = 0, /* button release */\r
+ MC_BUTTON_PRESSED = 1, /* button pressed */\r
+} button_event_type;\r
+\r
+typedef enum {\r
+ MC_TOUCHKEY_EVENT_PRESS = 0,\r
+ MC_TOUCHKEY_EVENT_RELASSE,\r
+ MC_TOUCHKEY_EVENT_LONG_PRESS,\r
+ MC_TOUCHKEY_EVENT_INVALID,\r
+} touch_key_event_type;\r
+\r
+typedef enum {\r
+ CST86XX_GESTURE_NONE = 0,\r
+ CST86XX_GESTURE_SIGNAL_CLICK = 1,\r
+ CST86XX_GESTURE_DOUBLE_CLICK = 2,\r
+ CST86XX_GESTURE_SLIDE_UP = 4,\r
+ CST86XX_GESTURE_SLIDE_DOWN = 5,\r
+} cst86xx_gesture_event;\r
+\r
+typedef enum {\r
+ CST86XX_IRQ_DISABLE = 0,\r
+ CST86XX_IRQ_ENABLE,\r
+} cst86xx_irq_status;\r
+\r
+typedef enum {\r
+ MC_TP_NORMAL_WORK_MODE = 0, /* tp normal mode */\r
+ MC_TP_STANDBY_WORK_MODE, /* tp idle mode */\r
+ MC_TP_BOOTLOADER_WORK_MODE,\r
+ MC_TP_SLEEP_WORK_MODE,\r
+ MC_TP_SUSPEND_SCAN,\r
+ MC_TP_RESUME_SCAN,\r
+ MC_TP_MAX_MODE,\r
+} tp_work_mode;\r
+\r
+typedef enum {\r
+ MC_TP_UPGRADE_NEED_FLAG,\r
+ MC_TP_UPGRADE_START_ASYN,\r
+ MC_TP_UPGRADE_STATUS,\r
+ MC_TP_UPGRADE_SYNC,\r
+} mc_tp_upgrade;\r
+\r
+typedef struct {\r
+ uint32_t reset_gpio;\r
+ uint32_t int_gpio;\r
+ i2c_bus_t i2c_id;\r
+ uint32_t i2c_baudrate;\r
+} tp_peripheral_attr;\r
+\r
+typedef struct {\r
+ uint16_t button_code;\r
+} button_dev_info;\r
+\r
+typedef struct {\r
+ uint16_t xchannel_num;\r
+ uint16_t ychannel_num;\r
+ uint16_t total_dnd_num;\r
+ uint16_t total_self_dnd_num;\r
+} cst86xx_panel_data;\r
+\r
+typedef struct {\r
+ uint32_t skip_cnt;\r
+ int16_t dnd_data[CST86XX_TSP_DND_NUM];\r
+ int16_t self_dnd_data[CST86XX_TSP_SELFDND_NUM];\r
+} cst86xx_tsp_rawdata;\r
+\r
+typedef enum {\r
+ MC_TP_RAW_DATA,\r
+ MC_TP_BASE_DATA,\r
+ MC_TP_NOS_DATA,\r
+ MC_TP_SIG_DATA,\r
+ MC_TP_FT_DATA,\r
+ MC_TP_NT_DATA,\r
+ MC_TP_MAX_DATA,\r
+ MC_TP_CM_CP_DATA, /* 7, CM CP data */\r
+ MC_TP_INT_COUNT_DATA, /* 8, TP Int count */\r
+ MC_TP_NOISE_METRICS_DATA,\r
+ MC_TP_DATA_STRUCTURE_DATA,\r
+ MC_TP_PANEL_SCAN_CM_DATA,\r
+ MC_TP_PANEL_SCAN_CP_DATA,\r
+ MC_TP_START_RAW_TRANS,\r
+ MC_TP_STOP_RAW_TRANS,\r
+ MC_TP_START_GET_WATER_TEMPR, /* 15, start get and print water level and temprature */\r
+ MC_TP_STOP_GET_WATER_TEMPR, /* 16, stop get and print water level and temprature */\r
+ MC_TP_RAW_MAX,\r
+} mc_tp_rawdata;\r
+\r
+typedef struct {\r
+ mc_tp_rawdata cmd;\r
+ uint8_t *data_buf;\r
+ uint8_t data_in_len;\r
+ uint32_t data_out_len;\r
+ uint32_t data_addr;\r
+} touch_rawdata_info;\r
+\r
+/* define for drv process talbe */\r
+typedef ext_errno (*touch_drv_upgrade_handle)(uint8_t *data_buff, uint8_t buf_len);\r
+typedef struct {\r
+ mc_tp_upgrade cmd_id;\r
+ touch_drv_upgrade_handle process_cb;\r
+} touch_drv_upgrade_proc;\r
+\r
+typedef ext_errno (*touch_hal_rawdata_handle)(uint8_t *data_buf, uint8_t buf_len);\r
+typedef struct {\r
+ mc_tp_rawdata cmd_id;\r
+ touch_hal_rawdata_handle process_cb;\r
+} touch_drv_rawdata_proc;\r
+\r
+typedef struct {\r
+ uint16_t chip_id;\r
+ uint16_t vendor_id;\r
+ uint16_t chip_hw_id;\r
+ uint8_t chip_info[CST86XX_DEVICE_INFO_SIZE];\r
+ uint16_t firmware_version;\r
+ uint16_t minor_firmware_version;\r
+ uint16_t reg_version;\r
+ uint32_t flash_fw_version;\r
+ uint16_t int_mask;\r
+ uint16_t touch_mode;\r
+ uint32_t irq_count;\r
+ uint32_t touch_count;\r
+ uint32_t page_size;\r
+ uint16_t header_size;\r
+ uint16_t image_size;\r
+ osal_mutex ops_mux;\r
+ bool fw_upgrade_flag;\r
+ bool gesture_wakeup;\r
+ bool host_dev_init_flag;\r
+ cst86xx_sw_power_status power_status;\r
+ cst86xx_work_status work_status;\r
+ cst86xx_sw_power_status chip_sw_power_status;\r
+ cst86xx_device_status chip_status;\r
+ input_event_info touch_msg;\r
+ cst86xx_panel_data panel_info;\r
+ tp_peripheral_attr dev_attr;\r
+ void *p_void;\r
+ uint32_t tp_event;\r
+} cst86xx_drv_data;\r
+\r
+ext_errno cst86xx_init(void);\r
+ext_errno cst86xx_deinit(void);\r
+ext_errno cst86xx_set_power_mode(tp_work_mode power_mode);\r
+ext_errno cst86xx_get_power_mode(uint32_t *power_mode);\r
+ext_errno cst86xx_resume(void);\r
+ext_errno cst86xx_irq_callback(uint8_t *data_buf, uint8_t data_len);\r
+ext_errno cst86xx_host_init_sample(void);\r
+#ifdef __cplusplus\r
+#if __cplusplus\r
+ }\r
+#endif\r
+#endif\r
+\r
+#endif\r
return EXT_ERR_SUCCESS;
}
-static ext_errno ft6x46_configuration(void)
-{
- ext_errno ret;
- uint8_t retry_times = 0;
- uint16_t reg_read;
- uint16_t reg_write;
-
- /* Software Reset */
- reg_write = FT6X46_SWRESET_CMD;
- for (retry_times = 0; retry_times < FT6X46_RETRY_TIMES; retry_times++) {
- ret = tp_i2c_cmd_write(reg_write);
- if (ret == EXT_ERR_SUCCESS) {
- break;
- }
- osDelay(FT6X46_RESETHIGH_DELAY);
- }
-
- if (retry_times >= FT6X46_RETRY_TIMES) {
- tp_err("TOUCH:configuration sw reset fail! ret = 0x%x", ret);
- return EXT_ERR_TP_ZTW523_CONFIG_RESET;
- }
-
- /* Read Firmware Version */
- reg_read = 0;
- ret = tp_i2c_data_read(FT6X46_FIRMWARE_VERSION, (uint8_t *)®_read, FT6X46_DATA_LEN);
- if (ret != EXT_ERR_SUCCESS) {
- return EXT_ERR_TP_ZTW523_CONFIG_READ_FWVERSION;
- }
- g_ft6x46_drv.firmware_version = reg_read;
-
- /* Read Minor Firmware Version */
- reg_read = 0;
- ret = tp_i2c_data_read(FT6X46_MINOR_FW_VERSION, (uint8_t *)®_read, FT6X46_DATA_LEN);
- if (ret != EXT_ERR_SUCCESS) {
- return EXT_ERR_TP_ZTW523_CONFIG_READ_FWMINORVERSION;
- }
- g_ft6x46_drv.minor_firmware_version = reg_read;
-
- /* Read Hw ID */
- reg_read = 0;
- ret = tp_i2c_data_read(FT6X46_HW_ID, (uint8_t *)®_read, FT6X46_DATA_LEN);
- if (ret != EXT_ERR_SUCCESS) {
- tp_err("configuration error (read hw id) 0x%x", ret);
- return EXT_ERR_TP_ZTW523_GET_HWID_READ_ID;
- }
- g_ft6x46_drv.chip_hw_id = reg_read;
-
- /* Read Register Version */
- reg_read = 0;
- ret = tp_i2c_data_read(FT6X46_DATA_VERSION_REG, (uint8_t *)®_read, FT6X46_DATA_LEN);
- if (ret != EXT_ERR_SUCCESS) {
- return EXT_ERR_TP_ZTW523_CONFIG_READ_DATAREG;
- }
- g_ft6x46_drv.reg_version = reg_read;
-
- ret = ft6x46_reg_config();
- if (ret != EXT_ERR_SUCCESS) {
- return ret;
- }
-
- /* Write Clear Int Cmd */
- ft6x46_clear_interrupt(FT6X46_RETRY_TIMES, FT6X46_GENERAL_DELAY_1);
-
- return EXT_ERR_SUCCESS;
-}
-
-static ext_errno ft6x46_get_panel_info(void)
-{
- ext_errno ret;
- uint16_t reg_read = 0;
- /* Read X Channel Num */
- ret = tp_i2c_data_read(FT6X46_TOTAL_NUMBER_OF_X, (uint8_t *)®_read, FT6X46_DATA_LEN);
- if (ret != EXT_ERR_SUCCESS) {
- tp_err("TOUCH:GetPanelInfo error read x channel 0x%x", ret);
- return EXT_ERR_FAILURE;
- }
-
- g_ft6x46_drv.panel_info.xchannel_num = reg_read;
- /* Read Y Channel Num */
- reg_read = 0;
- ret = tp_i2c_data_read(FT6X46_TOTAL_NUMBER_OF_Y, (uint8_t *)®_read, FT6X46_DATA_LEN);
- if (ret != EXT_ERR_SUCCESS) {
- tp_err("TOUCH:GetPanelInfo error read y channel 0x%x", ret);
- return EXT_ERR_FAILURE;
- }
-
- g_ft6x46_drv.panel_info.ychannel_num = reg_read;
- g_ft6x46_drv.panel_info.total_dnd_num =
- g_ft6x46_drv.panel_info.xchannel_num * g_ft6x46_drv.panel_info.ychannel_num;
- g_ft6x46_drv.panel_info.total_self_dnd_num =
- g_ft6x46_drv.panel_info.xchannel_num + g_ft6x46_drv.panel_info.ychannel_num;
-
- return EXT_ERR_SUCCESS;
-}
-
static ext_errno ft6x46_standby(void)
{
ext_errno ret;
return EXT_ERR_SUCCESS;
}
-static ext_errno ft6x46_resume_post(void)
-{
- ext_errno ret;
- // uint16_t reg_write;
- // uint16_t cmd_write;
-
- // reg_write = FT6X46_ENABLE;
- // ret = tp_i2c_reg_write(FT6X46_REG_CMD_ENABLE, reg_write);
- // if (ret != EXT_ERR_SUCCESS) {
- // tp_err("resume post reg cmd failed 0x%x", ret);
- // return EXT_ERR_FAILURE;
- // }
- // /* delay for ms */
- // osDelay(FT6X46_GENERAL_DELAY_1);
-
- // cmd_write = FT6X46_REG_INTN_CLEAR;
- // ret = tp_i2c_cmd_write(cmd_write);
- // if (ret != EXT_ERR_SUCCESS) {
- // return EXT_ERR_TP_ZTW523_POWERUP_INTN_CLEAR;
- // }
- // osDelay(FT6X46_GENERAL_DELAY_1);
-
- // reg_write = FT6X46_ENABLE;
- // ret = tp_i2c_reg_write(FT6X46_REG_NVM, reg_write);
- // if (ret != EXT_ERR_SUCCESS) {
- // tp_err("resume post reg nvm failed 0x%x", ret);
- // return EXT_ERR_FAILURE;
- // }
- // osDelay(FT6X46_GENERAL_DELAY_1);
-
- // reg_write = FT6X46_ENABLE;
- // ret = tp_i2c_reg_write(FT6X46_REG_PROGRAM_START, reg_write);
- // if (ret != EXT_ERR_SUCCESS) {
- // tp_err("resume post reg program start failed 0x%x", ret);
- // return EXT_ERR_FAILURE;
- // }
-
- // osDelay(FT6X46_GENERAL_DELAY_50); /* delay 50 ms */
-
- return EXT_ERR_SUCCESS;
-}
ext_errno ft6x46_resume(void)
{
ext_errno ret;
ft6x46_resume_reset();
- // for (; retry_times < FT6X46_INIT_RETRY_TIMERS; retry_times++) {
- // ret = ft6x46_resume_post();
- // if (ret != EXT_ERR_SUCCESS) {
- // tp_err("resume: post err %d", ret);
- // /* retry delay 200ms */
- // osDelay(FT6X46_GENERAL_DELAY_200);
- // } else {
- // break;
- // }
- // }
-
- // if (retry_times == FT6X46_INIT_RETRY_TIMERS) {
- // tp_err("resume: overtimes %d", retry_times);
- // goto resume_exit;
- // }
ret = ft6x46_config();
if (ret != EXT_ERR_SUCCESS) {
tp_err("TOUCH:ft6x46 init fail 0x%x", ret);
goto resume_exit;
}
- // ret = ft6x46_configuration();
- // if (ret != EXT_ERR_SUCCESS) {
- // tp_err("TOUCH:resume config fail 0x%x", ret);
- // return EXT_ERR_TP_ZTW523_INIT_CONFIG;
- // }
+
g_ft6x46_drv.work_status = FT6X46_WORK_NORMAL;
#ifdef FT6X46_GESTURE_WAKEUP
#elif defined(TPTYPE_FT6X46)\r
#include "ft6x46_drv1.h"\r
#include "ft6x46_ctrl.h"\r
+#elif defined(TPTYPE_CST86XX)\r
+#include "cst86xx_drv1.h"\r
+#include "cst86xx_ctrl.h"\r
#else\r
#include "ztw523_drv1.h"\r
#include "ztw523_ctrl.h"\r
#define TOUCH_I2C_BUS FT6X46_I2C_BUS\r
#define TOUCH_INT_GPIO FT6X46_INT_GPIO\r
#define TOUCH_RESET_GPIO FT6X46_RESET_GPIO\r
+#elif defined(TPTYPE_CST86XX)\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
#else\r
#define TOUCH_I2C_BUS ZTW523_I2C_BUS\r
#define TOUCH_INT_GPIO ZTW523_INT_GPIO\r
if (ret != EXT_ERR_SUCCESS) { tp_err("touch resume ret=0x%x", ret); }\r
#elif defined(TPTYPE_ZTW523)\r
ztw523_resume();\r
+#elif defined(TPTYPE_CST86XX)\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
tma525b_resume();\r
#elif defined(TPTYPE_ZTW523)\r
ztw523_resume();\r
+#elif defined(TPTYPE_CST86XX)\r
+ cst86xx_resume();\r
#elif defined(TPTYPE_FT6X46)\r
ft6x46_resume();\r
#else\r