| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622 |
- #include <stdio.h>
- #include <windows.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- #include "Shlwapi.h"
- //#pragma comment(lib,"shlwapi.lib")
- #define VS_DEBUG_F(fmt, x...) \
- do \
- { \
- printf("%s %s(Line %d): "fmt,__LINE__, ##x); \
- }while(0)
- #define uint8 unsigned char
- #define uint16 unsigned short
- #define uint32 unsigned int
- typedef unsigned char uint8_t;
- typedef unsigned short uint16_t;
- typedef unsigned int uint32_t;
- typedef struct
- {
-
- char Frpath[256]={0};
- char Fwpath[256]={0};
- char Fwname[256]={0};
- uint8 devType = 0;
- uint8 FirmwareType = 0;
- uint32 ver = 0;
- } sBinAdd_t;
- sBinAdd_t myStruct = {
- "",
- "",
- 0,
- 0,
- };
- ///////////////////////////////////////////////////////////////
- int my_getFileDirFromPath(char *pf){
- char *pos;
- char ptemp[256]={0};
- unsigned int offset=0;
- if(pf ==NULL){
- return -1;
- }
- strcpy(ptemp,pf);
- pos = strrchr(ptemp,'/');
- if(pos ==NULL){
- pos = strrchr(ptemp,'\\');
- if(pos ==NULL){
- return -1;
- }
- }
-
- offset = abs(pos - ptemp);
- pf[offset] = 0;
- return 0;
- //strncpy(pf,ptemp,offset);
-
- }
- /////////////////////////////////////////////////////////////
- int opterr = 1, /* if error message should be printed */
- optind = 1, /* index into parent argv vector */
- optopt, /* character checked for validity */
- optreset; /* reset getopt */
- char *optarg; /* argument associated with option */
- #define BADCH (int)'?'
- #define BADARG (int)':'
- #define EMSG ""
- /*
- * getopt --
- * Parse argc/argv argument vector.
- */
- int m_getopt( int nargc, char * const nargv[], const char *ostr )
- {
- static char *place = EMSG;
- /* option letter processing */
- const char *oli;
- /* option letter list index */
- if ( optreset || !*place )
- {
- /* update scanning pointer */
- optreset = 0;
- if ( optind >= nargc || *(place = nargv[optind]) != '-' )
- {
- place = EMSG;
- return(-1);
- }
- if ( place[1] && *++place == '-' )
- {
- /* found "--" */
- ++optind;
- place = EMSG;
- return(-1);
- }
- }
- /* option letter okay? */
- if ( (optopt = (int) *place++) == (int) ':' ||
- !(oli = strchr( ostr, optopt ) ) )
- {
- /*
- * if the user didn't specify '-' as an option,
- * assume it means -1.
- */
- if ( optopt == (int) '-' )
- return(-1);
- if ( !*place )
- ++optind;
- if ( opterr && *ostr != ':' )
- (void) printf( "illegal option -- %c\n", optopt );
- return(BADCH);
- }
- if ( *++oli != ':' )
- {
- /* don't need argument */
- optarg = NULL;
- if ( !*place )
- ++optind;
- } else {
- /* need an argument */
- if ( *place )
- /* no white space */
- optarg = place;
- else if ( nargc <= ++optind )
- {
- /* no arg */
- place = EMSG;
- if ( *ostr == ':' )
- return(BADARG);
- if ( opterr )
- (void) printf( "option requires an argument -- %c\n", optopt );
- return(BADCH);
- } else
- /* white space */
- optarg = nargv[optind];
- place = EMSG;
- ++optind;
- }
- return(optopt);
- /* dump back option letter */
- }
- ///////////////////////////////////////////////////////////////////////////////
- //STM32 CRC32 软件模拟
- uint32 crc32(uint32 *ptr, uint32 len)
- {
- uint32 xbit;
- uint32 data;
- uint32 CRC32 = 0xFFFFFFFF;
- uint32 bits;
- const uint32 dwPolynomial = 0x04c11db7;
- uint32 i;
-
- for(i = 0;i < len;i ++)
- {
- xbit = 1 << 31;
- data = ptr[i];
- for (bits = 0; bits < 32; bits++)
- {
- if (CRC32 & 0x80000000) {
- CRC32 <<= 1;
- CRC32 ^= dwPolynomial;
- }
- else
- CRC32 <<= 1;
- if (data & xbit)
- CRC32 ^= dwPolynomial;
-
- xbit >>= 1;
- }
- }
- return CRC32;
- }
- int readBinFile_test(char *prpath,char *pwpath){
- unsigned char *buf_8=NULL; /*缓冲区*/
- unsigned int *buf_32=NULL; /*缓冲区*/
- unsigned char *p_8=NULL; /*指针*/
- unsigned int *p_32=NULL; /*指针*/
- char pf_8[256]={0}; /*指针*/
- uint32 uCRC_32 = 0;
- uint32 uAdd[8];
- unsigned int i = 0;
- unsigned int fsize_8 = 0;
- unsigned int fsize_32 = 0;
- unsigned int uTemp_32 = 0;
- unsigned int b_index = 0;
- unsigned int a_index = 0;
- char sout[256] = {0};
- unsigned int lout = 0;
- int res = 0;
- FILE *Fr,*Fw; /*文件指针*/
- int len; /*文件大小*/
- if((Fr = fopen(prpath,"rb")) == NULL)
- {
- printf("line=%d,open file failed\n", __LINE__);
- exit (1) ;
- }
- fseek (Fr, 0, SEEK_END); //文件尾
- fsize_8=ftell (Fr); //计算文件大小
- //
-
- printf("line=%d,file size = %ld bytes.\n",__LINE__,fsize_8);
- if(fsize_8%4){
- printf("line=%d,size%%4!=0", __LINE__);
- fclose(Fr);
- exit (1) ;
- }
- fsize_32 = fsize_8 / 4;
- buf_8 = (unsigned char*)malloc(fsize_8+64);
- if(buf_8==NULL){
- printf("line=%d,buf_8=NULL", __LINE__);
- fclose(Fr);
- exit (1) ;
- }
- res=fseek (Fr, 0, SEEK_SET); //文件头
- printf("line=%d,res=%d.\n",__LINE__,res);
- //memory_dump(buf,32);
- p_8 = buf_8;
- i = 0;
- do{ //读取文件
- buf_8[i++] = fgetc(Fr);
- if(feof(Fr))
- break;
- } while (1);
- fclose(Fr);
- //printf("\nline=%d,read size =%d \n", __LINE__,i);
- //res=fread(buf_8, fsize_8, 1, Fr);
- //memory_dump(buf,32);
- //printf("line=%d,res=%d.\n",__LINE__,res);
-
- //start printf file
- printf("\nline=%d,开始打印文件=%s,按字节(Byte)输出\n", __LINE__,prpath);
- if((fsize_8) <17)
- for(i=0;i<(fsize_8);i++){
- printf("line=%d,i=%04d,data=0x%02X\n", __LINE__,i,buf_8[i]);
- }
- else{
- for(i=0;i<16;i++){
- printf("0x%02X ",buf_8[i]);
- }
- printf("\nline=%d,...\n", __LINE__);
- for(i=(fsize_8)-16;i<(fsize_8);i++){
- printf("0x%02X ",buf_8[i]);
- }
- }
- printf("\n");
- buf_32 = (unsigned int *)buf_8;
- fsize_32 = fsize_8 / 4;
-
- printf("line=%d,file size = %ld words.\n",__LINE__,fsize_32);
- //打印文件
- printf("\nline=%d,开始打印文件=%s,按字(WORD)输出\n", __LINE__,prpath);
- if((fsize_32) <6)
- for(i=0;i<(fsize_32);i++){
- printf("line=%d,i=%04d,data=0x%08X\n", __LINE__,i,buf_32[i]);
- }
- else{
- for(i=0;i<3;i++){
- printf("line=%d,i=%08d,data=0x%08X\n", __LINE__,i,buf_32[i]);
- }
- printf("line=%d,...\n", __LINE__);
- for(i=(fsize_32)-6;i<(fsize_32);i++){
- printf("line=%d,i=%08d,data=0x%08X\n", __LINE__,i,buf_32[i]);
- }
- }
- fclose(Fr);
- //生成写入文件名
- if((myStruct.Fwpath==NULL)||(myStruct.Fwpath[0]=='\0')){
- strcpy((char *)pf_8,prpath);
- my_getFileDirFromPath(pf_8);
- strcpy(pwpath,pf_8);
- strcat(pwpath,"/");
- switch(myStruct.FirmwareType){
- case 0x00:
- strcat(pwpath,"A");
- break;
- case 0x01:
- strcat(pwpath,"B");
- break;
- case 0x02:
- strcat(pwpath,"S");
- break;
- default:
- break;
- }
- lout = sprintf(sout,"%08X.bin",myStruct.ver);
- strcat(pwpath,sout);
- }
- else{
- strcpy(pwpath,myStruct.Fwpath);
- }
- //打开写入的文件
- printf("\nline=%d,开始写入文件=%s\n", __LINE__,pwpath);
- if((Fw = fopen(pwpath,"wb")) == NULL)
- {
- printf("line=%d,open file failed!\n", __LINE__);
- exit (1) ;
- }
- fseek (Fw, 0, SEEK_SET); //定位文件头
- fwrite((char *)(buf_8), fsize_8, 1, Fw);
- printf("line=%d,写入的字节数%d\n", __LINE__,fsize_8);
-
-
- //crc校验
- // uCRC_32 = crc32(buf_32,(1*1024));
- // printf("line=%d,crc32(buf_32,(1*1024))=0x%08X!\n", __LINE__,uCRC_32);
- // uCRC_32 = crc32(buf_32,(2*1024));
- // printf("line=%d,crc32(buf_32,(2*1024))=0x%08X!\n", __LINE__,uCRC_32);
- // uCRC_32 = crc32(buf_32,(4*1024));
- // printf("line=%d,crc32(buf_32,(4*1024))=0x%08X!\n", __LINE__,uCRC_32);
- // uCRC_32 = crc32(buf_32,(17898));
- // printf("line=%d,crc32(buf_32,(17898))=0x%08X!\n", __LINE__,uCRC_32);
- // uCRC_32 = crc32(buf_32,(17899));
- // printf("line=%d,crc32(buf_32,(17899))=0x%08X!\n", __LINE__,uCRC_32);
- // uCRC_32 = crc32(buf_32,(17900));
- // printf("line=%d,crc32(buf_32,(17900))=0x%08X!\n", __LINE__,uCRC_32);
- // uCRC_32 = crc32(buf_32,(17901));
- // printf("line=%d,crc32(buf_32,(17901))=0x%08X!\n", __LINE__,uCRC_32);
- // uCRC_32 = crc32(buf_32,(17902));
- // printf("line=%d,crc32(buf_32,(17902))=0x%08X!\n", __LINE__,uCRC_32);
- // uCRC_32 = crc32(buf_32,(17903));
- // printf("line=%d,crc32(buf_32,(17903))=0x%08X!\n", __LINE__,uCRC_32);
- // uCRC_32 = crc32(buf_32,(17904));
- // printf("line=%d,crc32(buf_32,(17904))=0x%08X!\n", __LINE__,uCRC_32);
- //return 1;
- //already add,no process
- uTemp_32 = buf_32[(fsize_32-2)];
- if(buf_32[(fsize_32-2)]==0x5a4c4843){
- printf("line=%d,already add,no process!\n", __LINE__);
- fclose(Fw);
- return 1;
- }
- ////////////////////////////////////////////////////计算附加信息
- a_index = 0;
- //固件大小(不含附加信息)
- uAdd[a_index++] = fsize_8;
- buf_32[fsize_32+a_index-1] = uAdd[a_index-1];
-
- //#define DEV_TYPE 0x1 // 1,加油机网关; 2,液位仪网关; 3,采集器
- //#define FIRM_WARE_TYPE 0x0 // 0,app; 1,bt; 2,set
- //设备类型(2字节),固件类型(2字节)
- uAdd[a_index++] = ((myStruct.devType<<16)&0xFFFF0000)|((myStruct.FirmwareType<<0)&0x0000FFFF);
- buf_32[fsize_32+a_index-1] = uAdd[a_index-1];
- //软件版本
- uAdd[a_index++] = myStruct.ver;
- buf_32[fsize_32+a_index-1] = uAdd[a_index-1];
- //固定标记
- uAdd[a_index++] = 0x5a4c4843;
- buf_32[fsize_32+a_index-1] = uAdd[a_index-1];
- //crc校验
- // uCRC_32 = crc32(buf_32,(fsize_32+0));
- // uCRC_32 = crc32(buf_32,(fsize_32+1));
- // uCRC_32 = crc32(buf_32,(fsize_32+2));
- // uCRC_32 = crc32(buf_32,(fsize_32+3));
- // uCRC_32 = crc32(buf_32,(fsize_32+4));
- // uCRC_32 = crc32(buf_32,(fsize_32+5));
- uCRC_32 = crc32(buf_32,(fsize_32+a_index));
- uAdd[a_index++] = uCRC_32;
- buf_32[fsize_32+a_index-1] = uAdd[a_index-1];
- // for(i=0;i<a_index;i++){
- // buf_32[fsize_32+i] = uAdd[i];
- // //printf("line=%d,i=%04d,data=0x%08X\n", __LINE__,fsize_32+i,uAdd[i]);
- // }
-
- fwrite((char *)(uAdd), a_index * 4, 1, Fw);
- fflush(Fw);
- i=0;
- printf("line=%d,i=%08d,data=0x%08X,原始bin文件字节长度.\n", __LINE__,fsize_32+i,uAdd[i]);
- i++;
- printf("line=%d,i=%08d,data=0x%08X,设备类型(2字节)+固件类型(2字节).\n", __LINE__,fsize_32+i,uAdd[i]);
- i++;
- printf("line=%d,i=%08d,data=0x%08X,固件版本(4字节).\n", __LINE__,fsize_32+i,uAdd[i]);
- i++;
- printf("line=%d,i=%08d,data=0x%08X,固定标记(4字节),\"ZLHC\".\n", __LINE__,fsize_32+i,uAdd[i]);
- i++;
- printf("line=%d,i=%08d,data=0x%08X,STM32 CRC32校验(4字节)(此前所有字节,含原始bin文件和附加信息).\n", __LINE__,fsize_32+i,uAdd[i]);
- i++;
-
- printf("line=%d,最终写入的字节数%d+%d=%d\n", __LINE__,fsize_8,a_index*4,fsize_8+a_index*4);
- fclose(Fw);
- //fclose(Fw);
- return 0;
- }
- void printf_help(void){
- printf("\n");
-
- printf("************************************************************************************************\n");
- printf("* file name binAdd.exe *\n");
- printf("* Copy Right By:SCX 版本:V0.0.0.1 build time:%s-%s *\n",__DATE__,__TIME__);
- printf("* *\n");
- printf("* 将 binAdd.exe 放到fromelf.exe同路径下,例如 D:/Keil_v5/ARM/ARMCC/bin *\n");
- printf("* *\n");
- printf("* description:在bin文件末尾追加校验字符,防止升级固件错误 *\n");
- printf("* 已经追加,则不处理 *\n");
- printf("* 第0个字:设备类型固件长度(不含附加字) *\n");
- printf("* 第1个字:设备类型2字节,固件类型2字节 *\n");
- printf("* 第2个字:固件版本,如61010001 *\n");
- printf("* 第3个字:标记字符固定0x5a4c4843 *\n");
- printf("* 第4个字:固件CRC32校验(此字之前的所有字,含前4个附加字) *\n");
- printf("* *\n");
- printf("* usage: *\n");
- printf("* binAdd.exe -d 1 -f 0 -v 61010001-r \"E:\\work\\rrrr.bin\" [-w writeFile] *\n");
- printf("* *\n");
- printf("* option: *\n");
- printf("* -d devType: *\n");
- printf("* 1: oil gateWay加油机网关; *\n");
- printf("* 2: tank gateWay液位仪网关; *\n");
- printf("* 3: collector采集器; *\n");
- printf("* -f FirmwareType: *\n");
- printf("* 0,app应用程序; *\n");
- printf("* 1,bt引导程序; *\n");
- printf("* 2,set配置信息; *\n");
- printf("* -v ver:待处理bin文件版本.e.g.61010001 *\n");
- printf("* -r readFile: read frome file path. e.g. -r \"E:\\work\\rrrr.bin\" *\n");
- printf("* [-w writeFile](可选): write to file path. e.g. -w \"E:\\work\\wwww.bin\" *\n");
- printf("* e.g. binAdd.exe -d 1 -f 0 -r \"E:\\work\\rrrr.bin\" [-w writeFile] *\n");
- printf("************************************************************************************************\n");
- printf("\n");
- }
- uint32 str2hex(char *s){
- int i=0;
- uint32 data_32=0;
- char *p=s;
- i=0;
- while((*p!=0)&&(i<8)){
-
- data_32 <<=4;
- if((*p>='0')&&(*p<='9')){
- data_32 |= ((*p - '0') & 0x0F);
- }
- else if((*p>='A')&&(*p<='F')){
- data_32 |= ((*p - 'A' + 10) & 0x0F);
- }
- else if((*p>='a')&&(*p<='f')){
- data_32 |= ((*p - 'a' + 10) & 0x0F);
- }
- p++;
- i++;
- }
- return data_32;
- }
- /*
- binAdd.exe -d 1 -f 0 -v 61010001 -r E:\80_work\VS-Code-C\binAdd\S62010002.bin
- */
- int main(int argc, char *argv[])
- {
- uint32 data[8] = {0x2000B050,0x080202D5,0x08025041,0x08024B0D,0x0802503D,0x08023085,0x0802C5D5,0x00000000};
- uint32 data2[8] = {0xE7044520,0x9453E29E,0x85CC9C70,0x5AD25446,0x9331C830,0x3F122B65,0x2D3CAE31,0x81E1E490};
- uint32 uTemp_32 = 0;
- int i = 0;
- int len = 0;
- int opt=0;
- int res=0;
- //////////////////////////////
- // printf("data\n");
- // uTemp_32 = crc32((data),1);
- // printf("CRC=0x%08X\n",uTemp_32);
- // uTemp_32 = crc32((data),2);
- // printf("CRC=0x%08X\n",uTemp_32);
- // uTemp_32 = crc32((data),3);
- // printf("CRC=0x%08X\n",uTemp_32);
- // uTemp_32 = crc32((data),4);
- // printf("CRC=0x%08X\n",uTemp_32);
- // uTemp_32 = crc32((data),5);
- // printf("CRC=0x%08X\n",uTemp_32);
- // uTemp_32 = crc32((data),6);
- // printf("CRC=0x%08X\n",uTemp_32);
- // uTemp_32 = crc32((data),7);
- // printf("CRC=0x%08X\n",uTemp_32);
- // uTemp_32 = crc32((data),8);
- // printf("CRC=0x%08X\n",uTemp_32);
- printf("This APP Build time is:%s - %s\r\n",__DATE__,__TIME__);
- if((argc!=9)&&(argc!=11)){
- printf_help();
- //system("pause");
- return 1;
- }
- res = 0;
- while((opt=m_getopt(argc,(char * *)argv,"d:f:v:r:w:?h"))!=-1)
- {
- switch(opt)
- {
- case '?':
- case 'h':
- res = 1;
- break;
- case 'd':
- myStruct.devType = ((uint8)atoi(optarg) & 0xf);
- break;
- case 'f':
- myStruct.FirmwareType = ((uint8)atoi(optarg) & 0xf);
- break;
- case 'v':
- myStruct.ver = (uint32)str2hex(optarg);
- break;
- case 'r':
- strcpy(myStruct.Frpath, optarg);
- break;
- case 'w':
- strcpy(myStruct.Fwpath, optarg);
- break;
- default:
- res = 1;
- break;
- }
- if(res!=0)
- break;
- }
- if(res!=0){
- printf_help();
- //system("pause");
- return 1;
- }
- //打印参数
- printf("line=%d,start print input parameter.\n",__LINE__);
- printf("line=%d,devType\t=\t%d\n", __LINE__,myStruct.devType);
- printf("line=%d,FirmwareType\t=\t%d\n", __LINE__,myStruct.FirmwareType);
- printf("line=%d,ver\t\t=\t%08X(Hex)\n", __LINE__,myStruct.ver);
- printf("line=%d,Frpath\t\t=\t%s\n", __LINE__,myStruct.Frpath);
- printf("line=%d,Fwpath\t\t=\t%s\n", __LINE__,myStruct.Fwpath);
- //return 1;
- printf("\nline=%d,start process bin file\n",__LINE__);
- readBinFile_test(myStruct.Frpath,myStruct.Fwpath);
- /*
- //////////////////////////////
- printf("txt file\n");
- uTemp_32 = crc32(uData_32,index);
- printf("txt file CRC=0x%08X\n",uTemp_32);
- */
- printf("处理完成!\n");
- //system("pause");
- return 0;
- }
|