Files
stair56e_uart/component/boot2/boot2_tools/xinchip_bootloader2_tool.c
T
2026-08-05 19:07:52 +08:00

399 lines
10 KiB
C

/********************************************************************
*本程序由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;
}