-/*\r
- * Copyright (c) CompanyNameMagicTag 2021-2022. All rights reserved.\r
- * Description: Media task process\r
- * Author:\r
- * Create:\r
- */\r
-#if defined(__LITEOS__)\r
-#include "los_memory.h"\r
-#include "los_memory_pri.h"\r
-#ifdef CFG_DRIVERS_MMC\r
-#include "soc/mmc.h"\r
-#endif\r
-#endif\r
-\r
-#ifdef CFG_DRIVERS_MMC\r
-#include "hci.h"\r
-#include "soc_mmc.h"\r
-#endif\r
-\r
-#if defined(__FREERTOS__)\r
-#ifdef FREERTOS_DEBUG\r
-#include "xlt_memory_pri.h"\r
-#include "task_debug.h"\r
-#endif\r
-#endif\r
-\r
-#include "debug_print.h"\r
-#include "td_base.h"\r
-#include "securec.h"\r
-#include "log_file.h"\r
-#include "dfx_adapt_layer.h"\r
-#include "dirent.h"\r
-#include "uart.h"\r
-#include "uapi_crc.h"\r
-#include "tcxo.h"\r
-#include "cmsis_os2.h"\r
-#include "lcd_bus.h"\r
-#include "soc_vau_type.h"\r
-#include "soc_dpu_type.h"\r
-#include "soc_mipi_tx.h"\r
-#include "touch_screen_def.h"\r
-#include "nandflash.h"\r
-#include "efuse.h"\r
-#include "psram_drv.h"\r
-#include "flash.h"\r
-#include "adc.h"\r
-#include "exception.h"\r
-#include "fcntl.h"\r
-#include <sys/stat.h>\r
-#include "common_def.h"\r
-#include "unistd.h"\r
-#include "watchdog.h"\r
-#include "button_porting.h"\r
-#include "hal_reboot.h"\r
-#include "app_msg_manager.h"\r
-#include "sys/statfs.h"\r
-#include "asm/memmap_config.h"\r
-#include "watchdog_porting.h"\r
-#include "thread_init.h"\r
-\r
-#include "pm.h"\r
-#include "pm_veto.h"\r
-#include "pm_lp_stub.h"\r
-#include "pm_definition.h"\r
-#include "build_version.h"\r
-#include "at_cmd_api.h"\r
-#include "app_test_fs.h"\r
-#include "app_test_perf.h"\r
-#include "app_common_api.h"\r
-#include "app_tx_process.h"\r
-#include "dfx_feature_config.h"\r
-#include "app_at_process.h"\r
-#include "pm_veto.h"\r
-#include "input_app.h"\r
-#include "lpc_core.h"\r
-#include "diag_msg.h"\r
-#include "pmu_ldo.h"\r
-#include "pinctrl.h"\r
-#include "non_os_reboot.h"\r
-#include "km.h"\r
-#include "cipher_api.h"\r
-#include "key_deriv_porting.h"\r
-#include "otp_map.h"\r
-#ifdef CFG_DRIVERS_NANDFLASH\r
-#include "nandflash_config.h"\r
-#endif\r
-\r
-#if defined(SW_RTT_DEBUG)\r
-#include "SEGGER_RTT.h"\r
-#endif\r
-#ifdef SUPPORT_POWER_MANAGER\r
-#include "power_display_service.h"\r
-#endif\r
-#include "i2c.h"\r
-#include "calendar.h"\r
-\r
-#ifdef SUPPORT_FILE_SPLIT_COMBINE\r
-#include "msg_center_protocol.h"\r
-#endif\r
-\r
-#ifdef SUPPORT_ALIPAY_SEC\r
-#include "alipay_feature.h"\r
-#endif\r
-\r
-#define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0]))\r
-#define DIAG_RES_LEN 4\r
-#define FF_VOLUMES_NUM 4\r
-#define ADC_AUTODATA_PRT_SIZE 4\r
-#define ADC_AUTODATA_PRT_INDEX1 1\r
-#define ADC_AUTODATA_PRT_INDEX2 2\r
-#define ADC_AUTODATA_PRT_INDEX3 3\r
-#define ADC_AUTODATA_PRT_INDEX4 4\r
-#define VER_STR_MAX 128\r
-#define FILE_MAX_NUM 32\r
-#define MAX_FILE_PATH_LEN 128\r
-#define TEST_MSG_MAX_SIZE 40\r
-#define LOG_FILE_ARG_NUM 6\r
-#define FS_NODE_INFO_SPACE 16\r
-#define MB_SIZE (1024 * 1024)\r
-#define KB_SIZE (1024)\r
-#define ONE_SECOND (1000000)\r
-#define DTCM_RAM_OFF (400 * 1024) // dtcm偏移,从最后未使用的dtcm作为测试内存\r
-#define INVALID_HANDLE (0xFFFFFFFF)\r
-\r
-#ifdef CONFIG_PSRAM_SUPPORT\r
-#define LCD_FILL_COLOR_ADDR 0x6D200000\r
-#else\r
-#define LCD_FILL_COLOR_ADDR 0x60280000\r
-#endif\r
-\r
-#define POWER_KEY_PARAM_LEN 0x2\r
-#define CALENDAR_PARAM_LEN 0x6\r
-#ifdef CFG_DRIVERS_MMC\r
-#define FS_VOLUMES_NUM 4\r
-#define FS_VOLUME_STRS "/user/system/", "/user/", "/user/update/", "/user/music/"\r
-extern unsigned int mmc_set_clock_with_way2(struct hci_softc *sc, unsigned int cfg_clock);\r
-uint32_t g_app_emmc_clk = SDIOM_SRC_CLK_FREQ_LVL_98M_VAL;\r
-#endif\r
-\r
-#ifdef CFG_DRIVERS_NANDFLASH\r
-#ifndef MEMORY_MINI\r
-#ifdef SINGLE_USER_PARTITION\r
-#define FS_VOLUMES_NUM 1\r
-#define FS_VOLUME_STRS "/user/"\r
-#else\r
-#define FS_VOLUMES_NUM 4\r
-#define FS_VOLUME_STRS "/system/", "/user/update/", "/user/music/", \r
-#endif\r
-#else\r
-#define FS_VOLUMES_NUM 1\r
-#define FS_VOLUME_STRS "/user/"\r
-#endif\r
-#endif\r
-\r
-#define AT_I2C_PARA_CNT 4\r
-#define AT_I2C_REG_ARRAY_LEN 8\r
-\r
-#define AT_PARA_IDX2 2\r
-#define AT_PARA_IDX3 3\r
-#define AT_PARA_IDX4 4\r
-#define AT_PARA_IDX5 5\r
-#define AT_PARA_IDX6 6\r
-#define AT_PARA_IDX7 7\r
-#define AT_PARA_IDX8 8\r
-\r
-#define OFFSET_8 8\r
-#define OFFSET_16 16\r
-#define OFFSET_24 24\r
-\r
-#define AES_SALT_LENGTH 16\r
-#define AES_IV_LENGTH 16\r
-// AES_SAMPLE_TEST_LEN must be an integer multiple of 32 bytes.\r
-#define AES_SAMPLE_TEST_LEN 64\r
-#define ALIPAY_EXIT_LPM_DELAY_LEN 100\r
-\r
-#ifdef SUPPORT_FILE_SPLIT_COMBINE\r
-/* 文件拆分合并测试 */\r
-#define ORIGIN_FILE_PATH "/user/test/ssb.bin"\r
-#define FILE_LIST_PATH "/user/test/flist.txt"\r
-#define COMBINE_FILE_PATH "/user/test/ssb_c.bin"\r
-#endif\r
-\r
-#ifdef SUPPORT_AUTO_OTA\r
-extern uint8_t g_auto_ota_upload_mode;\r
-#ifndef ONE_ADDR_LEN\r
-#define ONE_ADDR_LEN 2\r
-#endif\r
-#ifndef ADDR_MAC_LEN\r
-#define ADDR_MAC_LEN 6\r
-#endif\r
-#endif\r
-\r
-const uint8_t g_decrypt_aes_salt[AES_SALT_LENGTH] = { 0x0 };\r
-const uint8_t g_decrypt_aes_iv[AES_IV_LENGTH] = { 0x0 };\r
-// The length of the GID must be 32 bytes and cannot be changed.\r
-const uint8_t g_decrypt_aes_gid[OTP_SECURITY_KEY_GID_LEN] = { 0x0 };\r
-// This is the ASCII code of the string to be encrypted.\r
-const uint8_t g_decrypt_aes_encryp[AES_SAMPLE_TEST_LEN] = {};\r
-// This is the ASCII code of the string to be decrypted.\r
-const uint8_t g_decrypt_aes_decryp[AES_SAMPLE_TEST_LEN] = {0x15, 0x56, 0xa7, 0x38, 0x7f, 0xd3, 0x69, 0x72, 0x16,\r
- 0x2, 0xda, 0x36, 0xf3, 0x99, 0xcd, 0xf7, 0x49, 0xf4, 0x2d, 0x15, 0x77, 0xd5, 0x4f, 0xdd, 0x14, 0xd1, 0xc3,\r
- 0x7f, 0x41, 0xd6, 0x99, 0x47, 0x2f, 0xb1, 0x34, 0xdf, 0x87, 0xa0, 0x49, 0x53, 0x23, 0x43, 0xf0, 0x96, 0xed,\r
- 0xbf, 0x5, 0x1d, 0x78, 0xc4, 0xa3, 0xfe, 0xf2, 0xa3, 0xb7, 0x8e, 0x29, 0xd9, 0xd0, 0x86, 0xc5, 0x5f, 0xc4, 0x8f};\r
-\r
-static const char * const g_volume_names[FS_VOLUMES_NUM] = { FS_VOLUME_STRS };\r
-\r
-#if DSP_L2RAM_AREA_SIZE == 8\r
-extern void *__l2m_dsp_data_end;\r
-#else\r
-extern void *__l2m_gpu_data_end;\r
-#endif\r
-\r
-diag_ser_header_t g_mcu_diag_header; // 用于保存diag回复包头内容\r
-bool g_app_diag_flag = false; // 用于控制执行功能后是否回复diag消息\r
-\r
-pm_id_t g_pm_req_mode_usr = PM_ID_DEBUG;\r
-#ifdef CONFIG_LOW_POWER_TEST\r
-static bool g_dpu_ready_flag = false;\r
-#else\r
-static bool g_dpu_ready_flag = true;\r
-#endif\r
-\r
-void wstp_print(const char *str, ...)\r
-{\r
- static uint8_t s[256]; // 256 means string max length.\r
- va_list args;\r
- int32_t str_len;\r
-\r
- if ((str == NULL) || (strlen(str) == 0)) {\r
- return;\r
- }\r
-\r
- va_start(args, str);\r
- str_len = vsprintf_s((char *)s, sizeof(s), str, args);\r
- va_end(args);\r
-\r
- if (str_len < 0) {\r
- return;\r
- }\r
-#if defined(SW_RTT_DEBUG)\r
- SEGGER_RTT_Write(0, (const char *)s, str_len);\r
-#else\r
- if (hal_uart_get_funcs(SW_DEBUG_UART_BUS) == NULL) {\r
- return;\r
- }\r
- uapi_uart_write(SW_DEBUG_UART_BUS, (const void *)s, str_len, 0);\r
-#endif\r
-}\r
-\r
-void factory_test_print(const uint8_t return_code, const char *str, ...)\r
-{\r
- static uint8_t s[256]; // 256 means string max length.\r
- va_list args;\r
- int32_t str_len;\r
-\r
- if ((str == NULL) || (strlen(str) == 0)) {\r
- return;\r
- }\r
-\r
- va_start(args, str);\r
- str_len = vsprintf_s((char *)s, sizeof(s), str, args);\r
- va_end(args);\r
-\r
- if (str_len <= 0) {\r
- return;\r
- }\r
-#ifdef SW_UART_DEBUG\r
- wstp_print("[Factory]|%s.\r\n", s);\r
-#endif\r
-#ifdef FT_BT_UART\r
- at_cmd_send_abt_result_to_bt((const void *)s, str_len);\r
-#endif\r
-#ifdef FT_DONGLE\r
- // 发送spp包\r
- uint8_t table_len = 2 + str_len; // return_code + str_len + payload\r
- diag_ser_header_t header_temp = {\r
- .ser_id = DIAG_SER_APP_TEST,\r
- .cmd_id = FTDONGLERETURN,\r
- .src = DIAG_FRAME_FID_MCU, // DIAG_FRAME_FID_MCU\r
- .dst = DIAG_FRAME_FID_PHONE, // DIAG_FRAME_FID_PHONE\r
- .crc_en = true,\r
- .ack_en = false,\r
- .length = 2 + table_len, // moduld + cmd + table_len\r
- };\r
- factory_print_table *ft_table = (factory_print_table*)malloc(sizeof(factory_print_table));\r
- if (ft_table == NULL) {\r
- return;\r
- }\r
- ft_table->return_code = return_code;\r
- ft_table->payload_len = str_len;\r
- if (memcpy_s(ft_table->payload, FT_PAYLOAD_LEN_MAX, s, str_len) != EOK) {\r
- wstp_print("[Factory]|memcpy_s fail!\r\n");\r
- free(ft_table);\r
- return;\r
- }\r
- send_spp_diag_msg(true, &header_temp, ft_table, table_len);\r
- free(ft_table);\r
-#endif\r
-}\r
-\r
-void print_at_cmd_ret(int ret)\r
-{\r
- uint32_t irq_sts = osal_irq_lock();\r
- if (ret == ERRCODE_SUCC) {\r
- wstp_print("\r\nOK~\r\n");\r
- } else {\r
- wstp_print("\r\nERR~\r\n");\r
- }\r
-\r
-#ifdef FT_BT_UART\r
- if (ret == ERRCODE_SUCC) {\r
- at_cmd_send_abt_result_to_bt((uint8_t *)"\r\nOK~\r\n", strlen("\r\nOK~\r\n"));\r
- } else {\r
- at_cmd_send_abt_result_to_bt((uint8_t *)"\r\nERR~\r\n", strlen("\r\nERR~\r\n"));\r
- }\r
-#endif\r
- osal_irq_restore(irq_sts);\r
-}\r
-\r
-/* Diag消息获取TLV中V值数据处理接口 */\r
-uint32_t parse_tlv_2value(uint8_t* data, uint16_t data_len, uint8_t** out, uint32_t *out_len)\r
-{\r
- unused(data_len);\r
- uint8_t num[WORD_WIDTH] = {0};\r
- uint8_t* ptr = data;\r
- uint8_t len;\r
- uint32_t length = 0;\r
- int i;\r
-\r
- ptr++;\r
- // 动态len运算,7bit为1代表剩下0-6bit为真实长度,7bit为0,0-6bit代表后面几个字节为真实长度。\r
- len = *(uint8_t*)ptr++;\r
- if (((len & BIT7) >> 7) == 1) {\r
- length = len & (~BIT7);\r
- } else {\r
- // 按照len数值,将真实长度数据小端保存到num中,默认最大长度四个字节,已够用\r
- for (i = 0; i < len; i++) {\r
- num[i] = *ptr++;\r
- }\r
- length = *(uint32_t*)num;\r
- }\r
- *out = ptr;\r
- *out_len = length;\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-/* diag消息再封装转发app task接口 */\r
-uint32_t mcu_diag_cmd_process(diag_ser_data_t *data)\r
-{\r
- app_msg_info_t* app_msg;\r
- uint8_t* ptr;\r
- uint32_t paylen;\r
- diag_ser_frame_t* frame = (diag_ser_frame_t*)data->payload;\r
-\r
- if (data == NULL) {\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- parse_tlv_2value(frame->tlv, data->header.length, &ptr, &paylen);\r
- app_msg = (app_msg_info_t*)osal_kmalloc(sizeof(app_msg_info_t) + data->header.length, OSAL_GFP_KERNEL);\r
- if (app_msg == NULL) {\r
- wstp_print("mcu_diag_cmd_process malloc fail!!"NEWLINE);\r
- return ERRCODE_FAIL;\r
- }\r
- (void)memset_s(app_msg, sizeof(app_msg_info_t) + data->header.length, 0, sizeof(app_msg_info_t) + data->header.length);\r
- (void)memcpy_s(&g_mcu_diag_header, sizeof(diag_ser_header_t), &(data->header), sizeof(diag_ser_header_t));\r
- app_msg->id = data->header.cmd_id;\r
- app_msg->payload_len = paylen;\r
- if (app_msg->payload_len > 0 && data != NULL) {\r
- if (memcpy_s(app_msg->payload, app_msg->payload_len, (const void *)ptr, paylen) != EOK) {\r
- wstp_print("mcu_diag_cmd_process data memcpy error!"NEWLINE);\r
- osal_kfree(app_msg);\r
- return ERRCODE_FAIL;\r
- }\r
- }\r
- g_app_diag_flag = true;\r
- app_at_msg_send((uint8_t *)app_msg, sizeof(app_msg_info_t) + paylen);\r
- osal_kfree(app_msg);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-/* 封装返回结果成Diag数据回发给BTH SPP\r
-param descrip:\r
- send: 用于控制是否做diag消息回复\r
- data: 用于传入diag包包头信息\r
- payload: 回复tlv数据\r
- pay_len: 回复tlv数据长度\r
-*/\r
-uint32_t send_spp_diag_msg(bool send, diag_ser_header_t *data, uint8_t* payload, uint32_t pay_len)\r
-{\r
- uint8_t size;\r
- diag_ser_data_t* diag_data;\r
- diag_ser_frame_t* frame;\r
- uint32_t result = ERRCODE_FAIL;\r
-\r
- // send为false,则直接返回\r
- if (send == false) {\r
- return ERRCODE_SUCC;\r
- }\r
-\r
- size = sizeof(diag_ser_data_t) + sizeof(diag_ser_frame_t) + pay_len;\r
- diag_data = (diag_ser_data_t *)malloc(size);\r
- if (diag_data == NULL) {\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- (void)memcpy_s(&(diag_data->header), sizeof(diag_ser_header_t), data, sizeof(diag_ser_header_t));\r
- frame = (diag_ser_frame_t*)&(diag_data->payload);\r
- frame->module_id = data->ser_id;\r
- frame->cmd_id = data->cmd_id;\r
- (void)memcpy_s(&(frame->tlv), pay_len, payload, pay_len);\r
- diag_data->header.crc_en = 1;\r
- diag_data->header.length = size - sizeof(diag_ser_data_t);\r
- diag_data->header.dst = DIAG_FRAME_FID_PHONE;\r
- diag_data->header.src = data->dst;\r
- result = uapi_diag_service_send_data(diag_data);\r
- free(diag_data);\r
- return result;\r
-}\r
-\r
-uint32_t mcu_os_sys_reset(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
- uint8_t res[DIAG_RES_LEN] = {0x80, 0x82, 0x00, 0x00};\r
-\r
- send_spp_diag_msg(g_app_diag_flag, &g_mcu_diag_header, res, DIAG_RES_LEN);\r
- reset_deal_with_fs();\r
-\r
- set_cpu_utils_reset_cause(REBOOT_CAUSE_APPLICATION_SYSRESETREQ);\r
- hal_reboot_chip();\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_fs_test(uint8_t *para, uint32_t para_len)\r
-{\r
- test_file_system(para, para_len);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_os_heap_info(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-#if LOSCFG_MEM_TASK_STAT && defined __LITEOS__\r
- LosMemPoolInfo *heapMan = (LosMemPoolInfo*)OS_EXTEND_MEM_ADDR;\r
- TSK_INFO_S task_info;\r
- uint32_t taskId;\r
-\r
- wstp_print("\r\n");\r
- OsMemInfoPrint(OS_EXTEND_MEM_ADDR);\r
- wstp_print("\n\t\tstack name task id used size peak size\n");\r
- for (taskId = 0; taskId <= LOSCFG_BASE_CORE_TSK_LIMIT; taskId++) {\r
- if (0 != LOS_TaskInfoGet(taskId, &task_info)) {\r
- // 过滤掉无用的task id\r
- continue;\r
- }\r
- wstp_print("%22s %-5d 0x%-8x 0x%-8x\n", task_info.acName, taskId,\r
- heapMan->stat.taskMemstats[taskId].memUsed, heapMan->stat.taskMemstats[taskId].memPeak);\r
- }\r
- wstp_print("\r\n\r\n");\r
-\r
- heapMan = (LosMemPoolInfo*)OS_SYS_MEM_ADDR;\r
- OsMemInfoPrint(OS_SYS_MEM_ADDR);\r
- wstp_print("\n\t\tstack name task id used size peak size\n");\r
- for (taskId = 0; taskId <= LOSCFG_BASE_CORE_TSK_LIMIT; taskId++) {\r
- if (0 != LOS_TaskInfoGet(taskId, &task_info)) {\r
- // 过滤掉无用的task id\r
- continue;\r
- }\r
- wstp_print("%22s %-5d 0x%-8x 0x%-8x\n", task_info.acName, taskId,\r
- heapMan->stat.taskMemstats[taskId].memUsed, heapMan->stat.taskMemstats[taskId].memPeak);\r
- }\r
- wstp_print("\r\n");\r
-\r
-#endif\r
-#if defined __FREERTOS__ && defined FREERTOS_DEBUG\r
- freertos_heap_print();\r
-#endif\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_os_stack_info(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-\r
-#if LOSCFG_MEM_TASK_STAT && defined __LITEOS__\r
- TSK_INFO_S task_info;\r
- uint32_t taskId;\r
- uint32_t total_size = 0;\r
- uint32_t used_size = 0;\r
- uint32_t peak_size = 0;\r
-\r
- wstp_print("\n stack name task id prio status stack addr total size used size peak size percentage\n"\r
- " -------------- ------- --- ------ --------- -------- -------- --------\n");\r
- for (taskId = 0; taskId <= LOSCFG_BASE_CORE_TSK_LIMIT; taskId++) {\r
- if (0 != LOS_TaskInfoGet(taskId, &task_info)) {\r
- continue;\r
- }\r
- wstp_print("%22s %-5d %-2d %-2d %-10p 0x%-8x 0x%-8x 0x%-8x %.02f\n", task_info.acName,\r
- task_info.uwTaskID, task_info.usTaskPrio, task_info.usTaskStatus, task_info.uwTopOfStack,\r
- task_info.uwStackSize, task_info.uwCurrUsed, task_info.uwPeakUsed, (task_info.uwCurrUsed*1.0f/task_info.uwStackSize));\r
- total_size += task_info.uwStackSize;\r
- used_size += task_info.uwCurrUsed;\r
- peak_size += task_info.uwPeakUsed;\r
- }\r
- wstp_print("\n total size(%d) used size(%d) peak size(%d)\n",total_size,used_size,peak_size);\r
-#endif\r
-\r
-#if defined __FREERTOS__ && defined FREERTOS_DEBUG\r
- vTaskInfoPrint();\r
-#endif\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_fs_format(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
- int ret, i;\r
-\r
- /* 解决后台文件打开导致格式化失败的问题,先关闭可能打开的后台文件*/\r
- for (i = 0; i < FILE_MAX_NUM; i++) {\r
- close(i);\r
- }\r
- /* 如果离线日志打开,则关闭离线日志 */\r
- uapi_zdiag_set_offline_log_enable(false);\r
-\r
-#ifdef CFG_DRIVERS_MMC\r
- wstp_print("\r\nemmc format,wait a moment!\r\n");\r
- ret = emmc_drv_format();\r
- if (ret != ENOERR) {\r
- ret = ERRCODE_FAIL;\r
- } else {\r
- ret = ERRCODE_SUCC;\r
- }\r
-#endif\r
-\r
-#ifdef CFG_DRIVERS_NANDFLASH\r
- wstp_print("\r\nnandflash format,wait a moment!\r\n");\r
- nandflash_yaffs_format();\r
- ret = ERRCODE_SUCC;\r
-#endif\r
-\r
- return ret;\r
-}\r
-\r
-static uint32_t mcu_fs_rw_test(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-\r
- uint8_t *ptr = NULL;\r
- int ret;\r
- char path[] = "/user/user_test.log";\r
- FILE *fp = NULL;\r
-\r
- fp = fopen(path, "w+");\r
- if (fp == NULL) {\r
- wstp_print("open fail\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
- ret = test_libc_rw(fp);\r
- fclose(fp);\r
- remove(path);\r
-\r
- return ret;\r
-}\r
-\r
-static uint32_t mcu_fs_set_clk(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-#ifdef CFG_DRIVERS_MMC\r
- char *ptr = (char*)para;\r
- uint8_t mode = 0;\r
- struct hci_softc *sc;\r
- if (para == NULL) {\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- mode = (uint8_t)strtoul(ptr, NULL, 0);\r
- sc = get_mmc_resource(0);\r
- if (mode == 0) {\r
- wstp_print("set emmc clk to 98M!!!\r\n");\r
- mmc_set_clock_with_way2(sc, SDIOM_SRC_CLK_FREQ_LVL_98M_VAL);\r
- g_app_emmc_clk = SDIOM_SRC_CLK_FREQ_LVL_98M_VAL;\r
- } else if (mode == 1) {\r
- wstp_print("set emmc clk to 32M!!!\r\n");\r
- mmc_set_clock_with_way2(sc, SDIOM_SRC_CLK_LOW_FREQ_VAL);\r
- g_app_emmc_clk = SDIOM_SRC_CLK_LOW_FREQ_VAL;\r
- } else {\r
- wstp_print("Input para Error!!!\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
-#endif\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_fs_read_clk(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-#ifdef CFG_DRIVERS_MMC\r
- wstp_print("\r\nclock:%d", g_app_emmc_clk);\r
-#endif\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_fs_check(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- char *ptr = (char *)para;\r
- uint32_t FileSize = 0;\r
- uint32_t times;\r
- uint32_t len;\r
- char FilePath[MAX_FILE_PATH_SIZE] = "/user/";\r
- FILE *fp = NULL;\r
-\r
- if (para_len == 0) {\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- ptr++;\r
- if (memcpy_s(FilePath + strlen(FilePath), (MAX_FILE_PATH_SIZE - strlen(FilePath) - 1), ptr,\r
- (strchr(ptr, '"') - ptr)) != EOK) {\r
- wstp_print("memcpy ERR!,The file path is too long,\\r
- the total length of the file path should be less than %d\r\n", MAX_FILE_PATH_SIZE);\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- ptr += (strchr(ptr, '"') - ptr);\r
- ptr += TEST_PARA_2;\r
- FileSize = strtoul(ptr, NULL, 0);\r
- if (FileSize > FS_TEST_1M_BYTES) { FileSize = FS_TEST_1M_BYTES; }\r
- times = (FileSize / BYTES_LEN_4K) ? (FileSize / BYTES_LEN_4K) : 1;\r
-\r
- fp = fopen(FilePath, "r");\r
- if (fp == NULL) {\r
- wstp_print("open fail!path:%s\r\n", FilePath);\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- len = test_libc_read(fp, times);\r
- fclose(fp);\r
- if (len == times * BYTES_LEN_4K) {\r
- return ERRCODE_SUCC;\r
- } else {\r
- return ERRCODE_FAIL;\r
- }\r
-}\r
-\r
-\r
-static int32_t rm_dir(const char *pathname)\r
-{\r
- struct dirent *dirent = NULL;\r
- struct stat stat_info;\r
- DIR *d = NULL;\r
- char *fullpath = NULL;\r
- int ret;\r
-\r
- (void)memset_s(&stat_info, sizeof(stat_info), 0, sizeof(struct stat));\r
- if (stat(pathname, &stat_info) != 0) {\r
- wstp_print("read file info fail! %s, err=%d\n", pathname, get_errno());\r
- return -1;\r
- }\r
-\r
- if (S_ISREG(stat_info.st_mode)) {\r
- wstp_print("rm path: %s \n", pathname);\r
- return unlink(pathname);\r
- }\r
- d = opendir(pathname);\r
- while (1) {\r
- dirent = readdir(d);\r
- if (dirent == NULL) {\r
- break;\r
- }\r
- if (strcmp(dirent->d_name, "..") && strcmp(dirent->d_name, ".")) {\r
- size_t fullpathBufSize = strlen(pathname) + strlen(dirent->d_name) + 2; // 2 is sep eof length\r
- fullpath = (char *)malloc(fullpathBufSize);\r
- if (fullpath == NULL) {\r
- wstp_print("malloc failure!\n");\r
- (void)closedir(d);\r
- return -1;\r
- }\r
- ret = snprintf_s(fullpath, fullpathBufSize, fullpathBufSize - 1, "%s/%s", pathname, dirent->d_name);\r
- if (ret < 0) {\r
- wstp_print("name is too long!\n");\r
- free(fullpath);\r
- (void)closedir(d);\r
- return -1;\r
- }\r
- (void)rm_dir(fullpath);\r
- free(fullpath);\r
- }\r
- }\r
- (void)closedir(d);\r
- return rmdir(pathname);\r
-}\r
-\r
-static uint32_t mcu_fs_rm(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- if (para_len == 0) {\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- char *ptr = (char *)para;\r
- char file_path[MAX_FILE_PATH_SIZE] = "";\r
-\r
- ptr++;\r
- if (memcpy_s(file_path + strlen(file_path), (MAX_FILE_PATH_SIZE - strlen(file_path) - 1), ptr,\r
- (strchr(ptr, '"') - ptr)) != EOK) {\r
- wstp_print("memcpy ERR!,The file path is %s, max len is %d\r\n", para, MAX_FILE_PATH_SIZE);\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- wstp_print("excute rm path:%s\r\n", file_path);\r
- if (rm_dir(file_path) >= 0) {\r
- return ERRCODE_SUCC;\r
- } else {\r
- return ERRCODE_FAIL;\r
- }\r
-}\r
-\r
-static uint32_t mcu_get_wstp_version(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- char str[VER_STR_MAX];\r
-#if (defined BUILD_TIME) && (defined TARGET_NAME)\r
- (void)sprintf_s(str, VER_STR_MAX, "\r\nVersion:%s %s %s\r\n",\r
- get_version_string(), TARGET_NAME, BUILD_TIME);\r
-#else\r
- (void)sprintf_s(str, VER_STR_MAX, "\r\nVersion:%s\r\n", get_version_string());\r
-#endif\r
- wstp_print(str);\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_fs_write(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- char *ptr = (char *)para;\r
- uint32_t FileSize = 0;\r
- uint32_t times;\r
- uint32_t len;\r
- char FilePath[MAX_FILE_PATH_SIZE] = "/user/";\r
-\r
- if (para_len == 0) {\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- ptr++;\r
- if (memcpy_s(FilePath + strlen(FilePath), (MAX_FILE_PATH_SIZE - strlen(FilePath) - 1), ptr,\r
- (strchr(ptr, '"') - ptr)) != EOK) {\r
- wstp_print("memcpy ERR!,The file path is too long,\\r
- the total length of the file path should be less than %d\r\n", MAX_FILE_PATH_SIZE);\r
- return ERRCODE_FAIL;\r
- }\r
- ptr += (strchr(ptr, '"') - ptr);\r
- ptr += TEST_PARA_2;\r
- FileSize = strtoul(ptr, NULL, 0);\r
- remove(FilePath);\r
- if (FileSize > FS_TEST_1M_BYTES) { FileSize = FS_TEST_1M_BYTES; }\r
- times = (FileSize / BYTES_LEN_4K) ? (FileSize / BYTES_LEN_4K) : 1;\r
-\r
- FILE *fp = NULL;\r
- fp = fopen(FilePath, "w+");\r
- if (fp == NULL) {\r
- wstp_print("open fail!path:%s\r\n", FilePath);\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- len = test_libc_write(fp, times);\r
- fclose(fp);\r
- if (len == times * BYTES_LEN_4K) {\r
- return ERRCODE_SUCC;\r
- } else {\r
- return ERRCODE_FAIL;\r
- }\r
-}\r
-\r
-#if (CONFIG_DFX_SUPPORT_OFFLINE_LOG_FILE == DFX_YES)\r
-static uint32_t mcu_init_logfile(uint8_t *para, store_file_cfg_t *cfg, uint32_t *arr, uint32_t arr_len)\r
-{\r
- char *ptr = (char *)para;\r
- char *ptr_end = NULL;\r
-\r
- if (strtoul(ptr, &ptr_end, 0) <= 0) {\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- for (uint32_t j = 0; j < arr_len; j++) {\r
- arr[j] = strtoul(ptr, &ptr_end, 0);\r
- ptr = ptr_end + 1;\r
- }\r
-\r
- uint32_t clear_flag = 0;\r
- uint32_t i = 0;\r
-\r
- cfg->mult_files = arr[i++];\r
- cfg->file_size = arr[i++];\r
- cfg->enable_cache = arr[i++];\r
- cfg->cache_size = arr[i++];\r
- i++;\r
- clear_flag = arr[i];\r
- cfg->path = "/user/test/";\r
- cfg->name = "log_file_write_0222.bin";\r
- wstp_print("mult_files = %d, file_size = %d, enable_cache = %d, cache_size = %d clear_flag = %d\r\n",\r
- cfg->mult_files, cfg->file_size, cfg->enable_cache, cfg->cache_size, clear_flag);\r
-\r
- errcode_t ret = uapi_logfile_init();\r
- if (ret != ERRCODE_SUCC) {\r
- wstp_print("init logfile %s failed.\r\n", cfg->name);\r
- return ERRCODE_FAIL;\r
- }\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_clear_logfile_dir(store_file_cfg_t *cfg)\r
-{\r
- static uint8_t full_path[MAX_FILE_PATH_LEN] = {0};\r
- struct dirent *pdirent = NULL;\r
- DIR *d = NULL;\r
- uint32_t ret = ERRCODE_SUCC;\r
-\r
- d = opendir(cfg->path);\r
- if (d == NULL) {\r
- if (mkdir(cfg->path, S_IREAD | S_IWRITE) != 0) {\r
- wstp_print("mkdir %s failed!\r\n", cfg->path);\r
- ret = ERRCODE_FAIL;\r
- }\r
- } else {\r
- do {\r
- pdirent = readdir(d);\r
- if (pdirent == NULL) {\r
- break;\r
- }\r
- wstp_print("file_dir clear start!\r\n");\r
- if (strncpy_s((char *)full_path, MAX_FILE_PATH_LEN, cfg->path, strlen(cfg->path)) != EOK) {\r
- ret = ERRCODE_FAIL;\r
- break;\r
- }\r
- if (strcat_s((char *)full_path, MAX_FILE_PATH_LEN, pdirent->d_name) != EOK) {\r
- ret = ERRCODE_FAIL;\r
- break;\r
- }\r
- if (remove((char *)full_path) != 0) {\r
- wstp_print("remove %s failed!\r\n", full_path);\r
- ret = ERRCODE_FAIL;\r
- break;\r
- }\r
- } while (pdirent != NULL);\r
- }\r
- (void)closedir(d);\r
- return ret;\r
-}\r
-#endif /* CONFIG_DFX_SUPPORT_OFFLINE_LOG_FILE */\r
-\r
-static uint32_t mcu_logfile_write(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-#if (CONFIG_DFX_SUPPORT_OFFLINE_LOG_FILE == DFX_YES)\r
- wstp_print("logfile test start!\r\n");\r
- char test_msg[TEST_MSG_MAX_SIZE] = {0};\r
- #define TEST_NUM_ID 4\r
- /*\r
- arg[0] -- multi_num\r
- arg[1] -- file_size\r
- arg[2] -- enable_cache\r
- arg[3] -- cache_size\r
- arg[4] -- test timer\r
- arg[5] -- clear flag\r
- */\r
- uint32_t arg[LOG_FILE_ARG_NUM] = {0};\r
- store_file_cfg_t cfg = {0};\r
-\r
- if (mcu_init_logfile(para, &cfg, arg, LOG_FILE_ARG_NUM) != ERRCODE_SUCC) {\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- if (arg[LOG_FILE_ARG_NUM - 1] != 0) { /* arg[5] -- clear flag */\r
- if (mcu_clear_logfile_dir(&cfg) != ERRCODE_SUCC) {\r
- wstp_print("clear file_dir error!\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
- }\r
-\r
- errcode_t ret = uapi_logfile_open(STORE_DIAG, &cfg);\r
- if (ret != ERRCODE_SUCC) {\r
- wstp_print("open log_file %s failed.\r\n", cfg.name);\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- for (uint32_t i = 0; i < arg[TEST_NUM_ID]; i++) { /* arg[2] -- test timer */\r
- (void)memset_s(test_msg, sizeof(test_msg), 0, sizeof(test_msg));\r
- if (sprintf_s(test_msg, sizeof(test_msg), "abcdef%10d", i + 1) < 0) {\r
- wstp_print("sprintf_s failed.\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
- ret = uapi_logfile_write(STORE_DIAG, 0, (uint8_t*)&test_msg, strlen(test_msg));\r
- if (ret != ERRCODE_SUCC) {\r
- wstp_print("write logfile failed.\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
- dfx_sleep(10); /* 10 : sleep 10ms */\r
- }\r
-\r
- ret = uapi_logfile_close(STORE_DIAG);\r
- if (ret != ERRCODE_SUCC) {\r
- wstp_print("close logfile %s failed.\r\n", cfg.name);\r
- return ERRCODE_FAIL;\r
- }\r
-#endif /* CONFIG_DFX_SUPPORT_OFFLINE_LOG_FILE */\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_test_dtcm_baudwidth(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
- uint64_t start_time, end_time;\r
- uint32_t total_time;\r
- uint32_t bw;\r
-\r
- char *test_buf = (char*)(APP_DTCM_ORIGIN + DTCM_RAM_OFF);\r
- uint32_t irq_sts = osal_irq_lock();\r
- start_time = uapi_tcxo_get_us();\r
- if (memcpy_s(test_buf, BUFF_LEN_48K, APP_DTCM_ORIGIN, BUFF_LEN_48K) != 0) {\r
- wstp_print("[dctm mem test]dtcm read memcpy_s fail.\r\n");\r
- }\r
- end_time = uapi_tcxo_get_us();\r
- osal_irq_restore(irq_sts);\r
- total_time = (uint32_t)(end_time - start_time);\r
- bw = (ONE_SECOND / total_time) * BUFF_LEN_48K / (MB_SIZE);\r
- wstp_print("[dctm mem test]dtcm read time:%dus bw:%dMB/s\r\n", total_time, bw);\r
-\r
- irq_sts = osal_irq_lock();\r
- start_time = uapi_tcxo_get_us();\r
- if (memcpy_s(test_buf, BUFF_LEN_48K, APP_DTCM_ORIGIN, BUFF_LEN_48K) != 0) {\r
- wstp_print("[dctm mem test]dtcm write memcpy_s fail.\r\n");\r
- }\r
- end_time = uapi_tcxo_get_us();\r
- osal_irq_restore(irq_sts);\r
- total_time = (uint32_t)(end_time - start_time);\r
- bw = (ONE_SECOND / total_time) * BUFF_LEN_48K / (MB_SIZE);\r
- wstp_print("[dctm mem test]dtcm write time:%dus bw:%dMB/s\r\n", total_time, bw);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_test_l2m_baudwidth(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
- uint64_t start_time, end_time;\r
- uint32_t total_time;\r
- uint32_t bw;\r
-\r
-#if DSP_L2RAM_AREA_SIZE == 8\r
- char* l2m_ptr = (char*)(&__l2m_dsp_data_end);\r
-#else\r
- char* l2m_ptr = (char*)(&__l2m_gpu_data_end);\r
-#endif\r
- char *test_buf = (char*)(APP_DTCM_ORIGIN + DTCM_RAM_OFF);\r
- uint32_t irq_sts = osal_irq_lock();\r
- start_time = uapi_tcxo_get_us();\r
- if (memcpy_s(test_buf, BUFF_LEN_48K, l2m_ptr, BUFF_LEN_48K) != 0) {\r
- wstp_print("[l2ram mem test]l2ram read memcpy_s fail.\r\n");\r
- }\r
- end_time = uapi_tcxo_get_us();\r
- osal_irq_restore(irq_sts);\r
- total_time = end_time - start_time;\r
- bw = (ONE_SECOND / total_time) * BUFF_LEN_48K / (MB_SIZE);\r
- wstp_print("[l2m mem test]l2m read time:%dus bw:%dMB/s\r\n", total_time, bw);\r
-\r
- irq_sts = osal_irq_lock();\r
- start_time = uapi_tcxo_get_us();\r
- if (memcpy_s(l2m_ptr, BUFF_LEN_48K, test_buf, BUFF_LEN_48K) != 0) {\r
- wstp_print("[l2ram mem test]l2ram write memcpy_s fail.\r\n");\r
- }\r
- end_time = uapi_tcxo_get_us();\r
- osal_irq_restore(irq_sts);\r
- total_time = end_time - start_time;\r
- bw = (ONE_SECOND / total_time) * BUFF_LEN_48K / (MB_SIZE);\r
- wstp_print("[l2m mem test]l2m write time:%dus bw:%dMB/s\r\n", total_time, bw);\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_test_mmc_baudwidth(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-#ifdef CFG_DRIVERS_MMC\r
- char* path = "/user/test_spped.bin";\r
- wstp_print("emmc fs bw test start!please wait...\r\n");\r
- fs_test_rw_speed(path, BYTES_LEN_128);\r
- fs_test_rw_speed(path, BYTES_LEN_512);\r
- fs_test_rw_speed(path, BYTES_LEN_1K);\r
- fs_test_rw_speed(path, BYTES_LEN_4K);\r
- fs_test_rw_speed(path, BYTES_LEN_8K);\r
-#else\r
- wstp_print("[emmc mem test]The current version does not support EMMC.\r\n");\r
-#endif\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_test_psram_baudwidth(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
- uint64_t start_time, end_time;\r
- uint32_t total_time;\r
- uint32_t bw;\r
-\r
-#ifdef CONFIG_PSRAM_SUPPORT\r
- char *test_buf = (char*)malloc(BUFF_LEN_48K);\r
- if (test_buf == NULL) {\r
- wstp_print("[psram mem test]buf malloc fail!\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
- char *test_buf1 = (char*)(APP_DTCM_ORIGIN + DTCM_RAM_OFF);\r
-\r
- uint32_t irq_sts = osal_irq_lock();\r
- start_time = uapi_tcxo_get_us();\r
- if (memcpy_s(test_buf1, BUFF_LEN_48K, test_buf, BUFF_LEN_48K) != 0) {\r
- wstp_print("[psram mem test]psram read memcpy_s fail.\r\n");\r
- }\r
- end_time = uapi_tcxo_get_us();\r
- osal_irq_restore(irq_sts);\r
- total_time = (uint32_t)(end_time - start_time) - TCXO_ERROR;\r
- bw = ONE_SECOND / total_time * BUFF_LEN_48K / MB_SIZE;\r
- wstp_print("[psram mem test]psram read time:%dus bw:%dMB/s\r\n", total_time, bw);\r
-\r
- irq_sts = osal_irq_lock();\r
- start_time = uapi_tcxo_get_us();\r
- if (memcpy_s(test_buf, BUFF_LEN_48K, test_buf1, BUFF_LEN_48K) != 0) {\r
- wstp_print("[psram mem test]psram write memcpy_s fail.\r\n");\r
- }\r
- end_time = uapi_tcxo_get_us();\r
- osal_irq_restore(irq_sts);\r
- total_time = (uint32_t)(end_time - start_time) - TCXO_ERROR;\r
- bw = (ONE_SECOND / total_time) * BUFF_LEN_48K / (MB_SIZE);\r
- wstp_print("[psram mem test]psram write time:%dus bw:%dMB/s\r\n", total_time, bw);\r
- free(test_buf);\r
-#else\r
- wstp_print("[psram mem test]The current version does not support PSRAM.\r\n");\r
-#endif\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_test_norflash_baudwidth(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
- uint64_t start_time, end_time;\r
- uint32_t total_time;\r
- uint32_t bw;\r
-\r
- char *test_buf = (char*)(APP_DTCM_ORIGIN + DTCM_RAM_OFF);\r
- uint32_t irq_sts = osal_irq_lock();\r
- start_time = uapi_tcxo_get_us();\r
- if (memcpy_s(test_buf, BUFF_LEN_48K, FLASH_RESERVED_ADDR, BUFF_LEN_48K) != 0) {\r
- wstp_print("[norflash mem test]norflash read memcpy_s fail.\r\n");\r
- }\r
- end_time = uapi_tcxo_get_us();\r
- osal_irq_restore(irq_sts);\r
- total_time = (uint32_t)(end_time - start_time);\r
- bw = (ONE_SECOND / total_time) * BUFF_LEN_48K / (MB_SIZE);\r
- wstp_print("[norflash mem test]nor flash read time:%dus bw:%dMB/s\r\n", total_time, bw);\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_test_nandflash_baudwidth(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-#ifdef CFG_DRIVERS_NANDFLASH\r
- char* path = "/user/test_spped.bin";\r
- wstp_print("nandflash fs bw test start!please wait...\r\n");\r
- fs_test_rw_speed(path, BYTES_LEN_128);\r
- fs_test_rw_speed(path, BYTES_LEN_512);\r
- fs_test_rw_speed(path, BYTES_LEN_1K);\r
- fs_test_rw_speed(path, BYTES_LEN_4K);\r
- fs_test_rw_speed(path, BYTES_LEN_8K);\r
-#else\r
- wstp_print("[nandflash mem test]The current version does not support nandflash.\r\n");\r
-#endif\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_get_fs_info(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
- int i;\r
- struct statfs file_buf = {0};\r
-\r
- for (i = 0; i < FS_VOLUMES_NUM; i++) {\r
- /* 获取文件系统状态 */\r
- if (statfs(g_volume_names[i], &file_buf) != 0) {\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- if (file_buf.f_bfree >= FS_NODE_INFO_SPACE) {\r
- file_buf.f_bfree = file_buf.f_bfree - FS_NODE_INFO_SPACE;\r
- } else {\r
- file_buf.f_bfree = 0;\r
- }\r
-\r
- wstp_print("[FS INFO]%s:\r\n", g_volume_names[i]);\r
- wstp_print("[FS INFO]total size=%uKB used size=%uKB free size=%uKB\r\n",\r
- ((uint32_t)(file_buf.f_blocks * file_buf.f_bsize) / KB_SIZE),\r
- ((uint32_t)((file_buf.f_blocks - file_buf.f_bfree) * file_buf.f_bsize) / KB_SIZE),\r
- ((uint32_t)(file_buf.f_bfree * file_buf.f_bsize) / KB_SIZE));\r
- }\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static void pm_lcd_on_pre_handle(void)\r
-{\r
- display_resume_power_on();\r
-#ifdef QSPI_DISPLAY\r
- writew(0x5700c058, 0x0); // sagpio_l22 set gpio mode\r
-#else\r
- writew(0x5700c058, 0x1); // sagpio_l22 set te mode\r
-#endif\r
- writew(0x5700c658, 0x2); // sagpio_l22 open ie\r
-#ifndef QSPI_DISPLAY\r
- pmu_ldo_power_on(PMU_LDO_AUXLDO3, TURN_ON);\r
-#endif\r
-}\r
-\r
-uint32_t mcu_pm_lcd_on(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-#ifdef SUPPORT_POWER_MANAGER\r
- const power_display_svr_api_t *display_api = power_display_svr_get_api();\r
- return display_api->turn_on_screen();\r
-#endif\r
- uapi_pm_request_mode(PM_ID_VIDEO, PM_MODE_PERFORMACE);\r
-\r
- if (lcd_get_status()) {\r
- wstp_print("\r\nLCD has benn on\r\n");\r
- return ERRCODE_SUCC;\r
- }\r
- pm_lcd_on_pre_handle();\r
- lcd_bus_api *bus_api = lcd_get_bus_api();\r
- ext_errno ret = bus_api->bus_resume();\r
- if (ret != 0) {\r
- wstp_print("bus resume error ret=%x\r\n", ret);\r
- return ERRCODE_FAIL;\r
- }\r
-#ifndef QSPI_DISPLAY\r
- if (g_dpu_ready_flag == false) {\r
- ret = drv_dpu_resume(NULL);\r
- if (ret != 0) {\r
- wstp_print("drv dpu resume error ret=%x\r\n", ret);\r
- return ERRCODE_FAIL;\r
- }\r
- }\r
-#endif\r
-#ifdef SUPPORT_GPU_JPEG\r
- (void)drv_jpeg_resume(NULL);\r
-#endif\r
- ret = drv_vau_resume(NULL);\r
- if (ret != 0) {\r
- wstp_print("drv vau resume error ret=%x\r\n", ret);\r
- return ERRCODE_FAIL;\r
- }\r
- ret = uapi_lcd_init();\r
- if (ret != 0 && ret != EXT_ERR_MIPI_ALREADY_INIT) {\r
- wstp_print("LCD init error ret=%x\r\n", ret);\r
- return ERRCODE_FAIL;\r
- }\r
-#if defined(ENABLE_UIKIT) || defined(ENABLE_LVGL)\r
- NotifyScreenOn(); // Instruct the uikit to start the display operation.\r
-#endif\r
- if (g_dpu_ready_flag == false) {\r
- touch_screen_resume(); // open touch\r
- }\r
-#ifdef CONFIG_CLDO1PD_SUPPORT\r
- pmu_control_cldo1_sleep_bypass(TURN_ON);\r
-#endif\r
- lcd_set_status(true);\r
- return ERRCODE_SUCC;\r
-}\r
-uint32_t mcu_pm_into_ship_mode(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
- uapi_sys_shipmode(0);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_pm_into_force_ds_mode(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-\r
- set_cpu_utils_reset_cause(REBOOT_CAUSE_APPLICATION_SYSRESETREQ);\r
- writew(0x5702C010, 0x5A5A);\r
- hal_reboot_chip();\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_pm_req_mode(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
-\r
- if (strcmp((char*)para, "lp") == 0) {\r
- errcode_t ret = uapi_pm_request_mode(g_pm_req_mode_usr, PM_MODE_LP);\r
- wstp_print("pm requst mode user 0x%x reuest mode lp, ret 0x%x.\r\n", g_pm_req_mode_usr, ret);\r
- } else if (strcmp((char*)para, "performace") == 0) {\r
- errcode_t ret = uapi_pm_request_mode(g_pm_req_mode_usr, PM_MODE_PERFORMACE);\r
- wstp_print("pm requst mode user 0x%x reuest mode perfermance, ret 0x%x.\r\n", g_pm_req_mode_usr, ret);\r
- } else if (strcmp((char*)para, "normal") == 0) {\r
- errcode_t ret = uapi_pm_request_mode(g_pm_req_mode_usr, PM_MODE_NORMAL);\r
- wstp_print("pm requst mode user 0x%x reuest mode normal, ret 0x%x.\r\n", g_pm_req_mode_usr, ret);\r
- } else if (strcmp((char*)para, "clean") == 0) {\r
- for (pm_id_t i = 0; i < PM_ID_MAX; i++) {\r
- uapi_pm_request_mode(i, PM_MODE_LP);\r
- }\r
- wstp_print("pm mode back to lp mode for all users.\r\n");\r
- } else {\r
- wstp_print("pm request mode is not supported.\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_set_pm_req_mode_usr(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- uint8_t pm_id = *(char*)para - '0';\r
-\r
- if (pm_id >= PM_ID_MAX) {\r
- wstp_print("pm requst mode user 0x%x check fail.\r\n", pm_id);\r
- return ERRCODE_FAIL;\r
- }\r
- g_pm_req_mode_usr = (pm_id_t)pm_id;\r
-\r
- wstp_print("pm requst mode user 0x%x reuest mode.\r\n", g_pm_req_mode_usr);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static void pm_print_veto_info(void)\r
-{\r
- uint8_t i = 0;\r
- pm_veto_t *pm_veto_ptr = pm_veto_get_info();\r
- wstp_print("last_veto_id=%d, last_veto_lr=%x, veto_timeout_timestamp=%llu, total_counts=%d\r\n",\r
- pm_veto_ptr->last_veto_id, pm_veto_ptr->last_veto_lr, pm_veto_ptr->veto_timeout_timestamp,\r
- pm_veto_ptr->veto_counts.total_counts);\r
- for (i = 0; i < PM_ID_MAX; i++) {\r
- // wstp_print("sub_counts[%d] = %d\r\n", i, pm_veto_ptr->veto_counts.sub_counts[i]);\r
- wstp_print("sub_counts[%d] %s = %d\r\n", i,get_pm_id_name(i), pm_veto_ptr->veto_counts.sub_counts[i]);\r
- }\r
-}\r
-\r
-static void pm_print_active_veto_info(void)\r
-{\r
- uint8_t i = 0;\r
- uint8_t active_count = 0;\r
- pm_veto_t *pm_veto_ptr = pm_veto_get_info();\r
- \r
- wstp_print("========== PM Active Veto Info ==========\r\n");\r
- wstp_print("Total votes: %d\r\n", pm_veto_ptr->veto_counts.total_counts);\r
- \r
- if (pm_veto_ptr->veto_counts.total_counts == 0) {\r
- wstp_print("No active votes.\r\n");\r
- } else {\r
- wstp_print("Active votes:\r\n");\r
- for (i = 0; i < PM_ID_MAX; i++) {\r
- if (pm_veto_ptr->veto_counts.sub_counts[i] > 0) {\r
- wstp_print(" [%d] %s: %d vote(s)\r\n", \r
- i, \r
- get_pm_id_name(i), \r
- pm_veto_ptr->veto_counts.sub_counts[i]);\r
- active_count++;\r
- }\r
- }\r
- wstp_print("Total active modules: %d\r\n", active_count);\r
- }\r
- \r
- if (pm_veto_ptr->veto_timeout_timestamp > 0) {\r
- wstp_print("Veto timeout timestamp: %llu ms\r\n", pm_veto_ptr->veto_timeout_timestamp);\r
- }\r
- \r
- wstp_print("========================================\r\n");\r
-}\r
-\r
-static void lpc_print_veto_info(void)\r
-{\r
- uint8_t i = 0;\r
- volatile lpc_veto_type *lpc_veto_ptr = lpc_get_sys_sleep_veto();\r
- wstp_print("g_lpc_mcpu_i2c_sleep_vetos=%d\r\n", lpc_get_mcpu_i2c_sleep_veto());\r
- for (i = 0; i < LPC_ID_MAX; i++) {\r
- wstp_print("i=%d, lpc_sleep_vetos=%d, lr_pointer=%x\r\n",\r
- i, lpc_veto_ptr[i].lpc_sleep_vetos, lpc_veto_ptr[i].lr_pointer);\r
- }\r
-}\r
-\r
-uint32_t mcu_pm_dfx_mode(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-\r
- uapi_get_current_pm_mode_info();\r
- pm_print_veto_info();\r
- lpc_print_veto_info();\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_pm_veto_get(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-\r
- pm_print_active_veto_info();\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_task_switch_print_ctrl(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- \r
- if (para == NULL) {\r
- wstp_print("Usage: AT^TASKSWITCHPRINT=<0|1>\r\n");\r
- wstp_print(" 0: Disable task switch print\r\n");\r
- wstp_print(" 1: Enable task switch print\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- uint32_t enable = atoi((char*)para);\r
- \r
- extern void OsTaskSwitchPrintSetEnable(uint32_t enable);\r
- OsTaskSwitchPrintSetEnable(enable);\r
- \r
- wstp_print("Task switch print %s\r\n", enable ? "enabled" : "disabled");\r
- \r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_pm_cldo1_power_down(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
-\r
- if (strcmp((char*)para, "yes") == 0) {\r
- pmu_control_cldo1_sleep_bypass(TURN_OFF);\r
- wstp_print("pm request cldo1 power down at sleep.\r\n");\r
- } else if (strcmp((char*)para, "no") == 0) {\r
- pmu_control_cldo1_sleep_bypass(TURN_ON);\r
- wstp_print("pm request cldo1 power on at sleep.\r\n");\r
- } else {\r
- wstp_print("pm request cldo1 para is not supported.\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static void mcu_aes_get_password(uint32_t keyslot)\r
-{\r
- errcode_t ret;\r
- uapi_drv_klad_attr_t test_klad_attr = {\r
- .klad_cfg = {\r
- .rootkey_type = UAPI_DRV_KDF_HARD_KEY_TYPE_ABRK_REE,\r
- },\r
- .key_cfg = {\r
- .engine = UAPI_DRV_KLAD_ENGINE_AES,\r
- .decrypt_support = true,\r
- .encrypt_support = true,\r
- },\r
- };\r
- uapi_drv_klad_effective_key_t test_klad_key = {\r
- .kdf_hard_alg = UAPI_DRV_KDF_HARD_ALG_SHA256,\r
- .key_parity = false,\r
- .key_size = 16, // 16 固定的密钥长度\r
- .salt = (uint8_t *)g_decrypt_aes_salt,\r
- .salt_length = sizeof(g_decrypt_aes_salt),\r
- };\r
-\r
- uint32_t klad;\r
- ret = uapi_drv_klad_create(&klad);\r
- if (ret != ERRCODE_SUCC) {\r
- return;\r
- }\r
-\r
- ret = uapi_drv_klad_attach(klad, UAPI_DRV_KLAD_DEST_MCIPHER, keyslot);\r
- if (ret != ERRCODE_SUCC) {\r
- return;\r
- }\r
-\r
- ret = uapi_drv_klad_set_attr(klad, &test_klad_attr);\r
- if (ret != ERRCODE_SUCC) {\r
- (void)uapi_drv_klad_destroy(klad);\r
- return;\r
- }\r
-\r
- ret = uapi_drv_klad_set_effective_key(klad, &test_klad_key);\r
- if (ret != ERRCODE_SUCC) {\r
- (void)uapi_drv_klad_destroy(klad);\r
- return;\r
- }\r
-\r
- ret = uapi_drv_klad_detach(klad, UAPI_DRV_KLAD_DEST_MCIPHER, keyslot);\r
- if (ret != ERRCODE_SUCC) {\r
- wstp_print("[ERR] %d, %s (%d)\n", ret, __FUNCTION__, __LINE__);\r
- (void)uapi_drv_klad_destroy(klad);\r
- return;\r
- }\r
-\r
- (void)uapi_drv_klad_destroy(klad);\r
-}\r
-\r
-static errcode_t mcu_test_crypto_cipher_create(uint32_t *cipher, uint32_t *keyslot)\r
-{\r
- errcode_t ret;\r
- uapi_drv_cipher_symc_attr_t cipher_attr = {\r
- .symc_alg = UAPI_DRV_CIPHER_SYMC_ALG_AES,\r
- .work_mode = UAPI_DRV_CIPHER_SYMC_WORK_MODE_CBC,\r
- .symc_type = UAPI_DRV_CIPHER_SYMC_TYPE_NORMAL,\r
- .is_long_term = true\r
- };\r
-\r
- ret = uapi_drv_cipher_symc_create(cipher, &cipher_attr);\r
- if (ret != ERRCODE_SUCC) {\r
- return ret;\r
- }\r
-\r
- ret = uapi_drv_keyslot_create(keyslot, UAPI_DRV_KEYSLOT_TYPE_MCIPHER);\r
- if (ret != ERRCODE_SUCC) {\r
- goto cleanup0;\r
- }\r
-\r
- ret = uapi_drv_cipher_symc_attach(*cipher, *keyslot);\r
- if (ret != ERRCODE_SUCC) {\r
- goto cleanup1;\r
- }\r
-\r
- return ERRCODE_SUCC;\r
-\r
-cleanup1:\r
- (void)uapi_drv_keyslot_destroy(*keyslot);\r
-cleanup0:\r
- (void)uapi_drv_cipher_symc_destroy(*cipher);\r
-\r
- return ret;\r
-}\r
-\r
-static errcode_t mcu_aes_cipher_process(aes_cypto_t crypt, uint8_t *src, uint8_t *dst, uint32_t len)\r
-{\r
- errcode_t ret = ERRCODE_SUCC;\r
- uint32_t cipher = INVALID_HANDLE;\r
- uint32_t keyslot = INVALID_HANDLE;\r
- uapi_drv_cipher_buf_attr_t src_buf = { .phys_addr = src, .buf_sec = UAPI_DRV_CIPHER_BUF_NONSECURE, };\r
- uapi_drv_cipher_buf_attr_t dst_buf = { .phys_addr = dst, .buf_sec = UAPI_DRV_CIPHER_BUF_NONSECURE, };\r
-\r
- uapi_drv_cipher_symc_ctrl_t ctrl = {\r
- .symc_alg = UAPI_DRV_CIPHER_SYMC_ALG_AES,\r
- .work_mode = UAPI_DRV_CIPHER_SYMC_WORK_MODE_CBC,\r
- .symc_key_length = UAPI_DRV_CIPHER_SYMC_KEY_128BIT,\r
- .symc_bit_width = UAPI_DRV_CIPHER_SYMC_BIT_WIDTH_128BIT,\r
- .iv_change_flag = UAPI_DRV_CIPHER_SYMC_IV_CHANGE_ONE_PKG,\r
- .iv_length = sizeof(g_decrypt_aes_iv),\r
- };\r
-\r
- (void)memcpy_s(ctrl.iv, sizeof(ctrl.iv), g_decrypt_aes_iv, sizeof(g_decrypt_aes_iv));\r
-\r
- ret = mcu_test_crypto_cipher_create(&cipher, &keyslot);\r
- if (ret != ERRCODE_SUCC) {\r
- return ret;\r
- }\r
-\r
- ret = uapi_drv_cipher_symc_set_config(cipher, &ctrl);\r
- if (ret != ERRCODE_SUCC) {\r
- return ret;\r
- }\r
-\r
- mcu_aes_get_password(keyslot);\r
-\r
- if (crypt == AES_ENCRYPT_TEST) {\r
- ret = uapi_drv_cipher_symc_encrypt(cipher, &src_buf, &dst_buf, len);\r
- } else {\r
- ret = uapi_drv_cipher_symc_decrypt(cipher, &src_buf, &dst_buf, len);\r
- }\r
-\r
- (void)uapi_drv_cipher_symc_detach(cipher, keyslot);\r
- (void)uapi_drv_keyslot_destroy(keyslot);\r
- (void)uapi_drv_cipher_destroy(cipher);\r
- return ret;\r
-}\r
-\r
-uint32_t mcu_aes_decrypt_sample(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-\r
- uint32_t test_len = AES_SAMPLE_TEST_LEN;\r
- uint8_t *test_src_addr = (uint8_t*)malloc(sizeof(uint8_t) * AES_SAMPLE_TEST_LEN);\r
- if (test_src_addr == NULL) {\r
- return ERRCODE_FAIL;\r
- }\r
- uint8_t *test_dst_addr = (uint8_t*)malloc(sizeof(uint8_t) * AES_SAMPLE_TEST_LEN);\r
- if (test_dst_addr == NULL) {\r
- free(test_src_addr);\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- (void)memset_s(test_src_addr, AES_SAMPLE_TEST_LEN, 0, AES_SAMPLE_TEST_LEN);\r
- (void)memset_s(test_dst_addr, AES_SAMPLE_TEST_LEN, 0, AES_SAMPLE_TEST_LEN);\r
-\r
- wstp_print("mcu aes decrypt sample start.\r\n");\r
- for (uint32_t i = 0; i < AES_SAMPLE_TEST_LEN; i++) {\r
- test_src_addr[i] = g_decrypt_aes_decryp[i];\r
- }\r
- mcu_aes_cipher_process(AES_DECRYPT_TEST, test_src_addr, test_dst_addr, AES_SAMPLE_TEST_LEN);\r
- wstp_print("mcu aes decrypt result.\r\n");\r
- for (uint32_t i = 0; i < AES_SAMPLE_TEST_LEN; i++) {\r
- wstp_print("i=0x%x, src=0x%02x, dst=0x%02x\r\n", i, test_src_addr[i], test_dst_addr[i]);\r
- }\r
- wstp_print("mcu aes decrypt sample end.\r\n");\r
- free(test_src_addr);\r
- free(test_dst_addr);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_aes_encrypt_sample(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-\r
- uint32_t test_len = AES_SAMPLE_TEST_LEN;\r
- uint8_t *test_src_addr = (uint8_t*)malloc(sizeof(uint8_t) * AES_SAMPLE_TEST_LEN);\r
- if (test_src_addr == NULL) {\r
- return ERRCODE_FAIL;\r
- }\r
- uint8_t *test_dst_addr = (uint8_t*)malloc(sizeof(uint8_t) * AES_SAMPLE_TEST_LEN);\r
- if (test_dst_addr == NULL) {\r
- free(test_src_addr);\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- (void)memset_s(test_src_addr, AES_SAMPLE_TEST_LEN, 0, AES_SAMPLE_TEST_LEN);\r
- (void)memset_s(test_dst_addr, AES_SAMPLE_TEST_LEN, 0, AES_SAMPLE_TEST_LEN);\r
-\r
- wstp_print("mcu aes encrypt sample start.\r\n");\r
- for (uint32_t i = 0; i < AES_SAMPLE_TEST_LEN; i++) {\r
- test_src_addr[i] = g_decrypt_aes_encryp[i];\r
- }\r
- mcu_aes_cipher_process(AES_ENCRYPT_TEST, test_src_addr, test_dst_addr, AES_SAMPLE_TEST_LEN);\r
- wstp_print("mcu aes encrypt result.\r\n");\r
- for (uint32_t i = 0; i < AES_SAMPLE_TEST_LEN; i++) {\r
- wstp_print("i=0x%x, src=0x%02x, dst=0x%02x\r\n", i, test_src_addr[i], test_dst_addr[i]);\r
- }\r
- wstp_print("mcu aes encrypt sample end.\r\n");\r
- free(test_src_addr);\r
- free(test_dst_addr);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_aes_set_gid(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-\r
- uint8_t i;\r
- uint8_t security_key = 0;\r
- // After security_Key is set, GID cannot be configured and read.\r
- (void)uapi_efuse_read_bit(&security_key, OTP_DEBUG_FUSED, OTP_DEBUG_FUSED_SECURIY_KEY_EN_ACCESS_BIT);\r
- if (security_key == 0x1) {\r
- wstp_print("gid forbit read, because security_key is closed.\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- uint8_t *test_efuse_gid = (uint8_t*)malloc(sizeof(uint8_t) * OTP_SECURITY_KEY_GID_LEN);\r
- if (test_efuse_gid == NULL) {\r
- return ERRCODE_FAIL;\r
- }\r
- (void)memset_s(test_efuse_gid, OTP_SECURITY_KEY_GID_LEN, 0, OTP_SECURITY_KEY_GID_LEN);\r
- (void)uapi_efuse_read_buffer(test_efuse_gid, OTP_SECURITY_KEY_GID, OTP_SECURITY_KEY_GID_LEN);\r
- for (i = 0; i < OTP_SECURITY_KEY_GID_LEN; i++) {\r
- wstp_print("current gid[0x%02x] val[0x%02x]\r\n", i, test_efuse_gid[i]);\r
- }\r
- wstp_print("start write into efuse gid.\r\n");\r
- (void)uapi_efuse_write_buffer(OTP_SECURITY_KEY_GID, g_decrypt_aes_gid, OTP_SECURITY_KEY_GID_LEN);\r
- wstp_print("write into efuse gid completely.\r\n");\r
- (void)uapi_efuse_read_buffer(test_efuse_gid, OTP_SECURITY_KEY_GID, OTP_SECURITY_KEY_GID_LEN);\r
- for (i = 0; i < OTP_SECURITY_KEY_GID_LEN; i++) {\r
- wstp_print("write into gid[0x%02x] val[0x%02x]\r\n", i, test_efuse_gid[i]);\r
- }\r
- (void)uapi_efuse_write_bit(OTP_DEBUG_FUSED, OTP_DEBUG_FUSED_SECURIY_KEY_EN_ACCESS_BIT);\r
- wstp_print("gid read locked.\r\n");\r
- free(test_efuse_gid);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-#if defined(CONFIG_ADC_SUPPORT_AUTO_SCAN)\r
-#define ADC_SAMPLE_TIMES 10\r
-#define ADC_SAMPLE_DATA_LEN 10010\r
-uint32_t g_adc_sample_times = 0;\r
-uint32_t g_save_adc_index = 0;\r
-uint32_t *g_save_adc_data = NULL;\r
-static uint32_t adc_auto_sample_show_data(uint8_t *para, uint32_t para_len)\r
-{\r
- wstp_print("g_save_adc_index = %d\r\n", g_save_adc_index);\r
- for (uint32_t i = 0; i < g_save_adc_index; i++) {\r
- wstp_print("%d\r\n", g_save_adc_data[i]);\r
- }\r
-\r
- g_save_adc_index = 0;\r
- g_adc_sample_times = 0;\r
- free(g_save_adc_data);\r
- g_save_adc_data = NULL;\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static void adc_autosample_callback(uint8_t channel, uint32_t *buffer, uint32_t length, bool *next)\r
-{\r
- unused(next);\r
- if (g_adc_sample_times >= ADC_SAMPLE_TIMES) {\r
- wstp_print("g_adc_sample_times = %d\r\n", g_adc_sample_times);\r
- uapi_adc_auto_scan_ch_disable(channel);\r
- return;\r
- }\r
-\r
- memcpy_s(g_save_adc_data + g_save_adc_index, length * sizeof(uint32_t), buffer, length * sizeof(uint32_t));\r
- g_save_adc_index += length;\r
- g_adc_sample_times++;\r
- wstp_print("length = %d\r\n", length);\r
- return;\r
-}\r
-\r
-static uint32_t adc_auto_sample_by_diag(uint8_t *para, uint32_t para_len)\r
-{\r
- char *ptr = (char *)para;\r
- char *token = NULL;\r
- char *next_token = NULL;\r
- uint32_t channel = 0;\r
- uint32_t freq = 0;\r
- uint32_t sample_time = 0;\r
- uint32_t idx = 0;\r
- uint32_t tmp[ADC_AUTODATA_PRT_INDEX3] = {0};\r
- token = strtok_s((char*)ptr, ",", &next_token);\r
- while (token != NULL) {\r
- tmp[idx++] = strtoul(token, NULL, 10); // 10: 十进制\r
- token = strtok_s(NULL, ",", &next_token);\r
- }\r
- channel = tmp[0];\r
- freq = tmp[ADC_AUTODATA_PRT_INDEX1];\r
- sample_time = tmp[ADC_AUTODATA_PRT_INDEX2];\r
-\r
- adc_scan_config_t config = {0};\r
- config.freq = (uint8_t)freq;\r
- config.long_sample_time = sample_time;\r
-\r
- g_save_adc_data = (uint32_t *)malloc(sizeof(uint32_t) * ADC_SAMPLE_DATA_LEN);\r
- if (g_save_adc_data == NULL) {\r
- wstp_print("malloc g_save_adc_data fail!\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
- (void)uapi_adc_init(ADC_CLOCK_500KHZ);\r
- (void)uapi_adc_power_en(AFE_SCAN_MODE_MAX_NUM, true);\r
- return(uapi_adc_auto_scan_ch_enable((uint8_t)channel, config, adc_autosample_callback));\r
-}\r
-\r
-static uint32_t adc_auto_sample_disable(uint8_t *para, uint32_t para_len)\r
-{\r
- char *ptr = (char *)para;\r
- uint32_t ret = 0;\r
- uint32_t channel = strtoul(ptr, NULL, 10); // 10: 十进制\r
- wstp_print("disable adc auto sample , channel = %x\r\n", channel);\r
-\r
- return(uapi_adc_auto_scan_ch_disable(channel));\r
-}\r
-#endif\r
-\r
-static void pm_lcd_off_handle(void)\r
-{\r
- writew(0x570000c0, 0x0); // display logic crg reset\r
- writew(0x57004034, 0x100); // display close power\r
-#ifndef QSPI_DISPLAY\r
- pmu_ldo_power_on(PMU_LDO_AUXLDO3, TURN_OFF);\r
- hal_pmu_auxldo_enable_high_resistance(HAL_PMU_AUXLDO3, TURN_ON);\r
-#endif\r
-#ifdef CONFIG_CLDO1PD_SUPPORT\r
- pmu_control_cldo1_sleep_bypass(TURN_OFF);\r
-#endif\r
-}\r
-\r
-uint32_t mcu_pm_lcd_off(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-#ifdef SUPPORT_POWER_MANAGER\r
- const power_display_svr_api_t *display_api = power_display_svr_get_api();\r
- return display_api->turn_off_screen();\r
-#endif\r
- if (!lcd_get_status()) {\r
- wstp_print("\r\nLCD has benn off\r\n");\r
- return ERRCODE_SUCC;\r
- }\r
-#if defined(ENABLE_UIKIT) || defined(ENABLE_LVGL)\r
- NotifyScreenOff(); // Instruct the uikit to close the display operation.\r
-#endif\r
- osDelay(100); // Wait 100ms for the uikit to complete display.\r
- touch_screen_suspend(); // close touch\r
- ext_errno ret = drv_vau_suspend(NULL);\r
- if (ret != 0) {\r
- wstp_print("drv vau suspend error ret=%x\r\n", ret);\r
- return ERRCODE_FAIL;\r
- }\r
-#ifdef SUPPORT_GPU_JPEG\r
- (void)drv_jpeg_suspend(NULL);\r
-#endif\r
-#ifndef QSPI_DISPLAY\r
- ret = drv_dpu_suspend(NULL);\r
- if (ret != 0) {\r
- wstp_print("drv dpu suspend error ret=%x\r\n", ret);\r
- return ERRCODE_FAIL;\r
- }\r
-#endif\r
- ret = uapi_lcd_deinit();\r
- if (ret != 0) {\r
- wstp_print("lcd deinit error ret=%x\r\n", ret);\r
- return ERRCODE_FAIL;\r
- }\r
- pm_lcd_off_handle();\r
- lcd_set_status(false);\r
- g_dpu_ready_flag = false;\r
- display_suspend_power_off();\r
- uapi_pm_request_mode(PM_ID_VIDEO, PM_MODE_LP);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_pm_add_vote(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-\r
- uint8_t cnt = pm_veto_get_id_cnt(PM_ID_DEBUG);\r
- if (cnt == 0) {\r
- uapi_pm_add_sleep_veto(PM_ID_DEBUG);\r
- } else {\r
- wstp_print("MCU has got pm_id_debug vote\r\n");\r
- }\r
- wstp_print("\r\nMCU WAKEUP SUCCESS\r\n");\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_pm_remove_vote(uint8_t *para, uint32_t para_len)\r
-{\r
- pm_id_t pm_id = PM_ID_DEBUG; // 默认使用 PM_ID_DEBUG\r
- \r
- // 如果提供了参数,解析数字\r
- if (para != NULL && para_len > 0) {\r
- // 尝试将参数转换为数字\r
- pm_id = (pm_id_t)atoi((char*)para);\r
- \r
- // 检查范围是否有效\r
- if (pm_id < PM_ID_BSP || pm_id >= PM_ID_MAX) {\r
- wstp_print("Invalid PM_ID: %d (valid range: 0-%d)\r\n", pm_id, PM_ID_MAX - 1);\r
- return ERRCODE_FAIL;\r
- }\r
- }\r
- \r
- // 获取 PM_ID 名称\r
- const char* pm_id_name = get_pm_id_name(pm_id);\r
- \r
- // 获取当前投票计数\r
- uint8_t cnt = pm_veto_get_id_cnt(pm_id);\r
- \r
- if (cnt > 0) {\r
- wstp_print("MCU remove %s (PM_ID=%d) vote, current count=%d\r\n", pm_id_name, pm_id, cnt);\r
- uapi_pm_remove_sleep_veto(pm_id);\r
- wstp_print("\r\nMCU SLEEP SUCCESS (removed %s vote)\r\n", pm_id_name);\r
- } else {\r
- wstp_print("MCU has already deleted %s (PM_ID=%d) vote (count=0)\r\n", pm_id_name, pm_id);\r
- }\r
- \r
- uapi_tcxo_delay_ms(5); // delay 5ms for print debug infor with uart\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_dfx_get_cur_second(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-\r
- uint32_t cur_second = dfx_get_cur_second();\r
-\r
- wstp_print("cur_second = %d\r\n", cur_second);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t get_ids(uint8_t *data, uint32_t data_len)\r
-{\r
-#ifdef CFG_DRIVERS_NANDFLASH\r
- uint16_t nandflash_id;\r
- uapi_nandflash_read_id(&nandflash_id);\r
- wstp_print("[nandflash id:] %x\r\n", nandflash_id);\r
-#endif\r
- flash_info_t norflash_id;\r
- uapi_flash_get_info(0, &norflash_id);\r
- wstp_print("[norflash id:] %x\r\n", norflash_id.flash_id);\r
- wstp_print("[sdk id:]%s \r\n", uapi_sdk_read_id());\r
- uint8_t soc_id[20]; // 20 is soc id length\r
- uapi_soc_read_id(soc_id, 20); // 20 is soc id length\r
- wstp_print("[soc id:]\r\n");\r
- for (uint8_t i = 0; i < 20; i += 2) { // 20 is soc id length, 2 means use 16bits\r
- wstp_print("0x%04X ", *((uint16_t *)&soc_id[i]));\r
- if ((i + 2) % 8 == 0) { wstp_print("\r\n"); } // 2&8 will word wrap\r
- }\r
- wstp_print("\r\n");\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t lcd_test_light(uint8_t *data, uint32_t data_len)\r
-{\r
- char *ptr = (char *)data;\r
- uint32_t light_input = strtoul(ptr, NULL, 16);\r
- wstp_print("light = %x \r\n", light_input);\r
- uapi_lcd_set_brightness(light_input);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t at_nand_write_read(uint8_t *data, uint32_t data_len)\r
-{\r
-#ifdef CFG_DRIVERS_NANDFLASH\r
- char *ptr = (char *)data;\r
- uint32_t page = strtoul(ptr, NULL, 10);\r
- wstp_print("page = %d \r\n", page);\r
- struct nand_driver_struct *freertos_nandflash_driver = get_nand_flash();\r
- if (page >= freertos_nandflash_driver->pages_per_block * freertos_nandflash_driver->total_block) {\r
- wstp_print("page error exceed max page = %d \r\n", page);\r
- return ERRCODE_FAIL;\r
- }\r
- test_nand_flash_read_8(freertos_nandflash_driver, page);\r
-#endif\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t at_nand_write_write(uint8_t *data, uint32_t data_len)\r
-{\r
- PRINT("nand wite\r\n");\r
-#ifdef CFG_DRIVERS_NANDFLASH\r
- char *ptr = (char *)data;\r
- uint32_t page = strtoul(ptr, NULL, 10);\r
- wstp_print("page = %d \r\n", page);\r
- struct nand_driver_struct *freertos_nandflash_driver = get_nand_flash();\r
- if (page >= freertos_nandflash_driver->pages_per_block * freertos_nandflash_driver->total_block) {\r
- wstp_print("page error exceed max page = %d \r\n", page);\r
- return ERRCODE_FAIL;\r
- }\r
- test_nand_flash_write_width8(freertos_nandflash_driver, page);\r
-#endif\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t at_nand_write_erase(uint8_t *data, uint32_t data_len)\r
-{\r
-#ifdef CFG_DRIVERS_NANDFLASH\r
- char *ptr = (char *)data;\r
- uint32_t block = strtoul(ptr, NULL, 10);\r
- struct nand_driver_struct *freertos_nandflash_driver = get_nand_flash();\r
- wstp_print("block = %d total_block = %d\r\n", block, freertos_nandflash_driver->total_block);\r
- if (block >= freertos_nandflash_driver->total_block) {\r
- erase_all(freertos_nandflash_driver);\r
- wstp_print("erase all block\r\n");\r
- return ERRCODE_SUCC;\r
- }\r
- freertos_nandflash_driver->erase_block(block);\r
-#endif\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t at_nand_mark_bad(uint8_t *data, uint32_t data_len)\r
-{\r
-#ifdef CFG_DRIVERS_NANDFLASH\r
- char *ptr = (char *)data;\r
- uint32_t block = strtoul(ptr, NULL, 10);\r
- wstp_print("mark block%d = %x is bad\r\n", block);\r
- struct nand_driver_struct *freertos_nandflash_driver = get_nand_flash();\r
- if (block >= freertos_nandflash_driver->total_block) {\r
- wstp_print("exceed max block = %d \r\n", block);\r
- return ERRCODE_FAIL;\r
- }\r
- freertos_nandflash_driver->mark_bad_block(block);\r
-#endif\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t at_nand_check_bad(uint8_t *data, uint32_t data_len)\r
-{\r
-#ifdef CFG_DRIVERS_NANDFLASH\r
- char *ptr = (char *)data;\r
- uint32_t block = strtoul(ptr, NULL, 10);\r
- wstp_print("check block%d = %x is bad?\r\n", block);\r
- struct nand_driver_struct *freertos_nandflash_driver = get_nand_flash();\r
- if (block >= freertos_nandflash_driver->total_block) {\r
- wstp_print("exceed max block = %d \r\n", block);\r
- return ERRCODE_FAIL;\r
- }\r
- uint32_t ret = freertos_nandflash_driver->check_bad_block(block);\r
- wstp_print("is bad? ret = %d\r\n", ret);\r
-#endif\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t at_nand_set_mode(uint8_t *data, uint32_t data_len)\r
-{\r
-#ifdef CFG_DRIVERS_NANDFLASH\r
- char *ptr = (char *)data;\r
- uint32_t mode = strtoul(ptr, NULL, 10);\r
- if (mode == 0) {\r
- wstp_print("set mode to SPEED_HIGH DMA_FOUR_LINE\r\n", mode);\r
- nand_driver_init(SPEED_HIGH);\r
- set_trans_type(TRANS_BY_DMA_QUAD);\r
- } else {\r
- wstp_print("set mode to SPEED_SLOW CPU_SINGLE_LINE\r\n", mode);\r
- nand_driver_init(SPEED_SLOW);\r
- set_trans_type(TRANS_BY_CPU_SINGLE_LINE);\r
- }\r
-#endif\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t lcd_fill(uint8_t *data, uint32_t data_len)\r
-{\r
- char *ptr = (char *)data;\r
- uint32_t color_input = strtoul(ptr, NULL, 16);\r
- wstp_print("color = %x \r\n", color_input);\r
-\r
- td_handle vau_handle;\r
- ext_vau_surface src_surface = {0};\r
-\r
- src_surface.width = 466; // 454 screen width\r
- src_surface.height = 466; // 454 screen height\r
- src_surface.phy_addr = LCD_FILL_COLOR_ADDR;\r
- src_surface.vir_addr = (td_uchar *)src_surface.phy_addr;\r
- src_surface.color_fmt = EXT_GFX_FMT_ARGB8888;\r
- src_surface.compress_mode = EXT_GFX_COMPRESS_NONE;\r
- src_surface.argb_order = EXT_GFX_FMT_ORDER_ARGB;\r
- src_surface.rect.x = 0;\r
- src_surface.rect.y = 0;\r
- src_surface.rect.width = src_surface.width;\r
- src_surface.rect.height = src_surface.height;\r
- src_surface.stride = 1872; /* 454 * 32 / 8 = 1816 16字节对齐得1824 | 466 * 32 / 8 = 1864 16字节对齐得1872*/\r
- src_surface.is_color_surface = TD_TRUE;\r
- src_surface.color = color_input;\r
-\r
-#ifdef MIPI_ULPS_SUPPORT\r
- uapi_mipi_tx_exit_ulps();\r
-#endif\r
-\r
- vau_handle = uapi_vau_create();\r
- uapi_vau_fill(vau_handle, &src_surface);\r
- uapi_vau_submit(vau_handle, TD_FALSE, 1000); /* 1000 ms timeout */\r
-\r
- td_handle dpu_handle;\r
- ext_dpu_layer_info layer_info = {0};\r
- ext_dpu_surface dpu_surface = {0};\r
-\r
- layer_info.width = src_surface.width;\r
- layer_info.height = src_surface.height;\r
- layer_info.layer_id = EXT_DPU_LAYER_ID1;\r
- layer_info.layer_fmt = src_surface.color_fmt;\r
- layer_info.compress_mode = src_surface.compress_mode;\r
- layer_info.buf_mode = EXT_DPU_BUFFER_MODE_NORMAL;\r
-\r
- dpu_surface.width = src_surface.width;\r
- dpu_surface.height = src_surface.height;\r
- dpu_surface.stride = src_surface.stride;\r
- dpu_surface.phy_addr = src_surface.phy_addr;\r
- dpu_surface.vir_addr = src_surface.vir_addr;\r
- dpu_surface.update_rect = TD_NULL;\r
- dpu_surface.color_fmt = src_surface.color_fmt;\r
- dpu_surface.compress_mode = src_surface.compress_mode;\r
-\r
- uapi_dpu_create_layer(&layer_info, &dpu_handle);\r
- uapi_dpu_set_layer_vblank(dpu_handle, TD_TRUE);\r
- uapi_dpu_set_layer_info(dpu_handle, &dpu_surface);\r
- uapi_dpu_refresh_layers();\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_pm_no_resume_touch(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- char *data = (char *)para;\r
- if (data == NULL) { return ERRCODE_FAIL; }\r
- uint8_t flag = strtoul(data, NULL, 0);\r
- if (flag == 1) {\r
- touch_screen_restart();\r
- }\r
- set_touch_resume_flag(flag);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint32_t mcu_pm_set_mcu_dynamic_power(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- char *data = (char *)para;\r
- if (data == NULL) { return ERRCODE_FAIL; }\r
- uint8_t flag = strtoul(data, NULL, 0);\r
- if (flag == 0) {\r
- pm_set_mcu_dynamic_power_flag(0);\r
- } else {\r
- pm_set_mcu_dynamic_power_flag(1);\r
- }\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static void button_callback_press(void)\r
-{\r
- PRINT("power key press."NEWLINE);\r
-}\r
-\r
-static void button_callback_click(void)\r
-{\r
- PRINT("power key click."NEWLINE);\r
-}\r
-\r
-static void button_callback_click_2(void)\r
-{\r
- PRINT("power key click double."NEWLINE);\r
-}\r
-\r
-static void button_callback1(void)\r
-{\r
- PRINT("power key long press 1s."NEWLINE);\r
-}\r
-\r
-static void button_callback2(void)\r
-{\r
- PRINT("power key long press 2s."NEWLINE);\r
-}\r
-\r
-static void button_callback3(void)\r
-{\r
- PRINT("power key long press 3s."NEWLINE);\r
-}\r
-\r
-static void button_callback4(void)\r
-{\r
- PRINT("power key long press 4s."NEWLINE);\r
-}\r
-\r
-static void button_callback5(void)\r
-{\r
- PRINT("power key long press 5s."NEWLINE);\r
-}\r
-\r
-static void button_callback6(void)\r
-{\r
- PRINT("power key long press 6s."NEWLINE);\r
-}\r
-\r
-static void button_callback7(void)\r
-{\r
- PRINT("power key long press 7s."NEWLINE);\r
-}\r
-\r
-static void button_callback8(void)\r
-{\r
- PRINT("power key long press 8s."NEWLINE);\r
-}\r
-\r
-static void button_callback9(void)\r
-{\r
- PRINT("power key long press 9s."NEWLINE);\r
-}\r
-\r
-static void button_callback_1_over(void)\r
-{\r
- PRINT("power key long press 1s over."NEWLINE);\r
-}\r
-\r
-static void button_callback_2_over(void)\r
-{\r
- PRINT("power key long press 2s over."NEWLINE);\r
-}\r
-\r
-static void button_callback_3_over(void)\r
-{\r
- PRINT("power key long press 3s over."NEWLINE);\r
-}\r
-\r
-static void button_callback_4_over(void)\r
-{\r
- PRINT("power key long press 4s over."NEWLINE);\r
-}\r
-\r
-static void button_callback_5_over(void)\r
-{\r
- PRINT("power key long press 5s over."NEWLINE);\r
-}\r
-\r
-static void button_callback_6_over(void)\r
-{\r
- PRINT("power key long press 6s over."NEWLINE);\r
-}\r
-\r
-static void button_callback_7_over(void)\r
-{\r
- PRINT("power key long press 7s over."NEWLINE);\r
-}\r
-\r
-static void button_callback_8_over(void)\r
-{\r
- PRINT("power key long press 8s over."NEWLINE);\r
-}\r
-\r
-static void button_callback_9_over(void)\r
-{\r
- PRINT("power key long press 9s over."NEWLINE);\r
-}\r
-\r
-uint32_t mcu_button_sample(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
-\r
- uapi_button_register_event_cb(button_callback_press, BUTTON_PWR_PRESS);\r
- uapi_button_register_event_cb(button_callback_click, BUTTON_PWR_CLICKUP);\r
- uapi_button_register_event_cb(button_callback_click_2, BUTTON_PWR_CLICKUP_2);\r
-\r
- uapi_button_register_event_cb(button_callback1, BUTTON_PWR_LONGPRESS_1S);\r
- uapi_button_register_event_cb(button_callback2, BUTTON_PWR_LONGPRESS_2S);\r
- uapi_button_register_event_cb(button_callback3, BUTTON_PWR_LONGPRESS_3S);\r
- uapi_button_register_event_cb(button_callback4, BUTTON_PWR_LONGPRESS_4S);\r
- uapi_button_register_event_cb(button_callback5, BUTTON_PWR_LONGPRESS_5S);\r
- uapi_button_register_event_cb(button_callback6, BUTTON_PWR_LONGPRESS_6S);\r
- uapi_button_register_event_cb(button_callback7, BUTTON_PWR_LONGPRESS_7S);\r
- uapi_button_register_event_cb(button_callback8, BUTTON_PWR_LONGPRESS_8S);\r
- uapi_button_register_event_cb(button_callback9, BUTTON_PWR_LONGPRESS_9S);\r
-\r
- uapi_button_register_event_cb(button_callback_1_over, BUTTON_PWR_LONGPRESS_1S_OVER);\r
- uapi_button_register_event_cb(button_callback_2_over, BUTTON_PWR_LONGPRESS_2S_OVER);\r
- uapi_button_register_event_cb(button_callback_3_over, BUTTON_PWR_LONGPRESS_3S_OVER);\r
- uapi_button_register_event_cb(button_callback_4_over, BUTTON_PWR_LONGPRESS_4S_OVER);\r
- uapi_button_register_event_cb(button_callback_5_over, BUTTON_PWR_LONGPRESS_5S_OVER);\r
- uapi_button_register_event_cb(button_callback_6_over, BUTTON_PWR_LONGPRESS_6S_OVER);\r
- uapi_button_register_event_cb(button_callback_7_over, BUTTON_PWR_LONGPRESS_7S_OVER);\r
- uapi_button_register_event_cb(button_callback_8_over, BUTTON_PWR_LONGPRESS_8S_OVER);\r
- uapi_button_register_event_cb(button_callback_9_over, BUTTON_PWR_LONGPRESS_9S_OVER);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_power_key_config(uint8_t *para, uint32_t para_len)\r
-{\r
- char *ptr = (char *)para;\r
- char *token = NULL;\r
- char *next_token = NULL;\r
- uint32_t power_level = 0;\r
- uint32_t power_type = 0;\r
- uint32_t idx = 0;\r
- uint32_t tmp[POWER_KEY_PARAM_LEN] = {0};\r
- token = strtok_s((char*)ptr, " ", &next_token);\r
- while (token != NULL) {\r
- tmp[idx++] = strtoul(token, NULL, 10); // 10: 十进制\r
- token = strtok_s(NULL, " ", &next_token);\r
- }\r
- power_type = tmp[0];\r
- power_level = tmp[1];\r
- printf("power type:%d power_level:%d \r\n", power_type, power_level);\r
- if (uapi_power_set_mode(power_type) != ERRCODE_SUCC) {\r
- printf("power type:%d error.", power_type);\r
- }\r
- if (uapi_power_time_mode(power_level) != ERRCODE_SUCC) {\r
- printf("power level:%d error.", power_level);\r
- }\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_calendar_set_date(uint8_t *para, uint32_t para_len)\r
-{\r
- char *ptr = (char *)para;\r
- char *token = NULL;\r
- char *next_token = NULL;\r
- calendar_t date;\r
- uint32_t idx = 0;\r
- uint32_t tmp[CALENDAR_PARAM_LEN] = {0};\r
- token = strtok_s((char*)ptr, " ", &next_token);\r
- while (token != NULL) {\r
- tmp[idx++] = strtoul(token, NULL, 10); // 10: 十进制\r
- token = strtok_s(NULL, " ", &next_token);\r
- }\r
- date.year = tmp[0];\r
- date.mon = tmp[1];\r
- date.day = tmp[2];\r
- date.hour = tmp[3];\r
- date.min = tmp[4];\r
- date.sec = tmp[5];\r
-\r
- errcode_t ret = uapi_calendar_set_datetime(&date);\r
- if (ret == ERRCODE_SUCC) {\r
- printf("Set datetime success: %d-%d-%d %d:%d:%d\r\n", date.year, date.mon, date.day, date.hour, date.min,\r
- date.sec);\r
- return ERRCODE_SUCC;\r
- }\r
- printf("Set datetime failed, error code = %d \r\n", ret);\r
- return ret;\r
-}\r
-\r
-static uint32_t mcu_calendar_get_date(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
- calendar_t date;\r
-\r
- errcode_t ret = uapi_calendar_get_datetime(&date);\r
- if (ret == ERRCODE_SUCC) {\r
- printf("Get datetime success: %d-%d-%d %d:%d:%d\r\n", date.year, date.mon, date.day, date.hour, date.min,\r
- date.sec);\r
- return ERRCODE_SUCC;\r
- }\r
- printf("Get datetime failed, error code = %d \r\n", ret);\r
-\r
- return ret;\r
-}\r
-\r
-#ifdef SUPPROT_EXECUTE_CORMARK\r
-static uint32_t mcu_coremark_test(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
- uint32_t irq_sts = osal_irq_lock();\r
- watchdog_turnoff_clk();\r
- coremark_test();\r
- watchdog_turnon_clk();\r
- osal_irq_restore(irq_sts);\r
- return ERRCODE_SUCC;\r
-}\r
-#endif\r
-\r
-static uint32_t mcu_set_app_delay_time(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- char *ptr = (char *)para;\r
- uint32_t delay_time = strtoul(ptr, NULL, 0);\r
- if (delay_time == 0) {\r
- delay_time = 10000; // 10000 ms\r
- }\r
- wstp_print("app set delay_time = %d\r\n", delay_time);\r
- set_app_delay_time(delay_time);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_set_cldo1_voltage(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- char *ptr = (char *)para;\r
- uint8_t cldo = strtoul(ptr, NULL, 0);\r
- if (cldo > PMU_LDO_MAX) { cldo = 0; }\r
- ptr++;\r
- ptr++;\r
- uint8_t voltage = strtoul(ptr, NULL, 0);\r
- if (voltage > 15) { voltage = 14; } // the max voltage of cldo is 15, 14 is the default value.\r
- wstp_print("app set cldo=%d voltage = %d\r\n", cldo, voltage);\r
- pmu_ldo_power_on((pmu_ldo_t)cldo, 1);\r
- if (((pmu_ldo_t)cldo == PMU_LDO_CLDO1) || ((pmu_ldo_t)cldo == PMU_LDO_CLDO1) ||\r
- ((pmu_ldo_t)cldo == PMU_LDO_CLDO1)) {\r
- hal_pmu_cldo_enable_bypass((hal_pmu_cldo_t)cldo, 0);\r
- }\r
- pmu_ldo_power_vset((pmu_ldo_t)cldo, voltage);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_nand_aging_test(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- unused(para);\r
-#ifdef CFG_DRIVERS_NANDFLASH\r
- return nandflash_aging_test((char*)para);\r
-#else\r
- return ERRCODE_SUCC;\r
-#endif\r
-}\r
-\r
-static uint32_t mcu_norflash_aging_test(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- return flash_aging_test((char*)para);\r
-}\r
-\r
-static uint32_t mcu_set_pin_pull(uint8_t *para, uint32_t para_len)\r
-{\r
- int ret;\r
- uint32_t pin = 0;\r
- uint32_t levl = 0;\r
- char* ptr = (char*)para;\r
- char* pos = strchr((char*)ptr, ',');\r
- if (pos == NULL) {\r
- return ERRCODE_FAIL;\r
- }\r
- *pos = '\0';\r
-\r
- pin = strtoul(ptr, NULL, 0);\r
- if (pin < 0) {\r
- pin = 0;\r
- }\r
- ptr = pos + 1;\r
- levl = strtoul(ptr, NULL, 0);\r
- if ((pin_pull_t)levl > PIN_PULL_MAX) {\r
- levl = 0;\r
- }\r
- uapi_pin_set_pull((pin_t)pin, (pin_pull_t)levl);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_get_pin_pull(uint8_t *para, uint32_t para_len)\r
-{\r
- pin_t pin = 0;\r
- pin_pull_t level = 0;\r
- wstp_print("all pin levl:\r\n");\r
- for (uint16_t i = 0; i < PIN_NONE; i++) {\r
- level = uapi_pin_get_pull((pin_t)i);\r
- wstp_print("i=%d level=%d\r\n", i, level);\r
- }\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_set_time(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- return set_system_time((char*)para);\r
-}\r
-\r
-static uint32_t mcu_get_time(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
- return get_system_time();\r
-}\r
-\r
-#ifdef SUPPORT_POWER_MANAGER\r
-static uint32_t mcu_pms_set_screenoff_time(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- uint32_t type;\r
- uint32_t timeout;\r
- char *pos;\r
- char *ptr = (char *)para;\r
- errcode_t ret = ERRCODE_SUCC;\r
- pos = strchr((char *)ptr, ',');\r
- if (pos == NULL) {\r
- return ERRCODE_FAIL;\r
- }\r
- *pos = '\0';\r
- type = strtoul(ptr, NULL, 0);\r
- pos++;\r
- timeout = strtoul(pos, NULL, 0);\r
- wstp_print("app set screen off: type = %u,%s, timeut = %u.\r\n", type,type==0?"autooff_time":"keepon_time",timeout);\r
- const power_display_svr_api_t *display_api = power_display_svr_get_api();\r
- if (type == 0) {\r
- ret = display_api->set_screen_auto_off_timeout(timeout);\r
- } else if (type == 1) {\r
- ret = display_api->set_screen_set_keepon_timeout(timeout);\r
- } else {\r
- return ERRCODE_FAIL;\r
- }\r
- if (ret != ERRCODE_SUCC) {\r
- return ERRCODE_FAIL;\r
- }\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-\r
-static uint32_t mcu_pms_set_screenoff_enable(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- char *ptr = (char *)para;\r
- uint32_t inputpara = strtoul(ptr, NULL, 0);\r
- bool enable = true;\r
- if (inputpara == 0) {\r
- enable = false;\r
- }\r
- wstp_print("app set screen off enable = %u, para = %u. \r\n", enable, inputpara);\r
- const power_display_svr_api_t *display_api = power_display_svr_get_api();\r
- display_api->set_auto_timeout_function(enable);\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_pms_set_screen_state(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- char *ptr = (char *)para;\r
- wstp_print("app set screen state :%s. \r\n", ptr);\r
- const power_display_svr_api_t *display_api = power_display_svr_get_api();\r
- if (strcmp(ptr, "ON") == 0) {\r
- display_api->turn_on_screen();\r
- } else if (strcmp(ptr, "OFF") == 0) {\r
- display_api->turn_off_screen();\r
- } else {\r
- wstp_print("app set screen input para err.\r\n");\r
- return ERRCODE_FAIL;\r
- }\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_pms_get_screen_state(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- const power_display_svr_api_t *display_api = power_display_svr_get_api();\r
- screen_state_t state = display_api->get_screen_state();\r
- wstp_print("app get screen state = %s . \r\n", state==SCREEN_ON?"on":"off");\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-uint8_t mcu_pms_is_screen_on(void)\r
-{\r
- const power_display_svr_api_t *display_api = power_display_svr_get_api();\r
- screen_state_t state = display_api->get_screen_state();\r
- wstp_print("app get screen state = %u, on is %u, off is %u. \r\n", state, SCREEN_ON, SCREEN_OFF);\r
- if( state == SCREEN_ON){\r
- return 1;\r
- }else{\r
- return 0;\r
- }\r
-}\r
-#endif\r
-\r
-#ifdef FT_DONGLE\r
-uint32_t mcu_check_dongle_connected(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para);\r
- unused(para_len);\r
- // 通过diag返回包作为factory_tools判断SPP的连接状态依据\r
- // 仅供factory_tools做判断用,此AT命令不对外用\r
- wstp_print("Received dongle check msg.\r\n");\r
- return ERRCODE_SUCC;\r
-}\r
-#endif\r
-\r
-uint32_t mcu_i2c_write_byte(i2c_bus_t bus, uint16_t slave_addr, uint32_t reg_addr, uint32_t reg_val)\r
-{\r
- errcode_t ret;\r
- i2c_data_t data;\r
-\r
- uint8_t send_buf[AT_I2C_REG_ARRAY_LEN] = { 0 };\r
- send_buf[0] = (reg_addr >> OFFSET_24) & 0xff;\r
- send_buf[1] = (reg_addr >> OFFSET_16) & 0xff;\r
- send_buf[AT_PARA_IDX2] = (reg_addr >> OFFSET_8) & 0xff;\r
- send_buf[AT_PARA_IDX3] = reg_addr & 0xff;\r
- send_buf[AT_PARA_IDX4] = reg_val & 0xff;\r
- send_buf[AT_PARA_IDX5] = (reg_val >> OFFSET_8) & 0xff;\r
- send_buf[AT_PARA_IDX6] = (reg_val >> OFFSET_16) & 0xff;\r
- send_buf[AT_PARA_IDX7] = (reg_val >> OFFSET_24) & 0xff;\r
-\r
- data.send_buf = send_buf;\r
- data.send_len = 8; // 8: 发送长度\r
- data.receive_buf = NULL;\r
- data.receive_len = 0;\r
-\r
- ret = uapi_i2c_master_write(bus, slave_addr, &data);\r
- if (ret != ERRCODE_SUCC) {\r
- wstp_print("===== Error: mcu_i2c_write_byte: I2C write ret = 0x%x! =====\r\n", ret);\r
- return ERRCODE_FAIL;\r
- }\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-int32_t mcu_i2c_read_byte(i2c_bus_t bus, uint16_t slave_addr, uint32_t read_addr, uint32_t *read_val)\r
-{\r
- errcode_t ret;\r
- i2c_data_t data;\r
-\r
- uint8_t reg_addr[4] = { 0 };\r
- reg_addr[0] = (read_addr >> OFFSET_24) & 0xff;\r
- reg_addr[1] = (read_addr >> OFFSET_16) & 0xff;\r
- reg_addr[AT_PARA_IDX2] = (read_addr >> OFFSET_8) & 0xff;\r
- reg_addr[AT_PARA_IDX3] = read_addr & 0xff;\r
-\r
- data.send_buf = reg_addr;\r
- data.send_len = 4; // 4: 发送长度\r
- data.receive_buf = (uint8_t *)read_val;\r
- data.receive_len = 4; // 4: 接收长度\r
-\r
- ret = uapi_i2c_master_write(bus, slave_addr, &data);\r
- if (ret != ERRCODE_SUCC) {\r
- wstp_print("===== Error: mcu_i2c_read_byte: I2C write ret = 0x%x! =====\r\n", ret);\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- ret = uapi_i2c_master_read(bus, slave_addr, &data);\r
- if (ret != ERRCODE_SUCC) {\r
- wstp_print("===== Error: mcu_i2c_read_byte: I2C read ret = 0x%x! =====\r\n", ret);\r
- return ERRCODE_FAIL;\r
- }\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_i2c_write(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- char *ptr = (char *)para;\r
- char *token = NULL;\r
- char *next_token = NULL;\r
- errcode_t ret;\r
-\r
- uint32_t idx = 0;\r
- uint32_t bus = 0;\r
- uint32_t slave_addr = 0;\r
- uint32_t write_addr = 0;\r
- uint32_t write_val = 0;\r
-\r
- uint32_t tmp[AT_I2C_PARA_CNT] = {0};\r
- token = strtok_s((char*)ptr, ",", &next_token);\r
- while (token != NULL) {\r
- tmp[idx++] = strtoul(token, NULL, 16); // 16: 十六进制\r
- token = strtok_s(NULL, ",", &next_token);\r
- }\r
-\r
- bus = tmp[0];\r
- slave_addr = tmp[1];\r
- write_addr = tmp[AT_PARA_IDX2];\r
- write_val = tmp[AT_PARA_IDX3];\r
-\r
- return mcu_i2c_write_byte((i2c_bus_t)bus, slave_addr, write_addr, write_val);\r
-}\r
-\r
-static uint32_t mcu_i2c_read(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- char *ptr = (char *)para;\r
- char *token = NULL;\r
- char *next_token = NULL;\r
- errcode_t ret;\r
- uint32_t read_val;\r
-\r
- uint32_t idx = 0;\r
- uint32_t bus = 0;\r
- uint32_t slave_addr = 0;\r
- uint32_t read_addr = 0;\r
-\r
- uint32_t tmp[AT_I2C_PARA_CNT] = {0};\r
- token = strtok_s((char*)ptr, ",", &next_token);\r
- while (token != NULL) {\r
- tmp[idx++] = strtoul(token, NULL, 16); // 16: 十六进制\r
- token = strtok_s(NULL, ",", &next_token);\r
- }\r
-\r
- bus = tmp[0];\r
- slave_addr = tmp[1];\r
- read_addr = tmp[AT_PARA_IDX2];\r
-\r
- ret = mcu_i2c_read_byte((i2c_bus_t)bus, slave_addr, read_addr, &read_val);\r
- if (ret == ERRCODE_SUCC) {\r
- // wstp_print("Read val: [ 0x%x ]\r\n", read_val);\r
- wstp_print("Read bus[%u],slaveaddr[%02X,%u],regaddr[%02X,%u]val: [ 0x%x ]\r\n", bus,slave_addr,slave_addr,read_addr,read_addr);\r
- }else{\r
- wstp_print("Read bus[%u],slaveaddr[%02X,%u],regaddr[%02X,%u]val: [ 0x%x ],failed!\r\n", bus,slave_addr,slave_addr,read_addr,read_addr);\r
- }\r
-\r
- return ret;\r
-}\r
-#ifdef SUPPORT_ALIPAY_SEC\r
-static uint32_t mcu_alipay_sec_test(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- wstp_print("mcu_alipay_sec_test start.\r\n");\r
- uapi_alipay_svr_init();\r
- const alipay_svr_api_t *alipay_api = alipay_svr_get_api();\r
- alipay_api->exit_lpm();\r
- osDelay(ALIPAY_EXIT_LPM_DELAY_LEN);\r
- yunit_sdk_test();\r
- alipay_api->enter_lpm();\r
- wstp_print("mcu_alipay_sec_test end.\r\n");\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_alipay_debug(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- uapi_alipay_svr_init();\r
- svr_alipay_debug();\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_alipay_pl_verify(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- int32_t compat_ret = 0;\r
- int32_t cert_ret = 0;\r
- uapi_alipay_svr_init();\r
- const alipay_svr_api_t *alipay_api = alipay_svr_get_api();\r
- alipay_api->exit_lpm();\r
- osDelay(ALIPAY_EXIT_LPM_DELAY_LEN);\r
- cert_ret = test_get_credential();\r
- wstp_print("get cert ret=%d.\r\n", cert_ret);\r
- compat_ret = hal_hardware_compat_check();\r
- wstp_print("compat check ret=%d.\r\n", compat_ret);\r
- alipay_api->enter_lpm();\r
- if (cert_ret == 0 && compat_ret == 0) {\r
- return ERRCODE_SUCC;\r
- }\r
- return ERRCODE_FAIL;\r
-}\r
-\r
-static uint32_t mcu_alipay_reset(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- (void)uapi_alipay_svr_reset();\r
- return ERRCODE_SUCC;\r
-}\r
-#endif\r
-\r
-#ifdef SUPPORT_FILE_SPLIT_COMBINE\r
-static uint32_t mcu_file_spilt_test(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- wstp_print("mcu_file_spilt_test start.\r\n");\r
- msg_center_split_file(ORIGIN_FILE_PATH, FILE_SPILT_MAX_SIZE, FILE_LIST_PATH);\r
- wstp_print("mcu_file_spilt_test end.\r\n");\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_file_combine_test(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- wstp_print("mcu_file_combine_test start.\r\n");\r
- msg_center_combine_file(FILE_LIST_PATH, COMBINE_FILE_PATH);\r
- wstp_print("mcu_file_combine_test end.\r\n");\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-#endif\r
-\r
-#ifdef JS_ENABLE\r
-static uint32_t mcu_get_trans_channel_test(uint8_t *para, uint32_t para_len, char *str_cmd)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- msg_center_get_trans_channel();\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_set_trans_channel_test(uint8_t *para, uint32_t para_len, char *str_cmd)\r
-{\r
- unused(para_len);\r
- char *ptr = (char *)para;\r
- uint32_t select = strtoul(ptr, NULL, 10); /* 10进制 */\r
- msg_center_set_trans_channel(select);\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-#endif\r
-\r
-#ifdef SUPPORT_AUTO_OTA\r
-static uint32_t mcu_auto_ota_block(uint8_t *para, uint32_t para_len, char *str_cmd)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- g_auto_ota_upload_mode = 1;// 阻塞等待升级包上传\r
- wstp_print("auto_ota block!\r\n");\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_auto_ota_run(uint8_t *para, uint32_t para_len, char *str_cmd)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- g_auto_ota_upload_mode = 0; // 升级包上传完成后auto_ota继续执行\r
- wstp_print("auto_ota run!\r\n");\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_auto_ota_del_mac(uint8_t *para, uint32_t para_len, char *str_cmd)\r
-{\r
- unused(para_len);\r
- wstp_print("para = %s\r\n", para);\r
- uint8_t addr[ADDR_MAC_LEN] = {0};\r
- char tmp[ONE_ADDR_LEN + 1] = {0};\r
- char *p = (char *)para;\r
-\r
- for (uint8_t i = 0; i < ADDR_MAC_LEN; i++) {\r
- memcpy_s(tmp, ONE_ADDR_LEN + 1, p, ONE_ADDR_LEN);\r
- tmp[ONE_ADDR_LEN] = '\0';\r
- addr[i] = strtol(tmp, NULL, 16); // 16进制\r
- p = p + ONE_ADDR_LEN;\r
- }\r
-\r
- wstp_print("mcu_auto_ota_del_mac, mac = %02x%02x%02x%02x%02x%02x\r\n", addr[5], addr[4], addr[3], addr[2], addr[1],\r
- addr[0]);\r
- bool res = auto_ota_dev_del(addr);\r
- wstp_print("auto_ota_dev_del, res = %d\r\n", res);\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_auto_ota_add_mac(uint8_t *para, uint32_t para_len, char *str_cmd)\r
-{\r
- unused(para_len);\r
- wstp_print("enter mcu_auto_ota_add_mac\r\n");\r
- wstp_print("para = %s\r\n", para);\r
- uint8_t addr[ADDR_MAC_LEN] = {0};\r
- char tmp[ONE_ADDR_LEN + 1] = {0};\r
- char *p = (char *)para;\r
-\r
- for (uint8_t i = 0; i < ADDR_MAC_LEN; i++) {\r
- memcpy_s(tmp, ONE_ADDR_LEN + 1, p, ONE_ADDR_LEN);\r
- tmp[ONE_ADDR_LEN] = '\0';\r
- addr[i] = strtol(tmp, NULL, 16); // 16进制\r
- p = p + ONE_ADDR_LEN;\r
- }\r
-\r
- wstp_print("mcu_auto_ota_add_mac, mac = %02x%02x%02x%02x%02x%02x\r\n", addr[5], addr[4], addr[3], addr[2], addr[1],\r
- addr[0]);\r
- auto_ota_dev_add(addr);\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-\r
-static uint32_t mcu_auto_ota_show_mac(uint8_t *para, uint32_t para_len, char *str_cmd)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- wstp_print("enter mcu_auto_ota_show_mac\r\n");\r
-\r
- auto_ota_dev_show();\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-#endif\r
-\r
-#ifdef LOSCFG_KERNEL_PERF\r
-static uint32_t mcu_perf_start(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- return perf_test_start();\r
-}\r
-\r
-static uint32_t mcu_perf_stop(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- return perf_test_stop();\r
-}\r
-#endif\r
-\r
-#ifdef LOSCFG_DEBUG_SCHED_STATISTICS\r
-static uint32_t mcu_sched_statistis_start(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- OsSchedStatStart();\r
- return 0;\r
-}\r
-\r
-static uint32_t mcu_sched_statistis_stop(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- unused(para);\r
- OsSchedStatStop();\r
- OsSchedStatInfo();\r
- return 0;\r
-}\r
-#endif\r
-\r
-#ifdef CFG_DRIVERS_SDIO\r
-typedef enum {\r
- SDIO_TEST_READ_BYTE = 1,\r
- SDIO_TEST_RESET,\r
-\r
- SDIO_TEST_BUTT,\r
-} SDIO_TEST_CASE_T;\r
-\r
-static uint32_t mcu_sdio_test(uint8_t *para, uint32_t para_len)\r
-{\r
- unused(para_len);\r
- char *ptr = (char *)para;\r
- uint32_t inputpara = strtoul(ptr, NULL, 0);\r
-\r
- wstp_print("enter mcu_sdio_test input %u \r\n", inputpara);\r
- switch (inputpara) {\r
- case SDIO_TEST_READ_BYTE:\r
- mmc_test_sdio_read_byte();\r
- break;\r
- case SDIO_TEST_RESET:\r
- mmc_test_sdio_reset();\r
- break;\r
- default:\r
- break;\r
- }\r
-\r
- return ERRCODE_SUCC;\r
-}\r
-#endif\r
-\r
-static const app_process_table g_app_funcs[] = {\r
- { RESET, mcu_os_sys_reset },\r
- { FSTEST, mcu_fs_test },\r
- { FSFORMAT, mcu_fs_format },\r
- { FSRWTEST, mcu_fs_rw_test },\r
- { FSSETCLK, mcu_fs_set_clk },\r
- { FSREADCLK, mcu_fs_read_clk },\r
- { FSWRITE, mcu_fs_write },\r
- { FSCHECK, mcu_fs_check },\r
- { FSRM, mcu_fs_rm },\r
- { GETWSTPVER, mcu_get_wstp_version },\r
- { LOGWRITE, mcu_logfile_write },\r
- { HEAPINFO, mcu_os_heap_info },\r
- { STACKINFO, mcu_os_stack_info },\r
- { TESTDTCMBW, mcu_test_dtcm_baudwidth },\r
- { TESTL2MBW, mcu_test_l2m_baudwidth },\r
- { TESTMMCBW, mcu_test_mmc_baudwidth },\r
- { TESTPSRAMBW, mcu_test_psram_baudwidth },\r
- { TESTNORFLASHBW, mcu_test_norflash_baudwidth },\r
- { TESTNANDFLASHBW, mcu_test_nandflash_baudwidth },\r
- { GETFSINFO, mcu_get_fs_info },\r
- { PMRMVOTE, mcu_pm_remove_vote },\r
- { PMADDVOTE, mcu_pm_add_vote },\r
- { LCDON, mcu_pm_lcd_on },\r
- { LCDOFF, mcu_pm_lcd_off },\r
- { SHIPMODE, mcu_pm_into_ship_mode },\r
- { FORCEDEEPSLEEP, mcu_pm_into_force_ds_mode },\r
- { PMMODESET, mcu_pm_req_mode },\r
- { PMMODEUSR, mcu_set_pm_req_mode_usr},\r
- { PMMODEGET, mcu_pm_dfx_mode },\r
- { PMVETOGET, mcu_pm_veto_get },\r
- { TASKSWITCHPRINT, mcu_task_switch_print_ctrl },\r
- { GETCURSEC, mcu_dfx_get_cur_second},\r
- { LCDFILL, lcd_fill },\r
- { GETIDS, get_ids },\r
- { LCDLIGHT, lcd_test_light },\r
- { RESUMETOUCH, mcu_pm_no_resume_touch },\r
- { MCUDYMPW, mcu_pm_set_mcu_dynamic_power },\r
- { PMCLDO1PD, mcu_pm_cldo1_power_down },\r
- { AESDECRYPT, mcu_aes_decrypt_sample },\r
- { AESENCRYPT, mcu_aes_encrypt_sample },\r
- { AESSETGID, mcu_aes_set_gid },\r
- { SETCALENDAR, mcu_calendar_set_date },\r
- { GETCALENDAR, mcu_calendar_get_date },\r
-#if defined(CONFIG_ADC_SUPPORT_AUTO_SCAN)\r
- { ADCAUTOSAMPLE, adc_auto_sample_by_diag },\r
- { ADCCLOSEAUTOSAMPLE, adc_auto_sample_disable },\r
- { ADCSHOWDATA, adc_auto_sample_show_data },\r
-#endif\r
- { BUTTON, mcu_button_sample },\r
- { POWERKEY, mcu_power_key_config },\r
-#ifdef SUPPROT_EXECUTE_CORMARK\r
- { COREMARKTEST, mcu_coremark_test },\r
-#endif\r
- { NANDREAD, at_nand_write_read},\r
- { NANDWRITE, at_nand_write_write},\r
- { NANDERASE, at_nand_write_erase},\r
- { NANDMARK, at_nand_mark_bad},\r
- { NANDCHECK, at_nand_check_bad},\r
- { NANDSETMODE, at_nand_set_mode},\r
- { SETAPPDELAY, mcu_set_app_delay_time },\r
- { SETCLDO1VOL, mcu_set_cldo1_voltage },\r
- { NANDAGINGTEST, mcu_nand_aging_test },\r
- { FLASHAGINGTEST, mcu_norflash_aging_test },\r
- { SETPINPULL, mcu_set_pin_pull },\r
- { GETPINPULL, mcu_get_pin_pull },\r
- { TIMESET, mcu_set_time },\r
- { TIMEGET, mcu_get_time },\r
-#ifdef SUPPORT_POWER_MANAGER\r
- { SETSCREENOFFTIME, mcu_pms_set_screenoff_time },\r
- { SETSCREENOFFFUNC, mcu_pms_set_screenoff_enable },\r
- { SETSCREENSTATE, mcu_pms_set_screen_state },\r
- { GETSCREENSTATE, mcu_pms_get_screen_state },\r
-#endif\r
-#ifdef FT_DONGLE\r
- { DONGLECONNECTED, mcu_check_dongle_connected },\r
-#endif\r
- { I2CWRITE, mcu_i2c_write },\r
- { I2CREAD, mcu_i2c_read },\r
-#ifdef SUPPORT_ALIPAY_SEC\r
- { ALIPAYSECTEST, mcu_alipay_sec_test },\r
- { ALIPAYDEBUG, mcu_alipay_debug },\r
- { ALIPAYVERIFY, mcu_alipay_pl_verify },\r
- { ALIPAYRESET, mcu_alipay_reset },\r
-#endif\r
-#ifdef SUPPORT_FILE_SPLIT_COMBINE\r
- { FILESPLIT, mcu_file_spilt_test },\r
- { FILECOMBINE, mcu_file_combine_test },\r
-#endif\r
-#ifdef JS_ENABLE\r
- { GETTRANSCHAN, mcu_get_trans_channel_test },\r
- { SETTRANSCHAN, mcu_set_trans_channel_test },\r
-#endif\r
-#ifdef SUPPORT_AUTO_OTA\r
- { AUTOOTABLOCK, mcu_auto_ota_block },\r
- { AUTOOTARUN, mcu_auto_ota_run },\r
- { AUTOOTADELMAC, mcu_auto_ota_del_mac },\r
- { AUTOOTAADDMAC, mcu_auto_ota_add_mac },\r
- { AUTOOTASHOWMAC, mcu_auto_ota_show_mac },\r
-#endif\r
-#ifdef LOSCFG_KERNEL_PERF\r
- { PERFSTART, mcu_perf_start },\r
- { PERFSTOP, mcu_perf_stop },\r
-#endif\r
-#ifdef LOSCFG_DEBUG_SCHED_STATISTICS\r
- { SCHEDSTART, mcu_sched_statistis_start },\r
- { SCHEDSTOP, mcu_sched_statistis_stop },\r
-#endif\r
-#ifdef CFG_DRIVERS_SDIO\r
- { SDIOTEST, mcu_sdio_test},\r
-#endif\r
-};\r
-\r
-void app_at_process(uint8_t *data, uint32_t data_len)\r
-{\r
- unused(data_len);\r
- if (data == NULL) {\r
- return;\r
- }\r
- int32_t ret = ERRCODE_FAIL;\r
- uint8_t reply_data[DIAG_RES_LEN] = {0};\r
- app_msg_info_t *msg = (app_msg_info_t *)(data);\r
-\r
- for (uint32_t i = 0; i < ARRAY_COUNT(g_app_funcs); i++) {\r
- if (msg->id == g_app_funcs[i].id) {\r
- ret = g_app_funcs[i].func(msg->payload, msg->payload_len);\r
- }\r
- }\r
- print_at_cmd_ret(ret);\r
-\r
- // phone remote control, need reply to spp\r
- if (g_app_diag_flag) {\r
- reply_data[0x0] = 0x80;\r
- reply_data[0x1] = 0x82;\r
- reply_data[0x2] = 0;\r
- reply_data[0x3] = (uint8_t)ret;\r
- ret = send_spp_diag_msg(g_app_diag_flag, &g_mcu_diag_header, reply_data, DIAG_RES_LEN);\r
- wstp_print("mcu_at_process send msg to spp %s.\r\n", (ret == ERRCODE_SUCC) ? "success" : "failure");\r
- }\r
-\r
- if (ret != ERRCODE_SUCC) {\r
- wstp_print("app_at_process func fail! MsgID=0x%x ret=%d "NEWLINE, msg->id, ret);\r
- }\r
- g_app_diag_flag = false;\r
-}\r
-\r
-uint32_t test_get_mem_info(uint8_t memType, uint32_t *used, uint32_t *free)\r
-{\r
-#if LOSCFG_MEM_TASK_STAT && defined __LITEOS__\r
- void *heapMan = NULL;\r
- LOS_MEM_POOL_STATUS status;\r
- if (memType) {\r
- heapMan = OS_EXTEND_MEM_ADDR;\r
- } else {\r
- heapMan = OS_SYS_MEM_ADDR;\r
- }\r
- if (LOS_MemInfoGet(heapMan, &status) != LOS_NOK) {\r
- *used = status.uwTotalUsedSize;\r
- *free = status.uwTotalFreeSize;\r
- printf("test_get_mem_info used = %d, free = %d\n", *used, *free);\r
- } else {\r
- printf("test_get_mem_info fail\n");\r
- }\r
-#endif\r
- return 0;\r
-}\r
+/*
+ * Copyright (c) CompanyNameMagicTag 2021-2022. All rights reserved.
+ * Description: Media task process
+ * Author:
+ * Create:
+ */
+#if defined(__LITEOS__)
+#include "los_memory.h"
+#include "los_memory_pri.h"
+#ifdef CFG_DRIVERS_MMC
+#include "soc/mmc.h"
+#endif
+#endif
+
+#ifdef CFG_DRIVERS_MMC
+#include "hci.h"
+#include "soc_mmc.h"
+#endif
+
+#if defined(__FREERTOS__)
+#ifdef FREERTOS_DEBUG
+#include "xlt_memory_pri.h"
+#include "task_debug.h"
+#endif
+#endif
+
+#include "debug_print.h"
+#include "td_base.h"
+#include "securec.h"
+#include "log_file.h"
+#include "dfx_adapt_layer.h"
+#include "dirent.h"
+#include "uart.h"
+#include "uapi_crc.h"
+#include "tcxo.h"
+#include "cmsis_os2.h"
+#include "lcd_bus.h"
+#include "soc_vau_type.h"
+#include "soc_dpu_type.h"
+#include "soc_mipi_tx.h"
+#include "touch_screen_def.h"
+#include "nandflash.h"
+#include "efuse.h"
+#include "psram_drv.h"
+#include "flash.h"
+#include "adc.h"
+#include "exception.h"
+#include "fcntl.h"
+#include <sys/stat.h>
+#include "common_def.h"
+#include "unistd.h"
+#include "watchdog.h"
+#include "button_porting.h"
+#include "hal_reboot.h"
+#include "app_msg_manager.h"
+#include "sys/statfs.h"
+#include "asm/memmap_config.h"
+#include "watchdog_porting.h"
+#include "thread_init.h"
+
+#include "pm.h"
+#include "pm_veto.h"
+#include "pm_lp_stub.h"
+#include "pm_definition.h"
+#include "build_version.h"
+#include "at_cmd_api.h"
+#include "app_test_fs.h"
+#include "app_test_perf.h"
+#include "app_common_api.h"
+#include "app_tx_process.h"
+#include "dfx_feature_config.h"
+#include "app_at_process.h"
+#include "pm_veto.h"
+#include "input_app.h"
+#include "lpc_core.h"
+#include "diag_msg.h"
+#include "pmu_ldo.h"
+#include "pinctrl.h"
+#include "non_os_reboot.h"
+#include "km.h"
+#include "cipher_api.h"
+#include "key_deriv_porting.h"
+#include "otp_map.h"
+#ifdef CFG_DRIVERS_NANDFLASH
+#include "nandflash_config.h"
+#endif
+
+#if defined(SW_RTT_DEBUG)
+#include "SEGGER_RTT.h"
+#endif
+#ifdef SUPPORT_POWER_MANAGER
+#include "power_display_service.h"
+#endif
+#include "i2c.h"
+#include "calendar.h"
+
+#ifdef SUPPORT_FILE_SPLIT_COMBINE
+#include "msg_center_protocol.h"
+#endif
+
+#ifdef SUPPORT_ALIPAY_SEC
+#include "alipay_feature.h"
+#endif
+
+#define ARRAY_COUNT(array) (sizeof(array) / sizeof(array[0]))
+#define DIAG_RES_LEN 4
+#define FF_VOLUMES_NUM 4
+#define ADC_AUTODATA_PRT_SIZE 4
+#define ADC_AUTODATA_PRT_INDEX1 1
+#define ADC_AUTODATA_PRT_INDEX2 2
+#define ADC_AUTODATA_PRT_INDEX3 3
+#define ADC_AUTODATA_PRT_INDEX4 4
+#define VER_STR_MAX 128
+#define FILE_MAX_NUM 32
+#define MAX_FILE_PATH_LEN 128
+#define TEST_MSG_MAX_SIZE 40
+#define LOG_FILE_ARG_NUM 6
+#define FS_NODE_INFO_SPACE 16
+#define MB_SIZE (1024 * 1024)
+#define KB_SIZE (1024)
+#define ONE_SECOND (1000000)
+#define DTCM_RAM_OFF (400 * 1024) // dtcm偏移,从最后未使用的dtcm作为测试内存
+#define INVALID_HANDLE (0xFFFFFFFF)
+
+#ifdef CONFIG_PSRAM_SUPPORT
+#define LCD_FILL_COLOR_ADDR 0x6D200000
+#else
+#define LCD_FILL_COLOR_ADDR 0x60280000
+#endif
+
+#define POWER_KEY_PARAM_LEN 0x2
+#define CALENDAR_PARAM_LEN 0x6
+#ifdef CFG_DRIVERS_MMC
+#define FS_VOLUMES_NUM 4
+#define FS_VOLUME_STRS "/user/system/", "/user/", "/user/update/", "/user/music/"
+extern unsigned int mmc_set_clock_with_way2(struct hci_softc *sc, unsigned int cfg_clock);
+uint32_t g_app_emmc_clk = SDIOM_SRC_CLK_FREQ_LVL_98M_VAL;
+#endif
+
+#ifdef CFG_DRIVERS_NANDFLASH
+#ifndef MEMORY_MINI
+#ifdef SINGLE_USER_PARTITION
+#define FS_VOLUMES_NUM 1
+#define FS_VOLUME_STRS "/user/"
+#else
+#define FS_VOLUMES_NUM 4
+#define FS_VOLUME_STRS "/system/", "/user/update/", "/user/music/",
+#endif
+#else
+#define FS_VOLUMES_NUM 1
+#define FS_VOLUME_STRS "/user/"
+#endif
+#endif
+
+#define AT_I2C_PARA_CNT 4
+#define AT_I2C_REG_ARRAY_LEN 8
+
+#define AT_PARA_IDX2 2
+#define AT_PARA_IDX3 3
+#define AT_PARA_IDX4 4
+#define AT_PARA_IDX5 5
+#define AT_PARA_IDX6 6
+#define AT_PARA_IDX7 7
+#define AT_PARA_IDX8 8
+
+#define OFFSET_8 8
+#define OFFSET_16 16
+#define OFFSET_24 24
+
+#define AES_SALT_LENGTH 16
+#define AES_IV_LENGTH 16
+// AES_SAMPLE_TEST_LEN must be an integer multiple of 32 bytes.
+#define AES_SAMPLE_TEST_LEN 64
+#define ALIPAY_EXIT_LPM_DELAY_LEN 100
+
+#ifdef SUPPORT_FILE_SPLIT_COMBINE
+/* 文件拆分合并测试 */
+#define ORIGIN_FILE_PATH "/user/test/ssb.bin"
+#define FILE_LIST_PATH "/user/test/flist.txt"
+#define COMBINE_FILE_PATH "/user/test/ssb_c.bin"
+#endif
+
+#ifdef SUPPORT_AUTO_OTA
+extern uint8_t g_auto_ota_upload_mode;
+#ifndef ONE_ADDR_LEN
+#define ONE_ADDR_LEN 2
+#endif
+#ifndef ADDR_MAC_LEN
+#define ADDR_MAC_LEN 6
+#endif
+#endif
+
+const uint8_t g_decrypt_aes_salt[AES_SALT_LENGTH] = { 0x0 };
+const uint8_t g_decrypt_aes_iv[AES_IV_LENGTH] = { 0x0 };
+// The length of the GID must be 32 bytes and cannot be changed.
+const uint8_t g_decrypt_aes_gid[OTP_SECURITY_KEY_GID_LEN] = { 0x0 };
+// This is the ASCII code of the string to be encrypted.
+const uint8_t g_decrypt_aes_encryp[AES_SAMPLE_TEST_LEN] = {};
+// This is the ASCII code of the string to be decrypted.
+const uint8_t g_decrypt_aes_decryp[AES_SAMPLE_TEST_LEN] = {0x15, 0x56, 0xa7, 0x38, 0x7f, 0xd3, 0x69, 0x72, 0x16,
+ 0x2, 0xda, 0x36, 0xf3, 0x99, 0xcd, 0xf7, 0x49, 0xf4, 0x2d, 0x15, 0x77, 0xd5, 0x4f, 0xdd, 0x14, 0xd1, 0xc3,
+ 0x7f, 0x41, 0xd6, 0x99, 0x47, 0x2f, 0xb1, 0x34, 0xdf, 0x87, 0xa0, 0x49, 0x53, 0x23, 0x43, 0xf0, 0x96, 0xed,
+ 0xbf, 0x5, 0x1d, 0x78, 0xc4, 0xa3, 0xfe, 0xf2, 0xa3, 0xb7, 0x8e, 0x29, 0xd9, 0xd0, 0x86, 0xc5, 0x5f, 0xc4, 0x8f};
+
+static const char * const g_volume_names[FS_VOLUMES_NUM] = { FS_VOLUME_STRS };
+
+#if DSP_L2RAM_AREA_SIZE == 8
+extern void *__l2m_dsp_data_end;
+#else
+extern void *__l2m_gpu_data_end;
+#endif
+
+diag_ser_header_t g_mcu_diag_header; // 用于保存diag回复包头内容
+bool g_app_diag_flag = false; // 用于控制执行功能后是否回复diag消息
+
+pm_id_t g_pm_req_mode_usr = PM_ID_DEBUG;
+#ifdef CONFIG_LOW_POWER_TEST
+static bool g_dpu_ready_flag = false;
+#else
+static bool g_dpu_ready_flag = true;
+#endif
+
+void wstp_print(const char *str, ...)
+{
+ static uint8_t s[256]; // 256 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);
+#else
+ if (hal_uart_get_funcs(SW_DEBUG_UART_BUS) == NULL) {
+ return;
+ }
+ uapi_uart_write(SW_DEBUG_UART_BUS, (const void *)s, str_len, 0);
+#endif
+}
+
+void factory_test_print(const uint8_t return_code, const char *str, ...)
+{
+ static uint8_t s[256]; // 256 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;
+ }
+#ifdef SW_UART_DEBUG
+ wstp_print("[Factory]|%s.\r\n", s);
+#endif
+#ifdef FT_BT_UART
+ at_cmd_send_abt_result_to_bt((const void *)s, str_len);
+#endif
+#ifdef FT_DONGLE
+ // 发送spp包
+ uint8_t table_len = 2 + str_len; // return_code + str_len + payload
+ diag_ser_header_t header_temp = {
+ .ser_id = DIAG_SER_APP_TEST,
+ .cmd_id = FTDONGLERETURN,
+ .src = DIAG_FRAME_FID_MCU, // DIAG_FRAME_FID_MCU
+ .dst = DIAG_FRAME_FID_PHONE, // DIAG_FRAME_FID_PHONE
+ .crc_en = true,
+ .ack_en = false,
+ .length = 2 + table_len, // moduld + cmd + table_len
+ };
+ factory_print_table *ft_table = (factory_print_table*)malloc(sizeof(factory_print_table));
+ if (ft_table == NULL) {
+ return;
+ }
+ ft_table->return_code = return_code;
+ ft_table->payload_len = str_len;
+ if (memcpy_s(ft_table->payload, FT_PAYLOAD_LEN_MAX, s, str_len) != EOK) {
+ wstp_print("[Factory]|memcpy_s fail!\r\n");
+ free(ft_table);
+ return;
+ }
+ send_spp_diag_msg(true, &header_temp, ft_table, table_len);
+ free(ft_table);
+#endif
+}
+
+void print_at_cmd_ret(int ret)
+{
+ uint32_t irq_sts = osal_irq_lock();
+ if (ret == ERRCODE_SUCC) {
+ wstp_print("\r\nOK~\r\n");
+ } else {
+ wstp_print("\r\nERR~\r\n");
+ }
+
+#ifdef FT_BT_UART
+ if (ret == ERRCODE_SUCC) {
+ at_cmd_send_abt_result_to_bt((uint8_t *)"\r\nOK~\r\n", strlen("\r\nOK~\r\n"));
+ } else {
+ at_cmd_send_abt_result_to_bt((uint8_t *)"\r\nERR~\r\n", strlen("\r\nERR~\r\n"));
+ }
+#endif
+ osal_irq_restore(irq_sts);
+}
+
+/* Diag消息获取TLV中V值数据处理接口 */
+uint32_t parse_tlv_2value(uint8_t* data, uint16_t data_len, uint8_t** out, uint32_t *out_len)
+{
+ unused(data_len);
+ uint8_t num[WORD_WIDTH] = {0};
+ uint8_t* ptr = data;
+ uint8_t len;
+ uint32_t length = 0;
+ int i;
+
+ ptr++;
+ // 动态len运算,7bit为1代表剩下0-6bit为真实长度,7bit为0,0-6bit代表后面几个字节为真实长度。
+ len = *(uint8_t*)ptr++;
+ if (((len & BIT7) >> 7) == 1) {
+ length = len & (~BIT7);
+ } else {
+ // 按照len数值,将真实长度数据小端保存到num中,默认最大长度四个字节,已够用
+ for (i = 0; i < len; i++) {
+ num[i] = *ptr++;
+ }
+ length = *(uint32_t*)num;
+ }
+ *out = ptr;
+ *out_len = length;
+ return ERRCODE_SUCC;
+}
+
+/* diag消息再封装转发app task接口 */
+uint32_t mcu_diag_cmd_process(diag_ser_data_t *data)
+{
+ app_msg_info_t* app_msg;
+ uint8_t* ptr;
+ uint32_t paylen;
+ diag_ser_frame_t* frame = (diag_ser_frame_t*)data->payload;
+
+ if (data == NULL) {
+ return ERRCODE_FAIL;
+ }
+
+ parse_tlv_2value(frame->tlv, data->header.length, &ptr, &paylen);
+ app_msg = (app_msg_info_t*)osal_kmalloc(sizeof(app_msg_info_t) + data->header.length, OSAL_GFP_KERNEL);
+ if (app_msg == NULL) {
+ wstp_print("mcu_diag_cmd_process malloc fail!!"NEWLINE);
+ return ERRCODE_FAIL;
+ }
+ (void)memset_s(app_msg, sizeof(app_msg_info_t) + data->header.length, 0, sizeof(app_msg_info_t) + data->header.length);
+ (void)memcpy_s(&g_mcu_diag_header, sizeof(diag_ser_header_t), &(data->header), sizeof(diag_ser_header_t));
+ app_msg->id = data->header.cmd_id;
+ app_msg->payload_len = paylen;
+ if (app_msg->payload_len > 0 && data != NULL) {
+ if (memcpy_s(app_msg->payload, app_msg->payload_len, (const void *)ptr, paylen) != EOK) {
+ wstp_print("mcu_diag_cmd_process data memcpy error!"NEWLINE);
+ osal_kfree(app_msg);
+ return ERRCODE_FAIL;
+ }
+ }
+ g_app_diag_flag = true;
+ app_at_msg_send((uint8_t *)app_msg, sizeof(app_msg_info_t) + paylen);
+ osal_kfree(app_msg);
+ return ERRCODE_SUCC;
+}
+
+/* 封装返回结果成Diag数据回发给BTH SPP
+param descrip:
+ send: 用于控制是否做diag消息回复
+ data: 用于传入diag包包头信息
+ payload: 回复tlv数据
+ pay_len: 回复tlv数据长度
+*/
+uint32_t send_spp_diag_msg(bool send, diag_ser_header_t *data, uint8_t* payload, uint32_t pay_len)
+{
+ uint8_t size;
+ diag_ser_data_t* diag_data;
+ diag_ser_frame_t* frame;
+ uint32_t result = ERRCODE_FAIL;
+
+ // send为false,则直接返回
+ if (send == false) {
+ return ERRCODE_SUCC;
+ }
+
+ size = sizeof(diag_ser_data_t) + sizeof(diag_ser_frame_t) + pay_len;
+ diag_data = (diag_ser_data_t *)malloc(size);
+ if (diag_data == NULL) {
+ return ERRCODE_FAIL;
+ }
+
+ (void)memcpy_s(&(diag_data->header), sizeof(diag_ser_header_t), data, sizeof(diag_ser_header_t));
+ frame = (diag_ser_frame_t*)&(diag_data->payload);
+ frame->module_id = data->ser_id;
+ frame->cmd_id = data->cmd_id;
+ (void)memcpy_s(&(frame->tlv), pay_len, payload, pay_len);
+ diag_data->header.crc_en = 1;
+ diag_data->header.length = size - sizeof(diag_ser_data_t);
+ diag_data->header.dst = DIAG_FRAME_FID_PHONE;
+ diag_data->header.src = data->dst;
+ result = uapi_diag_service_send_data(diag_data);
+ free(diag_data);
+ return result;
+}
+
+uint32_t mcu_os_sys_reset(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+ uint8_t res[DIAG_RES_LEN] = {0x80, 0x82, 0x00, 0x00};
+
+ send_spp_diag_msg(g_app_diag_flag, &g_mcu_diag_header, res, DIAG_RES_LEN);
+ reset_deal_with_fs();
+
+ set_cpu_utils_reset_cause(REBOOT_CAUSE_APPLICATION_SYSRESETREQ);
+ hal_reboot_chip();
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_fs_test(uint8_t *para, uint32_t para_len)
+{
+ test_file_system(para, para_len);
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_os_heap_info(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+#if LOSCFG_MEM_TASK_STAT && defined __LITEOS__
+ LosMemPoolInfo *heapMan = (LosMemPoolInfo*)OS_EXTEND_MEM_ADDR;
+ TSK_INFO_S task_info;
+ uint32_t taskId;
+
+ wstp_print("\r\n");
+ OsMemInfoPrint(OS_EXTEND_MEM_ADDR);
+ wstp_print("\n\t\tstack name task id used size peak size\n");
+ for (taskId = 0; taskId <= LOSCFG_BASE_CORE_TSK_LIMIT; taskId++) {
+ if (0 != LOS_TaskInfoGet(taskId, &task_info)) {
+ // 过滤掉无用的task id
+ continue;
+ }
+ wstp_print("%22s %-5d 0x%-8x 0x%-8x\n", task_info.acName, taskId,
+ heapMan->stat.taskMemstats[taskId].memUsed, heapMan->stat.taskMemstats[taskId].memPeak);
+ }
+ wstp_print("\r\n\r\n");
+
+ heapMan = (LosMemPoolInfo*)OS_SYS_MEM_ADDR;
+ OsMemInfoPrint(OS_SYS_MEM_ADDR);
+ wstp_print("\n\t\tstack name task id used size peak size\n");
+ for (taskId = 0; taskId <= LOSCFG_BASE_CORE_TSK_LIMIT; taskId++) {
+ if (0 != LOS_TaskInfoGet(taskId, &task_info)) {
+ // 过滤掉无用的task id
+ continue;
+ }
+ wstp_print("%22s %-5d 0x%-8x 0x%-8x\n", task_info.acName, taskId,
+ heapMan->stat.taskMemstats[taskId].memUsed, heapMan->stat.taskMemstats[taskId].memPeak);
+ }
+ wstp_print("\r\n");
+
+#endif
+#if defined __FREERTOS__ && defined FREERTOS_DEBUG
+ freertos_heap_print();
+#endif
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_os_stack_info(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+
+#if LOSCFG_MEM_TASK_STAT && defined __LITEOS__
+ TSK_INFO_S task_info;
+ uint32_t taskId;
+ uint32_t total_size = 0;
+ uint32_t used_size = 0;
+ uint32_t peak_size = 0;
+
+ wstp_print("\n stack name task id prio status stack addr total size used size peak size percentage\n"
+ " -------------- ------- --- ------ --------- -------- -------- --------\n");
+ for (taskId = 0; taskId <= LOSCFG_BASE_CORE_TSK_LIMIT; taskId++) {
+ if (0 != LOS_TaskInfoGet(taskId, &task_info)) {
+ continue;
+ }
+ wstp_print("%22s %-5d %-2d %-2d %-10p 0x%-8x 0x%-8x 0x%-8x %.02f\n", task_info.acName,
+ task_info.uwTaskID, task_info.usTaskPrio, task_info.usTaskStatus, task_info.uwTopOfStack,
+ task_info.uwStackSize, task_info.uwCurrUsed, task_info.uwPeakUsed, (task_info.uwCurrUsed*1.0f/task_info.uwStackSize));
+ total_size += task_info.uwStackSize;
+ used_size += task_info.uwCurrUsed;
+ peak_size += task_info.uwPeakUsed;
+ }
+ wstp_print("\n total size(%d) used size(%d) peak size(%d)\n",total_size,used_size,peak_size);
+#endif
+
+#if defined __FREERTOS__ && defined FREERTOS_DEBUG
+ vTaskInfoPrint();
+#endif
+
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_fs_format(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+ int ret, i;
+
+ /* 解决后台文件打开导致格式化失败的问题,先关闭可能打开的后台文件*/
+ for (i = 0; i < FILE_MAX_NUM; i++) {
+ close(i);
+ }
+ /* 如果离线日志打开,则关闭离线日志 */
+ uapi_zdiag_set_offline_log_enable(false);
+
+#ifdef CFG_DRIVERS_MMC
+ wstp_print("\r\nemmc format,wait a moment!\r\n");
+ ret = emmc_drv_format();
+ if (ret != ENOERR) {
+ ret = ERRCODE_FAIL;
+ } else {
+ ret = ERRCODE_SUCC;
+ }
+#endif
+
+#ifdef CFG_DRIVERS_NANDFLASH
+ wstp_print("\r\nnandflash format,wait a moment!\r\n");
+ nandflash_yaffs_format();
+ ret = ERRCODE_SUCC;
+#endif
+
+ return ret;
+}
+
+static uint32_t mcu_fs_rw_test(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+
+ uint8_t *ptr = NULL;
+ int ret;
+ char path[] = "/user/user_test.log";
+ FILE *fp = NULL;
+
+ fp = fopen(path, "w+");
+ if (fp == NULL) {
+ wstp_print("open fail\r\n");
+ return ERRCODE_FAIL;
+ }
+ ret = test_libc_rw(fp);
+ fclose(fp);
+ remove(path);
+
+ return ret;
+}
+
+static uint32_t mcu_fs_set_clk(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+#ifdef CFG_DRIVERS_MMC
+ char *ptr = (char*)para;
+ uint8_t mode = 0;
+ struct hci_softc *sc;
+ if (para == NULL) {
+ return ERRCODE_FAIL;
+ }
+
+ mode = (uint8_t)strtoul(ptr, NULL, 0);
+ sc = get_mmc_resource(0);
+ if (mode == 0) {
+ wstp_print("set emmc clk to 98M!!!\r\n");
+ mmc_set_clock_with_way2(sc, SDIOM_SRC_CLK_FREQ_LVL_98M_VAL);
+ g_app_emmc_clk = SDIOM_SRC_CLK_FREQ_LVL_98M_VAL;
+ } else if (mode == 1) {
+ wstp_print("set emmc clk to 32M!!!\r\n");
+ mmc_set_clock_with_way2(sc, SDIOM_SRC_CLK_LOW_FREQ_VAL);
+ g_app_emmc_clk = SDIOM_SRC_CLK_LOW_FREQ_VAL;
+ } else {
+ wstp_print("Input para Error!!!\r\n");
+ return ERRCODE_FAIL;
+ }
+#endif
+
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_fs_read_clk(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+#ifdef CFG_DRIVERS_MMC
+ wstp_print("\r\nclock:%d", g_app_emmc_clk);
+#endif
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_fs_check(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ char *ptr = (char *)para;
+ uint32_t FileSize = 0;
+ uint32_t times;
+ uint32_t len;
+ char FilePath[MAX_FILE_PATH_SIZE] = "/user/";
+ FILE *fp = NULL;
+
+ if (para_len == 0) {
+ return ERRCODE_FAIL;
+ }
+
+ ptr++;
+ if (memcpy_s(FilePath + strlen(FilePath), (MAX_FILE_PATH_SIZE - strlen(FilePath) - 1), ptr,
+ (strchr(ptr, '"') - ptr)) != EOK) {
+ wstp_print("memcpy ERR!,The file path is too long,\
+ the total length of the file path should be less than %d\r\n", MAX_FILE_PATH_SIZE);
+ return ERRCODE_FAIL;
+ }
+
+ ptr += (strchr(ptr, '"') - ptr);
+ ptr += TEST_PARA_2;
+ FileSize = strtoul(ptr, NULL, 0);
+ if (FileSize > FS_TEST_1M_BYTES) { FileSize = FS_TEST_1M_BYTES; }
+ times = (FileSize / BYTES_LEN_4K) ? (FileSize / BYTES_LEN_4K) : 1;
+
+ fp = fopen(FilePath, "r");
+ if (fp == NULL) {
+ wstp_print("open fail!path:%s\r\n", FilePath);
+ return ERRCODE_FAIL;
+ }
+
+ len = test_libc_read(fp, times);
+ fclose(fp);
+ if (len == times * BYTES_LEN_4K) {
+ return ERRCODE_SUCC;
+ } else {
+ return ERRCODE_FAIL;
+ }
+}
+
+
+static int32_t rm_dir(const char *pathname)
+{
+ struct dirent *dirent = NULL;
+ struct stat stat_info;
+ DIR *d = NULL;
+ char *fullpath = NULL;
+ int ret;
+
+ (void)memset_s(&stat_info, sizeof(stat_info), 0, sizeof(struct stat));
+ if (stat(pathname, &stat_info) != 0) {
+ wstp_print("read file info fail! %s, err=%d\n", pathname, get_errno());
+ return -1;
+ }
+
+ if (S_ISREG(stat_info.st_mode)) {
+ wstp_print("rm path: %s \n", pathname);
+ return unlink(pathname);
+ }
+ d = opendir(pathname);
+ while (1) {
+ dirent = readdir(d);
+ if (dirent == NULL) {
+ break;
+ }
+ if (strcmp(dirent->d_name, "..") && strcmp(dirent->d_name, ".")) {
+ size_t fullpathBufSize = strlen(pathname) + strlen(dirent->d_name) + 2; // 2 is sep eof length
+ fullpath = (char *)malloc(fullpathBufSize);
+ if (fullpath == NULL) {
+ wstp_print("malloc failure!\n");
+ (void)closedir(d);
+ return -1;
+ }
+ ret = snprintf_s(fullpath, fullpathBufSize, fullpathBufSize - 1, "%s/%s", pathname, dirent->d_name);
+ if (ret < 0) {
+ wstp_print("name is too long!\n");
+ free(fullpath);
+ (void)closedir(d);
+ return -1;
+ }
+ (void)rm_dir(fullpath);
+ free(fullpath);
+ }
+ }
+ (void)closedir(d);
+ return rmdir(pathname);
+}
+
+static uint32_t mcu_fs_rm(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ if (para_len == 0) {
+ return ERRCODE_FAIL;
+ }
+
+ char *ptr = (char *)para;
+ char file_path[MAX_FILE_PATH_SIZE] = "";
+
+ ptr++;
+ if (memcpy_s(file_path + strlen(file_path), (MAX_FILE_PATH_SIZE - strlen(file_path) - 1), ptr,
+ (strchr(ptr, '"') - ptr)) != EOK) {
+ wstp_print("memcpy ERR!,The file path is %s, max len is %d\r\n", para, MAX_FILE_PATH_SIZE);
+ return ERRCODE_FAIL;
+ }
+
+ wstp_print("excute rm path:%s\r\n", file_path);
+ if (rm_dir(file_path) >= 0) {
+ return ERRCODE_SUCC;
+ } else {
+ return ERRCODE_FAIL;
+ }
+}
+
+static uint32_t mcu_get_wstp_version(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ unused(para);
+ char str[VER_STR_MAX];
+#if (defined BUILD_TIME) && (defined TARGET_NAME)
+ (void)sprintf_s(str, VER_STR_MAX, "\r\nVersion:%s %s %s\r\n",
+ get_version_string(), TARGET_NAME, BUILD_TIME);
+#else
+ (void)sprintf_s(str, VER_STR_MAX, "\r\nVersion:%s\r\n", get_version_string());
+#endif
+ wstp_print(str);
+
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_fs_write(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ char *ptr = (char *)para;
+ uint32_t FileSize = 0;
+ uint32_t times;
+ uint32_t len;
+ char FilePath[MAX_FILE_PATH_SIZE] = "/user/";
+
+ if (para_len == 0) {
+ return ERRCODE_FAIL;
+ }
+
+ ptr++;
+ if (memcpy_s(FilePath + strlen(FilePath), (MAX_FILE_PATH_SIZE - strlen(FilePath) - 1), ptr,
+ (strchr(ptr, '"') - ptr)) != EOK) {
+ wstp_print("memcpy ERR!,The file path is too long,\
+ the total length of the file path should be less than %d\r\n", MAX_FILE_PATH_SIZE);
+ return ERRCODE_FAIL;
+ }
+ ptr += (strchr(ptr, '"') - ptr);
+ ptr += TEST_PARA_2;
+ FileSize = strtoul(ptr, NULL, 0);
+ remove(FilePath);
+ if (FileSize > FS_TEST_1M_BYTES) { FileSize = FS_TEST_1M_BYTES; }
+ times = (FileSize / BYTES_LEN_4K) ? (FileSize / BYTES_LEN_4K) : 1;
+
+ FILE *fp = NULL;
+ fp = fopen(FilePath, "w+");
+ if (fp == NULL) {
+ wstp_print("open fail!path:%s\r\n", FilePath);
+ return ERRCODE_FAIL;
+ }
+
+ len = test_libc_write(fp, times);
+ fclose(fp);
+ if (len == times * BYTES_LEN_4K) {
+ return ERRCODE_SUCC;
+ } else {
+ return ERRCODE_FAIL;
+ }
+}
+
+#if (CONFIG_DFX_SUPPORT_OFFLINE_LOG_FILE == DFX_YES)
+static uint32_t mcu_init_logfile(uint8_t *para, store_file_cfg_t *cfg, uint32_t *arr, uint32_t arr_len)
+{
+ char *ptr = (char *)para;
+ char *ptr_end = NULL;
+
+ if (strtoul(ptr, &ptr_end, 0) <= 0) {
+ return ERRCODE_FAIL;
+ }
+
+ for (uint32_t j = 0; j < arr_len; j++) {
+ arr[j] = strtoul(ptr, &ptr_end, 0);
+ ptr = ptr_end + 1;
+ }
+
+ uint32_t clear_flag = 0;
+ uint32_t i = 0;
+
+ cfg->mult_files = arr[i++];
+ cfg->file_size = arr[i++];
+ cfg->enable_cache = arr[i++];
+ cfg->cache_size = arr[i++];
+ i++;
+ clear_flag = arr[i];
+ cfg->path = "/user/test/";
+ cfg->name = "log_file_write_0222.bin";
+ wstp_print("mult_files = %d, file_size = %d, enable_cache = %d, cache_size = %d clear_flag = %d\r\n",
+ cfg->mult_files, cfg->file_size, cfg->enable_cache, cfg->cache_size, clear_flag);
+
+ errcode_t ret = uapi_logfile_init();
+ if (ret != ERRCODE_SUCC) {
+ wstp_print("init logfile %s failed.\r\n", cfg->name);
+ return ERRCODE_FAIL;
+ }
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_clear_logfile_dir(store_file_cfg_t *cfg)
+{
+ static uint8_t full_path[MAX_FILE_PATH_LEN] = {0};
+ struct dirent *pdirent = NULL;
+ DIR *d = NULL;
+ uint32_t ret = ERRCODE_SUCC;
+
+ d = opendir(cfg->path);
+ if (d == NULL) {
+ if (mkdir(cfg->path, S_IREAD | S_IWRITE) != 0) {
+ wstp_print("mkdir %s failed!\r\n", cfg->path);
+ ret = ERRCODE_FAIL;
+ }
+ } else {
+ do {
+ pdirent = readdir(d);
+ if (pdirent == NULL) {
+ break;
+ }
+ wstp_print("file_dir clear start!\r\n");
+ if (strncpy_s((char *)full_path, MAX_FILE_PATH_LEN, cfg->path, strlen(cfg->path)) != EOK) {
+ ret = ERRCODE_FAIL;
+ break;
+ }
+ if (strcat_s((char *)full_path, MAX_FILE_PATH_LEN, pdirent->d_name) != EOK) {
+ ret = ERRCODE_FAIL;
+ break;
+ }
+ if (remove((char *)full_path) != 0) {
+ wstp_print("remove %s failed!\r\n", full_path);
+ ret = ERRCODE_FAIL;
+ break;
+ }
+ } while (pdirent != NULL);
+ }
+ (void)closedir(d);
+ return ret;
+}
+#endif /* CONFIG_DFX_SUPPORT_OFFLINE_LOG_FILE */
+
+static uint32_t mcu_logfile_write(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+#if (CONFIG_DFX_SUPPORT_OFFLINE_LOG_FILE == DFX_YES)
+ wstp_print("logfile test start!\r\n");
+ char test_msg[TEST_MSG_MAX_SIZE] = {0};
+ #define TEST_NUM_ID 4
+ /*
+ arg[0] -- multi_num
+ arg[1] -- file_size
+ arg[2] -- enable_cache
+ arg[3] -- cache_size
+ arg[4] -- test timer
+ arg[5] -- clear flag
+ */
+ uint32_t arg[LOG_FILE_ARG_NUM] = {0};
+ store_file_cfg_t cfg = {0};
+
+ if (mcu_init_logfile(para, &cfg, arg, LOG_FILE_ARG_NUM) != ERRCODE_SUCC) {
+ return ERRCODE_FAIL;
+ }
+
+ if (arg[LOG_FILE_ARG_NUM - 1] != 0) { /* arg[5] -- clear flag */
+ if (mcu_clear_logfile_dir(&cfg) != ERRCODE_SUCC) {
+ wstp_print("clear file_dir error!\r\n");
+ return ERRCODE_FAIL;
+ }
+ }
+
+ errcode_t ret = uapi_logfile_open(STORE_DIAG, &cfg);
+ if (ret != ERRCODE_SUCC) {
+ wstp_print("open log_file %s failed.\r\n", cfg.name);
+ return ERRCODE_FAIL;
+ }
+
+ for (uint32_t i = 0; i < arg[TEST_NUM_ID]; i++) { /* arg[2] -- test timer */
+ (void)memset_s(test_msg, sizeof(test_msg), 0, sizeof(test_msg));
+ if (sprintf_s(test_msg, sizeof(test_msg), "abcdef%10d", i + 1) < 0) {
+ wstp_print("sprintf_s failed.\r\n");
+ return ERRCODE_FAIL;
+ }
+ ret = uapi_logfile_write(STORE_DIAG, 0, (uint8_t*)&test_msg, strlen(test_msg));
+ if (ret != ERRCODE_SUCC) {
+ wstp_print("write logfile failed.\r\n");
+ return ERRCODE_FAIL;
+ }
+ dfx_sleep(10); /* 10 : sleep 10ms */
+ }
+
+ ret = uapi_logfile_close(STORE_DIAG);
+ if (ret != ERRCODE_SUCC) {
+ wstp_print("close logfile %s failed.\r\n", cfg.name);
+ return ERRCODE_FAIL;
+ }
+#endif /* CONFIG_DFX_SUPPORT_OFFLINE_LOG_FILE */
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_test_dtcm_baudwidth(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+ uint64_t start_time, end_time;
+ uint32_t total_time;
+ uint32_t bw;
+
+ char *test_buf = (char*)(APP_DTCM_ORIGIN + DTCM_RAM_OFF);
+ uint32_t irq_sts = osal_irq_lock();
+ start_time = uapi_tcxo_get_us();
+ if (memcpy_s(test_buf, BUFF_LEN_48K, APP_DTCM_ORIGIN, BUFF_LEN_48K) != 0) {
+ wstp_print("[dctm mem test]dtcm read memcpy_s fail.\r\n");
+ }
+ end_time = uapi_tcxo_get_us();
+ osal_irq_restore(irq_sts);
+ total_time = (uint32_t)(end_time - start_time);
+ bw = (ONE_SECOND / total_time) * BUFF_LEN_48K / (MB_SIZE);
+ wstp_print("[dctm mem test]dtcm read time:%dus bw:%dMB/s\r\n", total_time, bw);
+
+ irq_sts = osal_irq_lock();
+ start_time = uapi_tcxo_get_us();
+ if (memcpy_s(test_buf, BUFF_LEN_48K, APP_DTCM_ORIGIN, BUFF_LEN_48K) != 0) {
+ wstp_print("[dctm mem test]dtcm write memcpy_s fail.\r\n");
+ }
+ end_time = uapi_tcxo_get_us();
+ osal_irq_restore(irq_sts);
+ total_time = (uint32_t)(end_time - start_time);
+ bw = (ONE_SECOND / total_time) * BUFF_LEN_48K / (MB_SIZE);
+ wstp_print("[dctm mem test]dtcm write time:%dus bw:%dMB/s\r\n", total_time, bw);
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_test_l2m_baudwidth(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+ uint64_t start_time, end_time;
+ uint32_t total_time;
+ uint32_t bw;
+
+#if DSP_L2RAM_AREA_SIZE == 8
+ char* l2m_ptr = (char*)(&__l2m_dsp_data_end);
+#else
+ char* l2m_ptr = (char*)(&__l2m_gpu_data_end);
+#endif
+ char *test_buf = (char*)(APP_DTCM_ORIGIN + DTCM_RAM_OFF);
+ uint32_t irq_sts = osal_irq_lock();
+ start_time = uapi_tcxo_get_us();
+ if (memcpy_s(test_buf, BUFF_LEN_48K, l2m_ptr, BUFF_LEN_48K) != 0) {
+ wstp_print("[l2ram mem test]l2ram read memcpy_s fail.\r\n");
+ }
+ end_time = uapi_tcxo_get_us();
+ osal_irq_restore(irq_sts);
+ total_time = end_time - start_time;
+ bw = (ONE_SECOND / total_time) * BUFF_LEN_48K / (MB_SIZE);
+ wstp_print("[l2m mem test]l2m read time:%dus bw:%dMB/s\r\n", total_time, bw);
+
+ irq_sts = osal_irq_lock();
+ start_time = uapi_tcxo_get_us();
+ if (memcpy_s(l2m_ptr, BUFF_LEN_48K, test_buf, BUFF_LEN_48K) != 0) {
+ wstp_print("[l2ram mem test]l2ram write memcpy_s fail.\r\n");
+ }
+ end_time = uapi_tcxo_get_us();
+ osal_irq_restore(irq_sts);
+ total_time = end_time - start_time;
+ bw = (ONE_SECOND / total_time) * BUFF_LEN_48K / (MB_SIZE);
+ wstp_print("[l2m mem test]l2m write time:%dus bw:%dMB/s\r\n", total_time, bw);
+
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_test_mmc_baudwidth(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+#ifdef CFG_DRIVERS_MMC
+ char* path = "/user/test_spped.bin";
+ wstp_print("emmc fs bw test start!please wait...\r\n");
+ fs_test_rw_speed(path, BYTES_LEN_128);
+ fs_test_rw_speed(path, BYTES_LEN_512);
+ fs_test_rw_speed(path, BYTES_LEN_1K);
+ fs_test_rw_speed(path, BYTES_LEN_4K);
+ fs_test_rw_speed(path, BYTES_LEN_8K);
+#else
+ wstp_print("[emmc mem test]The current version does not support EMMC.\r\n");
+#endif
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_test_psram_baudwidth(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+ uint64_t start_time, end_time;
+ uint32_t total_time;
+ uint32_t bw;
+
+#ifdef CONFIG_PSRAM_SUPPORT
+ char *test_buf = (char*)malloc(BUFF_LEN_48K);
+ if (test_buf == NULL) {
+ wstp_print("[psram mem test]buf malloc fail!\r\n");
+ return ERRCODE_FAIL;
+ }
+ char *test_buf1 = (char*)(APP_DTCM_ORIGIN + DTCM_RAM_OFF);
+
+ uint32_t irq_sts = osal_irq_lock();
+ start_time = uapi_tcxo_get_us();
+ if (memcpy_s(test_buf1, BUFF_LEN_48K, test_buf, BUFF_LEN_48K) != 0) {
+ wstp_print("[psram mem test]psram read memcpy_s fail.\r\n");
+ }
+ end_time = uapi_tcxo_get_us();
+ osal_irq_restore(irq_sts);
+ total_time = (uint32_t)(end_time - start_time) - TCXO_ERROR;
+ bw = ONE_SECOND / total_time * BUFF_LEN_48K / MB_SIZE;
+ wstp_print("[psram mem test]psram read time:%dus bw:%dMB/s\r\n", total_time, bw);
+
+ irq_sts = osal_irq_lock();
+ start_time = uapi_tcxo_get_us();
+ if (memcpy_s(test_buf, BUFF_LEN_48K, test_buf1, BUFF_LEN_48K) != 0) {
+ wstp_print("[psram mem test]psram write memcpy_s fail.\r\n");
+ }
+ end_time = uapi_tcxo_get_us();
+ osal_irq_restore(irq_sts);
+ total_time = (uint32_t)(end_time - start_time) - TCXO_ERROR;
+ bw = (ONE_SECOND / total_time) * BUFF_LEN_48K / (MB_SIZE);
+ wstp_print("[psram mem test]psram write time:%dus bw:%dMB/s\r\n", total_time, bw);
+ free(test_buf);
+#else
+ wstp_print("[psram mem test]The current version does not support PSRAM.\r\n");
+#endif
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_test_norflash_baudwidth(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+ uint64_t start_time, end_time;
+ uint32_t total_time;
+ uint32_t bw;
+
+ char *test_buf = (char*)(APP_DTCM_ORIGIN + DTCM_RAM_OFF);
+ uint32_t irq_sts = osal_irq_lock();
+ start_time = uapi_tcxo_get_us();
+ if (memcpy_s(test_buf, BUFF_LEN_48K, FLASH_RESERVED_ADDR, BUFF_LEN_48K) != 0) {
+ wstp_print("[norflash mem test]norflash read memcpy_s fail.\r\n");
+ }
+ end_time = uapi_tcxo_get_us();
+ osal_irq_restore(irq_sts);
+ total_time = (uint32_t)(end_time - start_time);
+ bw = (ONE_SECOND / total_time) * BUFF_LEN_48K / (MB_SIZE);
+ wstp_print("[norflash mem test]nor flash read time:%dus bw:%dMB/s\r\n", total_time, bw);
+
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_test_nandflash_baudwidth(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+#ifdef CFG_DRIVERS_NANDFLASH
+ char* path = "/user/test_spped.bin";
+ wstp_print("nandflash fs bw test start!please wait...\r\n");
+ fs_test_rw_speed(path, BYTES_LEN_128);
+ fs_test_rw_speed(path, BYTES_LEN_512);
+ fs_test_rw_speed(path, BYTES_LEN_1K);
+ fs_test_rw_speed(path, BYTES_LEN_4K);
+ fs_test_rw_speed(path, BYTES_LEN_8K);
+#else
+ wstp_print("[nandflash mem test]The current version does not support nandflash.\r\n");
+#endif
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_get_fs_info(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+ int i;
+ struct statfs file_buf = {0};
+
+ for (i = 0; i < FS_VOLUMES_NUM; i++) {
+ /* 获取文件系统状态 */
+ if (statfs(g_volume_names[i], &file_buf) != 0) {
+ return ERRCODE_FAIL;
+ }
+
+ if (file_buf.f_bfree >= FS_NODE_INFO_SPACE) {
+ file_buf.f_bfree = file_buf.f_bfree - FS_NODE_INFO_SPACE;
+ } else {
+ file_buf.f_bfree = 0;
+ }
+
+ wstp_print("[FS INFO]%s:\r\n", g_volume_names[i]);
+ wstp_print("[FS INFO]total size=%uKB used size=%uKB free size=%uKB\r\n",
+ ((uint32_t)(file_buf.f_blocks * file_buf.f_bsize) / KB_SIZE),
+ ((uint32_t)((file_buf.f_blocks - file_buf.f_bfree) * file_buf.f_bsize) / KB_SIZE),
+ ((uint32_t)(file_buf.f_bfree * file_buf.f_bsize) / KB_SIZE));
+ }
+
+ return ERRCODE_SUCC;
+}
+
+static void pm_lcd_on_pre_handle(void)
+{
+ display_resume_power_on();
+#ifdef QSPI_DISPLAY
+ writew(0x5700c058, 0x0); // sagpio_l22 set gpio mode
+#else
+ writew(0x5700c058, 0x1); // sagpio_l22 set te mode
+#endif
+ writew(0x5700c658, 0x2); // sagpio_l22 open ie
+#ifndef QSPI_DISPLAY
+ pmu_ldo_power_on(PMU_LDO_AUXLDO3, TURN_ON);
+#endif
+}
+
+uint32_t mcu_pm_lcd_on(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+#ifdef SUPPORT_POWER_MANAGER
+ const power_display_svr_api_t *display_api = power_display_svr_get_api();
+ return display_api->turn_on_screen();
+#endif
+ uapi_pm_request_mode(PM_ID_VIDEO, PM_MODE_PERFORMACE);
+
+ if (lcd_get_status()) {
+ wstp_print("\r\nLCD has benn on\r\n");
+ return ERRCODE_SUCC;
+ }
+ pm_lcd_on_pre_handle();
+ lcd_bus_api *bus_api = lcd_get_bus_api();
+ ext_errno ret = bus_api->bus_resume();
+ if (ret != 0) {
+ wstp_print("bus resume error ret=%x\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+#ifndef QSPI_DISPLAY
+ if (g_dpu_ready_flag == false) {
+ ret = drv_dpu_resume(NULL);
+ if (ret != 0) {
+ wstp_print("drv dpu resume error ret=%x\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+ }
+#endif
+#ifdef SUPPORT_GPU_JPEG
+ (void)drv_jpeg_resume(NULL);
+#endif
+ ret = drv_vau_resume(NULL);
+ if (ret != 0) {
+ wstp_print("drv vau resume error ret=%x\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+ ret = uapi_lcd_init();
+ if (ret != 0 && ret != EXT_ERR_MIPI_ALREADY_INIT) {
+ wstp_print("LCD init error ret=%x\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+#if defined(ENABLE_UIKIT) || defined(ENABLE_LVGL)
+ NotifyScreenOn(); // Instruct the uikit to start the display operation.
+#endif
+ if (g_dpu_ready_flag == false) {
+ touch_screen_resume(); // open touch
+ }
+#ifdef CONFIG_CLDO1PD_SUPPORT
+ pmu_control_cldo1_sleep_bypass(TURN_ON);
+#endif
+ lcd_set_status(true);
+ return ERRCODE_SUCC;
+}
+uint32_t mcu_pm_into_ship_mode(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+ uapi_sys_shipmode(0);
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_pm_into_force_ds_mode(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+
+ set_cpu_utils_reset_cause(REBOOT_CAUSE_APPLICATION_SYSRESETREQ);
+ writew(0x5702C010, 0x5A5A);
+ hal_reboot_chip();
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_pm_req_mode(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+
+ if (strcmp((char*)para, "lp") == 0) {
+ errcode_t ret = uapi_pm_request_mode(g_pm_req_mode_usr, PM_MODE_LP);
+ wstp_print("pm requst mode user 0x%x reuest mode lp, ret 0x%x.\r\n", g_pm_req_mode_usr, ret);
+ } else if (strcmp((char*)para, "performace") == 0) {
+ errcode_t ret = uapi_pm_request_mode(g_pm_req_mode_usr, PM_MODE_PERFORMACE);
+ wstp_print("pm requst mode user 0x%x reuest mode perfermance, ret 0x%x.\r\n", g_pm_req_mode_usr, ret);
+ } else if (strcmp((char*)para, "normal") == 0) {
+ errcode_t ret = uapi_pm_request_mode(g_pm_req_mode_usr, PM_MODE_NORMAL);
+ wstp_print("pm requst mode user 0x%x reuest mode normal, ret 0x%x.\r\n", g_pm_req_mode_usr, ret);
+ } else if (strcmp((char*)para, "clean") == 0) {
+ for (pm_id_t i = 0; i < PM_ID_MAX; i++) {
+ uapi_pm_request_mode(i, PM_MODE_LP);
+ }
+ wstp_print("pm mode back to lp mode for all users.\r\n");
+ } else {
+ wstp_print("pm request mode is not supported.\r\n");
+ return ERRCODE_FAIL;
+ }
+
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_set_pm_req_mode_usr(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ uint8_t pm_id = *(char*)para - '0';
+
+ if (pm_id >= PM_ID_MAX) {
+ wstp_print("pm requst mode user 0x%x check fail.\r\n", pm_id);
+ return ERRCODE_FAIL;
+ }
+ g_pm_req_mode_usr = (pm_id_t)pm_id;
+
+ wstp_print("pm requst mode user 0x%x reuest mode.\r\n", g_pm_req_mode_usr);
+ return ERRCODE_SUCC;
+}
+
+static void pm_print_veto_info(void)
+{
+ uint8_t i = 0;
+ pm_veto_t *pm_veto_ptr = pm_veto_get_info();
+ wstp_print("last_veto_id=%d, last_veto_lr=%x, veto_timeout_timestamp=%llu, total_counts=%d\r\n",
+ pm_veto_ptr->last_veto_id, pm_veto_ptr->last_veto_lr, pm_veto_ptr->veto_timeout_timestamp,
+ pm_veto_ptr->veto_counts.total_counts);
+ for (i = 0; i < PM_ID_MAX; i++) {
+ // wstp_print("sub_counts[%d] = %d\r\n", i, pm_veto_ptr->veto_counts.sub_counts[i]);
+ wstp_print("sub_counts[%d] %s = %d\r\n", i,get_pm_id_name(i), pm_veto_ptr->veto_counts.sub_counts[i]);
+ }
+}
+
+static void pm_print_active_veto_info(void)
+{
+ uint8_t i = 0;
+ uint8_t active_count = 0;
+ pm_veto_t *pm_veto_ptr = pm_veto_get_info();
+
+ wstp_print("========== PM Active Veto Info ==========\r\n");
+ wstp_print("Total votes: %d\r\n", pm_veto_ptr->veto_counts.total_counts);
+
+ if (pm_veto_ptr->veto_counts.total_counts == 0) {
+ wstp_print("No active votes.\r\n");
+ } else {
+ wstp_print("Active votes:\r\n");
+ for (i = 0; i < PM_ID_MAX; i++) {
+ if (pm_veto_ptr->veto_counts.sub_counts[i] > 0) {
+ wstp_print(" [%d] %s: %d vote(s)\r\n",
+ i,
+ get_pm_id_name(i),
+ pm_veto_ptr->veto_counts.sub_counts[i]);
+ active_count++;
+ }
+ }
+ wstp_print("Total active modules: %d\r\n", active_count);
+ }
+
+ if (pm_veto_ptr->veto_timeout_timestamp > 0) {
+ wstp_print("Veto timeout timestamp: %llu ms\r\n", pm_veto_ptr->veto_timeout_timestamp);
+ }
+
+ wstp_print("========================================\r\n");
+}
+
+static void lpc_print_veto_info(void)
+{
+ uint8_t i = 0;
+ volatile lpc_veto_type *lpc_veto_ptr = lpc_get_sys_sleep_veto();
+ wstp_print("g_lpc_mcpu_i2c_sleep_vetos=%d\r\n", lpc_get_mcpu_i2c_sleep_veto());
+ for (i = 0; i < LPC_ID_MAX; i++) {
+ wstp_print("i=%d, lpc_sleep_vetos=%d, lr_pointer=%x\r\n",
+ i, lpc_veto_ptr[i].lpc_sleep_vetos, lpc_veto_ptr[i].lr_pointer);
+ }
+}
+
+uint32_t mcu_pm_dfx_mode(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+
+ uapi_get_current_pm_mode_info();
+ pm_print_veto_info();
+ lpc_print_veto_info();
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_pm_veto_get(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+
+ pm_print_active_veto_info();
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_task_switch_print_ctrl(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+
+ if (para == NULL) {
+ wstp_print("Usage: AT^TASKSWITCHPRINT=<0|1>\r\n");
+ wstp_print(" 0: Disable task switch print\r\n");
+ wstp_print(" 1: Enable task switch print\r\n");
+ return ERRCODE_FAIL;
+ }
+
+ uint32_t enable = atoi((char*)para);
+
+ extern void OsTaskSwitchPrintSetEnable(uint32_t enable);
+ OsTaskSwitchPrintSetEnable(enable);
+
+ wstp_print("Task switch print %s\r\n", enable ? "enabled" : "disabled");
+
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_pm_cldo1_power_down(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+
+ if (strcmp((char*)para, "yes") == 0) {
+ pmu_control_cldo1_sleep_bypass(TURN_OFF);
+ wstp_print("pm request cldo1 power down at sleep.\r\n");
+ } else if (strcmp((char*)para, "no") == 0) {
+ pmu_control_cldo1_sleep_bypass(TURN_ON);
+ wstp_print("pm request cldo1 power on at sleep.\r\n");
+ } else {
+ wstp_print("pm request cldo1 para is not supported.\r\n");
+ return ERRCODE_FAIL;
+ }
+ return ERRCODE_SUCC;
+}
+
+static void mcu_aes_get_password(uint32_t keyslot)
+{
+ errcode_t ret;
+ uapi_drv_klad_attr_t test_klad_attr = {
+ .klad_cfg = {
+ .rootkey_type = UAPI_DRV_KDF_HARD_KEY_TYPE_ABRK_REE,
+ },
+ .key_cfg = {
+ .engine = UAPI_DRV_KLAD_ENGINE_AES,
+ .decrypt_support = true,
+ .encrypt_support = true,
+ },
+ };
+ uapi_drv_klad_effective_key_t test_klad_key = {
+ .kdf_hard_alg = UAPI_DRV_KDF_HARD_ALG_SHA256,
+ .key_parity = false,
+ .key_size = 16, // 16 固定的密钥长度
+ .salt = (uint8_t *)g_decrypt_aes_salt,
+ .salt_length = sizeof(g_decrypt_aes_salt),
+ };
+
+ uint32_t klad;
+ ret = uapi_drv_klad_create(&klad);
+ if (ret != ERRCODE_SUCC) {
+ return;
+ }
+
+ ret = uapi_drv_klad_attach(klad, UAPI_DRV_KLAD_DEST_MCIPHER, keyslot);
+ if (ret != ERRCODE_SUCC) {
+ return;
+ }
+
+ ret = uapi_drv_klad_set_attr(klad, &test_klad_attr);
+ if (ret != ERRCODE_SUCC) {
+ (void)uapi_drv_klad_destroy(klad);
+ return;
+ }
+
+ ret = uapi_drv_klad_set_effective_key(klad, &test_klad_key);
+ if (ret != ERRCODE_SUCC) {
+ (void)uapi_drv_klad_destroy(klad);
+ return;
+ }
+
+ ret = uapi_drv_klad_detach(klad, UAPI_DRV_KLAD_DEST_MCIPHER, keyslot);
+ if (ret != ERRCODE_SUCC) {
+ wstp_print("[ERR] %d, %s (%d)\n", ret, __FUNCTION__, __LINE__);
+ (void)uapi_drv_klad_destroy(klad);
+ return;
+ }
+
+ (void)uapi_drv_klad_destroy(klad);
+}
+
+static errcode_t mcu_test_crypto_cipher_create(uint32_t *cipher, uint32_t *keyslot)
+{
+ errcode_t ret;
+ uapi_drv_cipher_symc_attr_t cipher_attr = {
+ .symc_alg = UAPI_DRV_CIPHER_SYMC_ALG_AES,
+ .work_mode = UAPI_DRV_CIPHER_SYMC_WORK_MODE_CBC,
+ .symc_type = UAPI_DRV_CIPHER_SYMC_TYPE_NORMAL,
+ .is_long_term = true
+ };
+
+ ret = uapi_drv_cipher_symc_create(cipher, &cipher_attr);
+ if (ret != ERRCODE_SUCC) {
+ return ret;
+ }
+
+ ret = uapi_drv_keyslot_create(keyslot, UAPI_DRV_KEYSLOT_TYPE_MCIPHER);
+ if (ret != ERRCODE_SUCC) {
+ goto cleanup0;
+ }
+
+ ret = uapi_drv_cipher_symc_attach(*cipher, *keyslot);
+ if (ret != ERRCODE_SUCC) {
+ goto cleanup1;
+ }
+
+ return ERRCODE_SUCC;
+
+cleanup1:
+ (void)uapi_drv_keyslot_destroy(*keyslot);
+cleanup0:
+ (void)uapi_drv_cipher_symc_destroy(*cipher);
+
+ return ret;
+}
+
+static errcode_t mcu_aes_cipher_process(aes_cypto_t crypt, uint8_t *src, uint8_t *dst, uint32_t len)
+{
+ errcode_t ret = ERRCODE_SUCC;
+ uint32_t cipher = INVALID_HANDLE;
+ uint32_t keyslot = INVALID_HANDLE;
+ uapi_drv_cipher_buf_attr_t src_buf = { .phys_addr = src, .buf_sec = UAPI_DRV_CIPHER_BUF_NONSECURE, };
+ uapi_drv_cipher_buf_attr_t dst_buf = { .phys_addr = dst, .buf_sec = UAPI_DRV_CIPHER_BUF_NONSECURE, };
+
+ uapi_drv_cipher_symc_ctrl_t ctrl = {
+ .symc_alg = UAPI_DRV_CIPHER_SYMC_ALG_AES,
+ .work_mode = UAPI_DRV_CIPHER_SYMC_WORK_MODE_CBC,
+ .symc_key_length = UAPI_DRV_CIPHER_SYMC_KEY_128BIT,
+ .symc_bit_width = UAPI_DRV_CIPHER_SYMC_BIT_WIDTH_128BIT,
+ .iv_change_flag = UAPI_DRV_CIPHER_SYMC_IV_CHANGE_ONE_PKG,
+ .iv_length = sizeof(g_decrypt_aes_iv),
+ };
+
+ (void)memcpy_s(ctrl.iv, sizeof(ctrl.iv), g_decrypt_aes_iv, sizeof(g_decrypt_aes_iv));
+
+ ret = mcu_test_crypto_cipher_create(&cipher, &keyslot);
+ if (ret != ERRCODE_SUCC) {
+ return ret;
+ }
+
+ ret = uapi_drv_cipher_symc_set_config(cipher, &ctrl);
+ if (ret != ERRCODE_SUCC) {
+ return ret;
+ }
+
+ mcu_aes_get_password(keyslot);
+
+ if (crypt == AES_ENCRYPT_TEST) {
+ ret = uapi_drv_cipher_symc_encrypt(cipher, &src_buf, &dst_buf, len);
+ } else {
+ ret = uapi_drv_cipher_symc_decrypt(cipher, &src_buf, &dst_buf, len);
+ }
+
+ (void)uapi_drv_cipher_symc_detach(cipher, keyslot);
+ (void)uapi_drv_keyslot_destroy(keyslot);
+ (void)uapi_drv_cipher_destroy(cipher);
+ return ret;
+}
+
+uint32_t mcu_aes_decrypt_sample(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+
+ uint32_t test_len = AES_SAMPLE_TEST_LEN;
+ uint8_t *test_src_addr = (uint8_t*)malloc(sizeof(uint8_t) * AES_SAMPLE_TEST_LEN);
+ if (test_src_addr == NULL) {
+ return ERRCODE_FAIL;
+ }
+ uint8_t *test_dst_addr = (uint8_t*)malloc(sizeof(uint8_t) * AES_SAMPLE_TEST_LEN);
+ if (test_dst_addr == NULL) {
+ free(test_src_addr);
+ return ERRCODE_FAIL;
+ }
+
+ (void)memset_s(test_src_addr, AES_SAMPLE_TEST_LEN, 0, AES_SAMPLE_TEST_LEN);
+ (void)memset_s(test_dst_addr, AES_SAMPLE_TEST_LEN, 0, AES_SAMPLE_TEST_LEN);
+
+ wstp_print("mcu aes decrypt sample start.\r\n");
+ for (uint32_t i = 0; i < AES_SAMPLE_TEST_LEN; i++) {
+ test_src_addr[i] = g_decrypt_aes_decryp[i];
+ }
+ mcu_aes_cipher_process(AES_DECRYPT_TEST, test_src_addr, test_dst_addr, AES_SAMPLE_TEST_LEN);
+ wstp_print("mcu aes decrypt result.\r\n");
+ for (uint32_t i = 0; i < AES_SAMPLE_TEST_LEN; i++) {
+ wstp_print("i=0x%x, src=0x%02x, dst=0x%02x\r\n", i, test_src_addr[i], test_dst_addr[i]);
+ }
+ wstp_print("mcu aes decrypt sample end.\r\n");
+ free(test_src_addr);
+ free(test_dst_addr);
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_aes_encrypt_sample(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+
+ uint32_t test_len = AES_SAMPLE_TEST_LEN;
+ uint8_t *test_src_addr = (uint8_t*)malloc(sizeof(uint8_t) * AES_SAMPLE_TEST_LEN);
+ if (test_src_addr == NULL) {
+ return ERRCODE_FAIL;
+ }
+ uint8_t *test_dst_addr = (uint8_t*)malloc(sizeof(uint8_t) * AES_SAMPLE_TEST_LEN);
+ if (test_dst_addr == NULL) {
+ free(test_src_addr);
+ return ERRCODE_FAIL;
+ }
+
+ (void)memset_s(test_src_addr, AES_SAMPLE_TEST_LEN, 0, AES_SAMPLE_TEST_LEN);
+ (void)memset_s(test_dst_addr, AES_SAMPLE_TEST_LEN, 0, AES_SAMPLE_TEST_LEN);
+
+ wstp_print("mcu aes encrypt sample start.\r\n");
+ for (uint32_t i = 0; i < AES_SAMPLE_TEST_LEN; i++) {
+ test_src_addr[i] = g_decrypt_aes_encryp[i];
+ }
+ mcu_aes_cipher_process(AES_ENCRYPT_TEST, test_src_addr, test_dst_addr, AES_SAMPLE_TEST_LEN);
+ wstp_print("mcu aes encrypt result.\r\n");
+ for (uint32_t i = 0; i < AES_SAMPLE_TEST_LEN; i++) {
+ wstp_print("i=0x%x, src=0x%02x, dst=0x%02x\r\n", i, test_src_addr[i], test_dst_addr[i]);
+ }
+ wstp_print("mcu aes encrypt sample end.\r\n");
+ free(test_src_addr);
+ free(test_dst_addr);
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_aes_set_gid(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+
+ uint8_t i;
+ uint8_t security_key = 0;
+ // After security_Key is set, GID cannot be configured and read.
+ (void)uapi_efuse_read_bit(&security_key, OTP_DEBUG_FUSED, OTP_DEBUG_FUSED_SECURIY_KEY_EN_ACCESS_BIT);
+ if (security_key == 0x1) {
+ wstp_print("gid forbit read, because security_key is closed.\r\n");
+ return ERRCODE_FAIL;
+ }
+
+ uint8_t *test_efuse_gid = (uint8_t*)malloc(sizeof(uint8_t) * OTP_SECURITY_KEY_GID_LEN);
+ if (test_efuse_gid == NULL) {
+ return ERRCODE_FAIL;
+ }
+ (void)memset_s(test_efuse_gid, OTP_SECURITY_KEY_GID_LEN, 0, OTP_SECURITY_KEY_GID_LEN);
+ (void)uapi_efuse_read_buffer(test_efuse_gid, OTP_SECURITY_KEY_GID, OTP_SECURITY_KEY_GID_LEN);
+ for (i = 0; i < OTP_SECURITY_KEY_GID_LEN; i++) {
+ wstp_print("current gid[0x%02x] val[0x%02x]\r\n", i, test_efuse_gid[i]);
+ }
+ wstp_print("start write into efuse gid.\r\n");
+ (void)uapi_efuse_write_buffer(OTP_SECURITY_KEY_GID, g_decrypt_aes_gid, OTP_SECURITY_KEY_GID_LEN);
+ wstp_print("write into efuse gid completely.\r\n");
+ (void)uapi_efuse_read_buffer(test_efuse_gid, OTP_SECURITY_KEY_GID, OTP_SECURITY_KEY_GID_LEN);
+ for (i = 0; i < OTP_SECURITY_KEY_GID_LEN; i++) {
+ wstp_print("write into gid[0x%02x] val[0x%02x]\r\n", i, test_efuse_gid[i]);
+ }
+ (void)uapi_efuse_write_bit(OTP_DEBUG_FUSED, OTP_DEBUG_FUSED_SECURIY_KEY_EN_ACCESS_BIT);
+ wstp_print("gid read locked.\r\n");
+ free(test_efuse_gid);
+ return ERRCODE_SUCC;
+}
+
+#if defined(CONFIG_ADC_SUPPORT_AUTO_SCAN)
+#define ADC_SAMPLE_TIMES 10
+#define ADC_SAMPLE_DATA_LEN 10010
+uint32_t g_adc_sample_times = 0;
+uint32_t g_save_adc_index = 0;
+uint32_t *g_save_adc_data = NULL;
+static uint32_t adc_auto_sample_show_data(uint8_t *para, uint32_t para_len)
+{
+ wstp_print("g_save_adc_index = %d\r\n", g_save_adc_index);
+ for (uint32_t i = 0; i < g_save_adc_index; i++) {
+ wstp_print("%d\r\n", g_save_adc_data[i]);
+ }
+
+ g_save_adc_index = 0;
+ g_adc_sample_times = 0;
+ free(g_save_adc_data);
+ g_save_adc_data = NULL;
+ return ERRCODE_SUCC;
+}
+
+static void adc_autosample_callback(uint8_t channel, uint32_t *buffer, uint32_t length, bool *next)
+{
+ unused(next);
+ if (g_adc_sample_times >= ADC_SAMPLE_TIMES) {
+ wstp_print("g_adc_sample_times = %d\r\n", g_adc_sample_times);
+ uapi_adc_auto_scan_ch_disable(channel);
+ return;
+ }
+
+ memcpy_s(g_save_adc_data + g_save_adc_index, length * sizeof(uint32_t), buffer, length * sizeof(uint32_t));
+ g_save_adc_index += length;
+ g_adc_sample_times++;
+ wstp_print("length = %d\r\n", length);
+ return;
+}
+
+static uint32_t adc_auto_sample_by_diag(uint8_t *para, uint32_t para_len)
+{
+ char *ptr = (char *)para;
+ char *token = NULL;
+ char *next_token = NULL;
+ uint32_t channel = 0;
+ uint32_t freq = 0;
+ uint32_t sample_time = 0;
+ uint32_t idx = 0;
+ uint32_t tmp[ADC_AUTODATA_PRT_INDEX3] = {0};
+ token = strtok_s((char*)ptr, ",", &next_token);
+ while (token != NULL) {
+ tmp[idx++] = strtoul(token, NULL, 10); // 10: 十进制
+ token = strtok_s(NULL, ",", &next_token);
+ }
+ channel = tmp[0];
+ freq = tmp[ADC_AUTODATA_PRT_INDEX1];
+ sample_time = tmp[ADC_AUTODATA_PRT_INDEX2];
+
+ adc_scan_config_t config = {0};
+ config.freq = (uint8_t)freq;
+ config.long_sample_time = sample_time;
+
+ g_save_adc_data = (uint32_t *)malloc(sizeof(uint32_t) * ADC_SAMPLE_DATA_LEN);
+ if (g_save_adc_data == NULL) {
+ wstp_print("malloc g_save_adc_data fail!\r\n");
+ return ERRCODE_FAIL;
+ }
+ (void)uapi_adc_init(ADC_CLOCK_500KHZ);
+ (void)uapi_adc_power_en(AFE_SCAN_MODE_MAX_NUM, true);
+ return(uapi_adc_auto_scan_ch_enable((uint8_t)channel, config, adc_autosample_callback));
+}
+
+static uint32_t adc_auto_sample_disable(uint8_t *para, uint32_t para_len)
+{
+ char *ptr = (char *)para;
+ uint32_t ret = 0;
+ uint32_t channel = strtoul(ptr, NULL, 10); // 10: 十进制
+ wstp_print("disable adc auto sample , channel = %x\r\n", channel);
+
+ return(uapi_adc_auto_scan_ch_disable(channel));
+}
+#endif
+
+static void pm_lcd_off_handle(void)
+{
+ writew(0x570000c0, 0x0); // display logic crg reset
+ writew(0x57004034, 0x100); // display close power
+#ifndef QSPI_DISPLAY
+ pmu_ldo_power_on(PMU_LDO_AUXLDO3, TURN_OFF);
+ hal_pmu_auxldo_enable_high_resistance(HAL_PMU_AUXLDO3, TURN_ON);
+#endif
+#ifdef CONFIG_CLDO1PD_SUPPORT
+ pmu_control_cldo1_sleep_bypass(TURN_OFF);
+#endif
+}
+
+uint32_t mcu_pm_lcd_off(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+#ifdef SUPPORT_POWER_MANAGER
+ const power_display_svr_api_t *display_api = power_display_svr_get_api();
+ return display_api->turn_off_screen();
+#endif
+ if (!lcd_get_status()) {
+ wstp_print("\r\nLCD has benn off\r\n");
+ return ERRCODE_SUCC;
+ }
+#if defined(ENABLE_UIKIT) || defined(ENABLE_LVGL)
+ NotifyScreenOff(); // Instruct the uikit to close the display operation.
+#endif
+ osDelay(100); // Wait 100ms for the uikit to complete display.
+ touch_screen_suspend(); // close touch
+ ext_errno ret = drv_vau_suspend(NULL);
+ if (ret != 0) {
+ wstp_print("drv vau suspend error ret=%x\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+#ifdef SUPPORT_GPU_JPEG
+ (void)drv_jpeg_suspend(NULL);
+#endif
+#ifndef QSPI_DISPLAY
+ ret = drv_dpu_suspend(NULL);
+ if (ret != 0) {
+ wstp_print("drv dpu suspend error ret=%x\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+#endif
+ ret = uapi_lcd_deinit();
+ if (ret != 0) {
+ wstp_print("lcd deinit error ret=%x\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+ pm_lcd_off_handle();
+ lcd_set_status(false);
+ g_dpu_ready_flag = false;
+ display_suspend_power_off();
+ uapi_pm_request_mode(PM_ID_VIDEO, PM_MODE_LP);
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_pm_add_vote(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+
+ uint8_t cnt = pm_veto_get_id_cnt(PM_ID_DEBUG);
+ if (cnt == 0) {
+ uapi_pm_add_sleep_veto(PM_ID_DEBUG);
+ } else {
+ wstp_print("MCU has got pm_id_debug vote\r\n");
+ }
+ wstp_print("\r\nMCU WAKEUP SUCCESS\r\n");
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_pm_remove_vote(uint8_t *para, uint32_t para_len)
+{
+ pm_id_t pm_id = PM_ID_DEBUG; // 默认使用 PM_ID_DEBUG
+
+ // 如果提供了参数,解析数字
+ if (para != NULL && para_len > 0) {
+ // 尝试将参数转换为数字
+ pm_id = (pm_id_t)atoi((char*)para);
+
+ // 检查范围是否有效
+ if (pm_id < PM_ID_BSP || pm_id >= PM_ID_MAX) {
+ wstp_print("Invalid PM_ID: %d (valid range: 0-%d)\r\n", pm_id, PM_ID_MAX - 1);
+ return ERRCODE_FAIL;
+ }
+ }
+
+ // 获取 PM_ID 名称
+ const char* pm_id_name = get_pm_id_name(pm_id);
+
+ // 获取当前投票计数
+ uint8_t cnt = pm_veto_get_id_cnt(pm_id);
+
+ if (cnt > 0) {
+ wstp_print("MCU remove %s (PM_ID=%d) vote, current count=%d\r\n", pm_id_name, pm_id, cnt);
+ uapi_pm_remove_sleep_veto(pm_id);
+ wstp_print("\r\nMCU SLEEP SUCCESS (removed %s vote)\r\n", pm_id_name);
+ } else {
+ wstp_print("MCU has already deleted %s (PM_ID=%d) vote (count=0)\r\n", pm_id_name, pm_id);
+ }
+
+ uapi_tcxo_delay_ms(5); // delay 5ms for print debug infor with uart
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_dfx_get_cur_second(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+
+ uint32_t cur_second = dfx_get_cur_second();
+
+ wstp_print("cur_second = %d\r\n", cur_second);
+ return ERRCODE_SUCC;
+}
+
+uint32_t get_ids(uint8_t *data, uint32_t data_len)
+{
+#ifdef CFG_DRIVERS_NANDFLASH
+ uint16_t nandflash_id;
+ uapi_nandflash_read_id(&nandflash_id);
+ wstp_print("[nandflash id:] %x\r\n", nandflash_id);
+#endif
+ flash_info_t norflash_id;
+ uapi_flash_get_info(0, &norflash_id);
+ wstp_print("[norflash id:] %x\r\n", norflash_id.flash_id);
+ wstp_print("[sdk id:]%s \r\n", uapi_sdk_read_id());
+ uint8_t soc_id[20]; // 20 is soc id length
+ uapi_soc_read_id(soc_id, 20); // 20 is soc id length
+ wstp_print("[soc id:]\r\n");
+ for (uint8_t i = 0; i < 20; i += 2) { // 20 is soc id length, 2 means use 16bits
+ wstp_print("0x%04X ", *((uint16_t *)&soc_id[i]));
+ if ((i + 2) % 8 == 0) { wstp_print("\r\n"); } // 2&8 will word wrap
+ }
+ wstp_print("\r\n");
+ return ERRCODE_SUCC;
+}
+
+uint32_t lcd_test_light(uint8_t *data, uint32_t data_len)
+{
+ char *ptr = (char *)data;
+ uint32_t light_input = strtoul(ptr, NULL, 16);
+ wstp_print("light = %x \r\n", light_input);
+ uapi_lcd_set_brightness(light_input);
+ return ERRCODE_SUCC;
+}
+
+uint32_t at_nand_write_read(uint8_t *data, uint32_t data_len)
+{
+#ifdef CFG_DRIVERS_NANDFLASH
+ char *ptr = (char *)data;
+ uint32_t page = strtoul(ptr, NULL, 10);
+ wstp_print("page = %d \r\n", page);
+ struct nand_driver_struct *freertos_nandflash_driver = get_nand_flash();
+ if (page >= freertos_nandflash_driver->pages_per_block * freertos_nandflash_driver->total_block) {
+ wstp_print("page error exceed max page = %d \r\n", page);
+ return ERRCODE_FAIL;
+ }
+ test_nand_flash_read_8(freertos_nandflash_driver, page);
+#endif
+ return ERRCODE_SUCC;
+}
+
+uint32_t at_nand_write_write(uint8_t *data, uint32_t data_len)
+{
+ PRINT("nand wite\r\n");
+#ifdef CFG_DRIVERS_NANDFLASH
+ char *ptr = (char *)data;
+ uint32_t page = strtoul(ptr, NULL, 10);
+ wstp_print("page = %d \r\n", page);
+ struct nand_driver_struct *freertos_nandflash_driver = get_nand_flash();
+ if (page >= freertos_nandflash_driver->pages_per_block * freertos_nandflash_driver->total_block) {
+ wstp_print("page error exceed max page = %d \r\n", page);
+ return ERRCODE_FAIL;
+ }
+ test_nand_flash_write_width8(freertos_nandflash_driver, page);
+#endif
+ return ERRCODE_SUCC;
+}
+
+uint32_t at_nand_write_erase(uint8_t *data, uint32_t data_len)
+{
+#ifdef CFG_DRIVERS_NANDFLASH
+ char *ptr = (char *)data;
+ uint32_t block = strtoul(ptr, NULL, 10);
+ struct nand_driver_struct *freertos_nandflash_driver = get_nand_flash();
+ wstp_print("block = %d total_block = %d\r\n", block, freertos_nandflash_driver->total_block);
+ if (block >= freertos_nandflash_driver->total_block) {
+ erase_all(freertos_nandflash_driver);
+ wstp_print("erase all block\r\n");
+ return ERRCODE_SUCC;
+ }
+ freertos_nandflash_driver->erase_block(block);
+#endif
+ return ERRCODE_SUCC;
+}
+
+uint32_t at_nand_mark_bad(uint8_t *data, uint32_t data_len)
+{
+#ifdef CFG_DRIVERS_NANDFLASH
+ char *ptr = (char *)data;
+ uint32_t block = strtoul(ptr, NULL, 10);
+ wstp_print("mark block%d = %x is bad\r\n", block);
+ struct nand_driver_struct *freertos_nandflash_driver = get_nand_flash();
+ if (block >= freertos_nandflash_driver->total_block) {
+ wstp_print("exceed max block = %d \r\n", block);
+ return ERRCODE_FAIL;
+ }
+ freertos_nandflash_driver->mark_bad_block(block);
+#endif
+ return ERRCODE_SUCC;
+}
+
+uint32_t at_nand_check_bad(uint8_t *data, uint32_t data_len)
+{
+#ifdef CFG_DRIVERS_NANDFLASH
+ char *ptr = (char *)data;
+ uint32_t block = strtoul(ptr, NULL, 10);
+ wstp_print("check block%d = %x is bad?\r\n", block);
+ struct nand_driver_struct *freertos_nandflash_driver = get_nand_flash();
+ if (block >= freertos_nandflash_driver->total_block) {
+ wstp_print("exceed max block = %d \r\n", block);
+ return ERRCODE_FAIL;
+ }
+ uint32_t ret = freertos_nandflash_driver->check_bad_block(block);
+ wstp_print("is bad? ret = %d\r\n", ret);
+#endif
+ return ERRCODE_SUCC;
+}
+
+uint32_t at_nand_set_mode(uint8_t *data, uint32_t data_len)
+{
+#ifdef CFG_DRIVERS_NANDFLASH
+ char *ptr = (char *)data;
+ uint32_t mode = strtoul(ptr, NULL, 10);
+ if (mode == 0) {
+ wstp_print("set mode to SPEED_HIGH DMA_FOUR_LINE\r\n", mode);
+ nand_driver_init(SPEED_HIGH);
+ set_trans_type(TRANS_BY_DMA_QUAD);
+ } else {
+ wstp_print("set mode to SPEED_SLOW CPU_SINGLE_LINE\r\n", mode);
+ nand_driver_init(SPEED_SLOW);
+ set_trans_type(TRANS_BY_CPU_SINGLE_LINE);
+ }
+#endif
+ return ERRCODE_SUCC;
+}
+
+uint32_t lcd_fill(uint8_t *data, uint32_t data_len)
+{
+ char *ptr = (char *)data;
+ uint32_t color_input = strtoul(ptr, NULL, 16);
+ wstp_print("color = %x \r\n", color_input);
+
+ td_handle vau_handle;
+ ext_vau_surface src_surface = {0};
+
+ src_surface.width = 466; // 454 screen width
+ src_surface.height = 466; // 454 screen height
+ src_surface.phy_addr = LCD_FILL_COLOR_ADDR;
+ src_surface.vir_addr = (td_uchar *)src_surface.phy_addr;
+ src_surface.color_fmt = EXT_GFX_FMT_ARGB8888;
+ src_surface.compress_mode = EXT_GFX_COMPRESS_NONE;
+ src_surface.argb_order = EXT_GFX_FMT_ORDER_ARGB;
+ src_surface.rect.x = 0;
+ src_surface.rect.y = 0;
+ src_surface.rect.width = src_surface.width;
+ src_surface.rect.height = src_surface.height;
+ src_surface.stride = 1872; /* 454 * 32 / 8 = 1816 16字节对齐得1824 | 466 * 32 / 8 = 1864 16字节对齐得1872*/
+ src_surface.is_color_surface = TD_TRUE;
+ src_surface.color = color_input;
+
+#ifdef MIPI_ULPS_SUPPORT
+ uapi_mipi_tx_exit_ulps();
+#endif
+
+ vau_handle = uapi_vau_create();
+ uapi_vau_fill(vau_handle, &src_surface);
+ uapi_vau_submit(vau_handle, TD_FALSE, 1000); /* 1000 ms timeout */
+
+ td_handle dpu_handle;
+ ext_dpu_layer_info layer_info = {0};
+ ext_dpu_surface dpu_surface = {0};
+
+ layer_info.width = src_surface.width;
+ layer_info.height = src_surface.height;
+ layer_info.layer_id = EXT_DPU_LAYER_ID1;
+ layer_info.layer_fmt = src_surface.color_fmt;
+ layer_info.compress_mode = src_surface.compress_mode;
+ layer_info.buf_mode = EXT_DPU_BUFFER_MODE_NORMAL;
+
+ dpu_surface.width = src_surface.width;
+ dpu_surface.height = src_surface.height;
+ dpu_surface.stride = src_surface.stride;
+ dpu_surface.phy_addr = src_surface.phy_addr;
+ dpu_surface.vir_addr = src_surface.vir_addr;
+ dpu_surface.update_rect = TD_NULL;
+ dpu_surface.color_fmt = src_surface.color_fmt;
+ dpu_surface.compress_mode = src_surface.compress_mode;
+
+ uapi_dpu_create_layer(&layer_info, &dpu_handle);
+ uapi_dpu_set_layer_vblank(dpu_handle, TD_TRUE);
+ uapi_dpu_set_layer_info(dpu_handle, &dpu_surface);
+ uapi_dpu_refresh_layers();
+
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_pm_no_resume_touch(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ char *data = (char *)para;
+ if (data == NULL) { return ERRCODE_FAIL; }
+ uint8_t flag = strtoul(data, NULL, 0);
+ if (flag == 1) {
+ touch_screen_restart();
+ }
+ set_touch_resume_flag(flag);
+ return ERRCODE_SUCC;
+}
+
+uint32_t mcu_pm_set_mcu_dynamic_power(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ char *data = (char *)para;
+ if (data == NULL) { return ERRCODE_FAIL; }
+ uint8_t flag = strtoul(data, NULL, 0);
+ if (flag == 0) {
+ pm_set_mcu_dynamic_power_flag(0);
+ } else {
+ pm_set_mcu_dynamic_power_flag(1);
+ }
+ return ERRCODE_SUCC;
+}
+
+static void button_callback_press(void)
+{
+ PRINT("power key press."NEWLINE);
+}
+
+static void button_callback_click(void)
+{
+ PRINT("power key click."NEWLINE);
+}
+
+static void button_callback_click_2(void)
+{
+ PRINT("power key click double."NEWLINE);
+}
+
+static void button_callback1(void)
+{
+ PRINT("power key long press 1s."NEWLINE);
+}
+
+static void button_callback2(void)
+{
+ PRINT("power key long press 2s."NEWLINE);
+}
+
+static void button_callback3(void)
+{
+ PRINT("power key long press 3s."NEWLINE);
+}
+
+static void button_callback4(void)
+{
+ PRINT("power key long press 4s."NEWLINE);
+}
+
+static void button_callback5(void)
+{
+ PRINT("power key long press 5s."NEWLINE);
+}
+
+static void button_callback6(void)
+{
+ PRINT("power key long press 6s."NEWLINE);
+}
+
+static void button_callback7(void)
+{
+ PRINT("power key long press 7s."NEWLINE);
+}
+
+static void button_callback8(void)
+{
+ PRINT("power key long press 8s."NEWLINE);
+}
+
+static void button_callback9(void)
+{
+ PRINT("power key long press 9s."NEWLINE);
+}
+
+static void button_callback_1_over(void)
+{
+ PRINT("power key long press 1s over."NEWLINE);
+}
+
+static void button_callback_2_over(void)
+{
+ PRINT("power key long press 2s over."NEWLINE);
+}
+
+static void button_callback_3_over(void)
+{
+ PRINT("power key long press 3s over."NEWLINE);
+}
+
+static void button_callback_4_over(void)
+{
+ PRINT("power key long press 4s over."NEWLINE);
+}
+
+static void button_callback_5_over(void)
+{
+ PRINT("power key long press 5s over."NEWLINE);
+}
+
+static void button_callback_6_over(void)
+{
+ PRINT("power key long press 6s over."NEWLINE);
+}
+
+static void button_callback_7_over(void)
+{
+ PRINT("power key long press 7s over."NEWLINE);
+}
+
+static void button_callback_8_over(void)
+{
+ PRINT("power key long press 8s over."NEWLINE);
+}
+
+static void button_callback_9_over(void)
+{
+ PRINT("power key long press 9s over."NEWLINE);
+}
+
+uint32_t mcu_button_sample(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+
+ uapi_button_register_event_cb(button_callback_press, BUTTON_PWR_PRESS);
+ uapi_button_register_event_cb(button_callback_click, BUTTON_PWR_CLICKUP);
+ uapi_button_register_event_cb(button_callback_click_2, BUTTON_PWR_CLICKUP_2);
+
+ uapi_button_register_event_cb(button_callback1, BUTTON_PWR_LONGPRESS_1S);
+ uapi_button_register_event_cb(button_callback2, BUTTON_PWR_LONGPRESS_2S);
+ uapi_button_register_event_cb(button_callback3, BUTTON_PWR_LONGPRESS_3S);
+ uapi_button_register_event_cb(button_callback4, BUTTON_PWR_LONGPRESS_4S);
+ uapi_button_register_event_cb(button_callback5, BUTTON_PWR_LONGPRESS_5S);
+ uapi_button_register_event_cb(button_callback6, BUTTON_PWR_LONGPRESS_6S);
+ uapi_button_register_event_cb(button_callback7, BUTTON_PWR_LONGPRESS_7S);
+ uapi_button_register_event_cb(button_callback8, BUTTON_PWR_LONGPRESS_8S);
+ uapi_button_register_event_cb(button_callback9, BUTTON_PWR_LONGPRESS_9S);
+
+ uapi_button_register_event_cb(button_callback_1_over, BUTTON_PWR_LONGPRESS_1S_OVER);
+ uapi_button_register_event_cb(button_callback_2_over, BUTTON_PWR_LONGPRESS_2S_OVER);
+ uapi_button_register_event_cb(button_callback_3_over, BUTTON_PWR_LONGPRESS_3S_OVER);
+ uapi_button_register_event_cb(button_callback_4_over, BUTTON_PWR_LONGPRESS_4S_OVER);
+ uapi_button_register_event_cb(button_callback_5_over, BUTTON_PWR_LONGPRESS_5S_OVER);
+ uapi_button_register_event_cb(button_callback_6_over, BUTTON_PWR_LONGPRESS_6S_OVER);
+ uapi_button_register_event_cb(button_callback_7_over, BUTTON_PWR_LONGPRESS_7S_OVER);
+ uapi_button_register_event_cb(button_callback_8_over, BUTTON_PWR_LONGPRESS_8S_OVER);
+ uapi_button_register_event_cb(button_callback_9_over, BUTTON_PWR_LONGPRESS_9S_OVER);
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_power_key_config(uint8_t *para, uint32_t para_len)
+{
+ char *ptr = (char *)para;
+ char *token = NULL;
+ char *next_token = NULL;
+ uint32_t power_level = 0;
+ uint32_t power_type = 0;
+ uint32_t idx = 0;
+ uint32_t tmp[POWER_KEY_PARAM_LEN] = {0};
+ token = strtok_s((char*)ptr, " ", &next_token);
+ while (token != NULL) {
+ tmp[idx++] = strtoul(token, NULL, 10); // 10: 十进制
+ token = strtok_s(NULL, " ", &next_token);
+ }
+ power_type = tmp[0];
+ power_level = tmp[1];
+ printf("power type:%d power_level:%d \r\n", power_type, power_level);
+ if (uapi_power_set_mode(power_type) != ERRCODE_SUCC) {
+ printf("power type:%d error.", power_type);
+ }
+ if (uapi_power_time_mode(power_level) != ERRCODE_SUCC) {
+ printf("power level:%d error.", power_level);
+ }
+
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_calendar_set_date(uint8_t *para, uint32_t para_len)
+{
+ char *ptr = (char *)para;
+ char *token = NULL;
+ char *next_token = NULL;
+ calendar_t date;
+ uint32_t idx = 0;
+ uint32_t tmp[CALENDAR_PARAM_LEN] = {0};
+ token = strtok_s((char*)ptr, " ", &next_token);
+ while (token != NULL) {
+ tmp[idx++] = strtoul(token, NULL, 10); // 10: 十进制
+ token = strtok_s(NULL, " ", &next_token);
+ }
+ date.year = tmp[0];
+ date.mon = tmp[1];
+ date.day = tmp[2];
+ date.hour = tmp[3];
+ date.min = tmp[4];
+ date.sec = tmp[5];
+
+ errcode_t ret = uapi_calendar_set_datetime(&date);
+ if (ret == ERRCODE_SUCC) {
+ printf("Set datetime success: %d-%d-%d %d:%d:%d\r\n", date.year, date.mon, date.day, date.hour, date.min,
+ date.sec);
+ return ERRCODE_SUCC;
+ }
+ printf("Set datetime failed, error code = %d \r\n", ret);
+ return ret;
+}
+
+static uint32_t mcu_calendar_get_date(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+ calendar_t date;
+
+ errcode_t ret = uapi_calendar_get_datetime(&date);
+ if (ret == ERRCODE_SUCC) {
+ printf("Get datetime success: %d-%d-%d %d:%d:%d\r\n", date.year, date.mon, date.day, date.hour, date.min,
+ date.sec);
+ return ERRCODE_SUCC;
+ }
+ printf("Get datetime failed, error code = %d \r\n", ret);
+
+ return ret;
+}
+
+#ifdef SUPPROT_EXECUTE_CORMARK
+static uint32_t mcu_coremark_test(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+ uint32_t irq_sts = osal_irq_lock();
+ watchdog_turnoff_clk();
+ coremark_test();
+ watchdog_turnon_clk();
+ osal_irq_restore(irq_sts);
+ return ERRCODE_SUCC;
+}
+#endif
+
+static uint32_t mcu_set_app_delay_time(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ char *ptr = (char *)para;
+ uint32_t delay_time = strtoul(ptr, NULL, 0);
+ if (delay_time == 0) {
+ delay_time = 10000; // 10000 ms
+ }
+ wstp_print("app set delay_time = %d\r\n", delay_time);
+ set_app_delay_time(delay_time);
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_set_cldo1_voltage(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ char *ptr = (char *)para;
+ uint8_t cldo = strtoul(ptr, NULL, 0);
+ if (cldo > PMU_LDO_MAX) { cldo = 0; }
+ ptr++;
+ ptr++;
+ uint8_t voltage = strtoul(ptr, NULL, 0);
+ if (voltage > 15) { voltage = 14; } // the max voltage of cldo is 15, 14 is the default value.
+ wstp_print("app set cldo=%d voltage = %d\r\n", cldo, voltage);
+ pmu_ldo_power_on((pmu_ldo_t)cldo, 1);
+ if (((pmu_ldo_t)cldo == PMU_LDO_CLDO1) || ((pmu_ldo_t)cldo == PMU_LDO_CLDO1) ||
+ ((pmu_ldo_t)cldo == PMU_LDO_CLDO1)) {
+ hal_pmu_cldo_enable_bypass((hal_pmu_cldo_t)cldo, 0);
+ }
+ pmu_ldo_power_vset((pmu_ldo_t)cldo, voltage);
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_nand_aging_test(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ unused(para);
+#ifdef CFG_DRIVERS_NANDFLASH
+ return nandflash_aging_test((char*)para);
+#else
+ return ERRCODE_SUCC;
+#endif
+}
+
+static uint32_t mcu_norflash_aging_test(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ return flash_aging_test((char*)para);
+}
+
+static uint32_t mcu_set_pin_pull(uint8_t *para, uint32_t para_len)
+{
+ int ret;
+ uint32_t pin = 0;
+ uint32_t levl = 0;
+ char* ptr = (char*)para;
+ char* pos = strchr((char*)ptr, ',');
+ if (pos == NULL) {
+ return ERRCODE_FAIL;
+ }
+ *pos = '\0';
+
+ pin = strtoul(ptr, NULL, 0);
+ if (pin < 0) {
+ pin = 0;
+ }
+ ptr = pos + 1;
+ levl = strtoul(ptr, NULL, 0);
+ if ((pin_pull_t)levl > PIN_PULL_MAX) {
+ levl = 0;
+ }
+ uapi_pin_set_pull((pin_t)pin, (pin_pull_t)levl);
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_get_pin_pull(uint8_t *para, uint32_t para_len)
+{
+ pin_t pin = 0;
+ pin_pull_t level = 0;
+ wstp_print("all pin levl:\r\n");
+ for (uint16_t i = 0; i < PIN_NONE; i++) {
+ level = uapi_pin_get_pull((pin_t)i);
+ wstp_print("i=%d level=%d\r\n", i, level);
+ }
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_set_time(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ return set_system_time((char*)para);
+}
+
+static uint32_t mcu_get_time(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+ return get_system_time();
+}
+
+#ifdef SUPPORT_POWER_MANAGER
+static uint32_t mcu_pms_set_screenoff_time(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ uint32_t type;
+ uint32_t timeout;
+ char *pos;
+ char *ptr = (char *)para;
+ errcode_t ret = ERRCODE_SUCC;
+ pos = strchr((char *)ptr, ',');
+ if (pos == NULL) {
+ return ERRCODE_FAIL;
+ }
+ *pos = '\0';
+ type = strtoul(ptr, NULL, 0);
+ pos++;
+ timeout = strtoul(pos, NULL, 0);
+ wstp_print("app set screen off: type = %u,%s, timeut = %u.\r\n", type,type==0?"autooff_time":"keepon_time",timeout);
+ const power_display_svr_api_t *display_api = power_display_svr_get_api();
+ if (type == 0) {
+ ret = display_api->set_screen_auto_off_timeout(timeout);
+ } else if (type == 1) {
+ ret = display_api->set_screen_set_keepon_timeout(timeout);
+ } else {
+ return ERRCODE_FAIL;
+ }
+ if (ret != ERRCODE_SUCC) {
+ return ERRCODE_FAIL;
+ }
+ return ERRCODE_SUCC;
+}
+
+
+static uint32_t mcu_pms_set_screenoff_enable(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ char *ptr = (char *)para;
+ uint32_t inputpara = strtoul(ptr, NULL, 0);
+ bool enable = true;
+ if (inputpara == 0) {
+ enable = false;
+ }
+ wstp_print("app set screen off enable = %u, para = %u. \r\n", enable, inputpara);
+ const power_display_svr_api_t *display_api = power_display_svr_get_api();
+ display_api->set_auto_timeout_function(enable);
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_pms_set_screen_state(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ char *ptr = (char *)para;
+ wstp_print("app set screen state :%s. \r\n", ptr);
+ const power_display_svr_api_t *display_api = power_display_svr_get_api();
+ if (strcmp(ptr, "ON") == 0) {
+ display_api->turn_on_screen();
+ } else if (strcmp(ptr, "OFF") == 0) {
+ display_api->turn_off_screen();
+ } else {
+ wstp_print("app set screen input para err.\r\n");
+ return ERRCODE_FAIL;
+ }
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_pms_get_screen_state(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ unused(para);
+ const power_display_svr_api_t *display_api = power_display_svr_get_api();
+ screen_state_t state = display_api->get_screen_state();
+ wstp_print("app get screen state = %s . \r\n", state==SCREEN_ON?"on":"off");
+ return ERRCODE_SUCC;
+}
+
+uint8_t mcu_pms_is_screen_on(void)
+{
+ const power_display_svr_api_t *display_api = power_display_svr_get_api();
+ screen_state_t state = display_api->get_screen_state();
+ wstp_print("app get screen state = %u, on is %u, off is %u. \r\n", state, SCREEN_ON, SCREEN_OFF);
+ if( state == SCREEN_ON){
+ return 1;
+ }else{
+ return 0;
+ }
+}
+#endif
+
+#ifdef FT_DONGLE
+uint32_t mcu_check_dongle_connected(uint8_t *para, uint32_t para_len)
+{
+ unused(para);
+ unused(para_len);
+ // 通过diag返回包作为factory_tools判断SPP的连接状态依据
+ // 仅供factory_tools做判断用,此AT命令不对外用
+ wstp_print("Received dongle check msg.\r\n");
+ return ERRCODE_SUCC;
+}
+#endif
+
+uint32_t mcu_i2c_write_byte(i2c_bus_t bus, uint16_t slave_addr, uint32_t reg_addr, uint32_t reg_val)
+{
+ errcode_t ret;
+ i2c_data_t data;
+
+ uint8_t send_buf[AT_I2C_REG_ARRAY_LEN] = { 0 };
+ send_buf[0] = (reg_addr >> OFFSET_24) & 0xff;
+ send_buf[1] = (reg_addr >> OFFSET_16) & 0xff;
+ send_buf[AT_PARA_IDX2] = (reg_addr >> OFFSET_8) & 0xff;
+ send_buf[AT_PARA_IDX3] = reg_addr & 0xff;
+ send_buf[AT_PARA_IDX4] = reg_val & 0xff;
+ send_buf[AT_PARA_IDX5] = (reg_val >> OFFSET_8) & 0xff;
+ send_buf[AT_PARA_IDX6] = (reg_val >> OFFSET_16) & 0xff;
+ send_buf[AT_PARA_IDX7] = (reg_val >> OFFSET_24) & 0xff;
+
+ data.send_buf = send_buf;
+ data.send_len = 8; // 8: 发送长度
+ data.receive_buf = NULL;
+ data.receive_len = 0;
+
+ ret = uapi_i2c_master_write(bus, slave_addr, &data);
+ if (ret != ERRCODE_SUCC) {
+ wstp_print("===== Error: mcu_i2c_write_byte: I2C write ret = 0x%x! =====\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+ return ERRCODE_SUCC;
+}
+
+int32_t mcu_i2c_read_byte(i2c_bus_t bus, uint16_t slave_addr, uint32_t read_addr, uint32_t *read_val)
+{
+ errcode_t ret;
+ i2c_data_t data;
+
+ uint8_t reg_addr[4] = { 0 };
+ reg_addr[0] = (read_addr >> OFFSET_24) & 0xff;
+ reg_addr[1] = (read_addr >> OFFSET_16) & 0xff;
+ reg_addr[AT_PARA_IDX2] = (read_addr >> OFFSET_8) & 0xff;
+ reg_addr[AT_PARA_IDX3] = read_addr & 0xff;
+
+ data.send_buf = reg_addr;
+ data.send_len = 4; // 4: 发送长度
+ data.receive_buf = (uint8_t *)read_val;
+ data.receive_len = 4; // 4: 接收长度
+
+ ret = uapi_i2c_master_write(bus, slave_addr, &data);
+ if (ret != ERRCODE_SUCC) {
+ wstp_print("===== Error: mcu_i2c_read_byte: I2C write ret = 0x%x! =====\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+
+ ret = uapi_i2c_master_read(bus, slave_addr, &data);
+ if (ret != ERRCODE_SUCC) {
+ wstp_print("===== Error: mcu_i2c_read_byte: I2C read ret = 0x%x! =====\r\n", ret);
+ return ERRCODE_FAIL;
+ }
+
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_i2c_write(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ char *ptr = (char *)para;
+ char *token = NULL;
+ char *next_token = NULL;
+ errcode_t ret;
+
+ uint32_t idx = 0;
+ uint32_t bus = 0;
+ uint32_t slave_addr = 0;
+ uint32_t write_addr = 0;
+ uint32_t write_val = 0;
+
+ uint32_t tmp[AT_I2C_PARA_CNT] = {0};
+ token = strtok_s((char*)ptr, ",", &next_token);
+ while (token != NULL) {
+ tmp[idx++] = strtoul(token, NULL, 16); // 16: 十六进制
+ token = strtok_s(NULL, ",", &next_token);
+ }
+
+ bus = tmp[0];
+ slave_addr = tmp[1];
+ write_addr = tmp[AT_PARA_IDX2];
+ write_val = tmp[AT_PARA_IDX3];
+
+ return mcu_i2c_write_byte((i2c_bus_t)bus, slave_addr, write_addr, write_val);
+}
+
+static uint32_t mcu_i2c_read(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ char *ptr = (char *)para;
+ char *token = NULL;
+ char *next_token = NULL;
+ errcode_t ret;
+ uint32_t read_val;
+
+ uint32_t idx = 0;
+ uint32_t bus = 0;
+ uint32_t slave_addr = 0;
+ uint32_t read_addr = 0;
+
+ uint32_t tmp[AT_I2C_PARA_CNT] = {0};
+ token = strtok_s((char*)ptr, ",", &next_token);
+ while (token != NULL) {
+ tmp[idx++] = strtoul(token, NULL, 16); // 16: 十六进制
+ token = strtok_s(NULL, ",", &next_token);
+ }
+
+ bus = tmp[0];
+ slave_addr = tmp[1];
+ read_addr = tmp[AT_PARA_IDX2];
+
+ ret = mcu_i2c_read_byte((i2c_bus_t)bus, slave_addr, read_addr, &read_val);
+ if (ret == ERRCODE_SUCC) {
+ // wstp_print("Read val: [ 0x%x ]\r\n", read_val);
+ wstp_print("Read bus[%u],slaveaddr[%02X,%u],regaddr[%02X,%u]val: [ 0x%x ]\r\n", bus,slave_addr,slave_addr,read_addr,read_addr);
+ }else{
+ wstp_print("Read bus[%u],slaveaddr[%02X,%u],regaddr[%02X,%u]val: [ 0x%x ],failed!\r\n", bus,slave_addr,slave_addr,read_addr,read_addr);
+ }
+
+ return ret;
+}
+#ifdef SUPPORT_ALIPAY_SEC
+static uint32_t mcu_alipay_sec_test(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ unused(para);
+ wstp_print("mcu_alipay_sec_test start.\r\n");
+ uapi_alipay_svr_init();
+ const alipay_svr_api_t *alipay_api = alipay_svr_get_api();
+ alipay_api->exit_lpm();
+ osDelay(ALIPAY_EXIT_LPM_DELAY_LEN);
+ yunit_sdk_test();
+ alipay_api->enter_lpm();
+ wstp_print("mcu_alipay_sec_test end.\r\n");
+
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_alipay_debug(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ unused(para);
+ uapi_alipay_svr_init();
+ svr_alipay_debug();
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_alipay_pl_verify(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ unused(para);
+ int32_t compat_ret = 0;
+ int32_t cert_ret = 0;
+ uapi_alipay_svr_init();
+ const alipay_svr_api_t *alipay_api = alipay_svr_get_api();
+ alipay_api->exit_lpm();
+ osDelay(ALIPAY_EXIT_LPM_DELAY_LEN);
+ cert_ret = test_get_credential();
+ wstp_print("get cert ret=%d.\r\n", cert_ret);
+ compat_ret = hal_hardware_compat_check();
+ wstp_print("compat check ret=%d.\r\n", compat_ret);
+ alipay_api->enter_lpm();
+ if (cert_ret == 0 && compat_ret == 0) {
+ return ERRCODE_SUCC;
+ }
+ return ERRCODE_FAIL;
+}
+
+static uint32_t mcu_alipay_reset(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ unused(para);
+ (void)uapi_alipay_svr_reset();
+ return ERRCODE_SUCC;
+}
+#endif
+
+#ifdef SUPPORT_FILE_SPLIT_COMBINE
+static uint32_t mcu_file_spilt_test(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ unused(para);
+ wstp_print("mcu_file_spilt_test start.\r\n");
+ msg_center_split_file(ORIGIN_FILE_PATH, FILE_SPILT_MAX_SIZE, FILE_LIST_PATH);
+ wstp_print("mcu_file_spilt_test end.\r\n");
+
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_file_combine_test(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ unused(para);
+ wstp_print("mcu_file_combine_test start.\r\n");
+ msg_center_combine_file(FILE_LIST_PATH, COMBINE_FILE_PATH);
+ wstp_print("mcu_file_combine_test end.\r\n");
+
+ return ERRCODE_SUCC;
+}
+#endif
+
+#ifdef JS_ENABLE
+static uint32_t mcu_get_trans_channel_test(uint8_t *para, uint32_t para_len, char *str_cmd)
+{
+ unused(para_len);
+ unused(para);
+ msg_center_get_trans_channel();
+
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_set_trans_channel_test(uint8_t *para, uint32_t para_len, char *str_cmd)
+{
+ unused(para_len);
+ char *ptr = (char *)para;
+ uint32_t select = strtoul(ptr, NULL, 10); /* 10进制 */
+ msg_center_set_trans_channel(select);
+
+ return ERRCODE_SUCC;
+}
+#endif
+
+#ifdef SUPPORT_AUTO_OTA
+static uint32_t mcu_auto_ota_block(uint8_t *para, uint32_t para_len, char *str_cmd)
+{
+ unused(para_len);
+ unused(para);
+ g_auto_ota_upload_mode = 1;// 阻塞等待升级包上传
+ wstp_print("auto_ota block!\r\n");
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_auto_ota_run(uint8_t *para, uint32_t para_len, char *str_cmd)
+{
+ unused(para_len);
+ unused(para);
+ g_auto_ota_upload_mode = 0; // 升级包上传完成后auto_ota继续执行
+ wstp_print("auto_ota run!\r\n");
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_auto_ota_del_mac(uint8_t *para, uint32_t para_len, char *str_cmd)
+{
+ unused(para_len);
+ wstp_print("para = %s\r\n", para);
+ uint8_t addr[ADDR_MAC_LEN] = {0};
+ char tmp[ONE_ADDR_LEN + 1] = {0};
+ char *p = (char *)para;
+
+ for (uint8_t i = 0; i < ADDR_MAC_LEN; i++) {
+ memcpy_s(tmp, ONE_ADDR_LEN + 1, p, ONE_ADDR_LEN);
+ tmp[ONE_ADDR_LEN] = '\0';
+ addr[i] = strtol(tmp, NULL, 16); // 16进制
+ p = p + ONE_ADDR_LEN;
+ }
+
+ wstp_print("mcu_auto_ota_del_mac, mac = %02x%02x%02x%02x%02x%02x\r\n", addr[5], addr[4], addr[3], addr[2], addr[1],
+ addr[0]);
+ bool res = auto_ota_dev_del(addr);
+ wstp_print("auto_ota_dev_del, res = %d\r\n", res);
+
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_auto_ota_add_mac(uint8_t *para, uint32_t para_len, char *str_cmd)
+{
+ unused(para_len);
+ wstp_print("enter mcu_auto_ota_add_mac\r\n");
+ wstp_print("para = %s\r\n", para);
+ uint8_t addr[ADDR_MAC_LEN] = {0};
+ char tmp[ONE_ADDR_LEN + 1] = {0};
+ char *p = (char *)para;
+
+ for (uint8_t i = 0; i < ADDR_MAC_LEN; i++) {
+ memcpy_s(tmp, ONE_ADDR_LEN + 1, p, ONE_ADDR_LEN);
+ tmp[ONE_ADDR_LEN] = '\0';
+ addr[i] = strtol(tmp, NULL, 16); // 16进制
+ p = p + ONE_ADDR_LEN;
+ }
+
+ wstp_print("mcu_auto_ota_add_mac, mac = %02x%02x%02x%02x%02x%02x\r\n", addr[5], addr[4], addr[3], addr[2], addr[1],
+ addr[0]);
+ auto_ota_dev_add(addr);
+
+ return ERRCODE_SUCC;
+}
+
+static uint32_t mcu_auto_ota_show_mac(uint8_t *para, uint32_t para_len, char *str_cmd)
+{
+ unused(para_len);
+ unused(para);
+ wstp_print("enter mcu_auto_ota_show_mac\r\n");
+
+ auto_ota_dev_show();
+
+ return ERRCODE_SUCC;
+}
+#endif
+
+#ifdef LOSCFG_KERNEL_PERF
+static uint32_t mcu_perf_start(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ unused(para);
+ return perf_test_start();
+}
+
+static uint32_t mcu_perf_stop(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ unused(para);
+ return perf_test_stop();
+}
+#endif
+
+#ifdef LOSCFG_DEBUG_SCHED_STATISTICS
+static uint32_t mcu_sched_statistis_start(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ unused(para);
+ OsSchedStatStart();
+ return 0;
+}
+
+static uint32_t mcu_sched_statistis_stop(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ unused(para);
+ OsSchedStatStop();
+ OsSchedStatInfo();
+ return 0;
+}
+#endif
+
+#ifdef CFG_DRIVERS_SDIO
+typedef enum {
+ SDIO_TEST_READ_BYTE = 1,
+ SDIO_TEST_RESET,
+
+ SDIO_TEST_BUTT,
+} SDIO_TEST_CASE_T;
+
+static uint32_t mcu_sdio_test(uint8_t *para, uint32_t para_len)
+{
+ unused(para_len);
+ char *ptr = (char *)para;
+ uint32_t inputpara = strtoul(ptr, NULL, 0);
+
+ wstp_print("enter mcu_sdio_test input %u \r\n", inputpara);
+ switch (inputpara) {
+ case SDIO_TEST_READ_BYTE:
+ mmc_test_sdio_read_byte();
+ break;
+ case SDIO_TEST_RESET:
+ mmc_test_sdio_reset();
+ break;
+ default:
+ break;
+ }
+
+ return ERRCODE_SUCC;
+}
+#endif
+
+static const app_process_table g_app_funcs[] = {
+ { RESET, mcu_os_sys_reset },
+ { FSTEST, mcu_fs_test },
+ { FSFORMAT, mcu_fs_format },
+ { FSRWTEST, mcu_fs_rw_test },
+ { FSSETCLK, mcu_fs_set_clk },
+ { FSREADCLK, mcu_fs_read_clk },
+ { FSWRITE, mcu_fs_write },
+ { FSCHECK, mcu_fs_check },
+ { FSRM, mcu_fs_rm },
+ { GETWSTPVER, mcu_get_wstp_version },
+ { LOGWRITE, mcu_logfile_write },
+ { HEAPINFO, mcu_os_heap_info },
+ { STACKINFO, mcu_os_stack_info },
+ { TESTDTCMBW, mcu_test_dtcm_baudwidth },
+ { TESTL2MBW, mcu_test_l2m_baudwidth },
+ { TESTMMCBW, mcu_test_mmc_baudwidth },
+ { TESTPSRAMBW, mcu_test_psram_baudwidth },
+ { TESTNORFLASHBW, mcu_test_norflash_baudwidth },
+ { TESTNANDFLASHBW, mcu_test_nandflash_baudwidth },
+ { GETFSINFO, mcu_get_fs_info },
+ { PMRMVOTE, mcu_pm_remove_vote },
+ { PMADDVOTE, mcu_pm_add_vote },
+ { LCDON, mcu_pm_lcd_on },
+ { LCDOFF, mcu_pm_lcd_off },
+ { SHIPMODE, mcu_pm_into_ship_mode },
+ { FORCEDEEPSLEEP, mcu_pm_into_force_ds_mode },
+ { PMMODESET, mcu_pm_req_mode },
+ { PMMODEUSR, mcu_set_pm_req_mode_usr},
+ { PMMODEGET, mcu_pm_dfx_mode },
+ { PMVETOGET, mcu_pm_veto_get },
+ { TASKSWITCHPRINT, mcu_task_switch_print_ctrl },
+ { GETCURSEC, mcu_dfx_get_cur_second},
+ { LCDFILL, lcd_fill },
+ { GETIDS, get_ids },
+ { LCDLIGHT, lcd_test_light },
+ { RESUMETOUCH, mcu_pm_no_resume_touch },
+ { MCUDYMPW, mcu_pm_set_mcu_dynamic_power },
+ { PMCLDO1PD, mcu_pm_cldo1_power_down },
+ { AESDECRYPT, mcu_aes_decrypt_sample },
+ { AESENCRYPT, mcu_aes_encrypt_sample },
+ { AESSETGID, mcu_aes_set_gid },
+ { SETCALENDAR, mcu_calendar_set_date },
+ { GETCALENDAR, mcu_calendar_get_date },
+#if defined(CONFIG_ADC_SUPPORT_AUTO_SCAN)
+ { ADCAUTOSAMPLE, adc_auto_sample_by_diag },
+ { ADCCLOSEAUTOSAMPLE, adc_auto_sample_disable },
+ { ADCSHOWDATA, adc_auto_sample_show_data },
+#endif
+ { BUTTON, mcu_button_sample },
+ { POWERKEY, mcu_power_key_config },
+#ifdef SUPPROT_EXECUTE_CORMARK
+ { COREMARKTEST, mcu_coremark_test },
+#endif
+ { NANDREAD, at_nand_write_read},
+ { NANDWRITE, at_nand_write_write},
+ { NANDERASE, at_nand_write_erase},
+ { NANDMARK, at_nand_mark_bad},
+ { NANDCHECK, at_nand_check_bad},
+ { NANDSETMODE, at_nand_set_mode},
+ { SETAPPDELAY, mcu_set_app_delay_time },
+ { SETCLDO1VOL, mcu_set_cldo1_voltage },
+ { NANDAGINGTEST, mcu_nand_aging_test },
+ { FLASHAGINGTEST, mcu_norflash_aging_test },
+ { SETPINPULL, mcu_set_pin_pull },
+ { GETPINPULL, mcu_get_pin_pull },
+ { TIMESET, mcu_set_time },
+ { TIMEGET, mcu_get_time },
+#ifdef SUPPORT_POWER_MANAGER
+ { SETSCREENOFFTIME, mcu_pms_set_screenoff_time },
+ { SETSCREENOFFFUNC, mcu_pms_set_screenoff_enable },
+ { SETSCREENSTATE, mcu_pms_set_screen_state },
+ { GETSCREENSTATE, mcu_pms_get_screen_state },
+#endif
+#ifdef FT_DONGLE
+ { DONGLECONNECTED, mcu_check_dongle_connected },
+#endif
+ { I2CWRITE, mcu_i2c_write },
+ { I2CREAD, mcu_i2c_read },
+#ifdef SUPPORT_ALIPAY_SEC
+ { ALIPAYSECTEST, mcu_alipay_sec_test },
+ { ALIPAYDEBUG, mcu_alipay_debug },
+ { ALIPAYVERIFY, mcu_alipay_pl_verify },
+ { ALIPAYRESET, mcu_alipay_reset },
+#endif
+#ifdef SUPPORT_FILE_SPLIT_COMBINE
+ { FILESPLIT, mcu_file_spilt_test },
+ { FILECOMBINE, mcu_file_combine_test },
+#endif
+#ifdef JS_ENABLE
+ { GETTRANSCHAN, mcu_get_trans_channel_test },
+ { SETTRANSCHAN, mcu_set_trans_channel_test },
+#endif
+#ifdef SUPPORT_AUTO_OTA
+ { AUTOOTABLOCK, mcu_auto_ota_block },
+ { AUTOOTARUN, mcu_auto_ota_run },
+ { AUTOOTADELMAC, mcu_auto_ota_del_mac },
+ { AUTOOTAADDMAC, mcu_auto_ota_add_mac },
+ { AUTOOTASHOWMAC, mcu_auto_ota_show_mac },
+#endif
+#ifdef LOSCFG_KERNEL_PERF
+ { PERFSTART, mcu_perf_start },
+ { PERFSTOP, mcu_perf_stop },
+#endif
+#ifdef LOSCFG_DEBUG_SCHED_STATISTICS
+ { SCHEDSTART, mcu_sched_statistis_start },
+ { SCHEDSTOP, mcu_sched_statistis_stop },
+#endif
+#ifdef CFG_DRIVERS_SDIO
+ { SDIOTEST, mcu_sdio_test},
+#endif
+};
+
+void app_at_process(uint8_t *data, uint32_t data_len)
+{
+ unused(data_len);
+ if (data == NULL) {
+ return;
+ }
+ int32_t ret = ERRCODE_FAIL;
+ uint8_t reply_data[DIAG_RES_LEN] = {0};
+ app_msg_info_t *msg = (app_msg_info_t *)(data);
+
+ for (uint32_t i = 0; i < ARRAY_COUNT(g_app_funcs); i++) {
+ if (msg->id == g_app_funcs[i].id) {
+ ret = g_app_funcs[i].func(msg->payload, msg->payload_len);
+ }
+ }
+ print_at_cmd_ret(ret);
+
+ // phone remote control, need reply to spp
+ if (g_app_diag_flag) {
+ reply_data[0x0] = 0x80;
+ reply_data[0x1] = 0x82;
+ reply_data[0x2] = 0;
+ reply_data[0x3] = (uint8_t)ret;
+ ret = send_spp_diag_msg(g_app_diag_flag, &g_mcu_diag_header, reply_data, DIAG_RES_LEN);
+ wstp_print("mcu_at_process send msg to spp %s.\r\n", (ret == ERRCODE_SUCC) ? "success" : "failure");
+ }
+
+ if (ret != ERRCODE_SUCC) {
+ wstp_print("app_at_process func fail! MsgID=0x%x ret=%d "NEWLINE, msg->id, ret);
+ }
+ g_app_diag_flag = false;
+}
+
+uint32_t test_get_mem_info(uint8_t memType, uint32_t *used, uint32_t *free)
+{
+#if LOSCFG_MEM_TASK_STAT && defined __LITEOS__
+ void *heapMan = NULL;
+ LOS_MEM_POOL_STATUS status;
+ if (memType) {
+ heapMan = OS_EXTEND_MEM_ADDR;
+ } else {
+ heapMan = OS_SYS_MEM_ADDR;
+ }
+ if (LOS_MemInfoGet(heapMan, &status) != LOS_NOK) {
+ *used = status.uwTotalUsedSize;
+ *free = status.uwTotalFreeSize;
+ printf("test_get_mem_info used = %d, free = %d\n", *used, *free);
+ } else {
+ printf("test_get_mem_info fail\n");
+ }
+#endif
+ return 0;
+}