使用赋码仪主板 app升级,方案升级验证通过

This commit is contained in:
ranchuan
2023-10-11 18:10:06 +08:00
parent ed9e4c0c3e
commit f0f36cf79a
25 changed files with 324 additions and 207 deletions

1
.gitignore vendored
View File

@@ -16,3 +16,4 @@ python/dist/
*.xlsx
*.json
quest_info.txt
*.jwt

View File

@@ -164,7 +164,7 @@
<MemoryWindow1>
<Mm>
<WinNumber>1</WinNumber>
<SubType>0</SubType>
<SubType>8</SubType>
<ItemText>0x0801d000</ItemText>
<AccSizeX>0</AccSizeX>
</Mm>
@@ -389,7 +389,7 @@
<Mm>
<WinNumber>1</WinNumber>
<SubType>0</SubType>
<ItemText>0x08036000</ItemText>
<ItemText>0x08004000</ItemText>
<AccSizeX>0</AccSizeX>
</Mm>
</MemoryWindow1>
@@ -1634,18 +1634,6 @@
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\source\task\tran_for_coder2ch.c</PathWithFileName>
<FilenameWithoutPath>tran_for_coder2ch.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
<bShared>0</bShared>
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>92</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
<bDave2>0</bDave2>
<PathWithFileName>.\source\task\mod_signals.c</PathWithFileName>
<FilenameWithoutPath>mod_signals.c</FilenameWithoutPath>
<RteFlg>0</RteFlg>
@@ -1653,7 +1641,7 @@
</File>
<File>
<GroupNumber>10</GroupNumber>
<FileNumber>93</FileNumber>
<FileNumber>92</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1673,7 +1661,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>11</GroupNumber>
<FileNumber>94</FileNumber>
<FileNumber>93</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1693,7 +1681,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>95</FileNumber>
<FileNumber>94</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1705,7 +1693,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>96</FileNumber>
<FileNumber>95</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1717,7 +1705,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>97</FileNumber>
<FileNumber>96</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1729,7 +1717,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>98</FileNumber>
<FileNumber>97</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1741,7 +1729,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>99</FileNumber>
<FileNumber>98</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1753,7 +1741,7 @@
</File>
<File>
<GroupNumber>12</GroupNumber>
<FileNumber>100</FileNumber>
<FileNumber>99</FileNumber>
<FileType>1</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1773,7 +1761,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>13</GroupNumber>
<FileNumber>101</FileNumber>
<FileNumber>100</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1793,7 +1781,7 @@
<RteFlg>0</RteFlg>
<File>
<GroupNumber>14</GroupNumber>
<FileNumber>102</FileNumber>
<FileNumber>101</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>
@@ -1805,7 +1793,7 @@
</File>
<File>
<GroupNumber>14</GroupNumber>
<FileNumber>103</FileNumber>
<FileNumber>102</FileNumber>
<FileType>5</FileType>
<tvExp>0</tvExp>
<tvExpOptDlg>0</tvExpOptDlg>

View File

@@ -928,11 +928,6 @@
<FileType>1</FileType>
<FilePath>.\source\task\transmit.c</FilePath>
</File>
<File>
<FileName>tran_for_coder2ch.c</FileName>
<FileType>1</FileType>
<FilePath>.\source\task\tran_for_coder2ch.c</FilePath>
</File>
<File>
<FileName>mod_signals.c</FileName>
<FileType>1</FileType>
@@ -3492,11 +3487,6 @@
<FileType>1</FileType>
<FilePath>.\source\task\transmit.c</FilePath>
</File>
<File>
<FileName>tran_for_coder2ch.c</FileName>
<FileType>1</FileType>
<FilePath>.\source\task\tran_for_coder2ch.c</FilePath>
</File>
<File>
<FileName>mod_signals.c</FileName>
<FileType>1</FileType>

BIN
doc/JW3425_boot_v11.bin Normal file

Binary file not shown.

View File

@@ -5,7 +5,7 @@ import json
BOOT_PATH ="JW3425_boot_v10.bin"
BOOT_PATH ="JW3425_boot_v11.bin"
APP_PATH ="MS-IEpro20231007.bin"
OUT_PATH = BOOT_PATH.split('.')[0]+".jwt"

View File

@@ -131,10 +131,13 @@ class protm:
u=protm("com5")
u=protm("com7")
# u.start_recv()
# u.wait()
u.cmd=1
u.addr=1
u.addr=0
u.host_addr=0
print(u.encode(bytearray()).hex(","))
u.cmd=0x13
print(u.encode(bytearray()).hex(" "))
u.cmd=0x0c
print(u.encode(bytearray()).hex(" "))

View File

@@ -198,3 +198,9 @@
自适应回复电流挡位boot与app中均通信正常
全流程升级验证成功
拟实现主机发开始检测之后等待300ms再启动检测防止主机未收到回应
2023.10.11
解决 tappend 多次加入相同临时指针时返回NULL指针的问题
prot_uc 最多接收消息数量上限是10 ,防止主机消息轰炸
prot_uc 处理命令的时间如果距离接收时间超过100ms时视为过期不处理过期消息
bootloader 在升级之前会进行校验如果不是slave的程序则不会升级
使用赋码仪主板 app升级方案升级验证通过

View File

@@ -106,7 +106,12 @@ static int flash_erase(uint32_t sector)
}
}
// 擦除指定地址
int flash_erase_addr(uint32_t addr)
{
addr=addr-FLASH_BASE;
return flash_erase(addr/2048);
}
// 操作开始
int flash_operate_start(void)

View File

@@ -35,6 +35,7 @@ uint32_t *flash_get_jwtcode(void);
int flash_write(uint8_t *addr,const uint8_t *data,int len);
int flash_operate_end(void);
int flash_write_with_erase(uint8_t *addr,const uint8_t *data,int len);
int flash_erase_addr(uint32_t addr);
@@ -48,6 +49,7 @@ typedef struct{
uint8_t host_ip[4];
int host_port;
char host_if[8];
char device_type[12];
}rom_head;
@@ -68,17 +70,10 @@ typedef struct{
char host_if[8];// 主机接口
char device_type[12];// 设备类型 ,批检仪还是赋码仪
uint8_t mac[8];// mac地址
uint8_t local_ip[4];// 本机ip地址
uint8_t host_ip[4];// 主机ip地址
int host_port;// 主机端口
int local_cmd_port;// 本机命令端口
int host_log_port;// 主机log端口
int local_id;// 本机识别号
uint8_t host_log_ip[4];// 主机logip
int uartbsp;// 串口4的波特率
int coder_ret_mode;// 注码指令返回格式
int slave_addr_start;// 小板起始地址
int moter_max_count;// 电机最大步数
int uartbsp;// 串口的波特率
int hard_version;// 硬件版本号
int resistor_diff;// 电阻校准值
}sys_param_def;

View File

@@ -79,6 +79,8 @@ static int cmd_iic_updata(list_def *argv)
if(ret==0){
MC_IICUpdateMTP();
ret=checker_runcfg.excue_rtv;
}else{
cmd_print("power set failed.");
}
PowerCalibration_set(POWER_DEF_V,45);
POWER_OFF;

View File

@@ -2,6 +2,8 @@
#include "bytearray.h"
#include "mystdlib.h"
#include "debug.h"
#include "stdlib.h"
#include "dev_flash.h"
#include "elec_det.h"
#include "base/delay.h"
@@ -27,6 +29,7 @@
typedef struct{
CheckerTask_Info_st* task_info_array[PLAN_MAX_TASK];//方案参数结构体指针
int scheme_inited;
array_def *data;
}self_def;
@@ -38,13 +41,23 @@ static self_def g_self;
// 初始化
int elec_init(void)
{
self_def *s=&g_self;
void Ye_BoardInit(void);
void Ye_BoardCheck(void);
int elec_parper_power(void);
Ye_BoardInit();
elec_bootinfo();
DBG_LOG("local addr:%d.",elec_local_addr());
return elec_scheme_init();
}
// 初始化方案
int elec_scheme_init(void)
{
self_def *s=&g_self;
int ret=0;
int elec_check_scheme(void);
void elec_load_scheme(void);
Ye_BoardInit();
Ye_BoardCheck();
int elec_parper_power(void);
if(elec_check_scheme()!=0){
// 方案校验失败
DBG_WARN("scheme check failed.");
@@ -53,10 +66,36 @@ int elec_init(void)
}
s->scheme_inited=1;
elec_load_scheme();
return 0;
ret=elec_parper_power();
return ret;
}
// 调压
static int elec_parper_power(void)
{
self_def *s=&g_self;
CheckerTask_Info_st *task_par=0;
int ret=0;
task_par= s->task_info_array[0];
if(task_par->taskid!=0){
// 第一个任务不是调压任务,失败
DBG_WARN("parper power failed,first taskid is not 0.");
return 1;
}
// 装载参数
checker_runcfg.power_prapare_exe=0;
rt_memcpy(&checker_runcfg.task_info,task_par,sizeof(CheckerTask_Info_st));
checker_runcfg.param_count = checker_runcfg.task_info.param_rtv_count & 0x0F;
checker_runcfg.rtv_count = (checker_runcfg.task_info.param_rtv_count >> 4) & 0x0F;
rt_memcpy(checker_runcfg.params,checker_runcfg.task_info.params,checker_runcfg.param_count*2);
Checker_PowerPrapare();
ret=checker_runcfg.excue_rtv;
if(ret){
DBG_WARN("parper power failed,ret=%d.",ret);
}
return ret;
}
@@ -64,8 +103,9 @@ int elec_init(void)
uint8_t elec_local_addr(void)
{
static uint8_t addr=0;
if(addr==0)
if(addr==0){
addr=Gpio_GetDeivceAddr();
}
return addr;
}
@@ -84,11 +124,34 @@ void elec_led2_power(int power)
// 获取自检参数
array_def *elec_bootinfo(void)
{
void Ye_BoardCheck(void);
Ye_BoardCheck();
board_st.hard_v=sys_param()->hard_version;
board_st.resistor_diff=sys_param()->resistor_diff;
board_st.hard_v=15;
array_def *r=arr_creat();
arr_append(r,0);
arr_appends(r,&board_st,sizeof(BoartCheck_st));
return arr_temp(r);
}
// 获取检测结果
array_def *elec_check_result(void)
{
array_def *r=arr_creat();
arr_append(r,3);
self_def *s=&g_self;
array_def *r=0;
if(s->data){
r=arr_duplicate(s->data);
}else{
r=arr_creat();
arr_append(r,2);
}
return arr_temp(r);
}
@@ -96,8 +159,14 @@ array_def *elec_check_result(void)
// 写硬件版本号
array_def *elec_write_hardversion(int version)
{
array_def *r=arr_creat();
sys_param_def *spar=0;
spar=calloc(1,sizeof(sys_param_def));
memcpy(spar,sys_param(),sizeof(sys_param_def));
spar->hard_version=version;
flash_save_param(spar);
free(spar);
board_st.hard_v=version;
array_def *r=arr_creat();
arr_append(r,0);
return arr_temp(r);
}
@@ -107,8 +176,14 @@ array_def *elec_write_hardversion(int version)
// 写电阻校准值
array_def *elec_write_resistor_cbv(int cbv)
{
array_def *r=arr_creat();
sys_param_def *spar=0;
spar=calloc(1,sizeof(sys_param_def));
memcpy(spar,sys_param(),sizeof(sys_param_def));
spar->resistor_diff=cbv;
flash_save_param(spar);
free(spar);
board_st.resistor_diff=cbv;
array_def *r=arr_creat();
arr_append(r,0);
return 0;
}
@@ -283,6 +358,8 @@ array_def *elec_check_with_scheme(array_def *uid_psw)
arr_appends(r,checker_runcfg.Task_Result,8);
arr_appends(r,checker_runcfg.Task_Excute,8);
arr_appends(r,checker_runcfg.Test_Rtv,checker_runcfg.rtv_index*2);
CHECK_DO(s->data,arr_delete);
s->data=arr_duplicate(r);
return arr_temp(r);
}

View File

@@ -8,12 +8,16 @@
int elec_init(void);
int elec_scheme_init(void);
uint8_t elec_local_addr(void);
void elec_led1_power(int power);
void elec_led2_power(int power);
array_def *elec_bootinfo(void);
array_def *elec_check_result(void);
array_def *elec_write_hardversion(int version);

View File

@@ -219,6 +219,7 @@ static int EW_appRead(void)
DBG_LOG("addr=0x%02x.",addr);
ret=EW_ReadMTP(1,addr,read_buf,4);
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read_buf[0],read_buf[1],read_buf[2],read_buf[3]);
return ret;
}
static int cmd_jwt_app_read(list_def *argv)
{

View File

@@ -369,6 +369,8 @@ static int h_init(uart_def *u,int bsp)
{
h_self_def *h=&g_hself;
if(h->inited) return 0;
// 设置主机接口 int类型0uart1can
app_variable("host_if",&h->dev_index,0);
h->dev[0]=dev_get("uart1");
h->dev[1]=dev_get("can");
h->dev[0]->init(h->dev[0],0);

View File

@@ -386,6 +386,9 @@ static int write_block(uart_def *u,const uint8_t *b,int len)
param_check(u->private_data);
self_data *self=u->private_data;
USART_TypeDef *uart=self->dtb->uart;
if(self->in_send){
return 0;
}
self->in_send=1;
if(1){
dma_tx_init(self,b,len);

View File

@@ -6,7 +6,7 @@
#define BUILD_DATE "2023-10-10 16:36:03"
#define BUILD_DATE "2023-10-11 17:33:01"
#define SOFT_VERSION "0.03"

View File

@@ -172,20 +172,8 @@ static void print_sys_param(const sys_param_def *par)
cmd_print("device type: %s",par->device_type);
cmd_print("mac addr: %02x.%02x.%02x.%02x.%02x.%02x",
par->mac[0],par->mac[1],par->mac[2],par->mac[3],par->mac[4],par->mac[5]);
cmd_print("local ip: %d.%d.%d.%d",
par->local_ip[0],par->local_ip[1],par->local_ip[2],par->local_ip[3]);
cmd_print("host ip: %d.%d.%d.%d",
par->host_ip[0],par->host_ip[1],par->host_ip[2],par->host_ip[3]);
cmd_print("host port: %d",par->host_port);
cmd_print("local cmd port: %d",par->local_cmd_port);
cmd_print("host log port: %d",par->host_log_port);
cmd_print("local id: %d",par->local_id);
cmd_print("host log ip: %d.%d.%d.%d",
par->host_log_ip[0],par->host_log_ip[1],par->host_log_ip[2],par->host_log_ip[3]);
cmd_print("uart bsp: %d",par->uartbsp);
cmd_print("coder ret mode: %d",par->coder_ret_mode);
cmd_print("slave_addr_start: %d",par->slave_addr_start);
cmd_print("moter_max_count: %d",par->moter_max_count);
}
@@ -211,19 +199,10 @@ commend_export(sysinfo,sysinfo,"print the software info")
static void print_sys_help(void)
{
cmd_print("example for how to set system params:");
cmd_print("set hostif uart4/utcp");
cmd_print("set hostif can/uart1/host");
cmd_print("set devicetype checker/coder");
cmd_print("set localip 192.168.80.10");
cmd_print("set hostip 192.168.80.100");
cmd_print("set hostport 7777");
cmd_print("set localcmdport 7777");
cmd_print("set hostlogport 12345");
cmd_print("set localid 1");
cmd_print("set hostlogip 192.168.80.80");
cmd_print("set uartbsp 115200");
cmd_print("set codermode 1/0");
cmd_print("set slave_addr_start 1/0");
cmd_print("set moter_max_count 0~30000");
cmd_print("set uartbsp 57600");
cmd_print("set save");
}
@@ -271,46 +250,6 @@ static int sys_set(list_def *argv)
memcpy(spar->device_type,str,strlen(str)+1);
cmd_print("device type: %s",spar->device_type);
}
else if(strcmp(list_get_str(argv,1),"localip")==0)
{
char *str=list_get_str(argv,2);
list_def *ip=str_atod_list(str,'.');
spar->local_ip[0]=list_get_int(ip,0);
spar->local_ip[1]=list_get_int(ip,1);
spar->local_ip[2]=list_get_int(ip,2);
spar->local_ip[3]=list_get_int(ip,3);
cmd_print("local ip: %d.%d.%d.%d",
spar->local_ip[0],spar->local_ip[1],spar->local_ip[2],spar->local_ip[3]);
}
else if(strcmp(list_get_str(argv,1),"hostip")==0)
{
char *str=list_get_str(argv,2);
list_def *ip=str_atod_list(str,'.');
spar->host_ip[0]=list_get_int(ip,0);
spar->host_ip[1]=list_get_int(ip,1);
spar->host_ip[2]=list_get_int(ip,2);
spar->host_ip[3]=list_get_int(ip,3);
cmd_print("host ip: %d.%d.%d.%d",
spar->host_ip[0],spar->host_ip[1],spar->host_ip[2],spar->host_ip[3]);
}
else if(strcmp(list_get_str(argv,1),"hostport")==0)
{
char *str=list_get_str(argv,2);
spar->host_port=str_atoi(str);
cmd_print("host port: %d",spar->host_port);
}
else if(strcmp(list_get_str(argv,1),"localcmdport")==0)
{
char *str=list_get_str(argv,2);
spar->local_cmd_port=str_atoi(str);
cmd_print("local cmd port: %d",spar->local_cmd_port);
}
else if(strcmp(list_get_str(argv,1),"hostlogport")==0)
{
char *str=list_get_str(argv,2);
spar->host_log_port=str_atoi(str);
cmd_print("local log port: %d",spar->host_log_port);
}
else if(strcmp(list_get_str(argv,1),"localid")==0)
{
char *str=list_get_str(argv,2);
@@ -323,35 +262,6 @@ static int sys_set(list_def *argv)
spar->uartbsp=str_atoi(str);
cmd_print("uart bsp: %d",spar->uartbsp);
}
else if(strcmp(list_get_str(argv,1),"hostlogip")==0)
{
char *str=list_get_str(argv,2);
list_def *ip=str_atod_list(str,'.');
spar->host_log_ip[0]=list_get_int(ip,0);
spar->host_log_ip[1]=list_get_int(ip,1);
spar->host_log_ip[2]=list_get_int(ip,2);
spar->host_log_ip[3]=list_get_int(ip,3);
cmd_print("host log ip: %d.%d.%d.%d",
spar->host_log_ip[0],spar->host_log_ip[1],spar->host_log_ip[2],spar->host_log_ip[3]);
}
else if(strcmp(list_get_str(argv,1),"codermode")==0)
{
char *str=list_get_str(argv,2);
spar->coder_ret_mode=str_atoi(str);
cmd_print("coder ret mode: %d",spar->coder_ret_mode);
}
else if(strcmp(list_get_str(argv,1),"slave_addr_start")==0)
{
char *str=list_get_str(argv,2);
spar->slave_addr_start=str_atoi(str);
cmd_print("slave addr start: %d",spar->slave_addr_start);
}
else if(strcmp(list_get_str(argv,1),"moter_max_count")==0)
{
char *str=list_get_str(argv,2);
spar->moter_max_count=str_atoi(str);
cmd_print("moter_max_count: %d",spar->moter_max_count);
}
else{
cmd_print("unknown cmd for sysset.");
print_sys_help();
@@ -405,6 +315,10 @@ int main()
uint8_t *rom;
rom_head *head;
rom=flash_get_rom(&head);
if(strcmp(head->device_type,"slave")!=0){
// 如果不是小板的固件,本次不升级
bk_reboot_guide();
}
param_init(head);
if(rom)
{
@@ -464,14 +378,9 @@ void param_init(rom_head *h)
memcpy(pars.pack_time,h->pack_time,20);
if(pars.local_id==0xffffffff){
memcpy(pars.host_if,h->host_if,8);
memcpy(pars.device_type,"checker",8);
memcpy(pars.device_type,"slave",8);
mac_init(pars.mac);
memcpy(pars.local_ip,h->local_ip,4);
memcpy(pars.host_ip,h->host_ip,4);
pars.host_port=h->host_port;
pars.local_cmd_port=7777;
pars.host_log_port=12345;
pars.local_id=1;
pars.local_id=0;
}
flash_save_param(&pars);
}
@@ -479,16 +388,10 @@ void param_init(rom_head *h)
// 填充默认配置
if(pars.local_id==0xffffffff){
memcpy(pars.pack_time,"initial app",12);
memcpy(pars.host_if,"uart4",6);
memcpy(pars.device_type,"coder",6);
memcpy(pars.host_if,"host",6);
memcpy(pars.device_type,"slave",6);
mac_init(pars.mac);
memcpy(pars.local_ip,(uint8_t []){192,168,80,10},4);
memcpy(pars.host_ip,(uint8_t []){192,168,80,80},4);
memcpy(pars.host_log_ip,(uint8_t []){192,168,80,80},4);
pars.host_port=9527;
pars.local_cmd_port=7777;
pars.host_log_port=12345;
pars.local_id=1;
pars.local_id=0;
flash_save_param(&pars);
}
}

View File

@@ -122,6 +122,7 @@ def creat_head(data:bytearray,date:str):
head+=arr_from_ip("192.168.80.100")
head+=arr_from_int(7777)
head+=arr_from_str("utcp",8)
head+=arr_from_str("slave",12)
head+=arr_byte_copy(0,128-len(head))
# print(head)
return head

View File

@@ -97,9 +97,9 @@ void *dev_get(const char *name)
void param_err_handle(const char *param,const char *file,const char *fun,int line)
{
bk_reboot_param_err();
// printf("param=%s,file=%s,fun=%s,line=%d.\r\n",param,file,fun,line);
DBG_ERR("param=%s,file=%s,fun=%s,line=%d.\r\n",param,file,fun,line);
bk_reboot_param_err();
while(1);
}

View File

@@ -9,7 +9,7 @@
/*r{ 修改日志打印等级 }c*/
#define DBG_LOG_LEVEL DBG_LEVEL_INFO
#define DBG_LOG_LEVEL 0
@@ -48,6 +48,8 @@
#define DBG_LOG_(type_,msg_,...)\
debug_log(__FILE__,__func__,__LINE__,type_,(msg_),##__VA_ARGS__)
//#define DBG_LOG_(type_,msg_,...)\
// debug_log("-","-",__LINE__,type_,(msg_),##__VA_ARGS__)
int debug_init(void);

View File

@@ -356,6 +356,8 @@ void *tappend(void *p,void *del)
if(tempptr_find(t,p)==0)
{
ret= tempptr_append(t,p,del);
}else{
ret=p;
}
}
rt_mutex_release(t->mutex);

View File

@@ -19,9 +19,11 @@
// 接收buff大小
#define RECV_BUFF_SIZE 300
// 最大接收信号个数
#define RECV_SEM_MAX_NUM 10
// 接收数据超时时间
#define RECV_EXPIRE_TIME 100
@@ -87,7 +89,11 @@ static void recv_end_irq(void *t,uint32_t len)
protu_def *p=t;
p->num_to_recv=len;
p->buff_index=len;
rt_sem_release(p->sem);
p->sem_num++;
if(p->sem_num<RECV_SEM_MAX_NUM){
rt_sem_release(p->sem);
p->recv_tick=rt_tick_get();
}
}
array_def *protu_decode_str(protu_def *p,array_def *data);
@@ -159,9 +165,21 @@ static void protu_run(void *t)
protu_def *p=t;
array_def *data;
array_def *decode_data;
uint32_t tick_now;
while(p->run)
{
rt_sem_take(p->sem,RT_WAITING_FOREVER);
p->sem_num=0;
if(p->buff_index==0){
continue;
}
tick_now=rt_tick_get();
if(tick_now-p->recv_tick>RECV_EXPIRE_TIME){
DBG_LOG("recv data expired.");
p->num_to_recv=0;
p->buff_index=0;
continue;
}
//DBG_LOG("protu run");
data=arr_creat();
arr_appends(data,p->buff,p->buff_index);

View File

@@ -23,6 +23,8 @@ struct _protu_def{
int buff_index;
int num_to_recv;
void *sem;
int sem_num;
uint32_t recv_tick;
int run;
char *str_err;
uint16_t cmd_no;

View File

@@ -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)

View File

@@ -305,9 +305,6 @@ static void when_scheme_done(ucport_def *u)
DBG_WARN("can not fond variable \"tran\"");
return;
}
DBG_LOG("memused:%d",mem_perused());
rt_thread_mdelay(100);
DBG_LOG("memused:%d",mem_perused());
}
static ucport_def *tran_scheme(tran_def *t, uint8_t cmd,array_def *data)
{