通过总线下载模块程序
This commit is contained in:
Binary file not shown.
BIN
doc/JW3425_boot_v8.bin
Normal file
BIN
doc/JW3425_boot_v8.bin
Normal file
Binary file not shown.
@@ -5,7 +5,7 @@ import json
|
||||
|
||||
|
||||
|
||||
BOOT_PATH ="JW3425_boot_v6.bin"
|
||||
BOOT_PATH ="JW3425_boot_v8.bin"
|
||||
APP_PATH ="MS-IEpro20231007.bin"
|
||||
OUT_PATH = "jwt_program.jwt"
|
||||
|
||||
@@ -23,6 +23,27 @@ def arr_from_int(num:int):
|
||||
return bytearray([num&0xff,(num>>8)&0xff,(num>>16)&0xff,(num>>24)&0xff])
|
||||
|
||||
|
||||
|
||||
def crc32(data:bytearray):
|
||||
temp=0
|
||||
crc=0xffffffff
|
||||
i=0
|
||||
if(len(data)%4!=0):
|
||||
return 0
|
||||
while(i<len(data)):
|
||||
temp=data[i]|(data[i+1]<<8)|(data[i+2]<<16)|(data[i+3]<<24)
|
||||
i+=4
|
||||
for j in range(32):
|
||||
if((crc^temp)&0x80000000)!=0:
|
||||
crc=0x04c11db7^(crc<<1)
|
||||
else:
|
||||
crc<<=1
|
||||
temp<<=1
|
||||
crc&=0xffffffff
|
||||
return crc
|
||||
|
||||
|
||||
|
||||
def creat():
|
||||
boot=BOOT_PATH
|
||||
app=APP_PATH
|
||||
@@ -35,6 +56,10 @@ def creat():
|
||||
d+=arr_byte_copy(0x00,0x3c7c-len(d))
|
||||
d+=arr_from_int(0x55aa6699)
|
||||
d+=arr_byte_copy(0x00,1024*16-len(d))
|
||||
|
||||
print("crc32 of all data:",hex(crc32(d)))
|
||||
print("crc32 for 0x1000:",hex(crc32(d[4096:])))
|
||||
|
||||
with open(OUT_PATH,"wb+") as f:
|
||||
f.write(d)
|
||||
print(OUT_PATH+" create boot file success.")
|
||||
|
Binary file not shown.
@@ -188,4 +188,7 @@
|
||||
发现gd32不能以地址0x00000000来擦除flash
|
||||
修改擦除地址为0x08000000来解决无法写入的问题
|
||||
添加设置总线电压cmd命令
|
||||
2023.10.9
|
||||
实现通过iic下载模块程序,期间自动开启和关闭总线
|
||||
实现通过总线下载模块程序,crc32校验失败
|
||||
|
||||
|
@@ -39,10 +39,10 @@ scheme 109~110
|
||||
#define FLASH_BUFF_SECTOR_NUM (50)
|
||||
#define FLASH_PARAM_SECTOR (108)
|
||||
#define FLASH_PARAM_SECTOR_NUM (1)
|
||||
#define FLASH_SCHEME_SECTOR (109)
|
||||
#define FLASH_SCHEME_SECTOR_NUM (3)
|
||||
#define FLASH_JWTCODE_SECTOR (112)
|
||||
#define FLASH_JWTCODE_SECTOR (109)
|
||||
#define FLASH_JWTCODE_SECTOR_NUM (9)
|
||||
#define FLASH_SCHEME_SECTOR (118)
|
||||
#define FLASH_SCHEME_SECTOR_NUM (6)
|
||||
|
||||
|
||||
|
||||
|
@@ -58,12 +58,12 @@ uint8_t uc_buf[4];
|
||||
// 模块程序地址
|
||||
// 这个地址要和 dev_flash.c 中定义的地址相对应
|
||||
#define MC_CODE_ADDR \
|
||||
(FLASH_BASE+2048*112+128)
|
||||
(FLASH_BASE+2048*109+128)
|
||||
|
||||
// 方案地址
|
||||
// 这个地址要和 dev_flash.c 中定义的地址相对应
|
||||
#define APP_TEST_PLAN_ADDR \
|
||||
(FLASH_BASE+2048*109+128)
|
||||
(FLASH_BASE+2048*118+128)
|
||||
|
||||
// 方案大小
|
||||
#define APP_TEST_PLANINFO_SIZE 2048
|
||||
|
@@ -16,7 +16,8 @@ static volatile CurrentSample_Range_eu buscurrent_range = Current_Max;
|
||||
#endif
|
||||
|
||||
#define SMod_Read_Idle_Filter 90
|
||||
#define DMod_Read_Idle_Filter 50
|
||||
// 根据反码电流改变
|
||||
#define DMod_Read_Idle_Filter 300
|
||||
|
||||
volatile uint16_t* EW_Read_AD_V = FireBus_ADC_Buf;
|
||||
static volatile uint16_t SMod_Read_Idle_C;
|
||||
@@ -757,7 +758,7 @@ uint8_t DMod_ReadBytesXor(uint8_t* buf, uint8_t len,uint16_t retry_times)
|
||||
else
|
||||
return 2;
|
||||
}
|
||||
return 1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
@@ -3,6 +3,7 @@
|
||||
#include "mystring.h"
|
||||
#include "mystdlib.h"
|
||||
#include "hardware/jw3425iic.h"
|
||||
#include "hardware/power.h"
|
||||
#include "interface/BaseChecker.h"
|
||||
#include "base/define.h"
|
||||
#include "base/utility.h"
|
||||
@@ -65,8 +66,15 @@ static int cmd_iic_updata(list_def *argv)
|
||||
crc32=Crc32Calu((uint32_t*)MC_CODE_ADDR,16*1024);
|
||||
boardinfo_un.boardinfo.mc_ICodeCrc32=crc32;
|
||||
cmd_print("crc32=0x%04x.",crc32);
|
||||
MC_IICUpdateMTP();
|
||||
ret=checker_runcfg.excue_rtv;
|
||||
|
||||
ret=PowerCalibration_set(85,55);
|
||||
if(ret==0){
|
||||
MC_IICUpdateMTP();
|
||||
ret=checker_runcfg.excue_rtv;
|
||||
}
|
||||
PowerCalibration_set(POWER_DEF_V,45);
|
||||
POWER_OFF;
|
||||
|
||||
cmd_print("cmd end,ret=%d.",ret);
|
||||
return 0;
|
||||
}
|
||||
@@ -100,18 +108,23 @@ commend_export(iic_read,cmd_iic_read,"read mtp via iic,param:mtp_addr,data_lengt
|
||||
// 设置总线电压
|
||||
static int cmd_set_bus_power(list_def *argv)
|
||||
{
|
||||
if(list_length(argv)<2){
|
||||
if(list_length(argv)<3){
|
||||
cmd_print("param num too less.");
|
||||
return -1;
|
||||
}
|
||||
int bus_v=str_atoi(list_get_str(argv,1));
|
||||
int bus_hv=str_atoi(list_get_str(argv,1));
|
||||
int bus_mv=str_atoi(list_get_str(argv,2));
|
||||
int ret=0;
|
||||
checker_runcfg.params[0]=(uint16_t)bus_v;
|
||||
checker_runcfg.param_count=1;
|
||||
EW_Test_SetBusV();
|
||||
ret=checker_runcfg.excue_rtv;
|
||||
if(bus_hv>0){
|
||||
ret=PowerCalibration_set(bus_hv,bus_mv);
|
||||
}
|
||||
else{
|
||||
ret=PowerCalibration_set(POWER_DEF_V,45);
|
||||
POWER_OFF;
|
||||
}
|
||||
cmd_print("cmd end,ret=%d.",ret);
|
||||
return 0;
|
||||
}
|
||||
commend_export(bus_power,cmd_set_bus_power,"set bus power,param:bus_power")
|
||||
commend_export(bus_power,cmd_set_bus_power,"set bus power,param:bus_high_v,bus_mid_v")
|
||||
|
||||
|
||||
|
@@ -7,8 +7,12 @@
|
||||
#include "hardware/power.h"
|
||||
#include "hardware/timer_cfg.h"
|
||||
#include "debug.h"
|
||||
#include "commend.h"
|
||||
#include "mystring.h"
|
||||
#include "mystdlib.h"
|
||||
|
||||
#define UPDATA_PACK_LEN 58
|
||||
|
||||
#define UPDATA_PACK_LEN 128
|
||||
#define UPDATA_BASE_ADDR 0x1000
|
||||
#define UPDATA_DATA_LEN (12*1024)
|
||||
#define UPDATA_FLAG_ADDR (0x3c7c)
|
||||
@@ -24,9 +28,15 @@ static uint8_t EW_Erease(void)
|
||||
DMod_SendBytesXor(data,2,1);
|
||||
ret=DMod_ReadBytesXor(read,4,100);
|
||||
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]);
|
||||
delay_ms(50);
|
||||
return ret;
|
||||
}
|
||||
static int cmd_jwt_boot_erase(list_def *argv)
|
||||
{
|
||||
int ret=0;
|
||||
ret=EW_Erease();
|
||||
return ret;
|
||||
}
|
||||
commend_export(jwt_boot_erase,cmd_jwt_boot_erase,"jwt srase in boot")
|
||||
|
||||
|
||||
// 跳转
|
||||
@@ -38,27 +48,61 @@ static uint8_t EW_Jump(void)
|
||||
DMod_SendBytesXor(data,2,1);
|
||||
ret=DMod_ReadBytesXor(read,4,100);
|
||||
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]);
|
||||
delay_ms(50);
|
||||
return ret;
|
||||
}
|
||||
static int cmd_jwt_boot_jump(list_def *argv)
|
||||
{
|
||||
int ret=0;
|
||||
ret=EW_Jump();
|
||||
return ret;
|
||||
}
|
||||
commend_export(jwt_boot_jump,cmd_jwt_boot_jump,"jwt jump in boot")
|
||||
|
||||
|
||||
// 充电
|
||||
static uint8_t EW_Charg(void)
|
||||
{
|
||||
uint8_t data[4]={0xf8,0x01,0x04,0x00};
|
||||
uint8_t data[4]={0xf8,0x01,0x01,0x00};
|
||||
uint8_t read[4]={0};
|
||||
uint8_t ret=0;
|
||||
delay_ms(2000);
|
||||
DMod_SendBytesXor(data,3,1);
|
||||
ret=DMod_ReadBytesXor(read,4,100);
|
||||
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]);
|
||||
delay_ms(5000);
|
||||
return ret;
|
||||
}
|
||||
static int cmd_jwt_boot_charg(list_def *argv)
|
||||
{
|
||||
int ret=0;
|
||||
ret=EW_Charg();
|
||||
return ret;
|
||||
}
|
||||
commend_export(jwt_boot_charg,cmd_jwt_boot_charg,"jwt charg in boot")
|
||||
|
||||
|
||||
|
||||
// 放电
|
||||
static uint8_t EW_DisCharg(void)
|
||||
{
|
||||
uint8_t data[4]={0xf8,0x01,0x00,0x00};
|
||||
uint8_t read[4]={0};
|
||||
uint8_t ret=0;
|
||||
DMod_SendBytesXor(data,3,1);
|
||||
ret=DMod_ReadBytesXor(read,4,100);
|
||||
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]);
|
||||
return ret;
|
||||
}
|
||||
static int cmd_jwt_boot_discharg(list_def *argv)
|
||||
{
|
||||
int ret=0;
|
||||
ret=EW_Charg();
|
||||
return ret;
|
||||
}
|
||||
commend_export(jwt_boot_discharg,cmd_jwt_boot_discharg,"jwt discharg in boot")
|
||||
|
||||
|
||||
|
||||
// 发送数据
|
||||
// len 最长为58字节
|
||||
// len 最长为128字节
|
||||
static uint8_t EW_Write(uint16_t addr,uint8_t *d,uint16_t len)
|
||||
{
|
||||
uint8_t ret=0;
|
||||
@@ -74,7 +118,6 @@ static uint8_t EW_Write(uint16_t addr,uint8_t *d,uint16_t len)
|
||||
ret=DMod_ReadBytesXor(read,4,100);
|
||||
rt_free(buf);
|
||||
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]);
|
||||
delay_ms(50);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -93,10 +136,22 @@ static uint8_t EW_CheckCrc(uint16_t adr_start,uint16_t adr_end,uint32_t *crc)
|
||||
*crc=(read[3])|(read[4]<<8)|(read[5]<<16)|(read[6]<<24);
|
||||
}
|
||||
}
|
||||
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]);
|
||||
delay_ms(50);
|
||||
DBG_LOG("addr_start=0x%04x,addr_end=0x%04x.",adr_start,adr_end);
|
||||
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x,",
|
||||
ret,read[0],read[1],read[2],read[3],read[4],read[5],read[6],read[7]);
|
||||
return ret;
|
||||
}
|
||||
static int cmd_jwt_boot_checkcrc(list_def *argv)
|
||||
{
|
||||
int ret=0;
|
||||
uint32_t crc=0;
|
||||
ret=EW_CheckCrc(UPDATA_BASE_ADDR,UPDATA_BASE_ADDR+UPDATA_DATA_LEN,&crc);
|
||||
cmd_print("jwt crc32=0x%04x.",crc);
|
||||
crc=Crc32Calu((uint32_t *)(MC_CODE_ADDR+UPDATA_BASE_ADDR),UPDATA_DATA_LEN);
|
||||
cmd_print("local crc32=0x%04x.",crc);
|
||||
return ret;
|
||||
}
|
||||
commend_export(jwt_boot_checkcrc,cmd_jwt_boot_checkcrc,"jwt checkcrc in boot")
|
||||
|
||||
|
||||
|
||||
@@ -116,20 +171,31 @@ static uint8_t EW_Read(uint16_t adr,uint8_t *buf,uint16_t len)
|
||||
rt_memcpy(buf,&read[3],len);
|
||||
}
|
||||
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,read[0],read[1],read[2],read[3]);
|
||||
delay_ms(50);
|
||||
rt_free(read);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// app:通信测试
|
||||
static void EW_appCommTest(void)
|
||||
static int EW_appCommTest(void)
|
||||
{
|
||||
uint8_t data[4]={0x11,0x22};
|
||||
uint8_t ret;
|
||||
DBG_LOG("send:%02x,%02x.",data[0],data[1]);
|
||||
ret=EW_CommTest(data,2,300);
|
||||
DBG_LOG("ret=%d,dat=%02x,%02x,%02x,%02x,",ret,data[0],data[1],data[2],data[3]);
|
||||
return ret;
|
||||
}
|
||||
static int cmd_jwt_app_commtest(list_def *argv)
|
||||
{
|
||||
int ret=0;
|
||||
ret=EW_appCommTest();
|
||||
return ret;
|
||||
}
|
||||
commend_export(jwt_app_commtest,cmd_jwt_app_commtest,"jwt commtest in app")
|
||||
|
||||
|
||||
// 升级
|
||||
@@ -143,12 +209,13 @@ void EW_Updata(void)
|
||||
uint8_t pack_len=UPDATA_PACK_LEN;
|
||||
uint32_t crc=0;
|
||||
uint32_t crc_module=0;
|
||||
EW_appCommTest();
|
||||
delay_ms(100);
|
||||
ret=EW_Charg();
|
||||
if(ret) {ret=1;goto err;}
|
||||
delay_ms(6000);
|
||||
ret=EW_Erease();
|
||||
//ret=EW_Jump();
|
||||
if(ret) {ret=2;goto err;}
|
||||
delay_ms(600);
|
||||
while(len>0){
|
||||
pack_len=len>UPDATA_PACK_LEN?UPDATA_PACK_LEN:len;
|
||||
ret=EW_Write(addr,data,pack_len);
|
||||
@@ -156,12 +223,15 @@ void EW_Updata(void)
|
||||
data+=pack_len;
|
||||
len-=pack_len;
|
||||
if(ret) {ret=3;goto err;}
|
||||
delay_ms(50);
|
||||
}
|
||||
crc=Crc32Calu((uint32_t *)MC_CODE_ADDR,UPDATA_DATA_LEN/4);
|
||||
crc=Crc32Calu((uint32_t *)(MC_CODE_ADDR+UPDATA_BASE_ADDR),UPDATA_DATA_LEN);
|
||||
DBG_LOG("local crc:0x%04x.",crc);
|
||||
ret=EW_CheckCrc(UPDATA_BASE_ADDR,UPDATA_BASE_ADDR+UPDATA_DATA_LEN,&crc_module);
|
||||
DBG_LOG("module crc:0x%04x.",crc_module);
|
||||
if(ret) {ret=4;goto err;}
|
||||
if(crc!=crc_module)
|
||||
{ret=5;goto err;}
|
||||
if(crc!=crc_module){ret=5;goto err;}
|
||||
delay_ms(50);
|
||||
ret=EW_Jump();
|
||||
if(ret) {ret=6;goto err;}
|
||||
delay_ms(100);
|
||||
@@ -185,6 +255,8 @@ void EW_Test_PowerOFF(void)
|
||||
uint8_t uc_rtv = 0;
|
||||
delay_os_ms(100);
|
||||
XTBUS_OFF;
|
||||
PowerCalibration_set(POWER_DEF_V,45);
|
||||
POWER_OFF;
|
||||
Checker_MaskResult(uc_rtv,checker_runcfg.task_info.runindex);
|
||||
}
|
||||
|
||||
@@ -218,7 +290,7 @@ void EW_Test_SetBusV(void)
|
||||
uc_rtv = 1;
|
||||
|
||||
}else{
|
||||
us_m_v = 50;
|
||||
us_m_v = 55;
|
||||
uc_rtv |= PowerCalibration_set(us_h_v,us_m_v);
|
||||
XTBUS_ON
|
||||
|
||||
|
@@ -6,7 +6,7 @@
|
||||
|
||||
|
||||
|
||||
#define BUILD_DATE "2023-10-08 17:53:21"
|
||||
#define BUILD_DATE "2023-10-09 17:54:49"
|
||||
#define SOFT_VERSION "0.03"
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user