使用赋码仪主板 app升级,方案升级验证通过
This commit is contained in:
@@ -19,18 +19,20 @@
|
||||
typedef struct{
|
||||
ucport_def u;
|
||||
rt_timer_t timer;
|
||||
array_def *data;
|
||||
int *host_type;// 主机接口类型0串口,1can
|
||||
}slave_def;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static void slave_dolater(ucport_def *u,int delay_ms)
|
||||
static slave_def *slave_creat(void)
|
||||
{
|
||||
slave_def *s=(slave_def *)u;
|
||||
slave_def *u=calloc(1,sizeof(slave_def));
|
||||
u->host_type=app_variable("host_if",0,0);
|
||||
return u;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static void slave_del(ucport_def *u)
|
||||
{
|
||||
slave_def *s=(slave_def *)u;
|
||||
@@ -43,13 +45,14 @@ static void slave_del(ucport_def *u)
|
||||
// 获取检测结果
|
||||
static int check_result_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
|
||||
{
|
||||
slave_def *s=(slave_def *)u;
|
||||
emit tran_reply_signal(u->p,arr_temp(elec_check_result()));
|
||||
return 0;
|
||||
}
|
||||
static ucport_def *check_result(tran_def *t, uint8_t cmd,array_def *data)
|
||||
{
|
||||
int ret=0;
|
||||
slave_def *u=calloc(1,sizeof(slave_def));
|
||||
slave_def *u=slave_creat();
|
||||
u->u.p=t;
|
||||
u->u.del=slave_del;
|
||||
u->u.dolater=check_result_dolater;
|
||||
@@ -70,7 +73,7 @@ static int write_hw_version_dolater(ucport_def *u,uint8_t cmd,array_def *data,ch
|
||||
static ucport_def *write_hw_version(tran_def *t, uint8_t cmd,array_def *data)
|
||||
{
|
||||
int ret=0;
|
||||
slave_def *u=calloc(1,sizeof(slave_def));
|
||||
slave_def *u=slave_creat();
|
||||
u->u.p=t;
|
||||
u->u.del=slave_del;
|
||||
u->u.dolater=write_hw_version_dolater;
|
||||
@@ -94,7 +97,7 @@ static ucport_def *write_resistor_cbv(tran_def *t, uint8_t cmd,array_def *data)
|
||||
{
|
||||
int ret=0;
|
||||
int value=arr_get(data,0)|(arr_get(data,1)<<8);
|
||||
slave_def *u=calloc(1,sizeof(slave_def));
|
||||
slave_def *u=slave_creat();
|
||||
u->u.p=t;
|
||||
u->u.del=slave_del;
|
||||
u->u.dolater=write_resistor_cbv_dolater;
|
||||
@@ -115,7 +118,7 @@ static int check_resistor_dolater(ucport_def *u,uint8_t cmd,array_def *data,char
|
||||
static ucport_def *check_resistor(tran_def *t, uint8_t cmd,array_def *data)
|
||||
{
|
||||
int ret=0;
|
||||
slave_def *u=calloc(1,sizeof(slave_def));
|
||||
slave_def *u=slave_creat();
|
||||
u->u.p=t;
|
||||
u->u.del=slave_del;
|
||||
u->u.dolater=check_resistor_dolater;
|
||||
@@ -130,15 +133,74 @@ transmit_export(ym_slave,0x05,check_resistor)
|
||||
|
||||
|
||||
// 根据方案检测
|
||||
typedef struct{
|
||||
int submit_running;
|
||||
int submit_delay;// 自动上报间隔
|
||||
int submit_times;// 自动上报次数
|
||||
tran_def *tran;
|
||||
uint8_t cmd;
|
||||
int host_type;
|
||||
array_def *data;
|
||||
}check_def;
|
||||
static check_def g_check;
|
||||
static void check_set_data(check_def *u,array_def *data)
|
||||
{
|
||||
CHECK_DO(u->data,arr_delete);
|
||||
u->data=arr_duplicate(data);
|
||||
}
|
||||
static void check_submit_later(void *t)
|
||||
{
|
||||
check_def *s=(check_def *)t;
|
||||
|
||||
s->submit_times--;
|
||||
if(s->submit_running&&(s->submit_times>0)){
|
||||
emit tran_send_signal(s->tran,s->cmd,(elec_check_result()));
|
||||
s->submit_delay+=elec_local_addr()*3;
|
||||
later_execute(check_submit_later,s,s->submit_delay);
|
||||
}else{
|
||||
s->submit_running=0;
|
||||
s->submit_times=0;
|
||||
s->cmd=0;
|
||||
}
|
||||
}
|
||||
static void check_later(void *t)
|
||||
{
|
||||
check_def *s=(check_def *)t;
|
||||
elec_check_with_scheme(s->data);
|
||||
if(s->host_type==1)
|
||||
{
|
||||
s->submit_times=10;
|
||||
s->submit_running=1;
|
||||
s->submit_delay=elec_local_addr()*3;
|
||||
later_execute(check_submit_later,s,s->submit_delay);
|
||||
}else{
|
||||
s->cmd=0;
|
||||
}
|
||||
}
|
||||
static int check_with_scheme_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
|
||||
{
|
||||
emit tran_reply_signal(u->p,arr_temp(elec_check_with_scheme(data)));
|
||||
slave_def *s=(slave_def *)u;
|
||||
check_def *c=&g_check;
|
||||
array_def *r=arr_creat();
|
||||
if(c->cmd==0){
|
||||
c->cmd=cmd;
|
||||
c->tran=s->u.p;
|
||||
c->host_type=*s->host_type;
|
||||
check_set_data(c,data);
|
||||
later_execute(check_later,c,10);
|
||||
}
|
||||
if(c->cmd==cmd){
|
||||
arr_append(r,0);
|
||||
}else{
|
||||
arr_append(r,2);
|
||||
}
|
||||
emit tran_reply_signal(u->p,arr_temp(r));
|
||||
return 0;
|
||||
}
|
||||
static ucport_def *check_with_scheme(tran_def *t, uint8_t cmd,array_def *data)
|
||||
{
|
||||
int ret=0;
|
||||
slave_def *u=calloc(1,sizeof(slave_def));
|
||||
slave_def *u=slave_creat();
|
||||
u->u.p=t;
|
||||
u->u.del=slave_del;
|
||||
u->u.dolater=check_with_scheme_dolater;
|
||||
@@ -155,6 +217,7 @@ transmit_export(ym_slave,0x0c,check_with_scheme)
|
||||
// 停止上报
|
||||
static int stop_submit_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
|
||||
{
|
||||
g_check.submit_running=0;
|
||||
array_def *r=arr_creat();
|
||||
arr_append(r,0);
|
||||
emit tran_reply_signal(u->p,arr_temp(r));
|
||||
@@ -163,7 +226,7 @@ static int stop_submit_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *e
|
||||
static ucport_def *stop_submit(tran_def *t, uint8_t cmd,array_def *data)
|
||||
{
|
||||
int ret=0;
|
||||
slave_def *u=calloc(1,sizeof(slave_def));
|
||||
slave_def *u=slave_creat();
|
||||
u->u.p=t;
|
||||
u->u.del=slave_del;
|
||||
u->u.dolater=stop_submit_dolater;
|
||||
@@ -182,11 +245,13 @@ transmit_export(ym_slave,0x14,stop_submit)
|
||||
// 本程序中程序下载地址不是这个地址,在此用来计算偏移量
|
||||
#define MCU_APP_ADDR_BASE 0x8004000
|
||||
#define MCU_TASKID_ADDR_BASE 0x803f000
|
||||
#define MCU_JWT_ADDR_BASE 0x803B000
|
||||
|
||||
// 定义升级结构体
|
||||
typedef struct{
|
||||
uint8_t device_state;
|
||||
uint32_t flash_addr;
|
||||
uint32_t flash_addr_base;
|
||||
}updata_def;
|
||||
static updata_def g_updata;
|
||||
|
||||
@@ -203,7 +268,7 @@ static int device_state_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *
|
||||
static ucport_def *device_state(tran_def *t, uint8_t cmd,array_def *data)
|
||||
{
|
||||
int ret=0;
|
||||
slave_def *u=calloc(1,sizeof(slave_def));
|
||||
slave_def *u=slave_creat();
|
||||
u->u.p=t;
|
||||
u->u.del=slave_del;
|
||||
u->u.dolater=device_state_dolater;
|
||||
@@ -224,7 +289,7 @@ static int turn_to_bootloader_dolater(ucport_def *u,uint8_t cmd,array_def *data,
|
||||
static ucport_def *turn_to_bootloader(tran_def *t, uint8_t cmd,array_def *data)
|
||||
{
|
||||
int ret=0;
|
||||
slave_def *u=calloc(1,sizeof(slave_def));
|
||||
slave_def *u=slave_creat();
|
||||
u->u.p=t;
|
||||
u->u.del=slave_del;
|
||||
u->u.dolater=turn_to_bootloader_dolater;
|
||||
@@ -263,7 +328,7 @@ static int erase_app_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err
|
||||
static ucport_def *erase_app(tran_def *t, uint8_t cmd,array_def *data)
|
||||
{
|
||||
int ret=0;
|
||||
slave_def *u=calloc(1,sizeof(slave_def));
|
||||
slave_def *u=slave_creat();
|
||||
u->u.p=t;
|
||||
u->u.del=slave_del;
|
||||
u->u.dolater=erase_app_dolater;
|
||||
@@ -293,7 +358,7 @@ static int write_data_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *er
|
||||
static ucport_def *write_data(tran_def *t, uint8_t cmd,array_def *data)
|
||||
{
|
||||
int ret=0;
|
||||
slave_def *u=calloc(1,sizeof(slave_def));
|
||||
slave_def *u=slave_creat();
|
||||
u->u.p=t;
|
||||
u->u.del=slave_del;
|
||||
u->u.dolater=write_data_dolater;
|
||||
@@ -311,21 +376,26 @@ static int ceck_crc_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_
|
||||
uint32_t addr_start=(arr_get(data,0))|(arr_get(data,1)<<8)|(arr_get(data,2)<<16)|(arr_get(data,3)<<24);
|
||||
uint32_t addr_end=(arr_get(data,4))|(arr_get(data,5)<<8)|(arr_get(data,6)<<16)|(arr_get(data,7)<<24);
|
||||
uint32_t crc32=(arr_get(data,8))|(arr_get(data,9)<<8)|(arr_get(data,10)<<16)|(arr_get(data,11)<<24);
|
||||
uint32_t crc32_local=0;
|
||||
int len=addr_end-addr_start;
|
||||
addr_start+=FLASH_FILE_HEAD_SIZE;
|
||||
int ret=(crc32!=crc_crc32((uint8_t *)addr_start,len));
|
||||
addr_start=g_updata.flash_addr;
|
||||
crc32_local=crc_crc32((uint8_t *)addr_start,len);
|
||||
int ret=(crc32!=crc32_local);
|
||||
if(ret){
|
||||
DBG_WARN("crc32 not equal,crc=0x%04x,crc_local=0x%04x",crc32,crc32_local);
|
||||
}
|
||||
array_def *r=arr_creat();
|
||||
arr_append(r,ret);
|
||||
emit tran_reply_signal(u->p,arr_temp(r));
|
||||
if(ret==0){
|
||||
later_execute((void (*)(void *))bk_reboot_app,0,100);
|
||||
later_execute((void (*)(void *))bk_reboot_updata,0,100);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
static ucport_def *ceck_crc(tran_def *t, uint8_t cmd,array_def *data)
|
||||
{
|
||||
int ret=0;
|
||||
slave_def *u=calloc(1,sizeof(slave_def));
|
||||
slave_def *u=slave_creat();
|
||||
u->u.p=t;
|
||||
u->u.del=slave_del;
|
||||
u->u.dolater=ceck_crc_dolater;
|
||||
@@ -346,10 +416,18 @@ static int write_data2_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *e
|
||||
int len=arr_length(data)-4;
|
||||
int ret=0;
|
||||
if((addr)==MCU_TASKID_ADDR_BASE){
|
||||
flash_erase_scheme();
|
||||
//flash_erase_scheme();
|
||||
// 只擦除两个扇区
|
||||
flash_erase_addr((uint32_t)flash_get_scheme());
|
||||
flash_erase_addr((uint32_t)flash_get_scheme()+2048);
|
||||
g_updata.flash_addr=creat_file_head((uint32_t)flash_get_scheme(),"scheme.bin");
|
||||
g_updata.flash_addr_base=MCU_TASKID_ADDR_BASE;
|
||||
}else if((addr)==MCU_JWT_ADDR_BASE){
|
||||
flash_erase_jwtcode();
|
||||
g_updata.flash_addr=creat_file_head((uint32_t)flash_get_jwtcode(),"jwtcode.jwt");
|
||||
g_updata.flash_addr_base=MCU_JWT_ADDR_BASE;
|
||||
}
|
||||
uint32_t offset=addr-MCU_TASKID_ADDR_BASE;
|
||||
uint32_t offset=addr-g_updata.flash_addr_base;
|
||||
addr=g_updata.flash_addr+offset;
|
||||
ret=flash_write((uint8_t *)addr,&arr_data(data)[4],len);
|
||||
array_def *r=arr_creat();
|
||||
@@ -360,7 +438,7 @@ static int write_data2_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *e
|
||||
static ucport_def *write_data2(tran_def *t, uint8_t cmd,array_def *data)
|
||||
{
|
||||
int ret=0;
|
||||
slave_def *u=calloc(1,sizeof(slave_def));
|
||||
slave_def *u=slave_creat();
|
||||
u->u.p=t;
|
||||
u->u.del=slave_del;
|
||||
u->u.dolater=write_data2_dolater;
|
||||
@@ -371,11 +449,48 @@ transmit_export(ym_slave,0x11,write_data2)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// 重新加载方案
|
||||
static int load_scheme_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
|
||||
{
|
||||
int ret=0;
|
||||
array_def *r=arr_creat();
|
||||
arr_append(r,ret);
|
||||
emit tran_reply_signal(u->p,arr_temp(r));
|
||||
ret=elec_scheme_init();
|
||||
return 0;
|
||||
}
|
||||
static ucport_def *load_scheme(tran_def *t, uint8_t cmd,array_def *data)
|
||||
{
|
||||
int ret=0;
|
||||
slave_def *u=slave_creat();
|
||||
u->u.p=t;
|
||||
u->u.del=slave_del;
|
||||
u->u.dolater=load_scheme_dolater;
|
||||
u->u.dolater(&u->u,cmd,data,"ok");
|
||||
return (ucport_def *)u;
|
||||
}
|
||||
transmit_export(ym_slave,0x15,load_scheme)
|
||||
|
||||
|
||||
|
||||
|
||||
// 获取自检参数
|
||||
static int bootinfo_dolater(ucport_def *u,uint8_t cmd,array_def *data,char *err_str)
|
||||
{
|
||||
emit tran_reply_signal(u->p,arr_temp(elec_bootinfo()));
|
||||
return 0;
|
||||
}
|
||||
static ucport_def *bootinfo(tran_def *t, uint8_t cmd,array_def *data)
|
||||
{
|
||||
int ret=0;
|
||||
slave_def *u=slave_creat();
|
||||
u->u.p=t;
|
||||
u->u.del=slave_del;
|
||||
u->u.dolater=bootinfo_dolater;
|
||||
u->u.dolater(&u->u,cmd,data,"ok");
|
||||
return (ucport_def *)u;
|
||||
}
|
||||
transmit_export(ym_slave,0x13,bootinfo)
|
||||
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user