fd230 driver patch for sdk602 , 2024-5-3 121/1 121/head 125/target/1
authorSnickerSun <snickersun@163.com>
Fri, 3 May 2024 09:11:44 +0000 (17:11 +0800)
committerSnickerSun <snickersun@163.com>
Fri, 3 May 2024 09:11:44 +0000 (17:11 +0800)
22 files changed:
fd230_driver_patch/20240503.170906/code/sdk/application/audio/vendor/CMakeLists.txt [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/application/audio/vendor/aw88166/aw88166.c [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/application/brandy/brandy_standard/thread_pri_init.c [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/src/RebootPresenter.cpp [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/build/config/target_config/brandy/config.py [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/drivers/boards/brandy_evb/board_config/board_evb.h [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/drivers/boards/brandy_evb/product/product_evb4_standard.h [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/drivers/chips/brandy/porting/uart/uart_porting.c [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/lcd/lcd_config.c [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/lcd/lcd_private.c [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/lcd/soc_lcd_api.c [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/CMakeLists.txt [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_ctrl.c [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_ctrl.h [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_drv1.c [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_drv1.h [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_touch1.c [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_touch1.h [new file with mode: 0644]
fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/touch_screen_drv.c [new file with mode: 0644]
fd230_driver_patch/20240503.170906/diff/commit.txt [new file with mode: 0644]
fd230_driver_patch/20240503.170906/diff/local_diff_patch.txt [new file with mode: 0644]
fd230_driver_patch/20240503.170906/diff/modified_or_new_files.txt [new file with mode: 0644]

diff --git a/fd230_driver_patch/20240503.170906/code/sdk/application/audio/vendor/CMakeLists.txt b/fd230_driver_patch/20240503.170906/code/sdk/application/audio/vendor/CMakeLists.txt
new file mode 100644 (file)
index 0000000..c1c3196
--- /dev/null
@@ -0,0 +1,72 @@
+#[[\r
+Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
+Description: CMake audio sample module.\r
+Author: audio\r
+Create: 2023-06-09\r
+]]\r
+\r
+set(SAP_TOP_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../drivers/drivers/driver/audio/source)\r
+#===================================================================================\r
+include(${SAP_TOP_DIR}/build/cmake/audio_config.cmake)\r
+#===================================================================================\r
+set(COMPONENT_NAME audio_vendor)\r
+set(MODULE_NAME "dsp")\r
+set(AUTO_DEF_FILE_ID TRUE)\r
+#===================================================================================\r
+set(COMPONENT_SRC )\r
+#===================================================================================\r
+set(COMPONENT_INC\r
+    ${SAP_UAPI_DIR}\r
+    ${SAP_TOP_DIR}/include\r
+    ${SAP_TOP_DIR}/drv/vendor\r
+    ${SAP_TOP_DIR}/drv/include\r
+    ${SAP_TOP_DIR}/drv/common/include\r
+    ${SAP_TOP_DIR}/drv/arch/include\r
+    ${SAP_TOP_DIR}/drv/arch/${CFG_SAP_CHIP_TYPE}/include\r
+    ${SAP_TOP_DIR}/core/include\r
+    ${SAP_TOP_DIR}/core/common/include\r
+    ${SAP_TOP_DIR}/core/arch/${CFG_SAP_CHIP_TYPE}/include\r
+    ${CMAKE_CURRENT_SOURCE_DIR}\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/common\r
+)\r
+#===================================================================================\r
+if("${CFG_SAP_VENDOR_DRIVER_AW88262_SUPPORT}" STREQUAL "y")\r
+set(COMPONENT_SRC ${COMPONENT_SRC}\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/aw88262/aw88262.c\r
+)\r
+set(COMPONENT_INC ${COMPONENT_INC}\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/aw88262\r
+)\r
+endif()\r
+\r
+if("${CFG_SAP_VENDOR_DRIVER_AW88166_SUPPORT}" STREQUAL "y")\r
+set(COMPONENT_SRC ${COMPONENT_SRC}\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166/aw88166.c\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166/aw883xx.c\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166/aw883xx_calib.c\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166/aw883xx_device.c\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166/product_init_files/aw88166/aw883xx_pid_2066_init.c\r
+)\r
+set(COMPONENT_INC ${COMPONENT_INC}\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166/product_init_files/aw88166\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166/config/aw88166/mono/16bit\r
+)\r
+endif()\r
+\r
+if("${CFG_SAP_VENDOR_DRIVER_ANC_CODEC_SUPPORT}" STREQUAL "y")\r
+set(COMPONENT_SRC ${COMPONENT_SRC}\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/anc_codec/anc_codec.c\r
+)\r
+set(COMPONENT_INC ${COMPONENT_INC}\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/anc_codec\r
+    ${CMAKE_CURRENT_SOURCE_DIR}/anc_codec/sai01_dac_32.768k\r
+)\r
+endif()\r
+#===================================================================================\r
+set(COMPONENT_DEF\r
+    "SAP_PROC_SUPPORT"\r
+)\r
+#===================================================================================\r
+include(${SAP_TOP_DIR}/build/cmake/audio_common.cmake)\r
+install_sdk(${CMAKE_CURRENT_SOURCE_DIR}/aw88166 "*")\r
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/application/audio/vendor/aw88166/aw88166.c b/fd230_driver_patch/20240503.170906/code/sdk/application/audio/vendor/aw88166/aw88166.c
new file mode 100644 (file)
index 0000000..a0f2d29
--- /dev/null
@@ -0,0 +1,278 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2023-2023. All rights reserved.\r
+ * Description: source file for aw88166 driver\r
+ */\r
+\r
+#include <stdio.h>\r
+#include "soc_osal.h"\r
+#include "audio_debug.h"\r
+#include "gpio.h"\r
+#include "hal_gpio.h"\r
+#include "i2c.h"\r
+#include "pinctrl.h"\r
+#include "vendor_common.h"\r
+#include "soc_uapi_vendor.h"\r
+\r
+#include "aw883xx_init.h"\r
+#include "aw883xx.h"\r
+#include "aw_params.h"\r
+\r
+static td_bool g_aw88166_i2c_inited = TD_FALSE;\r
+\r
+#define AW88166_PWR_ON_PIN   S_AGPIO_L25\r
+#define AW88166_I2C_BUS_ID   I2C_BUS_3\r
+#define AW88166_I2C_DEV_ADDR 0x34\r
+\r
+static td_s32 aw_dev0_i2c_write_func(td_u16 dev_addr, td_u8 reg_addr, td_u8 *pdata, td_u16 len)\r
+{\r
+    td_s32 ret;\r
+    i2c_data_t data;\r
+    const td_u8 reg_addr_len = sizeof(reg_addr); /* data len of reg_addr */\r
+    const td_u8 send_len = len + reg_addr_len; /* pdata bytes && reg_addr len */\r
+    td_u8 *send_data = osal_kmalloc_align(send_len, 0, 8); /* 8 : Align up to 8 bytes */\r
+\r
+    if (send_data == TD_NULL) {\r
+        ret = -1; /* -1:FAILED ERR CODE */\r
+        vendor_log_fun_err(malloc, ret);\r
+        return ret;\r
+    }\r
+\r
+    /* pack reg addr & reg data */\r
+    *send_data = reg_addr; /* reg_addr */\r
+    ret = memcpy_s(send_data + reg_addr_len, (send_len - reg_addr_len), pdata, len); /* pdata */\r
+    if (ret != EOK) {\r
+        vendor_log_fun_err(memcpy_s, ret);\r
+        goto out;\r
+    }\r
+\r
+    data.send_buf = send_data;\r
+    data.send_len = send_len;\r
+    data.receive_buf = NULL;\r
+    data.receive_len = 0;\r
+    ret = (td_s32)uapi_i2c_master_write(AW88166_I2C_BUS_ID, dev_addr, &data);\r
+    if (ret != ERRCODE_SUCC) {\r
+        vendor_log_fun_err(uapi_i2c_master_write, ret);\r
+        goto out;\r
+    }\r
+\r
+out:\r
+    if (send_data != TD_NULL) {\r
+        osal_kfree(send_data);\r
+    }\r
+    return ret;\r
+}\r
+\r
+static td_s32 aw_dev0_i2c_read_func(td_u16 dev_addr, td_u8 reg_addr, td_u8 *pdata, td_u16 len)\r
+{\r
+    td_s32 ret;\r
+\r
+    i2c_data_t data;\r
+\r
+    data.send_buf = &reg_addr;\r
+    data.send_len = sizeof(reg_addr);\r
+    data.receive_buf = pdata;\r
+    data.receive_len = len;\r
+    ret = (td_s32)uapi_i2c_master_writeread(AW88166_I2C_BUS_ID, dev_addr, &data);\r
+    if (ret != ERRCODE_SUCC) {\r
+        vendor_log_fun_err(uapi_i2c_master_writeread, ret);\r
+        return ret;\r
+    }\r
+\r
+    return AUDIO_SUCCESS;\r
+}\r
+\r
+static td_void aw_dev0_reset_gpio_ctl(bool state)\r
+{\r
+    uapi_gpio_set_val(AW88166_PWR_ON_PIN, state);\r
+}\r
+\r
+static td_void aw88166_pwr_on_pin_init(td_void)\r
+{\r
+    uapi_gpio_set_dir(AW88166_PWR_ON_PIN, GPIO_DIRECTION_OUTPUT);\r
+}\r
+\r
+static td_s32 aw88166_i2c_init(td_void)\r
+{\r
+    td_s32 ret;\r
+    audio_func_enter();\r
+\r
+    /* init i2c */\r
+    vendor_trace_log_u32(AW88166_I2C_BUS_ID);\r
+    ret = (td_s32)uapi_i2c_master_init(AW88166_I2C_BUS_ID, I2C_BAUDRATE, I2C_HIGH_SPEED_CODE);\r
+    if (ret != AUDIO_SUCCESS) {\r
+        vendor_log_fun_err(uapi_i2c_master_init, ret);\r
+        return ret;\r
+    }\r
+\r
+    vendor_printf("aw88166 i2c init success\n");\r
+    audio_func_exit();\r
+    return AUDIO_SUCCESS;\r
+}\r
+\r
+static td_s32 aw88166_i2c_deinit(td_void)\r
+{\r
+    td_s32 ret;\r
+    audio_func_enter();\r
+\r
+    /* deinit i2c */\r
+    vendor_trace_log_u32(AW88166_I2C_BUS_ID);\r
+    ret = (td_s32)uapi_i2c_deinit(AW88166_I2C_BUS_ID);\r
+    if (ret != AUDIO_SUCCESS) {\r
+        vendor_log_fun_err(uapi_i2c_deinit, ret);\r
+        return ret;\r
+    }\r
+\r
+    vendor_printf("aw88166 i2c deinit success\n");\r
+    audio_func_exit();\r
+    return AUDIO_SUCCESS;\r
+}\r
+\r
+td_s32 aw883xx_pid_2066_dev_init(td_void *aw883xx);\r
+\r
+struct aw_init_info init_info[] = {\r
+    {\r
+        .dev = AW_DEV_0,\r
+        .i2c_addr = AW88166_I2C_DEV_ADDR,\r
+        .re_min = 2000, /* awinic:If the re_min(ohms) and re_max(ohms) are not set, the default value is used */\r
+        .re_max = 39000,\r
+        .mix_chip_count = AW_DEV0_MIX_CHIP_NUM,\r
+        .prof_info = g_dev0_prof_info,\r
+        .i2c_read_func = aw_dev0_i2c_read_func,\r
+        .i2c_write_func = aw_dev0_i2c_write_func,\r
+        .reset_gpio_ctl = aw_dev0_reset_gpio_ctl,\r
+        .dev_init_ops = {aw883xx_pid_2066_dev_init},\r
+    }\r
+};\r
+\r
+static td_s32 audio_aw88166_configuration(const uapi_vendor_codec_attr *attr)\r
+{\r
+    td_s32 ret;\r
+\r
+    /* awinic:Control interface of dev0 */\r
+    /* awinic:initialization */\r
+    ret = aw883xx_smartpa_init((td_void *)&init_info[AW_DEV_0]);\r
+    if (ret != AUDIO_SUCCESS) {\r
+        vendor_printf("aw883xx_smartpa_init already init\n");\r
+    }\r
+    /* awinic:set mode "Music", "aw_params.h" contains id information */\r
+    ret = aw883xx_set_profile_byname(AW_DEV_0, "Music");\r
+    if (ret != AUDIO_SUCCESS) {\r
+        vendor_log_fun_err(aw883xx_set_profile_byname, ret);\r
+    }\r
+\r
+    vendor_unused(attr);\r
+    return ret;\r
+}\r
+\r
+static td_s32 audio_aw88166_deconfiguration(td_void)\r
+{\r
+    /* awinic:Free the requested memory when PA is not used */\r
+    aw883xx_smartpa_deinit(AW_DEV_0);\r
+\r
+    return AUDIO_SUCCESS;\r
+}\r
+\r
+td_s32 audio_aw88166_init(const uapi_vendor_codec_attr *attr)\r
+{\r
+    td_s32 ret;\r
+\r
+    audio_func_enter();\r
+\r
+    aw88166_pwr_on_pin_init();\r
+\r
+    if (g_aw88166_i2c_inited != TD_TRUE) {\r
+        ret = aw88166_i2c_init();\r
+        if (ret != AUDIO_SUCCESS) {\r
+            vendor_log_fun_err(aw88166_i2c_init, ret);\r
+            return ret;\r
+        }\r
+        g_aw88166_i2c_inited = TD_TRUE;\r
+    } else {\r
+        ret = 0;\r
+    }\r
+\r
+    ret = audio_aw88166_configuration(attr);\r
+    if (ret != AUDIO_SUCCESS) {\r
+        vendor_log_fun_err(audio_aw88166_configuration, ret);\r
+    }\r
+\r
+    return AUDIO_SUCCESS;\r
+}\r
+\r
+td_s32 audio_aw88166_deinit(td_void)\r
+{\r
+    td_s32 ret;\r
+    audio_func_enter();\r
+\r
+    ret = audio_aw88166_deconfiguration();\r
+    if (ret != AUDIO_SUCCESS) {\r
+        vendor_log_fun_err(audio_aw88166_deconfiguration, ret);\r
+    }\r
+\r
+    if (g_aw88166_i2c_inited != TD_FALSE) {\r
+        ret = aw88166_i2c_deinit();\r
+        if (ret != AUDIO_SUCCESS) {\r
+            vendor_log_fun_err(aw88166_i2c_deinit, ret);\r
+            return ret;\r
+        }\r
+        g_aw88166_i2c_inited = TD_FALSE;\r
+    } else {\r
+        ret = AUDIO_SUCCESS;\r
+    }\r
+\r
+    audio_func_exit();\r
+    return ret;\r
+}\r
+\r
+td_s32 audio_aw88166_start(const uapi_vendor_codec_attr *attr)\r
+{\r
+    td_s32 ret;\r
+\r
+    audio_func_enter();\r
+\r
+    /* awinic:The platform needs to output I2s first, and then ctl start */\r
+    ret = aw883xx_ctrl_state(AW_DEV_0, AW_START);\r
+    if (ret != AUDIO_SUCCESS) {\r
+        vendor_log_fun_err(aw883xx_ctrl_state, ret);\r
+    }\r
+\r
+    vendor_unused(attr);\r
+    return ret;\r
+}\r
+\r
+td_s32 audio_aw88166_stop(td_void)\r
+{\r
+    td_s32 ret;\r
+    audio_func_enter();\r
+\r
+    /* awinic:The platform needs to control the stop first and then stop I2S */\r
+    ret = aw883xx_ctrl_state(AW_DEV_0, AW_STOP);\r
+    if (ret != AUDIO_SUCCESS) {\r
+        vendor_log_fun_err(aw883xx_ctrl_state, ret);\r
+    }\r
+    audio_func_exit();\r
+    return ret;\r
+}\r
+\r
+td_s32 audio_aw88166_set_aef_profile(uapi_snd_aef_profile aef_profile)\r
+{\r
+    td_s32 ret;\r
+\r
+    audio_func_enter();\r
+\r
+    /* awinic:set mode "Receiver"/"Music", "aw_params.h" contains id information */\r
+    if (aef_profile == UAPI_SND_AEF_PROFILE_VOIP) {\r
+        /* awinic:set mode "Receiver" */\r
+        ret = aw883xx_set_profile_byname(AW_DEV_0, "Receiver");\r
+    } else {\r
+        /* awinic:set mode "Music" */\r
+        ret = aw883xx_set_profile_byname(AW_DEV_0, "Music");\r
+    }\r
+\r
+    if (ret != AUDIO_SUCCESS) {\r
+        vendor_log_fun_err(aw883xx_set_profile_byname, ret);\r
+    }\r
+\r
+    audio_func_exit();\r
+    return ret;\r
+}\r
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/application/brandy/brandy_standard/thread_pri_init.c b/fd230_driver_patch/20240503.170906/code/sdk/application/brandy/brandy_standard/thread_pri_init.c
new file mode 100644 (file)
index 0000000..479f285
--- /dev/null
@@ -0,0 +1,309 @@
+/*\r
+ * Copyright (c) CompanyNameMagicTag 2021-2022. All rights reserved.\r
+ * Description:   Application Core OS Priority Initialize Interface for Standard\r
+ * Author:\r
+ * Create: 2022-12-03\r
+ */\r
+#include "debug_print.h"\r
+#include "thread_init.h"\r
+#include "common_def.h"\r
+#include "pm.h"\r
+#include "watchdog.h"\r
+/* after reboot system emmc need write exc info to the file system from sector */\r
+#if defined(SAVE_EXC_INFO) && defined(CFG_DRIVERS_MMC)\r
+#include "exception.h"\r
+#endif\r
+#ifdef CFG_DRIVERS_MMC\r
+#ifdef __LITEOS__\r
+#include "soc/mmc.h"\r
+#endif\r
+#include "soc_mmc.h"\r
+#endif\r
+#include "soc_lcd_api.h"\r
+#ifdef CFG_DRIVERS_NANDFLASH\r
+#include "nandflash_config.h"\r
+#include "yaffs_nand_drv.h"\r
+#endif\r
+#if defined(TPTYPE_TMA525B)\r
+#include "tma525b_drv1.h"\r
+#elif defined(TPTYPE_ZTW523)\r
+#include "ztw523_touch1.h"\r
+#elif defined(TPTYPE_FT6X46)\r
+#include "ft6x46_touch1.h"\r
+#else\r
+#include "ztw523_touch1.h"\r
+#endif\r
+#include "thread_pri_init.h"\r
+#if DSP_EXIST == YES\r
+#include "soc_uapi_audio_sys.h"\r
+#include "soc_uapi_vendor.h"\r
+#include "soc_uapi_sound.h"\r
+/* Audio codec vendor select according to hardware connection:\r
+ * define AUDIO_SMARTPA_AW88166 : macro to init smartpa aw88166;\r
+ * define AUDIO_SMARTPA_AW88166_I2S_ID UAPI_SND_OUT_PORT_I2S0 : macro to specify i2s id connecting to smartpa aw88166;\r
+ */\r
+#if 0\r
+#define AUDIO_SMARTPA_AW88262\r
+#define AUDIO_SMARTPA_AW88262_I2S_ID UAPI_SND_OUT_PORT_I2S2\r
+#else\r
+#define AUDIO_SMARTPA_AW88166\r
+#define AUDIO_SMARTPA_AW88166_I2S_ID UAPI_SND_OUT_PORT_I2S0\r
+#endif\r
+#endif /* DSP_EXIST */\r
+#include "panic.h"\r
+#include "board_init.h"\r
+#include "kernel_init.h"\r
+#ifdef SUPPORT_AT_OHOSFWK\r
+#include "ohosfwk_startup.h"\r
+#endif\r
+#include "clocks_config.h"\r
+\r
+#define EMMC_BASE_ADDR              0x52062000\r
+#define TASK_PRIORITY_APP           (osPriority_t)(17)\r
+#define TICK_TEN_MS                 (10U)\r
+#define WAIT_BT_BOOTUP_TIME         200U\r
+\r
+static void thread_main(const void *unused);\r
+void bt_acore_btc_ipc_receive_init(void);\r
+\r
+app_task_definition_t g_thread_pri = { { "thread_pri", 0, NULL, 0, NULL, (0x1000), TASK_PRIORITY_APP, 0, 0 },\r
+                                       (osThreadFunc_t)thread_main, NULL, NULL, USE_DTCM_MEM };\r
+store_class g_store_init_select = STORE_CLASS_NAND;\r
+\r
+#if defined(ENABLE_UIKIT) || defined(ENABLE_LVGL)\r
+static void sample_gfx_init(void)\r
+{\r
+#if defined(TPTYPE_TMA525B)\r
+    tma525b_host_init_sample();\r
+#elif defined(TPTYPE_ZTW523)\r
+    ztw523_host_init_sample();\r
+#elif defined(TPTYPE_FT6X46)\r
+    ft6x46_host_init_sample();\r
+#else\r
+    ztw523_host_init_sample();\r
+#endif\r
+    uapi_lcd_init();\r
+#ifdef SUPPORT_GPU_GMMU\r
+    drv_gmmu_module_init();\r
+#endif\r
+    uapi_vau_module_init();\r
+    uapi_dpu_module_init();\r
+#ifdef SUPPORT_GPU_JPEG\r
+    uapi_jpeg_module_init();\r
+#endif\r
+}\r
+#endif\r
+\r
+#ifdef CFG_DRIVERS_MMC\r
+static void emmc_init(void)\r
+{\r
+    /**\r
+     * FPGA解复位, 设置CMD_CONFLICT_CHECK\r
+     * 之后才能设置管脚\r
+     */\r
+    writew(EMMC_BASE_ADDR + 0x508, 0);\r
+    init_emmc_pinmux();\r
+    int ret = emmc_drv_context_init();\r
+    if (ret != ENOERR) {\r
+        PRINT("emmc init error:[%d]"NEWLINE, ret);\r
+    }\r
+    mmc_set_first_init_flag(true);\r
+    mmc_set_sleep_init_flag(true);\r
+    PRINT("emmc init success\r\n");\r
+\r
+#if defined(SAVE_EXC_INFO)\r
+    if (emmc_exc_info_write() != ERRCODE_SUCC) {\r
+        PRINT("emmc_exc_info_write failed"NEWLINE);\r
+    }\r
+#endif\r
+}\r
+#endif\r
+\r
+#ifdef CFG_DRIVERS_NANDFLASH\r
+static void nandflash_init(void)\r
+{\r
+    int32_t ret = 0;\r
+    ret = nandflash_filesystem_init();\r
+    if (ret != 0) {\r
+        PRINT("nandflash init error[%d]"NEWLINE, ret);\r
+    }\r
+    PRINT("nandflash init success\r\n");\r
+}\r
+#endif\r
+\r
+static void board_version_class_print(void)\r
+{\r
+    PRINT("**********startup info**********\r\n");\r
+    PRINT("os init class is %s."NEWLINE, (g_os_init_select == OS_CLASS_LITEOS) ? "liteos" : "freertos");\r
+    PRINT("store init class is %s."NEWLINE, (g_store_init_select == STORE_CLASS_NAND) ? "nandflash" : "emmc");\r
+    PRINT("display init class is %s."NEWLINE, (g_display_init_select == DISPLAY_CLASS_QSPI) ? "QSPI" : "MIPI");\r
+    PRINT("board init class is %s."NEWLINE, (g_board_init_select == BOARD_CLASS_E0B2) ? "E0B2" : "E0B4");\r
+#ifdef CONFIG_PSRAM_SUPPORT\r
+    PRINT("psram density is %s."NEWLINE, (get_psram_density() == PSRAM_DENSITY_16M) ? "16MB" : "32MB");\r
+#endif\r
+    PRINT("**********startup info**********\r\n");\r
+}\r
+\r
+#if DSP_EXIST == YES\r
+/**\r
+ * The sample code of the vendor,\r
+ * which will be implemented by the customer in the future\r
+ */\r
+#ifdef AUDIO_SMARTPA_AW88262\r
+td_s32 audio_aw88262_init(const uapi_vendor_codec_attr *attr);\r
+td_s32 audio_aw88262_deinit(td_void);\r
+\r
+static uapi_vendor_driver g_aw88262_driver = {\r
+    .out_port = AUDIO_SMARTPA_AW88262_I2S_ID,\r
+    .init = audio_aw88262_init,\r
+    .deinit = audio_aw88262_deinit,\r
+    .set_aef_profile = TD_NULL,\r
+};\r
+\r
+static td_s32 audio_aw88262_register_driver(void)\r
+{\r
+    return uapi_audio_vendor_register(&g_aw88262_driver);\r
+}\r
+#endif /* AUDIO_SMARTPA_AW88262 */\r
+\r
+#ifdef AUDIO_SMARTPA_AW88166\r
+td_s32 audio_aw88166_init(const uapi_vendor_codec_attr *attr);\r
+td_s32 audio_aw88166_deinit(td_void); /* Call when device power off */\r
+td_s32 audio_aw88166_start(const uapi_vendor_codec_attr *attr);\r
+td_s32 audio_aw88166_stop(td_void);\r
+td_s32 audio_aw88166_set_aef_profile(uapi_snd_aef_profile aef_profile);\r
+\r
+static uapi_vendor_driver g_aw88166_driver = {\r
+    .out_port = AUDIO_SMARTPA_AW88166_I2S_ID,\r
+    .init = audio_aw88166_start,\r
+    .deinit = audio_aw88166_stop,\r
+    .set_aef_profile = audio_aw88166_set_aef_profile,\r
+};\r
+\r
+static td_s32 audio_aw88166_register_driver(void)\r
+{\r
+    const uapi_vendor_codec_attr attr = {};\r
+\r
+    audio_aw88166_init(&attr); /* Init aw88166 once when device power on */\r
+\r
+    return uapi_audio_vendor_register(&g_aw88166_driver);\r
+}\r
+#endif /* AUDIO_SMARTPA_AW88166 */\r
+\r
+static void audio_smartpa_init(void)\r
+{\r
+    uint32_t ret;\r
+\r
+#ifdef AUDIO_SMARTPA_AW88262\r
+    ret = (uint32_t)audio_aw88262_register_driver();\r
+    if (ret != 0) {\r
+        PRINT("aw88262 register driver error\r\n");\r
+    }\r
+#endif /* AUDIO_SMARTPA_AW88262 */\r
+\r
+#ifdef AUDIO_SMARTPA_AW88166\r
+    ret = (uint32_t)audio_aw88166_register_driver();\r
+    if (ret != 0) {\r
+        PRINT("aw88166 register driver error\r\n");\r
+    }\r
+#endif /* AUDIO_SMARTPA_AW88166 */\r
+}\r
+#endif /* DSP_EXIST */\r
+\r
+#if DSP_EXIST == YES\r
+static void audio_init()\r
+{\r
+    (void)osDelay(TICK_TEN_MS);\r
+    uapi_watchdog_kick();\r
+\r
+    audio_smartpa_init();\r
+\r
+    uint32_t ret = (uint32_t)uapi_audio_init();\r
+    if (ret != 0) {\r
+        PRINT("audio init error:[%d]\r\n", ret);\r
+    } else {\r
+        PRINT("audio init OK\r\n");\r
+    }\r
+}\r
+#endif\r
+\r
+void rc_calibration_func_notify(void)\r
+{\r
+#ifdef SUPPORT_RC_CALIBRATION\r
+    /* BT核用来通知MCU 32K校准值 */\r
+    writew(GLB_CTL_D_RB_BASE + GLB_GP_D_REG3, 0x0);\r
+    /* 通知BT核 32K时钟来源 */\r
+    writew(GLB_CTL_D_RB_BASE + GLB_GP_D_REG2, CLOCK_SOURCE_RC);\r
+#else\r
+    writew(GLB_CTL_D_RB_BASE + GLB_GP_D_REG2, CLOCK_SOURCE_XO);\r
+#endif\r
+}\r
+\r
+static void force_to_sleep(void)\r
+{\r
+    if (reg16_getbits(0x5702C010, 0x8, 0x8) == 0x5A) {  // 特殊模式下,强制进入深睡中\r
+        reg16_clrbits(0x5702C010, 0x8, 0x8);\r
+        uapi_tcxo_delay_ms(WAIT_BT_BOOTUP_TIME);\r
+        hal_pmu_cldo_enable_slp_bypass(HAL_PMU_CLDO1, TURN_OFF);\r
+        uapi_sys_force_mcu_only_deep_sleep_mode(0);\r
+    }\r
+}\r
+\r
+static void thread_main(const void *unused)\r
+{\r
+    PRINT("thread_main start "NEWLINE);\r
+    unused(unused);\r
+    rc_calibration_func_notify();\r
+    bt_acore_btc_ipc_receive_init();\r
+    uapi_pm_control(PM_BT_POWER_UP_AND_RUN);\r
+#ifdef FORCE_TO_DEEP_SLEEP\r
+    force_to_sleep();\r
+#endif\r
+    los_vfs_init();\r
+    uint32_t ret = dpal_driver_base_init();\r
+    if (ret != 0) {\r
+        PRINT("dpal driver base init error"NEWLINE);\r
+        panic(PANIC_ASSERT, __LINE__);\r
+    }\r
+#ifdef CFG_DRIVERS_MMC\r
+    emmc_init();\r
+    g_store_init_select = STORE_CLASS_EMMC;\r
+    sdiom_internal_freq_handler_register(mmc_set_internal_clk);\r
+#endif\r
+#ifdef CFG_DRIVERS_NANDFLASH\r
+    yaffs_nand_drv_checkptset(YAFFS_CHECKPT_SKIPED);\r
+    nandflash_init();\r
+    g_store_init_select = STORE_CLASS_NAND;\r
+#endif\r
+    uapi_pm_control(PM_DISPLAY_POWER_UP_AND_RUN);\r
+    (void)osDelay(TICK_TEN_MS);\r
+\r
+#if defined(ENABLE_UIKIT) || defined(ENABLE_LVGL)\r
+    sample_gfx_init();\r
+#else\r
+    uapi_pm_control(PM_DISPLAY_POWER_OFF);\r
+#endif\r
+\r
+#if DSP_EXIST == YES\r
+    audio_init();\r
+#endif\r
+    board_version_class_print();\r
+    uapi_watchdog_kick();\r
+    thread_init();\r
+    button_app_init();\r
+    uapi_calendar_init();\r
+#ifdef SUPPORT_AT_OHOSFWK\r
+    ohos_startup();\r
+#endif\r
+    uapi_pm_remove_sleep_veto(PM_ID_DEBUG);\r
+    set_startup_finish_flag();\r
+}\r
+\r
+void thread_pri_init(void)\r
+{\r
+    /* Create tasks */\r
+    g_thread_pri.task_handle = osThreadNew(g_thread_pri.func, NULL, &(g_thread_pri.attr));\r
+    if (g_thread_pri.task_handle == NULL) {\r
+        PRINT("create thread pri failed!");\r
+    }\r
+}\r
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/src/RebootPresenter.cpp b/fd230_driver_patch/20240503.170906/code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/src/RebootPresenter.cpp
new file mode 100644 (file)
index 0000000..35ba07c
--- /dev/null
@@ -0,0 +1,96 @@
+/*
+ * Copyright (c) CompanyNameMagicTag 2022-2022. All rights reserved.
+ * Description: Reboot Presenter
+ * Create: 2022-04-28
+ */
+
+#include "RebootPresenter.h"
+#include "RebootView.h"
+#include "RebootModel.h"
+#include "drag_event.h"
+#include "wearable_log.h"
+
+namespace OHOS {
+static RebootPresenter *g_pRebootPresenter = nullptr;
+
+RebootPresenter::RebootPresenter()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RebootPresenter::RebootPresenter");
+    g_pRebootPresenter = this;
+}
+
+RebootPresenter::~RebootPresenter()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RebootPresenter::~RebootPresenter");
+    g_pRebootPresenter = nullptr;
+}
+
+RebootPresenter *RebootPresenter::GetInstance()
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RebootPresenter GetInstance");
+    return g_pRebootPresenter;
+}
+
+void RebootPresenter::OnStart()
+{
+    Presenter<RebootView>::OnStart();
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RebootPresenter::On Start ");
+}
+
+void RebootPresenter::OnPause(void) {}
+
+void RebootPresenter::OnResume(void) {}
+
+void RebootPresenter::OnStop(void) {}
+
+
+extern "C"
+{
+extern void uapi_sys_shipmode(uint32_t arg);
+extern uint32_t mcu_os_sys_reset(uint8_t *para, uint32_t para_len);
+}
+bool RebootPresenter::OnClick(UIView& view, const ClickEvent& event)
+{
+    UNUSED(event);
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "OnClick OnClick");
+    if (strcmp(view.GetViewId(), REBOOT_BUTTON) == 0) {
+        RebootView::GetInstance()->ChangeView(REBOOTVIEW, REBOOTDEVICEVIEW);
+    } else if (strcmp(view.GetViewId(), SHUTDOWN_BUTTON) == 0) {
+        RebootView::GetInstance()->ChangeView(REBOOTVIEW, SHUTDOWNDEVICEVIEW);
+    } else if (strcmp(view.GetViewId(), REBOOTDEVICE_BUTTON) == 0) {
+        // 重启
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "REBOOTDEVICE_BUTTON OnClick");
+        mcu_os_sys_reset(NULL,NULL);
+    } else if (strcmp(view.GetViewId(), SHUTDOWNDEVICE_BUTTON) == 0) {
+        // 关机
+        WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SHUTDOWNDEVICE_BUTTON OnClick");
+        uapi_sys_shipmode(0);
+    }
+    return true;
+}
+
+bool RebootPresenter::OnDrag(UIView& view, const DragEvent& event)
+{
+    WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "RebootPresenter::OnDrag");
+    if (event.GetDragDirection() == DragEvent::DIRECTION_LEFT_TO_RIGHT) {
+        if (strcmp(view.GetViewId(), REBOOT_VIEW) == 0) {
+            NativeAbility::GetInstance().ChangeSlice(VIEW_MAIN_SAMPLE);
+        } else if (strcmp(view.GetViewId(), REBOOTDEVICE_VIEW) == 0) {
+            if (RebootModel::GetInstance()->GetExitsView() == 0) {
+                RebootView::GetInstance()->ChangeView(REBOOTDEVICEVIEW, REBOOTVIEW);
+            } else {
+                NativeAbility::GetInstance().ChangeSlice(VIEW_SETTING);
+                RebootModel::GetInstance()->SetExitsView(false);
+            }
+        } else if (strcmp(view.GetViewId(), SHUTDOWNDEVICE_VIEW) == 0) {
+            if (RebootModel::GetInstance()->GetExitsView() == 0) {
+                RebootView::GetInstance()->ChangeView(SHUTDOWNDEVICEVIEW, REBOOTVIEW);
+            } else {
+                NativeAbility::GetInstance().ChangeSlice(VIEW_SETTING);
+                RebootModel::GetInstance()->SetExitsView(false);
+            }
+        }
+    }
+    return true;
+}
+}
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/build/config/target_config/brandy/config.py b/fd230_driver_patch/20240503.170906/code/sdk/build/config/target_config/brandy/config.py
new file mode 100644 (file)
index 0000000..849bfc8
--- /dev/null
@@ -0,0 +1,302 @@
+#!/usr/bin/env python3
+# encoding=utf-8
+# ============================================================================
+# @brief    Target Definitions File
+# Copyright CompanyNameMagicTag 2022-2022. All rights reserved.
+# ============================================================================
+
+target = {
+    #target1: liteos + lvgl + nandflash + mipi + no psram + mini_audio  典型单封LVGL版本
+    'brandy-target1': {
+        'board': 'evb',
+        'base_target_name': 'target_standard_brandy_application_template',
+        'std_libs': [],
+        'defines': ['PRE_ASIC', 'BRANDY_PRODUCT_EVB4', 'VERSION_STANDARD', '__LITEOS__', 'CONFIG_OTA_UPDATE_SUPPORT',
+                    '_ALL_SOURCE', 'SUPPORT_CXX', 'I2C_SLAVE_REG_ADDR_4BYTE', 'CONFIG_ZDIAG_NV_SUPPORT',
+                    "-:TARGET_CHIP_BRANDY=1", "-:BRANDY_CHIP_V100=1", 'CFG_DRIVERS_NANDFLASH',
+                    'CONFIG_ZDIAG_AUDIO_PROC_SUPPORT', 'CONFIG_ZDIAG_AUDIO_DUMP_SUPPORT', 'CONFIG_ZDIAG_AUDIO_PROBE_SUPPORT',
+                    'SUPPORT_BLE', 'SUPPORT_BREDR', 'MEMORY_MINI', 'ENABLE_LVGL', 'SW_UART_DEBUG', "SAVE_EXC_INFO",
+                    "CONFIG_LOW_POWER_TEST", 'MIPI_ULPS_SUPPORT', 'ENABLE_ECC', 'CONFIG_DIAG_GPU_PROC_SUPPORT',
+                    'CONFIG_NV_SUPPORT_ASYNCHRONOUS_STORE=0'],
+        'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", 'dfx_nv', "osal", "arch_port", "-:testsuite",
+                          "liteos_port", 'lcd', 'qspi_display', 'dfx_file_operation',
+                          'psram', 'hal_mipi', 'mipi_tx', 'non_os', 'touch',
+                          'ulp_aon', 'hal_l2ram',
+                          'x_dpal', 'x_vfs', 'x_disk', 'x_fat', 'drv_mmc','fs_yaffs2', 'x_vfs_private',
+                          'pm_service', 'pm_brandy', 'cmn_header', 'at_cmd', 'graphic_at_service', 'app_at_service',
+                          'audio_at_service', 'media_at_service', 'bt_manager_at_service',
+                          "audio_proc", "audio_dump", "audio_probe", "gpu_proc"],
+        'ram_component_set': ['bgh', 'media_mini', 'gpu', 'graphic_lvgl_mini', 'dfx_set'],
+        'image_analysis': True,
+        'dsp_version': 'mini',
+        'packet': True,
+        'fs_image': False,
+    },
+    #target3: liteos + uikit + nandflash + mipi + psram + audio  典型合封UIKIT版本
+    'brandy-target3': {
+        'board': 'evb',
+        'base_target_name': 'target_standard_brandy_application_template',
+        'defines': ['PRE_ASIC', 'BRANDY_PRODUCT_EVB4', 'VERSION_STANDARD', '__LITEOS__', 'CONFIG_OTA_UPDATE_SUPPORT',
+                    '_ALL_SOURCE', 'SUPPORT_CXX', 'I2C_SLAVE_REG_ADDR_4BYTE', 'CONFIG_PSRAM_SUPPORT',
+                    "-:TARGET_CHIP_BRANDY=1", "-:BRANDY_CHIP_V100=1", 'CFG_DRIVERS_NANDFLASH', 'CONFIG_ZDIAG_NV_SUPPORT',
+                    'CONFIG_ZDIAG_AUDIO_PROC_SUPPORT', 'CONFIG_ZDIAG_AUDIO_DUMP_SUPPORT', 'CONFIG_ZDIAG_AUDIO_PROBE_SUPPORT', 'CONFIG_SEA_PHS_SUPPORT', 'CONFIG_DIAG_GPU_PROC_SUPPORT',
+                    'SUPPORT_BLE', 'SUPPORT_BREDR', 'ENABLE_UIKIT', 'SUPPORT_GPU_JPEG', 'SUPPORT_GPU_GMMU', 'SUPPORT_GPU_OPENVG',
+                    'SW_UART_DEBUG', 'SAVE_EXC_INFO', 'HASH_MEM_COPY','MIPI_ULPS_SUPPORT', 'CONFIG_LOW_POWER_TEST',
+                    'ENABLE_ECC', 'SUPPORT_ALIPAY_SEC'],
+        'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", 'dfx_nv', "osal", "arch_port", "-:testsuite",
+                          "liteos_port", 'lcd', 'qspi_display', 'dfx_file_operation',
+                          'psram', 'hal_mipi', 'mipi_tx', 'non_os', 'touch',
+                          'ulp_aon', 'hal_l2ram', 'x_vfs_private',
+                          'x_dpal', 'x_vfs', 'x_disk', 'x_fat', 'drv_mmc', 'fs_yaffs2',
+                          'pm_service', 'pm_brandy', 'cmn_header', 'at_cmd', 'graphic_at_service', 'app_at_service',
+                          'audio_at_service', 'media_at_service', 'bt_manager_at_service',
+                          "audio_proc", "audio_dump", "audio_probe", "gpu_proc", 'bts_header'],
+        'ram_component_set': ['bgh', 'media', 'gpu', 'graphic_uikit', 'graphic_test', 'bgh_audio', 'dfx_set', 'alipay_set'],
+        'dsp_version': 'max',
+        'packet': True,
+        'fs_image': False
+    },
+    #target4: liteos + nandflash + psram + mini_audio + no gui 外设类版本
+    'brandy-target4': {
+        'board': 'evb',
+        'base_target_name': 'target_standard_brandy_application_template',
+        'std_libs': ['c++', 'c++abi', 'unwind'],
+        'defines': ['PRE_ASIC', 'BRANDY_PRODUCT_EVB4', 'VERSION_STANDARD', 'CONFIG_OTA_UPDATE_SUPPORT',
+                    '_ALL_SOURCE', 'I2C_SLAVE_REG_ADDR_4BYTE', 'SUPPORT_CXX',
+                    "-:TARGET_CHIP_BRANDY=1", "-:BRANDY_CHIP_V100=1", 'CFG_DRIVERS_NANDFLASH', 'HASH_MEM_COPY',
+                    'CONFIG_ZDIAG_NV_SUPPORT', 'SUPPORT_BLE', 'SUPPORT_BREDR',
+                    'SW_UART_DEBUG', 'SAVE_EXC_INFO', 'CONFIG_PSRAM_SUPPORT', 'CONFIG_SEA_PHS_SUPPORT',
+                    'CONFIG_LOW_POWER_TEST', 'CONFIG_ADC_SUPPORT_AUTO_SCAN',
+                    'CONFIG_ADC_SUPPORT_LONG_SAMPLE', 'ENABLE_ECC',  'CONFIG_DIAG_GPU_PROC_SUPPORT', 'SUPPORT_ALIPAY_SEC'],
+        'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", 'dfx_nv', "osal", "arch_port", "-:testsuite",
+                          "liteos_port", 'lcd', 'qspi_display', 'partition', 'partition_brandy', 'dfx_file_operation',
+                          'psram', 'hal_mipi', 'mipi_tx', 'non_os', 'touch',
+                          'ulp_aon', 'hal_l2ram', 'x_vfs_private',
+                          'x_dpal', 'x_vfs', 'x_disk', 'x_fat', 'drv_mmc','fs_yaffs2',
+                          'pm_service', 'pm_brandy', 'cmn_header', 'at_cmd', 'app_at_service',
+                          'audio_at_service', 'bt_manager_at_service', "gpu_proc", 'bts_header'],
+        'ram_component_set': ['bgh', 'gpu', 'media_target4', 'update_app', 'dfx_set', 'bgh_audio', 'alipay_set'],
+        'dsp_version': 'max',
+        'packet': True,
+        'fs_image': False,
+    },
+    #target5: freertos + lvgl + nand + mipi + psram + audio + media  典型合封LVGL版本
+    'brandy-target5': {
+        'board': 'evb',
+        'base_target_name': 'target_standard_brandy_application_freertos_template',
+        'defines': ['PRE_ASIC', 'BRANDY_PRODUCT_EVB4', 'VERSION_STANDARD', 'CONFIG_OTA_UPDATE_SUPPORT',
+                    '_ALL_SOURCE', 'SUPPORT_CXX', 'I2C_SLAVE_REG_ADDR_4BYTE', 'CONFIG_PSRAM_SUPPORT',
+                    "-:TARGET_CHIP_BRANDY=1", "-:BRANDY_CHIP_V100=1", 'CFG_DRIVERS_NANDFLASH', 'CONFIG_ZDIAG_NV_SUPPORT',
+                    'CONFIG_ZDIAG_AUDIO_PROC_SUPPORT', 'CONFIG_ZDIAG_AUDIO_DUMP_SUPPORT', 'CONFIG_ZDIAG_AUDIO_PROBE_SUPPORT', 'CONFIG_SEA_PHS_SUPPORT', 'CONFIG_DIAG_GPU_PROC_SUPPORT',
+                    'SUPPORT_BLE', "SUPPORT_BREDR", 'ENABLE_LVGL', "SUPPORT_GPU_JPEG", "SUPPORT_GPU_GMMU", "SUPPORT_GPU_OPENVG",
+                    'SW_UART_DEBUG', 'MEMORY_NO_CACHE', "SAVE_EXC_INFO", "HASH_MEM_COPY", 'MIPI_ULPS_SUPPORT',
+                    'CONFIG_LOW_POWER_TEST', 'ENABLE_ECC', 'SUPPORT_ALIPAY_SEC'],
+        'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", 'dfx_nv', "osal", "arch_port", "-:testsuite",
+                          'lcd', 'qspi_display', 'partition', 'partition_brandy', 'dfx_file_operation',
+                          'psram', 'hal_mipi', 'mipi_tx', 'non_os', 'touch',
+                          'ulp_aon', 'hal_l2ram', 'x_vfs_private',
+                          'x_dpal', 'x_vfs', 'x_disk', 'x_fat', 'drv_mmc', 'fs_yaffs2',
+                          'pm_service', 'pm_brandy', 'cmn_header', 'at_cmd','graphic_at_service', 'app_at_service',
+                          'audio_at_service', 'media_at_service', 'bt_manager_at_service',
+                          "audio_proc", "audio_dump", "audio_probe", "gpu_proc", 'bts_header'],
+        'ram_component_set': ['bgh', 'media', 'gpu', 'graphic_lvgl', 'bgh_audio', 'update_app', 'dfx_set', 'alipay_set'],
+        'dsp_version': 'max',
+        'packet': True,
+        'fs_image': False
+    },
+    #native-js: liteos + uikit + nandflash + mipi + psram + audio  典型合封UIKIT版本
+    'brandy-native-js': {
+        'board': 'evb',
+        'base_target_name': 'target_standard_brandy_application_template',
+        'defines': ['PRE_ASIC', 'BRANDY_PRODUCT_EVB4', 'VERSION_STANDARD', '__LITEOS__', 'CONFIG_OTA_UPDATE_SUPPORT',
+                    '_ALL_SOURCE', 'SUPPORT_CXX', 'I2C_SLAVE_REG_ADDR_4BYTE', 'CONFIG_PSRAM_SUPPORT',
+                    "-:TARGET_CHIP_BRANDY=1", "-:BRANDY_CHIP_V100=1", 'CFG_DRIVERS_NANDFLASH', 'CONFIG_ZDIAG_NV_SUPPORT',
+                    'CONFIG_ZDIAG_AUDIO_PROC_SUPPORT', 'CONFIG_ZDIAG_AUDIO_DUMP_SUPPORT', 'CONFIG_ZDIAG_AUDIO_PROBE_SUPPORT', 'CONFIG_SEA_PHS_SUPPORT', 'CONFIG_DIAG_GPU_PROC_SUPPORT',
+                    'SUPPORT_BLE', 'SUPPORT_BREDR', 'ENABLE_UIKIT', 'SUPPORT_GPU_JPEG', 'SUPPORT_GPU_GMMU', 'SUPPORT_GPU_OPENVG',
+                    'SW_UART_DEBUG', 'SAVE_EXC_INFO', 'HASH_MEM_COPY', 'JS_ENABLE', 'CONFIG_LOW_POWER_TEST',
+                    'FT_SINGLE_UART',
+                    'TPTYPE_FT6X46',
+                    'ENABLE_ECC', 'MIPI_ULPS_SUPPORT', 'SUPPORT_ALIPAY_SEC'],
+        'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", 'dfx_nv', "osal", "arch_port", "-:testsuite",
+                          "liteos_port", 'lcd', 'qspi_display', 'dfx_file_operation',
+                          'psram', 'hal_mipi', 'mipi_tx', 'non_os', 'touch',
+                          'ulp_aon', 'hal_l2ram',
+                          'x_dpal', 'x_vfs', 'x_disk', 'x_fat', 'drv_mmc', 'fs_yaffs2', 'x_vfs_private',
+                          'pm_service', 'pm_brandy', 'cmn_header', 'at_cmd', 'graphic_at_service', 'app_at_service', 'ohosfwk_at_service',
+                          "audio_proc", "audio_dump", "audio_probe", "power_manager", "gpu_proc", 'bts_header', 'baidumapsdk'],
+        'ram_component_set': ['bgh', 'media', 'gpu', 'graphic_uikit', 'bgh_audio', 'dfx_set', 'ohos_set', 'wearable_set', 'alipay_set'],
+        'dsp_version': 'max',
+        'packet': True,
+        'fs_image': True
+    },
+    #native-xts: liteos + uikit + nandflash + mipi + psram + audio  典型合封UIKIT版本
+    'brandy-xts': {
+        'board': 'evb',
+        'base_target_name': 'target_standard_brandy_application_template',
+        'defines': ['PRE_ASIC', 'BRANDY_PRODUCT_EVB4', 'VERSION_STANDARD', '__LITEOS__', 'CONFIG_OTA_UPDATE_SUPPORT',
+                    '_ALL_SOURCE', 'SUPPORT_CXX', 'I2C_SLAVE_REG_ADDR_4BYTE', 'CONFIG_PSRAM_SUPPORT',
+                    "-:TARGET_CHIP_BRANDY=1", "-:BRANDY_CHIP_V100=1", 'CFG_DRIVERS_NANDFLASH', 'CONFIG_ZDIAG_NV_SUPPORT',
+                    'CONFIG_ZDIAG_AUDIO_PROC_SUPPORT', 'CONFIG_ZDIAG_AUDIO_DUMP_SUPPORT', 'CONFIG_ZDIAG_AUDIO_PROBE_SUPPORT', 'CONFIG_SEA_PHS_SUPPORT',
+                    'SUPPORT_BLE', 'SUPPORT_BREDR', 'ENABLE_UIKIT', 'SUPPORT_GPU_JPEG', 'SUPPORT_GPU_GMMU', 'SUPPORT_GPU_OPENVG', 'CONFIG_DIAG_GPU_PROC_SUPPORT',
+                    'SW_UART_DEBUG', 'SAVE_EXC_INFO', 'HASH_MEM_COPY', 'JS_ENABLE', 'CONFIG_LOW_POWER_TEST',
+                    'ENABLE_ECC', 'XTS_SUPPORT', 'SUPPORT_ALIPAY_SEC'],
+        'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", 'dfx_nv', "osal", "arch_port", "-:testsuite",
+                          "liteos_port", 'lcd', 'qspi_display', 'dfx_file_operation',
+                          'psram', 'hal_mipi', 'mipi_tx', 'non_os', 'touch',
+                          'ulp_aon', 'hal_l2ram',
+                          'x_dpal', 'x_vfs', 'x_disk', 'x_fat', 'drv_mmc', 'fs_yaffs2', 'x_vfs_private',
+                          'pm_service', 'pm_brandy', 'cmn_header', 'at_cmd', 'graphic_at_service', 'app_at_service', 'ohosfwk_at_service',
+                          "audio_proc", "audio_dump", "audio_probe", "power_manager", "gpu_proc", 'bts_header', 'baidumapsdk'],
+        'ram_component_set': ['bgh', 'media', 'gpu', 'graphic_uikit', 'bgh_audio', 'dfx_set', 'ohos_set', 'wearable_set', 'xts_set', 'xts_test_set', 'alipay_set'],
+        'dsp_version': 'max',
+        'packet': True,
+        'fs_image': False
+    },
+
+    'brandy-target1-r': {
+        'board': 'evb',
+        'base_target_name': 'target_brandy_recovery_template',
+        'defines': ['PRE_ASIC', 'BRANDY_PRODUCT_EVB4', 'VERSION_STANDARD', '__LITEOS__',
+                    '_ALL_SOURCE', 'SUPPORT_CXX', 'I2C_SLAVE_REG_ADDR_4BYTE', 'CFG_DRIVERS_NANDFLASH',
+                    "-:TARGET_CHIP_BRANDY=1", "-:BRANDY_CHIP_V100=1", 'ENABLE_UIKIT', 'MEMORY_MINI', 'SW_UART_DEBUG',
+                    'ENABLE_ECC', 'SUPPORT_RECOVERY_DISPLAY'],
+        'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", "osal", "arch_port", "-:testsuite",
+                          "liteos_port", 'lcd', 'qspi_display', 'dfx_file_operation',
+                          'psram', 'hal_mipi', 'mipi_tx', 'non_os', 'touch',
+                          'x_dpal', 'x_vfs', 'x_disk', 'x_fat', 'drv_mmc', 'x_vfs_private',
+                          'ulp_aon', 'hal_l2ram', 'pm_service', 'pm_brandy', 'cmn_header'],
+        'ram_component_set': ['pinctrl', 'dfx_set', 'gpu']
+    },
+    'brandy-target3-r': {
+        'board': 'evb',
+        'base_target_name': 'target_brandy_recovery_template',
+        'defines': ['PRE_ASIC', 'BRANDY_PRODUCT_EVB4', 'VERSION_STANDARD', '__LITEOS__',
+                    '_ALL_SOURCE', 'SUPPORT_CXX', 'I2C_SLAVE_REG_ADDR_4BYTE', 'CFG_DRIVERS_NANDFLASH',
+                    "-:TARGET_CHIP_BRANDY=1", "-:BRANDY_CHIP_V100=1", 'ENABLE_UIKIT', 'SW_UART_DEBUG', "HASH_MEM_COPY",
+                    'ENABLE_ECC', 'SUPPORT_RECOVERY_DISPLAY'],
+        'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", "osal", "arch_port", "-:testsuite",
+                          "liteos_port", 'lcd', 'qspi_display', 'dfx_file_operation',
+                          'psram', 'hal_mipi', 'mipi_tx', 'non_os', 'touch',
+                          'x_dpal', 'x_vfs', 'x_disk', 'x_fat', 'drv_mmc', 'x_vfs_private',
+                          'ulp_aon', 'hal_l2ram', 'pm_service', 'pm_brandy', 'cmn_header'],
+        'ram_component_set': ['pinctrl', 'dfx_set', 'gpu']
+    },
+    'brandy-target4-r': {
+        'board': 'evb',
+        'base_target_name': 'target_brandy_recovery_template',
+        'defines': ['PRE_ASIC', 'BRANDY_PRODUCT_EVB4', 'VERSION_STANDARD', '__LITEOS__',
+                    '_ALL_SOURCE', 'SUPPORT_CXX', 'I2C_SLAVE_REG_ADDR_4BYTE', 'CFG_DRIVERS_NANDFLASH',
+                    "-:TARGET_CHIP_BRANDY=1", "-:BRANDY_CHIP_V100=1", 'ENABLE_UIKIT', 'SW_UART_DEBUG', 'HASH_MEM_COPY',
+                    'ENABLE_ECC', 'SUPPORT_RECOVERY_DISPLAY'],
+        'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", "osal", "arch_port", "-:testsuite",
+                          "liteos_port", 'lcd', 'qspi_display', 'dfx_file_operation',
+                          'psram', 'hal_mipi', 'mipi_tx', 'non_os', 'touch', 'x_vfs_private',
+                          'x_dpal', 'x_vfs', 'x_disk', 'x_fat', 'drv_mmc', 'pm_service', 'pm_brandy',
+                          'ulp_aon', 'hal_l2ram', 'cmn_header'],
+        'ram_component_set': ['pinctrl', 'dfx_set', 'gpu']
+    },
+    'brandy-target5-r': {
+        'board': 'evb',
+        'base_target_name': 'target_brandy_recovery_freertos_template',
+        'defines': ['PRE_ASIC', 'BRANDY_PRODUCT_EVB4', 'VERSION_STANDARD',
+                    '_ALL_SOURCE', 'SUPPORT_CXX', 'I2C_SLAVE_REG_ADDR_4BYTE', 'CFG_DRIVERS_NANDFLASH',
+                    "-:TARGET_CHIP_BRANDY=1", "-:BRANDY_CHIP_V100=1", "__FREERTOS__", 'ENABLE_UIKIT', 'SW_UART_DEBUG',
+                    "HASH_MEM_COPY", 'ENABLE_ECC', 'SUPPORT_RECOVERY_DISPLAY'],
+        'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", "osal", "arch_port", "-:testsuite",
+                          'lcd', 'qspi_display', 'dfx_file_operation',
+                          'psram', 'hal_mipi', 'mipi_tx', 'non_os', 'touch',
+                          'x_dpal', 'x_vfs', 'x_disk', 'x_fat', 'drv_mmc', 'pm_service', 'pm_brandy', 'x_vfs_private',
+                          'ulp_aon', 'hal_l2ram', 'cmn_header'],
+        'ram_component_set': ['pinctrl', 'dfx_set', 'gpu']
+    },
+    'brandy-native-js-r': {
+        'board': 'evb',
+        'base_target_name': 'target_brandy_recovery_template',
+        'defines': ['PRE_ASIC', 'BRANDY_PRODUCT_EVB4', 'VERSION_STANDARD', '__LITEOS__',
+                    '_ALL_SOURCE', 'SUPPORT_CXX', 'I2C_SLAVE_REG_ADDR_4BYTE', 'CFG_DRIVERS_NANDFLASH',
+                    "-:TARGET_CHIP_BRANDY=1", "-:BRANDY_CHIP_V100=1", 'ENABLE_UIKIT', 'SW_UART_DEBUG', "HASH_MEM_COPY",
+                    'FT_SINGLE_UART','TPTYPE_FT6X46',
+                    'ENABLE_ECC', 'SUPPORT_RECOVERY_DISPLAY'],
+        'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", "osal", "arch_port", "-:testsuite",
+                          "liteos_port", 'lcd', 'qspi_display', 'dfx_file_operation',
+                          'psram', 'hal_mipi', 'mipi_tx', 'non_os', 'touch',
+                          'x_dpal', 'x_vfs', 'x_disk', 'x_fat', 'drv_mmc', 'x_vfs_private',
+                          'ulp_aon', 'hal_l2ram', 'pm_service', 'pm_brandy', 'cmn_header',
+                          'at_cmd'
+                          ],
+        'ram_component_set': ['pinctrl', 'dfx_set' ,'gpu']
+    },
+    'brandy-xts-r': {
+        'board': 'evb',
+        'base_target_name': 'target_brandy_recovery_template',
+        'defines': ['PRE_ASIC', 'BRANDY_PRODUCT_EVB4', 'VERSION_STANDARD', '__LITEOS__',
+                    '_ALL_SOURCE', 'SUPPORT_CXX', 'I2C_SLAVE_REG_ADDR_4BYTE', 'CFG_DRIVERS_NANDFLASH',
+                    "-:TARGET_CHIP_BRANDY=1", "-:BRANDY_CHIP_V100=1", 'ENABLE_UIKIT', 'SW_UART_DEBUG', "HASH_MEM_COPY",
+                    'ENABLE_ECC'],
+        'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", "osal", "arch_port", "-:testsuite",
+                          "liteos_port", 'lcd', 'qspi_display', 'dfx_file_operation',
+                          'psram', 'hal_mipi', 'mipi_tx', 'non_os', 'touch',
+                          'x_dpal', 'x_vfs', 'x_disk', 'x_fat', 'drv_mmc', 'x_vfs_private',
+                          'ulp_aon', 'hal_l2ram', 'pm_service', 'pm_brandy', 'cmn_header'],
+        'ram_component_set': ['pinctrl', 'dfx_set']
+    },
+    'testsuite-brandy-sdk': {
+        'base_target_name': 'target_brandy_testsuite_application',
+        'board': 'evb',
+        'defines': ['SW_UART_DEBUG', 'USE_CMSIS_OS', 'CFG_DRIVERS_NANDFLASH',
+                    'PRE_ASIC', 'BRANDY_PRODUCT_EVB4',
+                    '_ALL_SOURCE', '__LITEOS__', 'SUPPORT_CXX', 'ENABLE_UIKIT',
+                    "-:TARGET_CHIP_BRANDY=1", "-:BRANDY_CHIP_V100=1", 'MULTIPLEXING_UART',
+                    'CONFIG_SPI_SUPPORT_POLL_AND_DMA_AUTO_SWITCH', 'CONFIG_SPI_AUTO_SWITCH_DMA_THRESHOLD=0x8',
+                    'CONFIG_I2C_SUPPORT_POLL_AND_DMA_AUTO_SWITCH', 'CONFIG_I2C_POLL_AND_DMA_AUTO_SWITCH_THRESHOLD=0x8'],
+        'ram_component': ["osal", "arch_port", "liteos_port", 'psram', 'pm_service', 'pm_brandy',
+                          'hal_mips', 'lcd', 'qspi_display', 'hal_dma_v100', "dfx_port_brandy",
+                          'dfx_log_brandy', 'hal_mipi', 'mipi_tx', 'non_os', 'touch', 'ulp_aon',
+                          'hal_l2ram', "test_security", "test_spi", 'dfx_file_operation',
+                          "test_timer", "test_int", "test_pm",
+                          "test_lcd", "test_qspi_display", "test_systick", "test_tcxo",  "test_watchdog",
+                          "test_vfs_emmc", "test_flash", "test_pwm", "test_i2c", "test_cmsis",
+                          "test_xip", "test_mipi", "test_touch", 'algorithm', 'test_sdio', 'x_vfs_private',
+                          'x_dpal', 'x_vfs', 'x_disk', 'x_fat', 'drv_mmc', 'fs_yaffs2' , 'nand_flash' , 'mtd_com',
+                          'cmn_header', 'test_calendar', 'test_gpio', 'test_pinctrl', 'test_dma', 'test_uart',
+                          'test_reboot', 'test_rtc_unified',
+                          'test_nandflash', 'test_adc', 'test_pmp', 'efuse', 'hal_efuse_v100', 'efuse_porting'],
+        'ram_component_set': ['dfx_set', '-:gpu_test', 'rtc_unified'],
+        'os': 'liteos',
+    },
+    'brandy-ssb': {
+        'base_target_name': 'target_ssb_template_brandy',
+        'board': 'evb',
+        'defines': ["-:TARGET_CHIP_BRANDY=1", "-:BRANDY_CHIP_V100=1", "PRE_ASIC", "BRANDY_PRODUCT_EVB4",
+                    "SSB_USE_PLL", "VERSION_STANDARD", "BUILD_APPLICATION_SSB", "LIBBOOTLOADER", "LIBCODELOADER",
+                    "LIBCPU_UTILS", "LIBAPP_VERSION", "LIBPANIC", "LIBCONNECTIVITY", "LIBERROR_CODE", "LIBSEC_RANDOM",
+                    "LIBCODELOADER_SSB", "LIBJLINK_LOAD", "LIBLIB_UTILS", "LIBBUILD_VERSION",
+                   'ENABLE_ECC',
+                   "CFG_DRIVERS_NANDFLASH",
+                    "NO_TIMEOUT", "CONFIG_UART_BAUD_RATE_DIV_8", 'SW_UART_DEBUG', 'LARGE_BUFFER',
+                    'FT_SINGLE_UART'
+                    ],
+        'ram_component': ['arch_port', 'hal_l2ram', 'sec_boot', 'libboundscheck',
+                          'dfx_exception', 'error_code', 'psram', 'osal', 'cmn_header', 
+                          'boot_ulp', 
+                          'boot_nandflash'
+                          ],
+        'ram_component_set': ['pinctrl'],
+        'target': 'ssb',
+    }
+}
+
+target_group = {
+    # ci protect target list
+    'pack_brandy_target1': ['brandy-ssb', 'brandy-target1-r', 'brandy-target1'],
+    'pack_brandy_target3': ['brandy-ssb', 'brandy-target3-r', 'brandy-target3'],
+    'pack_brandy_target4': ['brandy-ssb', 'brandy-target4-r', 'brandy-target4'],
+    'pack_brandy_target5': ['brandy-ssb', 'brandy-target5-r', 'brandy-target5'],
+    'pack_brandy_native_js': ['brandy-ssb', 'brandy-native-js-r', 'brandy-native-js'],
+    'pack_brandy_xts': ['brandy-ssb', 'brandy-xts-r', 'brandy-xts'],
+
+    'brandy_all': ['brandy-ssb',
+                   'brandy-target1', 'brandy-target3', 'brandy-target4', 'brandy-target5', 'brandy-native-js', 'brandy-xts',
+                   'brandy-target1-r', 'brandy-target3-r', 'brandy-target4-r', 'brandy-target5-r', 'brandy-native-js-r', 'brandy-xts-r',
+                   'testsuite-brandy-sdk']
+}
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/drivers/boards/brandy_evb/board_config/board_evb.h b/fd230_driver_patch/20240503.170906/code/sdk/drivers/boards/brandy_evb/board_config/board_evb.h
new file mode 100644 (file)
index 0000000..d3b5782
--- /dev/null
@@ -0,0 +1,308 @@
+/*
+ * Copyright (c) @CompanyNameMagicTag 2018-2021. All rights reserved.
+ * Description:   brandy evb board config
+ * Author: @CompanyNameTag
+ * Create: 2020-02-19
+ */
+#ifndef BOARD_EVB_CONFIG_H
+#define BOARD_EVB_CONFIG_H
+
+#include "pinctrl_porting.h"
+#include "gpio_porting.h"
+#include "platform_types.h"
+
+#ifdef SUPPORT_CAT1_SERVICE
+#include "cat1_ctl.h"
+#endif
+
+#ifdef ENABLE_CYWEE
+extern void cywee_int1_callback(pin_t pin, uintptr_t param);
+#endif
+/**
+ * @addtogroup connectivity_config_boards
+ * @{
+ */
+/**
+ * @brief  Global evb pio functions.
+ */
+const hal_pio_config_t g_pio_function_config[PIN_MAX_NUMBER] = {
+    { HAL_PIO_FUNC_QSPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_EGPIO0
+    { HAL_PIO_FUNC_QSPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },  // S_EGPIO1
+    { HAL_PIO_FUNC_QSPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_EGPIO2
+    { HAL_PIO_FUNC_QSPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_EGPIO3
+    { HAL_PIO_FUNC_QSPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },  // S_EGPIO4 clk
+    { HAL_PIO_FUNC_QSPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },  // S_EGPIO5 cs
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },     // S_EGPIO6
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_EGPIO7
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_EGPIO8
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_EGPIO9
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_EGPIO10
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_EGPIO11
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_EGPIO12
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_EGPIO13
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_EGPIO14
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_EGPIO15
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_EGPIO16
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_EGPIO17
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_EGPIO18
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_EGPIO19
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_EGPIO20
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN,  HAL_PIO_IE_ENBALE },   // S_EGPIO21
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX,  HAL_PIO_IE_DISABLE },   // S_EGPIO22 clk
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX,  HAL_PIO_IE_DISABLE },   // S_EGPIO23 ce
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN,  HAL_PIO_IE_ENBALE },    // S_EGPIO24
+    { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN,  HAL_PIO_IE_ENBALE },    // S_EGPIO25
+
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO0 NC
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO1 NC
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO2 NC
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO3 NC
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO4 NC
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO5 NC
+#if (defined CFG_DRIVERS_NANDFLASH)
+    { HAL_PIO_FUNC_QSPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_HGPIO6
+    { HAL_PIO_FUNC_QSPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_HGPIO7
+    { HAL_PIO_FUNC_QSPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_HGPIO8
+    { HAL_PIO_FUNC_QSPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_HGPIO9
+    { HAL_PIO_FUNC_GPIO,  HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },  // S_HGPIO10
+    { HAL_PIO_FUNC_QSPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },  // S_HGPIO11 cs0
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_HGPIO12 cs1
+    { HAL_PIO_FUNC_GPIO,  HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },  // S_HGPIO13
+    { HAL_PIO_FUNC_GPIO,  HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },  // S_HGPIO14
+    { HAL_PIO_FUNC_QSPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },  // S_HGPIO15 clk
+#else
+    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO6
+    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO7
+    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO8
+    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO9
+    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO10  
+    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO11
+    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO12  
+    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO13  
+    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO14  
+    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_HGPIO15 emmc clk
+#endif
+    { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_MGPIO0   NC
+    { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_MGPIO1   NC
+    { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_MGPIO2   NC
+    { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_MGPIO3   NC
+
+// #if (defined BRANDY_PRODUCT_EVB4)
+    { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_MGPIO4   NC
+// #else
+    // { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_MGPIO4   NC
+// #endif
+
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },     // S_MGPIO5  NC
+    { HAL_PIO_FUNC_SPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },  // S_MGPIO6  SPI1 DI
+    { HAL_PIO_FUNC_SPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },  // S_MGPIO7 SPI1 DO
+    { HAL_PIO_FUNC_SPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },  // S_MGPIO8 SPI1 CLK
+    { HAL_PIO_FUNC_SPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_MGPIO9 SPI1 CS0
+    { HAL_PIO_FUNC_SPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_MGPIO10 SPI1 CS1 NC
+
+    { HAL_PIO_FUNC_I2C0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO11 i2c0 SCL NC
+    { HAL_PIO_FUNC_I2C0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO12 I2C0 SDA
+    { HAL_PIO_FUNC_I2C1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO13 I2C1 SCL touch i2c
+    { HAL_PIO_FUNC_I2C1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO14  I2C1 SDA
+    { HAL_PIO_FUNC_I2C2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO15 I2C2 SCL Sensor 6Öá Ö¸ÄÏÕë ÐÄÂÊ
+    { HAL_PIO_FUNC_I2C2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO16 I2C2 SDA Sensor
+    { HAL_PIO_FUNC_I2C3_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO17 i2c3 SCL    smart pa\ Ô¤ÁôÂí´ï¿ØÖÆ \°²È«Ð¾Æ¬
+    { HAL_PIO_FUNC_I2C3_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO18  I2C3 SDA
+    { HAL_PIO_FUNC_UART1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },    // S_MGPIO19 uart1 tx
+    { HAL_PIO_FUNC_UART1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },      // S_MGPIO20 uart1 rx
+    { HAL_PIO_FUNC_UART1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },     // S_MGPIO21 uart1 rts
+    { HAL_PIO_FUNC_UART1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },     // S_MGPIO22 uart1 cts
+    { HAL_PIO_FUNC_SPI2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_MGPIO23 NC
+    { HAL_PIO_FUNC_SPI2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_MGPIO24 NC
+    { HAL_PIO_FUNC_SPI2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_MGPIO25 NC
+    { HAL_PIO_FUNC_SPI2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_MGPIO26 NC
+#if (defined QSPI_DISPLAY)
+    { HAL_PIO_FUNC_QSPI2, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO27
+    { HAL_PIO_FUNC_QSPI2, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO28
+    { HAL_PIO_FUNC_QSPI2, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO29
+    { HAL_PIO_FUNC_QSPI2, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO30
+    { HAL_PIO_FUNC_QSPI2, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO31
+    { HAL_PIO_FUNC_QSPI2, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO32
+#else
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_MGPIO27
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_MGPIO28
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_MGPIO29
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_MGPIO30
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_MGPIO31
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_MGPIO32
+#endif
+    { HAL_PIO_FUNC_UART_HS_UART, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE }, // S_MGPIO33 huart tx
+    { HAL_PIO_FUNC_UART_HS_UART, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },   // S_MGPIO34 huart rx
+    { HAL_PIO_FUNC_UART_HS_UART, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO35
+    { HAL_PIO_FUNC_UART_HS_UART, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO36
+#if 0
+    { HAL_PIO_FUNC_UART2_M2, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },     // S_MGPIO37 uart tx
+    { HAL_PIO_FUNC_UART2_M2, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },       // S_MGPIO38 uart rx
+#else
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },     // S_MGPIO37 uart tx  NC
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },       // S_MGPIO38 uart rx  NC
+#endif
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },     // S_AGPIO_L0  NC
+
+    { HAL_PIO_FUNC_I2S1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L1 i2s1
+    { HAL_PIO_FUNC_I2S1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L2
+    { HAL_PIO_FUNC_I2S1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L3
+    { HAL_PIO_FUNC_I2S1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L4
+
+    { HAL_PIO_FUNC_I2S0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L5
+    { HAL_PIO_FUNC_I2S0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_L6 i2s0
+    { HAL_PIO_FUNC_I2S0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_L7
+    { HAL_PIO_FUNC_I2S0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_L8
+
+#if (defined FT_BT_UART)
+    { HAL_PIO_FUNC_UART2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },  // S_AGPIO_L9 uart2 txd
+    { HAL_PIO_FUNC_UART2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },    // S_AGPIO_L10 uart2 rxd
+#else
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L9 dsp uart   TP35
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L10 dsp uart   TP36
+#endif
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_AGPIO_L11 G_INT1
+
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L12 i2c data HX3507_SDIO
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L13 i2c CLK HX3507_SCLK
+
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE }, // S_AGPIO_L14   NC
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE }, // S_AGPIO_L15   NC
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE }, // S_AGPIO_L16   NC
+    
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_AGPIO_L17 HX3507_INT   not use
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_AGPIO_L18  VDDEN  //ÔÝʱÎÞÓ㬲ÉÓÃVDDIO Ä¬ÈÏ¿ªÆô EXt V3.0 EXt V1.8
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },  // S_AGPIO_L19  G_INT2  //ÔÝʱ²»Óà
+
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE }, // S_AGPIO_L20  0.2C_CHRG
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },    // S_AGPIO_L21  NTC_VDD_ON ¸øµÍ´ò¿ª NTCÉÏÀ­µçÔ´
+#ifdef QSPI_DISPLAY
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L22 QSPI TE
+#else
+    { HAL_PIO_FUNC_TE, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },      // S_AGPIO_L22 MIPI TE
+#endif
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L23 CAT_1_PWR_ON ¿ØÖÆCAT_1¿ª»ú½Å£¬»òÕß¿ØÖÆ CAT1µçÔ´   À­¸ßÓÐЧ
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L24 LCM_EN
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L25  //////////// audio pa reset
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L26 ÐÄÂʸ´Î» PPG reset
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L27    LCM reset
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L28    CAT_1¸´Î» CAT1_RESET_N  À­µÍÓÐЧ
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L29    charge done info ¼ì²âÊÇ·ñ³äÂúµç
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L30   KP_MKIN1 »½ÐÑ CAT1 £¬Êä³ö
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L31    KP_MKOUIT1 »½ÐÑ À¶ÑÀ ,ÊäÈë
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_AGPIO_L32    NC
+
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R0   PRG_LED_POWER ON  ÐÄÂʵȵçÔ´¿ØÖƽÅ
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R1   SE_REST °²È«Ð¾Æ¬¸´Î»»½ÐѽÅ
+  #if VIB_USE_PWM
+    // { HAL_PIO_FUNC_PWMP1_M2, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_NONE, HAL_PIO_IE_DISABLE },   // S_AGPIO_R2     VIBR_PWM Âí´ï¿ØÖƽмæÈÝÔ¤ÁôÂí´ïÇý¶¯¸´Î»½Å
+    // { HAL_PIO_FUNC_PWMN1_M3, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_NONE, HAL_PIO_IE_DISABLE },   // S_AGPIO_R2     VIBR_PWM Âí´ï¿ØÖƽмæÈÝÔ¤ÁôÂí´ïÇý¶¯¸´Î»½Å
+  #else
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_AGPIO_R2     VIBR_PWM Âí´ï¿ØÖƽмæÈÝÔ¤ÁôÂí´ïÇý¶¯¸´Î»½Å
+  #endif
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE  },   // S_AGPIO_R3     NC   
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_DISABLE  },    // S_AGPIO_R4     tp reset
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE  },   // S_AGPIO_R5     touch int
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_R6     PRG_INT ÐÄÂÊÖжÏ
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R7     GYRO_INT2
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R8     GYRO_INT1
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R9     BAT_CHARGE_OFF ¹Øµô³äµç Î¶ȸߵÄʱºò
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_R10   Key2 ///////////////////HAL_PIO_IE_ENBALE input enable
+
+#if CORE == APPS
+    { HAL_PIO_FUNC_INVALID, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE }, // ULP_GPIO0 mode not config
+    { HAL_PIO_FUNC_INVALID, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE }, // ULP_GPIO1 mode not config
+    { HAL_PIO_FUNC_INVALID, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE }, // ULP_GPIO2 mode not config
+    { HAL_PIO_FUNC_INVALID, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE }, // ULP_GPIO3 mode not config
+    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // ULP_GPIO4
+    { HAL_PIO_FUNC_SWD, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },       // ULP_GPIO5
+    { HAL_PIO_FUNC_SWD, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },       // ULP_GPIO6
+#endif
+};
+/**
+ * @}
+ */
+
+
+/**
+ * @addtogroup connectivity_config_boards
+ * @{
+ */
+/**
+ * @brief  Global evb gpio functions.
+ * 
+ * 
+ * typedef struct {
+    pin_t gpio;
+    hal_gpio_direction_t direction;
+    hal_gpio_level_t level;
+    uint32_t triger;
+    hal_gpio_callback_t callback;
+} hal_gpio_config_t;
+ */
+
+
+//ĬÈÏ¿ªÆôCat1 È»ºóÔÙ¸ù¾ÝÅäÖþö¶¨ÊÇ·ñ¹Ø±Õ. 
+//ĬÈϲ»¿ªÆô ppg checkidʧ°Ü£¬Ô­Òòδ֪£¬ÔÝʱ¿ª»ú¿ªÆôcat1
+#define DEFAULT_POWERON_CAT1 0
+
+//ÐèÒªÅäÖÃĬÈÏÊä³öµÄ£¬ÒÔ¼°ÐèÒªÅäÖÃĬÈÏÊäÈëÖжϺ¯ÊýµÄ¡£
+const hal_gpio_config_t g_gpio_function_config[PIN_MAX_NUMBER] = {
+
+#if DEFAULT_POWERON_CAT1
+    //    S_AGPIO_L23 CAT_1_PWR_ON ----- high power on
+    {   S_AGPIO_L23, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
+   // S_AGPIO_L28   Cat1 reset  ---- low reset
+    {   S_AGPIO_L28, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
+#else
+  //    S_AGPIO_L23 CAT_1_PWR_ON ----- high power on
+    {   S_AGPIO_L23, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
+   // S_AGPIO_L28   Cat1 reset  ---- low reset
+    {   S_AGPIO_L28, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
+#endif
+    // S_AGPIO_L17   HX3507_INT 
+    // {   S_AGPIO_L17, HAL_GPIO_DIRECTION_INPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
+    // S_AGPIO_L12  SDIO_BT
+    {   S_AGPIO_L12, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
+    // S_AGPIO_L13   SCLK_BT
+    {   S_AGPIO_L13, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
+
+     // S_AGPIO_L26 ÐÄÂʸ´Î» PPG reset
+    {   S_AGPIO_L26, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
+    // S_AGPIO_R0 PRG_LED_POWER ON  ÐÄÂʵȵçÔ´¿ØÖƽÅ
+    {   S_AGPIO_R0, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
+
+    //S_AGPIO_L21 NTC_VDD_ON ¸øµÍ´ò¿ª NTCÉÏÀ­µçÔ´ ,ĬÈϹرÕ
+    {   S_AGPIO_L21, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
+#if 1  //ĬÈÏÕý³£³äµç 
+//    #define GPIO_PIN_ENABLE_CHARGE S_AGPIO_R9  //low enable
+// #define GPIO_PIN_ENABLE_CHARGE_0_2C S_AGPIO_L20   //low 0.2c µÍµçÁ÷³äµç
+    {   S_AGPIO_R9, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
+    {   S_AGPIO_L20, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
+#else
+    {   S_AGPIO_R9, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
+    {   S_AGPIO_L20, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
+#endif
+
+//ĬÈϹرÕÂí´ï
+    {   S_AGPIO_R2, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
+//ĬÈÏ¿ªÆô EXT LDO V3.0 V1.8
+    {   S_AGPIO_L18, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
+
+#ifdef ENABLE_CYWEE
+    /**G sensor G_INT1 S_AGPIO_L11 G_INT2 S_AGPIO_L19*/
+    //{   S_AGPIO_L11, HAL_GPIO_DIRECTION_INPUT, HAL_GPIO_LEVEL_LOW, GPIO_INTERRUPT_RISING_EDGE, cywee_int1_callback },
+    {   S_AGPIO_L19, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_DEDGE, cywee_int1_callback },
+    // {   S_AGPIO_L19, HAL_GPIO_DIRECTION_INPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
+#endif   
+    /**S_AGPIO_R1 GPO alipayĬÈÏresetpin*/
+    {   S_AGPIO_R1, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
+#ifdef SUPPORT_CAT1_SERVICE
+    /**cat1 ring input key*/
+    {   S_AGPIO_L31, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_DEDGE,  cat1_ring_isr_callback},
+#endif
+};
+/**
+ * @}
+ */
+#endif
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/drivers/boards/brandy_evb/product/product_evb4_standard.h b/fd230_driver_patch/20240503.170906/code/sdk/drivers/boards/brandy_evb/product/product_evb4_standard.h
new file mode 100644 (file)
index 0000000..04cee17
--- /dev/null
@@ -0,0 +1,217 @@
+/*
+ * Copyright (c) @CompanyNameMagicTag 2020-2023. All rights reserved.
+ * Description: product EVB4 standard config
+ * Author: @CompanyNameTag
+ * Create:  2023-03-07
+ */
+#ifndef PRODUCT_EVB4_STANDARD_CONFIG_H
+#define PRODUCT_EVB4_STANDARD_CONFIG_H
+
+/**
+ * @defgroup connectivity_config_product PRODUCT
+ * @ingroup  connectivity_config
+ * @{
+ */
+/* Platform board config, need check if it support or not carefully. */
+#define BTH_WITH_SMART_WEAR                 YES
+#define APP_WRITE_OTP_ENABLE                NO
+#define APP_HEAP_SIZE                       0x18000    // the minimum APP heap size (96kB)
+#define USE_FLASH_SUSPEND_AND_RESUME        NO
+#define WAIT_APPS_DUMP_FOREVER              NO
+#define TWS_MPU_XIP_PROTECT                 NO
+#define SSB_IMAGE_PAGES                     27
+#ifdef CONFIG_LOW_POWER_TEST
+#define ENABLE_LOW_POWER                    YES
+#else
+#define ENABLE_LOW_POWER                    NO
+#endif
+#define DTB_IMAGE_PAGES                     0
+#define RECOVERY_IMAGE_PAGES                64
+#define RESERVE_IMAGE_PAGES                 0
+#define BT_IMAGE_PAGES                      112
+#define HIFI0_IMAGE_PAGES                   112
+#define HIFI0_CODEC_PAGES                   320
+#define APP_IMAGE_PAGES                     1353
+#define NV_IMAGE_PAGES                      4
+#define FOTA_IMAGE_PAGES                    3
+#define FOTA_IMAGE_START                    0x770000
+#define SSB_FOTA_OFFSET                     0x0
+#define XO_CTRIM_VALUR_DEFAULT              0x56
+#define DSP1_IPC_ENABLE                     NO
+#define APP_BTN_TASK_MONITOR_ENABLE         NO
+#define SSB_FOTA_MODE_TWS                   YES
+#define DSP_EXTEND_OCRAM_SIZE               1310720 // Unit byte, = 1280 KB
+#define OSC_EN_CALLBACK_BY_PLT              YES
+#define BT_MIPS_DEBUG                       NO
+#define NON_OS_CRITICAL_RECORD              NO
+#define ENABLE_MASSDATA_RECORD              NO
+#define USE_COMPRESS_LOG_INSTEAD_OF_SDT_LOG NO
+#define COMPRESS_LOG_TRIGGER_THRESHOLD      0
+#define COMPRESS_LOG_COUNT_THRESHOLD        0xFFFFFFFF
+#define EXCEPTION_TEST_ENABLE               NO
+#define LOG_LEVEL_APP_DEFAULT_CONFIG        3   // Info level
+#define LOG_LEVEL_BT_DEFAULT_CONFIG         3   // Info level
+#define LOG_LEVEL_DSP_DEFAULT_CONFIG        3   // Info level
+#define BCPU_HEAP_MININUM_SIZE              0xA000 // 40KB
+#define SYS_DEBUG_MODE_ENABLE               YES
+#define PROMPT_TONE_REGION_LENGTH           0x2800
+#define AUDIO_DATA_STREAM_REGION_LENGTH     0x2000
+#define BT_MASSDATA_LENGTH                  0x400
+#define APP_MASSDATA_LENGTH                 0x800
+#define APP_LOGGING_LENGTH                  0x1C00
+#define DSP_LOGGING_LENGTH                  0x2000
+#define PSRAM_DENSITY_MB                    32
+#define RC_CLOCK_ON                         NO
+#define SMART_WATCH_BT_COEX_PIN_SWITCH      NO   // pinmux switch in the Coexistence of BT and WiFi of smart watch
+#define CAP_SENSOR_BUFF_LEN                 128
+#define BT_L2RAM_AREA_SIZE                  3    // 384k, Reference the enum Value of hal_b_memory_share_config_t
+#define DSP_L2RAM_AREA_TOTAL                10
+#define GPU_L2RAM_AREA_TOTAL                11
+#ifndef CONFIG_PSRAM_SUPPORT
+#define DSP_L2RAM_AREA_SIZE                 6    // 无PSRAM & 小型化场景分配给DSP 6块*128K=768KB 剩余512K系统使用
+#else
+#if defined(CONFIG_SEA_PHS_SUPPORT)
+#define DSP_L2RAM_AREA_SIZE                 10   // 语音唤醒场景分配给DSP 10块*128K=1280KB DSP L2M不给系统使用
+#else
+#define DSP_L2RAM_AREA_SIZE                 8    // 正常场景分配给DSP 8块*128K=1024KB 剩余256K系统使用
+#endif /* CONFIG_SEA_PHS_SUPPORT */
+#endif /* CONFIG_PSRAM_SUPPORT */
+#define PUYA_FLASH_SUPPORT                  YES
+
+/********************display config********************/
+#define DOUBLE_BUFFER                     1
+#if defined(QSPI_DISPLAY)
+#define RESOLUTION_WIDTH                  194
+#define RESOLUTION_HEIGHT                 368
+#elif defined(MEMORY_MINI)
+#define RESOLUTION_WIDTH                  240
+#define RESOLUTION_HEIGHT                 296
+#elif defined(SUPPORT_SOFT_SEND_FRM)
+#define RESOLUTION_WIDTH                  368
+#define RESOLUTION_HEIGHT                 448
+#else
+#define RESOLUTION_WIDTH                  466//454
+#define RESOLUTION_HEIGHT                 466//454
+#endif
+
+/********************Other module board config********************/
+#define BTC_SWITCH_COEX                     YES
+#define BTC_SMART_WEAR_WLCOEX               YES
+#define BTC_WITH_SMART_WEAR                 YES
+#define BTC_TWS_MONITOR                     YES
+#define BTC_ICO_SUPPORT                     YES
+#define BTC_DUAL_ANT_SWITCH_SUPPORT         NO
+#define BTC_GET_EMC_FROM_PLATFORM           YES  // 后续耳机产品通过HCI传递NV数据实现后,该选项需要置为NO
+#define BTSNOOP_ENABLE                      NO
+#define TWS_USER_CHR_RECORD                 NO
+#define BTH_WEAR_ENABLE_AUDIO_SINK          NO
+#define BTH_WEAR_ENABLE_AUDIO_GATEWAY       NO
+#define BTH_WEAR_BREDR_DOUBLE_CONNECT       NO
+#define BTC_DFX_LOG_HELP_SUPPORT            NO
+#define FACTORY_CALI                        NO
+#define BTH_WEAR_ENABLE_CONNECT_MANAGER     NO
+#define BTH_WEAR_ENABLE_BLE_FEATURES        YES
+#define BTH_WEAR_ENABLE_HFP_FEATURES        NO
+#define WEAR_USER_CONFIG                    NO
+#define BTH_HIGH_POWER                      YES
+#define MULTI_CONNECT                       YES
+#define BTH_CONFIG_HDAP                     YES
+#define DEVICE_MANAGE_FEATURE               YES
+#define BTH_CALL_LC3_32K                    YES
+#define BTH_ENABLE_LC3_CODEC                YES
+#define ENABLE_CHANGE_DEVICE_NAME           YES
+#define BTH_DIP_PRODUCT_ID                  0x4106
+#define BTH_ENABLE_L2HC_CODEC               YES
+#define ENABLE_BT_XO_16M                    NO
+#define BTH_WSTP_CMD_SUPPORT                YES
+#define PRODUCT_SUPPORT_MODE_SWITCH         YES
+#define BT_MANAGER_DEPLOYED                 2
+#define BT_CODEC_TID                        2
+#define BTH_WEAR_ENABLE_AVRCP_TARGET        NO
+#define BTH_WEAR_ENABLE_AVRCP_CONTROLLER    NO
+#define BTH_WEAR_ENABLE_AUDIO_SOURCE        NO
+#define BTH_WEAR_ALLOW_INQUIRY_SCAN         YES
+#define BTH_WEAR_ENABLE_HALL_STATE          NO
+
+// 音频内置输入设备
+#define BUILTIN_AI_PORT                            0x50  // 参考 soc_uapi_ai.h 中 UAPI_AI_PORT_LPADC0 枚举
+#define BUILTIN_AI_PORT_ATTR_ADC_RX_TYPE           0     // 参考 soc_uapi_ai.h 中 UAPI_AI_RX_DEFAULT 枚举
+#define BUILTIN_AI_PCM_ATTR_AUDIO_CH               1     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_CHANNEL_1 枚举
+#define BUILTIN_AI_PCM_ATTR_BIT_DEPTH              16    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_BIT_DEPTH_16 枚举
+#define BUILTIN_AI_PCM_ATTR_SAMPLE_RATE            16000 // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_SAMPLE_RATE_16K 枚举
+#define BUILTIN_AI_PCM_ATTR_FRAME_PER_SEC          100   // 每秒帧数
+
+// 音频内置输出设备
+#define BUILTIN_SND_OUT_PORT                       0x10  // 参考 soc_uapi_sound.h 中 UAPI_SND_OUT_PORT_I2S0 枚举
+#define BUILTIN_SND_OUT_PORT_NUM                   1     // 端口个数
+#define BUILTIN_SND_OUT_AUDIO_CH                   2     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_CHANNEL_2 枚举
+#define BUILTIN_SND_OUT_BIT_DEPTH                  16    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_BIT_DEPTH_16 枚举
+#define BUILTIN_SND_OUT_SAMPLE_RATE                48000 // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_SAMPLE_RATE_48K 枚举
+#define BUILTIN_SND_OUT_I2S_ATTR_I2S_BCLK          8     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_BCLK_8_DIV 枚举
+#define BUILTIN_SND_OUT_I2S_ATTR_BIT_DEPTH         16    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_BIT_DEPTH_16 枚举
+#define BUILTIN_SND_OUT_I2S_ATTR_AUDIO_CH          2     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_CHANNEL_2 枚举
+#define BUILTIN_SND_OUT_I2S_ATTR_I2S_STD_MODE      0     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_STD_MODE 枚举
+#define BUILTIN_SND_OUT_I2S_ATTR_MASTER            1     // 1:主设备,0:从设备
+#define BUILTIN_SND_OUT_I2S_ATTR_I2S_MCLK          1     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_MCLK_256_FS 枚举
+#define BUILTIN_SND_OUT_I2S_ATTR_I2S_PCM_DELAY     1     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_PCM_1_DELAY 枚举
+#define BUILTIN_SND_OUT_I2S_ATTR_SAMPLE_RISE_EDGE  1     // 参考 soc_uapi_audio.h 中 pcm_sample_rise_edge 成员
+
+// 音频外挂输入设备
+#define EXTERNAL_AI_PORT                           1     // 参考 soc_uapi_ai.h 中 UAPI_AI_PORT_I2S1 枚举
+#define EXTERNAL_AI_I2S_ATTR_MASTER                0     // 1:主设备,0:从设备
+#define EXTERNAL_AI_I2S_ATTR_I2S_MODE              1     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_PCM_MODE 枚举
+#define EXTERNAL_AI_I2S_ATTR_MCLK                  6     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_MCLK_1536_FS 枚举
+#define EXTERNAL_AI_I2S_ATTR_BCLK                  48    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_BCLK_48_DIV 枚举
+#define EXTERNAL_AI_I2S_ATTR_BIT_DEPTH             16    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_BIT_DEPTH_16 枚举
+#define EXTERNAL_AI_I2S_ATTR_AUDIO_CH              2     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_CHANNEL_2 枚举
+#define EXTERNAL_AI_I2S_ATTR_SAMPLE_RISE_EDGE      1     // 参考 soc_uapi_audio.h 中 pcm_sample_rise_edge 成员
+#define EXTERNAL_AI_I2S_ATTR_PCM_DELAY_CYCLE       1     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_PCM_1_DELAY 枚举
+#define EXTERNAL_AI_PCM_ATTR_CHANNELS              1     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_CHANNEL_2 枚举
+#define EXTERNAL_AI_PCM_ATTR_BIT_DEPTH             16    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_BIT_DEPTH_16 枚举
+#define EXTERNAL_AI_PCM_ATTR_SAMPLE_RATE           8000 // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_SAMPLE_RATE_16K 枚举
+#define EXTERNAL_AI_PCM_ATTR_FRAME_PER_SEC         50   // 每秒帧数  , EG810 pcm 20ms 一帧
+
+// 音频外挂输出设备
+#define EXTERNAL_SND_OUT_PORT                      0x11  // 参考 soc_uapi_sound.h 中 UAPI_SND_OUT_PORT_I2S1 枚举
+#define EXTERNAL_SND_OUT_AUDIO_CHANNEL             1     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_CHANNEL_2 枚举
+#define EXTERNAL_SND_OUT_AUDIO_BIT_DEPTH           16    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_BIT_DEPTH_16 枚举
+#define EXTERNAL_SND_OUT_AUDIO_SAMPLE_RATE         8000 // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_SAMPLE_RATE_16K 枚举
+#define EXTERNAL_SND_OUT_PORT_NUM                  1     // 端口个数
+#define EXTERNAL_SND_OUT_I2S_ATTR_BIT_DEPTH        16    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_BIT_DEPTH_16 枚举
+#define EXTERNAL_SND_OUT_I2S_ATTR_CHANNEL          2     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_CHANNEL_2 枚举
+#define EXTERNAL_SND_OUT_I2S_ATTR_I2S_MODE         1     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_PCM_MODE 枚举
+#define EXTERNAL_SND_OUT_I2S_ATTR_MCLK             6     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_MCLK_1536_FS 枚举 12.288M /16k = 
+#define EXTERNAL_SND_OUT_I2S_ATTR_MASTER           0     // 1:主设备,0:从设备
+#define EXTERNAL_SND_OUT_I2S_ATTR_SAMPLE_RISE_EDGE 1     // 参考 soc_uapi_audio.h 中 pcm_sample_rise_edge 成员
+#define EXTERNAL_SND_OUT_I2S_ATTR_BCLK             48    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_BCLK_48_DIV 枚举 12.288M / 256k = 48
+
+// Sleep option
+#define CONFIG_PM_TICKLESS_EN               YES
+#define CONFIG_PM_POWER_GATING_EN           YES
+#define CONFIG_PM_SLEEP_RECORD_EN           YES
+#define CONFIG_PM_VETO_TRACK_EN             NO
+#define CONFIG_PM_SLEEP_INT_EN              NO
+
+// Double-click the key
+#define CONFIG_SUPPORT_BUTTON_DOUBLE_CLICK  NO
+
+// LCD VCI_EN
+#define VCI_LCD_GPIO                        S_AGPIO_L24
+#define DISPLAY_TE_GPIO                     S_AGPIO_L22
+#define RESET_LCD_GPIO                      S_AGPIO_L27
+
+// TP CONFIG
+#define ZTW523_I2C_BUS                      I2C_BUS_1
+#define ZTW523_INT_GPIO                     S_AGPIO_R5
+#define ZTW523_RESET_GPIO                   S_AGPIO_R4
+#define TMA525B_I2C_BUS                     I2C_BUS_1
+#define TMA525B_INT_GPIO                    S_AGPIO_R5
+#define TMA525B_RESET_GPIO                  S_AGPIO_R4
+#define FT6X46_I2C_BUS                      I2C_BUS_1
+#define FT6X46_INT_GPIO                     S_AGPIO_R5
+#define FT6X46_RESET_GPIO                   S_AGPIO_R4
+
+/**
+ * @}
+ */
+#endif
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/drivers/chips/brandy/porting/uart/uart_porting.c b/fd230_driver_patch/20240503.170906/code/sdk/drivers/chips/brandy/porting/uart/uart_porting.c
new file mode 100644 (file)
index 0000000..d2203a1
--- /dev/null
@@ -0,0 +1,491 @@
+/**
+ * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved. \n
+ *
+ * Description: Provides uart port template \n
+ * Author: @CompanyNameTag \n
+ * History: \n
+ * 2022-06-06, Create file. \n
+ */
+#include <stdio.h>
+#include "dma_porting.h"
+#include "debug_print.h"
+#include "hal_uart_v120.h"
+#include "uart_porting.h"
+#ifdef SUPPORT_HAL_PINCTRL
+#include "pinctrl_porting.h"
+#include "pinctrl.h"
+#endif
+#include "uart.h"
+#include "oal_interface.h"
+#include "platform_core.h"
+#include "securec.h"
+#include "soc_osal.h"
+#ifdef SUPPORT_CLOCKS_CORE
+#include "clocks_core_common.h"
+#endif
+#if defined(SUPPORT_TEST_COMMON)
+#include "test_suite_uart.h"
+#endif
+#if defined(SUPPORT_AT_CMD)
+#include "at_cmd_api.h"
+#endif
+#ifndef BUILD_APPLICATION_SSB
+#include "log_uart.h"
+#include "cmsis_os.h"
+#endif
+#if defined(SW_RTT_DEBUG)
+#include "SEGGER_RTT.h"
+#endif
+
+#ifdef BUILD_APPLICATION_SSB
+#define UART_RX_BUFFER_SIZE 1
+#else
+#define UART_RX_BUFFER_SIZE 56
+#endif
+
+#define AT_BLE_HEADER_LENGTH 49
+#define AT_CMD_BUFSIZE_MAX   256
+#define UARTILPR        0x20
+#define UARTIBRD        0x24
+#define UARTFBRD        0x28
+#define UARTLCRH        0x2c
+#define UARTCR          0x30
+#define UARTIFLS        0x34
+#define UARTIMSC        0x38
+#define UARTDMACR       0x48
+#define UARTRESET       (M_CTL_RB_BASE + 0x0168)
+#define UARTBUS0        0x1
+#define UARTBUS1        0x0
+
+/** 
+ * CUSTOM_UART_RATE = 500000 可以看蓝牙日志
+ *                    2000000 可以加快下载文件速度
+*/
+#define CUSTOM_UART_RATE 2000000  
+typedef struct {
+    pin_mode_t tx_pin_mode;
+    pin_mode_t rx_pin_mode;
+    pin_mode_t cts_pin_mode;
+    pin_mode_t rts_pin_mode;
+} uart_pin_mode_t;
+
+typedef struct uart_config {
+    uart_pin_config_t pin;
+    uart_pin_mode_t pin_mode;
+    core_irq_t irq_num;
+    osal_irq_handler irq_func;
+    uart_rx_callback_t rx_callback;
+    uart_attr_t line_config;
+    uart_buffer_config_t buffer_config;
+#ifndef BUILD_APPLICATION_SSB
+    osal_mutex uart_mutex;
+    bool support_mutex;
+#endif
+} uart_config_t;
+
+const uintptr_t g_uart_base_addrs[UART_BUS_MAX_NUM] = {
+    (uintptr_t)UART0_BASE,
+    (uintptr_t)UART1_BASE,
+};
+
+uintptr_t uart_porting_base_addr_get(uart_bus_t bus)
+{
+    return g_uart_base_addrs[bus];
+}
+
+static bool g_sw_debug_uart_enabled = false;
+uint8_t g_uart0_rx_buffer[UART_RX_BUFFER_SIZE];
+uint8_t g_uart1_rx_buffer[UART_RX_BUFFER_SIZE];
+#if defined(SUPPORT_AT_CMD)
+static void at_cmd_uart_rx_callback(const void *buf, uint16_t buf_len, bool remaining);
+#endif
+
+void log_factory_at_callback(const void *buffer, uint16_t length, bool remaining);
+
+static uart_config_t g_uart_config[UART_BUS_MAX_NUMBER] = {
+#ifdef BUILD_APPLICATION_SSB
+    /* UART_BUS_0 for debug print */
+    {
+        {
+            .tx_pin = S_MGPIO19,
+            .rx_pin = S_MGPIO20,
+            .cts_pin = PIN_NONE,
+            .rts_pin = PIN_NONE
+        },
+        {
+            .tx_pin_mode = (pin_mode_t)HAL_PIO_FUNC_UART1,
+            .rx_pin_mode = (pin_mode_t)HAL_PIO_FUNC_UART1,
+            .cts_pin_mode = (pin_mode_t)HAL_PIO_FUNC_MAX,
+            .rts_pin_mode = (pin_mode_t)HAL_PIO_FUNC_MAX
+        },
+        UART_0_IRQN,
+        (osal_irq_handler)irq_uart0_handler,
+        NULL,
+        {
+            .baud_rate = 115200,
+            .data_bits = UART_DATA_BIT_8,
+            .parity = UART_PARITY_NONE,
+            .stop_bits = UART_STOP_BIT_1,
+        },
+        {
+            .rx_buffer_size = UART_RX_BUFFER_SIZE,
+            .rx_buffer = g_uart0_rx_buffer,
+        }
+    },
+    /* UART_BUS_1 for codeloader */
+    {
+        {
+            .tx_pin     = S_MGPIO33,
+            .rx_pin     = S_MGPIO34,
+            .cts_pin    = PIN_NONE,
+            .rts_pin    = PIN_NONE
+        },
+        {
+            .tx_pin_mode     = (pin_mode_t)HAL_PIO_FUNC_UART_HS_UART,
+            .rx_pin_mode     = (pin_mode_t)HAL_PIO_FUNC_UART_HS_UART,
+            .cts_pin_mode    = (pin_mode_t)HAL_PIO_FUNC_MAX,
+            .rts_pin_mode    = (pin_mode_t)HAL_PIO_FUNC_MAX,
+        },
+        UART_1_IRQN,
+        (osal_irq_handler)irq_uart1_handler,
+        NULL,
+        {
+            .baud_rate = 115200,
+            .data_bits = UART_DATA_BIT_8,
+            .parity = UART_PARITY_NONE,
+            .stop_bits = UART_STOP_BIT_1,
+        },
+        {
+            .rx_buffer_size = UART_RX_BUFFER_SIZE,
+            .rx_buffer = g_uart1_rx_buffer,
+        }
+    }
+#else
+    /** UART_BUS_0, which is used to at cmd and debug print in wstp version,
+     * and which is used to testustie and debug print in testsuite version
+     */
+    {
+        {
+            .tx_pin = S_MGPIO19,
+            .rx_pin = S_MGPIO20,
+            .cts_pin = PIN_NONE,
+            .rts_pin = PIN_NONE
+        },
+        {
+            .tx_pin_mode = (pin_mode_t)HAL_PIO_FUNC_UART1,
+            .rx_pin_mode = (pin_mode_t)HAL_PIO_FUNC_UART1,
+            .cts_pin_mode = (pin_mode_t)HAL_PIO_FUNC_MAX,
+            .rts_pin_mode = (pin_mode_t)HAL_PIO_FUNC_MAX
+        },
+        UART_0_IRQN,
+        (osal_irq_handler)irq_uart0_handler,
+#if defined(SUPPORT_TEST_COMMON)
+        test_suite_uart_rx_callback,
+#elif defined(SUPPORT_AT_CMD)
+        at_cmd_uart_rx_callback,
+#else
+        NULL,
+#endif
+        {
+            #ifdef ENABLE_SLIP
+            .baud_rate = 921600,
+            #else
+            .baud_rate = CUSTOM_UART_RATE,
+            #endif
+            .data_bits = UART_DATA_BIT_8,
+            .parity = UART_PARITY_NONE,
+            .stop_bits = UART_STOP_BIT_1,
+        },
+        {
+            .rx_buffer_size = UART_RX_BUFFER_SIZE,
+            .rx_buffer = g_uart0_rx_buffer,
+        },
+        NULL,
+#if defined(SUPPORT_TEST_COMMON)
+        false,
+#else
+        true,
+#endif
+    },
+    /* UART_BUS_1 is used to hso uart */
+    {
+        {
+            .tx_pin = S_MGPIO33,
+            .rx_pin = S_MGPIO34,
+            .cts_pin = PIN_NONE,
+            .rts_pin = PIN_NONE
+        },
+        {
+            .tx_pin_mode = (pin_mode_t)HAL_PIO_FUNC_UART_HS_UART,
+            .rx_pin_mode = (pin_mode_t)HAL_PIO_FUNC_UART_HS_UART,
+            .cts_pin_mode = (pin_mode_t)HAL_PIO_FUNC_MAX,
+            .rts_pin_mode = (pin_mode_t)HAL_PIO_FUNC_MAX
+        },
+        UART_1_IRQN,
+        (osal_irq_handler)irq_uart1_handler,
+#ifndef FT_SINGLE_UART
+#if SYS_DEBUG_MODE_ENABLE == YES
+        log_uart_rx_callback,
+#endif
+#else
+        log_factory_at_callback,
+#endif
+        {
+            .baud_rate = CUSTOM_UART_RATE,
+            .data_bits = UART_DATA_BIT_8,
+            .parity = UART_PARITY_NONE,
+            .stop_bits = UART_STOP_BIT_1,
+        },
+        {
+            .rx_buffer_size = UART_RX_BUFFER_SIZE,
+            .rx_buffer = g_uart1_rx_buffer,
+        },
+        NULL,
+        false
+    }
+#endif
+};
+static uart_recovery_regs_t g_uart_recovery_reg[UART_BUS_MAX_NUMBER] = { 0 };
+
+#ifdef FT_SINGLE_UART
+void log_factory_at_callback(const void *buffer, uint16_t length, bool remaining)
+{
+    log_uart_rx_callback(buffer, length, remaining);
+    if (zdiag_is_enable() == false) {
+        at_cmd_msg_receive_handler((uint8_t *)buffer, length);
+        hal_uart_clear_pending(UART_BUS_1);
+    }
+}
+#endif
+
+void uart_port_register_hal_funcs(uart_bus_t bus)
+{
+    hal_uart_register_funcs(bus, hal_uart_v120_funcs_get());
+}
+
+void uart_port_unregister_hal_funcs(uart_bus_t bus)
+{
+    hal_uart_unregister_funcs(bus);
+}
+
+uint32_t uart_port_get_clock_value(uart_bus_t bus)
+{
+    return uart_get_clock_value(bus);
+}
+
+void uart_port_config_pinmux(uart_bus_t bus)
+{
+    UNUSED(bus);
+    uapi_pin_set_mode(g_uart_config[UART_BUS_1].pin.tx_pin, g_uart_config[UART_BUS_1].pin_mode.tx_pin_mode);
+    uapi_pin_set_mode(g_uart_config[UART_BUS_1].pin.rx_pin, g_uart_config[UART_BUS_1].pin_mode.rx_pin_mode);
+    uapi_pin_set_mode(g_uart_config[UART_BUS_0].pin.tx_pin, g_uart_config[UART_BUS_0].pin_mode.tx_pin_mode);
+    uapi_pin_set_mode(g_uart_config[UART_BUS_0].pin.rx_pin, g_uart_config[UART_BUS_0].pin_mode.rx_pin_mode);
+}
+
+void uart_port_register_irq(uart_bus_t bus)
+{
+    osal_irq_request(g_uart_config[bus].irq_num, g_uart_config[bus].irq_func, NULL, NULL, NULL);
+    osal_irq_set_priority(g_uart_config[bus].irq_num, irq_prio(g_uart_config[bus].irq_num));
+    osal_irq_enable(g_uart_config[bus].irq_num);
+}
+
+void uart_port_unregister_irq(uart_bus_t bus)
+{
+    osal_irq_disable(g_uart_config[bus].irq_num);
+}
+
+void irq_uart0_handler(void)
+{
+    hal_uart_irq_handler(UART_BUS_0);
+}
+
+void irq_uart1_handler(void)
+{
+    hal_uart_irq_handler(UART_BUS_1);
+}
+
+#ifdef SUPPORT_AT_CMD
+static void at_cmd_uart_rx_callback(const void *buf, uint16_t buf_len, bool remaining)
+{
+    unused(remaining);
+    #ifndef FT_SINGLE_UART
+    at_cmd_msg_receive_handler((uint8_t *)buf, buf_len);
+    #endif
+
+    #ifdef ENABLE_SLIP
+    slip_receive_handler((uint8_t *)buf, buf_len);
+    #endif
+    hal_uart_clear_pending(SW_DEBUG_UART_BUS);
+}
+#endif
+
+void uart_config_init(void)
+{
+    for (uint8_t i = 0; i < UART_BUS_MAX_NUM; i++) {
+        if ((g_uart_config[i].pin.tx_pin != PIN_NONE) || (g_uart_config[i].pin.rx_pin != PIN_NONE)) {
+            uapi_uart_init(i, &(g_uart_config[i].pin), &(g_uart_config[i].line_config), NULL,
+                           &(g_uart_config[i].buffer_config));
+        }
+        if (g_uart_config[i].rx_callback != NULL) {
+            uapi_uart_register_rx_callback(i, UART_RX_CONDITION_FULL_OR_SUFFICIENT_DATA_OR_IDLE,
+                                           (uint32_t)(g_uart_config[i].buffer_config.rx_buffer_size),
+                                           g_uart_config[i].rx_callback);
+        }
+
+#ifndef BUILD_APPLICATION_SSB
+        if (g_uart_config[i].support_mutex == true) {
+            osal_mutex_init(&(g_uart_config[i].uart_mutex));
+        }
+#endif
+    }
+}
+
+#if (defined SW_UART_DEBUG)||(defined FT_SINGLE_UART)
+void sw_debug_uart_deinit(void)
+{
+    uapi_uart_deinit(SW_DEBUG_UART_BUS);
+}
+
+void sw_debug_uart_init(uint32_t baud_rate)
+{
+    g_uart_config[SW_DEBUG_UART_BUS].line_config.baud_rate = baud_rate;
+    uapi_uart_init(SW_DEBUG_UART_BUS, &(g_uart_config[SW_DEBUG_UART_BUS].pin),
+                   &(g_uart_config[SW_DEBUG_UART_BUS].line_config), NULL,
+                   &(g_uart_config[SW_DEBUG_UART_BUS].buffer_config));
+}
+
+void sw_debug_uart_reset_baund(void)
+{
+    while (uapi_uart_has_pending_transmissions(SW_DEBUG_UART_BUS)) { }
+    uapi_uart_set_attr(SW_DEBUG_UART_BUS, &g_uart_config[SW_DEBUG_UART_BUS].line_config);
+}
+#endif
+
+void print_str(const char *str, ...)
+{
+    static uint8_t s[1024];  // 1024 means string max length.
+    va_list args;
+    int32_t str_len;
+
+    if ((str == NULL) || (strlen(str) == 0)) {
+        return;
+    }
+
+    va_start(args, str);
+    str_len = vsprintf_s((char *)s, sizeof(s), str, args);
+    va_end(args);
+
+    if (str_len < 0) {
+        return;
+    }
+#if defined(SW_RTT_DEBUG)
+    SEGGER_RTT_Write(0, (const char *)s, str_len);
+#elif defined(SW_UART_DEBUG)
+    if (hal_uart_get_funcs(SW_DEBUG_UART_BUS) == NULL) {
+        return;
+    }
+    uapi_uart_write(SW_DEBUG_UART_BUS, (const void *)s, (uint32_t)str_len, 0);
+#else
+#endif
+}
+
+void hal_uart_clear_pending(uart_bus_t uart)
+{
+    switch (uart) {
+        case UART_BUS_0:
+            int_clear_pending_irq(UART_0_IRQN);
+            break;
+        case UART_BUS_1:
+            int_clear_pending_irq(UART_1_IRQN);
+            break;
+        default:
+            break;
+    }
+}
+
+#if defined(CONFIG_UART_SUPPORT_DMA)
+uint8_t uart_port_get_dma_trans_dest_handshaking(uart_bus_t bus)
+{
+    switch (bus) {
+        case UART_BUS_0:
+            return (uint8_t)HAL_DMA_HANDSHAKING_UART_L_TX;
+        case UART_BUS_1:
+            return (uint8_t)HAL_DMA_HANDSHAKING_UART_H0_TX;
+        default:
+            return (uint8_t)HAL_DMA_HANDSHAKING_MAX_NUM;
+    }
+}
+
+uint8_t uart_port_get_dma_trans_src_handshaking(uart_bus_t bus)
+{
+    switch (bus) {
+        case UART_BUS_0:
+            return (uint8_t)HAL_DMA_HANDSHAKING_UART_L_RX;
+        case UART_BUS_1:
+            return (uint8_t)HAL_DMA_HANDSHAKING_UART_H0_RX;
+        default:
+            return (uint8_t)HAL_DMA_HANDSHAKING_MAX_NUM;
+    }
+}
+#endif  /* CONFIG_UART_SUPPORT_DMA */
+
+uint32_t uart_porting_lock(uart_bus_t bus)
+{
+#ifndef BUILD_APPLICATION_SSB
+    if ((g_uart_config[bus].support_mutex == true) && (osKernelGetState() == osKernelRunning) &&
+        (osal_in_interrupt() == 0)) {
+        return (uint32_t)osal_mutex_lock_timeout(&(g_uart_config[bus].uart_mutex), OSAL_MUTEX_WAIT_FOREVER);
+    }
+#else
+    UNUSED(bus);
+#endif
+    return ERRCODE_SUCC;
+}
+
+void uart_porting_unlock(uart_bus_t bus, uint32_t irq_sts)
+{
+#ifndef BUILD_APPLICATION_SSB
+    unused(irq_sts);
+    if ((g_uart_config[bus].support_mutex == true) && (osKernelGetState() == osKernelRunning) &&
+        (osal_in_interrupt() == 0)) {
+        osal_mutex_unlock(&(g_uart_config[bus].uart_mutex));
+    }
+#else
+    UNUSED(bus);
+    UNUSED(irq_sts);
+#endif
+}
+
+void uart_save_reg(uart_bus_t bus)
+{
+    uint32_t base = uart_porting_base_addr_get(bus);
+    g_uart_recovery_reg[bus].uartilpr = readw(base + UARTILPR);
+    g_uart_recovery_reg[bus].uartibrd = readw(base + UARTIBRD);
+    g_uart_recovery_reg[bus].uartfbrd = readw(base + UARTFBRD);
+    g_uart_recovery_reg[bus].uartlcr_h = readw(base + UARTLCRH);
+    g_uart_recovery_reg[bus].uartcr = readw(base + UARTCR);
+    g_uart_recovery_reg[bus].uartifls = readw(base + UARTIFLS);
+    g_uart_recovery_reg[bus].uartimsc = readw(base + UARTIMSC);
+    g_uart_recovery_reg[bus].uartdmacr = readw(base + UARTDMACR);
+}
+
+void uart_recovery_reg(uart_bus_t bus)
+{
+    uint16_t uart_bit = UARTBUS0;
+    if (bus == UART_BUS_0) {
+        uart_bit = UARTBUS0;
+    } else if (bus == UART_BUS_1) {
+        uart_bit = UARTBUS1;
+    }
+    reg16_clrbit(UARTRESET, uart_bit);
+    reg16_setbit(UARTRESET, uart_bit);
+    uint32_t base = uart_porting_base_addr_get(bus);
+    writew(base + UARTILPR, g_uart_recovery_reg[bus].uartilpr);
+    writew(base + UARTIBRD, g_uart_recovery_reg[bus].uartibrd);
+    writew(base + UARTFBRD, g_uart_recovery_reg[bus].uartfbrd);
+    writew(base + UARTLCRH, g_uart_recovery_reg[bus].uartlcr_h);
+    writew(base + UARTCR, g_uart_recovery_reg[bus].uartcr);
+    writew(base + UARTIFLS, g_uart_recovery_reg[bus].uartifls);
+    writew(base + UARTIMSC, g_uart_recovery_reg[bus].uartimsc);
+    writew(base + UARTDMACR, g_uart_recovery_reg[bus].uartdmacr);
+}
\ No newline at end of file
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/lcd/lcd_config.c b/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/lcd/lcd_config.c
new file mode 100644 (file)
index 0000000..d342a8c
--- /dev/null
@@ -0,0 +1,428 @@
+/*\r
+ * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved.\r
+ * Description: Lcd driver configuration.\r
+ * Author: @CompanyNameTag\r
+ * Create: 2022-03-05\r
+ */\r
+\r
+#include <stdint.h>\r
+#include "common_def.h"\r
+#include "lcd_config.h"\r
+\r
+#define LCD_EDO_466X466_SCREEN_ID  0x1133\r
+#define LCD_EDO_454X454_SCREEN_ID  0xf00\r
+#define LCD_BOE_454X454_SCREEN_ID  0x500\r
+#define LCD_SH_240X296_SCREEN_ID   0x101\r
+#define LCD_BOE_194X368_SCREEN_ID  0x4a00\r
+\r
+const combo_dev_cfg_t g_panel_466x466_60_config = {\r
+    .devno = 0,\r
+    .lane_id = {0, -1},\r
+    .out_mode = OUT_MODE_DSI_CMD,\r
+    .out_format = OUT_FORMAT_RGB_24BIT,\r
+    .sync_info = {\r
+        .hsa_pixels   = 10,   // hsa 10 pixels\r
+        .hbp_pixels   = 10,   // hbp 10 pixels\r
+        .hact_pixels  = 466,  // hact 466 pixels\r
+        .hfp_pixels   = 10,   // hfp 10 pixels\r
+        .vsa_lines    = 4,    // vsa 4 lines\r
+        .vbp_lines    = 12,   // vbp 12 lines\r
+        .vact_lines   = 466,  // vact 466 lines\r
+        .vfp_lines    = 10,   // vfp 10 lines\r
+    },\r
+    .phy_data_rate = 480,     // 480Mbps\r
+    .pixel_clk = 20000,       // 20000KHz\r
+};\r
+const combo_dev_cfg_t g_panel_454x454_60_config = {\r
+    .devno = 0,\r
+    .lane_id = {0, -1},\r
+    .out_mode = OUT_MODE_DSI_CMD,\r
+    .out_format = OUT_FORMAT_RGB_24BIT,\r
+    .sync_info = {\r
+        .hsa_pixels   = 10,   // hsa 10 pixels\r
+        .hbp_pixels   = 10,   // hbp 10 pixels\r
+        .hact_pixels  = 454,  // hact 454 pixels\r
+        .hfp_pixels   = 10,   // hfp 10 pixels\r
+        .vsa_lines    = 4,    // vsa 4 lines\r
+        .vbp_lines    = 12,   // vbp 12 lines\r
+        .vact_lines   = 454,  // vact 454 lines\r
+        .vfp_lines    = 10,   // vfp 10 lines\r
+    },\r
+    .phy_data_rate = 480,     // 480Mbps\r
+    .pixel_clk = 20000,       // 20000KHz\r
+};\r
+\r
+const combo_dev_cfg_t g_panel_240x296_60_config = {\r
+    .devno = 0,\r
+    .lane_id = {0, -1},\r
+    .out_mode = OUT_MODE_DSI_CMD,\r
+    .out_format = OUT_FORMAT_RGB_24BIT,\r
+    .sync_info = {\r
+        .hsa_pixels   = 4,   // hsa 14 pixels hpw\r
+        .hbp_pixels   = 11,   // hbp 11 pixels HBP\r
+        .hact_pixels  = 368,  // hact 240 pixels HPX\r
+        .hfp_pixels   = 14,   // hfp 14 pixels hfp\r
+        .vsa_lines    = 2,    // vsa 2 lines vpw\r
+        .vbp_lines    = 6,   // vbp 6 lines vbp\r
+        .vact_lines   = 448,  // vact 296 lines vpx\r
+        .vfp_lines    = 8,   // vfp 8 lines vfp\r
+    },\r
+    .phy_data_rate = 480,     // 480Mbps\r
+    .pixel_clk = 20000,       // 20000KHz\r
+};\r
+\r
+const combo_dev_cfg_t g_panel_194x368_qspi_config = {\r
+    .out_format = OUT_FORMAT_RGB_24BIT,\r
+    .sync_info = {\r
+        .hact_pixels  = 194,  // hact 368 pixels\r
+        .vact_lines   = 368,  // vact 368 lines\r
+    },\r
+};\r
+\r
+/* display off sequence for common lcd */\r
+const lcd_cmd_sequ g_common_cmd_display_off[] = {\r
+    {1, 2, {0xfe, 0x00}, 0},   /* select default cmd page */\r
+    {1, 1, {0x28}, 0},         /* display off */\r
+    {1, 1, {0x10}, 120},       /* sleep in */\r
+};\r
+\r
+/* display off sequence for common lcd */\r
+const lcd_cmd_sequ g_common_466x466_cmd_display_off[] = {\r
+    {1, 2, {0xfe, 0x00}, 0},   /* select default cmd page */\r
+    {1, 1, {0x28}, 0},         /* display off */\r
+    {1, 1, {0x10}, 120},       /* sleep in */\r
+    {1, 2, {0x4f, 0x01}, 0},   /* ½ødeepstandby ×´Ì¬ */\r
+};\r
+\r
+/* sleep in sequence for common lcd */\r
+const lcd_cmd_sequ g_common_cmd_sleep_in[] = {\r
+    {1, 2, {0xfe, 0x00}, 0},   /* select default cmd page */\r
+    {1, 1, {0x28}, 0},         /* display off */\r
+    {1, 1, {0x10}, 120},       /* sleep in */\r
+};\r
+\r
+/* sleep in sequence for common lcd */\r
+const lcd_cmd_sequ g_common_cmd_sleep_out[] = {\r
+    {1, 2, {0xfe, 0x00}, 0},   /* select default cmd page */\r
+    {1, 1, {0x11}, 120},       /* sleep out */\r
+    {1, 1, {0x29}, 0},         /* display on */\r
+};\r
+\r
+/* idle in sequence for EDO and BOE 454*454 lcd */\r
+lcd_cmd_sequ g_common_cmd_idle_in[] = {\r
+    {1, 2, {0xfe, 0x00}, 0},\r
+    {1, 1, {0x39}, 0},\r
+};\r
+\r
+/* idle out sequence for EDO and BOE 454*454 lcd */\r
+const lcd_cmd_sequ g_common_cmd_idle_out[] = {\r
+    {1, 2, {0xfe, 0x00}, 0},\r
+    {1, 1, {0x38}, 0},\r
+};\r
+\r
+/* te on sequence for EDO and BOE 454*454 lcd */\r
+const lcd_cmd_sequ g_common_cmd_te_on[] = {\r
+    {1, 2, {0xfe, 0x00}, 0},\r
+    {1, 1, {0x35}, 0},\r
+};\r
+\r
+/* te off sequence for EDO and BOE 454*454 lcd */\r
+const lcd_cmd_sequ g_common_cmd_te_off[] = {\r
+    {1, 2, {0xfe, 0x00}, 0},\r
+    {1, 1, {0x34}, 0},\r
+};\r
+\r
+/* set brightness sequence for EDO and BOE 454*454 lcd */\r
+lcd_cmd_sequ g_common_cmd_brightness[] = {\r
+    {1, 2, {0xfe, 0x00}, 0},\r
+    {1, 2, {0x51, 0xff}, 0},\r
+};\r
+const lcd_cmd_sequ g_edo_466x466_screen_init_on[] = {\r
+    {1, 2, {0xfe, 0x00}, 0}, \r
+    {1, 2, {0x3a, 0x77}, 0}, \r
+    {1, 2, {0x35, 0x00}, 0}, \r
+    {1, 2, {0x53, 0x20}, 0}, \r
+    // {1, 2, {0x51, 0xff}, 0}, \r
+    {1, 2, {0x63, 0xff}, 0}, \r
+    {1, 5, {0x2A, 0x00, 0x06, 0x01, 0xd7}, 0}, \r
+    {1, 5, {0x2B, 0x00, 0x00, 0x01, 0xd1}, 0}, \r
+    {1, 1, {0x11}, 120}, \r
+    {1, 1, {0x29}, 0}, \r
+};\r
+\r
+\r
+/* init sequence for EDO 454*454 lcd */\r
+const lcd_cmd_sequ g_edo_454x454_screen_init_on[] = {\r
+    {1, 2, {0xfe, 0x01}, 0},\r
+    {1, 2, {0x30, 0x43}, 0}, /* set LCD frequency to 15HZ */\r
+    {1, 2, {0xfe, 0x00}, 0},\r
+    {1, 2, {0x3a, 0x77}, 0},\r
+    {1, 2, {0x53, 0x20}, 0},\r
+    {1, 2, {0x51, 0xff}, 0},\r
+    {0, 5, {0x2a, 0x00, 0x0e, 0x01, 0xd3}, 0},\r
+    {0, 5, {0x2b, 0x00, 0x00, 0x01, 0xc5}, 0},\r
+    {1, 3, {0x44, 0x01, 0xc5}, 0},\r
+    {1, 2, {0x35, 0x00}, 0},\r
+    {1, 1, {0x11}, 120},\r
+    {1, 1, {0x29}, 0},\r
+};\r
+\r
+/* init sequence for BOE 454*454 lcd */\r
+const lcd_cmd_sequ g_boe_454x454_screen_init_on[] = {\r
+    {1, 2, {0xfe, 0x0d}, 0},\r
+    {1, 2, {0x01, 0x00}, 0},\r
+    {1, 2, {0x03, 0x00}, 0},\r
+    {1, 2, {0x1b, 0x00}, 0},\r
+    {1, 2, {0x1d, 0x00}, 0},\r
+    {1, 2, {0x37, 0x00}, 0},\r
+    {1, 2, {0x39, 0x00}, 0},\r
+    {1, 2, {0x52, 0x58}, 0},\r
+    {1, 2, {0x53, 0x00}, 0},\r
+\r
+    {1, 2, {0xfe, 0x01}, 0},\r
+    {1, 2, {0x72, 0x05}, 0},\r
+    {1, 2, {0x73, 0x16}, 0},\r
+    {1, 2, {0x74, 0x0c}, 0},\r
+\r
+    {1, 2, {0xfe, 0x01}, 0},\r
+    {1, 2, {0x18, 0x55}, 0},\r
+    {1, 2, {0xc5, 0x10}, 0},\r
+    {1, 2, {0x72, 0x0e}, 0},\r
+    {1, 2, {0x73, 0x1c}, 0},\r
+\r
+    {1, 2, {0xfe, 0x07}, 0},\r
+    {1, 2, {0x15, 0x04}, 0},\r
+    {1, 2, {0xfe, 0x01}, 0},\r
+    {1, 2, {0x0a, 0xf8}, 0},\r
+\r
+    {1, 2, {0xfe, 0x00}, 0},\r
+    {1, 2, {0x51, 0xff}, 0},\r
+    {1, 2, {0x35, 0x00}, 0},\r
+    {0, 5, {0x2a, 0x00, 0x0c, 0x01, 0xd1}, 0},\r
+    {0, 5, {0x2b, 0x00, 0x00, 0x01, 0xc5}, 0},\r
+    {1, 2, {0x53, 0x20}, 0},\r
+    {1, 1, {0x11}, 120},\r
+    {1, 1, {0x29}, 0},\r
+};\r
+\r
+const lcd_cmd_sequ g_sh_240x296_screen_init_on[] = {\r
+    {1, 1, {0x11}, 5},\r
+    {1, 5, {0x2a, 0x00, 0x00, 0x01, 0x6f}, 1},\r
+    {1, 5, {0x2b, 0x00, 0x00, 0x01, 0xbf}, 1},\r
+    {1, 3, {0x44, 0x01, 0xbf}, 1},\r
+    {1, 2, {0x35, 0x00}, 1},\r
+    {1, 2, {0x3a, 0x77}, 1},\r
+    {1, 2, {0x53, 0x20}, 80},\r
+    {1, 1, {0x29}, 0},\r
+};\r
+\r
+const lcd_cmd_sequ g_boe_194x368_screen_init_on[] = {\r
+    {0, 2, {0xfe, 0x00}, 0},\r
+    {0, 3, {0x44, 0x00, 0xB7}, 0},\r
+    {0, 2, {0x3a, 0x77}, 0},\r
+    {0, 2, {0x51, 0x80}, 0},\r
+    {0, 2, {0x35, 0x0}, 0},\r
+    {0, 5, {0x2a, 0x00, 0x00, 0x00, 0xc1}, 0},\r
+    {0, 1, {0x11}, 120},\r
+    {0, 1, {0x29}, 100},\r
+    {0, 1, {0x39}, 0},\r
+};\r
+\r
+const lcd_cmds_sequ g_display_off_cmds = {\r
+    .cmd = g_common_cmd_display_off,\r
+    .cmd_cnt = array_size(g_common_cmd_display_off),\r
+};\r
+\r
+const lcd_cmds_sequ g_466x466_display_off_cmds = {\r
+    .cmd = g_common_466x466_cmd_display_off,\r
+    .cmd_cnt = array_size(g_common_466x466_cmd_display_off),\r
+};\r
+\r
+const lcd_cmds_sequ g_idle_in_cmds = {\r
+    .cmd = g_common_cmd_idle_in,\r
+    .cmd_cnt = array_size(g_common_cmd_idle_in),\r
+};\r
+\r
+const lcd_cmds_sequ g_idle_out_cmds = {\r
+    .cmd = g_common_cmd_idle_out,\r
+    .cmd_cnt = array_size(g_common_cmd_idle_out),\r
+};\r
+\r
+const lcd_cmds_sequ g_te_on_cmds = {\r
+    .cmd = g_common_cmd_te_on,\r
+    .cmd_cnt = array_size(g_common_cmd_te_on),\r
+};\r
+\r
+const lcd_cmds_sequ g_te_off_cmds = {\r
+    .cmd = g_common_cmd_te_off,\r
+    .cmd_cnt = array_size(g_common_cmd_te_off),\r
+};\r
+\r
+const lcd_cmds_sequ g_brightness_cmds = {\r
+    .cmd = g_common_cmd_brightness,\r
+    .cmd_cnt = array_size(g_common_cmd_brightness),\r
+};\r
+\r
+const lcd_cmds_sequ g_edo_466x466_screen_init_on_cmds = {\r
+    .cmd = g_edo_466x466_screen_init_on,\r
+    .cmd_cnt = array_size(g_edo_466x466_screen_init_on),\r
+};\r
+\r
+const lcd_cmds_sequ g_edo_454x454_screen_init_on_cmds = {\r
+    .cmd = g_edo_454x454_screen_init_on,\r
+    .cmd_cnt = array_size(g_edo_454x454_screen_init_on),\r
+};\r
+\r
+const lcd_cmds_sequ g_boe_454x454_screen_init_on_cmds = {\r
+    .cmd = g_boe_454x454_screen_init_on,\r
+    .cmd_cnt = array_size(g_boe_454x454_screen_init_on),\r
+};\r
+\r
+const lcd_cmds_sequ g_sh_240x296_screen_init_on_cmds = {\r
+    .cmd = g_sh_240x296_screen_init_on,\r
+    .cmd_cnt = array_size(g_sh_240x296_screen_init_on),\r
+};\r
+\r
+const lcd_cmds_sequ g_boe_194x368_screen_init_on_cmds = {\r
+    .cmd = g_boe_194x368_screen_init_on,\r
+    .cmd_cnt = array_size(g_boe_194x368_screen_init_on),\r
+};\r
+\r
+const lcd_cmds_sequ g_sleep_in_cmds = {\r
+    .cmd = g_common_cmd_sleep_in,\r
+    .cmd_cnt = array_size(g_common_cmd_sleep_in),\r
+};\r
+\r
+const lcd_cmds_sequ g_sleep_out_cmds = {\r
+    .cmd = g_common_cmd_sleep_out,\r
+    .cmd_cnt = array_size(g_common_cmd_sleep_out),\r
+};\r
+\r
+const lcd_drv_cfg g_lcd_driver_ops[] = {\r
+    {\r
+        .bus_type             = BUS_DISPLAY_MIPI,\r
+        .bus_cfg              = &g_panel_466x466_60_config,\r
+        .x_start              = 0x6,\r
+        .y_start              = 0,\r
+        .fps                  = 60,\r
+        .lcd_id               = LCD_EDO_466X466_SCREEN_ID,\r
+        .display_on_cmds      = &g_edo_466x466_screen_init_on_cmds,\r
+        .display_off_cmds     = &g_466x466_display_off_cmds,\r
+        .enter_idle_cmds      = &g_idle_in_cmds,\r
+        .exit_idle_cmds       = &g_idle_out_cmds,\r
+        .te_on_cmds           = &g_te_on_cmds,\r
+        .te_off_cmds          = &g_te_off_cmds,\r
+        .set_brightnes_cmds   = &g_brightness_cmds,\r
+        .sleep_in_cmds        = &g_sleep_in_cmds,\r
+        .sleep_out_cmds       = &g_sleep_out_cmds,\r
+        .lcd_id_info.reg_addr = 0x04,\r
+        .lcd_id_info.read_len = 3,\r
+    },\r
+    {\r
+        .bus_type             = BUS_DISPLAY_MIPI,\r
+        .bus_cfg              = &g_panel_454x454_60_config,\r
+        .x_start              = 0xe,\r
+        .y_start              = 0,\r
+        .fps                  = 60,\r
+        .lcd_id               = LCD_EDO_454X454_SCREEN_ID,\r
+        .display_on_cmds      = &g_edo_454x454_screen_init_on_cmds,\r
+        .display_off_cmds     = &g_display_off_cmds,\r
+        .enter_idle_cmds      = &g_idle_in_cmds,\r
+        .exit_idle_cmds       = &g_idle_out_cmds,\r
+        .te_on_cmds           = &g_te_on_cmds,\r
+        .te_off_cmds          = &g_te_off_cmds,\r
+        .set_brightnes_cmds   = &g_brightness_cmds,\r
+        .sleep_in_cmds        = &g_sleep_in_cmds,\r
+        .sleep_out_cmds       = &g_sleep_out_cmds,\r
+        .lcd_id_info.reg_addr = 0x04,\r
+        .lcd_id_info.read_len = 3,\r
+    },\r
+    {\r
+        .bus_type             = BUS_DISPLAY_MIPI,\r
+        .bus_cfg              = &g_panel_454x454_60_config,\r
+        .x_start              = 0xc,\r
+        .y_start              = 0,\r
+        .fps                  = 60,\r
+        .lcd_id               = LCD_BOE_454X454_SCREEN_ID,\r
+        .display_on_cmds      = &g_boe_454x454_screen_init_on_cmds,\r
+        .display_off_cmds     = &g_display_off_cmds,\r
+        .enter_idle_cmds      = &g_idle_in_cmds,\r
+        .exit_idle_cmds       = &g_idle_out_cmds,\r
+        .te_on_cmds           = &g_te_on_cmds,\r
+        .te_off_cmds          = &g_te_off_cmds,\r
+        .set_brightnes_cmds   = &g_brightness_cmds,\r
+        .sleep_in_cmds        = &g_sleep_in_cmds,\r
+        .sleep_out_cmds       = &g_sleep_out_cmds,\r
+        .lcd_id_info.reg_addr = 0x04,\r
+        .lcd_id_info.read_len = 3,\r
+    },\r
+    {\r
+        .bus_type             = BUS_DISPLAY_MIPI,\r
+        .bus_cfg              = &g_panel_240x296_60_config,\r
+        .x_start              = 0,\r
+        .y_start              = 0,\r
+        .fps                  = 60,\r
+        .lcd_id               = LCD_SH_240X296_SCREEN_ID,\r
+        .display_on_cmds      = &g_sh_240x296_screen_init_on_cmds,\r
+        .display_off_cmds     = &g_display_off_cmds,\r
+        .enter_idle_cmds      = &g_idle_in_cmds,\r
+        .exit_idle_cmds       = &g_idle_out_cmds,\r
+        .te_on_cmds           = &g_te_on_cmds,\r
+        .te_off_cmds          = &g_te_off_cmds,\r
+        .set_brightnes_cmds   = &g_brightness_cmds,\r
+        .sleep_in_cmds        = &g_sleep_in_cmds,\r
+        .sleep_out_cmds       = &g_sleep_out_cmds,\r
+        .lcd_id_info.reg_addr = 0xda,\r
+        .lcd_id_info.read_len = 3,\r
+    },\r
+    {\r
+        .bus_type             = BUS_DISPLAY_QSPI,\r
+        .bus_cfg              = &g_panel_194x368_qspi_config,\r
+        .x_start              = 0,\r
+        .y_start              = 0,\r
+        .fps                  = 60,\r
+        .lcd_id               = LCD_BOE_194X368_SCREEN_ID,\r
+        .display_on_cmds      = &g_boe_194x368_screen_init_on_cmds,\r
+        .display_off_cmds     = &g_display_off_cmds,\r
+        .enter_idle_cmds      = &g_idle_in_cmds,\r
+        .exit_idle_cmds       = &g_idle_out_cmds,\r
+        .te_on_cmds           = &g_te_on_cmds,\r
+        .te_off_cmds          = &g_te_off_cmds,\r
+        .set_brightnes_cmds   = &g_brightness_cmds,\r
+        .sleep_in_cmds        = &g_sleep_in_cmds,\r
+        .sleep_out_cmds       = &g_sleep_out_cmds,\r
+        .lcd_id_info.reg_addr = 0x04,\r
+        .lcd_id_info.read_len = 3,\r
+    }\r
+};\r
+\r
+lcd_drv_cfg *lcd_get_driver_ops(void)\r
+{\r
+    return g_lcd_driver_ops;\r
+}\r
+\r
+uint32_t lcd_get_ops_num(void)\r
+{\r
+    return array_size(g_lcd_driver_ops);\r
+}\r
+\r
+combo_dev_cfg_t *lcd_get_bus_escape_config(void)\r
+{\r
+    return g_lcd_driver_ops[0].bus_cfg;\r
+}\r
+\r
+lcd_drv_cfg *lcd_get_driver_config(uint32_t id)\r
+{\r
+    uint32_t i;\r
+    if (id == 0) {\r
+        return NULL;\r
+    }\r
+\r
+    for (i = 0; i < array_size(g_lcd_driver_ops); i++) {\r
+        if (g_lcd_driver_ops[i].lcd_id == id) {\r
+            return &(g_lcd_driver_ops[i]);\r
+        }\r
+    }\r
+\r
+    return NULL;\r
+}\r
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/lcd/lcd_private.c b/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/lcd/lcd_private.c
new file mode 100644 (file)
index 0000000..ea251e0
--- /dev/null
@@ -0,0 +1,69 @@
+/*\r
+ * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved.\r
+ * Description: Lcd private interface.\r
+ * Author: @CompanyNameTag\r
+ * Create: 2022-03-05\r
+ */\r
+\r
+#include "lcd_private.h"\r
+#include "tcxo.h"\r
+#include "chip_io.h"\r
+#include "platform_core.h"\r
+#include "gpio.h"\r
+#include "pinctrl_porting.h"\r
+#include "product.h"\r
+#include "pinctrl.h"\r
+static void lcd_drv_power_on(void)\r
+{\r
+#ifndef QSPI_DISPLAY\r
+    uapi_gpio_set_dir(VCI_LCD_GPIO, GPIO_DIRECTION_OUTPUT);\r
+    uapi_gpio_set_val(VCI_LCD_GPIO, GPIO_LEVEL_HIGH);\r
+#endif\r
+    uapi_gpio_set_dir(RESET_LCD_GPIO, GPIO_DIRECTION_OUTPUT);\r
+\r
+    uapi_gpio_set_val(RESET_LCD_GPIO, GPIO_LEVEL_LOW);\r
+    uapi_tcxo_delay_ms(10); /* delay 10 ms */\r
+\r
+    uapi_gpio_set_val(RESET_LCD_GPIO, GPIO_LEVEL_HIGH);\r
+    uapi_tcxo_delay_ms(10); /* delay 10 ms */\r
+}\r
+#define  USE_OUTPUT_CTL 1\r
+static void lcd_drv_power_off(void)\r
+{\r
+#if USE_OUTPUT_CTL\r
+    uapi_gpio_set_dir(RESET_LCD_GPIO, GPIO_DIRECTION_OUTPUT); \r
+    uapi_gpio_set_val(RESET_LCD_GPIO, GPIO_LEVEL_LOW);\r
+    #ifndef QSPI_DISPLAY\r
+    uapi_gpio_set_dir(VCI_LCD_GPIO, GPIO_DIRECTION_OUTPUT);\r
+    uapi_gpio_set_val(VCI_LCD_GPIO, GPIO_LEVEL_LOW);\r
+    #endif\r
+    uapi_tcxo_delay_ms(10); /* delay 10 ms */\r
+    int resetvalue = uapi_gpio_get_output_val(RESET_LCD_GPIO);\r
+    int lcd_envalue = uapi_gpio_get_output_val(VCI_LCD_GPIO);\r
+    printf("Output RESET_LCD_GPIO %d , VCI_LCD_GPIO %d\r\n",resetvalue,lcd_envalue);\r
+#else\r
+    uapi_gpio_set_val(RESET_LCD_GPIO, GPIO_LEVEL_LOW);\r
+    uapi_gpio_set_dir(RESET_LCD_GPIO, GPIO_DIRECTION_INPUT); //ÉèÖóÉInput£¬ÊÇΪÁ˽â¾ö©µç £¿£¿\r
+    uapi_pin_set_pull(RESET_LCD_GPIO, PIN_PULL_DOWN);\r
+    #ifndef QSPI_DISPLAY\r
+    uapi_gpio_set_val(VCI_LCD_GPIO, GPIO_LEVEL_LOW);\r
+    uapi_gpio_set_dir(VCI_LCD_GPIO, GPIO_DIRECTION_INPUT);\r
+    uapi_pin_set_pull(VCI_LCD_GPIO, PIN_PULL_DOWN);\r
+    #endif\r
+    uapi_tcxo_delay_ms(10); /* delay 10 ms */\r
+    int resetvalue = uapi_gpio_get_val(RESET_LCD_GPIO);\r
+    int lcd_envalue = uapi_gpio_get_val(VCI_LCD_GPIO);\r
+    printf("Input RESET_LCD_GPIO %d , VCI_LCD_GPIO %d\r\n",resetvalue,lcd_envalue);\r
+#endif\r
+   \r
+}\r
+\r
+static lcd_drv_private g_lcd_private_api = {\r
+    .power_on = lcd_drv_power_on,\r
+    .power_off = lcd_drv_power_off,\r
+};\r
+\r
+lcd_drv_private *lcd_drv_get_private_api(void)\r
+{\r
+    return &g_lcd_private_api;\r
+}\r
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/lcd/soc_lcd_api.c b/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/lcd/soc_lcd_api.c
new file mode 100644 (file)
index 0000000..56f8542
--- /dev/null
@@ -0,0 +1,767 @@
+/*\r
+ * Copyright (c) @CompanyNameMagicTag 2022-2022. All rights reserved.\r
+ * Description: Lcd driver.\r
+ * Author: @CompanyNameTag\r
+ * Create: 2022-03-05\r
+ */\r
+\r
+#include "soc_lcd_api.h"\r
+#include <stdint.h>\r
+#include "soc_errno.h"\r
+#include "soc_osal.h"\r
+#include "soc_mipi_tx.h"\r
+#include "lcd_config.h"\r
+#include "lcd_bus.h"\r
+#include "lcd_mipi.h"\r
+#include "lcd_qspi.h"\r
+#include "lcd_common.h"\r
+#include "lcd_private.h"\r
+#include "pinctrl_porting.h"\r
+\r
+typedef struct lcd_attr {\r
+    bool info_register;           /* 注册指定屏幕组件标志 */\r
+    bool is_inited;               /* LCD组件初始化标志 */\r
+    lcd_type screen_type;         /* LCD屏类型 */\r
+    uint32_t lcd_id;              /* LCD ID号 */\r
+    lcd_drv_cfg *lcd_cfg;         /* LCD参数 */\r
+    uint8_t brightness;           /* 显示亮度参数 */\r
+    ext_lcd_status status;        /* LCD状态标志 */\r
+    osal_mutex lcd_mutex;         /* LCD驱动多线程调用保护信号量 */\r
+    lcd_bus_api *bus_api;         /* 总线接口 */\r
+    lcd_drv_common *common_api;   /* LCD公共接口 */\r
+    lcd_drv_private *private_api; /* LCD差异化接口 */\r
+} lcd_attr;\r
+\r
+lcd_attr g_lcd_info = {0};\r
+volatile bool g_idle_before_sleep = false; /* false: normal display, true: idle mode */\r
+static bool g_lcd_on_flag = false;\r
+\r
+bool lcd_get_status(void)\r
+{\r
+    return g_lcd_on_flag;\r
+}\r
+\r
+void lcd_set_status(bool lcd_on)\r
+{\r
+    g_lcd_on_flag = lcd_on;\r
+}\r
+\r
+static ext_errno lcd_lock_init(void)\r
+{\r
+    ext_errno ret;\r
+    if (g_lcd_info.lcd_mutex.mutex != NULL) {\r
+        return EXT_ERR_SUCCESS;\r
+    }\r
+\r
+    ret = osal_mutex_init(&(g_lcd_info.lcd_mutex));\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        g_lcd_info.lcd_mutex.mutex = NULL;\r
+        return ret;\r
+    }\r
+    if (g_lcd_info.lcd_mutex.mutex == NULL) {\r
+        return EXT_ERR_LCD_MUTEX_INIT_FAIL;\r
+    }\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static void lcd_lock_deinit(void)\r
+{\r
+    if (g_lcd_info.lcd_mutex.mutex != NULL) {\r
+        osal_mutex_destroy(&(g_lcd_info.lcd_mutex));\r
+    }\r
+\r
+    g_lcd_info.lcd_mutex.mutex = NULL;\r
+}\r
+\r
+static void lcd_lock(void)\r
+{\r
+    if (g_lcd_info.lcd_mutex.mutex == NULL) {\r
+        return;\r
+    }\r
+    osal_mutex_lock(&(g_lcd_info.lcd_mutex));\r
+}\r
+\r
+static void lcd_unlock(void)\r
+{\r
+    if (g_lcd_info.lcd_mutex.mutex == NULL) {\r
+        return;\r
+    }\r
+    osal_mutex_unlock(&(g_lcd_info.lcd_mutex));\r
+}\r
+\r
+static void lcd_set_display_info(void)\r
+{\r
+    if (g_lcd_info.bus_api->bus_register_panel_info != NULL) {\r
+        g_lcd_info.bus_api->bus_register_panel_info(g_lcd_info.lcd_cfg->x_start, g_lcd_info.lcd_cfg->y_start,\r
+            g_lcd_info.lcd_cfg->fps);\r
+    }\r
+}\r
+\r
+static ext_errno lcd_auto_adapt_init_prepare(void)\r
+{\r
+    ext_errno ret;\r
+    combo_dev_cfg_t *escape_config = lcd_get_bus_escape_config();\r
+\r
+    /* init with default parameter */\r
+    ret = g_lcd_info.bus_api->bus_init(escape_config);\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("default bus_init fail, ret = %X\r\n", ret);\r
+        return ret;\r
+    }\r
+\r
+    ret = g_lcd_info.common_api->get_chip_id(&g_lcd_info.lcd_id);\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("get_chip_id fail, ret = %X\r\n", ret);\r
+    }\r
+\r
+    if (g_lcd_info.bus_api->bus_deinit() != EXT_ERR_SUCCESS) {\r
+        lcd_err("bus deinit fail\r\n");\r
+    }\r
+\r
+    return ret;\r
+}\r
+\r
+static ext_errno lcd_assigned_id_check(void)\r
+{\r
+    if (g_lcd_info.common_api->chip_id_check == NULL) {\r
+        return EXT_ERR_LCD_INVALID_NULL_POINTER;\r
+    }\r
+\r
+    return g_lcd_info.common_api->chip_id_check();\r
+}\r
+\r
+static ext_errno lcd_get_ops(void)\r
+{\r
+    ext_errno ret = 0;\r
+    g_lcd_info.bus_api = lcd_get_bus_api();\r
+    g_lcd_info.common_api = lcd_drv_get_common_api();\r
+    g_lcd_info.private_api = lcd_drv_get_private_api();\r
+\r
+    if (g_lcd_info.bus_api == NULL || g_lcd_info.common_api == NULL || g_lcd_info.private_api == NULL) {\r
+        return EXT_ERR_LCD_GET_ATTR_FAIL;\r
+    }\r
+\r
+    if (g_lcd_info.private_api->power_on == NULL) {\r
+        return EXT_ERR_LCD_GET_ATTR_FAIL;\r
+    }\r
+    g_lcd_info.private_api->power_on();\r
+\r
+    if (!g_lcd_info.info_register) {\r
+        ret = lcd_auto_adapt_init_prepare();\r
+        if (ret != EXT_ERR_SUCCESS) {\r
+            goto fail;\r
+        }\r
+    }\r
+\r
+    g_lcd_info.lcd_cfg = g_lcd_info.common_api->get_lcd_config();\r
+    if (g_lcd_info.lcd_cfg == NULL) {\r
+        lcd_err("lcd_cfg empty!\r\n");\r
+        goto fail;\r
+    }\r
+    ret = g_lcd_info.bus_api->bus_init(g_lcd_info.lcd_cfg->bus_cfg);\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("bus_init fail, ret = %X\r\n", ret);\r
+        return ret;\r
+    }\r
+\r
+    if (g_lcd_info.info_register) {\r
+        ret = lcd_assigned_id_check();\r
+        if (ret != EXT_ERR_SUCCESS) {\r
+            lcd_err("chip id check error, ret = 0x%x\r\n", ret);\r
+            g_lcd_info.bus_api->bus_deinit();\r
+            goto fail;\r
+        }\r
+    }\r
+\r
+    if (g_lcd_info.brightness == 0)\r
+       g_lcd_info.brightness = DEFAULT_BRIGHTNESS;\r
+\r
+    return EXT_ERR_SUCCESS;\r
+fail:\r
+\r
+    if (g_lcd_info.private_api->power_off != NULL) {\r
+        g_lcd_info.private_api->power_off();\r
+    }\r
+    g_lcd_info.bus_api = NULL;\r
+    g_lcd_info.common_api = NULL;\r
+    g_lcd_info.private_api = NULL;\r
+    return ret;\r
+}\r
+\r
+ext_lcd_status uapi_lcd_get_status(void)\r
+{\r
+    return g_lcd_info.status;\r
+}\r
+\r
+bool uapi_is_lcd_connect(void)\r
+{\r
+    return g_lcd_info.is_inited;\r
+}\r
+\r
+static ext_errno lcd_display_on(void)\r
+{\r
+    ext_errno ret;\r
+    uint32_t retry_count = 3;\r
+    lcd_lock();\r
+\r
+    for (; retry_count > 0; retry_count--) {\r
+        ret = g_lcd_info.common_api->display_on(g_lcd_info.brightness);\r
+        if (ret == EXT_ERR_SUCCESS) {\r
+            ret = g_lcd_info.bus_api->bus_enable();\r
+            if (ret == EXT_ERR_SUCCESS) {\r
+                break;\r
+            }\r
+        }\r
+\r
+        g_lcd_info.private_api->power_off();\r
+        g_lcd_info.private_api->power_on();\r
+\r
+        g_lcd_info.bus_api->bus_deinit();\r
+        ret = g_lcd_info.bus_api->bus_init(g_lcd_info.lcd_cfg->bus_cfg);\r
+        if (ret != EXT_ERR_SUCCESS) {\r
+            g_lcd_info.private_api->power_off();\r
+            continue;\r
+        }\r
+    }\r
+    if (retry_count > 0) {\r
+        g_lcd_info.status.disp_status = LCD_NORMAL_DISPLAY;\r
+        g_lcd_info.status.te_status = LCD_TE_ON;\r
+    }\r
+\r
+    lcd_unlock();\r
+\r
+    return ret;\r
+}\r
+\r
+ext_errno uapi_lcd_display_on(void)\r
+{\r
+    ext_errno ret;\r
+    if (!g_lcd_info.is_inited) {\r
+        return EXT_ERR_LCD_NOT_INIT;\r
+    }\r
+    if (g_lcd_info.status.disp_status == LCD_NORMAL_DISPLAY) {\r
+        return EXT_ERR_SUCCESS;\r
+    }\r
+\r
+    ret = lcd_display_on();\r
+\r
+    return ret;\r
+}\r
+\r
+ext_errno uapi_lcd_display_off(void)\r
+{\r
+    ext_errno ret;\r
+    if (!g_lcd_info.is_inited) {\r
+        return EXT_ERR_LCD_NOT_INIT;\r
+    }\r
+    if (g_lcd_info.status.disp_status == LCD_DISPLAY_OFF) {\r
+        return EXT_ERR_SUCCESS;\r
+    }\r
+\r
+    ret = g_lcd_info.common_api->display_off();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("display_off fail, ret = %X\r\n", ret);\r
+        lcd_unlock();\r
+        return ret;\r
+    }\r
+    ret = g_lcd_info.bus_api->bus_disable();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("bus_disable fail, ret = %X\r\n", ret);\r
+        lcd_unlock();\r
+        return ret;\r
+    }\r
+\r
+    g_lcd_info.status.disp_status = LCD_DISPLAY_OFF;\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno uapi_lcd_enter_sleep_mode(void)\r
+{\r
+    ext_errno ret;\r
+    if (!g_lcd_info.is_inited) {\r
+        return EXT_ERR_LCD_NOT_INIT;\r
+    }\r
+    if (g_lcd_info.status.disp_status == LCD_SLEEP_MODE) {\r
+        return EXT_ERR_SUCCESS;\r
+    } else if (g_lcd_info.status.disp_status == LCD_DISPLAY_OFF) {\r
+        return EXT_ERR_LCD_NOT_SUPPORT_OFF_TO_SLEEP;\r
+    }\r
+\r
+    if (g_lcd_info.status.disp_status == LCD_IDLE_MODE) {\r
+        g_idle_before_sleep = true;\r
+    } else {\r
+        g_idle_before_sleep = false;\r
+    }\r
+\r
+    ret = g_lcd_info.common_api->enter_sleep_mode();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("enter sleep mode fail, ret = %X\r\n", ret);\r
+        lcd_unlock();\r
+        return ret;\r
+    }\r
+    ret = g_lcd_info.bus_api->bus_disable();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("bus_disable fail, ret = %X\r\n", ret);\r
+        return ret;\r
+    }\r
+    g_lcd_info.status.disp_status = LCD_SLEEP_MODE;\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno uapi_lcd_exit_sleep_mode(void)\r
+{\r
+    ext_errno ret;\r
+    if (!g_lcd_info.is_inited) {\r
+        return EXT_ERR_LCD_NOT_INIT;\r
+    }\r
+    if (g_lcd_info.status.disp_status != LCD_SLEEP_MODE) {\r
+        return EXT_ERR_LCD_NOT_IN_SLEEP_MODE;\r
+    }\r
+\r
+    ret = g_lcd_info.common_api->exit_sleep_mode();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("exit sleep mode fail, ret = %X\r\n", ret);\r
+        return ret;\r
+    }\r
+\r
+    lcd_lock();\r
+    ret = g_lcd_info.bus_api->bus_enable();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("enable bus fail when exit sleep, ret = %X\r\n", ret);\r
+        lcd_unlock();\r
+        return ret;\r
+    }\r
+\r
+    if (g_idle_before_sleep) {\r
+        g_lcd_info.status.disp_status = LCD_IDLE_MODE;\r
+    } else {\r
+        g_lcd_info.status.disp_status = LCD_NORMAL_DISPLAY;\r
+    }\r
+\r
+    lcd_unlock();\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno uapi_lcd_enter_idle_mode(void)\r
+{\r
+    ext_errno ret;\r
+    if (!g_lcd_info.is_inited) {\r
+        return EXT_ERR_LCD_NOT_INIT;\r
+    }\r
+    if (g_lcd_info.status.disp_status == LCD_IDLE_MODE) {\r
+        return EXT_ERR_SUCCESS;\r
+    }\r
+    if (g_lcd_info.status.disp_status != LCD_NORMAL_DISPLAY) {\r
+        return EXT_ERR_LCD_NOT_SUPPORT_CUR_TO_IDLE;\r
+    }\r
+\r
+    lcd_lock();\r
+    ret = g_lcd_info.common_api->enter_idle_mode();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("enter_idle_mode fail, ret = %X\r\n", ret);\r
+        lcd_unlock();\r
+        return ret;\r
+    }\r
+    g_lcd_info.status.disp_status = LCD_IDLE_MODE;\r
+    lcd_unlock();\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno uapi_lcd_exit_idle_mode(void)\r
+{\r
+    ext_errno ret;\r
+    if (!g_lcd_info.is_inited) {\r
+        return EXT_ERR_LCD_NOT_INIT;\r
+    }\r
+    if (g_lcd_info.status.disp_status != LCD_IDLE_MODE) {\r
+        return EXT_ERR_LCD_NOT_IN_IDLE_MODE;\r
+    }\r
+\r
+    lcd_lock();\r
+    ret = g_lcd_info.common_api->exit_idle_mode();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("exit_idle_mode fail, ret = %X\r\n", ret);\r
+        lcd_unlock();\r
+        return ret;\r
+    }\r
+    g_lcd_info.status.disp_status = LCD_NORMAL_DISPLAY;\r
+    lcd_unlock();\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static ext_errno lcd_te_param_check(void)\r
+{\r
+    if (!g_lcd_info.is_inited) {\r
+        return EXT_ERR_LCD_NOT_INIT;\r
+    }\r
+    if (g_lcd_info.screen_type == VIDEO_LCD) {\r
+        return EXT_ERR_LCD_VIDEO_SCREEN_NOT_SUPPORT_TE;\r
+    }\r
+    if (g_lcd_info.status.disp_status != LCD_NORMAL_DISPLAY && g_lcd_info.status.disp_status != LCD_IDLE_MODE) {\r
+        return EXT_ERR_LCD_INVALID_TE_ON_MODE;\r
+    }\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno uapi_lcd_te_on(void)\r
+{\r
+    ext_errno ret = lcd_te_param_check();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        return ret;\r
+    }\r
+    if (g_lcd_info.status.te_status == LCD_TE_ON) {\r
+        return EXT_ERR_SUCCESS;\r
+    }\r
+\r
+    lcd_lock();\r
+    ret = g_lcd_info.common_api->te_on();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("te_on fail, ret = %X\r\n", ret);\r
+        lcd_unlock();\r
+        return ret;\r
+    }\r
+    g_lcd_info.status.te_status = LCD_TE_ON;\r
+    lcd_unlock();\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno uapi_lcd_te_off(void)\r
+{\r
+    ext_errno ret = lcd_te_param_check();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        return ret;\r
+    }\r
+    if (g_lcd_info.status.te_status == LCD_TE_OFF) {\r
+        return EXT_ERR_SUCCESS;\r
+    }\r
+\r
+    lcd_lock();\r
+    ret = g_lcd_info.common_api->te_off();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("te_off fail, ret = %X\r\n", ret);\r
+        lcd_unlock();\r
+        return ret;\r
+    }\r
+    g_lcd_info.status.te_status = LCD_TE_OFF;\r
+    lcd_unlock();\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno uapi_lcd_set_brightness(uint16_t value)\r
+{\r
+    ext_errno ret;\r
+    if (!g_lcd_info.is_inited) {\r
+        return EXT_ERR_LCD_NOT_INIT;\r
+    }\r
+    if (g_lcd_info.status.disp_status > LCD_IDLE_MODE) {\r
+        return EXT_ERR_LCD_IN_DISPLAY_OFF_STATE;\r
+    }\r
+\r
+    lcd_lock();\r
+    ret = g_lcd_info.common_api->set_brightness(value);\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("set_brightness fail, ret = %X\r\n", ret);\r
+        lcd_unlock();\r
+        return ret;\r
+    }\r
+    g_lcd_info.brightness = (uint8_t)value;\r
+    lcd_unlock();\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno uapi_lcd_get_brightness(uint16_t *value)\r
+{\r
+    if (!g_lcd_info.is_inited) {\r
+        return EXT_ERR_LCD_NOT_INIT;\r
+    }\r
+    *value = g_lcd_info.brightness;\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno uapi_lcd_write_reg(lcd_cmd_sequ *cmds, uint32_t cmd_count)\r
+{\r
+    ext_errno ret;\r
+    if (!g_lcd_info.is_inited) {\r
+        return EXT_ERR_LCD_NOT_INIT;\r
+    }\r
+\r
+    if (cmds == NULL || cmd_count == 0) {\r
+        return EXT_ERR_LCD_INVALID_WRITE_CMD;\r
+    }\r
+    lcd_lock();\r
+    ret = g_lcd_info.common_api->write(cmds, cmd_count);\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("write reg fail, ret = %X\r\n", ret);\r
+        lcd_unlock();\r
+        return ret;\r
+    }\r
+    lcd_unlock();\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno uapi_lcd_read_reg(uint8_t cmd, uint8_t *buff, uint8_t buff_len)\r
+{\r
+    ext_errno ret;\r
+    if (!g_lcd_info.is_inited) {\r
+        return EXT_ERR_LCD_NOT_INIT;\r
+    }\r
+    if (g_lcd_info.status.disp_status > LCD_SLEEP_MODE) {\r
+        return EXT_ERR_LCD_IN_DISPLAY_OFF_STATE;\r
+    }\r
+    if (buff == NULL || buff_len == 0) {\r
+        return EXT_ERR_LCD_INVALID_READ_CMD;\r
+    }\r
+    lcd_lock();\r
+    ret = g_lcd_info.common_api->read(cmd, buff, buff_len);\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("read reg fail, ret = %X\r\n", ret);\r
+        lcd_unlock();\r
+        return ret;\r
+    }\r
+    lcd_unlock();\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno uapi_lcd_init(void)\r
+{\r
+    if (g_lcd_info.is_inited) {\r
+        return EXT_ERR_SUCCESS;\r
+    }\r
+\r
+    ext_errno ret = lcd_get_ops();\r
+    if (ret != EXT_ERR_SUCCESS && ret != EXT_ERR_MIPI_ALREADY_INIT) {\r
+        lcd_err("lcd_get_ops fail, ret = %X\r\n", ret);\r
+        return ret;\r
+    }\r
+\r
+    ret = lcd_lock_init();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("lcd_lock_init fail, ret = %X\r\n", ret);\r
+        return ret;\r
+    }\r
+\r
+    lcd_set_display_info();\r
+\r
+    ret = lcd_display_on();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        g_lcd_info.bus_api->bus_deinit();\r
+        lcd_lock_deinit();\r
+        lcd_err("lcd_display_on fail, ret = %X\r\n", ret);\r
+        return ret;\r
+    }\r
+\r
+    g_lcd_info.is_inited = true;\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno uapi_lcd_deinit(void)\r
+{\r
+    ext_errno ret;\r
+    if (!g_lcd_info.is_inited) {\r
+        return EXT_ERR_SUCCESS;\r
+    }\r
+\r
+    if (g_lcd_info.status.disp_status != LCD_DISPLAY_OFF) {\r
+        ret = g_lcd_info.common_api->display_off();\r
+        if (ret != EXT_ERR_SUCCESS) {\r
+            lcd_err("display_off fail, ret = %X\r\n", ret);\r
+        }\r
+\r
+        ret = g_lcd_info.bus_api->bus_disable();\r
+        if (ret != EXT_ERR_SUCCESS) {\r
+            lcd_err("bus_disable fail, ret = %X\r\n", ret);\r
+        }\r
+    }\r
+    lcd_lock();\r
+    ret = g_lcd_info.bus_api->bus_deinit();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        lcd_err("bus_deinit fail, ret = %X\r\n", ret);\r
+    }\r
+    g_lcd_info.private_api->power_off();\r
+\r
+    g_lcd_info.status.disp_status = LCD_DISPLAY_OFF;\r
+    g_lcd_info.is_inited = false;\r
+    lcd_unlock();\r
+\r
+    lcd_lock_deinit();\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static ext_errno lcd_lp_ctrl_check(void)\r
+{\r
+    if (!g_lcd_info.is_inited) {\r
+        return EXT_ERR_LCD_NOT_INIT;\r
+    }\r
+\r
+    if (g_lcd_info.bus_api == NULL) {\r
+        return EXT_ERR_LCD_GET_ATTR_FAIL;\r
+    }\r
+\r
+    if (g_lcd_info.bus_api->bus_lp_ctrl == NULL) {\r
+        return EXT_ERR_LCD_NOT_SUPPORT_FUNC;\r
+    }\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno uapi_lcd_enter_sdlp(void)\r
+{\r
+    ext_errno ret;\r
+\r
+    ret = lcd_lp_ctrl_check();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        return ret;\r
+    }\r
+\r
+    return g_lcd_info.bus_api->bus_lp_ctrl(LP_CTRL_ENTER_SDLP);\r
+}\r
+\r
+ext_errno uapi_lcd_exit_sdlp(void)\r
+{\r
+    ext_errno ret;\r
+\r
+    ret = lcd_lp_ctrl_check();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        return ret;\r
+    }\r
+\r
+    return g_lcd_info.bus_api->bus_lp_ctrl(LP_CTRL_EXIT_SDLP);\r
+}\r
+\r
+ext_errno uapi_lcd_exit_ulps(void)\r
+{\r
+    ext_errno ret;\r
+\r
+    ret = lcd_lp_ctrl_check();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        return ret;\r
+    }\r
+\r
+    return g_lcd_info.bus_api->bus_lp_ctrl(LP_CTRL_EXIT_ULPS);\r
+}\r
+\r
+ext_errno uapi_lcd_clear_exit_ulps(void)\r
+{\r
+    ext_errno ret;\r
+\r
+    ret = lcd_lp_ctrl_check();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        return ret;\r
+    }\r
+\r
+    return g_lcd_info.bus_api->bus_lp_ctrl(LP_CTRL_CLEAR_EXIT_ULPS);\r
+}\r
+\r
+static void lcd_register_qspi_bus(void)\r
+{\r
+    lcd_bus_api qspi_bus_api = {0};\r
+\r
+    qspi_bus_api.bus_init = lcd_qspi_init;\r
+    qspi_bus_api.bus_deinit = lcd_qspi_deinit;\r
+    qspi_bus_api.bus_enable = lcd_qspi_enable;\r
+    qspi_bus_api.bus_disable = lcd_qspi_disable;\r
+    qspi_bus_api.bus_write_cmd = lcd_qspi_write_cmd;\r
+    qspi_bus_api.bus_read_cmd = lcd_qspi_read_cmd;\r
+    qspi_bus_api.bus_send_frame = lcd_qspi_send_frame;\r
+    qspi_bus_api.bus_suspend = lcd_qspi_suspend;\r
+    qspi_bus_api.bus_resume = lcd_qspi_resume;\r
+    qspi_bus_api.bus_register_te_isr = lcd_qspi_register_te_isr;\r
+\r
+    lcd_bus_register_api(&qspi_bus_api, BUS_DISPLAY_QSPI);\r
+}\r
+\r
+static void lcd_register_mipi_bus(void)\r
+{\r
+    lcd_bus_api mipi_bus_api = {0};\r
+\r
+    mipi_bus_api.bus_init = mipi_bus_init,\r
+    mipi_bus_api.bus_deinit = mipi_bus_deinit,\r
+    mipi_bus_api.bus_enable = mipi_bus_enable,\r
+    mipi_bus_api.bus_disable = mipi_bus_disable,\r
+    mipi_bus_api.bus_write_cmd = mipi_bus_write,\r
+    mipi_bus_api.bus_read_cmd = mipi_bus_read,\r
+    mipi_bus_api.bus_lp_ctrl = mipi_bus_lp_ctrl,\r
+    mipi_bus_api.bus_register_panel_info = mipi_bus_register_panel_info,\r
+    mipi_bus_api.bus_get_panel_timing = mipi_bus_get_panel_timing,\r
+    mipi_bus_api.bus_get_partial_display_cmd = mipi_bus_get_partial_display_cmd,\r
+    mipi_bus_api.bus_update_panel = mipi_bus_update_panel,\r
+    mipi_bus_api.bus_refresh_area = mipi_bus_refresh_area,\r
+    mipi_bus_api.bus_suspend = mipi_bus_suspend,\r
+    mipi_bus_api.bus_resume = mipi_bus_resume,\r
+    lcd_bus_register_api(&mipi_bus_api, BUS_DISPLAY_MIPI);\r
+}\r
+\r
+static ext_errno lcd_info_check(const lcd_drv_cfg *info)\r
+{\r
+    if (info == NULL) {\r
+        return EXT_ERR_LCD_INVALID_NULL_POINTER;\r
+    }\r
+\r
+    if ((info->bus_type != BUS_DISPLAY_MIPI) && (info->bus_type != BUS_DISPLAY_QSPI)) {\r
+        return EXT_ERR_LCD_INVALID_SCREEN_OPS;\r
+    }\r
+\r
+    if (info->lcd_id == 0) {\r
+        return EXT_ERR_LCD_INVALID_CHIP_ID;\r
+    }\r
+\r
+    if ((info->display_on_cmds == NULL) || (info->display_off_cmds == NULL)) {\r
+        return EXT_ERR_LCD_INVALID_WRITE_CMD;\r
+    }\r
+\r
+    if (info->lcd_id_info.read_len == 0) {\r
+        return EXT_ERR_LCD_INVALID_READ_CMD;\r
+    }\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno uapi_lcd_info_register(lcd_drv_cfg *info)\r
+{\r
+    ext_errno ret;\r
+\r
+    ret = lcd_info_check(info);\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        return ret;\r
+    }\r
+\r
+    if (g_lcd_info.is_inited) {\r
+        return EXT_ERR_LCD_INIT_ALREADY;\r
+    }\r
+\r
+    if (g_lcd_info.common_api == NULL) {\r
+        g_lcd_info.common_api = lcd_drv_get_common_api();\r
+    }\r
+\r
+    if (g_lcd_info.common_api->set_lcd_config == NULL) {\r
+        return EXT_ERR_LCD_NOT_SUPPORT_FUNC;\r
+    }\r
+\r
+    ret = g_lcd_info.common_api->set_lcd_config(info);\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        return ret;\r
+    }\r
+\r
+    if (info->bus_type == BUS_DISPLAY_MIPI) {\r
+        lcd_register_mipi_bus();\r
+    } else {\r
+        lcd_register_qspi_bus();\r
+    }\r
+\r
+    g_lcd_info.info_register = true;\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/CMakeLists.txt b/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/CMakeLists.txt
new file mode 100644 (file)
index 0000000..6971096
--- /dev/null
@@ -0,0 +1,92 @@
+#===============================================================================
+# @brief    cmake file
+# Copyright (c) @CompanyNameMagicTag 2023-2023. All rights reserved.
+#===============================================================================
+set(COMPONENT_NAME "touch")
+
+set(SOURCES
+    ${CMAKE_CURRENT_SOURCE_DIR}/touch_screen_drv.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/touch_screen_queue1.c
+)
+
+if("TPTYPE_TMA525B" IN_LIST DEFINES)
+set(SOURCES ${SOURCES}
+    ${CMAKE_CURRENT_SOURCE_DIR}/tma525b_touch/tma525b_ctrl.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/tma525b_touch/tma525b_drv1.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/tma525b_touch/tma525b_touch1.c
+)
+elseif("TPTYPE_ZTW523" IN_LIST DEFINES)
+set(SOURCES ${SOURCES}
+    ${CMAKE_CURRENT_SOURCE_DIR}/ztw523_touch/ztw523_ctrl.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/ztw523_touch/ztw523_drv1.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/ztw523_touch/ztw523_touch1.c
+)
+elseif("TPTYPE_FT6X46" IN_LIST DEFINES)
+set(SOURCES ${SOURCES}
+    ${CMAKE_CURRENT_SOURCE_DIR}/ft6x46_touch/ft6x46_ctrl.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/ft6x46_touch/ft6x46_drv1.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/ft6x46_touch/ft6x46_touch1.c
+)
+else()
+set(SOURCES ${SOURCES}
+    ${CMAKE_CURRENT_SOURCE_DIR}/ztw523_touch/ztw523_ctrl.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/ztw523_touch/ztw523_drv1.c
+    ${CMAKE_CURRENT_SOURCE_DIR}/ztw523_touch/ztw523_touch1.c
+)
+endif()
+
+if("TPTYPE_TMA525B" IN_LIST DEFINES)
+set(PUBLIC_HEADER
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/tma525b_touch
+    ${ROOT_DIR}/middleware/services/gui/hal/input/include
+)
+elseif("TPTYPE_ZTW523" IN_LIST DEFINES)
+set(PUBLIC_HEADER
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/ztw523_touch
+    ${ROOT_DIR}/middleware/services/gui/hal/input/include
+)
+elseif("TPTYPE_FT6X46" IN_LIST DEFINES)
+set(PUBLIC_HEADER
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/ft6x46_touch
+    ${ROOT_DIR}/middleware/services/gui/hal/input/include
+)
+else()
+set(PUBLIC_HEADER
+    ${CMAKE_CURRENT_SOURCE_DIR}
+    ${CMAKE_CURRENT_SOURCE_DIR}/ztw523_touch
+    ${ROOT_DIR}/middleware/services/gui/hal/input/include
+)
+endif()
+
+set(PRIVATE_HEADER
+)
+
+set(PRIVATE_DEFINES
+)
+
+set(PUBLIC_DEFINES
+)
+
+# use this when you want to add ccflags like -include xxx
+set(COMPONENT_PUBLIC_CCFLAGS
+)
+
+set(COMPONENT_CCFLAGS
+    -Wno-incompatible-function-pointer-types
+    -Wno-unused-function
+)
+
+set(WHOLE_LINK
+    true
+)
+
+set(MAIN_COMPONENT
+    false
+)
+
+build_component()
+
+install_sdk(${CMAKE_CURRENT_SOURCE_DIR} "*")
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_ctrl.c b/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_ctrl.c
new file mode 100644 (file)
index 0000000..883324b
--- /dev/null
@@ -0,0 +1,386 @@
+/*
+ * Copyright (c) @CompanyNameMagicTag 2021-2022. All rights reserved.
+ * Description: ztw523 touch driver.
+ * Author: @CompanyNameTag
+ * Create: 2022-04-12
+ */
+
+#include "ft6x46_ctrl.h"
+#include "securec.h"
+#include "cmsis_os2.h"
+#include "soc_osal.h"
+#include "common_def.h"
+#include "pinctrl.h"
+#include "chip_io.h"
+#include "tcxo.h"
+#include "time.h"
+#include "i2c.h"
+#include "gpio.h"
+#include "hal_gpio.h"
+#include "hal_i2c.h"
+#include "touch_screen_def.h"
+
+bool g_host_dev_init_flag = TD_FALSE;
+ft6x46_ctrl_attr g_ctrl_attr;
+touch_callback g_ft6x46_callback = NULL;
+
+static void ft6x46_gpio_isr_handle(pin_t pin, uintptr_t param)
+{
+    unused(pin);
+    unused(param);
+    if (g_ft6x46_callback != NULL) {
+        g_ft6x46_callback();
+    }
+}
+
+ext_errno ft6x46_register_handle(const ft6x46_ctrl_ops *peri_data, touch_callback func)
+{
+    unused(peri_data);
+    ext_errno ret;
+
+
+    //tp_err("ft6x46_register_handle*****************888888888");
+    g_ft6x46_callback = func;
+    /* register int io interrupt handler */
+    uapi_gpio_init();
+    gpio_select_core(FT6X46_INT_GPIO, CORE);
+    uapi_gpio_set_dir(FT6X46_INT_GPIO, GPIO_DIRECTION_INPUT);
+    ret = uapi_gpio_register_isr_func(FT6X46_INT_GPIO, GPIO_INTERRUPT_FALLING_EDGE, ft6x46_gpio_isr_handle);
+    if (ret != 0) {
+        tp_err("ft6x46 int callback register fail! ret=0x%x", ret);
+        return ret;
+    }
+
+    return EXT_ERR_SUCCESS;
+}
+
+ext_errno ft6x46_unregister_handle(const ft6x46_ctrl_ops *peri_data)
+{
+    unused(peri_data);
+    ext_errno ret;
+
+    /* unregister interrupt handler */
+    uapi_gpio_unregister_isr_func(FT6X46_INT_GPIO);
+    g_ft6x46_callback = NULL;
+
+    return EXT_ERR_SUCCESS;
+}
+
+static ext_errno tp_peripheral_init_status_check(void)
+{
+    if (g_host_dev_init_flag != TD_TRUE) {
+        return EXT_ERR_TP_DEV_INFO_NOT_REGISTER;
+    }
+
+    return EXT_ERR_SUCCESS;
+}
+
+static ext_errno ft6x46_ctrl_attr_check(const ft6x46_ctrl_attr *device_attr)
+{
+    unused(device_attr);
+    return EXT_ERR_SUCCESS;
+}
+
+static ext_errno tp_i2c_rd_wr_param_check(const uint8_t *data_buf, uint32_t data_len)
+{
+    unused(data_buf);
+    unused(data_len);
+    ext_errno ret = tp_peripheral_init_status_check();
+    if (ret != EXT_ERR_SUCCESS) {
+        return ret;
+    }
+
+    return EXT_ERR_SUCCESS;
+}
+
+ext_errno tp_i2c_data_read(uint8_t reg_addr, uint8_t *data_buf, uint32_t data_len)
+{
+    errcode_t ret;
+    uint32_t retry;
+    i2c_data_t data;
+    //uint8_t tp_reg_addr[FT6X46_REG_BYTE_LEN];
+
+    ret = tp_i2c_rd_wr_param_check(data_buf, data_len);
+    if (ret != 0) {
+        tp_err("tp data read param invalid! ret=0x%x", ret);
+        return ret;
+    }
+
+    memset_s(data_buf, data_len, 0, data_len);
+    //tp_reg_addr[FT6X46_I2C_SEND_INDEX0] = reg_addr & 0xff;
+    //tp_reg_addr[FT6X46_I2C_SEND_INDEX1] = (reg_addr >> OFFSET_8_BITS) & 0xff;
+
+    data.send_buf = &reg_addr;
+    data.send_len = FT6X46_CMD_SEND_LEN;
+    data.receive_buf = data_buf;
+    data.receive_len = data_len;
+
+    for (retry = 0; retry < FT6X46_I2C_TIME_MAX; retry++) {
+        ret = uapi_i2c_master_writeread(FT6X46_I2C_BUS, FT6X46_I2C_ADDR, &data);
+        if (ret == EXT_ERR_SUCCESS) {
+            break;
+        }
+    }
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("tp data read fail! ret=0x%x", ret);
+        return ret;
+    }
+
+    return EXT_ERR_SUCCESS;
+}
+
+
+ext_errno tp_ft6x46_i2c_data_read(uint8_t reg_addr, uint8_t *data_buf, uint32_t data_len)
+{
+    errcode_t ret;
+    uint32_t retry;
+    i2c_data_t data;
+    //uint8_t tp_reg_addr[FT6X46_REG_BYTE_LEN];
+
+    ret = tp_i2c_rd_wr_param_check(data_buf, data_len);
+    if (ret != 0) {
+        tp_err("tp data read param invalid! ret=0x%x", ret);
+        return ret;
+    }
+
+    memset_s(data_buf, data_len, 0, data_len);
+    //tp_reg_addr[FT6X46_I2C_SEND_INDEX0] = reg_addr & 0xff;
+    //tp_reg_addr[FT6X46_I2C_SEND_INDEX1] = (reg_addr >> OFFSET_8_BITS) & 0xff;
+
+    data.send_buf = &reg_addr;
+    data.send_len = sizeof(reg_addr);
+    data.receive_buf = data_buf;
+    data.receive_len = data_len;
+
+    for (retry = 0; retry < FT6X46_I2C_TIME_MAX; retry++) {
+        ret = uapi_i2c_master_writeread(FT6X46_I2C_BUS, FT6X46_I2C_ADDR, &data);
+        if (ret == EXT_ERR_SUCCESS) {
+            break;
+        }
+    }
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("tp data read fail! ret=0x%x", ret);
+        return ret;
+    }
+
+    return EXT_ERR_SUCCESS;
+}
+
+ext_errno tp_i2c_cmd_write(uint8_t cmd)
+{
+    errcode_t ret;
+    uint32_t retry;
+    i2c_data_t data;
+    //uint8_t tp_reg_addr[FT6X46_CMD_SEND_LEN];
+
+    ret = tp_peripheral_init_status_check();
+    if (ret != 0) {
+        tp_err("host peripheral not init! ret=0x%x", ret);
+        return ret;
+    }
+    //tp_reg_addr[FT6X46_I2C_SEND_INDEX0] = cmd & 0xff;
+    //tp_reg_addr[FT6X46_I2C_SEND_INDEX1] = (cmd >> OFFSET_8_BITS) & 0xff;
+
+    data.send_buf = &cmd;
+    data.send_len = FT6X46_CMD_SEND_LEN;
+    data.receive_buf = NULL;
+    data.receive_len = 0;
+
+    for (retry = 0; retry < FT6X46_I2C_TIME_MAX; retry++) {
+        ret = uapi_i2c_master_write(FT6X46_I2C_BUS, FT6X46_I2C_ADDR, &data);
+        if (ret == EXT_ERR_SUCCESS) {
+            break;
+        }
+    }
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("tp data write fail! ret=0x%x", ret);
+        return ret;
+    }
+
+    return EXT_ERR_SUCCESS;
+}
+
+ext_errno tp_i2c_data_write(uint8_t reg_addr, uint8_t *data_buf, uint16_t data_len)
+{
+    errcode_t ret;
+    uint32_t retry;
+    i2c_data_t data;
+    uint8_t *write_data = NULL;
+    uint16_t send_len;
+
+    ret = tp_i2c_rd_wr_param_check(data_buf, data_len);
+    if (ret != 0) {
+        tp_err("tp data write param invalid! ret=0x%x", ret);
+        return ret;
+    }
+
+    send_len = data_len + sizeof(uint8_t);
+
+    write_data = (uint8_t *)osal_kmalloc(send_len, OSAL_GFP_KERNEL);
+    if (write_data == NULL) {
+        tp_err("tp send buff malloc fail!");
+        return EXT_ERR_MALLOC_FAILURE;
+    }
+
+    write_data[FT6X46_I2C_SEND_INDEX0] = reg_addr;
+    ret = (uint32_t)memcpy_s(write_data + sizeof(uint8_t), send_len - sizeof(uint8_t), data_buf, data_len);
+    if (ret != EOK) {
+        tp_err("tp send_buf content copy fail! ret=0x%x", ret);
+        return ret;
+    }
+
+    data.send_buf = write_data;
+    data.send_len = send_len;
+    data.receive_buf = NULL;
+    data.receive_len = 0;
+
+    for (retry = 0; retry < FT6X46_I2C_TIME_MAX; retry++) {
+        ret = uapi_i2c_master_write(FT6X46_I2C_BUS, FT6X46_I2C_ADDR, &data);
+        if (ret == EXT_ERR_SUCCESS) {
+            break;
+        }
+    }
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("tp data write fail! ret=0x%x", ret);
+        return ret;
+    }
+
+    tp_mem_free(write_data);
+    return EXT_ERR_SUCCESS;
+}
+
+ext_errno tp_ft6x46_i2c_data_write(uint8_t reg_addr, uint8_t *data_buf, uint16_t data_len)
+{
+    errcode_t ret;
+    uint32_t retry;
+    i2c_data_t data;
+    uint8_t *write_data = NULL;
+    uint16_t send_len;
+
+    ret = tp_i2c_rd_wr_param_check(data_buf, data_len);
+    if (ret != 0) {
+        tp_err("tp data write param invalid! ret=0x%x", ret);
+        return ret;
+    }
+
+    send_len = data_len + sizeof(uint8_t);
+
+    write_data = (uint8_t *)osal_kmalloc(send_len, OSAL_GFP_KERNEL);
+    if (write_data == NULL) {
+        tp_err("tp send buff malloc fail!");
+        return EXT_ERR_MALLOC_FAILURE;
+    }
+
+    write_data[FT6X46_I2C_SEND_INDEX0] = reg_addr;
+    ret = (uint32_t)memcpy_s(write_data + sizeof(uint8_t), send_len - sizeof(uint8_t), data_buf, data_len);
+    if (ret != EOK) {
+        tp_err("tp send_buf content copy fail! ret=0x%x", ret);
+        return ret;
+    }
+
+    data.send_buf = write_data;
+    data.send_len = send_len;
+    data.receive_buf = NULL;
+    data.receive_len = 0;
+
+    for (retry = 0; retry < FT6X46_I2C_TIME_MAX; retry++) {
+        ret = uapi_i2c_master_write(FT6X46_I2C_BUS, FT6X46_I2C_ADDR, &data);
+        if (ret == EXT_ERR_SUCCESS) {
+            break;
+        }
+    }
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("tp data write fail! ret=0x%x", ret);
+        return ret;
+    }
+
+    tp_mem_free(write_data);
+    return EXT_ERR_SUCCESS;
+}
+
+ext_errno tp_ft6x46_i2c_data_write_reg(uint8_t addr, uint8_t val)
+{
+    return tp_ft6x46_i2c_data_write(addr, &val, 1);
+}
+
+
+ext_errno ft6x46_host_peripheral_init(ft6x46_ctrl_attr *attr)
+{
+    ext_errno ret;
+
+    if (attr == NULL) {
+        tp_err("ft6x46 communication interface cfg is empty!");
+        return EXT_ERR_FAILURE;
+    }
+    ret = ft6x46_ctrl_attr_check(attr);
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("tp invalid dev attr! ret=0x%x", ret);
+        return ret;
+    }
+
+    ret = (ext_errno)memcpy_s(&(g_ctrl_attr), sizeof(ft6x46_ctrl_attr), attr, sizeof(ft6x46_ctrl_attr));
+    if (ret != EOK) {
+        tp_err("tp attr content copy fail! ret=0x%x", ret);
+        return ret;
+    }
+
+    /* init i2c */
+    errcode_t result;
+    result = uapi_i2c_master_init(FT6X46_I2C_BUS, 400000, I2C_SPEED_MODE_FS); /* 400000: 400KHz */
+    if (result != EXT_ERR_SUCCESS) {
+        tp_err("tp i2c init fail! ret=0x%x", result);
+        return EXT_ERR_SUCCESS;
+    }
+
+    tp_print("TOUCH:i2c_id = %d  i2c_speed = %d  slave_addr  = 0x%x \r\n",
+        g_ctrl_attr.i2c_id, g_ctrl_attr.i2c_speed, FT6X46_I2C_ADDR);
+    g_host_dev_init_flag = true;
+
+    return EXT_ERR_SUCCESS;
+}
+
+ext_errno ft6x46_host_init_sample(void)
+{
+    ext_errno ret;
+    PRINT("**********ft6x46_host_init_sample**********\r\n");
+    ret = ft6x46_host_peripheral_init(&g_ctrl_attr);
+    ret = ft6x46_init();
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("tp host init fail! ret=0x%x", ret);
+        return ret;
+    }
+
+    return EXT_ERR_SUCCESS;
+}
+
+ext_errno ft6x46_reset(void)
+{
+    uapi_gpio_set_dir(FT6X46_RESET_GPIO, GPIO_DIRECTION_OUTPUT);
+    /* Config Gpio For Reset Pin */
+    uapi_gpio_set_val(FT6X46_RESET_GPIO, GPIO_LEVEL_HIGH);
+    /* reset high delay 20ms */
+    osDelay(20);
+    uapi_gpio_set_val(FT6X46_RESET_GPIO, GPIO_LEVEL_LOW);
+    /* reset low delay 100ms */
+    osDelay(100);
+    uapi_gpio_set_val(FT6X46_RESET_GPIO, GPIO_LEVEL_HIGH);
+    /* reset high delay 200ms */
+    osDelay(200);
+    return EXT_ERR_SUCCESS;
+}
+
+void ft6x46_resume_reset(void)
+{
+    uapi_gpio_set_dir(FT6X46_RESET_GPIO, GPIO_DIRECTION_OUTPUT);
+    /* drvdata is global variable point and no need to handle null */
+    uapi_gpio_set_val(FT6X46_RESET_GPIO, GPIO_LEVEL_HIGH);
+    osDelay(1);
+    uapi_gpio_set_val(FT6X46_RESET_GPIO, GPIO_LEVEL_LOW);
+    /* delay 10ms */
+    osDelay(10);
+    uapi_gpio_set_val(FT6X46_RESET_GPIO, GPIO_LEVEL_HIGH);
+    /* delay 100ms */
+    osDelay(200);
+    uapi_gpio_set_dir(FT6X46_RESET_GPIO, GPIO_DIRECTION_INPUT);
+}
+
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_ctrl.h b/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_ctrl.h
new file mode 100644 (file)
index 0000000..ac23c5f
--- /dev/null
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) @CompanyNameMagicTag 2021-2022. All rights reserved.
+ * Description: ztw523 touch driver.
+ * Author: @CompanyNameTag
+ * Create: 2022-04-12
+ */
+
+#ifndef FT6X46_CTRL_H
+#define FT6X46_CTRL_H
+
+#include "stdio.h"
+#include "debug_print.h"
+#include "stdint.h"
+#include "product.h"
+#include "td_base.h"
+#include "platform_core.h"
+#include "ft6x46_touch1.h"
+
+/* host peripheral definitions */
+
+//#define FT6X46_I2C_ADDR           0x20
+#define FT6X46_I2C_ADDR           0x38
+#define FT6X46_I2C_SPEED          I2C_SPEED_MODE_SS
+#define FT6X46_REG_BYTE_LEN       2
+#define OFFSET_8_BITS             8
+#define FT6X46_REG_WRITE_LEN      4
+
+#define FT6X46_CMD_SEND_LEN       2
+// #define FT6X46_CMD_SEND_LEN       1
+
+#define FT6X46_REG_DATA_LEN       2
+#define FT6X46_I2C_TIME_MAX       3
+
+#define FT6X46_I2C_SEND_INDEX0    0
+#define FT6X46_I2C_SEND_INDEX1    1
+#define FT6X46_I2C_SEND_INDEX2    2
+#define FT6X46_I2C_SEND_INDEX3    3
+
+
+#define FTS_REG_POWER_MODE                             0xA5
+
+
+typedef struct {
+    uint32_t int_gpio;
+    uint32_t reset_gpio;
+    i2c_bus_t i2c_id;
+    uint32_t i2c_speed;
+} ft6x46_ctrl_attr;
+
+typedef ext_errno (*ft6x46_bus_init)(ft6x46_ctrl_attr *attr);
+
+typedef struct {
+    ft6x46_ctrl_attr attr;
+    ft6x46_bus_init bus_init;
+} ft6x46_ctrl_ops;
+
+ext_errno ft6x46_host_peripheral_init(ft6x46_ctrl_attr *attr);
+ext_errno ft6x46_register_handle(const ft6x46_ctrl_ops *peri_data, touch_callback func);
+ext_errno ft6x46_unregister_handle(const ft6x46_ctrl_ops *peri_data);
+ext_errno ft6x46_reset(void);
+void ft6x46_resume_reset(void);
+void ft6x46_delay(uint32_t ms);
+
+ext_errno tp_ft6x46_i2c_data_read(uint8_t reg_addr, uint8_t *data_buf, uint32_t data_len);
+ext_errno tp_ft6x46_i2c_data_write(uint8_t reg_addr, uint8_t *data_buf, uint16_t data_len);
+ext_errno tp_ft6x46_i2c_data_write_reg(uint8_t addr, uint8_t val);
+
+#endif
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_drv1.c b/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_drv1.c
new file mode 100644 (file)
index 0000000..928c58e
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) @CompanyNameMagicTag 2021-2022. All rights reserved.
+ * Description: ztw523 touch driver.
+ * Author: @CompanyNameTag
+ * Create: 2022-04-12
+ */
+
+#include "ft6x46_drv1.h"
+#include "touch_screen_def.h"
+#include "ft6x46_ctrl.h"
+#include "i2c.h"
+#include "debug_print.h"
+#include "hal_i2c.h"
+
+static ext_errno ft6x46_drv_init(ft6x46_ctrl_ops *config)
+{
+    ext_errno ret;
+    ft6x46_ctrl_ops *ops = config;
+
+    tp_err("ft6x46_drv_init!11111");
+
+    if (ops == NULL) {
+        tp_err("peripheral ops is empty!");
+        return EXT_ERR_FAILURE;
+    }
+
+    if (ops->bus_init == NULL) {
+        tp_err("peripheral bus_init func is empty!");
+        return EXT_ERR_FAILURE;
+    }
+
+    ret = ops->bus_init(&(ops->attr));
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("ZTW523 bus_init fail! ret = 0x%x", ret);
+        return ret;
+    }
+
+    ret = ft6x46_init();
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("ZTW523 init fail! ret = 0x%x", ret);
+        return ret;
+    }
+
+    return EXT_ERR_SUCCESS;
+}
+
+static ext_errno ft6x46_drv_deinit(void)
+{
+    return EXT_ERR_SUCCESS;
+}
+
+static ext_errno ft6x46_drv_get_info(uint8_t *data, uint8_t data_len)
+{
+    return ft6x46_irq_callback(data, data_len);
+}
+
+static ext_errno ft6x46_drv_suspend(void)
+{
+    //return ft6x46_set_power_mode(MC_TP_SUSPEND_SCAN);
+    return EXT_ERR_SUCCESS;
+}
+
+static ext_errno ft6x46_drv_resume(void)
+{
+    //return ft6x46_set_power_mode(MC_TP_RESUME_SCAN);
+    return EXT_ERR_SUCCESS;
+}
+
+static ext_errno ft6x46_drv_sleep(void)
+{
+    //return ft6x46_set_power_mode(MC_TP_SLEEP_WORK_MODE);
+    return EXT_ERR_SUCCESS;
+}
+
+touch_peripheral_api g_ft6x46_api = {
+    .touch_init = ft6x46_drv_init,
+    .touch_deinit = ft6x46_drv_deinit,
+    .touch_get_tpinfo = ft6x46_drv_get_info,
+    .touch_suspend = ft6x46_drv_suspend,
+    .touch_resume = ft6x46_drv_resume,
+    .touch_sleep = ft6x46_drv_sleep,
+    .touch_bus_init = ft6x46_host_peripheral_init,
+    .register_callback = ft6x46_register_handle,
+    .unregister_callback = ft6x46_unregister_handle,
+};
+
+ft6x46_ctrl_ops g_ft6x46_ctrl = {
+    .attr = {
+        .int_gpio = FT6X46_INT_GPIO,
+        .i2c_id = FT6X46_I2C_BUS,
+        .i2c_speed = I2C_SPEED_MODE_SS,
+    },
+    .bus_init = (ft6x46_bus_init)ft6x46_host_peripheral_init,
+};
+
+void *touch_screen_get_api(void)
+{
+    return ((void *)&g_ft6x46_api);
+}
+
+void *touch_screen_get_peri_attr(void)
+{
+    return ((void *)&g_ft6x46_ctrl);
+}
\ No newline at end of file
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_drv1.h b/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_drv1.h
new file mode 100644 (file)
index 0000000..c26f3a4
--- /dev/null
@@ -0,0 +1,14 @@
+/*
+ * Copyright (c) @CompanyNameMagicTag 2021-2022. All rights reserved.
+ * Description: ztw523 touch driver.
+ * Author: @CompanyNameTag
+ * Create: 2022-04-12
+ */
+
+#ifndef FT6X46_DRV1_H
+#define FT6X46_DRV1_H
+
+void *touch_screen_get_api(void);
+void *touch_screen_get_peri_attr(void);
+
+#endif
\ No newline at end of file
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_touch1.c b/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_touch1.c
new file mode 100644 (file)
index 0000000..0d2f4c7
--- /dev/null
@@ -0,0 +1,975 @@
+/*
+ * Copyright (c) @CompanyNameMagicTag 2021-2022. All rights reserved.
+ * Description: ft6x46 touch driver.
+ * Author: @CompanyNameTag
+ * Create: 2021-05-29
+ */
+
+#include "ft6x46_touch1.h"
+#include "time.h"
+#include "soc_osal.h"
+#include "osal_timer.h"
+#include "osal_mutex.h"
+#include "securec.h"
+#include "ft6x46_ctrl.h"
+#include "tcxo.h"
+#include "cmsis_os2.h"
+#include "common_def.h"
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif
+#endif
+
+ft6x46_drv_data g_ft6x46_drv = {
+    .chip_status = FT6X46_NOT_READY,
+    .ops_mux = {0},
+    .int_mask = FT6X46_INT_MASK,
+    .work_status = FT6X46_WORK_INVALID,
+    .fw_upgrade_flag = TD_FALSE,
+    .gesture_wakeup = TD_FALSE,
+    .host_dev_init_flag = TD_FALSE,
+    .chip_info = FT6X46_DEVICE_INFO,
+    .p_void = NULL,
+};
+static ext_errno ft6x46_config(void);
+static void ft6x46_set_irq_mode(ft6x46_irq_status irq_status, uint16_t irq_mask)
+{
+    unused(irq_mask);
+    ext_errno ret;
+    uint16_t reg_write = 0;
+
+    tp_print("TOUCH:set irq mode %d", irq_status);
+
+    switch (irq_status) {
+        case FT6X46_IRQ_DISABLE:
+            /* Write Int Register */
+            reg_write = FT6X46_INT_NONE;
+            // ret = tp_i2c_reg_write(FT6X46_INT_ENABLE_FLAG, reg_write);
+            // if (ret != EXT_ERR_SUCCESS) {
+            //     tp_err("TOUCH:set irq mode disable 0x%x", ret);
+            //     return;
+            // }
+            break;
+
+        case FT6X46_IRQ_ENABLE:
+            /* Write Int Register */
+            reg_write = FT6X46_INT_MASK;
+            // ret = tp_i2c_reg_write(FT6X46_INT_ENABLE_FLAG, reg_write);
+            // if (ret != EXT_ERR_SUCCESS) {
+            //     tp_err("TOUCH:set irq mode enable 0x%x", ret);
+            //     return;
+            // }
+            break;
+
+        default:
+            tp_err("TOUCH:not support irq mode 0x%x", irq_status);
+            break;
+    }
+
+    return;
+}
+
+static ext_errno ft6x46_parse_gesture_input(void)
+{
+    ext_errno ret;
+    uint16_t gesture_val;
+    uint16_t reg_read;
+    uint16_t reg_write;
+
+    reg_read = 0;
+    // ret = tp_i2c_data_read(FT6X46_GESTURE_WAKEUP_REG, (uint8_t *)&reg_read, FT6X46_DATA_LEN);
+    // if (ret != EXT_ERR_SUCCESS) {
+    //     tp_err("TOUCH:parse gesture input read fail 0x%x", ret);
+    //     return EXT_ERR_FAILURE;
+    // }
+    gesture_val = reg_read;
+    tp_print("TOUCH:parse gesture input ok 0x%x", reg_read);
+
+    reg_write = 0;
+    // ret = tp_i2c_reg_write(FT6X46_GESTURE_WAKEUP_REG, reg_write);
+    // if (ret != EXT_ERR_SUCCESS) {
+    //     tp_err("TOUCH:parse gesture input write fail 0x%x", ret);
+    //     return EXT_ERR_FAILURE;
+    // }
+
+    switch (gesture_val) {
+        case FT6X46_GESTURE_SIGNAL_CLICK:
+            g_ft6x46_drv.touch_msg.tp_event = MC_TP_SHORT_CLICK;
+            break;
+        case FT6X46_GESTURE_DOUBLE_CLICK:
+            g_ft6x46_drv.touch_msg.tp_event = MC_TP_DOUBLE_CLICK;
+            break;
+        case FT6X46_GESTURE_SLIDE_UP:
+            g_ft6x46_drv.touch_msg.tp_event = MC_TP_SLIDE_UP;
+            break;
+        case FT6X46_GESTURE_SLIDE_DOWN:
+            g_ft6x46_drv.touch_msg.tp_event = MC_TP_SLIDE_DOWN;
+            break;
+        default:
+            tp_err("TOUCH:gesture %d not Support", gesture_val);
+            return EXT_ERR_FAILURE;
+    }
+
+    return EXT_ERR_SUCCESS;
+}
+
+static ext_errno ft6x46_parse_touch_input(void)
+{
+    static uint8_t touch_input[FT6X46_TOUCHINFO_LEN] = { 0 };
+    uint16_t touch_status;
+    uint16_t x_axis;
+    uint16_t y_axis;
+    uint8_t sub_status;
+
+    ext_errno ret = tp_i2c_data_read(FT6X46_POINT_STATUS_REG, touch_input, FT6X46_TOUCHINFO_LEN);
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("TOUCH:touch input read error! ret = 0x%x", ret);
+        return EXT_ERR_FAILURE;
+    }
+    touch_status = ((uint16_t)touch_input[FT6X46_STATUSH_OFFSET] << FT6X46_REGDATA_SHIFT) |
+                   (touch_input[FT6X46_STATUSL_OFFSET]);
+    if ((touch_status & FT6X46_PALM_MASK) != 0) {
+        g_ft6x46_drv.touch_msg.tp_event = MC_TP_COVER;
+        return EXT_ERR_SUCCESS;
+    }
+
+    if (touch_status != 0) {
+        sub_status = touch_input[FT6X46_SUBSTATUS_OFFSET] & FT6X46_TOUCHINFO_MASK;
+        x_axis = ((uint16_t)touch_input[FT6X46_XH_OFFSET] << FT6X46_REGDATA_SHIFT) | (touch_input[FT6X46_XL_OFFSET]);
+        y_axis = ((uint16_t)touch_input[FT6X46_YH_OFFSET] << FT6X46_REGDATA_SHIFT) | (touch_input[FT6X46_YL_OFFSET]);
+
+        switch (sub_status) {
+            case FT6X46_TOUCH_DOWN:
+                g_ft6x46_drv.touch_msg.tp_event = MC_TP_PRESS;
+                break;
+            /* Need To Modify For UI */
+            case FT6X46_TOUCH_EXIST:
+            case FT6X46_TOUCH_MOVE:
+            case FT6X46_TOUCH_NONE:
+                g_ft6x46_drv.touch_msg.tp_event = MC_TP_MOVE;
+                break;
+            case FT6X46_TOUCH_UP:
+                g_ft6x46_drv.touch_msg.tp_event = MC_TP_RELEASE;
+                break;
+
+            default:
+                tp_err("TOUCH:parse input wrong status|substatus 0x%08x",
+                    ((uint32_t)touch_status << FT6X46_SHIFT_16_BIT) | (uint32_t)sub_status);
+                return EXT_ERR_FAILURE;
+        }
+        g_ft6x46_drv.touch_msg.tp_event_info.x_axis[0] = x_axis;
+        g_ft6x46_drv.touch_msg.tp_event_info.y_axis[0] = y_axis;
+        g_ft6x46_drv.touch_msg.tv_usec = (uint32_t)uapi_tcxo_get_ms();
+    } else {
+        g_ft6x46_drv.touch_msg.tp_event = MC_TP_INVALID;
+        tp_print("TOUCH:parse wrong touchstatus %d", touch_status);
+        return EXT_ERR_SUCCESS;
+    }
+
+    return EXT_ERR_SUCCESS;
+}
+
+
+/*Max point numbers of gesture trace*/
+#define MAX_POINTS_GESTURE_TRACE                       6
+/*Length of gesture information*/
+#define MAX_LEN_GESTURE_INFO                                   (MAX_POINTS_GESTURE_TRACE * 4 + 2)
+
+/*Max point numbers of touch trace*/
+#define MAX_POINTS_TOUCH_TRACE                         1
+/*Length of touch information*/
+#define MAX_LEN_TOUCH_INFO                                 (MAX_POINTS_TOUCH_TRACE * 6 + 2)
+
+/*Max touch points that touch controller supports*/
+#define        FTS_MAX_POINTS_SUPPORT                                          10
+
+struct fts_ts_event {
+    int x;             /*x coordinate */
+    int y;             /*y coordinate */
+    int p;             /* pressure */
+    int type;  /* touch event flag: 0 -- down; 1-- up; 2 -- contact */
+    int id;    /*touch ID */
+    int area;   /*touch area*/
+};
+
+static ext_errno fts_touch_process(void)
+{
+    ext_errno ret;
+    uint8_t i = 0;
+    uint8_t base = 0;
+    uint8_t regaddr = 0x01;
+    uint8_t buf[MAX_LEN_TOUCH_INFO];/*A maximum of two points are supported*/
+    uint8_t point_num = 0;
+    uint8_t touch_event_nums = 0;
+    uint8_t point_id = 0;
+    struct fts_ts_event events[FTS_MAX_POINTS_SUPPORT];    /* multi-touch */
+
+
+    /*read touch information from reg0x01*/
+    ret = tp_ft6x46_i2c_data_read(regaddr, buf, MAX_LEN_TOUCH_INFO);
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("Read touch information from reg0x01 fails");
+        return ret;
+    }
+
+    /*print touch buffer, for debug usage*/
+    //log_touch_buf(buf, MAX_LEN_TOUCH_INFO);
+
+    //if ((buf[1] == 0xFF) && (buf[2] == 0xFF) && (buf[3] == 0xFF)) {
+    //    tp_err("FW initialization, need recovery");
+    //    if (fts_data->gesture_support && fts_data->suspended)
+    //        fts_write_reg(FTS_REG_GESTURE_EN, FTS_REG_GESTURE_ENABLE);
+    //}
+
+    /*parse touch information based on register map*/
+    memset(events, 0xFF, sizeof(struct fts_ts_event) * FTS_MAX_POINTS_SUPPORT);
+    point_num = buf[1] & 0x0F;
+    if (point_num > FTS_MAX_POINTS_SUPPORT) {
+        tp_err("invalid point_num(%d)", point_num);
+        return EXT_ERR_FAILURE;
+    }
+
+    for (i = 0; i < MAX_POINTS_TOUCH_TRACE; i++) {
+        base = 2 + i * 6;
+        point_id = buf[base + 2] >> 4;
+        if (point_id >= MAX_POINTS_TOUCH_TRACE) {
+            tp_err("abnormal touch data point_id %d\r\n",point_id);
+            break;
+        }
+
+        events[i].x = ((buf[base] & 0x0F) << 8) + buf[base + 1];
+        events[i].y = ((buf[base + 2] & 0x0F) << 8) + buf[base + 3];
+        events[i].id = point_id;
+        events[i].type = (buf[base] >> 6) & 0x03;
+        events[i].p = buf[base + 4];
+        events[i].area = buf[base + 5];
+        if (((events[i].type == 0) || (events[i].type == 2)) & (point_num == 0)) {
+            tp_err("abnormal touch data from fw");
+            return EXT_ERR_FAILURE;
+        }
+
+        touch_event_nums++;
+    }
+
+    if (touch_event_nums == 0) {
+        tp_err("no touch point information(%02x)", buf[1]);
+        return EXT_ERR_FAILURE;
+    }
+
+    /*print touch information*/
+    //log_touch_info(events, touch_event_nums);
+
+    /*Now you have get the touch information, you can report anything(X/Y coordinates...) you want to system*/
+    /*TODO...(report touch information to system)*/
+    /*Below sample code is a pseudo code*/
+  
+    for (i = 0; i < touch_event_nums; i++) {
+        #if 0
+        if ((events[i].type == 0) || (events[i].type == 2)) {
+            /* The event of point(point id is events[i].id) is down event, the finger of this id stands for is
+             * pressing on the screen.*/
+            /*TODO...(down event)*/
+        } else {
+            /*TODO...(up event)*/
+        }
+        #endif
+         switch (events[i].type) {
+            case 0:
+                g_ft6x46_drv.touch_msg.tp_event = MC_TP_PRESS;
+                break;
+            /* Need To Modify For UI */
+            case 2:
+                g_ft6x46_drv.touch_msg.tp_event = MC_TP_MOVE;
+                break;
+            case 1:
+                g_ft6x46_drv.touch_msg.tp_event = MC_TP_RELEASE;
+                break;
+
+            default:
+                tp_err("TOUCH:parse input wrong status|substatus");
+                return EXT_ERR_FAILURE;
+        }
+        g_ft6x46_drv.touch_msg.tp_event_info.x_axis[0] = events[i].x;
+        g_ft6x46_drv.touch_msg.tp_event_info.y_axis[0] = events[i].y;
+        g_ft6x46_drv.touch_msg.tv_usec = (uint32_t)uapi_tcxo_get_ms();
+        tp_print("event %d, x %d, y %d, time %d",
+                            g_ft6x46_drv.touch_msg.tp_event, 
+                            g_ft6x46_drv.touch_msg.tp_event_info.x_axis[0],
+                            g_ft6x46_drv.touch_msg.tp_event_info.y_axis[0],
+                            g_ft6x46_drv.touch_msg.tv_usec);
+    }
+
+    return EXT_ERR_SUCCESS;
+}
+
+static ext_errno ft6x46_parse_input(void)
+{
+    ext_errno ret = EXT_ERR_FAILURE;
+    uint16_t reg_write;
+
+    if (g_ft6x46_drv.gesture_wakeup == TD_TRUE) {
+        ret = ft6x46_parse_gesture_input();
+        if (ret != EXT_ERR_SUCCESS) {
+            tp_err("TOUCH:parse gesture input fail 0x%x", ret);
+            return EXT_ERR_FAILURE;
+        }
+    } else {
+        ret = ft6x46_parse_touch_input();
+        if (ret != EXT_ERR_SUCCESS) {
+            tp_err("TOUCH:parse touch input fail 0x%x", ret);
+            return EXT_ERR_FAILURE;
+        }
+    }
+    /* clear int */
+    reg_write = FT6X46_CLEAR_INT_STATUS_CMD;
+    ret = tp_i2c_cmd_write(reg_write);
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("TOUCH:parse input clear int fail 0x%x", ret);
+        return EXT_ERR_FAILURE;
+    }
+
+    return EXT_ERR_SUCCESS;
+}
+
+ext_errno ft6x46_irq_callback(uint8_t *data_buf, uint8_t data_len)
+{
+    unused(data_len);
+    g_ft6x46_drv.touch_msg.tp_event = MC_TP_INVALID;
+
+    int32_t mem_ret;
+
+    fts_touch_process();
+
+
+    mem_ret = memcpy_s(data_buf, sizeof(input_event_info), &(g_ft6x46_drv.touch_msg), sizeof(input_event_info));
+    if (mem_ret != EOK) {
+        tp_err("TOUCH:mem cpy error, ret = 0x%x", mem_ret);
+        return EXT_ERR_FAILURE;
+    }
+
+    return EXT_ERR_SUCCESS;
+}
+
+/* chip id */
+#define FTS_CHIP_IDH                                                           0x64
+#define FTS_CHIP_IDL                                                           0x56
+
+
+#define FTS_CMD_READ_ID                                0x90
+
+/* register address */
+#define FTS_REG_CHIP_ID                                0xA3
+#define FTS_REG_CHIP_ID2                               0x9F
+
+#define FTS_CMD_START_DELAY                            12
+
+
+static ext_errno ft6x46_power_sequence(void)
+{
+    ext_errno ret;
+    uint8_t chip_id[2] = { 0 };
+
+    /*delay 200ms,wait fw*/
+    osDelay(FT6X46_GENERAL_DELAY_200);
+
+    /*get chip id*/
+    ret = tp_ft6x46_i2c_data_read(FTS_REG_CHIP_ID, &chip_id[0], 1);
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("222222222get ic information, error1");
+        return EXT_ERR_TP_ZTW523_POWERUP_READ_CHIPID;
+    }
+    ret = tp_ft6x46_i2c_data_read(FTS_REG_CHIP_ID2, &chip_id[1], 1);
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("3333333get ic information, error2");
+        return EXT_ERR_TP_ZTW523_POWERUP_READ_CHIPID;
+    }
+    // tp_print("11111111111111get ic information, chip id = 0x%02x%02x",  chip_id[0], chip_id[1]);
+    if ((FTS_CHIP_IDH == chip_id[0]) && (FTS_CHIP_IDL == chip_id[1])) {
+        tp_warning("get ic information, chip id = 0x%02x%02x",  chip_id[0], chip_id[1]);
+        return EXT_ERR_SUCCESS;
+    }
+
+    // tp_err("fw is invalid, need read boot id");
+    ret = tp_ft6x46_i2c_data_write_reg(0x55, 0xAA);
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("start cmd write fail");
+        return ret;
+    }
+
+    osDelay(FTS_CMD_START_DELAY);
+    ret = tp_ft6x46_i2c_data_read(FTS_CMD_READ_ID, chip_id, 2);
+    if((ret == EXT_ERR_SUCCESS) && ((FTS_CHIP_IDH == chip_id[0]) && (FTS_CHIP_IDL == chip_id[1]))) {
+        tp_err("get ic information, boot id = 0x%02x%02x", chip_id[0], chip_id[1]);
+        ret = EXT_ERR_SUCCESS;
+    } else {
+        tp_err("read boot id fail,read:0x%02x%02x", chip_id[0], chip_id[1]);
+        return EXT_ERR_FAILURE;
+    }
+    return ret;
+
+}
+
+static void ft6x46_clear_interrupt(uint8_t retry_times, uint16_t delay)
+{
+    uint16_t reg_write = FT6X46_CLEAR_INT_STATUS_CMD;
+    ext_errno ret;
+    uint8_t times;
+    for (times = 1; times <= retry_times; times++) {
+        ret = tp_i2c_cmd_write(reg_write);
+        if (ret == EXT_ERR_SUCCESS) {
+            return;
+        }
+        osDelay(delay);
+    }
+
+    if (times > retry_times) {
+        tp_warning("TOUCH:Clear Int Cmd1! ret = 0x%x", ret);
+    }
+}
+
+static ext_errno ft6x46_reg_config(void)
+{
+    ext_errno ret;
+    // uint16_t reg_write;
+
+    // /* Initial Touch Mode */
+    // reg_write = FT6X46_POINT_MODE;
+//     ret = tp_i2c_reg_write(FT6X46_INITIAL_TOUCH_MODE, reg_write);
+//     if (ret != EXT_ERR_SUCCESS) {
+//         return EXT_ERR_TP_ZTW523_CONFIG_INIT_TOUCHMODE;
+//     }
+
+//     ret = tp_i2c_reg_write(FT6X46_TOUCH_MODE, reg_write);
+//     if (ret != EXT_ERR_SUCCESS) {
+//         return EXT_ERR_TP_ZTW523_CONFIG_WRITE_TOUCHMODE;
+//     }
+
+//     /* Set Finger Num */
+//     reg_write = FT6X46_MAX_SUPPORTED_FINGER_NUM;
+//     ret = tp_i2c_reg_write(FT6X46_SUPPORTED_FINGER_NUM, reg_write);
+//     if (ret != EXT_ERR_SUCCESS) {
+//         return EXT_ERR_TP_ZTW523_CONFIG_WRITE_FINGER_NUM;
+//     }
+
+//     /* Set X Resolution */
+//     reg_write = FT6X46_RES_MAX_X;
+//     ret = tp_i2c_reg_write(FT6X46_X_RESOLUTION, reg_write);
+//     if (ret != EXT_ERR_SUCCESS) {
+//         return EXT_ERR_TP_ZTW523_CONFIG_WRITE_XRES;
+//     }
+
+//     /* Set Y Resolution */
+//     reg_write = FT6X46_RES_MAX_Y;
+//     ret = tp_i2c_reg_write(FT6X46_Y_RESOLUTION, reg_write);
+//     if (ret != EXT_ERR_SUCCESS) {
+//         return EXT_ERR_TP_ZTW523_CONFIG_WRITE_YRES;
+//     }
+
+//     /* Set Lock Point Range */
+//     ret = tp_i2c_reg_write(FT6X46_HOLD_POINT_TRESHHOLD, FT6X46_POINT_TRESHHOLD);
+//     if (ret != EXT_ERR_SUCCESS) {
+//         return EXT_ERR_TP_ZTW523_CONFIG_WRITE_YRES;
+//     }
+
+//     /* Write Calib Cmd */
+//     reg_write = FT6X46_CALIBRATE_CMD;
+//     ret = tp_i2c_cmd_write(reg_write);
+//     if (ret != EXT_ERR_SUCCESS) {
+//         return EXT_ERR_TP_ZTW523_CONFIG_WRITE_CALIBCMD;
+//     }
+
+//     /* Write Int Register */
+//     reg_write = FT6X46_INT_MASK;
+//     ret = tp_i2c_reg_write(FT6X46_INT_ENABLE_FLAG, reg_write);
+//     if (ret != EXT_ERR_SUCCESS) {
+//         return EXT_ERR_TP_ZTW523_CONFIG_WRITE_INTMASK;
+//     }
+// #ifdef FT6X46_GESTURE_WAKEUP
+//     /* Write Gesture Register */
+//     reg_write = FT6X46_GESTURE_WAKEUP_INIT;
+//     ret = tp_i2c_reg_write(FT6X46_GESTURE_WAKEUP_REG, reg_write);
+//     if (ret != EXT_ERR_SUCCESS) {
+//         return EXT_ERR_TP_ZTW523_CONFIG_WRITE_GESWAKEUP;
+//     }
+// #endif
+
+    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 *)&reg_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 *)&reg_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 *)&reg_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 *)&reg_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 *)&reg_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 *)&reg_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;
+    uint16_t reg_write;
+    uint8_t retry_times;
+
+    if ((g_ft6x46_drv.work_status == FT6X46_WORK_STANDBY) || (g_ft6x46_drv.work_status == FT6X46_WORK_SLEEP)) {
+        tp_print("alread standby or sleep");
+        return EXT_ERR_SUCCESS;
+    }
+    /* Disabel Irq */
+    ft6x46_set_irq_mode(FT6X46_IRQ_DISABLE, FT6X46_INT_NONE);
+
+    reg_write = FT6X46_POWER_CTL_BEGIN;
+    ret = tp_i2c_cmd_write(reg_write);
+    if (ret != EXT_ERR_SUCCESS) {
+        ft6x46_set_irq_mode(FT6X46_IRQ_ENABLE, FT6X46_INT_MASK);
+        tp_err("standby failed 0x%x", ret);
+        return EXT_ERR_FAILURE;
+    }
+    /* delay 10 ms */
+    osDelay(FT6X46_GENERAL_DELAY_10);
+    /* Send Clear Int Cmd */
+    reg_write = FT6X46_CLEAR_INT_STATUS_CMD;
+    for (retry_times = 0; retry_times < FT6X46_INIT_RETRY_TIMERS; retry_times++) {
+        ret = tp_i2c_cmd_write(reg_write);
+        if (ret == EXT_ERR_SUCCESS) {
+            break;
+        }
+        /* delay 10 ms */
+        osDelay(FT6X46_GENERAL_DELAY_10);
+    }
+
+    /* Send Idle Cmd */
+    reg_write = FT6X46_IDLE_CMD;
+    for (retry_times = 0; retry_times < FT6X46_INIT_RETRY_TIMERS; retry_times++) {
+        ret = tp_i2c_cmd_write(reg_write);
+        if (ret == EXT_ERR_SUCCESS) {
+            break;
+        }
+        /* delay 10 ms */
+        osDelay(FT6X46_GENERAL_DELAY_10);
+    }
+
+    reg_write = FT6X46_POWER_CTL_END;
+    ret = tp_i2c_cmd_write(reg_write);
+    if (ret != EXT_ERR_SUCCESS) {
+        ft6x46_set_irq_mode(FT6X46_IRQ_ENABLE, FT6X46_INT_MASK);
+        tp_err("standby failed 0x%x", ret);
+        return EXT_ERR_FAILURE;
+    }
+    /* delay 10 ms */
+    osDelay(FT6X46_GENERAL_DELAY_10);
+    ft6x46_set_irq_mode(FT6X46_IRQ_ENABLE, FT6X46_INT_MASK);
+    g_ft6x46_drv.work_status = FT6X46_WORK_STANDBY;
+    return EXT_ERR_SUCCESS;
+}
+
+ext_errno ft6x46_suspend(void)
+{
+    ext_errno ret;
+    // uint16_t reg_write;
+    // uint8_t retry_times = 0;
+
+    if (g_ft6x46_drv.work_status == FT6X46_WORK_SLEEP) {
+        tp_print("TOUCH:alread suspend");
+        return EXT_ERR_SUCCESS;
+    }
+    /*Host writes 0x03 to register address 0xA5 to enter into sleep mode.*/
+    ret = tp_ft6x46_i2c_data_write_reg(FTS_REG_POWER_MODE, 0x03);
+    if(ret != 0) {
+        tp_err("ft6x46_suspend enter sleep mode fails.ret:0x%X",ret);
+        return EXT_ERR_FAILURE;
+    } else {
+        tp_warning("ft6x46_suspend enter sleep mode success.");
+    }
+    g_ft6x46_drv.work_status = FT6X46_WORK_SLEEP;
+
+    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;
+    uint8_t retry_times = 0;
+
+    g_ft6x46_drv.work_status = FT6X46_WORK_RESUME;
+
+    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
+    g_ft6x46_drv.gesture_wakeup = TD_FALSE;
+#endif
+    /* Enable Irq */
+    ft6x46_set_irq_mode(FT6X46_IRQ_ENABLE, FT6X46_INT_MASK);
+
+    return EXT_ERR_SUCCESS;
+
+resume_exit:
+
+    /* Enable Irq */
+    ft6x46_set_irq_mode(FT6X46_IRQ_DISABLE, FT6X46_INT_MASK);
+
+    tp_err("resume failed 0x%x", ret);
+
+    return EXT_ERR_FAILURE;
+}
+
+ext_errno ft6x46_get_power_mode(uint32_t *power_mode)
+{
+    if (power_mode == NULL) {
+        return EXT_ERR_FAILURE;
+    }
+
+    *power_mode = (uint32_t)(g_ft6x46_drv.work_status);
+
+    return EXT_ERR_SUCCESS;
+}
+
+static ext_errno ft6x46_set_standby_mode(void)
+{
+    ext_errno ret;
+
+    ret = ft6x46_standby();
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("TOUCH:ft6x46 set standby 0x%x", ret);
+        return EXT_ERR_FAILURE;
+    }
+#ifdef FT6X46_GESTURE_WAKEUP
+    g_ft6x46_drv.gesture_wakeup = TD_TRUE;
+#endif
+    return EXT_ERR_SUCCESS;
+}
+
+static ext_errno ft6x46_set_sleep_mode(void)
+{
+    ext_errno ret;
+
+    ret = ft6x46_suspend();
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("TOUCH:ft6x46 set suspend fail 0x%x", ret);
+    }
+#ifdef FT6X46_GESTURE_WAKEUP
+    g_ft6x46_drv.gesture_wakeup = TD_FALSE;
+#endif
+    g_ft6x46_drv.work_status = FT6X46_WORK_SLEEP;
+    return EXT_ERR_SUCCESS;
+}
+
+static ext_errno ft6x46_set_normal_mode(void)
+{
+    ext_errno ret;
+    uint16_t reg_write;
+
+    if (g_ft6x46_drv.work_status == FT6X46_WORK_NORMAL) {
+        return EXT_ERR_SUCCESS;
+    }
+
+    reg_write = FT6X46_SDRAM_RESET;
+    ret = tp_i2c_cmd_write(reg_write);
+    if (ret != EXT_ERR_SUCCESS) {
+        return EXT_ERR_FAILURE;
+    }
+    /* delay 50ms */
+    osDelay(FT6X46_GENERAL_DELAY_50);
+    ret = ft6x46_power_sequence();
+    if (ret != EXT_ERR_SUCCESS) {
+        return EXT_ERR_FAILURE;
+    }
+    ft6x46_set_irq_mode(FT6X46_IRQ_ENABLE, FT6X46_INT_MASK);
+    g_ft6x46_drv.work_status = FT6X46_WORK_NORMAL;
+#ifdef FT6X46_GESTURE_WAKEUP
+    g_ft6x46_drv.gesture_wakeup = TD_FALSE;
+#endif
+    return EXT_ERR_SUCCESS;
+}
+
+ext_errno ft6x46_set_power_mode(tp_work_mode power_mode)
+{
+    ext_errno ret = EXT_ERR_SUCCESS;
+
+    switch (power_mode) {
+        case MC_TP_SLEEP_WORK_MODE:
+        case MC_TP_SUSPEND_SCAN:
+            ret = ft6x46_set_sleep_mode();
+            break;
+        case MC_TP_NORMAL_WORK_MODE:
+        case MC_TP_RESUME_SCAN:
+            ret = ft6x46_set_normal_mode();
+            break;
+        case MC_TP_STANDBY_WORK_MODE:
+            ret = ft6x46_set_standby_mode();
+            break;
+        default:
+            tp_err("TOUCH:ft6x46 not support powermode 0x%x", power_mode);
+            ret = EXT_ERR_FAILURE;
+            break;
+    }
+
+    return ret;
+}
+
+static ext_errno ft6x46_config(void)
+{
+    ext_errno ret;
+
+    /* Step 1 hardware reset */
+    ret = ft6x46_reset();
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("TOUCH:Init reset fail 0x%x", ret);
+        return EXT_ERR_TP_ZTW523_INIT_RESET;
+    }
+
+    /* Step 2 power up */
+    ret = ft6x46_power_sequence();
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("TOUCH:init powerup fail 0x%x", ret);
+        return EXT_ERR_TP_ZTW523_INIT_POWERUP;
+    }
+
+#if 0
+    /* Step 3 configuration */
+    ret = ft6x46_configuration();
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("TOUCH:init config fail 0x%x", ret);
+        return EXT_ERR_TP_ZTW523_INIT_CONFIG;
+    }
+
+    /* Step 3 Panel Info */
+    ret = ft6x46_get_panel_info();
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("TOUCH:init get panelinfo fail 0x%x", ret);
+        return EXT_ERR_TP_ZTW523_INIT_GETINFO;
+    }
+#endif
+
+    /* Record Status For Init */
+    g_ft6x46_drv.chip_status = FT6X46_READY;
+    g_ft6x46_drv.work_status = FT6X46_WORK_NORMAL;
+
+    return EXT_ERR_SUCCESS;
+}
+
+static ext_errno ft6x46_resource_deinit(void)
+{
+    g_ft6x46_drv.work_status = FT6X46_WORK_INVALID;
+    g_ft6x46_drv.fw_upgrade_flag = TD_FALSE;
+    osal_mutex_destroy(&g_ft6x46_drv.ops_mux);
+
+    return EXT_ERR_SUCCESS;
+}
+
+ext_errno ft6x46_init(void)
+{
+    ext_errno ret = EXT_ERR_FAILURE;
+    ext_errno err_ret;
+
+    /* create tp operation mutex */
+    if (g_ft6x46_drv.ops_mux.mutex == NULL) {
+        ret = osal_mutex_init(&(g_ft6x46_drv.ops_mux));
+        if (ret != EXT_ERR_SUCCESS) {
+            tp_err("TOUCH:ft6x46 init create mux lock fail 0x%x", ret);
+            return EXT_ERR_FAILURE;
+        }
+    }
+
+    /* get tp operater mutex */
+    ret = osal_mutex_lock_timeout(&g_ft6x46_drv.ops_mux, FT6X46_OPERATER_MUTEX_WAIT_TIME);
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("TOUCH:ft6x46 init wait mux lock fail 0x%x", ret);
+        goto init_fail;
+    }
+
+    /* tp hardware reset and init */
+    ret = ft6x46_config();
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("TOUCH:ft6x46 init fail 0x%x", ret);
+        goto init_fail;
+    }
+
+    /* release tp operater mutex */
+    osal_mutex_unlock(&g_ft6x46_drv.ops_mux);
+
+    tp_print("TOUCH:ft6x46 init succ!");
+    return EXT_ERR_SUCCESS;
+
+init_fail:
+    /* release tp operater mutex */
+    osal_mutex_unlock(&g_ft6x46_drv.ops_mux);
+    err_ret =  ft6x46_resource_deinit();
+    if (err_ret != EXT_ERR_SUCCESS) {
+        tp_err("TOUCH:delete mux lock err! ret = 0x%x", err_ret);
+    }
+    return ret;
+}
+
+ext_errno ft6x46_deinit(void)
+{
+    ext_errno ret = ft6x46_resource_deinit();
+    if (ret != EXT_ERR_SUCCESS) {
+        tp_err("TOUCH: ft6x46 deinit fail! ret = 0x%x", ret);
+        return ret;
+    }
+
+    return EXT_ERR_SUCCESS;
+}
+
+#ifdef __cplusplus
+#if __cplusplus
+    }
+#endif
+#endif
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_touch1.h b/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/ft6x46_touch/ft6x46_touch1.h
new file mode 100644 (file)
index 0000000..b0e5776
--- /dev/null
@@ -0,0 +1,421 @@
+/*
+ * Copyright (c) @CompanyNameMagicTag 2021-2022. All rights reserved.
+ * Description: ztw523 touch driver.
+ * Author: @CompanyNameTag
+ * Create: 2021-05-29
+ */
+
+#ifndef FT6X46_TOUCH1_H
+#define FT6X46_TOUCH1_H
+
+#include "stdio.h"
+#include "soc_errno.h"
+#include "soc_osal.h"
+#include "touch_screen_def.h"
+#include "platform_core.h"
+
+#ifdef __cplusplus
+#if __cplusplus
+extern "C" {
+#endif
+#endif
+
+/* ztw523 definitions */
+/* max wait time */
+#define FT6X46_OPERATER_MUTEX_WAIT_TIME 3000 /* operater tp mutex timeout ms */
+#define FT6X46_CMCP_WAIT_TIMEOUT        1000
+/* define some properties value */
+#define FT6X46_ENABLE                   0x0001
+#define FT6X46_DISABLE                  0x0000
+#define FT6X46_DATA_LEN                 2
+#define FT6X46_POWERON_DELAY            100
+#define FT6X46_POWEROFF_DELAY           100
+#define FT6X46_RESETHIGH_DELAY          10
+#define FT6X46_CLEARINT_DELAY           10
+#define FT6X46_FIRMWAREON_DELAY         200
+#define FT6X46_INIT_RETRY_TIMERS        3
+#define FT6X46_SETMODE_RETRY_TIMERS     3
+#define FT6X46_SOFTRESET_RETRY_TIMES    10
+#define FT6X46_RETRY_TIMES              10
+#define FT6X46_DEVICE_INFO              "zinitix,ft6x46"
+#define FT6X46_DEVICE_INFO_SIZE         sizeof(FT6X46_DEVICE_INFO)
+#define FT6X46_MAX_SUPPORTED_FINGER_NUM 1
+#define FT6X46_POINT_MODE               1
+#define FT6X46_CALIB_TOUCH_MODE         0x07
+#define FT6X46_REGDATA_SHIFT            8
+#define FT6X46_GENERAL_DELAY_1          1
+#define FT6X46_GENERAL_DELAY_5          5
+#define FT6X46_GENERAL_DELAY_10         10
+#define FT6X46_GENERAL_DELAY_20         20
+#define FT6X46_GENERAL_DELAY_25         25
+#define FT6X46_GENERAL_DELAY_30         30
+#define FT6X46_GENERAL_DELAY_50         50
+#define FT6X46_GENERAL_DELAY_100        100
+#define FT6X46_GENERAL_DELAY_200        200
+#define FT6X46_GENERAL_DELAY_500        500
+#define FT6X46_GENERAL_RETRY_1          1
+#define FT6X46_GENERAL_RETRY_2          2
+#define FT6X46_GENERAL_RETRY_3          3
+#define FT6X46_GENERAL_RETRY_4          4
+#define FT6X46_GENERAL_RETRY_10         10
+#define FT6X46_RAWDATA_DELAY_FOR_HOST   100
+#define FT6X46_FW_JUMP_CODE             0x0048
+#define FT6X46_REPORT_RATE              60
+#define FT6X46_PIXEL_THRESHOLD          5
+
+#ifndef FT6X46_RES_MAX_X
+#define FT6X46_RES_MAX_X 466
+#endif
+
+#ifndef FT6X46_RES_MAX_Y
+#define FT6X46_RES_MAX_Y 466
+#endif
+
+#ifndef FT6X46_POINT_TRESHHOLD
+#define FT6X46_POINT_TRESHHOLD 0x19
+#endif
+
+#define FT6X46_TOUCHINFO_HEAD_LEN 4
+#define FT6X46_POINTINFO_LEN      6
+#define FT6X46_TOUCHINFO_LEN      (FT6X46_TOUCHINFO_HEAD_LEN + FT6X46_POINTINFO_LEN * FT6X46_MAX_SUPPORTED_FINGER_NUM)
+
+#define FT6X46_INT_NONE            0x0000
+#define FT6X46_INT_MASK            0x081F
+#define FT6X46_PALM_MASK           0x0010
+#define FT6X46_GESTURE_WAKEUP_INIT 0
+#define FT6X46_FIRMWARE_SIZE       48
+#define ZTW_PAGE_SIZE_128          128
+#define ZTW_PAGE_SIZE_64           64
+#define ZTW_SECTOR_SIZE            8
+#define ZTW_CHIPID_F400            0xF400
+#define ZTW_CHIPID_E240            0xE240
+#define ZTW_CHIPID_E700            0xE700
+#define ZTW_CHIPID_E548            0xE548
+#define ZTW_CHIPID_E538            0xE538
+#define ZTW_CHIPID_E532            0xE532
+#define ZTW_VENDOR_ID              0x5A49
+#define FT6X46_CHIP_ID             0xE628
+/* define touch info offset */
+#define FT6X46_STATUSL_OFFSET   0
+#define FT6X46_STATUSH_OFFSET   1
+#define FT6X46_EVENTL_OFFSET    2
+#define FT6X46_EVENTH_OFFSET    3
+#define FT6X46_XL_OFFSET        4
+#define FT6X46_XH_OFFSET        5
+#define FT6X46_YL_OFFSET        6
+#define FT6X46_YH_OFFSET        7
+#define FT6X46_WIDTH_OFFSET     8
+#define FT6X46_SUBSTATUS_OFFSET 9
+/* define data shift and mask */
+#define FT6X46_SHIFT_8_BIT  8
+#define FT6X46_SHIFT_16_BIT 16
+#define FT6X46_SHIFT_24_BIT 24
+#define FT6X46_MASK_BYTE    0xFF
+/* define FT6X46_HIGH_SPEED_DMA rely on iic dma support */
+#ifdef FT6X46_HIGH_SPEED_DMA
+#define FT6X46_TOUCH_POINT_MODE 0
+#else
+#define FT6X46_TOUCH_POINT_MODE 1
+#endif
+
+#define FT6X46_SEC_MODE        48
+#define FT6X46_NORMAL_MODE     5
+#define FT6X46_DND_MODE        11 /* mutual cap */
+#define FT6X46_SELF_DND_MODE   17 /* self cap */
+#define FT6X46_DNDSKIP_CNT     1
+#define FT6X46_SELFDNDSKIP_CNT 1
+/* Config Reg Info */
+#define FT6X46_REG_CMD_ENABLE    0xC000
+#define FT6X46_REG_CHIP_ID       0xCC00
+#define FT6X46_REG_INTN_CLEAR    0xC004
+#define FT6X46_REG_NVM           0xC002
+#define FT6X46_REG_NVM_VPP       0xC003
+#define FT6X46_REG_NVM_WP        0xC104
+#define FT6X46_REG_PROGRAM_START 0xC001
+#define FT6X46_POWER_CTL_BEGIN   0x000A
+#define FT6X46_POWER_CTL_END     0x000B
+#define FT6X46_CALIB_CTL1        0xC003
+#define FT6X46_CALIB_CTL2        0xC104
+#define FT6X46_SDRAM_RESET       0x0FF8
+#define FT6X46_REPORT_REG        0x0186  /* 设置中断上报频率 */
+#define FT6X46_PIXEL_THRESHOLD_REG 0x00C3
+/* Register Map */
+#define FT6X46_SWRESET_CMD                   0x0000
+#define FT6X46_WAKEUP_CMD                    0x0001
+#define FT6X46_IDLE_CMD                      0x0004
+#define FT6X46_SLEEP_CMD                     0x0005
+#define FT6X46_CLEAR_INT_STATUS_CMD          0x0003
+#define FT6X46_CALIBRATE_CMD                 0x0006
+#define FT6X46_SAVE_STATUS_CMD               0x0007
+#define FT6X46_SAVE_CALIBRATION_CMD          0x0008
+#define FT6X46_RECALL_FACTORY_CMD            0x000f
+#define FT6X46_SENSITIVITY                   0x0020
+#define FT6X46_I2C_CHECKSUM_WCNT             0x016a
+#define FT6X46_I2C_CHECKSUM_RESULT           0x016c
+#define FT6X46_DEBUG_REG                     0x0115 /* 0~7 */
+#define FT6X46_TOUCH_MODE                    0x0010
+#define FT6X46_CHIP_REVISION                 0x0011
+#define FT6X46_FIRMWARE_VERSION              0x0012
+#define FT6X46_MINOR_FW_VERSION              0x0121
+#define FT6X46_DATA_VERSION_REG              0x0013
+#define FT6X46_HW_ID                         0x0014
+#define FT6X46_SUPPORTED_FINGER_NUM          0x0015
+#define FT6X46_EEPROM_INFO                   0x0018
+#define FT6X46_INITIAL_TOUCH_MODE            0x0019
+#define FT6X46_CHIP_HW_REVISION              0x001A
+#define FT6X46_IC_VENDOR_ID                  0x001C
+#define FT6X46_TSM_MODULE_ID                 0x001E
+#define FT6X46_TOTAL_NUMBER_OF_X             0x0060
+#define FT6X46_TOTAL_NUMBER_OF_Y             0x0061
+#define FT6X46_DELAY_RAW_FOR_HOST            0x007f
+#define FT6X46_BUTTON_SUPPORTED_NUM          0x00B0
+#define FT6X46_BUTTON_SENSITIVITY            0x00B2
+#define FT6X46_X_RESOLUTION                  0x00C0
+#define FT6X46_Y_RESOLUTION                  0x00C1
+#define FT6X46_HOLD_POINT_TRESHHOLD          0x00C3
+#define FT6X46_POINT_STATUS_REG              0x0080
+#define FT6X46_ICON_STATUS_REG               0x00AA
+#define FT6X46_AFE_FREQUENCY                 0x0100
+#define FT6X46_DND_N_COUNT                   0x0122
+#define FT6X46_DND_U_COUNT                   0x0135
+#define FT6X46_RAWDATA_REG                   0x0200
+#define FT6X46_EEPROM_INFO_REG               0x0018
+#define FT6X46_INT_ENABLE_FLAG               0x00f0
+#define FT6X46_PERIODICAL_INTERRUPT_INTERVAL 0x00f1
+#define FT6X46_CHECKSUM_RESULT               0x012c
+#define FT6X46_GESTURE_WAKEUP_REG            0x0126
+
+#define FT6X46_TOUCHINFO_MASK 0x0F
+#define FT6X46_TOUCH_EXIST    0x01
+#define FT6X46_TOUCH_DOWN     0x03
+#define FT6X46_TOUCH_MOVE     0x05
+#define FT6X46_TOUCH_UP       0x08
+#define FT6X46_TOUCH_NONE     0x07
+
+#define FT6X46_SUB_BIT_EXIST  0
+#define FT6X46_SUB_BIT_DOWN   1
+#define FT6X46_SUB_BIT_MOVE   2
+#define FT6X46_SUB_BIT_UP     3
+#define FT6X46_SUB_BIT_UPDATE 4
+#define FT6X46_SUB_BIT_WAIT   5
+
+#ifndef FT6X46_TSP_X_CHANNEL_NUM
+#define FT6X46_TSP_X_CHANNEL_NUM 6
+#endif
+
+#ifndef FT6X46_TSP_Y_CHANNEL_NUM
+#define FT6X46_TSP_Y_CHANNEL_NUM 6
+#endif
+
+#define FT6X46_TSP_DND_NUM     (FT6X46_TSP_X_CHANNEL_NUM * FT6X46_TSP_Y_CHANNEL_NUM)
+#define FT6X46_TSP_SELFDND_NUM (FT6X46_TSP_X_CHANNEL_NUM + FT6X46_TSP_Y_CHANNEL_NUM)
+
+/* firmware info */
+#define FT6X46_FIRMWARE_VERSION_L            0
+#define FT6X46_FIRMWARE_VERSION_H            1
+#define FT6X46_FIRMWARE_VERSION_OFFSET       52
+#define FT6X46_FIRMWARE_MINOR_VERSION_OFFSET 56
+#define FT6X46_FIRMWARE_DATA_VERSION_OFFSET  60
+#define FT6X46_FIRMWARE_OFFSET_ZERO          0
+#define FT6X46_FIRMWARE_CONVERT_DATA_STEP    2
+#define FT6X46_FIRMWARE_CONVERT_DATA_OFFSET  1
+/* file op code */
+#define FT6X46_FILE_ERROR (-1)
+#define FT6X46_FILE_OK    0
+/* upgrade info */
+#define FT6X46_FWGRADE_CMD_NUM 3
+/* rawdata info */
+#define FT6X46_RAWDATA_CMD_NUM 2
+/* define gesture macro */
+#define FT6X46_GESTURE_WAKEUP 1
+
+/* self_dnd dnd parameter */
+#define FT6X46_SEC_SELF_DND_N_COUNT      15
+#define FT6X46_SEC_SELF_DND_U_COUNT      2
+#define FT6X46_SEC_SELF_DND_FREQUENCY    80
+
+#define FT6X46_SEC_DND_N_COUNT           27
+#define FT6X46_SEC_DND_U_COUNT           3
+#define FT6X46_SEC_DND_FREQUENCY         240
+
+/* host peripheral typedef */
+typedef ext_errno (*tp_irq_callback)(void);
+
+/* ZTW523 driver typedef */
+typedef enum {
+    FT6X46_POWERDOWN = 0,
+    FT6X46_POWERUP,
+} ft6x46_sw_power_status;
+
+typedef enum {
+    FT6X46_WORK_NORMAL = 0,
+    FT6X46_WORK_STANDBY,
+    FT6X46_WORK_GETCMCP,
+    FT6X46_WORK_SLEEP,
+    FT6X46_WORK_SUSPEND,
+    FT6X46_WORK_RESUME,
+    FT6X46_WORK_INVALID,
+} ft6x46_work_status;
+
+typedef enum {
+    FT6X46_NOT_READY = 0,
+    FT6X46_READY,
+} ft6x46_device_status;
+
+typedef enum {
+    MC_BUTTON_RELEASE = 0, /* button release */
+    MC_BUTTON_PRESSED = 1, /* button pressed */
+} button_event_type;
+
+typedef enum {
+    MC_TOUCHKEY_EVENT_PRESS = 0,
+    MC_TOUCHKEY_EVENT_RELASSE,
+    MC_TOUCHKEY_EVENT_LONG_PRESS,
+    MC_TOUCHKEY_EVENT_INVALID,
+} touch_key_event_type;
+
+typedef enum {
+    FT6X46_GESTURE_NONE = 0,
+    FT6X46_GESTURE_SIGNAL_CLICK = 1,
+    FT6X46_GESTURE_DOUBLE_CLICK = 2,
+    FT6X46_GESTURE_SLIDE_UP = 4,
+    FT6X46_GESTURE_SLIDE_DOWN = 5,
+} ft6x46_gesture_event;
+
+typedef enum {
+    FT6X46_IRQ_DISABLE = 0,
+    FT6X46_IRQ_ENABLE,
+} ft6x46_irq_status;
+
+typedef enum {
+    MC_TP_NORMAL_WORK_MODE = 0, /* tp normal mode */
+    MC_TP_STANDBY_WORK_MODE,    /* tp idle mode */
+    MC_TP_BOOTLOADER_WORK_MODE,
+    MC_TP_SLEEP_WORK_MODE,
+    MC_TP_SUSPEND_SCAN,
+    MC_TP_RESUME_SCAN,
+    MC_TP_MAX_MODE,
+} tp_work_mode;
+
+typedef enum {
+    MC_TP_UPGRADE_NEED_FLAG,
+    MC_TP_UPGRADE_START_ASYN,
+    MC_TP_UPGRADE_STATUS,
+    MC_TP_UPGRADE_SYNC,
+} mc_tp_upgrade;
+
+typedef struct {
+    uint32_t reset_gpio;
+    uint32_t int_gpio;
+    i2c_bus_t i2c_id;
+    uint32_t i2c_baudrate;
+} tp_peripheral_attr;
+
+typedef struct {
+    uint16_t button_code;
+} button_dev_info;
+
+typedef struct {
+    uint16_t xchannel_num;
+    uint16_t ychannel_num;
+    uint16_t total_dnd_num;
+    uint16_t total_self_dnd_num;
+} ft6x46_panel_data;
+
+typedef struct {
+    uint32_t skip_cnt;
+    int16_t dnd_data[FT6X46_TSP_DND_NUM];
+    int16_t self_dnd_data[FT6X46_TSP_SELFDND_NUM];
+} ft6x46_tsp_rawdata;
+
+typedef enum {
+    MC_TP_RAW_DATA,
+    MC_TP_BASE_DATA,
+    MC_TP_NOS_DATA,
+    MC_TP_SIG_DATA,
+    MC_TP_FT_DATA,
+    MC_TP_NT_DATA,
+    MC_TP_MAX_DATA,
+    MC_TP_CM_CP_DATA,     /* 7, CM CP data */
+    MC_TP_INT_COUNT_DATA, /* 8, TP Int count */
+    MC_TP_NOISE_METRICS_DATA,
+    MC_TP_DATA_STRUCTURE_DATA,
+    MC_TP_PANEL_SCAN_CM_DATA,
+    MC_TP_PANEL_SCAN_CP_DATA,
+    MC_TP_START_RAW_TRANS,
+    MC_TP_STOP_RAW_TRANS,
+    MC_TP_START_GET_WATER_TEMPR, /* 15, start get and print water level and temprature */
+    MC_TP_STOP_GET_WATER_TEMPR,  /* 16, stop get and print water level and temprature */
+    MC_TP_RAW_MAX,
+} mc_tp_rawdata;
+
+typedef struct {
+    mc_tp_rawdata cmd;
+    uint8_t *data_buf;
+    uint8_t data_in_len;
+    uint32_t data_out_len;
+    uint32_t data_addr;
+} touch_rawdata_info;
+
+/* define for drv process talbe */
+typedef ext_errno (*touch_drv_upgrade_handle)(uint8_t *data_buff, uint8_t buf_len);
+typedef struct {
+    mc_tp_upgrade cmd_id;
+    touch_drv_upgrade_handle process_cb;
+} touch_drv_upgrade_proc;
+
+typedef ext_errno (*touch_hal_rawdata_handle)(uint8_t *data_buf, uint8_t buf_len);
+typedef struct {
+    mc_tp_rawdata cmd_id;
+    touch_hal_rawdata_handle process_cb;
+} touch_drv_rawdata_proc;
+
+typedef struct {
+    uint16_t chip_id;
+    uint16_t vendor_id;
+    uint16_t chip_hw_id;
+    uint8_t chip_info[FT6X46_DEVICE_INFO_SIZE];
+    uint16_t firmware_version;
+    uint16_t minor_firmware_version;
+    uint16_t reg_version;
+    uint32_t flash_fw_version;
+    uint16_t int_mask;
+    uint16_t touch_mode;
+    uint32_t irq_count;
+    uint32_t touch_count;
+    uint32_t page_size;
+    uint16_t header_size;
+    uint16_t image_size;
+    osal_mutex ops_mux;
+    bool fw_upgrade_flag;
+    bool gesture_wakeup;
+    bool host_dev_init_flag;
+    ft6x46_sw_power_status power_status;
+    ft6x46_work_status work_status;
+    ft6x46_sw_power_status chip_sw_power_status;
+    ft6x46_device_status chip_status;
+    input_event_info touch_msg;
+    ft6x46_panel_data panel_info;
+    tp_peripheral_attr dev_attr;
+    ft6x46_tsp_rawdata tsp_raw_data;
+    void *p_void;
+    uint32_t tp_event;
+    touch_drv_upgrade_proc upgrade_table[FT6X46_FWGRADE_CMD_NUM];
+    touch_drv_rawdata_proc raw_data_table[FT6X46_RAWDATA_CMD_NUM];
+} ft6x46_drv_data;
+
+ext_errno ft6x46_init(void);
+ext_errno ft6x46_deinit(void);
+ext_errno ft6x46_set_power_mode(tp_work_mode power_mode);
+ext_errno ft6x46_get_power_mode(uint32_t *power_mode);
+ext_errno ft6x46_resume(void);
+ext_errno ft6x46_suspend(void);
+ext_errno ft6x46_irq_callback(uint8_t *data_buf, uint8_t data_len);
+ext_errno ft6x46_host_init_sample(void);
+#ifdef __cplusplus
+#if __cplusplus
+    }
+#endif
+#endif
+
+#endif
diff --git a/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/touch_screen_drv.c b/fd230_driver_patch/20240503.170906/code/sdk/drivers/drivers/driver/touch/touch_screen_drv.c
new file mode 100644 (file)
index 0000000..4591a7d
--- /dev/null
@@ -0,0 +1,491 @@
+/*\r
+ * Copyright (c) @CompanyNameMagicTag 2021-2021. All rights reserved.\r
+ * Description: touch screen driver.\r
+ * Author: @CompanyNameTag\r
+ * Create: 2022-04-12\r
+ */\r
+\r
+#include "touch_screen_drv.h"\r
+#include "tcxo.h"\r
+#include "i2c.h"\r
+#include "common_def.h"\r
+#include "soc_osal.h"\r
+#include "touch_screen_def.h"\r
+#include "input_app.h"\r
+#if defined(TPTYPE_TMA525B)\r
+#include "tma525b_drv1.h"\r
+#include "tma525b_ctrl.h"\r
+#elif defined(TPTYPE_ZTW523)\r
+#include "ztw523_drv1.h"\r
+#include "ztw523_ctrl.h"\r
+#elif defined(TPTYPE_FT6X46)\r
+#include "ft6x46_drv1.h"\r
+#include "ft6x46_ctrl.h"\r
+#else\r
+#include "ztw523_drv1.h"\r
+#include "ztw523_ctrl.h"\r
+#endif\r
+\r
+#if defined(TPTYPE_TMA525B)\r
+#define TOUCH_I2C_BUS            TMA525B_I2C_BUS\r
+#define TOUCH_INT_GPIO           TMA525B_INT_GPIO\r
+#define TOUCH_RESET_GPIO         TMA525B_RESET_GPIO\r
+#elif defined(TPTYPE_ZTW523)\r
+#define TOUCH_I2C_BUS            ZTW523_I2C_BUS\r
+#define TOUCH_INT_GPIO           ZTW523_INT_GPIO\r
+#define TOUCH_RESET_GPIO         ZTW523_RESET_GPIO\r
+#elif defined(TPTYPE_FT6X46)\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
+#else\r
+#define TOUCH_I2C_BUS            ZTW523_I2C_BUS\r
+#define TOUCH_INT_GPIO           ZTW523_INT_GPIO\r
+#define TOUCH_RESET_GPIO         ZTW523_RESET_GPIO\r
+#endif\r
+\r
+#define TOUCH_SCREEN_DEV_NAME_LEN 16\r
+#define TOUCH_SCREEN_DEVNAME "input/event"\r
+#define TOUCH_SCREEN_DYNAMIC_MINOR 65\r
+#define TOUCH_SCREEN_CMDID_MAX 16\r
+\r
+#define TOUCH_SCREEN_TASK_PRIO      5\r
+#define TOUCH_SCREEN_TASK_SIZE      0x800\r
+#define TOUCH_SCREEN_QUEUE_MAX_SIZE 60\r
+#define TOUCH_SCREEN_READY_EVENT    (1 << 0)\r
+\r
+struct ts_driver_data g_touch_drv = {0};\r
+struct ts_driver_data *g_attr = NULL;\r
+\r
+report_event_cb g_report_event_cb = NULL;\r
+\r
+#if defined(SUPPORT_POWER_MANAGER)\r
+event_callback_func g_power_manager_cb = NULL;\r
+#endif\r
+\r
+static struct ts_driver_data *touch_screen_get_driver_data(void)\r
+{\r
+    return &g_touch_drv;\r
+}\r
+\r
+static uint32_t touch_screen_get_state(struct ts_driver_data *tsdd)\r
+{\r
+    if (tsdd != NULL && tsdd->queue != NULL) {\r
+        return (uint32_t)ts_queue_is_empty(tsdd->queue);\r
+    }\r
+\r
+    if (tsdd == NULL) {\r
+        tp_err("tsdd is null!");\r
+        return EXT_ERR_FAILURE;\r
+    }\r
+    if (tsdd->queue == NULL) {\r
+        tp_err("tsdd queue is null!");\r
+    }\r
+\r
+    return EXT_ERR_FAILURE;\r
+}\r
+\r
+static void convert_touch_info(input_dev_data_t* data, input_event_info* touch_info)\r
+{\r
+    data->x = (int16_t)touch_info->tp_event_info.x_axis[0];\r
+    data->y = (int16_t)touch_info->tp_event_info.y_axis[0];\r
+    data->type = INDEV_TYPE_TOUCH;\r
+    data->timestamp = (uint32_t)touch_info->tv_usec;\r
+    if ((touch_info->tp_event == MC_TP_PRESS) || (touch_info->tp_event == MC_TP_MOVE)) {\r
+        data->state = INDEV_STATE_PRESS;\r
+    } else if (touch_info->tp_event == MC_TP_RELEASE) {\r
+        data->state = INDEV_STATE_RELEASE;\r
+    } else {\r
+        data->state = INDEV_STATE_UNKNOWN;\r
+    }\r
+}\r
+\r
+static void report_or_enqueue_event(input_event_info* touch_info, struct ts_driver_data *tsdd)\r
+{\r
+    if (g_report_event_cb != NULL) {\r
+        input_dev_data_t data;\r
+        convert_touch_info(&data, touch_info);\r
+        if (data.state == INDEV_STATE_UNKNOWN) {\r
+            return;\r
+        }\r
+        g_report_event_cb(&data);\r
+    } else {\r
+        int32_t ret = ts_en_queue(tsdd->queue, touch_info);\r
+        if (ret != EXT_ERR_SUCCESS) {\r
+            tp_err("Failed to enqueue ts queue! ret=0x%x", ret);\r
+        }\r
+    }\r
+}\r
+#if defined(SUPPORT_POWER_MANAGER)\r
+static void report_event_to_power_manager(input_event_info *touch_info)\r
+{\r
+    if (g_power_manager_cb != NULL) {\r
+        input_dev_data_t data;\r
+        convert_touch_info(&data, touch_info);\r
+        if (data.state == INDEV_STATE_UNKNOWN) {\r
+            return;\r
+        }\r
+        g_power_manager_cb(data.state, 0);\r
+    }\r
+    return;\r
+}\r
+\r
+uint32_t ts_register_power_manager_cb(event_callback_func callback)\r
+{\r
+    if (g_power_manager_cb != NULL) {\r
+        return EXT_ERR_FAILURE;\r
+    }\r
+    g_power_manager_cb = callback;\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+#endif\r
+ext_errno touch_info_process(void)\r
+{\r
+    struct ts_driver_data *tsdd = touch_screen_get_driver_data();\r
+    input_event_info touch_info;\r
+    int32_t ret = 0;\r
+\r
+    if (tsdd->touch_api->touch_get_tpinfo != NULL) {\r
+        ret = tsdd->touch_api->touch_get_tpinfo((uint8_t *)(&touch_info), sizeof(input_event_info));\r
+        if (ret != EXT_ERR_SUCCESS) {\r
+            tp_err("get touch info fail! ret=0x%x", ret);\r
+        }\r
+\r
+        report_or_enqueue_event(&touch_info, tsdd);\r
+#if defined(SUPPORT_POWER_MANAGER)\r
+        report_event_to_power_manager(&touch_info);\r
+#endif\r
+    }\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static void ts_callback_func(void)\r
+{\r
+    ext_errno ret;\r
+    if (g_attr != NULL) {\r
+        common_notify_mail_t mail = {0};\r
+        mail.comm.app = APP_TOUCH;\r
+        ret = osal_msg_queue_write_copy(get_app_queue_id(), (void *)&mail,\r
+                                        sizeof(common_notify_mail_t), 0);\r
+        if (ret != OSAL_SUCCESS) {\r
+            tp_err("touch app msg send failed! err=0x%x! \r\n", ret);\r
+        }\r
+    }\r
+}\r
+\r
+static ext_errno ts_register_callback(struct ts_driver_data *attr)\r
+{\r
+    ext_errno ret = EXT_ERR_FAILURE;\r
+    g_attr = attr;\r
+\r
+    if (attr->touch_api->register_callback != NULL) {\r
+        ret = attr->touch_api->register_callback(attr->private_data, ts_callback_func);\r
+        if (ret != EXT_ERR_SUCCESS) {\r
+            tp_err("register touch screen callback fail! ret=0x%x", ret);\r
+            return ret;\r
+        }\r
+    } else {\r
+        tp_err("touch screen callback register func is empty!");\r
+    }\r
+\r
+    return ret;\r
+}\r
+\r
+static ext_errno ts_unregister_callback(struct ts_driver_data *attr)\r
+{\r
+    ext_errno ret = EXT_ERR_FAILURE;\r
+\r
+    if (attr->touch_api->unregister_callback != NULL) {\r
+        ret = attr->touch_api->unregister_callback(attr->private_data);\r
+        if (ret != EXT_ERR_SUCCESS) {\r
+            tp_err("unregister touch screen callback fail! ret=0x%x", ret);\r
+            return ret;\r
+        }\r
+        g_attr = NULL;\r
+    } else {\r
+        tp_err("touch screen callback unregister func is empty!");\r
+    }\r
+\r
+    return ret;\r
+}\r
+\r
+static int32_t ts_dev_open(const void *private_data)\r
+{\r
+    int32_t ret;\r
+    struct ts_driver_data *tsdd = NULL;\r
+    if (private_data == NULL) {\r
+        tp_err("ts_open: invalid dev or driver_data!\n");\r
+        return EXT_ERR_FAILURE;\r
+    }\r
+\r
+    // todo: get tsdd from private_data\r
+    tsdd = touch_screen_get_driver_data();\r
+    tsdd->queue = ts_init_queue(TOUCH_SCREEN_QUEUE_MAX_SIZE);\r
+    if (tsdd->queue == NULL) {\r
+        tp_err("create touch screen queue fail!\r\n");\r
+        return EXT_ERR_FAILURE;\r
+    }\r
+    ret = osal_event_init(&(tsdd->event));\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        tp_err("touch osal_event_init fail! ret=0x%x\r\n", ret);\r
+        return ret;\r
+    }\r
+\r
+    tsdd->task_handle = osal_kthread_create((osal_kthread_handler)touch_info_process,\r
+                                            (void *)touch_screen_get_driver_data(),\r
+                                            "touch_screen", TOUCH_SCREEN_TASK_SIZE);\r
+    if (tsdd->task_handle == NULL) {\r
+        tp_err("create touch screen thread fail!\r\n");\r
+        return EXT_ERR_FAILURE;\r
+    }\r
+    osal_kthread_set_priority(tsdd->task_handle, TOUCH_SCREEN_TASK_PRIO);\r
+\r
+    if (tsdd->touch_api->touch_init != NULL) {\r
+        ret = tsdd->touch_api->touch_init(tsdd->private_data);\r
+        if (ret != EXT_ERR_SUCCESS) {\r
+            tp_err("touch_init fail! ret=0x%x\r\n", ret);\r
+            return ret;\r
+        }\r
+    }\r
+\r
+    ret = ts_register_callback(tsdd);\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        tp_err("register callback fail! ret=0x%x\r\n", ret);\r
+        return ret;\r
+    }\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static int32_t ts_dev_release(const void *private_data)\r
+{\r
+    int32_t ret;\r
+    struct ts_driver_data *tsdd = NULL;\r
+    if (private_data == NULL) {\r
+        tp_err("ts_dev_release: invalid dev or driver_data!\n");\r
+        return EXT_ERR_FAILURE;\r
+    }\r
+\r
+    // todo: get tsdd from private_data\r
+    tsdd = touch_screen_get_driver_data();\r
+    ret = ts_unregister_callback(tsdd);\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        tp_err("unregister callback fail! ret=0x%x\r\n", ret);\r
+        return ret;\r
+    }\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static uint32_t ts_dev_poll(const osal_poll *osal_poll, const void *private_data)\r
+{\r
+    unused(osal_poll);\r
+    unused(private_data);\r
+    // todo: get tsdd from private_data\r
+    struct ts_driver_data *tsdd = NULL;\r
+    tsdd = touch_screen_get_driver_data();\r
+    if (tsdd == NULL) {\r
+        tp_err("ts_driver_data is NULL");\r
+        return EXT_ERR_FAILURE;\r
+    }\r
+\r
+    if (tsdd->ops->priv_operator != NULL && tsdd->ops->priv_operator(tsdd) == 0) {\r
+        return OSAL_POLLIN | OSAL_POLLRDNORM;\r
+    }\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static int32_t ts_ioctl_read_touch_info(uint32_t cmd, void *arg, const void *private_data)\r
+{\r
+    unused(cmd);\r
+    ext_errno ret;\r
+    struct ts_driver_data *tsdd = NULL;\r
+    input_event_info *touch_info = (input_event_info *)arg;\r
+\r
+    if (private_data == NULL) {\r
+        tp_err("invalid dev or driver_data!");\r
+        return EXT_ERR_FAILURE;\r
+    }\r
+\r
+    // todo: get tsdd from private_data\r
+    tsdd = touch_screen_get_driver_data();\r
+    if (tsdd->queue == NULL) {\r
+        tp_err("invalid touch screen queue!");\r
+        return EXT_ERR_FAILURE;\r
+    }\r
+\r
+    ret = ts_de_queue(tsdd->queue, touch_info);\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        tp_err("get touch info fail! ret=0x%x", ret);\r
+        return ret;\r
+    }\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+static osal_ioctl_cmd g_ts_cmd_list[TOUCH_SCREEN_CMDID_MAX] = {\r
+    {TOUCH_SCREEN_GET_EVENT, ts_ioctl_read_touch_info},\r
+};\r
+\r
+static osal_dev *g_ts_dev = NULL;\r
+static osal_fileops g_ts_ops = {\r
+    .open = ts_dev_open,\r
+    .release = ts_dev_release,\r
+    .poll = ts_dev_poll,\r
+    .cmd_list = g_ts_cmd_list,\r
+    .cmd_cnt = sizeof(g_ts_cmd_list) / sizeof(g_ts_cmd_list[0]),\r
+};\r
+\r
+struct ts_ops g_ts_status_ops = {\r
+    .priv_operator  = touch_screen_get_state,\r
+};\r
+\r
+static ext_errno touch_screen_register_device(void)\r
+{\r
+    ext_errno ret;\r
+\r
+    g_touch_drv.private_data = touch_screen_get_peri_attr();\r
+    g_touch_drv.touch_api = touch_screen_get_api();\r
+    g_touch_drv.ops = &g_ts_status_ops;\r
+    g_ts_dev = osal_dev_create(TOUCH_SCREEN_DEVNAME);\r
+    g_ts_dev->minor = TOUCH_SCREEN_DYNAMIC_MINOR;\r
+    g_ts_dev->fops = &g_ts_ops;\r
+\r
+    ret = osal_dev_register(g_ts_dev);\r
+    if (ret != 0) {\r
+        tp_err("touch screen osal_dev_register --------failed! ret=0x%x\n", ret);\r
+        return EXT_ERR_FAILURE;\r
+    }\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno touch_screen_module_init(void)\r
+{\r
+    ext_errno ret;\r
+\r
+    ret = touch_screen_register_device();\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        tp_err("touch_screen_register_device ----------failed! ret=0x%x\n", ret);\r
+    }\r
+    tp_err("touch_screen_register_device ----------succ!!!\n");\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+ext_errno touch_screen_module_deinit(void)\r
+{\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+uint32_t ts_register_report_event_cb(report_event_cb callback)\r
+{\r
+    if (g_report_event_cb != NULL) {\r
+        return EXT_ERR_FAILURE;\r
+    }\r
+    g_report_event_cb = callback;\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+uint32_t ts_unregister_report_event_cb(void)\r
+{\r
+    g_report_event_cb = NULL;\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+uint32_t ts_init(void)\r
+{\r
+    int32_t ret;\r
+    struct ts_driver_data *tsdd = NULL;\r
+\r
+    g_touch_drv.private_data = touch_screen_get_peri_attr();\r
+    g_touch_drv.touch_api = touch_screen_get_api();\r
+    g_touch_drv.ops = &g_ts_status_ops;\r
+    tsdd = touch_screen_get_driver_data();\r
+    tsdd->queue = ts_init_queue(TOUCH_SCREEN_QUEUE_MAX_SIZE);\r
+    if (tsdd->queue == NULL) {\r
+        tp_err("create touch screen queue fail!\r\n");\r
+        return EXT_ERR_FAILURE;\r
+    }\r
+\r
+    ret = ts_register_callback(tsdd);\r
+    if (ret != EXT_ERR_SUCCESS) {\r
+        tp_err("register callback fail! ret=0x%x\r\n", ret);\r
+        return EXT_ERR_FAILURE;\r
+    }\r
+\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+uint32_t ts_read(const input_dev_data_t* data)\r
+{\r
+    unused(data);\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+uint32_t ts_close(void)\r
+{\r
+    return EXT_ERR_SUCCESS;\r
+}\r
+\r
+void touch_screen_suspend(void)\r
+{\r
+    touch_peripheral_api *touch_ptr = touch_screen_get_api();\r
+    ext_errno ret = touch_ptr->touch_sleep();\r
+    if (ret != EXT_ERR_SUCCESS) { tp_err("touch sleep ret=0x%x", ret); }\r
+#if defined(TPTYPE_FT6X46)\r
+    if (ft6x46_suspend() == EXT_ERR_SUCCESS){\r
+        i2c_save_reg(TOUCH_I2C_BUS);\r
+        uapi_gpio_disable_interrupt(TOUCH_INT_GPIO); // close tp_int gpio interrupt\r
+    }\r
+#else\r
+    i2c_save_reg(TOUCH_I2C_BUS);\r
+    uapi_gpio_disable_interrupt(TOUCH_INT_GPIO); // close tp_int gpio interrupt\r
+#endif\r
+}\r
+\r
+void touch_screen_resume(void)\r
+{\r
+    uapi_gpio_disable_interrupt(TOUCH_INT_GPIO); // close tp_int gpio interrupt\r
+    i2c_recovery_reg(TOUCH_I2C_BUS);\r
+#if defined(TPTYPE_TMA525B)\r
+    tma525b_init();\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_ZTW523)\r
+    ztw523_resume();\r
+#elif defined(TPTYPE_FT6X46)\r
+    ft6x46_resume();\r
+#else\r
+    ztw523_resume();\r
+#endif\r
+    uapi_gpio_enable_interrupt(TOUCH_INT_GPIO); // open tp_int gpio interrupt\r
+}\r
+\r
+void touch_suspend_for_i2c(void)\r
+{\r
+    i2c_save_reg(TOUCH_I2C_BUS);\r
+}\r
+\r
+void touch_resume_for_i2c(void)\r
+{\r
+    i2c_recovery_reg(TOUCH_I2C_BUS);\r
+}\r
+\r
+void touch_screen_restart(void)\r
+{\r
+    uapi_i2c_deinit(TOUCH_I2C_BUS);\r
+    uapi_i2c_master_init(TOUCH_I2C_BUS, 400000, I2C_SPEED_MODE_FS); /* 400000: 400KHz */\r
+#if defined(TPTYPE_TMA525B)\r
+    tma525b_resume();\r
+#elif defined(TPTYPE_ZTW523)\r
+    ztw523_resume();\r
+#elif defined(TPTYPE_FT6X46)\r
+    ft6x46_resume();\r
+#else\r
+    ztw523_resume();\r
+#endif\r
+    uapi_gpio_enable_interrupt(TOUCH_INT_GPIO); // open tp_int gpio interrupt\r
+}
\ No newline at end of file
diff --git a/fd230_driver_patch/20240503.170906/diff/commit.txt b/fd230_driver_patch/20240503.170906/diff/commit.txt
new file mode 100644 (file)
index 0000000..e978b23
--- /dev/null
@@ -0,0 +1 @@
+347bcf2308a02361676d277470988adab86e3337
diff --git a/fd230_driver_patch/20240503.170906/diff/local_diff_patch.txt b/fd230_driver_patch/20240503.170906/diff/local_diff_patch.txt
new file mode 100644 (file)
index 0000000..4975585
--- /dev/null
@@ -0,0 +1,918 @@
+diff --git a/code/sdk/application/audio/vendor/CMakeLists.txt b/code/sdk/application/audio/vendor/CMakeLists.txt
+index e3152c2ca..c1c31962b 100644
+--- a/code/sdk/application/audio/vendor/CMakeLists.txt
++++ b/code/sdk/application/audio/vendor/CMakeLists.txt
+@@ -39,6 +39,21 @@ set(COMPONENT_INC ${COMPONENT_INC}
+ )\r
+ endif()\r
+ \r
++if("${CFG_SAP_VENDOR_DRIVER_AW88166_SUPPORT}" STREQUAL "y")\r
++set(COMPONENT_SRC ${COMPONENT_SRC}\r
++    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166/aw88166.c\r
++    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166/aw883xx.c\r
++    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166/aw883xx_calib.c\r
++    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166/aw883xx_device.c\r
++    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166/product_init_files/aw88166/aw883xx_pid_2066_init.c\r
++)\r
++set(COMPONENT_INC ${COMPONENT_INC}\r
++    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166\r
++    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166/product_init_files/aw88166\r
++    ${CMAKE_CURRENT_SOURCE_DIR}/aw88166/config/aw88166/mono/16bit\r
++)\r
++endif()\r
++\r
+ if("${CFG_SAP_VENDOR_DRIVER_ANC_CODEC_SUPPORT}" STREQUAL "y")\r
+ set(COMPONENT_SRC ${COMPONENT_SRC}\r
+     ${CMAKE_CURRENT_SOURCE_DIR}/anc_codec/anc_codec.c\r
+diff --git a/code/sdk/application/audio/vendor/aw88166/aw88166.c b/code/sdk/application/audio/vendor/aw88166/aw88166.c
+index d25e8db7f..a0f2d29a3 100644
+--- a/code/sdk/application/audio/vendor/aw88166/aw88166.c
++++ b/code/sdk/application/audio/vendor/aw88166/aw88166.c
+@@ -19,8 +19,8 @@
+ \r
+ static td_bool g_aw88166_i2c_inited = TD_FALSE;\r
+ \r
+-#define AW88166_PWR_ON_PIN   S_MGPIO4\r
+-#define AW88166_I2C_BUS_ID   I2C_BUS_0\r
++#define AW88166_PWR_ON_PIN   S_AGPIO_L25\r
++#define AW88166_I2C_BUS_ID   I2C_BUS_3\r
+ #define AW88166_I2C_DEV_ADDR 0x34\r
+ \r
+ static td_s32 aw_dev0_i2c_write_func(td_u16 dev_addr, td_u8 reg_addr, td_u8 *pdata, td_u16 len)\r
+diff --git a/code/sdk/application/brandy/brandy_standard/thread_pri_init.c b/code/sdk/application/brandy/brandy_standard/thread_pri_init.c
+index a812c9efc..479f285ec 100644
+--- a/code/sdk/application/brandy/brandy_standard/thread_pri_init.c
++++ b/code/sdk/application/brandy/brandy_standard/thread_pri_init.c
+@@ -28,6 +28,8 @@
+ #include "tma525b_drv1.h"\r
+ #elif defined(TPTYPE_ZTW523)\r
+ #include "ztw523_touch1.h"\r
++#elif defined(TPTYPE_FT6X46)\r
++#include "ft6x46_touch1.h"\r
+ #else\r
+ #include "ztw523_touch1.h"\r
+ #endif\r
+@@ -40,9 +42,13 @@
+  * define AUDIO_SMARTPA_AW88166 : macro to init smartpa aw88166;\r
+  * define AUDIO_SMARTPA_AW88166_I2S_ID UAPI_SND_OUT_PORT_I2S0 : macro to specify i2s id connecting to smartpa aw88166;\r
+  */\r
++#if 0\r
+ #define AUDIO_SMARTPA_AW88262\r
+ #define AUDIO_SMARTPA_AW88262_I2S_ID UAPI_SND_OUT_PORT_I2S2\r
+-\r
++#else\r
++#define AUDIO_SMARTPA_AW88166\r
++#define AUDIO_SMARTPA_AW88166_I2S_ID UAPI_SND_OUT_PORT_I2S0\r
++#endif\r
+ #endif /* DSP_EXIST */\r
+ #include "panic.h"\r
+ #include "board_init.h"\r
+@@ -71,6 +77,8 @@ static void sample_gfx_init(void)
+     tma525b_host_init_sample();\r
+ #elif defined(TPTYPE_ZTW523)\r
+     ztw523_host_init_sample();\r
++#elif defined(TPTYPE_FT6X46)\r
++    ft6x46_host_init_sample();\r
+ #else\r
+     ztw523_host_init_sample();\r
+ #endif\r
+diff --git a/code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/src/RebootPresenter.cpp b/code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/src/RebootPresenter.cpp
+index 7dcdf3238..35ba07c27 100644
+--- a/code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/src/RebootPresenter.cpp
++++ b/code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/src/RebootPresenter.cpp
+@@ -43,6 +43,12 @@ void RebootPresenter::OnResume(void) {}
+ 
+ void RebootPresenter::OnStop(void) {}
+ 
++
++extern "C"
++{
++extern void uapi_sys_shipmode(uint32_t arg);
++extern uint32_t mcu_os_sys_reset(uint8_t *para, uint32_t para_len);
++}
+ bool RebootPresenter::OnClick(UIView& view, const ClickEvent& event)
+ {
+     UNUSED(event);
+@@ -54,9 +60,11 @@ bool RebootPresenter::OnClick(UIView& view, const ClickEvent& event)
+     } else if (strcmp(view.GetViewId(), REBOOTDEVICE_BUTTON) == 0) {
+         // 重启
+         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "REBOOTDEVICE_BUTTON OnClick");
++        mcu_os_sys_reset(NULL,NULL);
+     } else if (strcmp(view.GetViewId(), SHUTDOWNDEVICE_BUTTON) == 0) {
+         // 关机
+         WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "SHUTDOWNDEVICE_BUTTON OnClick");
++        uapi_sys_shipmode(0);
+     }
+     return true;
+ }
+diff --git a/code/sdk/build/config/target_config/brandy/config.py b/code/sdk/build/config/target_config/brandy/config.py
+index 370331fda..849bfc8f4 100644
+--- a/code/sdk/build/config/target_config/brandy/config.py
++++ b/code/sdk/build/config/target_config/brandy/config.py
+@@ -114,6 +114,8 @@ target = {
+                     'CONFIG_ZDIAG_AUDIO_PROC_SUPPORT', 'CONFIG_ZDIAG_AUDIO_DUMP_SUPPORT', 'CONFIG_ZDIAG_AUDIO_PROBE_SUPPORT', 'CONFIG_SEA_PHS_SUPPORT', 'CONFIG_DIAG_GPU_PROC_SUPPORT',
+                     'SUPPORT_BLE', 'SUPPORT_BREDR', 'ENABLE_UIKIT', 'SUPPORT_GPU_JPEG', 'SUPPORT_GPU_GMMU', 'SUPPORT_GPU_OPENVG',
+                     'SW_UART_DEBUG', 'SAVE_EXC_INFO', 'HASH_MEM_COPY', 'JS_ENABLE', 'CONFIG_LOW_POWER_TEST',
++                    'FT_SINGLE_UART',
++                    'TPTYPE_FT6X46',
+                     'ENABLE_ECC', 'MIPI_ULPS_SUPPORT', 'SUPPORT_ALIPAY_SEC'],
+         'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", 'dfx_nv', "osal", "arch_port", "-:testsuite",
+                           "liteos_port", 'lcd', 'qspi_display', 'dfx_file_operation',
+@@ -125,7 +127,7 @@ target = {
+         'ram_component_set': ['bgh', 'media', 'gpu', 'graphic_uikit', 'bgh_audio', 'dfx_set', 'ohos_set', 'wearable_set', 'alipay_set'],
+         'dsp_version': 'max',
+         'packet': True,
+-        'fs_image': False
++        'fs_image': True
+     },
+     #native-xts: liteos + uikit + nandflash + mipi + psram + audio  典型合封UIKIT版本
+     'brandy-xts': {
+@@ -213,12 +215,15 @@ target = {
+         'defines': ['PRE_ASIC', 'BRANDY_PRODUCT_EVB4', 'VERSION_STANDARD', '__LITEOS__',
+                     '_ALL_SOURCE', 'SUPPORT_CXX', 'I2C_SLAVE_REG_ADDR_4BYTE', 'CFG_DRIVERS_NANDFLASH',
+                     "-:TARGET_CHIP_BRANDY=1", "-:BRANDY_CHIP_V100=1", 'ENABLE_UIKIT', 'SW_UART_DEBUG', "HASH_MEM_COPY",
++                    'FT_SINGLE_UART','TPTYPE_FT6X46',
+                     'ENABLE_ECC', 'SUPPORT_RECOVERY_DISPLAY'],
+         'ram_component': ["algorithm", "dfx_port_brandy", "dfx_update", "osal", "arch_port", "-:testsuite",
+                           "liteos_port", 'lcd', 'qspi_display', 'dfx_file_operation',
+                           'psram', 'hal_mipi', 'mipi_tx', 'non_os', 'touch',
+                           'x_dpal', 'x_vfs', 'x_disk', 'x_fat', 'drv_mmc', 'x_vfs_private',
+-                          'ulp_aon', 'hal_l2ram', 'pm_service', 'pm_brandy', 'cmn_header'],
++                          'ulp_aon', 'hal_l2ram', 'pm_service', 'pm_brandy', 'cmn_header',
++                          'at_cmd'
++                          ],
+         'ram_component_set': ['pinctrl', 'dfx_set' ,'gpu']
+     },
+     'brandy-xts-r': {
+@@ -266,9 +271,16 @@ target = {
+                     "SSB_USE_PLL", "VERSION_STANDARD", "BUILD_APPLICATION_SSB", "LIBBOOTLOADER", "LIBCODELOADER",
+                     "LIBCPU_UTILS", "LIBAPP_VERSION", "LIBPANIC", "LIBCONNECTIVITY", "LIBERROR_CODE", "LIBSEC_RANDOM",
+                     "LIBCODELOADER_SSB", "LIBJLINK_LOAD", "LIBLIB_UTILS", "LIBBUILD_VERSION",
+-                    "NO_TIMEOUT", "CONFIG_UART_BAUD_RATE_DIV_8", 'SW_UART_DEBUG', 'LARGE_BUFFER'],
++                  'ENABLE_ECC',
++                  "CFG_DRIVERS_NANDFLASH",
++                    "NO_TIMEOUT", "CONFIG_UART_BAUD_RATE_DIV_8", 'SW_UART_DEBUG', 'LARGE_BUFFER',
++                    'FT_SINGLE_UART'
++                    ],
+         'ram_component': ['arch_port', 'hal_l2ram', 'sec_boot', 'libboundscheck',
+-                          'dfx_exception', 'error_code', 'psram', 'osal', 'cmn_header', 'boot_ulp', 'boot_nandflash'],
++                          'dfx_exception', 'error_code', 'psram', 'osal', 'cmn_header', 
++                          'boot_ulp', 
++                          'boot_nandflash'
++                          ],
+         'ram_component_set': ['pinctrl'],
+         'target': 'ssb',
+     }
+diff --git a/code/sdk/drivers/boards/brandy_evb/board_config/board_evb.h b/code/sdk/drivers/boards/brandy_evb/board_config/board_evb.h
+index eb3d405d1..d3b5782d9 100644
+--- a/code/sdk/drivers/boards/brandy_evb/board_config/board_evb.h
++++ b/code/sdk/drivers/boards/brandy_evb/board_config/board_evb.h
+@@ -11,6 +11,13 @@
+ #include "gpio_porting.h"
+ #include "platform_types.h"
+ 
++#ifdef SUPPORT_CAT1_SERVICE
++#include "cat1_ctl.h"
++#endif
++
++#ifdef ENABLE_CYWEE
++extern void cywee_int1_callback(pin_t pin, uintptr_t param);
++#endif
+ /**
+  * @addtogroup connectivity_config_boards
+  * @{
+@@ -46,12 +53,12 @@ const hal_pio_config_t g_pio_function_config[PIN_MAX_NUMBER] = {
+     { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN,  HAL_PIO_IE_ENBALE },    // S_EGPIO24
+     { HAL_PIO_FUNC_OPI, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN,  HAL_PIO_IE_ENBALE },    // S_EGPIO25
+ 
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO0 sdio
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO1
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO2
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO3
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO4
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO5
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO0 NC
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO1 NC
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO2 NC
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO3 NC
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO4 NC
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_HGPIO5 NC
+ #if (defined CFG_DRIVERS_NANDFLASH)
+     { HAL_PIO_FUNC_QSPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_HGPIO6
+     { HAL_PIO_FUNC_QSPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_HGPIO7
+@@ -68,50 +75,47 @@ const hal_pio_config_t g_pio_function_config[PIN_MAX_NUMBER] = {
+     { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO7
+     { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO8
+     { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO9
+-    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO10
++    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO10  
+     { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO11
+-    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO12
+-    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO13
+-    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO14
++    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO12  
++    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO13  
++    { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },     // S_HGPIO14  
+     { HAL_PIO_FUNC_EMMC, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_HGPIO15 emmc clk
+ #endif
+-    { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_MGPIO0
+-    { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_MGPIO1
+-    { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_MGPIO2
+-    { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_MGPIO3
++    { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_MGPIO0   NC
++    { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_MGPIO1   NC
++    { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_MGPIO2   NC
++    { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_MGPIO3   NC
+ 
+-#if (defined BRANDY_PRODUCT_EVB4)
+-    { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_MGPIO4
+-#else
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_MGPIO4
+-#endif
++// #if (defined BRANDY_PRODUCT_EVB4)
++    { HAL_PIO_FUNC_SPI0, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_MGPIO4   NC
++// #else
++    // { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_MGPIO4   NC
++// #endif
+ 
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },     // S_MGPIO5
+-    { HAL_PIO_FUNC_SPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO6
+-    { HAL_PIO_FUNC_SPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO7
+-#if (defined BRANDY_PRODUCT_EVB4)
+-    { HAL_PIO_FUNC_SPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO8
+-#else
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },     // S_MGPIO8 E0B2 VCI_EN
+-#endif
+-    { HAL_PIO_FUNC_SPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO9
+-    { HAL_PIO_FUNC_SPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO10
+-    { HAL_PIO_FUNC_I2C0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO11 evb2 dsp i2c smartpa
+-    { HAL_PIO_FUNC_I2C0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO12
+-    { HAL_PIO_FUNC_I2C1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO13 touch i2c
+-    { HAL_PIO_FUNC_I2C1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO14
+-    { HAL_PIO_FUNC_I2C2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO15
+-    { HAL_PIO_FUNC_I2C2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO16
+-    { HAL_PIO_FUNC_I2C3_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO17 evb4 dsp i2c pa
+-    { HAL_PIO_FUNC_I2C3_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO18
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },     // S_MGPIO5  NC
++    { HAL_PIO_FUNC_SPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },  // S_MGPIO6  SPI1 DI
++    { HAL_PIO_FUNC_SPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },  // S_MGPIO7 SPI1 DO
++    { HAL_PIO_FUNC_SPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },  // S_MGPIO8 SPI1 CLK
++    { HAL_PIO_FUNC_SPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },   // S_MGPIO9 SPI1 CS0
++    { HAL_PIO_FUNC_SPI1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_MGPIO10 SPI1 CS1 NC
++
++    { HAL_PIO_FUNC_I2C0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO11 i2c0 SCL NC
++    { HAL_PIO_FUNC_I2C0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO12 I2C0 SDA
++    { HAL_PIO_FUNC_I2C1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO13 I2C1 SCL touch i2c
++    { HAL_PIO_FUNC_I2C1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_MGPIO14  I2C1 SDA
++    { HAL_PIO_FUNC_I2C2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO15 I2C2 SCL Sensor 6Öá Ö¸ÄÏÕë ÐÄÂÊ
++    { HAL_PIO_FUNC_I2C2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO16 I2C2 SDA Sensor
++    { HAL_PIO_FUNC_I2C3_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO17 i2c3 SCL    smart pa\ Ô¤ÁôÂí´ï¿ØÖÆ \°²È«Ð¾Æ¬
++    { HAL_PIO_FUNC_I2C3_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO18  I2C3 SDA
+     { HAL_PIO_FUNC_UART1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },    // S_MGPIO19 uart1 tx
+     { HAL_PIO_FUNC_UART1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },      // S_MGPIO20 uart1 rx
+-    { HAL_PIO_FUNC_UART1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },     // S_MGPIO21
+-    { HAL_PIO_FUNC_UART1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },     // S_MGPIO22
+-    { HAL_PIO_FUNC_SPI2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO23
+-    { HAL_PIO_FUNC_SPI2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO24
+-    { HAL_PIO_FUNC_SPI2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO25
+-    { HAL_PIO_FUNC_SPI2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO26
++    { HAL_PIO_FUNC_UART1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },     // S_MGPIO21 uart1 rts
++    { HAL_PIO_FUNC_UART1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },     // S_MGPIO22 uart1 cts
++    { HAL_PIO_FUNC_SPI2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_MGPIO23 NC
++    { HAL_PIO_FUNC_SPI2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_MGPIO24 NC
++    { HAL_PIO_FUNC_SPI2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_MGPIO25 NC
++    { HAL_PIO_FUNC_SPI2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_MGPIO26 NC
+ #if (defined QSPI_DISPLAY)
+     { HAL_PIO_FUNC_QSPI2, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO27
+     { HAL_PIO_FUNC_QSPI2, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_MGPIO28
+@@ -131,67 +135,79 @@ const hal_pio_config_t g_pio_function_config[PIN_MAX_NUMBER] = {
+     { HAL_PIO_FUNC_UART_HS_UART, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },   // S_MGPIO34 huart rx
+     { HAL_PIO_FUNC_UART_HS_UART, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO35
+     { HAL_PIO_FUNC_UART_HS_UART, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_MGPIO36
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },         // S_MGPIO37
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },         // S_MGPIO38
++#if 0
++    { HAL_PIO_FUNC_UART2_M2, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },     // S_MGPIO37 uart tx
++    { HAL_PIO_FUNC_UART2_M2, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },       // S_MGPIO38 uart rx
++#else
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },     // S_MGPIO37 uart tx  NC
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },       // S_MGPIO38 uart rx  NC
++#endif
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },     // S_AGPIO_L0  NC
+ 
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },     // S_AGPIO_L0
+     { HAL_PIO_FUNC_I2S1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L1 i2s1
+     { HAL_PIO_FUNC_I2S1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L2
+     { HAL_PIO_FUNC_I2S1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L3
+     { HAL_PIO_FUNC_I2S1_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L4
++
+     { HAL_PIO_FUNC_I2S0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L5
+-#if (defined BRANDY_PRODUCT_EVB4)
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L6  E0B4 VCI_EN
+-#else
+     { HAL_PIO_FUNC_I2S0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_L6 i2s0
+-#endif
+     { HAL_PIO_FUNC_I2S0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_L7
+     { HAL_PIO_FUNC_I2S0_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_L8
++
+ #if (defined FT_BT_UART)
+     { HAL_PIO_FUNC_UART2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },  // S_AGPIO_L9 uart2 txd
+     { HAL_PIO_FUNC_UART2_M1, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE },    // S_AGPIO_L10 uart2 rxd
+ #else
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L9 dsp uart
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L10 dsp uart
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L9 dsp uart   TP35
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L10 dsp uart   TP36
+ #endif
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L11 a+g int1
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L12 a+g int2
+-    { HAL_PIO_FUNC_I2S2_M5, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_L13 i2s2
+-    { HAL_PIO_FUNC_I2S2_M5, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_L14
+-    { HAL_PIO_FUNC_I2S2_M5, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_L15
+-    { HAL_PIO_FUNC_I2S2_M5, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_L16
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L17 dsp i2c
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L18 dsp i2c
+-    { HAL_PIO_FUNC_BT_FREQ, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },  // S_AGPIO_L19
+-    { HAL_PIO_FUNC_BT_STATUS, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE }, // S_AGPIO_L20
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L21
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_AGPIO_L11 G_INT1
++
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L12 i2c data HX3507_SDIO
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L13 i2c CLK HX3507_SCLK
++
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE }, // S_AGPIO_L14   NC
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE }, // S_AGPIO_L15   NC
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE }, // S_AGPIO_L16   NC
++    
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_AGPIO_L17 HX3507_INT   not use
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },    // S_AGPIO_L18  VDDEN  //ÔÝʱÎÞÓ㬲ÉÓÃVDDIO Ä¬ÈÏ¿ªÆô EXt V3.0 EXt V1.8
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_ENBALE },  // S_AGPIO_L19  G_INT2  //ÔÝʱ²»Óà
++
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE }, // S_AGPIO_L20  0.2C_CHRG
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },    // S_AGPIO_L21  NTC_VDD_ON ¸øµÍ´ò¿ª NTCÉÏÀ­µçÔ´
+ #ifdef QSPI_DISPLAY
+     { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_L22 QSPI TE
+ #else
+     { HAL_PIO_FUNC_TE, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },      // S_AGPIO_L22 MIPI TE
+ #endif
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L23
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L24
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L25
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L26 emmc reset
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L27
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L28
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L29
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L30
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L31
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L32
+-
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R0
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R1
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R2
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE  },   // S_AGPIO_R3 lcd reset
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_ENBALE  },    // S_AGPIO_R4 tp reset
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE  },   // S_AGPIO_R5 touch int
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_R6 als int
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R7
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R8
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R9
+-    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R10
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L23 CAT_1_PWR_ON ¿ØÖÆCAT_1¿ª»ú½Å£¬»òÕß¿ØÖÆ CAT1µçÔ´   À­¸ßÓÐЧ
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L24 LCM_EN
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L25  //////////// audio pa reset
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L26 ÐÄÂʸ´Î» PPG reset
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L27    LCM reset
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L28    CAT_1¸´Î» CAT1_RESET_N  À­µÍÓÐЧ
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L29    charge done info ¼ì²âÊÇ·ñ³äÂúµç
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_L30   KP_MKIN1 »½ÐÑ CAT1 £¬Êä³ö
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_L31    KP_MKOUIT1 »½ÐÑ À¶ÑÀ ,ÊäÈë
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_AGPIO_L32    NC
++
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R0   PRG_LED_POWER ON  ÐÄÂʵȵçÔ´¿ØÖƽÅ
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R1   SE_REST °²È«Ð¾Æ¬¸´Î»»½ÐѽÅ
++  #if VIB_USE_PWM
++    // { HAL_PIO_FUNC_PWMP1_M2, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_NONE, HAL_PIO_IE_DISABLE },   // S_AGPIO_R2     VIBR_PWM Âí´ï¿ØÖƽмæÈÝÔ¤ÁôÂí´ïÇý¶¯¸´Î»½Å
++    // { HAL_PIO_FUNC_PWMN1_M3, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_NONE, HAL_PIO_IE_DISABLE },   // S_AGPIO_R2     VIBR_PWM Âí´ï¿ØÖƽмæÈÝÔ¤ÁôÂí´ïÇý¶¯¸´Î»½Å
++  #else
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE },   // S_AGPIO_R2     VIBR_PWM Âí´ï¿ØÖƽмæÈÝÔ¤ÁôÂí´ïÇý¶¯¸´Î»½Å
++  #endif
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE  },   // S_AGPIO_R3     NC   
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_UP, HAL_PIO_IE_DISABLE  },    // S_AGPIO_R4     tp reset
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE  },   // S_AGPIO_R5     touch int
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },    // S_AGPIO_R6     PRG_INT ÐÄÂÊÖжÏ
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R7     GYRO_INT2
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R8     GYRO_INT1
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_DISABLE },   // S_AGPIO_R9     BAT_CHARGE_OFF ¹Øµô³äµç Î¶ȸߵÄʱºò
++    { HAL_PIO_FUNC_GPIO, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_MAX, HAL_PIO_IE_ENBALE },   // S_AGPIO_R10   Key2 ///////////////////HAL_PIO_IE_ENBALE input enable
+ 
+ #if CORE == APPS
+     { HAL_PIO_FUNC_INVALID, HAL_PIO_DRIVE_MAX, HAL_PIO_PULL_DOWN, HAL_PIO_IE_DISABLE }, // ULP_GPIO0 mode not config
+@@ -214,18 +230,77 @@ const hal_pio_config_t g_pio_function_config[PIN_MAX_NUMBER] = {
+  */
+ /**
+  * @brief  Global evb gpio functions.
++ * 
++ * 
++ * typedef struct {
++    pin_t gpio;
++    hal_gpio_direction_t direction;
++    hal_gpio_level_t level;
++    uint32_t triger;
++    hal_gpio_callback_t callback;
++} hal_gpio_config_t;
+  */
++
++
++//ĬÈÏ¿ªÆôCat1 È»ºóÔÙ¸ù¾ÝÅäÖþö¶¨ÊÇ·ñ¹Ø±Õ. 
++//ĬÈϲ»¿ªÆô ppg checkidʧ°Ü£¬Ô­Òòδ֪£¬ÔÝʱ¿ª»ú¿ªÆôcat1
++#define DEFAULT_POWERON_CAT1 0
++
++//ÐèÒªÅäÖÃĬÈÏÊä³öµÄ£¬ÒÔ¼°ÐèÒªÅäÖÃĬÈÏÊäÈëÖжϺ¯ÊýµÄ¡£
+ const hal_gpio_config_t g_gpio_function_config[PIN_MAX_NUMBER] = {
+ 
+-    // S_AGPIO_L17
+-    {
+-        S_AGPIO_L17,
+-        HAL_GPIO_DIRECTION_OUTPUT,
+-        HAL_GPIO_LEVEL_HIGH,
+-        0,
+-        NULL
+-    },
+-    
++#if DEFAULT_POWERON_CAT1
++    //    S_AGPIO_L23 CAT_1_PWR_ON ----- high power on
++    {   S_AGPIO_L23, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
++   // S_AGPIO_L28   Cat1 reset  ---- low reset
++    {   S_AGPIO_L28, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
++#else
++  //    S_AGPIO_L23 CAT_1_PWR_ON ----- high power on
++    {   S_AGPIO_L23, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
++   // S_AGPIO_L28   Cat1 reset  ---- low reset
++    {   S_AGPIO_L28, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
++#endif
++    // S_AGPIO_L17   HX3507_INT 
++    // {   S_AGPIO_L17, HAL_GPIO_DIRECTION_INPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
++    // S_AGPIO_L12  SDIO_BT
++    {   S_AGPIO_L12, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
++    // S_AGPIO_L13   SCLK_BT
++    {   S_AGPIO_L13, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
++
++     // S_AGPIO_L26 ÐÄÂʸ´Î» PPG reset
++    {   S_AGPIO_L26, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
++    // S_AGPIO_R0 PRG_LED_POWER ON  ÐÄÂʵȵçÔ´¿ØÖƽÅ
++    {   S_AGPIO_R0, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
++
++    //S_AGPIO_L21 NTC_VDD_ON ¸øµÍ´ò¿ª NTCÉÏÀ­µçÔ´ ,ĬÈϹرÕ
++    {   S_AGPIO_L21, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
++#if 1  //ĬÈÏÕý³£³äµç 
++//    #define GPIO_PIN_ENABLE_CHARGE S_AGPIO_R9  //low enable
++// #define GPIO_PIN_ENABLE_CHARGE_0_2C S_AGPIO_L20   //low 0.2c µÍµçÁ÷³äµç
++    {   S_AGPIO_R9, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
++    {   S_AGPIO_L20, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
++#else
++    {   S_AGPIO_R9, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
++    {   S_AGPIO_L20, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
++#endif
++
++//ĬÈϹرÕÂí´ï
++    {   S_AGPIO_R2, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
++//ĬÈÏ¿ªÆô EXT LDO V3.0 V1.8
++    {   S_AGPIO_L18, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
++
++#ifdef ENABLE_CYWEE
++    /**G sensor G_INT1 S_AGPIO_L11 G_INT2 S_AGPIO_L19*/
++    //{   S_AGPIO_L11, HAL_GPIO_DIRECTION_INPUT, HAL_GPIO_LEVEL_LOW, GPIO_INTERRUPT_RISING_EDGE, cywee_int1_callback },
++    {   S_AGPIO_L19, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_DEDGE, cywee_int1_callback },
++    // {   S_AGPIO_L19, HAL_GPIO_DIRECTION_INPUT, HAL_GPIO_LEVEL_LOW, 0, NULL },
++#endif   
++    /**S_AGPIO_R1 GPO alipayĬÈÏresetpin*/
++    {   S_AGPIO_R1, HAL_GPIO_DIRECTION_OUTPUT, HAL_GPIO_LEVEL_HIGH, 0, NULL },
++#ifdef SUPPORT_CAT1_SERVICE
++    /**cat1 ring input key*/
++    {   S_AGPIO_L31, HAL_GPIO_DIRECTION_INPUT, NULL, GPIO_INTERRUPT_DEDGE,  cat1_ring_isr_callback},
++#endif
+ };
+ /**
+  * @}
+diff --git a/code/sdk/drivers/boards/brandy_evb/product/product_evb4_standard.h b/code/sdk/drivers/boards/brandy_evb/product/product_evb4_standard.h
+index 8eefb6bd2..04cee1756 100644
+--- a/code/sdk/drivers/boards/brandy_evb/product/product_evb4_standard.h
++++ b/code/sdk/drivers/boards/brandy_evb/product/product_evb4_standard.h
+@@ -90,8 +90,8 @@
+ #define RESOLUTION_WIDTH                  368
+ #define RESOLUTION_HEIGHT                 448
+ #else
+-#define RESOLUTION_WIDTH                  454
+-#define RESOLUTION_HEIGHT                 454
++#define RESOLUTION_WIDTH                  466//454
++#define RESOLUTION_HEIGHT                 466//454
+ #endif
+ 
+ /********************Other module board config********************/
+@@ -142,7 +142,7 @@
+ #define BUILTIN_AI_PCM_ATTR_FRAME_PER_SEC          100   // 每秒帧数
+ 
+ // 音频内置输出设备
+-#define BUILTIN_SND_OUT_PORT                       0x12  // 参考 soc_uapi_sound.h 中 UAPI_SND_OUT_PORT_I2S2 枚举
++#define BUILTIN_SND_OUT_PORT                       0x10  // 参考 soc_uapi_sound.h 中 UAPI_SND_OUT_PORT_I2S0 枚举
+ #define BUILTIN_SND_OUT_PORT_NUM                   1     // 端口个数
+ #define BUILTIN_SND_OUT_AUDIO_CH                   2     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_CHANNEL_2 枚举
+ #define BUILTIN_SND_OUT_BIT_DEPTH                  16    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_BIT_DEPTH_16 枚举
+@@ -158,32 +158,32 @@
+ 
+ // 音频外挂输入设备
+ #define EXTERNAL_AI_PORT                           1     // 参考 soc_uapi_ai.h 中 UAPI_AI_PORT_I2S1 枚举
+-#define EXTERNAL_AI_I2S_ATTR_MASTER                1     // 1:主设备,0:从设备
+-#define EXTERNAL_AI_I2S_ATTR_I2S_MODE              0     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_STD_MODE 枚举
+-#define EXTERNAL_AI_I2S_ATTR_MCLK                  4     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_MCLK_768_FS 枚举
+-#define EXTERNAL_AI_I2S_ATTR_BCLK                  24    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_BCLK_24_DIV 枚举
++#define EXTERNAL_AI_I2S_ATTR_MASTER                0     // 1:主设备,0:从设备
++#define EXTERNAL_AI_I2S_ATTR_I2S_MODE              1     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_PCM_MODE 枚举
++#define EXTERNAL_AI_I2S_ATTR_MCLK                  6     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_MCLK_1536_FS 枚举
++#define EXTERNAL_AI_I2S_ATTR_BCLK                  48    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_BCLK_48_DIV 枚举
+ #define EXTERNAL_AI_I2S_ATTR_BIT_DEPTH             16    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_BIT_DEPTH_16 枚举
+ #define EXTERNAL_AI_I2S_ATTR_AUDIO_CH              2     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_CHANNEL_2 枚举
+ #define EXTERNAL_AI_I2S_ATTR_SAMPLE_RISE_EDGE      1     // 参考 soc_uapi_audio.h 中 pcm_sample_rise_edge 成员
+ #define EXTERNAL_AI_I2S_ATTR_PCM_DELAY_CYCLE       1     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_PCM_1_DELAY 枚举
+-#define EXTERNAL_AI_PCM_ATTR_CHANNELS              2     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_CHANNEL_2 枚举
++#define EXTERNAL_AI_PCM_ATTR_CHANNELS              1     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_CHANNEL_2 枚举
+ #define EXTERNAL_AI_PCM_ATTR_BIT_DEPTH             16    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_BIT_DEPTH_16 枚举
+-#define EXTERNAL_AI_PCM_ATTR_SAMPLE_RATE           16000 // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_SAMPLE_RATE_16K 枚举
+-#define EXTERNAL_AI_PCM_ATTR_FRAME_PER_SEC         100   // 每秒帧数
++#define EXTERNAL_AI_PCM_ATTR_SAMPLE_RATE           8000 // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_SAMPLE_RATE_16K 枚举
++#define EXTERNAL_AI_PCM_ATTR_FRAME_PER_SEC         50   // 每秒帧数  , EG810 pcm 20ms 一帧
+ 
+ // 音频外挂输出设备
+ #define EXTERNAL_SND_OUT_PORT                      0x11  // 参考 soc_uapi_sound.h 中 UAPI_SND_OUT_PORT_I2S1 枚举
+-#define EXTERNAL_SND_OUT_AUDIO_CHANNEL             2     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_CHANNEL_2 枚举
++#define EXTERNAL_SND_OUT_AUDIO_CHANNEL             1     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_CHANNEL_2 枚举
+ #define EXTERNAL_SND_OUT_AUDIO_BIT_DEPTH           16    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_BIT_DEPTH_16 枚举
+-#define EXTERNAL_SND_OUT_AUDIO_SAMPLE_RATE         16000 // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_SAMPLE_RATE_16K 枚举
++#define EXTERNAL_SND_OUT_AUDIO_SAMPLE_RATE         8000 // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_SAMPLE_RATE_16K 枚举
+ #define EXTERNAL_SND_OUT_PORT_NUM                  1     // 端口个数
+ #define EXTERNAL_SND_OUT_I2S_ATTR_BIT_DEPTH        16    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_BIT_DEPTH_16 枚举
+ #define EXTERNAL_SND_OUT_I2S_ATTR_CHANNEL          2     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_CHANNEL_2 枚举
+-#define EXTERNAL_SND_OUT_I2S_ATTR_I2S_MODE         0     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_STD_MODE 枚举
+-#define EXTERNAL_SND_OUT_I2S_ATTR_MCLK             4     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_MCLK_768_FS 枚举
+-#define EXTERNAL_SND_OUT_I2S_ATTR_MASTER           1     // 1:主设备,0:从设备
++#define EXTERNAL_SND_OUT_I2S_ATTR_I2S_MODE         1     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_PCM_MODE 枚举
++#define EXTERNAL_SND_OUT_I2S_ATTR_MCLK             6     // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_MCLK_1536_FS 枚举 12.288M /16k = 
++#define EXTERNAL_SND_OUT_I2S_ATTR_MASTER           0     // 1:主设备,0:从设备
+ #define EXTERNAL_SND_OUT_I2S_ATTR_SAMPLE_RISE_EDGE 1     // 参考 soc_uapi_audio.h 中 pcm_sample_rise_edge 成员
+-#define EXTERNAL_SND_OUT_I2S_ATTR_BCLK             24    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_BCLK_24_DIV 枚举
++#define EXTERNAL_SND_OUT_I2S_ATTR_BCLK             48    // 参考 soc_uapi_audio.h 中 UAPI_AUDIO_I2S_BCLK_48_DIV 枚举 12.288M / 256k = 48
+ 
+ // Sleep option
+ #define CONFIG_PM_TICKLESS_EN               YES
+@@ -196,9 +196,9 @@
+ #define CONFIG_SUPPORT_BUTTON_DOUBLE_CLICK  NO
+ 
+ // LCD VCI_EN
+-#define VCI_LCD_GPIO                        S_AGPIO_L6
++#define VCI_LCD_GPIO                        S_AGPIO_L24
+ #define DISPLAY_TE_GPIO                     S_AGPIO_L22
+-#define RESET_LCD_GPIO                      S_AGPIO_R3
++#define RESET_LCD_GPIO                      S_AGPIO_L27
+ 
+ // TP CONFIG
+ #define ZTW523_I2C_BUS                      I2C_BUS_1
+@@ -207,6 +207,10 @@
+ #define TMA525B_I2C_BUS                     I2C_BUS_1
+ #define TMA525B_INT_GPIO                    S_AGPIO_R5
+ #define TMA525B_RESET_GPIO                  S_AGPIO_R4
++#define FT6X46_I2C_BUS                      I2C_BUS_1
++#define FT6X46_INT_GPIO                     S_AGPIO_R5
++#define FT6X46_RESET_GPIO                   S_AGPIO_R4
++
+ /**
+  * @}
+  */
+diff --git a/code/sdk/drivers/chips/brandy/porting/uart/uart_porting.c b/code/sdk/drivers/chips/brandy/porting/uart/uart_porting.c
+index b6f409070..d2203a1b0 100644
+--- a/code/sdk/drivers/chips/brandy/porting/uart/uart_porting.c
++++ b/code/sdk/drivers/chips/brandy/porting/uart/uart_porting.c
+@@ -56,6 +56,12 @@
+ #define UARTRESET       (M_CTL_RB_BASE + 0x0168)
+ #define UARTBUS0        0x1
+ #define UARTBUS1        0x0
++
++/** 
++ * CUSTOM_UART_RATE = 500000 可以看蓝牙日志
++ *                    2000000 可以加快下载文件速度
++*/
++#define CUSTOM_UART_RATE 2000000  
+ typedef struct {
+     pin_mode_t tx_pin_mode;
+     pin_mode_t rx_pin_mode;
+@@ -181,7 +187,11 @@ static uart_config_t g_uart_config[UART_BUS_MAX_NUMBER] = {
+         NULL,
+ #endif
+         {
+-            .baud_rate = 115200,
++            #ifdef ENABLE_SLIP
++            .baud_rate = 921600,
++            #else
++            .baud_rate = CUSTOM_UART_RATE,
++            #endif
+             .data_bits = UART_DATA_BIT_8,
+             .parity = UART_PARITY_NONE,
+             .stop_bits = UART_STOP_BIT_1,
+@@ -221,7 +231,7 @@ static uart_config_t g_uart_config[UART_BUS_MAX_NUMBER] = {
+         log_factory_at_callback,
+ #endif
+         {
+-            .baud_rate = 500000,
++            .baud_rate = CUSTOM_UART_RATE,
+             .data_bits = UART_DATA_BIT_8,
+             .parity = UART_PARITY_NONE,
+             .stop_bits = UART_STOP_BIT_1,
+@@ -298,7 +308,13 @@ void irq_uart1_handler(void)
+ static void at_cmd_uart_rx_callback(const void *buf, uint16_t buf_len, bool remaining)
+ {
+     unused(remaining);
++    #ifndef FT_SINGLE_UART
+     at_cmd_msg_receive_handler((uint8_t *)buf, buf_len);
++    #endif
++
++    #ifdef ENABLE_SLIP
++    slip_receive_handler((uint8_t *)buf, buf_len);
++    #endif
+     hal_uart_clear_pending(SW_DEBUG_UART_BUS);
+ }
+ #endif
+diff --git a/code/sdk/drivers/drivers/driver/lcd/lcd_config.c b/code/sdk/drivers/drivers/driver/lcd/lcd_config.c
+index 54950d78a..d342a8c8e 100644
+--- a/code/sdk/drivers/drivers/driver/lcd/lcd_config.c
++++ b/code/sdk/drivers/drivers/driver/lcd/lcd_config.c
+@@ -9,11 +9,30 @@
+ #include "common_def.h"\r
+ #include "lcd_config.h"\r
+ \r
++#define LCD_EDO_466X466_SCREEN_ID  0x1133\r
+ #define LCD_EDO_454X454_SCREEN_ID  0xf00\r
+ #define LCD_BOE_454X454_SCREEN_ID  0x500\r
+ #define LCD_SH_240X296_SCREEN_ID   0x101\r
+ #define LCD_BOE_194X368_SCREEN_ID  0x4a00\r
+ \r
++const combo_dev_cfg_t g_panel_466x466_60_config = {\r
++    .devno = 0,\r
++    .lane_id = {0, -1},\r
++    .out_mode = OUT_MODE_DSI_CMD,\r
++    .out_format = OUT_FORMAT_RGB_24BIT,\r
++    .sync_info = {\r
++        .hsa_pixels   = 10,   // hsa 10 pixels\r
++        .hbp_pixels   = 10,   // hbp 10 pixels\r
++        .hact_pixels  = 466,  // hact 466 pixels\r
++        .hfp_pixels   = 10,   // hfp 10 pixels\r
++        .vsa_lines    = 4,    // vsa 4 lines\r
++        .vbp_lines    = 12,   // vbp 12 lines\r
++        .vact_lines   = 466,  // vact 466 lines\r
++        .vfp_lines    = 10,   // vfp 10 lines\r
++    },\r
++    .phy_data_rate = 480,     // 480Mbps\r
++    .pixel_clk = 20000,       // 20000KHz\r
++};\r
+ const combo_dev_cfg_t g_panel_454x454_60_config = {\r
+     .devno = 0,\r
+     .lane_id = {0, -1},\r
+@@ -67,6 +86,14 @@ const lcd_cmd_sequ g_common_cmd_display_off[] = {
+     {1, 1, {0x10}, 120},       /* sleep in */\r
+ };\r
+ \r
++/* display off sequence for common lcd */\r
++const lcd_cmd_sequ g_common_466x466_cmd_display_off[] = {\r
++    {1, 2, {0xfe, 0x00}, 0},   /* select default cmd page */\r
++    {1, 1, {0x28}, 0},         /* display off */\r
++    {1, 1, {0x10}, 120},       /* sleep in */\r
++    {1, 2, {0x4f, 0x01}, 0},   /* ½ødeepstandby ×´Ì¬ */\r
++};\r
++\r
+ /* sleep in sequence for common lcd */\r
+ const lcd_cmd_sequ g_common_cmd_sleep_in[] = {\r
+     {1, 2, {0xfe, 0x00}, 0},   /* select default cmd page */\r
+@@ -110,6 +137,19 @@ lcd_cmd_sequ g_common_cmd_brightness[] = {
+     {1, 2, {0xfe, 0x00}, 0},\r
+     {1, 2, {0x51, 0xff}, 0},\r
+ };\r
++const lcd_cmd_sequ g_edo_466x466_screen_init_on[] = {\r
++    {1, 2, {0xfe, 0x00}, 0}, \r
++    {1, 2, {0x3a, 0x77}, 0}, \r
++    {1, 2, {0x35, 0x00}, 0}, \r
++    {1, 2, {0x53, 0x20}, 0}, \r
++    // {1, 2, {0x51, 0xff}, 0}, \r
++    {1, 2, {0x63, 0xff}, 0}, \r
++    {1, 5, {0x2A, 0x00, 0x06, 0x01, 0xd7}, 0}, \r
++    {1, 5, {0x2B, 0x00, 0x00, 0x01, 0xd1}, 0}, \r
++    {1, 1, {0x11}, 120}, \r
++    {1, 1, {0x29}, 0}, \r
++};\r
++\r
+ \r
+ /* init sequence for EDO 454*454 lcd */\r
+ const lcd_cmd_sequ g_edo_454x454_screen_init_on[] = {\r
+@@ -193,6 +233,11 @@ const lcd_cmds_sequ g_display_off_cmds = {
+     .cmd_cnt = array_size(g_common_cmd_display_off),\r
+ };\r
+ \r
++const lcd_cmds_sequ g_466x466_display_off_cmds = {\r
++    .cmd = g_common_466x466_cmd_display_off,\r
++    .cmd_cnt = array_size(g_common_466x466_cmd_display_off),\r
++};\r
++\r
+ const lcd_cmds_sequ g_idle_in_cmds = {\r
+     .cmd = g_common_cmd_idle_in,\r
+     .cmd_cnt = array_size(g_common_cmd_idle_in),\r
+@@ -218,6 +263,11 @@ const lcd_cmds_sequ g_brightness_cmds = {
+     .cmd_cnt = array_size(g_common_cmd_brightness),\r
+ };\r
+ \r
++const lcd_cmds_sequ g_edo_466x466_screen_init_on_cmds = {\r
++    .cmd = g_edo_466x466_screen_init_on,\r
++    .cmd_cnt = array_size(g_edo_466x466_screen_init_on),\r
++};\r
++\r
+ const lcd_cmds_sequ g_edo_454x454_screen_init_on_cmds = {\r
+     .cmd = g_edo_454x454_screen_init_on,\r
+     .cmd_cnt = array_size(g_edo_454x454_screen_init_on),\r
+@@ -249,6 +299,25 @@ const lcd_cmds_sequ g_sleep_out_cmds = {
+ };\r
+ \r
+ const lcd_drv_cfg g_lcd_driver_ops[] = {\r
++    {\r
++        .bus_type             = BUS_DISPLAY_MIPI,\r
++        .bus_cfg              = &g_panel_466x466_60_config,\r
++        .x_start              = 0x6,\r
++        .y_start              = 0,\r
++        .fps                  = 60,\r
++        .lcd_id               = LCD_EDO_466X466_SCREEN_ID,\r
++        .display_on_cmds      = &g_edo_466x466_screen_init_on_cmds,\r
++        .display_off_cmds     = &g_466x466_display_off_cmds,\r
++        .enter_idle_cmds      = &g_idle_in_cmds,\r
++        .exit_idle_cmds       = &g_idle_out_cmds,\r
++        .te_on_cmds           = &g_te_on_cmds,\r
++        .te_off_cmds          = &g_te_off_cmds,\r
++        .set_brightnes_cmds   = &g_brightness_cmds,\r
++        .sleep_in_cmds        = &g_sleep_in_cmds,\r
++        .sleep_out_cmds       = &g_sleep_out_cmds,\r
++        .lcd_id_info.reg_addr = 0x04,\r
++        .lcd_id_info.read_len = 3,\r
++    },\r
+     {\r
+         .bus_type             = BUS_DISPLAY_MIPI,\r
+         .bus_cfg              = &g_panel_454x454_60_config,\r
+diff --git a/code/sdk/drivers/drivers/driver/lcd/lcd_private.c b/code/sdk/drivers/drivers/driver/lcd/lcd_private.c
+index 039f45c48..ea251e016 100644
+--- a/code/sdk/drivers/drivers/driver/lcd/lcd_private.c
++++ b/code/sdk/drivers/drivers/driver/lcd/lcd_private.c
+@@ -12,7 +12,7 @@
+ #include "gpio.h"\r
+ #include "pinctrl_porting.h"\r
+ #include "product.h"\r
+-\r
++#include "pinctrl.h"\r
+ static void lcd_drv_power_on(void)\r
+ {\r
+ #ifndef QSPI_DISPLAY\r
+@@ -27,16 +27,35 @@ static void lcd_drv_power_on(void)
+     uapi_gpio_set_val(RESET_LCD_GPIO, GPIO_LEVEL_HIGH);\r
+     uapi_tcxo_delay_ms(10); /* delay 10 ms */\r
+ }\r
+-\r
++#define  USE_OUTPUT_CTL 1\r
+ static void lcd_drv_power_off(void)\r
+ {\r
++#if USE_OUTPUT_CTL\r
++    uapi_gpio_set_dir(RESET_LCD_GPIO, GPIO_DIRECTION_OUTPUT); \r
+     uapi_gpio_set_val(RESET_LCD_GPIO, GPIO_LEVEL_LOW);\r
+-    uapi_gpio_set_dir(RESET_LCD_GPIO, GPIO_DIRECTION_INPUT);\r
+-#ifndef QSPI_DISPLAY\r
++    #ifndef QSPI_DISPLAY\r
++    uapi_gpio_set_dir(VCI_LCD_GPIO, GPIO_DIRECTION_OUTPUT);\r
++    uapi_gpio_set_val(VCI_LCD_GPIO, GPIO_LEVEL_LOW);\r
++    #endif\r
++    uapi_tcxo_delay_ms(10); /* delay 10 ms */\r
++    int resetvalue = uapi_gpio_get_output_val(RESET_LCD_GPIO);\r
++    int lcd_envalue = uapi_gpio_get_output_val(VCI_LCD_GPIO);\r
++    printf("Output RESET_LCD_GPIO %d , VCI_LCD_GPIO %d\r\n",resetvalue,lcd_envalue);\r
++#else\r
++    uapi_gpio_set_val(RESET_LCD_GPIO, GPIO_LEVEL_LOW);\r
++    uapi_gpio_set_dir(RESET_LCD_GPIO, GPIO_DIRECTION_INPUT); //ÉèÖóÉInput£¬ÊÇΪÁ˽â¾ö©µç £¿£¿\r
++    uapi_pin_set_pull(RESET_LCD_GPIO, PIN_PULL_DOWN);\r
++    #ifndef QSPI_DISPLAY\r
+     uapi_gpio_set_val(VCI_LCD_GPIO, GPIO_LEVEL_LOW);\r
+     uapi_gpio_set_dir(VCI_LCD_GPIO, GPIO_DIRECTION_INPUT);\r
+-#endif\r
++    uapi_pin_set_pull(VCI_LCD_GPIO, PIN_PULL_DOWN);\r
++    #endif\r
+     uapi_tcxo_delay_ms(10); /* delay 10 ms */\r
++    int resetvalue = uapi_gpio_get_val(RESET_LCD_GPIO);\r
++    int lcd_envalue = uapi_gpio_get_val(VCI_LCD_GPIO);\r
++    printf("Input RESET_LCD_GPIO %d , VCI_LCD_GPIO %d\r\n",resetvalue,lcd_envalue);\r
++#endif\r
++   \r
+ }\r
+ \r
+ static lcd_drv_private g_lcd_private_api = {\r
+diff --git a/code/sdk/drivers/drivers/driver/lcd/soc_lcd_api.c b/code/sdk/drivers/drivers/driver/lcd/soc_lcd_api.c
+index b535f5555..56f8542af 100644
+--- a/code/sdk/drivers/drivers/driver/lcd/soc_lcd_api.c
++++ b/code/sdk/drivers/drivers/driver/lcd/soc_lcd_api.c
+@@ -173,7 +173,8 @@ static ext_errno lcd_get_ops(void)
+         }\r
+     }\r
+ \r
+-    g_lcd_info.brightness = DEFAULT_BRIGHTNESS;\r
++    if (g_lcd_info.brightness == 0)\r
++       g_lcd_info.brightness = DEFAULT_BRIGHTNESS;\r
+ \r
+     return EXT_ERR_SUCCESS;\r
+ fail:\r
+diff --git a/code/sdk/drivers/drivers/driver/touch/CMakeLists.txt b/code/sdk/drivers/drivers/driver/touch/CMakeLists.txt
+index 6782d9cc1..6971096df 100644
+--- a/code/sdk/drivers/drivers/driver/touch/CMakeLists.txt
++++ b/code/sdk/drivers/drivers/driver/touch/CMakeLists.txt
+@@ -21,6 +21,12 @@ set(SOURCES ${SOURCES}
+     ${CMAKE_CURRENT_SOURCE_DIR}/ztw523_touch/ztw523_drv1.c
+     ${CMAKE_CURRENT_SOURCE_DIR}/ztw523_touch/ztw523_touch1.c
+ )
++elseif("TPTYPE_FT6X46" IN_LIST DEFINES)
++set(SOURCES ${SOURCES}
++    ${CMAKE_CURRENT_SOURCE_DIR}/ft6x46_touch/ft6x46_ctrl.c
++    ${CMAKE_CURRENT_SOURCE_DIR}/ft6x46_touch/ft6x46_drv1.c
++    ${CMAKE_CURRENT_SOURCE_DIR}/ft6x46_touch/ft6x46_touch1.c
++)
+ else()
+ set(SOURCES ${SOURCES}
+     ${CMAKE_CURRENT_SOURCE_DIR}/ztw523_touch/ztw523_ctrl.c
+@@ -41,6 +47,12 @@ set(PUBLIC_HEADER
+     ${CMAKE_CURRENT_SOURCE_DIR}/ztw523_touch
+     ${ROOT_DIR}/middleware/services/gui/hal/input/include
+ )
++elseif("TPTYPE_FT6X46" IN_LIST DEFINES)
++set(PUBLIC_HEADER
++    ${CMAKE_CURRENT_SOURCE_DIR}
++    ${CMAKE_CURRENT_SOURCE_DIR}/ft6x46_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/touch_screen_drv.c b/code/sdk/drivers/drivers/driver/touch/touch_screen_drv.c
+index d74083a98..4591a7d7e 100644
+--- a/code/sdk/drivers/drivers/driver/touch/touch_screen_drv.c
++++ b/code/sdk/drivers/drivers/driver/touch/touch_screen_drv.c
+@@ -18,6 +18,9 @@
+ #elif defined(TPTYPE_ZTW523)\r
+ #include "ztw523_drv1.h"\r
+ #include "ztw523_ctrl.h"\r
++#elif defined(TPTYPE_FT6X46)\r
++#include "ft6x46_drv1.h"\r
++#include "ft6x46_ctrl.h"\r
+ #else\r
+ #include "ztw523_drv1.h"\r
+ #include "ztw523_ctrl.h"\r
+@@ -31,6 +34,10 @@
+ #define TOUCH_I2C_BUS            ZTW523_I2C_BUS\r
+ #define TOUCH_INT_GPIO           ZTW523_INT_GPIO\r
+ #define TOUCH_RESET_GPIO         ZTW523_RESET_GPIO\r
++#elif defined(TPTYPE_FT6X46)\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
+ #else\r
+ #define TOUCH_I2C_BUS            ZTW523_I2C_BUS\r
+ #define TOUCH_INT_GPIO           ZTW523_INT_GPIO\r
+@@ -427,8 +434,15 @@ void touch_screen_suspend(void)
+     touch_peripheral_api *touch_ptr = touch_screen_get_api();\r
+     ext_errno ret = touch_ptr->touch_sleep();\r
+     if (ret != EXT_ERR_SUCCESS) { tp_err("touch sleep ret=0x%x", ret); }\r
++#if defined(TPTYPE_FT6X46)\r
++    if (ft6x46_suspend() == EXT_ERR_SUCCESS){\r
++        i2c_save_reg(TOUCH_I2C_BUS);\r
++        uapi_gpio_disable_interrupt(TOUCH_INT_GPIO); // close tp_int gpio interrupt\r
++    }\r
++#else\r
+     i2c_save_reg(TOUCH_I2C_BUS);\r
+     uapi_gpio_disable_interrupt(TOUCH_INT_GPIO); // close tp_int gpio interrupt\r
++#endif\r
+ }\r
+ \r
+ void touch_screen_resume(void)\r
+@@ -442,6 +456,8 @@ void touch_screen_resume(void)
+     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_FT6X46)\r
++    ft6x46_resume();\r
+ #else\r
+     ztw523_resume();\r
+ #endif\r
+@@ -466,6 +482,8 @@ void touch_screen_restart(void)
+     tma525b_resume();\r
+ #elif defined(TPTYPE_ZTW523)\r
+     ztw523_resume();\r
++#elif defined(TPTYPE_FT6X46)\r
++    ft6x46_resume();\r
+ #else\r
+     ztw523_resume();\r
+ #endif\r
diff --git a/fd230_driver_patch/20240503.170906/diff/modified_or_new_files.txt b/fd230_driver_patch/20240503.170906/diff/modified_or_new_files.txt
new file mode 100644 (file)
index 0000000..4a25bdc
--- /dev/null
@@ -0,0 +1,14 @@
+code/sdk/application/audio/vendor/CMakeLists.txt
+code/sdk/application/audio/vendor/aw88166/aw88166.c
+code/sdk/application/brandy/brandy_standard/thread_pri_init.c
+code/sdk/application/wearable/nativeapp/nativeui/rebootdevice/src/RebootPresenter.cpp
+code/sdk/build/config/target_config/brandy/config.py
+code/sdk/drivers/boards/brandy_evb/board_config/board_evb.h
+code/sdk/drivers/boards/brandy_evb/product/product_evb4_standard.h
+code/sdk/drivers/chips/brandy/porting/uart/uart_porting.c
+code/sdk/drivers/drivers/driver/lcd/lcd_config.c
+code/sdk/drivers/drivers/driver/lcd/lcd_private.c
+code/sdk/drivers/drivers/driver/lcd/soc_lcd_api.c
+code/sdk/drivers/drivers/driver/touch/CMakeLists.txt
+code/sdk/drivers/drivers/driver/touch/touch_screen_drv.c
+code/sdk/drivers/drivers/driver/touch/ft6x46_touch/