399 lines
10 KiB
C
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;
|
|
}
|