KT24-1110_65E-HA-651B/apps/soundbox/common/app_sound_box_tool.c
2024-11-10 18:44:17 +08:00

743 lines
27 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "app_sound_box_tool.h"
#include "event.h"
#include "usb/device/cdc.h"
#include "boot.h"
#include "ioctl_cmds.h"
#include "board_config.h"
#include "app_online_cfg.h"
#include "asm/crc16.h"
#define LOG_TAG_CONST APP_SOUNDBOX_TOOL
#define LOG_TAG "[APP_SOUNDBOX_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_SOUNDBOX_TOOL_ENABLE || TCFG_ONLINE_ENABLE)
struct sound_box_tool_info {
/*PC往小机发送的DATA*/
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;
/*小机返回PC发送的DATA*/
S_QUERY_BASIC_INFO s_basic_info;
S_QUERY_FILE_SIZE s_file_size;
S_PREPARE_WRITE_FILE s_prepare_write_file;
};
static struct sound_box_tool_info info = {
.s_basic_info.protocolVer = PROTOCOL_VER_AT_NEW,
};
#define TEMP_BUF_SIZE 256
extern const char *sdk_version_info_get(void);
extern u8 *sdfile_get_burn_code(u8 *len);
static u8 local_packet[TEMP_BUF_SIZE];
const char error_return[] = "FA"; //表示失败
const char ok_return[] = "OK"; //表示成功
const char er_return[] = "ER"; //表示不能识别的命令
static u32 size_total_write = 0;
extern void doe(u16 k, void *pBuf, u32 lenIn, u32 addr);
extern int norflash_erase(u32 cmd, u32 addr);
#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 sound_box_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 all_assemble_package_send_to_pc(u8 id, u8 sq, u8 *buf, u32 len)
{
u8 send_buf[TEMP_BUF_SIZE];
u16 crc16_data;
/*添加报头*/
send_buf[0] = 0x5A;
send_buf[1] = 0xAA;
send_buf[2] = 0xA5;
/*L*/
send_buf[5] = 2 + len;
/*T*/
send_buf[6] = id;
/*SQ*/
send_buf[7] = sq;
/*组包完成*/
memcpy(send_buf + 8, buf, len);
/*添加CRC16*/
crc16_data = CRC16(&send_buf[5], len + 3);
send_buf[3] = crc16_data & 0xff;
send_buf[4] = (crc16_data >> 8) & 0xff;
/* printf_buf(send_buf, len + 8); */
/*发送给PC*/
#if TCFG_ONLINE_ENABLE
#if (TCFG_COMM_TYPE == TCFG_USB_COMM)
cdc_write_data(0, send_buf, len + 8);
#else
ci_uart_write(send_buf, len + 8);
#endif
#endif
}
/*组包与发送*/
void assemble_package_send_to_pc(u8 *buf, u32 len)
{
u8 send_buf[TEMP_BUF_SIZE];
u16 crc16_data;
/*添加报头*/
send_buf[0] = 0x5A;
send_buf[1] = 0xAA;
send_buf[2] = 0xA5;
/*添加CRC16*/
crc16_data = CRC16(buf, len);
send_buf[3] = crc16_data & 0xff;
send_buf[4] = (crc16_data >> 8) & 0xff;
/*组包完成*/
memcpy(send_buf + 5, buf, len);
/* printf_buf(send_buf, len + 5); */
/*发送给PC*/
#if (TCFG_SOUNDBOX_TOOL_ENABLE || TCFG_ONLINE_ENABLE)
#if (TCFG_COMM_TYPE == TCFG_USB_COMM)
cdc_write_data(0, send_buf, len + 5);
#else
ci_uart_write(send_buf, len + 5);
#endif
#endif
}
/*6个byte的校验码数组转为字符串*/
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]);
}
extern void nvram_set_boot_state(u32 state);
extern void hw_mmu_disable(void);
extern void ram_protect_close(void);
AT(.volatile_ram_code)
void soundbox_tool_go_mask_usb_updata()
{
local_irq_disable();
ram_protect_close();
hw_mmu_disable();
nvram_set_boot_state(2);
JL_CLOCK->PWR_CON |= (1 << 4);
/* chip_reset(); */
/* cpu_reset(); */
while (1);
}
int app_soundbox_tool_event_handler(struct soundbox_tool_event *soundbox_tool_dev)
{
u8 buf[TEMP_BUF_SIZE];
u8 *buf_temp = NULL;
u8 *buf_temp_0 = NULL;
u32 erase_cmd;
int write_len;
u8 crc_temp_len, sdkname_temp_len;
char proCrc_fw[32] = {0};
char sdkName_fw[32] = {0};
const struct tool_interface *p;
/* printf_buf(soundbox_tool_dev->packet, soundbox_tool_dev->size); */
buf_temp_0 = (u8 *)malloc(256);
buf_temp_0 = (u8 *)ALIGN(buf_temp_0, 4);
memset(buf_temp_0, 0, 256);
memcpy(buf_temp_0 + 1, soundbox_tool_dev->packet, soundbox_tool_dev->size);
/*数据进行处理*/
list_for_each_tool_interface(p) {
if (p->id == soundbox_tool_dev->packet[1]) {
p->tool_message_deal(buf_temp_0 + 2, soundbox_tool_dev->size - 1);
if (buf_temp_0) {
free(buf_temp_0);
}
return 0;
}
}
memset(buf, 0, TEMP_BUF_SIZE);
switch (soundbox_tool_dev->event) {
case ONLINE_SUB_OP_QUERY_BASIC_INFO:
log_info("event_ONLINE_SUB_OP_QUERY_BASIC_INFO\n");
/*获取校验码*/
u8 *p = sdfile_get_burn_code(&crc_temp_len);
memcpy(info.s_basic_info.progCrc, p + 8, 6);
/* printf_buf(info.s_basic_info.progCrc, 6); */
hex2text(info.s_basic_info.progCrc, proCrc_fw);
/* log_info("crc:%s\n", proCrc_fw); */
/*获取固件版本信息*/
sdkname_temp_len = strlen(sdk_version_info_get());
memcpy(info.s_basic_info.sdkName, sdk_version_info_get(), sdkname_temp_len);
memcpy(sdkName_fw, info.s_basic_info.sdkName, sdkname_temp_len);
log_info("version:%s\n", sdk_version_info_get());
struct flash_head flash_head_for_pid_vid;
for (u8 i = 0; i < 5; i++) {
norflash_read(NULL, (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;
}
}
struct flash_head _head;
struct flash_head *temp_p = &_head;
memcpy(temp_p, &flash_head_for_pid_vid, 32);
/*获取PID*/
memset(info.s_basic_info.pid, 0, sizeof(info.s_basic_info.pid));
memcpy(info.s_basic_info.pid, temp_p->pid, sizeof(info.s_basic_info.pid));
for (u8 i = 0; i < sizeof(info.s_basic_info.pid); i++) {
if (~info.s_basic_info.pid[i] == 0x00) {
info.s_basic_info.pid[i] = 0x00;
}
}
/* printf_buf(info.s_basic_info.pid, 16); */
/*获取VID*/
memset(info.s_basic_info.vid, 0, sizeof(info.s_basic_info.vid));
memcpy(info.s_basic_info.vid, temp_p->vid, 4);
/* printf_buf(info.s_basic_info.vid, 16); */
/*第一次组包*/
buf[0] = 1 + 1 + sizeof(info.s_basic_info.protocolVer) + sizeof(proCrc_fw) + sizeof(sdkName_fw) + 32;
buf[1] = REPLY_STYLE;
buf[2] = soundbox_tool_dev->packet[2];
buf[3] = info.s_basic_info.protocolVer & 0xff;
buf[4] = (info.s_basic_info.protocolVer >> 8) & 0xff;
memcpy(buf + 5, proCrc_fw, sizeof(proCrc_fw));
memcpy(buf + 5 + sizeof(proCrc_fw), sdkName_fw, sizeof(sdkName_fw));
memcpy(buf + 5 + sizeof(proCrc_fw) + sizeof(sdkName_fw), info.s_basic_info.pid, 16);
memcpy(buf + 5 + sizeof(proCrc_fw) + sizeof(sdkName_fw) + 16, info.s_basic_info.vid, 16);
/* printf_buf(buf, buf[0] + 1); */
/*二次组包添加报头与CRC16并发送*/
assemble_package_send_to_pc(buf, buf[0] + 1);
break;
case ONLINE_SUB_OP_QUERY_FILE_SIZE:
log_info("event_ONLINE_SUB_OP_QUERY_FILE_SIZE\n");
/*读取文件ID*/
info.r_file_size.file_id = (soundbox_tool_dev->packet[7] | (soundbox_tool_dev->packet[8] << 8) | \
(soundbox_tool_dev->packet[9] << 16) | (soundbox_tool_dev->packet[10] << 24));
if (info.r_file_size.file_id <= CFG_EQ_FILEID) {
/*根据名字获取文件句柄*/
FILE *cfg_fp = NULL;
if ((info.r_file_size.file_id == CFG_TOOL_FILEID)) {
cfg_fp = fopen(CFG_TOOL_FILE, "r");
log_info("open cfg_tool.bin\n");
} else if ((info.r_file_size.file_id == CFG_OLD_EQ_FILEID)) {
cfg_fp = fopen(CFG_OLD_EQ_FILE, "r");
log_info("open old eq_cfg_hw.bin\n");
} else if ((info.r_file_size.file_id == CFG_OLD_EFFECT_FILEID)) {
cfg_fp = fopen(CFG_OLD_EFFECT_FILE, "r");
log_info("open effects_cfg.bin\n");
} else if ((info.r_file_size.file_id == CFG_EQ_FILEID)) {
cfg_fp = fopen(CFG_EQ_FILE, "r");
log_info("open eq_cfg_hw.bin\n");
}
if (cfg_fp == NULL) {
log_error("file open error!\n");
break;
}
/*根据文件句柄获取文件属性*/
struct vfs_attr attr;
fget_attrs(cfg_fp, &attr);
log_info("file addr:%x,file size:%d\n", attr.sclust, attr.fsize);
info.s_file_size.file_size = attr.fsize;
/*第一次组包*/
buf[0] = 1 + 1 + sizeof(info.s_file_size.file_size);//长度
buf[1] = REPLY_STYLE;//包的类型
buf[2] = soundbox_tool_dev->packet[2];//回复序列号
/*小端格式*/
buf[6] = (info.s_file_size.file_size >> 24) & 0xff;
buf[5] = (info.s_file_size.file_size >> 16) & 0xff;
buf[4] = (info.s_file_size.file_size >> 8) & 0xff;
buf[3] = info.s_file_size.file_size & 0xff;
/*二次组包添加报头与CRC16并发送*/
assemble_package_send_to_pc(buf, buf[0] + 1);
fclose(cfg_fp);
}
break;
case ONLINE_SUB_OP_QUERY_FILE_CONTENT:
log_info("event_ONLINE_SUB_OP_QUERY_FILE_CONTENT\n");
/*读取文件的ID*/
info.r_file_content.file_id = (soundbox_tool_dev->packet[7] | (soundbox_tool_dev->packet[8] << 8) | \
(soundbox_tool_dev->packet[9] << 16) | (soundbox_tool_dev->packet[10] << 24));
/*读取文件的偏移*/
info.r_file_content.offset = (soundbox_tool_dev->packet[11] | (soundbox_tool_dev->packet[12] << 8) | \
(soundbox_tool_dev->packet[13] << 16) | (soundbox_tool_dev->packet[14] << 24));
/*读取文件的大小*/
info.r_file_content.size = (soundbox_tool_dev->packet[15] | (soundbox_tool_dev->packet[16] << 8) | \
(soundbox_tool_dev->packet[17] << 16) | (soundbox_tool_dev->packet[18] << 24));
if (info.r_file_content.file_id <= CFG_EQ_FILEID) {
/*根据名字获取文件句柄*/
FILE *cfg_fp = NULL;
if ((info.r_file_content.file_id == CFG_TOOL_FILEID)) {
cfg_fp = fopen(CFG_TOOL_FILE, "r");
log_info("open cfg_tool.bin\n");
} else if ((info.r_file_content.file_id == CFG_OLD_EQ_FILEID)) {
cfg_fp = fopen(CFG_OLD_EQ_FILE, "r");
log_info("open old eq_cfg_hw.bin\n");
} else if ((info.r_file_content.file_id == CFG_OLD_EFFECT_FILEID)) {
cfg_fp = fopen(CFG_OLD_EFFECT_FILE, "r");
log_info("open effects_cfg.bin\n");
} else if ((info.r_file_content.file_id == CFG_EQ_FILEID)) {
cfg_fp = fopen(CFG_EQ_FILE, "r");
log_info("open eq_cfg_hw.bin\n");
}
if (cfg_fp == NULL) {
log_error("file open error!\n");
break;
}
/*根据文件句柄获取文件属性*/
struct vfs_attr attr;
fget_attrs(cfg_fp, &attr);
/* log_info("file addr:%x,file size:%d\n", attr.sclust, attr.fsize); */
if (info.r_file_content.size > attr.fsize) {
fclose(cfg_fp);
log_error("reading size more than actual size!\n");
break;
}
/*逻辑地址转换成flash物理地址*/
u32 flash_addr = sdfile_cpu_addr2flash_addr(attr.sclust);
/* log_info("flash_addr:0x%x", flash_addr); */
/*读取文件内容*/
buf_temp = (char *)malloc(info.r_file_content.size);
norflash_read(NULL, (void *)buf_temp, info.r_file_content.size, flash_addr + info.r_file_content.offset);
/* printf_buf(buf_temp, info.r_file_content.size); */
/*第一次组包*/
buf[0] = 1 + 1 + info.r_file_content.size;
buf[1] = REPLY_STYLE;
buf[2] = soundbox_tool_dev->packet[2];
memcpy(buf + 3, buf_temp, info.r_file_content.size);
/*二次组包添加报头与CRC16并发送*/
assemble_package_send_to_pc(buf, buf[0] + 1);
if (buf_temp) {
free(buf_temp);
}
fclose(cfg_fp);
}
break;
case ONLINE_SUB_OP_PREPARE_WRITE_FILE:
log_info("event_ONLINE_SUB_OP_PREPARE_WRITE_FILE\n");
/*读取文件的ID*/
info.r_prepare_write_file.file_id = (soundbox_tool_dev->packet[7] | (soundbox_tool_dev->packet[8] << 8) | \
(soundbox_tool_dev->packet[9] << 16) | (soundbox_tool_dev->packet[10] << 24));
/*读取文件的大小*/
info.r_prepare_write_file.size = (soundbox_tool_dev->packet[11] | (soundbox_tool_dev->packet[12] << 8) | \
(soundbox_tool_dev->packet[13] << 16) | (soundbox_tool_dev->packet[14] << 24));
if (info.r_prepare_write_file.file_id <= CFG_EQ_FILEID) {
/*根据名字获取文件句柄*/
FILE *cfg_fp = NULL;
if ((info.r_prepare_write_file.file_id == CFG_TOOL_FILEID)) {
cfg_fp = fopen(CFG_TOOL_FILE, "r");
log_info("open cfg_tool.bin\n");
} else if ((info.r_prepare_write_file.file_id == CFG_OLD_EQ_FILEID)) {
cfg_fp = fopen(CFG_OLD_EQ_FILE, "r");
log_info("open old eq_cfg_hw.bin\n");
} else if ((info.r_prepare_write_file.file_id == CFG_OLD_EFFECT_FILEID)) {
cfg_fp = fopen(CFG_OLD_EFFECT_FILE, "r");
log_info("open effects_cfg.bin\n");
} else if ((info.r_prepare_write_file.file_id == CFG_EQ_FILEID)) {
cfg_fp = fopen(CFG_EQ_FILE, "r");
log_info("open eq_cfg_hw.bin\n");
}
if (cfg_fp == NULL) {
log_error("file open error!\n");
break;
}
/*根据文件句柄获取文件属性*/
struct vfs_attr attr;
fget_attrs(cfg_fp, &attr);
/* log_info("file addr:%x,file size:%d\n", attr.sclust, attr.fsize); */
if (info.r_prepare_write_file.size > attr.fsize) {
//fclose(cfg_fp);
//log_error("preparing to write size more than actual size!\n");
//break;
}
/*获取文件实际大小*/
info.s_prepare_write_file.file_size = attr.fsize;
log_info("file_size = %d\n", info.s_prepare_write_file.file_size);
/*逻辑地址转换成flash物理地址*/
info.s_prepare_write_file.file_addr = sdfile_cpu_addr2flash_addr(attr.sclust);
log_info("file_flash_addr:0x%x\n", info.s_prepare_write_file.file_addr);
/*获取flash擦除单元*/
info.s_prepare_write_file.earse_unit = boot_info.vm.align * 256;
log_info("earse_unit = %d\n", info.s_prepare_write_file.earse_unit);
/*第一次组包*/
buf[0] = 1 + 1 + sizeof(info.s_prepare_write_file.file_size) * 3;
buf[1] = REPLY_STYLE;
buf[2] = soundbox_tool_dev->packet[2];
buf[6] = (info.s_prepare_write_file.file_addr >> 24) & 0xff;
buf[5] = (info.s_prepare_write_file.file_addr >> 16) & 0xff;
buf[4] = (info.s_prepare_write_file.file_addr >> 8) & 0xff;
buf[3] = info.s_prepare_write_file.file_addr & 0xff;
buf[10] = (info.s_prepare_write_file.file_size >> 24) & 0xff;
buf[9] = (info.s_prepare_write_file.file_size >> 16) & 0xff;
buf[8] = (info.s_prepare_write_file.file_size >> 8) & 0xff;
buf[7] = info.s_prepare_write_file.file_size & 0xff;
buf[14] = (info.s_prepare_write_file.earse_unit >> 24) & 0xff;
buf[13] = (info.s_prepare_write_file.earse_unit >> 16) & 0xff;
buf[12] = (info.s_prepare_write_file.earse_unit >> 8) & 0xff;
buf[11] = info.s_prepare_write_file.earse_unit & 0xff;
/*二次组包添加报头与CRC16并发送*/
assemble_package_send_to_pc(buf, buf[0] + 1);
fclose(cfg_fp);
}
break;
case ONLINE_SUB_OP_READ_ADDR_RANGE:
log_info("event_ONLINE_SUB_OP_READ_ADDR_RANGE\n");
/*要读取的flash物理地址*/
info.r_read_addr_range.addr = (soundbox_tool_dev->packet[7] | (soundbox_tool_dev->packet[8] << 8) | \
(soundbox_tool_dev->packet[9] << 16) | (soundbox_tool_dev->packet[10] << 24));
log_info("reading flash addr:0x%x\n", info.r_read_addr_range.addr);
/*要读取的大小*/
info.r_read_addr_range.size = (soundbox_tool_dev->packet[11] | (soundbox_tool_dev->packet[12] << 8) | \
(soundbox_tool_dev->packet[13] << 16) | (soundbox_tool_dev->packet[14] << 24));
log_info("reading size = %d\n", info.r_read_addr_range.size);
/*读取文件内容*/
buf_temp = (char *)malloc(info.r_read_addr_range.size);
norflash_read(NULL, (void *)buf_temp, info.r_read_addr_range.size, info.r_read_addr_range.addr);
/* printf_buf(buf_temp, info.r_read_addr_range.size); */
/*第一次组包*/
buf[0] = 1 + 1 + info.r_read_addr_range.size;
buf[1] = REPLY_STYLE;
buf[2] = soundbox_tool_dev->packet[2];
memcpy(buf + 3, buf_temp, info.r_read_addr_range.size);
/*二次组包添加报头与CRC16并发送*/
assemble_package_send_to_pc(buf, buf[0] + 1);
if (buf_temp) {
free(buf_temp);
}
break;
case ONLINE_SUB_OP_ERASE_ADDR_RANGE:
log_info("event_ONLINE_SUB_OP_ERASE_ADDR_RANGE\n");
/*要擦除的flash物理起始地址*/
info.r_erase_addr_range.addr = (soundbox_tool_dev->packet[7] | (soundbox_tool_dev->packet[8] << 8) | \
(soundbox_tool_dev->packet[9] << 16) | (soundbox_tool_dev->packet[10] << 24));
log_info("erasing flash start addr:0x%x\n", info.r_erase_addr_range.addr);
/*要擦除的大小会保证按earse_unit对齐即总是erase_unit的倍数*/
info.r_erase_addr_range.size = (soundbox_tool_dev->packet[11] | (soundbox_tool_dev->packet[12] << 8) | \
(soundbox_tool_dev->packet[13] << 16) | (soundbox_tool_dev->packet[14] << 24));
log_info("erasing size = %d\n", info.r_erase_addr_range.size);
log_info("earse_unit = %d\n", info.s_prepare_write_file.earse_unit);
switch (info.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;
defualt:
memcpy(buf + 3, error_return, sizeof(error_return));
log_error("erase error!");
break;
}
for (u8 i = 0; i < (info.r_erase_addr_range.size / info.s_prepare_write_file.earse_unit); i ++) {
extern int norflash_erase(u32 cmd, u32 addr);
u8 ret = norflash_erase(erase_cmd, info.r_erase_addr_range.addr + (i * info.s_prepare_write_file.earse_unit));
if (ret) {
memcpy(buf + 3, error_return, sizeof(error_return));
log_error("erase error!");
} else {
memcpy(buf + 3, ok_return, sizeof(ok_return));
log_info("erase success");
}
}
/*第一次组包*/
buf[0] = 1 + 1 + sizeof(error_return);
buf[1] = REPLY_STYLE;
buf[2] = soundbox_tool_dev->packet[2];
/*二次组包添加报头与CRC16并发送*/
assemble_package_send_to_pc(buf, buf[0] + 1);
break;
case ONLINE_SUB_OP_WRITE_ADDR_RANGE:
log_info("event_ONLINE_SUB_OP_WRITE_ADDR_RANGE\n");
/*要写入的flash物理起始地址*/
info.r_write_addr_range.addr = (soundbox_tool_dev->packet[7] | (soundbox_tool_dev->packet[8] << 8) | \
(soundbox_tool_dev->packet[9] << 16) | (soundbox_tool_dev->packet[10] << 24));
/*要写入的大小*/
info.r_write_addr_range.size = (soundbox_tool_dev->packet[11] | (soundbox_tool_dev->packet[12] << 8) | \
(soundbox_tool_dev->packet[13] << 16) | (soundbox_tool_dev->packet[14] << 24));
/*读取要写入文件的内容*/
buf_temp = (char *)malloc(info.r_write_addr_range.size);
memcpy(buf_temp, soundbox_tool_dev->packet + 15, info.r_write_addr_range.size);
/* printf_buf(buf_temp, info.r_write_addr_range.size); */
sound_box_encode_data_by_user_key(boot_info.chip_id, buf_temp, info.r_write_addr_range.size, info.r_write_addr_range.addr - boot_info.sfc.sfc_base_addr, 0x20);
/*写入数据*/
write_len = norflash_write(NULL, buf_temp, info.r_write_addr_range.size, info.r_write_addr_range.addr);
if (write_len != info.r_write_addr_range.size) {
memcpy(buf + 3, error_return, sizeof(error_return));
log_error("write error!");
} else {
memcpy(buf + 3, ok_return, sizeof(ok_return));
}
/*第一次组包*/
buf[0] = 1 + 1 + sizeof(error_return);
buf[1] = REPLY_STYLE;
buf[2] = soundbox_tool_dev->packet[2];
/*二次组包添加报头与CRC16并发送*/
assemble_package_send_to_pc(buf, buf[0] + 1);
if (buf_temp) {
free(buf_temp);
}
if (info.r_prepare_write_file.file_id == CFG_TOOL_FILEID) {
size_total_write += info.r_write_addr_range.size;
log_info("size_total_write = %d\n", size_total_write);
log_info("erasing size = %d\n", info.r_erase_addr_range.size);
if (size_total_write >= info.r_erase_addr_range.size) {
size_total_write = 0;
log_info("cpu_reset\n");
assemble_package_send_to_pc(buf, buf[0] + 1);
delay_2ms(10);
extern void cpu_reset();
cpu_reset();
}
}
break;
case ONLINE_SUB_OP_ENTER_UPGRADE_MODE:
log_info("event_ONLINE_SUB_OP_ENTER_UPGRADE_MODE\n");
soundbox_tool_go_mask_usb_updata();
break;
default:
log_error("unrecognized command ! ! !\n");
/*return ER to pc*/
memcpy(buf + 3, er_return, sizeof(er_return));
buf[0] = 1 + 1 + sizeof(er_return);
buf[1] = REPLY_STYLE;
buf[2] = soundbox_tool_dev->packet[2];
assemble_package_send_to_pc(buf, buf[0] + 1);
break;
}
if (buf_temp_0) {
free(buf_temp_0);
}
return 0;
}
void soundbox_tool_event_to_user(u8 *packet, u32 type, u8 event, u8 size)
{
struct sys_event e;
e.type = SYS_DEVICE_EVENT;
if (packet != NULL) {
if (size > sizeof(local_packet)) {
return;
}
e.u.soundbox_tool.packet = local_packet;
memcpy(e.u.soundbox_tool.packet, packet, size);
}
e.arg = (void *)type;
e.u.soundbox_tool.event = event;
e.u.soundbox_tool.size = size;
sys_event_notify(&e);
}
/*不在中断处理 post消息出去*/
void app_sound_box_tool_message_deal(u8 *buf, u32 len)
{
u8 cmd = buf[8];
switch (cmd) {
case ONLINE_SUB_OP_QUERY_BASIC_INFO:
/* log_info("PC is querying basic info\n"); */
info.r_basic_info.cmd_id = cmd;
soundbox_tool_event_to_user(&buf[5], DEVICE_EVENT_FROM_SOUNDBOX_TOOL, ONLINE_SUB_OP_QUERY_BASIC_INFO, buf[5] + 1);
break;
case ONLINE_SUB_OP_QUERY_FILE_SIZE:
/* log_info("PC is querying file size\n"); */
info.r_file_size.cmd_id = cmd;
soundbox_tool_event_to_user(&buf[5], DEVICE_EVENT_FROM_SOUNDBOX_TOOL, ONLINE_SUB_OP_QUERY_FILE_SIZE, buf[5] + 1);
break;
case ONLINE_SUB_OP_QUERY_FILE_CONTENT:
/* log_info("PC is querying file content\n"); */
info.r_file_content.cmd_id = cmd;
soundbox_tool_event_to_user(&buf[5], DEVICE_EVENT_FROM_SOUNDBOX_TOOL, ONLINE_SUB_OP_QUERY_FILE_CONTENT, buf[5] + 1);
break;
case ONLINE_SUB_OP_PREPARE_WRITE_FILE:
/* log_info("PC is preparing to write file\n"); */
info.r_prepare_write_file.cmd_id = cmd;
soundbox_tool_event_to_user(&buf[5], DEVICE_EVENT_FROM_SOUNDBOX_TOOL, ONLINE_SUB_OP_PREPARE_WRITE_FILE, buf[5] + 1);
break;
case ONLINE_SUB_OP_READ_ADDR_RANGE:
/* log_info("PC is reading address range\n"); */
info.r_read_addr_range.cmd_id = cmd;
soundbox_tool_event_to_user(&buf[5], DEVICE_EVENT_FROM_SOUNDBOX_TOOL, ONLINE_SUB_OP_READ_ADDR_RANGE, buf[5] + 1);
break;
case ONLINE_SUB_OP_ERASE_ADDR_RANGE:
/* log_info("PC is erasing address range\n"); */
info.r_erase_addr_range.cmd_id = cmd;
soundbox_tool_event_to_user(&buf[5], DEVICE_EVENT_FROM_SOUNDBOX_TOOL, ONLINE_SUB_OP_ERASE_ADDR_RANGE, buf[5] + 1);
break;
case ONLINE_SUB_OP_WRITE_ADDR_RANGE:
/* log_info("PC is writing address range\n"); */
info.r_write_addr_range.cmd_id = cmd;
soundbox_tool_event_to_user(&buf[5], DEVICE_EVENT_FROM_SOUNDBOX_TOOL, ONLINE_SUB_OP_WRITE_ADDR_RANGE, buf[5] + 1);
break;
case ONLINE_SUB_OP_ENTER_UPGRADE_MODE:
/* log_info("PC is entering upgrade mode\n"); */
info.r_enter_upgrade_mode.cmd_id = cmd;
soundbox_tool_event_to_user(&buf[5], DEVICE_EVENT_FROM_SOUNDBOX_TOOL, ONLINE_SUB_OP_ENTER_UPGRADE_MODE, buf[5] + 1);
break;
default:
/* log_info("other tools data\n"); */
soundbox_tool_event_to_user(&buf[5], DEVICE_EVENT_FROM_SOUNDBOX_TOOL, DEFAULT_ACTION, buf[5] + 1);
break;
}
}
/*数据包内容校验与处理*/
void online_cfg_tool_data_deal(void *buf, u32 len)
{
u8 *data_buf = buf;
u16 crc16_data;
/* printf_buf(buf, len); */
/*DATA前的固定字节包括 (5A AA A5 CRC L T SQ)共8个字节 */
if (len < 8) {
log_error("Data length is too short, receive an invalid message!\n");
return;
}
/*检查报头 5A AA A5是否正确*/
if ((data_buf[0] != 0x5a) || (data_buf[1] != 0xaa) || (data_buf[2] != 0xa5)) {
log_error("Header check error, receive an invalid message!\n");
return;
}
/*CRC16校验CRC16校验码位于数据包的buf[3]和buf[4]*/
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;
}
/*数据进行处理*/
app_sound_box_tool_message_deal(buf, len);
}
#endif