#ifdef SUPPORT_MS_EXTENSIONS #pragma bss_seg(".new_cfg_tool.data.bss") #pragma data_seg(".new_cfg_tool.data") #pragma const_seg(".new_cfg_tool.text.const") #pragma code_seg(".new_cfg_tool.text") #endif #include "cfg_tool.h" #include "boot.h" #include "ioctl_cmds.h" #include "app_online_cfg.h" #include "asm/crc16.h" #include "asm/cpu.h" #include "app_config.h" #include "online_db_deal.h" #include "init.h" #include "usb/device/cdc.h" #include "app_msg.h" #include "classic/tws_api.h" #include "bt_tws.h" #include "timer.h" #include "sniff.h" #if CFG_TOOL_VER == CFG_TOOL_VER_VISUAL #include "system/malloc.h" #include "system/task.h" #include "cfg_tool_statistics.h" #include "cfg_tool_cdc.h" #endif #define LOG_TAG_CONST APP_CFG_TOOL #define LOG_TAG "[APP_CFG_TOOL]" #define LOG_ERROR_ENABLE #define LOG_DEBUG_ENABLE #define LOG_INFO_ENABLE /* #define LOG_DUMP_ENABLE */ #define LOG_CLI_ENABLE #include "debug.h" #if TCFG_CFG_TOOL_ENABLE #if (TCFG_COMM_TYPE == TCFG_UART_COMM) && (TCFG_ONLINE_TX_PORT == IO_PORT_DP || TCFG_ONLINE_RX_PORT == IO_PORT_DM) && \ (TCFG_USB_HOST_ENABLE || TCFG_PC_ENABLE) #error "online config tool select DP/DM but usb module is enable" #endif struct cfg_tool_info { R_QUERY_BASIC_INFO r_basic_info; R_QUERY_FILE_SIZE r_file_size; R_QUERY_FILE_CONTENT r_file_content; R_PREPARE_WRITE_FILE r_prepare_write_file; R_READ_ADDR_RANGE r_read_addr_range; R_ERASE_ADDR_RANGE r_erase_addr_range; R_WRITE_ADDR_RANGE r_write_addr_range; R_ENTER_UPGRADE_MODE r_enter_upgrade_mode; S_QUERY_BASIC_INFO s_basic_info; S_QUERY_FILE_SIZE s_file_size; S_PREPARE_WRITE_FILE s_prepare_write_file; }; static struct cfg_tool_info info = { .s_basic_info.protocolVer = PROTOCOL_VER_AT_OLD, }; #define __this (&info) #if (TCFG_USER_TWS_ENABLE || (TCFG_COMM_TYPE == TCFG_USB_COMM) || (TCFG_COMM_TYPE == TCFG_UART_COMM)) static u8 *local_packet = NULL; u8 *local_packet_malloc(u16 size) { if ((local_packet == NULL) && (size > 0)) { local_packet = (u8 *)malloc(size); if (local_packet == NULL) { ASSERT(0, "local_packet malloc err!"); } } else { ASSERT(0, "local_packet already allocated!"); } return local_packet; } void local_packet_free() { if (local_packet != NULL) { free(local_packet); local_packet = NULL; } /* mem_stats(); */ } #endif extern const char *sdk_version_info_get(void); extern u8 *sdfile_get_burn_code(u8 *len); extern int sfc_norflash_erase(u32 cmd, u32 addr); extern void doe(u16 k, void *pBuf, u32 lenIn, u32 addr); extern void go_mask_usb_updata(); static void tws_sync_cfg_tool_data(struct cfg_tool_event *cfg_tool_dev); #if (CFG_TOOL_VER == CFG_TOOL_VER_VISUAL) const char fa_return[] = "ER"; //失败 #else const char fa_return[] = "FA"; //失败 #endif const char ok_return[] = "OK"; //成功 const char er_return[] = "ER"; //不能识别的命令 static u32 size_total_write = 0; static u8 parse_seq = 0; struct cfg_tool_event cfg_packet; #define TWS_FUNC_ID_CFGTOOL_SYNC TWS_FUNC_ID('C', 'F', 'G', 'S') #ifdef ALIGN #undef ALIGN #endif #define ALIGN(a, b) \ ({ \ int m = (u32)(a) & ((b)-1); \ int ret = (u32)(a) + (m?((b)-m):0); \ ret;\ }) static u32 encode_data_by_user_key(u16 key, u8 *buff, u16 size, u32 dec_addr, u8 dec_len) { u16 key_addr; u16 r_len; while (size) { r_len = (size > dec_len) ? dec_len : size; key_addr = (dec_addr >> 2)^key; doe(key_addr, buff, r_len, 0); buff += r_len; dec_addr += r_len; size -= r_len; } return dec_addr; } void hex2text(u8 *buf, u8 *out) { //sprintf(out, "%02x%02x-%02x%02x%02x%02x", buf[5], buf[4], buf[3], buf[2], buf[1], buf[0]); } u32 packet_combined(u8 *packet, u8 num) { u32 _packet = 0; _packet = (packet[num] | (packet[num + 1] << 8) | (packet[num + 2] << 16) | (packet[num + 3] << 24)); return _packet; } /*延时复位防止工具升级进度条显示错误*/ static void delay_cpu_reset(void *priv) { cpu_reset(); } RESFILE *cfg_open_file(u32 file_id) { RESFILE *cfg_fp = NULL; if (file_id == CFG_TOOL_FILEID) { cfg_fp = resfile_open(CFG_TOOL_FILE); #if (CFG_TOOL_VER != CFG_TOOL_VER_VISUAL) } else if (file_id == CFG_OLD_EQ_FILEID) { cfg_fp = resfile_open(CFG_OLD_EQ_FILE); } else if (file_id == CFG_OLD_EFFECT_FILEID) { cfg_fp = resfile_open(CFG_OLD_EFFECT_FILE); } else if (file_id == CFG_EQ_FILEID) { cfg_fp = resfile_open(CFG_EQ_FILE); #else } else if (file_id == CFG_STREAM_FILEID) { cfg_fp = resfile_open(CFG_STREAM_FILE); } else if (file_id == CFG_EFFECT_CFG_FILEID) { cfg_fp = resfile_open(CFG_EFFECT_CFG_FILE); #endif } return cfg_fp; } void all_assemble_package_send_to_pc(u8 id, u8 sq, u8 *buf, u32 len) { u8 *send_buf = NULL; u16 crc16_data; send_buf = (u8 *)dma_malloc(len + 9); // 串口发数据需要使用dma_malloc if (send_buf == NULL) { log_error("send_buf malloc err!"); return; } send_buf[0] = 0x5A; send_buf[1] = 0xAA; send_buf[2] = 0xA5; CFG_TOOL_WRITE_LIT_U16(send_buf + 5, (2 + len)); /*L*/ send_buf[7] = id;/*T*/ send_buf[8] = sq;/*SQ*/ memcpy(send_buf + 9, buf, len); crc16_data = CRC16(&send_buf[5], len + 4); send_buf[3] = crc16_data & 0xff; send_buf[4] = (crc16_data >> 8) & 0xff; /* printf("cfg_tool tx:\n"); */ /* printf_buf(send_buf, len + 9); */ #if (TCFG_COMM_TYPE == TCFG_UART_COMM) ci_uart_write(send_buf, len + 9); #elif (TCFG_COMM_TYPE == TCFG_USB_COMM) cdc_write_data(0, send_buf, len + 9); #elif (TCFG_COMM_TYPE == TCFG_SPP_COMM) #if SPP_DATA_USED_LVT app_online_db_ack(parse_seq, buf, len); #else app_online_db_ack(0xff, send_buf, len + 9); #endif #endif dma_free(send_buf); } void app_cfg_tool_event_handler(struct cfg_tool_event *cfg_tool_dev) { u8 *buf = NULL; buf = (u8 *)malloc(cfg_tool_dev->size); if (buf == NULL) { ASSERT(0, "buf malloc err!"); return; } buf = (u8 *)ALIGN(buf, 4); memset(buf, 0, cfg_tool_dev->size); /* printf_buf(cfg_tool_dev->packet, cfg_tool_dev->size); */ memcpy(buf, cfg_tool_dev->packet, cfg_tool_dev->size); const struct tool_interface *p; list_for_each_tool_interface(p) { if (p->id == cfg_tool_dev->packet[2]) { p->tool_message_deal(buf + 2, cfg_tool_dev->size - 2); } } free(buf); } u8 online_cfg_tool_data_deal(void *buf, u32 len) { u8 *data_buf = (u8 *)buf; u16 crc16_data; /* printf("cfg_tool rx:\n"); */ /* printf_buf(buf, len); */ if ((data_buf[0] != 0x5a) || (data_buf[1] != 0xaa) || (data_buf[2] != 0xa5)) { /* log_error("Header check error, receive an invalid message!\n"); */ return 1; } crc16_data = (data_buf[4] << 8) | data_buf[3]; if (crc16_data != CRC16(data_buf + 5, len - 5)) { log_error("CRC16 check error, receive an invalid message!\n"); return 1; } device_online_timeout_check(); u32 cmd = packet_combined(data_buf, 9); cfg_packet.event = cmd; cfg_packet.size = CFG_TOOL_READ_LIT_U16(data_buf + 5) + 2; #if ((TCFG_COMM_TYPE == TCFG_UART_COMM) || (TCFG_COMM_TYPE == TCFG_SPP_COMM)) cfg_packet.packet = &data_buf[5]; #if (TCFG_USER_TWS_ENABLE && (TCFG_COMM_TYPE == TCFG_UART_COMM)) tws_sync_cfg_tool_data(&cfg_packet); #endif app_cfg_tool_event_handler(&cfg_packet); #elif (TCFG_COMM_TYPE == TCFG_USB_COMM)//in irq if (local_packet != NULL) { local_packet_free(); } local_packet = local_packet_malloc(cfg_packet.size); if (local_packet == NULL) { return 1; } cfg_packet.packet = local_packet; memcpy(cfg_packet.packet, &data_buf[5], cfg_packet.size); if (OS_NO_ERR != os_taskq_post_type("app_core", MSG_FROM_CDC, 0, NULL)) { local_packet_free(); } #endif return 0; } #if (TCFG_COMM_TYPE == TCFG_SPP_COMM && SPP_DATA_USED_LVT) int cfg_tool_spp_rx_data(u8 *packet, u8 size, u8 *ext_data, u16 ext_size) { u8 *rx_buf = NULL; rx_buf = (u8 *)malloc(size + ext_size + 1); if (rx_buf == NULL) { log_error("rx_buf malloc err!"); return -1; } rx_buf[0] = size + 1; memcpy(rx_buf + 1, ext_data, ext_size); memcpy(rx_buf + 1 + ext_size, packet, size); parse_seq = rx_buf[2]; u32 event = (rx_buf[3] | (rx_buf[4] << 8) | (rx_buf[5] << 16) | (rx_buf[6] << 24)); cfg_packet.event = event; cfg_packet.packet = rx_buf; cfg_packet.size = size + ext_size + 1; app_cfg_tool_event_handler(&cfg_packet); free(rx_buf); return 0; } static int cfg_tool_spp_init(void) { app_online_db_register_handle(SPP_NEW_EQ_CH, cfg_tool_spp_rx_data); app_online_db_register_handle(SPP_OLD_EQ_CH, cfg_tool_spp_rx_data); app_online_db_register_handle(SPP_CFG_CH, cfg_tool_spp_rx_data); return 0; } early_initcall(cfg_tool_spp_init); #endif //#if (TCFG_COMM_TYPE == TCFG_SPP_COMM && SPP_DATA_USED_LVT) #if (TCFG_COMM_TYPE == TCFG_USB_COMM) static int cfg_tool_cdc_rx_data(int *msg) { #if TCFG_USER_TWS_ENABLE tws_sync_cfg_tool_data(&cfg_packet); #endif app_cfg_tool_event_handler(&cfg_packet); return 0; } APP_MSG_HANDLER(cdc_msg_entry) = { .owner = 0xff, .from = MSG_FROM_CDC, .handler = cfg_tool_cdc_rx_data, }; #endif//#if (TCFG_COMM_TYPE == TCFG_USB_COMM) #if TCFG_USER_TWS_ENABLE static void tws_sync_cfg_tool_data(struct cfg_tool_event *cfg_tool_dev) { if (cfg_tool_dev != NULL) { tws_api_send_data_to_sibling(cfg_tool_dev->packet, cfg_tool_dev->size, TWS_FUNC_ID_CFGTOOL_SYNC); } } static void online_cfg_tool_tws_sibling_data_deal(void *_data, u16 len, bool rx) { if (rx) { cfg_packet.event = DEFAULT_ACTION; cfg_packet.size = len; if (local_packet != NULL) { local_packet_free(); } local_packet = local_packet_malloc(cfg_packet.size); if (local_packet == NULL) { return; } cfg_packet.packet = local_packet; memcpy(cfg_packet.packet, (u8 *)_data, cfg_packet.size); if (OS_NO_ERR != os_taskq_post_type("app_core", MSG_FROM_CFGTOOL_TWS_SYNC, 0, NULL)) { local_packet_free(); } } } static int cfg_tool_tws_sync_rx_data(int *msg) { app_cfg_tool_event_handler(&cfg_packet); return 0; } REGISTER_TWS_FUNC_STUB(cfg_tool_stub) = { .func_id = TWS_FUNC_ID_CFGTOOL_SYNC, .func = online_cfg_tool_tws_sibling_data_deal, }; APP_MSG_HANDLER(tws_msg_entry) = { .owner = 0xff, .from = MSG_FROM_CFGTOOL_TWS_SYNC, .handler = cfg_tool_tws_sync_rx_data, }; #endif//#if TCFG_USER_TWS_ENABLE #if CFG_TOOL_VER == CFG_TOOL_VER_VISUAL // 在线检测设备 static u32 _device_online_timeout = 0; static u16 _timer_id = 0; static CFG_TOOL_ONLINE_STATUS _cfg_tool_online_status = CFG_TOOL_ONLINE_STATUS_OFFLINE; static void device_online_timeout_task(void *priv) { _device_online_timeout++; if (_device_online_timeout >= 3) { if (_timer_id) { sys_timer_del(_timer_id); _timer_id = 0; #if (TCFG_COMM_TYPE == TCFG_SPP_COMM) bt_sniff_enable(); #endif } _cfg_tool_online_status = CFG_TOOL_ONLINE_STATUS_OFFLINE; // 清理任务统计的资源 cfg_tool_statistics_resource_release(); /* log_info("cfg tool is offline!\n"); */ } } void device_online_timeout_check() { _device_online_timeout = 0; _cfg_tool_online_status = CFG_TOOL_ONLINE_STATUS_ONLINE; #if (TCFG_COMM_TYPE == TCFG_SPP_COMM) bt_sniff_disable(); #endif if (!_timer_id) { /* log_info("cfg tool online sys timer add!\n"); */ _timer_id = sys_timer_add(NULL, device_online_timeout_task, 1000); } } CFG_TOOL_ONLINE_STATUS cfg_tool_online_status() { return _cfg_tool_online_status; } #else CFG_TOOL_ONLINE_STATUS cfg_tool_online_status() { return CFG_TOOL_ONLINE_STATUS_ONLINE; } #endif // 发送buf malloc u8 *send_buf_malloc(u32 send_buf_size) { u8 *buf = (u8 *)malloc(send_buf_size); if (buf == NULL) { ASSERT(0, "send buf malloc err!"); } return buf; } static void cfg_tool_callback(u8 *packet, u32 size) { u32 erase_cmd = 0; u32 write_len = 0; u32 send_len = 0; u8 crc_temp_len, sdkname_temp_len; u8 *buf = NULL; u8 *buf_temp = NULL; struct resfile_attrs attr; RESFILE *cfg_fp = NULL; switch (cfg_packet.event) { case ONLINE_SUB_OP_QUERY_BASIC_INFO: memset(&__this->s_basic_info, 0, sizeof(__this->s_basic_info)); u8 *p = sdfile_get_burn_code(&crc_temp_len); if (p != NULL) { memcpy(__this->s_basic_info.progCrc, p + 8, 6); hex2text(__this->s_basic_info.progCrc, __this->s_basic_info.progCrc); sdkname_temp_len = strlen(sdk_version_info_get()); memcpy(__this->s_basic_info.sdkName, sdk_version_info_get(), sdkname_temp_len); struct flash_head flash_head_for_pid_vid; for (u8 i = 0; i < 5; i++) { tzflash_read((u8 *)&flash_head_for_pid_vid, 32, 0x1000 * i); doe(0xffff, (u8 *)&flash_head_for_pid_vid, 32, 0); if (flash_head_for_pid_vid.crc == 0xffff) { continue; } else { log_info("flash head addr = 0x%x\n", 0x1000 * i); break; } } if (flash_head_for_pid_vid.crc == 0xffff) { log_error("Can't find flash head addr"); break; } memcpy(__this->s_basic_info.pid, &(flash_head_for_pid_vid.pid), sizeof(flash_head_for_pid_vid.pid)); memcpy(__this->s_basic_info.vid, &(flash_head_for_pid_vid.vid), sizeof(flash_head_for_pid_vid.vid)); for (u8 i = 0; i < sizeof(__this->s_basic_info.pid); i++) { if (__this->s_basic_info.pid[i] == 0xff) { __this->s_basic_info.pid[i] = 0x00; } } #if (CFG_TOOL_VER == CFG_TOOL_VER_VISUAL) #if TCFG_COMM_TYPE == TCFG_USB_COMM __this->s_basic_info.max_buffer_size = cfg_tool_cdc_rx_max_mtu(); #elif TCFG_COMM_TYPE == TCFG_UART_COMM extern u16 get_ci_rx_size(); __this->s_basic_info.max_buffer_size = get_ci_rx_size(); #else extern u16 l2cap_max_mtu(void); __this->s_basic_info.max_buffer_size = 256;//l2cap_max_mtu(); #endif printf("cfg_tool max_buffer_size:%d\n", __this->s_basic_info.max_buffer_size); #endif send_len = sizeof(__this->s_basic_info); buf = send_buf_malloc(send_len); memcpy(buf, &(__this->s_basic_info), send_len); } break; case ONLINE_SUB_OP_CPU_RESET: send_len = 2; u8 cpu_reset_ret[] = "OK"; buf = send_buf_malloc(send_len); memcpy(buf, cpu_reset_ret, send_len); sys_timeout_add(NULL, delay_cpu_reset, 500); break; case ONLINE_SUB_OP_QUERY_FILE_SIZE: __this->r_file_size.file_id = packet_combined(cfg_packet.packet, 8); cfg_fp = cfg_open_file(__this->r_file_size.file_id); if (cfg_fp == NULL) { log_error("file open error!\n"); goto _exit_; } resfile_get_attrs(cfg_fp, &attr); __this->s_file_size.file_size = attr.fsize; send_len = sizeof(__this->s_file_size.file_size);//长度 buf = send_buf_malloc(send_len); memcpy(buf, &(__this->s_file_size.file_size), send_len); resfile_close(cfg_fp); break; case ONLINE_SUB_OP_QUERY_FILE_CONTENT: __this->r_file_content.file_id = packet_combined(cfg_packet.packet, 8); __this->r_file_content.offset = packet_combined(cfg_packet.packet, 12); __this->r_file_content.size = packet_combined(cfg_packet.packet, 16); cfg_fp = cfg_open_file(__this->r_file_content.file_id); if (cfg_fp == NULL) { log_error("file open error!\n"); goto _exit_; } resfile_get_attrs(cfg_fp, &attr); if (__this->r_file_content.size > attr.fsize) { resfile_close(cfg_fp); log_error("reading size more than actual size!\n"); break; } u32 flash_addr = sdfile_cpu_addr2flash_addr(attr.sclust); buf_temp = (u8 *)malloc(__this->r_file_content.size); if (buf_temp == NULL) { log_error("buf_temp malloc err!"); goto _exit_; } tzflash_read((void *)buf_temp, __this->r_file_content.size, flash_addr + __this->r_file_content.offset); send_len = __this->r_file_content.size; buf = send_buf_malloc(send_len); memcpy(buf, buf_temp, __this->r_file_content.size); free(buf_temp); resfile_close(cfg_fp); break; case ONLINE_SUB_OP_PREPARE_WRITE_FILE: __this->r_prepare_write_file.file_id = packet_combined(cfg_packet.packet, 8); __this->r_prepare_write_file.size = packet_combined(cfg_packet.packet, 12); cfg_fp = cfg_open_file(__this->r_prepare_write_file.file_id); if (cfg_fp == NULL) { log_error("file open error!\n"); break; } resfile_get_attrs(cfg_fp, &attr); __this->s_prepare_write_file.file_size = attr.fsize; __this->s_prepare_write_file.file_addr = sdfile_cpu_addr2flash_addr(attr.sclust); __this->s_prepare_write_file.earse_unit = boot_info.vm.align * 256; send_len = sizeof(__this->s_prepare_write_file); buf = send_buf_malloc(send_len); memcpy(buf, &(__this->s_prepare_write_file), send_len); resfile_close(cfg_fp); if (__this->r_prepare_write_file.file_id == CFG_STREAM_FILEID) { app_send_message(APP_MSG_WRITE_RESFILE_START, (int)"stream.bin"); } break; case ONLINE_SUB_OP_READ_ADDR_RANGE: __this->r_read_addr_range.addr = packet_combined(cfg_packet.packet, 8); __this->r_read_addr_range.size = packet_combined(cfg_packet.packet, 12); buf_temp = (u8 *)malloc(__this->r_read_addr_range.size); if (buf_temp == NULL) { log_error("buf_temp malloc err!"); goto _exit_; } tzflash_read((void *)buf_temp, __this->r_read_addr_range.size, __this->r_read_addr_range.addr); send_len = __this->r_read_addr_range.size; buf = send_buf_malloc(send_len); memcpy(buf, buf_temp, __this->r_read_addr_range.size); free(buf_temp); break; case ONLINE_SUB_OP_ERASE_ADDR_RANGE: __this->r_erase_addr_range.addr = packet_combined(cfg_packet.packet, 8); __this->r_erase_addr_range.size = packet_combined(cfg_packet.packet, 12); switch (__this->s_prepare_write_file.earse_unit) { case 256: erase_cmd = IOCTL_ERASE_PAGE; break; case (4*1024): erase_cmd = IOCTL_ERASE_SECTOR; break; case (64*1024): erase_cmd = IOCTL_ERASE_BLOCK; break; default: send_len = sizeof(fa_return); buf = send_buf_malloc(send_len); memcpy(buf, fa_return, send_len); log_error("erase error!"); break; } for (u8 i = 0; i < (__this->r_erase_addr_range.size / __this->s_prepare_write_file.earse_unit); i ++) { /* u8 ret = sfc_norflash_erase(erase_cmd, __this->r_erase_addr_range.addr + (i * __this->s_prepare_write_file.earse_unit)); */ int ret = tzflash_ioctl(erase_cmd, __this->r_erase_addr_range.addr + (i * __this->s_prepare_write_file.earse_unit)); if (ret) { send_len = sizeof(fa_return); buf = send_buf_malloc(send_len); memcpy(buf, fa_return, send_len); log_error("erase error!"); break; } else { send_len = sizeof(ok_return); buf = send_buf_malloc(send_len); memcpy(buf, ok_return, send_len); } } break; case ONLINE_SUB_OP_WRITE_ADDR_RANGE: __this->r_write_addr_range.addr = packet_combined(cfg_packet.packet, 8); __this->r_write_addr_range.size = packet_combined(cfg_packet.packet, 12); buf_temp = (u8 *)malloc(__this->r_write_addr_range.size); if (buf_temp == NULL) { log_error("buf_temp malloc err!"); goto _exit_; } memcpy(buf_temp, cfg_packet.packet + 16, __this->r_write_addr_range.size); encode_data_by_user_key(boot_info.chip_id, buf_temp, __this->r_write_addr_range.size, __this->r_write_addr_range.addr - boot_info.sfc.sfc_base_addr, 0x20); write_len = tzflash_write(buf_temp, __this->r_write_addr_range.size, __this->r_write_addr_range.addr); if (write_len != __this->r_write_addr_range.size) { send_len = sizeof(fa_return); buf = send_buf_malloc(send_len); memcpy(buf, fa_return, send_len); log_error("write error!"); } else { send_len = sizeof(ok_return); buf = send_buf_malloc(send_len); memcpy(buf, ok_return, send_len); } if (buf_temp) { free(buf_temp); } #if (CFG_TOOL_VER != CFG_TOOL_VER_VISUAL) if (__this->r_prepare_write_file.file_id == CFG_TOOL_FILEID) { size_total_write += __this->r_write_addr_range.size; if (size_total_write >= __this->r_erase_addr_range.size) { size_total_write = 0; log_info("cpu_reset\n"); sys_timeout_add(NULL, delay_cpu_reset, 500); } } #endif int a = __this->r_write_addr_range.addr + __this->r_write_addr_range.size; int b = __this->s_prepare_write_file.file_addr + __this->s_prepare_write_file.file_size; if (__this->r_prepare_write_file.file_id == CFG_STREAM_FILEID) { if (a >= b) { app_send_message(APP_MSG_WRITE_RESFILE_STOP, (int)"stream.bin"); } } break; #if TCFG_COMM_TYPE == TCFG_USB_COMM case ONLINE_SUB_OP_ENTER_UPGRADE_MODE: log_info("event_ONLINE_SUB_OP_ENTER_UPGRADE_MODE\n"); go_mask_usb_updata(); break; #endif case ONLINE_SUB_OP_ONLINE_INSPECTION: R_QUERY_SYS_INFO upload_param = {0}; upload_param.use_mem = memory_get_size(P_MEMORY_USED);//使用的mem; upload_param.total_mem = memory_get_size(P_MEMORY_TOTAL);//总的mem int cpu_use[2] = {0}; os_cpu_usage(NULL, cpu_use); int cpu_usage = (cpu_use[0] + cpu_use[1]) / CPU_CORE_NUM; upload_param.cpu_use_ratio = cpu_usage; upload_param.task_num = get_task_info_list_num(); send_len = sizeof(upload_param); buf = send_buf_malloc(send_len); memcpy(buf, &upload_param, send_len); break; default: // DEFAULT_ACTION #if (CFG_TOOL_VER == CFG_TOOL_VER_VISUAL) if (buf) { free(buf); buf = NULL; } return; #else log_error("invalid data\n"); send_len = sizeof(er_return); buf = send_buf_malloc(send_len); memcpy(buf, er_return, sizeof(er_return));//不认识的命令返回ER #endif break; _exit_: send_len = sizeof(fa_return); buf = send_buf_malloc(send_len); memcpy(buf, fa_return, sizeof(fa_return));//文件打开失败返回FA break; } all_assemble_package_send_to_pc(REPLY_STYLE, cfg_packet.packet[3], buf, send_len); if (buf) { free(buf); buf = NULL; } } #if (CFG_TOOL_VER == CFG_TOOL_VER_VISUAL) REGISTER_DETECT_TARGET(cfg_tool_target) = { .id = VISUAL_CFG_TOOL_CHANNEL_STYLE, .tool_message_deal = cfg_tool_callback, }; #else REGISTER_DETECT_TARGET(cfg_tool_target) = { .id = INITIATIVE_STYLE, .tool_message_deal = cfg_tool_callback, }; #endif //在线调试不进power down static u8 cfg_tool_idle_query(void) { return !cfg_tool_online_status(); } REGISTER_LP_TARGET(cfg_tool_lp_target) = { .name = "new_cfg_tool", .is_idle = cfg_tool_idle_query, }; #endif // TCFG_CFG_TOOL_ENABLE