wbjw_bin.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622
  1. #include <stdio.h>
  2. #include <windows.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <unistd.h>
  6. #include "Shlwapi.h"
  7. //#pragma comment(lib,"shlwapi.lib")
  8. #define VS_DEBUG_F(fmt, x...) \
  9. do \
  10. { \
  11. printf("%s %s(Line %d): "fmt,__LINE__, ##x); \
  12. }while(0)
  13. #define uint8 unsigned char
  14. #define uint16 unsigned short
  15. #define uint32 unsigned int
  16. typedef unsigned char uint8_t;
  17. typedef unsigned short uint16_t;
  18. typedef unsigned int uint32_t;
  19. typedef struct
  20. {
  21. char Frpath[256]={0};
  22. char Fwpath[256]={0};
  23. char Fwname[256]={0};
  24. uint8 devType = 0;
  25. uint8 FirmwareType = 0;
  26. uint32 ver = 0;
  27. } sBinAdd_t;
  28. sBinAdd_t myStruct = {
  29. "",
  30. "",
  31. 0,
  32. 0,
  33. };
  34. ///////////////////////////////////////////////////////////////
  35. int my_getFileDirFromPath(char *pf){
  36. char *pos;
  37. char ptemp[256]={0};
  38. unsigned int offset=0;
  39. if(pf ==NULL){
  40. return -1;
  41. }
  42. strcpy(ptemp,pf);
  43. pos = strrchr(ptemp,'/');
  44. if(pos ==NULL){
  45. pos = strrchr(ptemp,'\\');
  46. if(pos ==NULL){
  47. return -1;
  48. }
  49. }
  50. offset = abs(pos - ptemp);
  51. pf[offset] = 0;
  52. return 0;
  53. //strncpy(pf,ptemp,offset);
  54. }
  55. /////////////////////////////////////////////////////////////
  56. int opterr = 1, /* if error message should be printed */
  57. optind = 1, /* index into parent argv vector */
  58. optopt, /* character checked for validity */
  59. optreset; /* reset getopt */
  60. char *optarg; /* argument associated with option */
  61. #define BADCH (int)'?'
  62. #define BADARG (int)':'
  63. #define EMSG ""
  64. /*
  65. * getopt --
  66. * Parse argc/argv argument vector.
  67. */
  68. int m_getopt( int nargc, char * const nargv[], const char *ostr )
  69. {
  70. static char *place = EMSG;
  71. /* option letter processing */
  72. const char *oli;
  73. /* option letter list index */
  74. if ( optreset || !*place )
  75. {
  76. /* update scanning pointer */
  77. optreset = 0;
  78. if ( optind >= nargc || *(place = nargv[optind]) != '-' )
  79. {
  80. place = EMSG;
  81. return(-1);
  82. }
  83. if ( place[1] && *++place == '-' )
  84. {
  85. /* found "--" */
  86. ++optind;
  87. place = EMSG;
  88. return(-1);
  89. }
  90. }
  91. /* option letter okay? */
  92. if ( (optopt = (int) *place++) == (int) ':' ||
  93. !(oli = strchr( ostr, optopt ) ) )
  94. {
  95. /*
  96. * if the user didn't specify '-' as an option,
  97. * assume it means -1.
  98. */
  99. if ( optopt == (int) '-' )
  100. return(-1);
  101. if ( !*place )
  102. ++optind;
  103. if ( opterr && *ostr != ':' )
  104. (void) printf( "illegal option -- %c\n", optopt );
  105. return(BADCH);
  106. }
  107. if ( *++oli != ':' )
  108. {
  109. /* don't need argument */
  110. optarg = NULL;
  111. if ( !*place )
  112. ++optind;
  113. } else {
  114. /* need an argument */
  115. if ( *place )
  116. /* no white space */
  117. optarg = place;
  118. else if ( nargc <= ++optind )
  119. {
  120. /* no arg */
  121. place = EMSG;
  122. if ( *ostr == ':' )
  123. return(BADARG);
  124. if ( opterr )
  125. (void) printf( "option requires an argument -- %c\n", optopt );
  126. return(BADCH);
  127. } else
  128. /* white space */
  129. optarg = nargv[optind];
  130. place = EMSG;
  131. ++optind;
  132. }
  133. return(optopt);
  134. /* dump back option letter */
  135. }
  136. ///////////////////////////////////////////////////////////////////////////////
  137. //STM32 CRC32 软件模拟
  138. uint32 crc32(uint32 *ptr, uint32 len)
  139. {
  140. uint32 xbit;
  141. uint32 data;
  142. uint32 CRC32 = 0xFFFFFFFF;
  143. uint32 bits;
  144. const uint32 dwPolynomial = 0x04c11db7;
  145. uint32 i;
  146. for(i = 0;i < len;i ++)
  147. {
  148. xbit = 1 << 31;
  149. data = ptr[i];
  150. for (bits = 0; bits < 32; bits++)
  151. {
  152. if (CRC32 & 0x80000000) {
  153. CRC32 <<= 1;
  154. CRC32 ^= dwPolynomial;
  155. }
  156. else
  157. CRC32 <<= 1;
  158. if (data & xbit)
  159. CRC32 ^= dwPolynomial;
  160. xbit >>= 1;
  161. }
  162. }
  163. return CRC32;
  164. }
  165. int readBinFile_test(char *prpath,char *pwpath){
  166. unsigned char *buf_8=NULL; /*缓冲区*/
  167. unsigned int *buf_32=NULL; /*缓冲区*/
  168. unsigned char *p_8=NULL; /*指针*/
  169. unsigned int *p_32=NULL; /*指针*/
  170. char pf_8[256]={0}; /*指针*/
  171. uint32 uCRC_32 = 0;
  172. uint32 uAdd[8];
  173. unsigned int i = 0;
  174. unsigned int fsize_8 = 0;
  175. unsigned int fsize_32 = 0;
  176. unsigned int uTemp_32 = 0;
  177. unsigned int b_index = 0;
  178. unsigned int a_index = 0;
  179. char sout[256] = {0};
  180. unsigned int lout = 0;
  181. int res = 0;
  182. FILE *Fr,*Fw; /*文件指针*/
  183. int len; /*文件大小*/
  184. if((Fr = fopen(prpath,"rb")) == NULL)
  185. {
  186. printf("line=%d,open file failed\n", __LINE__);
  187. exit (1) ;
  188. }
  189. fseek (Fr, 0, SEEK_END); //文件尾
  190. fsize_8=ftell (Fr); //计算文件大小
  191. //
  192. printf("line=%d,file size = %ld bytes.\n",__LINE__,fsize_8);
  193. if(fsize_8%4){
  194. printf("line=%d,size%%4!=0", __LINE__);
  195. fclose(Fr);
  196. exit (1) ;
  197. }
  198. fsize_32 = fsize_8 / 4;
  199. buf_8 = (unsigned char*)malloc(fsize_8+64);
  200. if(buf_8==NULL){
  201. printf("line=%d,buf_8=NULL", __LINE__);
  202. fclose(Fr);
  203. exit (1) ;
  204. }
  205. res=fseek (Fr, 0, SEEK_SET); //文件头
  206. printf("line=%d,res=%d.\n",__LINE__,res);
  207. //memory_dump(buf,32);
  208. p_8 = buf_8;
  209. i = 0;
  210. do{ //读取文件
  211. buf_8[i++] = fgetc(Fr);
  212. if(feof(Fr))
  213. break;
  214. } while (1);
  215. fclose(Fr);
  216. //printf("\nline=%d,read size =%d \n", __LINE__,i);
  217. //res=fread(buf_8, fsize_8, 1, Fr);
  218. //memory_dump(buf,32);
  219. //printf("line=%d,res=%d.\n",__LINE__,res);
  220. //start printf file
  221. printf("\nline=%d,开始打印文件=%s,按字节(Byte)输出\n", __LINE__,prpath);
  222. if((fsize_8) <17)
  223. for(i=0;i<(fsize_8);i++){
  224. printf("line=%d,i=%04d,data=0x%02X\n", __LINE__,i,buf_8[i]);
  225. }
  226. else{
  227. for(i=0;i<16;i++){
  228. printf("0x%02X ",buf_8[i]);
  229. }
  230. printf("\nline=%d,...\n", __LINE__);
  231. for(i=(fsize_8)-16;i<(fsize_8);i++){
  232. printf("0x%02X ",buf_8[i]);
  233. }
  234. }
  235. printf("\n");
  236. buf_32 = (unsigned int *)buf_8;
  237. fsize_32 = fsize_8 / 4;
  238. printf("line=%d,file size = %ld words.\n",__LINE__,fsize_32);
  239. //打印文件
  240. printf("\nline=%d,开始打印文件=%s,按字(WORD)输出\n", __LINE__,prpath);
  241. if((fsize_32) <6)
  242. for(i=0;i<(fsize_32);i++){
  243. printf("line=%d,i=%04d,data=0x%08X\n", __LINE__,i,buf_32[i]);
  244. }
  245. else{
  246. for(i=0;i<3;i++){
  247. printf("line=%d,i=%08d,data=0x%08X\n", __LINE__,i,buf_32[i]);
  248. }
  249. printf("line=%d,...\n", __LINE__);
  250. for(i=(fsize_32)-6;i<(fsize_32);i++){
  251. printf("line=%d,i=%08d,data=0x%08X\n", __LINE__,i,buf_32[i]);
  252. }
  253. }
  254. fclose(Fr);
  255. //生成写入文件名
  256. if((myStruct.Fwpath==NULL)||(myStruct.Fwpath[0]=='\0')){
  257. strcpy((char *)pf_8,prpath);
  258. my_getFileDirFromPath(pf_8);
  259. strcpy(pwpath,pf_8);
  260. strcat(pwpath,"/");
  261. switch(myStruct.FirmwareType){
  262. case 0x00:
  263. strcat(pwpath,"A");
  264. break;
  265. case 0x01:
  266. strcat(pwpath,"B");
  267. break;
  268. case 0x02:
  269. strcat(pwpath,"S");
  270. break;
  271. default:
  272. break;
  273. }
  274. lout = sprintf(sout,"%08X.bin",myStruct.ver);
  275. strcat(pwpath,sout);
  276. }
  277. else{
  278. strcpy(pwpath,myStruct.Fwpath);
  279. }
  280. //打开写入的文件
  281. printf("\nline=%d,开始写入文件=%s\n", __LINE__,pwpath);
  282. if((Fw = fopen(pwpath,"wb")) == NULL)
  283. {
  284. printf("line=%d,open file failed!\n", __LINE__);
  285. exit (1) ;
  286. }
  287. fseek (Fw, 0, SEEK_SET); //定位文件头
  288. fwrite((char *)(buf_8), fsize_8, 1, Fw);
  289. printf("line=%d,写入的字节数%d\n", __LINE__,fsize_8);
  290. //crc校验
  291. // uCRC_32 = crc32(buf_32,(1*1024));
  292. // printf("line=%d,crc32(buf_32,(1*1024))=0x%08X!\n", __LINE__,uCRC_32);
  293. // uCRC_32 = crc32(buf_32,(2*1024));
  294. // printf("line=%d,crc32(buf_32,(2*1024))=0x%08X!\n", __LINE__,uCRC_32);
  295. // uCRC_32 = crc32(buf_32,(4*1024));
  296. // printf("line=%d,crc32(buf_32,(4*1024))=0x%08X!\n", __LINE__,uCRC_32);
  297. // uCRC_32 = crc32(buf_32,(17898));
  298. // printf("line=%d,crc32(buf_32,(17898))=0x%08X!\n", __LINE__,uCRC_32);
  299. // uCRC_32 = crc32(buf_32,(17899));
  300. // printf("line=%d,crc32(buf_32,(17899))=0x%08X!\n", __LINE__,uCRC_32);
  301. // uCRC_32 = crc32(buf_32,(17900));
  302. // printf("line=%d,crc32(buf_32,(17900))=0x%08X!\n", __LINE__,uCRC_32);
  303. // uCRC_32 = crc32(buf_32,(17901));
  304. // printf("line=%d,crc32(buf_32,(17901))=0x%08X!\n", __LINE__,uCRC_32);
  305. // uCRC_32 = crc32(buf_32,(17902));
  306. // printf("line=%d,crc32(buf_32,(17902))=0x%08X!\n", __LINE__,uCRC_32);
  307. // uCRC_32 = crc32(buf_32,(17903));
  308. // printf("line=%d,crc32(buf_32,(17903))=0x%08X!\n", __LINE__,uCRC_32);
  309. // uCRC_32 = crc32(buf_32,(17904));
  310. // printf("line=%d,crc32(buf_32,(17904))=0x%08X!\n", __LINE__,uCRC_32);
  311. //return 1;
  312. //already add,no process
  313. uTemp_32 = buf_32[(fsize_32-2)];
  314. if(buf_32[(fsize_32-2)]==0x5a4c4843){
  315. printf("line=%d,already add,no process!\n", __LINE__);
  316. fclose(Fw);
  317. return 1;
  318. }
  319. ////////////////////////////////////////////////////计算附加信息
  320. a_index = 0;
  321. //固件大小(不含附加信息)
  322. uAdd[a_index++] = fsize_8;
  323. buf_32[fsize_32+a_index-1] = uAdd[a_index-1];
  324. //#define DEV_TYPE 0x1 // 1,加油机网关; 2,液位仪网关; 3,采集器
  325. //#define FIRM_WARE_TYPE 0x0 // 0,app; 1,bt; 2,set
  326. //设备类型(2字节),固件类型(2字节)
  327. uAdd[a_index++] = ((myStruct.devType<<16)&0xFFFF0000)|((myStruct.FirmwareType<<0)&0x0000FFFF);
  328. buf_32[fsize_32+a_index-1] = uAdd[a_index-1];
  329. //软件版本
  330. uAdd[a_index++] = myStruct.ver;
  331. buf_32[fsize_32+a_index-1] = uAdd[a_index-1];
  332. //固定标记
  333. uAdd[a_index++] = 0x5a4c4843;
  334. buf_32[fsize_32+a_index-1] = uAdd[a_index-1];
  335. //crc校验
  336. // uCRC_32 = crc32(buf_32,(fsize_32+0));
  337. // uCRC_32 = crc32(buf_32,(fsize_32+1));
  338. // uCRC_32 = crc32(buf_32,(fsize_32+2));
  339. // uCRC_32 = crc32(buf_32,(fsize_32+3));
  340. // uCRC_32 = crc32(buf_32,(fsize_32+4));
  341. // uCRC_32 = crc32(buf_32,(fsize_32+5));
  342. uCRC_32 = crc32(buf_32,(fsize_32+a_index));
  343. uAdd[a_index++] = uCRC_32;
  344. buf_32[fsize_32+a_index-1] = uAdd[a_index-1];
  345. // for(i=0;i<a_index;i++){
  346. // buf_32[fsize_32+i] = uAdd[i];
  347. // //printf("line=%d,i=%04d,data=0x%08X\n", __LINE__,fsize_32+i,uAdd[i]);
  348. // }
  349. fwrite((char *)(uAdd), a_index * 4, 1, Fw);
  350. fflush(Fw);
  351. i=0;
  352. printf("line=%d,i=%08d,data=0x%08X,原始bin文件字节长度.\n", __LINE__,fsize_32+i,uAdd[i]);
  353. i++;
  354. printf("line=%d,i=%08d,data=0x%08X,设备类型(2字节)+固件类型(2字节).\n", __LINE__,fsize_32+i,uAdd[i]);
  355. i++;
  356. printf("line=%d,i=%08d,data=0x%08X,固件版本(4字节).\n", __LINE__,fsize_32+i,uAdd[i]);
  357. i++;
  358. printf("line=%d,i=%08d,data=0x%08X,固定标记(4字节),\"ZLHC\".\n", __LINE__,fsize_32+i,uAdd[i]);
  359. i++;
  360. printf("line=%d,i=%08d,data=0x%08X,STM32 CRC32校验(4字节)(此前所有字节,含原始bin文件和附加信息).\n", __LINE__,fsize_32+i,uAdd[i]);
  361. i++;
  362. printf("line=%d,最终写入的字节数%d+%d=%d\n", __LINE__,fsize_8,a_index*4,fsize_8+a_index*4);
  363. fclose(Fw);
  364. //fclose(Fw);
  365. return 0;
  366. }
  367. void printf_help(void){
  368. printf("\n");
  369. printf("************************************************************************************************\n");
  370. printf("* file name binAdd.exe *\n");
  371. printf("* Copy Right By:SCX 版本:V0.0.0.1 build time:%s-%s *\n",__DATE__,__TIME__);
  372. printf("* *\n");
  373. printf("* 将 binAdd.exe 放到fromelf.exe同路径下,例如 D:/Keil_v5/ARM/ARMCC/bin *\n");
  374. printf("* *\n");
  375. printf("* description:在bin文件末尾追加校验字符,防止升级固件错误 *\n");
  376. printf("* 已经追加,则不处理 *\n");
  377. printf("* 第0个字:设备类型固件长度(不含附加字) *\n");
  378. printf("* 第1个字:设备类型2字节,固件类型2字节 *\n");
  379. printf("* 第2个字:固件版本,如61010001 *\n");
  380. printf("* 第3个字:标记字符固定0x5a4c4843 *\n");
  381. printf("* 第4个字:固件CRC32校验(此字之前的所有字,含前4个附加字) *\n");
  382. printf("* *\n");
  383. printf("* usage: *\n");
  384. printf("* binAdd.exe -d 1 -f 0 -v 61010001-r \"E:\\work\\rrrr.bin\" [-w writeFile] *\n");
  385. printf("* *\n");
  386. printf("* option: *\n");
  387. printf("* -d devType: *\n");
  388. printf("* 1: oil gateWay加油机网关; *\n");
  389. printf("* 2: tank gateWay液位仪网关; *\n");
  390. printf("* 3: collector采集器; *\n");
  391. printf("* -f FirmwareType: *\n");
  392. printf("* 0,app应用程序; *\n");
  393. printf("* 1,bt引导程序; *\n");
  394. printf("* 2,set配置信息; *\n");
  395. printf("* -v ver:待处理bin文件版本.e.g.61010001 *\n");
  396. printf("* -r readFile: read frome file path. e.g. -r \"E:\\work\\rrrr.bin\" *\n");
  397. printf("* [-w writeFile](可选): write to file path. e.g. -w \"E:\\work\\wwww.bin\" *\n");
  398. printf("* e.g. binAdd.exe -d 1 -f 0 -r \"E:\\work\\rrrr.bin\" [-w writeFile] *\n");
  399. printf("************************************************************************************************\n");
  400. printf("\n");
  401. }
  402. uint32 str2hex(char *s){
  403. int i=0;
  404. uint32 data_32=0;
  405. char *p=s;
  406. i=0;
  407. while((*p!=0)&&(i<8)){
  408. data_32 <<=4;
  409. if((*p>='0')&&(*p<='9')){
  410. data_32 |= ((*p - '0') & 0x0F);
  411. }
  412. else if((*p>='A')&&(*p<='F')){
  413. data_32 |= ((*p - 'A' + 10) & 0x0F);
  414. }
  415. else if((*p>='a')&&(*p<='f')){
  416. data_32 |= ((*p - 'a' + 10) & 0x0F);
  417. }
  418. p++;
  419. i++;
  420. }
  421. return data_32;
  422. }
  423. /*
  424. binAdd.exe -d 1 -f 0 -v 61010001 -r E:\80_work\VS-Code-C\binAdd\S62010002.bin
  425. */
  426. int main(int argc, char *argv[])
  427. {
  428. uint32 data[8] = {0x2000B050,0x080202D5,0x08025041,0x08024B0D,0x0802503D,0x08023085,0x0802C5D5,0x00000000};
  429. uint32 data2[8] = {0xE7044520,0x9453E29E,0x85CC9C70,0x5AD25446,0x9331C830,0x3F122B65,0x2D3CAE31,0x81E1E490};
  430. uint32 uTemp_32 = 0;
  431. int i = 0;
  432. int len = 0;
  433. int opt=0;
  434. int res=0;
  435. //////////////////////////////
  436. // printf("data\n");
  437. // uTemp_32 = crc32((data),1);
  438. // printf("CRC=0x%08X\n",uTemp_32);
  439. // uTemp_32 = crc32((data),2);
  440. // printf("CRC=0x%08X\n",uTemp_32);
  441. // uTemp_32 = crc32((data),3);
  442. // printf("CRC=0x%08X\n",uTemp_32);
  443. // uTemp_32 = crc32((data),4);
  444. // printf("CRC=0x%08X\n",uTemp_32);
  445. // uTemp_32 = crc32((data),5);
  446. // printf("CRC=0x%08X\n",uTemp_32);
  447. // uTemp_32 = crc32((data),6);
  448. // printf("CRC=0x%08X\n",uTemp_32);
  449. // uTemp_32 = crc32((data),7);
  450. // printf("CRC=0x%08X\n",uTemp_32);
  451. // uTemp_32 = crc32((data),8);
  452. // printf("CRC=0x%08X\n",uTemp_32);
  453. printf("This APP Build time is:%s - %s\r\n",__DATE__,__TIME__);
  454. if((argc!=9)&&(argc!=11)){
  455. printf_help();
  456. //system("pause");
  457. return 1;
  458. }
  459. res = 0;
  460. while((opt=m_getopt(argc,(char * *)argv,"d:f:v:r:w:?h"))!=-1)
  461. {
  462. switch(opt)
  463. {
  464. case '?':
  465. case 'h':
  466. res = 1;
  467. break;
  468. case 'd':
  469. myStruct.devType = ((uint8)atoi(optarg) & 0xf);
  470. break;
  471. case 'f':
  472. myStruct.FirmwareType = ((uint8)atoi(optarg) & 0xf);
  473. break;
  474. case 'v':
  475. myStruct.ver = (uint32)str2hex(optarg);
  476. break;
  477. case 'r':
  478. strcpy(myStruct.Frpath, optarg);
  479. break;
  480. case 'w':
  481. strcpy(myStruct.Fwpath, optarg);
  482. break;
  483. default:
  484. res = 1;
  485. break;
  486. }
  487. if(res!=0)
  488. break;
  489. }
  490. if(res!=0){
  491. printf_help();
  492. //system("pause");
  493. return 1;
  494. }
  495. //打印参数
  496. printf("line=%d,start print input parameter.\n",__LINE__);
  497. printf("line=%d,devType\t=\t%d\n", __LINE__,myStruct.devType);
  498. printf("line=%d,FirmwareType\t=\t%d\n", __LINE__,myStruct.FirmwareType);
  499. printf("line=%d,ver\t\t=\t%08X(Hex)\n", __LINE__,myStruct.ver);
  500. printf("line=%d,Frpath\t\t=\t%s\n", __LINE__,myStruct.Frpath);
  501. printf("line=%d,Fwpath\t\t=\t%s\n", __LINE__,myStruct.Fwpath);
  502. //return 1;
  503. printf("\nline=%d,start process bin file\n",__LINE__);
  504. readBinFile_test(myStruct.Frpath,myStruct.Fwpath);
  505. /*
  506. //////////////////////////////
  507. printf("txt file\n");
  508. uTemp_32 = crc32(uData_32,index);
  509. printf("txt file CRC=0x%08X\n",uTemp_32);
  510. */
  511. printf("处理完成!\n");
  512. //system("pause");
  513. return 0;
  514. }