/******************************************************************** *本程序由VC++6.0编译 *主要实现修改bin文件中的几个字节(将这几个字节变为Mac地址的相关信息) *2019-09-20 17:38 ********************************************************************/ #include #include #include #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= 0x11000000) //xip program { j=bin_size1/4; ptr=buf+(SECTOR_BYTE*SECTOR_OFFSET); for(i=0;i= 0x11000000) //xip program { j=bin_size2/4; ptr=buf+(SECTOR_BYTE*(sectorCNT1+SECTOR_OFFSET)); for(i=0;i