hpw422移植新的sdk
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1 @@
|
||||
Xincboot_tool.exe s.bin download.bin 0 0 0 0 1
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,4 @@
|
||||
xinchip_bootloader2_tool.exe boot2 ^
|
||||
sxip11003000.bin 0x11003000 0 ^
|
||||
s2.bin 0x10000000 1 ^
|
||||
download.bin
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,398 @@
|
||||
/********************************************************************
|
||||
*本程序由VC++6.0编译
|
||||
*主要实现修改bin文件中的几个字节(将这几个字节变为Mac地址的相关信息)
|
||||
*2019-09-20 17:38
|
||||
********************************************************************/
|
||||
#include<string.h>
|
||||
#include<stdio.h>
|
||||
#include <malloc.h>
|
||||
|
||||
|
||||
#define PARAM_CNT 5
|
||||
#define PARAM_LENGTH 240
|
||||
typedef enum{
|
||||
InvalidStat = 0,
|
||||
ActiveAStat = 1,
|
||||
EraseAStat = 2,
|
||||
OverwriteAStat = 3,
|
||||
ActiveBStat = 4,
|
||||
EraseBStat = 5,
|
||||
OverwriteBStat = 6,
|
||||
}STATUS_T;
|
||||
|
||||
typedef enum{
|
||||
ErrNone =0,
|
||||
ErrParamDamage =1,
|
||||
ErrOverWrite =2,
|
||||
ErrCheck =3,
|
||||
}ERROR_T;
|
||||
|
||||
typedef struct{
|
||||
unsigned int Status;/**/
|
||||
unsigned int SoftVer;/**/
|
||||
unsigned int ACheck;/*crc32*/
|
||||
unsigned int AAddr;/*sector align*/
|
||||
unsigned int ALen;/*page align*/
|
||||
unsigned int BCheck;/**/
|
||||
unsigned int BAddr;/**/
|
||||
unsigned int BLen;/**/
|
||||
unsigned int ALoadAddr;/**/
|
||||
unsigned int BLoadAddr;/**/
|
||||
unsigned int RESERVED0[2];
|
||||
}PARAM_UNIT;
|
||||
|
||||
typedef struct{
|
||||
PARAM_UNIT ParamUnit[PARAM_CNT];
|
||||
unsigned int ParamCrc32;
|
||||
unsigned int RESERVED1[3];
|
||||
}sBOOT_MESSAGE;
|
||||
|
||||
|
||||
sBOOT_MESSAGE bms={0};
|
||||
|
||||
#define SECTOR_OFFSET 3
|
||||
#define SECTOR_BYTE 4096
|
||||
|
||||
#define MAC_INFO_ADD 136
|
||||
#define SUM_CHECK_ADD 64
|
||||
#define BURN_TIMES_ADD 72
|
||||
/************************************************
|
||||
|
||||
************************************************/
|
||||
|
||||
unsigned int my_atoi(unsigned char *p)
|
||||
{
|
||||
unsigned char i=0;
|
||||
unsigned int temp=0;
|
||||
while(p[i])
|
||||
{
|
||||
if((p[i]=='0')&&(p[i+1]=='x')||(p[i]=='0')&&(p[i+1]=='X'))
|
||||
{
|
||||
i+=2;
|
||||
continue;
|
||||
}
|
||||
switch(p[i])
|
||||
{
|
||||
case '0':temp=temp*16 +0;break;
|
||||
case '1':temp=temp*16 +1; break;
|
||||
case '2':temp=temp*16 +2; break;
|
||||
case '3':temp=temp*16 +3; break;
|
||||
case '4':temp=temp*16 +4; break;
|
||||
case '5':temp=temp*16 +5; break;
|
||||
case '6':temp=temp*16 +6; break;
|
||||
case '7':temp=temp*16 +7; break;
|
||||
case '8':temp=temp*16 +8; break;
|
||||
case '9':temp=temp*16 +9; break;
|
||||
case 'A': case 'a':temp=temp*16 +10; break;
|
||||
case 'B': case 'b':temp=temp*16 +11; break;
|
||||
case 'C': case 'c':temp=temp*16 +12; break;
|
||||
case 'D': case 'd':temp=temp*16 +13; break;
|
||||
case 'E': case 'e':temp=temp*16 +14; break;
|
||||
case 'F': case 'f':temp=temp*16 +15; break;
|
||||
}
|
||||
i++;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
return temp;
|
||||
}
|
||||
|
||||
/************************************************
|
||||
*函 数 名:GetBinSize
|
||||
*功 能:获取bin文件的长度(单位字节)
|
||||
*日期作者:2019-09-23 11:40-陈俊伟
|
||||
************************************************/
|
||||
int GetBinSize(char *filename)
|
||||
{
|
||||
int siz = 0;
|
||||
FILE *fp = fopen(filename, "rb");
|
||||
if (fp)
|
||||
{
|
||||
fseek(fp, 0, SEEK_END);
|
||||
siz = ftell(fp);
|
||||
fclose(fp);
|
||||
}
|
||||
return siz;
|
||||
}
|
||||
|
||||
|
||||
/************************************************
|
||||
*函 数 名:read_bin
|
||||
*功 能:将bin文件的内容读取到buf里
|
||||
*日期作者:2019-09-20 11:48-陈俊伟
|
||||
************************************************/
|
||||
void read_bin(char *path, unsigned char *buf, int size)
|
||||
{
|
||||
FILE *infile;
|
||||
|
||||
if((infile=fopen(path,"rb"))==NULL)
|
||||
{
|
||||
printf( "\nCan not open the path: %s \n", path);
|
||||
getchar();
|
||||
exit(-1);
|
||||
}
|
||||
fread(buf, sizeof(unsigned char), size, infile);
|
||||
fclose(infile);
|
||||
}
|
||||
|
||||
/************************************************
|
||||
*函 数 名:write_bin
|
||||
*功 能:将bin文件的内容写入到buf里
|
||||
*日期作者:2019-09-23 14:33
|
||||
************************************************/
|
||||
void write_bin(char *path, unsigned char *buf, int size)
|
||||
{
|
||||
FILE *infile;
|
||||
|
||||
if((infile=fopen(path,"wb"))==NULL)
|
||||
{
|
||||
printf( "\nCan not open the path: %s \n", path);
|
||||
getchar();
|
||||
exit(-1);
|
||||
}
|
||||
//fread (buf,sizeof(unsigned char),size,infile);
|
||||
fwrite(buf,sizeof(unsigned char),size,infile);
|
||||
fclose(infile);
|
||||
}
|
||||
|
||||
|
||||
//CRC32
|
||||
|
||||
#define CRC32_INITVAL 0
|
||||
unsigned int crc32table[256];
|
||||
|
||||
|
||||
extern void makeCRC32table(unsigned int table[]){
|
||||
unsigned int value;
|
||||
unsigned int i, j;
|
||||
for(i=0; i<256; i++){
|
||||
value = i;
|
||||
for(j=0; j<8; j++){
|
||||
if(value&1){
|
||||
value = (value >> 1) ^ 0xedb88320;
|
||||
}
|
||||
else{
|
||||
value = (value >> 1);
|
||||
}
|
||||
}
|
||||
table[i] = value;
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int get_crc32(unsigned int crc, unsigned char *buf, unsigned int len)
|
||||
{
|
||||
const unsigned char *buffer = (const unsigned char *)buf;
|
||||
int i = 0;
|
||||
while (len--) {
|
||||
crc ^= (unsigned int)(*buffer++) << 24;
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (crc & 0x80000000) {
|
||||
crc = (crc << 1) ^ 0xEDB88320;
|
||||
} else {
|
||||
crc <<= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return crc;
|
||||
}
|
||||
|
||||
|
||||
int main(int argc,char **argv)
|
||||
{
|
||||
// FILE * fp;
|
||||
unsigned char *buf=NULL;
|
||||
unsigned char *ptr=NULL;
|
||||
char *src1;
|
||||
char *src2;
|
||||
char *src3;
|
||||
//char *src4;
|
||||
//char *src5;
|
||||
//char *src6;
|
||||
char *des;
|
||||
unsigned int laod_addr1;
|
||||
unsigned int laod_addr2;
|
||||
char status1;
|
||||
char status2;
|
||||
|
||||
int bin_size0=0;
|
||||
int bin_size1=0;
|
||||
int bin_size2=0;
|
||||
|
||||
int sectorCNT1=0;
|
||||
int sectorCNT2=0;
|
||||
unsigned char *pbm;
|
||||
int all_size=0;
|
||||
int i=0,j=0;
|
||||
unsigned char val=0;
|
||||
unsigned int crc32_val=CRC32_INITVAL;
|
||||
makeCRC32table(crc32table);
|
||||
printf("总有%d个命令行参数\n",argc);
|
||||
if(argc<9)
|
||||
{
|
||||
printf("命令参数中请加上源文件名、加载域地址、状态和目的文件名,比如:xinchip_boot2_tool.exe boot2 s1.bin 0x10000000 1 s2.bin 0x11000000 0 download.bin\n");
|
||||
//printf("命令参数中请加上源文件名和目的文件名,比如:xinchip_boot2_tool.exe boot2 s1.bin 0x10000000 1 download.bin\n");
|
||||
getchar();
|
||||
return -1;
|
||||
}
|
||||
printf("可 执 行文 件 名:%s\n",*argv); //xinchip_boot2_tool.exe 程序名字
|
||||
printf("第一个命令行参数[bootloader program ]:%s\n",*(argv+1)); //第一个命令行参数 boot2 [bootloader program ]
|
||||
printf("第二个命令行参数[APP1 program]:%s\n",*(argv+2)); //第二个命令行参数 s1.bin [APP1 program]
|
||||
printf("第三个命令行参数[load_addr: sector align]:%s\n",*(argv+3)); //第三个命令行参数 0x10000000 [load_addr: sector align]
|
||||
printf("第四个命令行参数[1:active,0:invalid]:%s\n",*(argv+4)); //第四个命令行参数 1 [1:active,0:invalid]
|
||||
|
||||
|
||||
|
||||
printf("第五个命令行参数[APP2 program]:%s\n",*(argv+5)); //第五个命令行参数 //s2.bin [APP2 program]
|
||||
printf("第六个命令行参数[load_addr: sector align]:%s\n",*(argv+6)); //第六个命令行参数 //0x11010000 [load_addr: sector align]
|
||||
printf("第七个命令行参数[1:active,0:invalid]:%s\n",*(argv+7)); //第七个命令行参数 //0 [1:active,0:invalid]
|
||||
printf("第八个命令行参数[生成的最终bin]:%s\n",*(argv+8)); //第八个命令行参数
|
||||
|
||||
|
||||
src1=*(argv+1);
|
||||
src2=*(argv+2);
|
||||
src3=*(argv+5);
|
||||
des=*(argv+8);
|
||||
|
||||
laod_addr1=my_atoi(*(argv+3));
|
||||
laod_addr2=my_atoi(*(argv+6));
|
||||
status1=my_atoi(*(argv+4));
|
||||
status2=my_atoi(*(argv+7));
|
||||
|
||||
printf("src1=%s\n",src1);
|
||||
printf("src2=%s\n",src2);
|
||||
printf("src3=%s\n",src3);
|
||||
printf("des=%s\n",des);
|
||||
|
||||
printf("laod_addr1=0x%08x\n",laod_addr1);
|
||||
printf("laod_addr2=0x%08x\n",laod_addr2);
|
||||
printf("status1=%d\n",status1);
|
||||
printf("status2=%d\n",status2);
|
||||
|
||||
if(laod_addr1>=0x11000000)
|
||||
{
|
||||
if(status1>1)
|
||||
{
|
||||
bms.ParamUnit[0].SoftVer |=0x8000;//quad mode
|
||||
}
|
||||
}
|
||||
if(laod_addr2>=0x11000000)
|
||||
{
|
||||
if(status2>1)
|
||||
{
|
||||
bms.ParamUnit[1].SoftVer |=0x8000;//quad mode
|
||||
}
|
||||
}
|
||||
|
||||
status1= (status1==0) ? 0:1;
|
||||
status2= (status2==0) ? 0:1;
|
||||
|
||||
bms.ParamUnit[0].Status=status1;
|
||||
bms.ParamUnit[0].ALoadAddr=laod_addr1;
|
||||
bms.ParamUnit[1].Status=status2;
|
||||
bms.ParamUnit[1].ALoadAddr=laod_addr2;
|
||||
|
||||
|
||||
bin_size0=GetBinSize(src1);//bin_size=GetBinSize("./boot2.bin");
|
||||
bin_size1=GetBinSize(src2);//bin_size=GetBinSize("./s1.bin");
|
||||
bin_size2=GetBinSize(src3);//bin_size=GetBinSize("./s2.bin");
|
||||
|
||||
sectorCNT1= (bin_size1%4096 ==0 ) ? (bin_size1/4096):((bin_size1/4096)+1);
|
||||
sectorCNT2= (bin_size2%4096 ==0 ) ? (bin_size2/4096):((bin_size2/4096)+1);
|
||||
|
||||
bms.ParamUnit[0].AAddr=SECTOR_OFFSET*SECTOR_BYTE;
|
||||
bms.ParamUnit[0].ALen=bin_size1;
|
||||
bms.ParamUnit[1].AAddr=(sectorCNT1+SECTOR_OFFSET)*SECTOR_BYTE;
|
||||
bms.ParamUnit[1].ALen=bin_size2;
|
||||
|
||||
all_size=SECTOR_BYTE*(SECTOR_OFFSET+sectorCNT1+sectorCNT2);
|
||||
|
||||
if(NULL==(buf = (unsigned char *)malloc(sizeof(unsigned char)*all_size)))
|
||||
{
|
||||
printf("malloc memory fail !\n");
|
||||
getchar();
|
||||
return -3;
|
||||
|
||||
}
|
||||
for(i=0;i<all_size;i++) buf[i]=0xFF;
|
||||
|
||||
read_bin(src1, buf, bin_size0); //read_bin("./boot2.bin", buf, bin_size0);
|
||||
read_bin(src2, buf+(SECTOR_BYTE*SECTOR_OFFSET), bin_size1); //read_bin("./s1.bin", buf+.., bin_size1);
|
||||
read_bin(src3, buf+(SECTOR_BYTE*(sectorCNT1+SECTOR_OFFSET)), bin_size2); //read_bin("./s2.bin", buf+.., bin_size2);
|
||||
|
||||
bms.ParamUnit[0].ACheck=get_crc32(CRC32_INITVAL,buf+(SECTOR_BYTE*SECTOR_OFFSET),bin_size1);
|
||||
bms.ParamUnit[1].ACheck=get_crc32(CRC32_INITVAL,buf+(SECTOR_BYTE*(sectorCNT1+SECTOR_OFFSET)),bin_size2);
|
||||
bms.ParamCrc32=get_crc32(CRC32_INITVAL,(unsigned char *)&bms,PARAM_LENGTH);
|
||||
for(i=0,pbm=(unsigned char *)&bms;i<sizeof(bms);i++) buf[SECTOR_BYTE*(SECTOR_OFFSET-1)+i]=pbm[i];
|
||||
|
||||
#if 0
|
||||
j=bin_size/4;
|
||||
ptr=buf+4096;
|
||||
for(i=0;i<j;i++)
|
||||
{
|
||||
val=ptr[4*i];
|
||||
ptr[4*i]=ptr[4*i+2];
|
||||
ptr[4*i+2]=val;
|
||||
|
||||
val=ptr[4*i+1];
|
||||
ptr[4*i+1]=ptr[4*i+3];
|
||||
ptr[4*i+3]=val;
|
||||
}
|
||||
#else
|
||||
/*
|
||||
j=bin_size/4;
|
||||
ptr=buf+4096;
|
||||
for(i=0;i<j;i++)
|
||||
{
|
||||
val=ptr[4*i];
|
||||
ptr[4*i]=ptr[4*i+1];
|
||||
ptr[4*i+1]=val;
|
||||
|
||||
|
||||
}
|
||||
*/
|
||||
if(laod_addr1 >= 0x11000000) //xip program
|
||||
{
|
||||
j=bin_size1/4;
|
||||
ptr=buf+(SECTOR_BYTE*SECTOR_OFFSET);
|
||||
for(i=0;i<j;i++)
|
||||
{
|
||||
val=ptr[4*i];
|
||||
ptr[4*i]=ptr[4*i+3];
|
||||
ptr[4*i+3]=val;
|
||||
|
||||
val=ptr[4*i+1];
|
||||
ptr[4*i+1]=ptr[4*i+2];
|
||||
ptr[4*i+2]=val;
|
||||
}
|
||||
}
|
||||
if(laod_addr2 >= 0x11000000) //xip program
|
||||
{
|
||||
j=bin_size2/4;
|
||||
ptr=buf+(SECTOR_BYTE*(sectorCNT1+SECTOR_OFFSET));
|
||||
for(i=0;i<j;i++)
|
||||
{
|
||||
val=ptr[4*i];
|
||||
ptr[4*i]=ptr[4*i+3];
|
||||
ptr[4*i+3]=val;
|
||||
|
||||
val=ptr[4*i+1];
|
||||
ptr[4*i+1]=ptr[4*i+2];
|
||||
ptr[4*i+2]=val;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
write_bin(des, buf, all_size); //write_bin("./download.bin", buf, all_size);
|
||||
|
||||
printf("updata file success !\n");
|
||||
free(buf);
|
||||
|
||||
|
||||
|
||||
//getchar();
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user