mergeToBin.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737
  1. //-------------------------------------------------------------------------------
  2. #include "mergeToBin.h"
  3. #include "loadBasicPacket.h"
  4. #include "generateOutput.h"
  5. #include <stdarg.h>
  6. #include <ctype.h>
  7. //-------------------------------------------------------------------------------
  8. u8 *codeTmpMem = NULL;
  9. u8 *dataTmpMem = NULL;
  10. //-------------------------------------------------------------------------------
  11. static inline u32 getNorFlashOffset( u32 flashAddr )
  12. {
  13. return flashAddr & 0x00ffffff;
  14. }
  15. u32 getNorFlashID( u32 flashAddr )
  16. {
  17. flashAddr = flashAddr & 0xff000000;
  18. if( flashAddr == SPI_CODEFLASH_BASEADDR ) return 0;
  19. else if( flashAddr == SPI_DATAFLASH_BASEADDR )
  20. {
  21. #if( CONFIG_DATA_FLASH_SIZE != 0 )
  22. return 1;
  23. #else
  24. errMsg( "No support data-flash address (0x%08x)\n", flashAddr ); return 9;
  25. #endif
  26. }
  27. else
  28. {
  29. errMsg( "This address (0x%08x) is not a flash address.\n", flashAddr);
  30. return 9;
  31. }
  32. }
  33. //-------------------------------------------------------------------------------
  34. static bool moveFileContent( u8 *memOut, FILE *fpIn, int cpySize )
  35. {
  36. int i; int readSize;
  37. u8 readBuf[TMP_BUFFER_SIZE] = {0};
  38. for( i = 0; i < cpySize; i+= TMP_BUFFER_SIZE )
  39. {
  40. readSize = fread( readBuf, 1, TMP_BUFFER_SIZE, fpIn );
  41. if( readSize < 0 )
  42. {
  43. errMsg( "fread() error\n" ); return false;
  44. }
  45. memcpy( memOut+i, readBuf, readSize );
  46. }
  47. return true;
  48. }
  49. bool copyFileToMemory( u8 *memOut, const char *fileName, int maxSize )
  50. {
  51. bool ret;
  52. FILE *fpIn;
  53. int fileSize = getFileSize( fileName );
  54. if( fileSize > maxSize )
  55. {
  56. errMsg( "fileSize(%d) > maxSize(%d) (%s)\n", fileSize, maxSize, fileName);
  57. exit(-1);
  58. return false;
  59. }
  60. fpIn = fopen( fileName, "rb" );
  61. if( fpIn == NULL )
  62. {
  63. errMsg( "Open file failed (%s)\n", fileName );
  64. return false;
  65. }
  66. ret = moveFileContent( memOut, fpIn, fileSize );
  67. fclose( fpIn );
  68. return ret;
  69. }
  70. //-------------------------------------------------------------------------------
  71. unsigned char G_FLASH_ENCODE_FFFF_4DW[16] =
  72. {
  73. 0xac, 0xea, 0x6b, 0xcf,
  74. 0xac, 0x59, 0x4d, 0x35,
  75. 0x28, 0xab, 0x54, 0xe3,
  76. 0xa5, 0xaa, 0x0b, 0x37,
  77. };
  78. bool loadBasicImageToFlashTempMem( u8 *memOut, const char *fileName)
  79. {
  80. FILE *fpIn; int fileSize;
  81. bool ret;
  82. if( !isLoadBasicPacket() ) return true;
  83. dbgMsg( "[loadBasicImageToFlashTempMem] %s\n", fileName );
  84. fileSize = getFileSize( fileName );
  85. if( fileSize <= 0 )
  86. {
  87. errMsg( "[loadBasicImageToFlashTempMem] %s\n", fileName );
  88. }
  89. fpIn = fopen( fileName, "rb" );
  90. if( fpIn == NULL ) return false;
  91. ret = moveFileContent ( memOut, fpIn, fileSize );
  92. fclose(fpIn);
  93. return ret;
  94. }
  95. u8* initFlashTempMem( u32 Id, u32 fileSizeKB )
  96. {
  97. int i; u8 *tmpMem;
  98. u32 flashSize = fileSizeKB * 1024; // original is KB
  99. dbgMsg( "[initFlashTempMem] Flash%d : %dKB\n", Id, fileSizeKB );
  100. tmpMem = (u8*) malloc( flashSize );
  101. if( tmpMem == NULL )
  102. {
  103. errMsg( " malloc flashTempMem failed!\n" );
  104. return NULL;
  105. }
  106. for( i = 0; i < flashSize; i += 16 )
  107. memcpy ( tmpMem+i , G_FLASH_ENCODE_FFFF_4DW, 16 );
  108. return tmpMem;
  109. }
  110. bool mallocFlashTempMem()
  111. {
  112. codeTmpMem = initFlashTempMem( 0, (CONFIG_CODE_FLASH_SIZE > 8192)?CONFIG_CODE_FLASH_SIZE:8192 );
  113. if( codeTmpMem == NULL ) return false;
  114. if( !loadBasicImageToFlashTempMem( codeTmpMem, BASEIMAGE_CODEBIN ) ) return false;
  115. #if( CONFIG_DATA_FLASH_SIZE != 0 )
  116. dataTmpMem = initFlashTempMem( 1, CONFIG_DATA_FLASH_SIZE );
  117. if( dataTmpMem == NULL ) return false;
  118. if( !loadBasicImageToFlashTempMem( dataTmpMem, BASEIMAGE_DATABIN ) ) return false;
  119. #else
  120. dataTmpMem = 0;
  121. #endif
  122. return true;
  123. }
  124. #if 0
  125. static u8* getMergeFlashTempMem( unsigned long flashAddr )
  126. {
  127. u8 *memTmp = NULL;
  128. u32 id = getNorFlashID( flashAddr );
  129. if( id == 0 ) memTmp = codeTmpMem;
  130. else if( id == 1 ) memTmp = dataTmpMem;
  131. if( memTmp ) memTmp += getNorFlashOffset( flashAddr );
  132. return memTmp;
  133. }
  134. #endif
  135. void writeToFlashTempFile( const char *fileName, u8 *memOut, u32 memSize )
  136. {
  137. FILE *fp;
  138. dbgMsg( "[writeToFlashTempFile] %s\n", fileName );
  139. fp = fopen( fileName, "wb" );
  140. if (fp == NULL)
  141. return;
  142. fwrite( memOut, 1, memSize, fp );
  143. fclose( fp );
  144. }
  145. //-------------------------------------------------------------------------------
  146. int getFileSize( const char* fileName )
  147. {
  148. FILE *fp = fopen( fileName, "rb" );
  149. if( fp == NULL ) return -1;
  150. fseek( fp, 0, SEEK_END );
  151. u32 fileSize = ftell( fp );
  152. fclose( fp );
  153. return fileSize;
  154. }
  155. static inline FILE* openMergeSource( const char *fileName, bool isAllowSkip )
  156. {
  157. FILE *fp = fopen( fileName, "rb" );
  158. if( fp != NULL ) return fp;
  159. if( isAllowSkip ) showMsg( "[Skip] File (%s) is not exist!\n", fileName );
  160. else errMsg( "openMergeSource failed (%s)\n", fileName );
  161. return NULL;
  162. }
  163. static inline int checkMergeSourceSize( const char* sourceFile, int fileSize, int flashSize )
  164. {
  165. if( (flashSize != 0) && (fileSize > flashSize) )
  166. {
  167. if( flashSize >= 1024 )
  168. {
  169. flashSize = ROUND_KB(flashSize);
  170. fileSize = ROUND_KB(fileSize);
  171. }
  172. errMsg( "File's(%s) size Over flashSize limit!! ( %d > %d )\n", sourceFile, fileSize, flashSize );
  173. return -1;
  174. }
  175. if( fileSize == 0 ) showMsg( "[Skip] File's (%s) size is zero\n", sourceFile );
  176. return fileSize;
  177. }
  178. //-------------------------------------------------------------------------------
  179. typedef struct _MergeInfoOut
  180. {
  181. bool skip; // for DBG_SKIP_NOT_EXIST or fileSize = 0
  182. FILE *fpIn;
  183. u8 *memIn; /* If (fpIn) not point to *.bin */
  184. u8 *memOut;
  185. u8 *memOut2;
  186. int cpySize;
  187. int cpySize2;
  188. } MergeInfoOut;
  189. //-------------------------------------------------------------------------------
  190. // transfer *.ini to memory
  191. //-------------------------------------------------------------------------------
  192. #include "pnlset2bin.h"
  193. bool checkFileNameExtension( const char *fileName, const char *wildcard )
  194. {
  195. int i ;
  196. bool ret = true;
  197. int FileNameLength = strlen(fileName);
  198. int WildcardLength = strlen(wildcard);
  199. const char *extension = fileName + FileNameLength - WildcardLength;
  200. if( FileNameLength <= WildcardLength ) ret = false;
  201. for( i = 0; ret && (i < WildcardLength) ; i++ )
  202. {
  203. char c = tolower( extension[i] );
  204. if( c != wildcard[i] ) ret = false;
  205. }
  206. if( !ret )
  207. {
  208. dbgMsg( "checkFileNameExtension failed : %s, wildcard: %s\n", fileName, wildcard );
  209. return false;
  210. }
  211. return true;
  212. }
  213. bool transferPanelSetFileToMemory( u8* memOut, NorFlashModuleInfo *info )
  214. {
  215. int ret = false;
  216. u32 flashSize = info->flashSize1 + info->flashSize2;
  217. if( checkFileNameExtension( info->fileName, ".ini" ) )
  218. {
  219. showMsg( "[transferPanelSetFileToMemory] %s\n", info->fileName );
  220. ret = ini2binmem( info->fileName, (char*) memOut , flashSize);
  221. if(ret > 0)
  222. ret = true;
  223. }
  224. return ret;
  225. }
  226. int syscmd( const char * format, ... )
  227. {
  228. char cmd[256];
  229. va_list arg;
  230. va_start( arg, format );
  231. vsprintf( cmd, format, arg );
  232. va_end( arg );
  233. showMsg("[CMD]: %s \n",cmd);
  234. return system(cmd);
  235. }
  236. int JPG2Bin( const char *szFileIn, const char *szFileOut )
  237. {
  238. bool ret;
  239. u32 fileSize = getFileSize( szFileIn );
  240. FILE *fpOut = fopen( szFileOut, "wb" );
  241. if (fpOut == NULL)
  242. return 0;
  243. fwrite( &fileSize, 1, sizeof(u32), fpOut );
  244. ret = copyFileContent( fpOut, szFileIn, fileSize );
  245. fclose( fpOut );
  246. return ret;
  247. }
  248. bool transferLogoFileToMemory( u8* memOut, NorFlashModuleInfo *info )
  249. {
  250. int ret = false;
  251. u32 fileSize=0;
  252. u32 flashSize = info->flashSize1 + info->flashSize2;
  253. if( checkFileNameExtension( info->fileName, ".bmp" ) )
  254. {
  255. showMsg( "[transferLogoFileToMemory] %s\n", info->fileName );
  256. ret = BMP2Bin( info->fileName, FILENAME_LOGOTMP );
  257. if( syscmd( "gzip %s", FILENAME_LOGOTMP ) ) ret = false;
  258. }
  259. else if( checkFileNameExtension( info->fileName, ".jpg" ) )
  260. {
  261. showMsg( "[transferLogoFileToMemory] %s\n", info->fileName );
  262. ret = JPG2Bin( info->fileName, FILENAME_LOGOGZTMP );
  263. }
  264. if( ret )
  265. {
  266. ret = copyFileToMemory( memOut, FILENAME_LOGOGZTMP, flashSize );
  267. if( !ret )
  268. errMsg( "[transferLogoFileToMemory] Size is too large after transfer!!! ( %d KB > %d KB )\n", fileSize, flashSize );
  269. }
  270. removeTempFile( FILENAME_LOGOTMP );
  271. removeTempFile( FILENAME_LOGOGZTMP );
  272. return ret;
  273. }
  274. #ifdef CONFIG_MULTITABLE //2012.11.27 for multiable included, gaia
  275. int mt_main(char* filename, char* output_mtname, char* output_flagname);
  276. bool transferMultiTableToMemory( u8* memOut, NorFlashModuleInfo *info )
  277. {
  278. int ret = false;
  279. // char cmd[256];
  280. u32 flashSize = info->flashSize1 + info->flashSize2;
  281. if( checkFileNameExtension( info->fileName, ".ini" ) )
  282. {
  283. showMsg( "[transferMultiTableToMemory] %s\n", info->fileName );
  284. //sprintf( cmd, "./MULTITABLE/multitable ./%s", info->fileName );
  285. //syscmd( cmd );
  286. if(mt_main( info->fileName, FILENAME_MULTITABLETMP, FILENAME_MULTIFLAGTMP)==0)
  287. {
  288. //set MODULENAME_MT_FLAG is valid
  289. NorFlashModuleInfo *moduleInfo = searchModuleInfo( MODULENAME_MT_FLAG );
  290. moduleInfo->isValid = true;
  291. strcpy( moduleInfo->fileName, FILENAME_MULTIFLAGTMP);
  292. ret = true;
  293. }
  294. }
  295. if( ret )
  296. {
  297. ret = copyFileToMemory( memOut, FILENAME_MULTITABLETMP, flashSize );
  298. if( !ret )
  299. errMsg( "[transferMultiTableToMemory] Size is too large after transfer!!! ( > %d KB )\n", flashSize );
  300. }
  301. removeTempFile( FILENAME_MULTITABLETMP );
  302. return ret;
  303. }
  304. bool copyMultiFlagToMemory( u8* memOut, NorFlashModuleInfo *info )
  305. {
  306. int ret = false;
  307. // char cmd[256];
  308. u32 flashSize = info->flashSize1 + info->flashSize2;
  309. showMsg( "[copyMultiFlagToMemory] %s\n", info->fileName );
  310. ret = copyFileToMemory( memOut, FILENAME_MULTIFLAGTMP, flashSize );
  311. if( !ret )
  312. errMsg( "[transferLogoFileToMemory] Size is too large after transfer!!! ( > %d KB )\n", flashSize );
  313. removeTempFile( FILENAME_MULTIFLAGTMP );
  314. return ret;
  315. }
  316. #endif
  317. #if 0
  318. u8* transferFileToMemory ( NorFlashModuleInfo *info )
  319. {
  320. int ret = 0;
  321. u32 flashSize = info->flashSize1 + info->flashSize2;
  322. u8 *mem = malloc( flashSize );
  323. if( mem == NULL )
  324. {
  325. errMsg( "[transferFileToMemory] allocate memory failed\n" );
  326. return NULL;
  327. }
  328. if( !strcmp( info->moduleName, MODULENAME_PANELSET) )
  329. {
  330. ret = transferPanelSetFileToMemory( mem, info );
  331. }
  332. else if( !strcmp( info->moduleName, MODULENAME_EXTRAPANELSET1) )
  333. {
  334. ret = transferPanelSetFileToMemory( mem, info );
  335. }
  336. else if( !strcmp( info->moduleName, MODULENAME_EXTRAPANELSET2) )
  337. {
  338. ret = transferPanelSetFileToMemory( mem, info );
  339. }
  340. else if( !strcmp( info->moduleName, MODULENAME_EXTRAPANELSET3) )
  341. {
  342. ret = transferPanelSetFileToMemory( mem, info );
  343. }
  344. else if( !strcmp( info->moduleName, MODULENAME_LOGO) )
  345. {
  346. ret = transferLogoFileToMemory( mem, info );
  347. }
  348. #ifdef CONFIG_MULTITABLE//2012.11.27 for multiable included, gaia
  349. else if( !strcmp( info->moduleName, MODULENAME_MULTITABLE) )
  350. {
  351. ret = transferMultiTableToMemory( mem, info );
  352. }
  353. else if( !strcmp( info->moduleName, MODULENAME_MT_FLAG) )
  354. {
  355. ret = copyMultiFlagToMemory( mem, info );
  356. }
  357. #endif
  358. if( ret == false )
  359. {
  360. free(mem);
  361. mem = NULL;
  362. errMsg( "[%s] can't not support this file format: %s", info->moduleName, info->fileName );
  363. }
  364. return mem;
  365. }
  366. //-------------------------------------------------------------------------------
  367. #endif
  368. static inline void releaseMergeInfoOut( MergeInfoOut *out )
  369. {
  370. if( out->fpIn ) fclose( out->fpIn );
  371. if( out->memIn ) free( out->memIn );
  372. }
  373. static inline void showFlashInfo( u32 flashAddr, u32 flashSize )
  374. {
  375. dbgMsg( " =>[Flash%d] Offset: 0x%08x, Size: %d KB\n",
  376. getNorFlashID( flashAddr ) ,getNorFlashOffset( flashAddr ), ROUND_KB( flashSize ) );
  377. }
  378. #if 0
  379. bool getMergeInfo( MergeInfoOut *out, NorFlashModuleInfo *info )
  380. {
  381. bool ret = true;
  382. bool isAllowSkip = DBG_SKIP_NOT_EXIST;
  383. int fileSize = getFileSize( info->fileName );
  384. u32 flashSize = info->flashSize1 + info->flashSize2;
  385. dbgMsg( "[%s] getMergeInfo\n", info->moduleName );
  386. dbgMsg( " =>FileName: %s (%d KB)\n", info->fileName, ROUND_KB( fileSize ) );
  387. showFlashInfo( info->flashAddr1, info->flashSize1 );
  388. if( info->flashAddr2 ) showFlashInfo( info->flashAddr2, info->flashSize2 );
  389. if( !info->isValid ) return false;
  390. out->skip = false;
  391. out->fpIn = NULL;
  392. out->memIn = NULL;
  393. if( checkFileNameExtension( info->fileName, ".bin" ) || checkFileNameExtension( info->fileName, ".dsc" ) )
  394. {
  395. out->fpIn = openMergeSource( info->fileName, isAllowSkip );
  396. if( out->fpIn == NULL )
  397. {
  398. ret = false;
  399. out->skip = isAllowSkip;
  400. }
  401. out->cpySize = checkMergeSourceSize( info->fileName, fileSize, flashSize );
  402. if( out->cpySize <= 0 )
  403. {
  404. ret = false;
  405. if( out->cpySize == 0 ) out->skip = true;
  406. }
  407. }
  408. else
  409. {
  410. out->cpySize = info->flashSize1 + info->flashSize2;
  411. out->memIn = transferFileToMemory( info );
  412. if( out->memIn == NULL ) ret = false;
  413. }
  414. out->memOut = getMergeFlashTempMem( info->flashAddr1 );
  415. if( out->memOut == NULL ) ret = false;
  416. if( info->flashAddr2)
  417. {
  418. if( out->cpySize > info->flashSize1 )
  419. {
  420. out->cpySize2 = out->cpySize - info->flashSize1;
  421. out->cpySize = info->flashSize1;
  422. }
  423. out->memOut2 = getMergeFlashTempMem( info->flashAddr2 );
  424. if(out->memOut2 == NULL) ret = false;
  425. }
  426. else
  427. {
  428. out->cpySize2 = 0;
  429. out->memOut2 = NULL;
  430. }
  431. if( out->skip ) ret = true;
  432. if( !ret ) releaseMergeInfoOut( out );
  433. return ret;
  434. }
  435. #endif
  436. #if 0
  437. bool mergeToBinCrossFlash( NorFlashModuleInfo *moduleInfo )
  438. {
  439. bool ret = true;
  440. MergeInfoOut infoOut;
  441. ret = getMergeInfo( &infoOut, moduleInfo );
  442. if( !ret ) return false;
  443. if( !infoOut.skip )
  444. {
  445. if( infoOut.memIn != NULL )
  446. {
  447. memcpy( infoOut.memOut, infoOut.memIn, infoOut.cpySize );
  448. memcpy( infoOut.memOut2, infoOut.memIn + infoOut.cpySize, infoOut.cpySize2 );
  449. }
  450. else
  451. {
  452. ret = moveFileContent( infoOut.memOut, infoOut.fpIn, infoOut.cpySize );
  453. if( ret && infoOut.cpySize2 ) ret = moveFileContent( infoOut.memOut2, infoOut.fpIn, infoOut.cpySize2 );
  454. }
  455. }
  456. releaseMergeInfoOut( &infoOut );
  457. return ret;
  458. }
  459. #endif
  460. //-------------------------------------------------------------------------------
  461. #if 0
  462. bool calculateImageValidSize( u32 *codeValidSizeKB, u32 *dataValidSizeKB )
  463. {
  464. int action = 0;
  465. bool ret = true;
  466. MergeInfoOut infoOut;
  467. NorFlashModuleInfo *moduleInfo = &flashModuleInfo[MODULE_KERNEL];//searchModuleInfo(MODULE_KERNEL);
  468. if( moduleInfo == NULL ) return false;
  469. if( SPI_IS_WITH_NANDFLASH ) /* don't do that for Nand-flash case ... */
  470. {
  471. *codeValidSizeKB = CONFIG_CODE_FLASH_SIZE;
  472. *dataValidSizeKB = CONFIG_DATA_FLASH_SIZE;
  473. return true;
  474. }
  475. /*
  476. action = 0 : Effective flash size. ( Specified kernel module reference file)
  477. action = 1 : totally flash size without kernel. ( kernel content is protected or reference invalid file )
  478. action = 2 : basic image's flash size. ( kernel module will refer to basic image. )
  479. */
  480. if( moduleInfo->isProtected ) action = 1;
  481. else if( !moduleInfo->isValid ) action = isLoadBasicPacket() ? 2 : 1;
  482. if( action )
  483. {
  484. u32 removeKernelSize;
  485. dbgMsg( "calculateImageValidSize: skip Kernel\n");
  486. removeKernelSize= ROUND_KB( moduleInfo->flashAddr1 - SPI_CODEFLASH_BASEADDR );
  487. if( action == 2 )
  488. {
  489. int basicDataImageSize = ROUND_KB( getFileSize(BASEIMAGE_DATABIN) );
  490. *codeValidSizeKB = ROUND_KB( getFileSize(BASEIMAGE_CODEBIN) );
  491. *dataValidSizeKB = ( basicDataImageSize > 0 ) ? basicDataImageSize : 0;
  492. }
  493. else if( action == 1 )
  494. {
  495. *codeValidSizeKB = removeKernelSize;
  496. *dataValidSizeKB = 0;
  497. }
  498. if( *codeValidSizeKB <= removeKernelSize ) moduleInfo->isProtected = true;
  499. return true;
  500. }
  501. ret = getMergeInfo( &infoOut, moduleInfo );
  502. if( !ret ) return false;
  503. if( infoOut.cpySize2 )
  504. {
  505. *codeValidSizeKB = CONFIG_CODE_FLASH_SIZE;
  506. *dataValidSizeKB = ROUND_KB( infoOut.cpySize2 );
  507. }
  508. else
  509. {
  510. *codeValidSizeKB = ROUND_KB( moduleInfo->flashAddr1 + infoOut.cpySize - SPI_CODEFLASH_BASEADDR );
  511. *dataValidSizeKB = 0;
  512. }
  513. releaseMergeInfoOut( &infoOut );
  514. return true;
  515. }
  516. #endif
  517. //-------------------------------------------------------------------------------
  518. #define BACKUP_CHECK_MAGIC (0xA110C001)
  519. #define BACKUP_MAGIC_LENGTH (4)
  520. #if 0 //gaia, remove featrue 2013.04.23
  521. bool mergeToBin_Backup64K()
  522. {
  523. u8 *memOut; u8 *memIn;
  524. u32 magicNumber = BACKUP_CHECK_MAGIC;
  525. u32 sourceFlashAddr = SPI_MEMALLOCINFO_FLASHADDR;
  526. u32 targetFlashAddr = SPI_MEMALLOCBACKUP_FLASHADDR;
  527. dbgMsg( "[CreateBackup64K] 0x%08x => 0x%08x\n", sourceFlashAddr, targetFlashAddr );
  528. memIn = getMergeFlashTempMem( sourceFlashAddr );
  529. memOut = getMergeFlashTempMem( targetFlashAddr );
  530. if( (memIn == NULL) || (memOut == NULL) ) return false;
  531. memcpy( memIn+0xfffc, &magicNumber, BACKUP_MAGIC_LENGTH );
  532. memcpy( memOut, memIn, 64*1024 );
  533. return true;
  534. }
  535. bool mergeToBin_BackupRRT()
  536. {
  537. #if( SPI_RRTTABLE2_FLASHSIZE != 0 )
  538. u8 *memOut; u8 *memIn;
  539. u32 sourceFlashAddr = ALIGNMENT( SPI_RRTTABLE_FLASHADDR, 64*1024 );
  540. u32 targetFlashAddr = SPI_RRTTABLE2_FLASHADDR;
  541. dbgMsg( "[CreateBackupRRT] 0x%08x => 0x%08x\n", sourceFlashAddr, targetFlashAddr );
  542. memIn = getMergeFlashTempMem( sourceFlashAddr );
  543. memOut = getMergeFlashTempMem( targetFlashAddr );
  544. if( (memIn == NULL) || (memOut == NULL) ) return false;
  545. memcpy( memOut, memIn, SPI_RRTTABLE2_FLASHSIZE );
  546. #endif
  547. return true;
  548. }
  549. #endif
  550. //-------------------------------------------------------------------------------
  551. bool mergeToBin_GenerateOption(char *output_name)
  552. {
  553. #if defined(OP_IRCommandType)
  554. u32 memSize = sizeof(CUSTIMIZATION_TABLE);
  555. //u8 *memIn = (u8*) &OptionData;
  556. //u8 *memOut = getMergeFlashTempMem( SPI_OPTIONDATA_FLASHADDR );
  557. showMsg( "[GenerateOption] \n" );
  558. #if 0
  559. if( SPI_OPTIONDATA_FLASHSIZE < memSize )
  560. {
  561. errMsg( "Option (%x Bytes) > %x Bytes\n", memSize, SPI_OPTIONDATA_FLASHSIZE); return false;
  562. }
  563. #endif
  564. if( GetOptionData() != 0 ) // generate OptionData content
  565. {
  566. errMsg( "GetOptionData failed\n"); return false;
  567. }
  568. FILE *fpOut = fopen( output_name, "wb" );
  569. fwrite( &OptionData, 1, memSize, fpOut );
  570. fclose( fpOut );
  571. //memcpy( memOut, memIn, memSize );
  572. #endif
  573. return true;
  574. }
  575. //-------------------------------------------------------------------------------
  576. bool mergeToBin_GenerateUMFDefaultSetting()
  577. {
  578. bool ret = true;
  579. #if defined(CONFIG_UMFSWMERGE)
  580. u8 *memOut1 = getMergeFlashTempMem( SPI_MENUDEFAULT_FLASHADDR );
  581. syscmd( "./umfSWMergeAP" );
  582. // TODO: parsing multiTable data, and write it to memory
  583. if( ret )
  584. ret = copyFileToMemory( memOut1 , FILENAME_MENUDFTTMP, SPI_MENUDEFAULT_FLASHSIZE );
  585. removeTempFile( FILENAME_MENUDFTTMP );
  586. #ifndef CONFIG_MULTITABLE
  587. /*copy PQ defaul data to flash*/
  588. u8 *memOut_PQ_DF = getMergeFlashTempMem(SPI_PICTUREDEFAULT_FLASHADDR);
  589. if( ret )
  590. ret &= copyFileToMemory(memOut_PQ_DF , FILENAME_PQDFTTMP, SPI_PICTUREDEFAULT_FLASHSIZE );
  591. removeTempFile(FILENAME_PQDFTTMP);
  592. /*copy AQ defaul data to flash*/
  593. u8 *memOut_AQ_DF = getMergeFlashTempMem(SPI_AUDIODEFAULT_FLASHADDR);
  594. if( ret )
  595. ret &= copyFileToMemory(memOut_AQ_DF , FILENAME_AQDFTTMP, SPI_AUDIODEFAULT_FLASHSIZE );
  596. removeTempFile(FILENAME_AQDFTTMP);
  597. /*copy Color Temp defaul data to flash*/
  598. u8 *memOut_ColorTemp_DF = getMergeFlashTempMem(SPI_COLORTEMP_FLASHADDR);
  599. if( ret )
  600. ret &= copyFileToMemory(memOut_ColorTemp_DF , FILENAME_ColorTempDFTTMP, SPI_COLORTEMPDEFAULT_FLASHSIZE );
  601. removeTempFile(FILENAME_ColorTempDFTTMP);
  602. #endif
  603. #endif
  604. return ret;
  605. }