generateBin.c 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
  1. //---------------------------------------------------------------------------
  2. #include "generateBin.h"
  3. #include "generateSave.h"
  4. #include "generateOutput.h"
  5. #include "drv_spi_sfs.h"
  6. #include <sys/stat.h>
  7. #include <sys/types.h>
  8. #include <fcntl.h>
  9. #ifdef CONFIG_DISABLE_CIKEY_HDCPKEY_SPI_ENCRYPT
  10. #define HDCP_KEY_SIZE (588)
  11. #define HDCP2X_KEY_SIZE (588)
  12. #define CIPLUS_KEY_DATA_SIZE (10240)
  13. extern void do_spi_decrypt(char *, unsigned int, unsigned int);
  14. #endif
  15. //---------------------------------------------------------------------------
  16. extern bool copyFileToMemory( u8 *memOut, const char *fileName, int maxSize );
  17. extern void writeToFlashTempFile( const char *fileName, u8 *memOut, u32 memSize );
  18. extern bool checkFileNameExtension( const char *fileName, const char *wildcard );
  19. extern int BMP2Bin(char *szFileIn, char *szFileOut);
  20. extern int JPG2Bin( const char *szFileIn, const char *szFileOut );
  21. extern int ini2binmem(char* pInFile, char *pOutData, int nBufSize);
  22. extern int syscmd( const char * format, ... );
  23. //---------------------------------------------------------------------------
  24. #if 0
  25. static inline bool generateFlashTempFile()
  26. {
  27. int i;
  28. for( i = 0; i < MODULE_MAX; i++ )
  29. {
  30. if( !flashModuleInfo[i].isValid ) continue;
  31. if( !mergeToBinCrossFlash( &flashModuleInfo[i] ) ) return false;
  32. }
  33. if( !mergeToBin_GenerateOption() ) return false;
  34. if( !mergeToBin_GenerateUMFDefaultSetting() ) return false;
  35. #if 0//gaia, remove featrue 2013.04.23
  36. if( !mergeToBin_Backup64K() ) return false;
  37. if( !mergeToBin_BackupRRT() ) return false;
  38. #endif
  39. return true;
  40. }
  41. #endif
  42. static unsigned int get_lzma_uncompressed_size(char *bin_name)
  43. {
  44. int i, fd, ret;
  45. unsigned int unpack_size;
  46. unsigned char tmp_buf[64];
  47. unsigned char offset = 0;
  48. fd = open(bin_name,O_RDONLY);
  49. if (fd < 0)
  50. return 0;
  51. ret = read(fd, tmp_buf, 64);
  52. if (ret <= 0) {
  53. close(fd);
  54. return 0;
  55. } else {
  56. close(fd);
  57. }
  58. unpack_size = 0;
  59. #ifdef CONFIG_SUPPORT_PROJECT_ID
  60. /* the header format is: the size of whole panel bin(2bytes) |Reserved byte(1Byte)| panel id(1byte) | Panel Name(38Bytes) | real data of panel bin(rest bytes) */
  61. /* for GammaTable, VIPTable, CLUTTable, there will be 42 bytes header */
  62. #define HEADER_SIZE (42)
  63. char *p = strrchr(bin_name, '/');
  64. if (p != NULL && (!strncmp(p+1, "GAMMATABLE.bin", strlen(p+1))
  65. || !strncmp(p+1, "VIPTABLE.bin", strlen(p+1))
  66. || !strncmp(p+1, "COLORLUT.bin", strlen(p+1))))
  67. {
  68. offset = HEADER_SIZE;
  69. }
  70. #endif
  71. for (i = 0;i < 8; i++) {
  72. unpack_size += (tmp_buf[5+i+offset]<<(i*8));
  73. }
  74. return unpack_size;
  75. }
  76. static unsigned int get_table_shaodw_size(char *pattern_str)
  77. {
  78. char pattern_buf[128];
  79. char cmd_buf[128];
  80. FILE *pfile;
  81. char *ref_file;
  82. char *ref_file1 = "../boot/include/rom_def.h";
  83. char *ref_file2 = "../drivers/module_include/drv_spi_flashalloc_internal.h";
  84. if (!strcmp(pattern_str,"SPI_Custable_ShadowSize"))
  85. ref_file = ref_file2;
  86. else
  87. ref_file = ref_file1;
  88. memset(pattern_buf, 0, 128);
  89. memset(cmd_buf, 0, 128);
  90. sprintf(cmd_buf,"sed -n 's/#define\\s\\+%s\\s\\+\\(\\S\\+\\)/\\1/p' %s",pattern_str,ref_file);
  91. pfile = popen(cmd_buf, "r");
  92. if (fgets(pattern_buf, 128, pfile) != NULL) {
  93. pclose(pfile);
  94. } else {
  95. return 0;
  96. }
  97. sprintf(cmd_buf,"python -c 'print %s'",pattern_buf);
  98. pfile = popen(cmd_buf, "r");
  99. memset(pattern_buf, 0 ,128);
  100. if (fgets(pattern_buf, 128, pfile) != NULL) {
  101. pclose(pfile);
  102. return (unsigned int)atoi(pattern_buf);
  103. } else {
  104. return 0;
  105. }
  106. }
  107. static void __check_table_shaodw_size(char *bin_name, char *pattern_str)
  108. {
  109. unsigned int unpack_size;
  110. unsigned int shaodw_size;
  111. char *ref_file;
  112. char *ref_file1 = "boot/include/rom_def.h";
  113. char *ref_file2 = "drivers/module_include/drv_spi_flashalloc_internal.h";
  114. if (!strcmp(pattern_str,"SPI_Custable_ShadowSize"))
  115. ref_file = ref_file2;
  116. else
  117. ref_file = ref_file1;
  118. shaodw_size = get_table_shaodw_size(pattern_str);
  119. unpack_size = get_lzma_uncompressed_size(bin_name);
  120. if ( shaodw_size < unpack_size) {
  121. printf("\033[31;43m%s error!(real:%d shaodw:%d)\nPlease modify %s\n#define %s\033[0m\n",pattern_str,unpack_size,shaodw_size, ref_file, pattern_str);
  122. exit(-1);
  123. }
  124. }
  125. void check_table_shaodw_size(void)
  126. {
  127. int i;
  128. for (i=0; i < MODULE_MAX; i++) {
  129. if (!strncmp(flashModuleInfo[i].moduleName, "Custable", TAG_LENGTH)) {
  130. __check_table_shaodw_size(flashModuleInfo[i].tmpBinName, "SPI_Custable_ShadowSize");
  131. }
  132. if (!strncmp(flashModuleInfo[i].moduleName, "GammaTable", TAG_LENGTH)) {
  133. __check_table_shaodw_size(flashModuleInfo[i].tmpBinName, "GammaTable_ShaodwSize");
  134. }
  135. if (!strncmp(flashModuleInfo[i].moduleName, "VIPTable", TAG_LENGTH)) {
  136. __check_table_shaodw_size(flashModuleInfo[i].tmpBinName, "VipTable_ShadowSize");
  137. }
  138. if (!strncmp(flashModuleInfo[i].moduleName, "CLUPTable", TAG_LENGTH)) {
  139. __check_table_shaodw_size(flashModuleInfo[i].tmpBinName, "ColorLUTTable_ShaodwSize");
  140. }
  141. }
  142. }
  143. static inline bool generateEncryptFlashBin( const char *tmp, const char *final )
  144. {
  145. if( sisspi_encrypt( tmp, final, true ) )
  146. {
  147. errMsg( "encrypt failed\n"); return false;
  148. }
  149. return true;
  150. }
  151. static bool generateFinalFlashBin( const char *tmp, const char *final, const char *save )
  152. {
  153. bool ret = true;
  154. dbgMsg( "[generateFinalFlashBin] %s (%c)\n", final, MI_ENCRYPT_FLASH_BIN ? 'e' : 'd' );
  155. ret = generateEncryptFlashBin( tmp, FILENAME_ENCRYPTTMP );
  156. #if 0
  157. if( miGenerateOriginalBinFlag ) copyToOutputFolder( save, FILENAME_ENCRYPTTMP );
  158. #endif
  159. rename( MI_ENCRYPT_FLASH_BIN ? FILENAME_ENCRYPTTMP : tmp, final );
  160. //removeTempFile( MI_ENCRYPT_FLASH_BIN ? tmp : FILENAME_ENCRYPTTMP );
  161. return ret;
  162. }
  163. #ifdef CONFIG_SUPPORT_FLASH_MODULE_CRC_CHECK
  164. void CalculatEachModuleCRC(u8 *raw_data, u32 data_size)
  165. {
  166. int module_size;
  167. mtab_head_s *flash_head;
  168. char *current_ptr;
  169. char module_name[TAG_LENGTH+1];
  170. //calculate bootrom crc
  171. current_ptr = (char *)raw_data;
  172. module_size = *(u32 *)(current_ptr+8);
  173. flash_head = (mtab_head_s *)(raw_data+SPI_OUIBOOTINFO_ADDR);
  174. flash_head->crc = memCRC32(current_ptr, module_size);
  175. current_ptr += module_size;
  176. //calculate each module crc
  177. do {
  178. memset(module_name, '\0', TAG_LENGTH+1);
  179. memcpy(module_name, current_ptr, TAG_LENGTH);
  180. module_size = *(u32 *)(current_ptr+TAG_LENGTH);
  181. flash_head = (mtab_head_s *)current_ptr;
  182. flash_head->crc = memCRC32(current_ptr+sizeof(mtab_head_s), module_size-sizeof(mtab_head_s));
  183. current_ptr += module_size;
  184. }while( strncmp("NVM",module_name,TAG_LENGTH) );
  185. }
  186. void FillEachModuleDataSize(u8 *raw_data, u32 data_size)
  187. {
  188. int i,module_size;
  189. mtab_head_s *flash_head;
  190. char *current_ptr;
  191. struct stat st;
  192. char module_name[TAG_LENGTH+1];
  193. //skip bootrom data size
  194. current_ptr = (char *)raw_data;
  195. module_size = *(u32 *)(current_ptr+8);
  196. current_ptr += module_size;
  197. //calculate each module crc
  198. do {
  199. memset(module_name, '\0', TAG_LENGTH+1);
  200. memcpy(module_name, current_ptr, TAG_LENGTH);
  201. module_size = *(u32 *)(current_ptr+TAG_LENGTH);
  202. flash_head = (mtab_head_s *)current_ptr;
  203. for (i=0; i < MODULE_MAX; i++)
  204. if (!strncmp(flashModuleInfo[i].moduleName, module_name, TAG_LENGTH))
  205. break;
  206. if ( i < MODULE_MAX) {
  207. if ((i != MODULE_END) && (i != MODULE_NVM)){
  208. stat(flashModuleInfo[i].tmpBinName, &st);
  209. flash_head->data_size = st.st_size;
  210. }
  211. }
  212. current_ptr += module_size;
  213. }while( strncmp("NVM",module_name,TAG_LENGTH) );
  214. }
  215. #endif //CONFIG_SUPPORT_FLASH_MODULE_CRC_CHECK
  216. #if 0
  217. bool generateFlashBin()
  218. {
  219. bool ret = true;
  220. dbgMsg( "\ngenerateFlashBin ==>\n" );
  221. if( !mallocFlashTempMem() ) return false;
  222. ret = generateFlashTempFile();
  223. freeFlashTempMem();
  224. if( !ret ) return false;
  225. ret = generateFinalFlashBin( FILENAME_CODETMP, FILENAME_CODEBIN, miCodeBinName );
  226. #if( CONFIG_DATA_FLASH_SIZE != 0 )
  227. if( ret ) ret = generateFinalFlashBin( FILENAME_DATATMP, FILENAME_DATABIN, miDataBinName );
  228. #endif
  229. return ret;
  230. }
  231. #endif
  232. #if 0
  233. #define TAG_LENGTH 12
  234. typedef struct _mtab_head_s
  235. {
  236. char sys_tag[TAG_LENGTH]; /* write by createRomBin tool */
  237. unsigned int size;
  238. }mtab_head_s;
  239. #endif
  240. static void cpy_mtab_head( char* buffer, char* sys_tag, int filesize)
  241. {
  242. mtab_head_s mtab_head;
  243. memset(&mtab_head, 0, sizeof(mtab_head_s));
  244. strncpy(mtab_head.sys_tag, sys_tag, TAG_LENGTH);
  245. mtab_head.size = ROUND_16B_ALIGNMENT(filesize) + sizeof(mtab_head_s);
  246. memcpy(buffer, &mtab_head, sizeof(mtab_head_s));
  247. }
  248. #ifdef CONFIG_SUPPORT_NVM_PRELOAD
  249. bool sfs_dispatch(u16 id, void* src, void* des, int size)
  250. {
  251. int write_offset =0;
  252. u8 sn = 0;
  253. u8* buff = (void *)malloc(SFS_page_size); //2013.05.10, buffer for DMA, care alignment
  254. if (buff == NULL)
  255. return false;
  256. oob_st* oob = (oob_st *)(&buff[SFS_data_size]);
  257. dbgMsg( "sfs_dispatch %d(%d bytes)\n", id, size);
  258. while(write_offset < size)
  259. {
  260. oob->id = id;
  261. oob->sn = sn;
  262. oob->offset = (write_offset/SFS_data_size);
  263. oob->len = ((size % SFS_data_size) == 0)? (size/SFS_data_size): (size/SFS_data_size+1);
  264. oob->Magic = SFS_MagicNum;
  265. memcpy(buff, (void *)((u32)src+write_offset), SFS_data_size);/*Warning, if remain size < pagesize, other space out of data will unknow */
  266. memcpy(des, buff, SFS_page_size);
  267. write_offset += SFS_data_size;
  268. des += SFS_page_size;
  269. }
  270. //dbgMsg("<--\n");
  271. free(buff);
  272. return true;
  273. }
  274. bool transfer2sfs(u16 id, char* out_filename, char* in_filename)
  275. {
  276. FILE *OutFile, *InFile;
  277. char *rbuff,*wbuff,*ptr;
  278. size_t result;
  279. int i,chksum=0x0,infile_size = getFileSize(in_filename);
  280. if (infile_size <= 0) {
  281. return false;
  282. }
  283. InFile = fopen(in_filename,"rb");
  284. OutFile = fopen(out_filename,"ab+");
  285. if(OutFile == NULL || InFile == NULL){
  286. fprintf(stderr, "Can't open will write/read file\n");
  287. if (InFile) fclose(InFile);
  288. if (OutFile) fclose(OutFile);
  289. return false;
  290. }
  291. rbuff = (char*) malloc(SFS_Size);
  292. if (rbuff == NULL) {
  293. fclose(InFile);
  294. fclose(OutFile);
  295. return false;
  296. }
  297. memset(rbuff,0,SFS_Size);
  298. result = fread(rbuff,1,infile_size,InFile);
  299. if(result != infile_size){
  300. fputs ("Reading error",stderr);
  301. fclose(InFile);
  302. fclose(OutFile);
  303. free(rbuff);
  304. return false;
  305. }
  306. wbuff = (char*)malloc(SFS_Size);
  307. if (wbuff == NULL) {
  308. fclose(InFile);
  309. fclose(OutFile);
  310. free(rbuff);
  311. return false;
  312. }
  313. memset(wbuff,0,SFS_Size);
  314. if(id == SPI_KMFSHARE_FLASHID){
  315. sfs_dispatch(id, rbuff, wbuff, infile_size);
  316. ptr=wbuff;
  317. for(i=0;i<infile_size;i++, ptr++){
  318. chksum += *ptr;
  319. }
  320. *ptr=chksum;
  321. dbgMsg("chksum 0x%x\n", *ptr);
  322. fwrite (wbuff , sizeof(char), (infile_size/SFS_page_size+1)*SFS_page_size, OutFile);
  323. }else{
  324. #if 1
  325. char *tmp = (char*)malloc(SFS_Size);
  326. if (tmp == NULL) {
  327. fclose(InFile);
  328. fclose(OutFile);
  329. free(rbuff);
  330. free(wbuff);
  331. return false;
  332. }
  333. memset(tmp,0,SFS_Size);
  334. //*(char *)tmp = infile_size;
  335. memcpy(tmp ,rbuff, infile_size);
  336. sfs_dispatch(id, tmp, wbuff, infile_size);
  337. fwrite(wbuff , sizeof(char), ((infile_size)/SFS_page_size+1)*SFS_page_size, OutFile);
  338. free (tmp);
  339. #endif
  340. }
  341. fclose (OutFile);
  342. fclose (InFile);
  343. free (wbuff);
  344. free (rbuff);
  345. return true;
  346. }
  347. #endif
  348. //FlashTableStr FlashTable[MODULE_MAX] = {0};
  349. //int FlashTableIdx = 0;
  350. extern u8 *codeTmpMem;
  351. bool MergeBins2Mem(void)
  352. {
  353. int i, fileSize;
  354. bool ret = true;
  355. //FILE* tmpbin;
  356. u32 ACC_Offset = 0x00000000; //start offset
  357. u32 flashSize = CONFIG_CODE_FLASH_SIZE *1024 ; //flash size
  358. float fRealFlashSize = 0;
  359. u32 keys_phy_addr = 0;
  360. u32 last_module_offset = 0;
  361. u32 last_module_size = 0;
  362. u32 max_size = 0;
  363. #ifdef CONFIG_SUPPORT_NVM_PRELOAD
  364. char sfs_tempfile[] = "sfs/nvm.bin";
  365. #endif
  366. #ifdef CONFIG_DISABLE_CIKEY_HDCPKEY_SPI_ENCRYPT
  367. char *decrypt_tmp;
  368. #endif
  369. check_table_shaodw_size();
  370. if( !mallocFlashTempMem() ) return false;
  371. /* initial key start offset */
  372. #define SIMFS_PHYADDR (SPI_SIMFS_FLASHADDR & 0x00ffffff)
  373. keys_phy_addr = CONFIG_FLASH_KEYSTORAGE_END_OFFSET + EDID_RELATEADDR;
  374. /* scan all modules */
  375. showMsg( "******* FlashMap *******\nAddress \tSize \tName \tPath\n");
  376. for( i = 0; i < MODULE_MAX; i++ )
  377. {
  378. if( !flashModuleInfo[i].isValid ) continue;
  379. /* fopen input file */
  380. fileSize = getFileSize(flashModuleInfo[i].tmpBinName);
  381. max_size = flashModuleInfo[i].max_module_size*1024;
  382. if ((max_size != 0) && (fileSize > max_size)){
  383. errMsg("Module %s size(%d) large than max size(%d)\n",flashModuleInfo[i].moduleName, fileSize, max_size);
  384. return false;
  385. }
  386. fileSize = max_size? max_size:fileSize;
  387. if((i == MODULE_END) || (i == MODULE_NVM))
  388. fileSize = 0x7fffffff;
  389. if( fileSize < 0 ){
  390. #if !DBG_SKIP_NOT_EXIST
  391. errMsg( "getFileSize failed (%s)\n", flashModuleInfo[i].tmpBinName );//isAllowSkip?
  392. return false;
  393. #else
  394. errMsg( "file not found, skip (%s)\n", flashModuleInfo[i].tmpBinName );//isAllowSkip?
  395. continue;
  396. #endif
  397. }
  398. if(((ACC_Offset + fileSize) > flashSize)
  399. && (i != MODULE_END) && (i != MODULE_NVM)){
  400. errMsg("FiashSize is %d, ACC_Offset(0x%x(%d)) + filesize(%d) = %d, Over FlashSize %d B\n",
  401. flashSize, ACC_Offset, ACC_Offset, fileSize, ACC_Offset+fileSize, ACC_Offset+fileSize-flashSize);
  402. return false;
  403. }
  404. switch(i){
  405. //fix address start here..
  406. case MODULE_BOOTROM: //bootrom @ 0xbc000000..+? byte, No header
  407. copyFileToMemory(&codeTmpMem[ACC_Offset], flashModuleInfo[i].tmpBinName, fileSize);
  408. showMsg( "0x%08x\t%d\t%s\t%s\n", ACC_Offset, fileSize, flashModuleInfo[i].moduleName, flashModuleInfo[i].tmpBinName);
  409. ACC_Offset += ROUND_16B_ALIGNMENT(fileSize);
  410. break;
  411. case MODULE_OPTION: //option @ 0xbc011000..+0x200 & No header
  412. dbgMsg( "%d copyFileToMemory %s %d\n",i, flashModuleInfo[i].tmpBinName, fileSize );
  413. copyFileToMemory(&codeTmpMem[SPI_OPTION_DATA_ADDR], (const char*)flashModuleInfo[i].tmpBinName, SPI_OPTION_DATA_SIZE);
  414. showMsg( "0x%08x \t%d\t%s\t%s\n", SPI_OPTION_DATA_ADDR,SPI_OPTION_DATA_SIZE, flashModuleInfo[i].moduleName, flashModuleInfo[i].tmpBinName);
  415. break;
  416. case MODULE_OUIBOOTINFO: //oui info @ 0xbc011200..+0x30
  417. dbgMsg( "%d copyFileToMemory %s %d\n",i, flashModuleInfo[i].tmpBinName, fileSize );
  418. cpy_mtab_head((char*)&codeTmpMem[SPI_OUIBOOTINFO_ADDR], flashModuleInfo[i].moduleName, fileSize);
  419. copyFileToMemory(&codeTmpMem[SPI_OUIBOOTINFO_ADDR+FLASH_HEAD_SIZE], flashModuleInfo[i].tmpBinName, 0x30);
  420. showMsg( "0x%08x \t48\t%s\t%s\n", SPI_OUIBOOTINFO_ADDR, flashModuleInfo[i].moduleName, flashModuleInfo[i].tmpBinName);
  421. break;
  422. case MODULE_EDID: //edid @ (NVM - 12K)..+0x380
  423. {
  424. /* check size first */
  425. int tmp = keys_phy_addr - ACC_Offset;
  426. if ( tmp < 0) {
  427. printf( "\n\n** ERROR!!! Code Size Overflow (%d bytes)! **\n\n", tmp);
  428. return false;
  429. }
  430. /* extend the module before keys to key offset. */
  431. //showMsg( "last_module_offset %x\n", last_module_offset);
  432. /* add POOP */
  433. mtab_head_s *mtab_head = (mtab_head_s *)(&codeTmpMem[last_module_offset]);
  434. last_module_size = mtab_head->size;
  435. cpy_mtab_head((char*)&codeTmpMem[last_module_offset + mtab_head->size], "NOOP", 0x10);
  436. mtab_head_s *mtab_headS = (mtab_head_s *)(&codeTmpMem[last_module_offset + mtab_head->size ]);
  437. mtab_headS->size = (CONFIG_FLASH_KEYSTORAGE_END_OFFSET + EDID_RELATEADDR)-(last_module_offset+last_module_size);
  438. showMsg( "=== MainCode Size 0x%08x ===\n\t%s\n", last_module_offset + mtab_head->size, "NOOP");
  439. /* copy header */
  440. dbgMsg( "%d copyFileToMemory %s %d\n", i, flashModuleInfo[i].tmpBinName, fileSize );
  441. cpy_mtab_head((char*)&codeTmpMem[keys_phy_addr], flashModuleInfo[i].moduleName, EDID_SIZE);
  442. copyFileToMemory(&codeTmpMem[keys_phy_addr+FLASH_HEAD_SIZE], flashModuleInfo[i].tmpBinName, EDID_SIZE);
  443. showMsg( "0x%08x \t%d\t%s\t%s\n", keys_phy_addr, fileSize, flashModuleInfo[i].moduleName, flashModuleInfo[i].tmpBinName);
  444. keys_phy_addr += EDID_SIZE + FLASH_HEAD_SIZE;
  445. break;
  446. }
  447. case MODULE_HDCPKEY: //hdcp @ (edid_addr)..+0x280
  448. dbgMsg( "%d copyFileToMemory %s %d\n",i, flashModuleInfo[i].tmpBinName, fileSize );
  449. cpy_mtab_head((char*)&codeTmpMem[keys_phy_addr], flashModuleInfo[i].moduleName, HDCPKEY_SIZE);
  450. copyFileToMemory(&codeTmpMem[keys_phy_addr+FLASH_HEAD_SIZE], flashModuleInfo[i].tmpBinName, HDCPKEY_SIZE);
  451. #ifdef CONFIG_DISABLE_CIKEY_HDCPKEY_SPI_ENCRYPT
  452. decrypt_tmp = malloc(((HDCP_KEY_SIZE+15)>>4)<<4);
  453. memcpy((void *)decrypt_tmp, (void *)&codeTmpMem[keys_phy_addr+0x10], HDCP_KEY_SIZE);
  454. do_spi_decrypt(decrypt_tmp, (((HDCP_KEY_SIZE+15)>>4)<<4), 0);
  455. memcpy((void *)&codeTmpMem[keys_phy_addr+FLASH_HEAD_SIZE], (void *)decrypt_tmp, HDCP_KEY_SIZE);
  456. free(decrypt_tmp);
  457. #endif
  458. showMsg( "0x%08x \t%d\t%s\t%s\n", keys_phy_addr, fileSize, flashModuleInfo[i].moduleName, flashModuleInfo[i].tmpBinName);
  459. keys_phy_addr += HDCPKEY_SIZE + FLASH_HEAD_SIZE;
  460. break;
  461. #ifdef CONFIG_AUTO_WB
  462. case MODULE_WBDATA:
  463. dbgMsg( "%d copyFileToMemory %s %d\n",i, flashModuleInfo[i].tmpBinName, fileSize );
  464. cpy_mtab_head((char*)&codeTmpMem[keys_phy_addr], flashModuleInfo[i].moduleName, WBDATA_SIZE);
  465. copyFileToMemory(&codeTmpMem[keys_phy_addr+FLASH_HEAD_SIZE], flashModuleInfo[i].tmpBinName, WBDATA_SIZE);
  466. showMsg( "0x%08x \t%d\t%s\t%s\n", keys_phy_addr, fileSize, flashModuleInfo[i].moduleName, flashModuleInfo[i].tmpBinName);
  467. keys_phy_addr += WBDATA_SIZE + FLASH_HEAD_SIZE;
  468. break;
  469. #endif
  470. #ifdef CONFIG_SUPPORT_STORE_HDCP2X_TO_FLASH
  471. case MODULE_HDCP2XKEY:
  472. dbgMsg( "%d copyFileToMemory %s %d\n",i, flashModuleInfo[i].tmpBinName, fileSize );
  473. cpy_mtab_head((char*)&codeTmpMem[keys_phy_addr], flashModuleInfo[i].moduleName, HDCP2XKEY_SIZE);
  474. copyFileToMemory(&codeTmpMem[keys_phy_addr+FLASH_HEAD_SIZE], flashModuleInfo[i].tmpBinName, HDCP2XKEY_SIZE);
  475. #ifdef CONFIG_DISABLE_CIKEY_HDCPKEY_SPI_ENCRYPT
  476. decrypt_tmp = malloc(((HDCP2X_KEY_SIZE+15)>>4)<<4);
  477. memcpy((void *)decrypt_tmp, (void *)&codeTmpMem[keys_phy_addr+0x10], HDCP2X_KEY_SIZE);
  478. do_spi_decrypt(decrypt_tmp, (((HDCP2X_KEY_SIZE+15)>>4)<<4), 0);
  479. memcpy((void *)&codeTmpMem[keys_phy_addr+FLASH_HEAD_SIZE], (void *)decrypt_tmp, HDCP2X_KEY_SIZE);
  480. free(decrypt_tmp);
  481. #endif
  482. showMsg( "0x%08x \t%d\t%s\t%s\n", keys_phy_addr, fileSize, flashModuleInfo[i].moduleName, flashModuleInfo[i].tmpBinName);
  483. keys_phy_addr += HDCP2XKEY_SIZE + FLASH_HEAD_SIZE;
  484. break;
  485. #endif
  486. #ifdef CONFIG_CI_SUPPORT
  487. case MODULE_CIKEY: //hdcp @ (hdcpy_addr)..+? ( max 10740)
  488. dbgMsg( "%d copyFileToMemory %s %d\n",i, flashModuleInfo[i].tmpBinName, fileSize );
  489. cpy_mtab_head((char*)&codeTmpMem[keys_phy_addr], flashModuleInfo[i].moduleName, fileSize);
  490. copyFileToMemory(&codeTmpMem[keys_phy_addr+FLASH_HEAD_SIZE], flashModuleInfo[i].tmpBinName, fileSize);
  491. #ifdef CONFIG_DISABLE_CIKEY_HDCPKEY_SPI_ENCRYPT
  492. do_spi_decrypt((char *)&codeTmpMem[keys_phy_addr+FLASH_HEAD_SIZE], CIPLUS_KEY_DATA_SIZE, 0);
  493. #endif
  494. showMsg( "0x%08x \t%d\t%s\t%s\n", keys_phy_addr, fileSize, flashModuleInfo[i].moduleName, flashModuleInfo[i].tmpBinName);
  495. keys_phy_addr += fileSize + FLASH_HEAD_SIZE;
  496. break;
  497. #endif
  498. case MODULE_END:
  499. { //code end, just the last module before NVM
  500. int the_range_between_end_and_nvm = (SIMFS_PHYADDR-FLASH_HEAD_SIZE)-keys_phy_addr-FLASH_HEAD_SIZE;
  501. dbgMsg( "%d copyFileToMemory %s %d\n",i, flashModuleInfo[i].moduleName, fileSize );
  502. ACC_Offset = keys_phy_addr; //end = keys end..
  503. cpy_mtab_head((char*)&codeTmpMem[ACC_Offset], flashModuleInfo[i].moduleName, the_range_between_end_and_nvm);
  504. showMsg( "0x%08x \t\t%s\n", ACC_Offset, flashModuleInfo[i].moduleName);
  505. ACC_Offset += ROUND_16B_ALIGNMENT(sizeof(mtab_head_s));
  506. break;
  507. }
  508. case MODULE_NVM:
  509. {
  510. #ifdef CONFIG_SUPPORT_NVM_PRELOAD
  511. int c;
  512. c=system("rm sfs/nvm.bin");
  513. for (c = 0; c < gNVMData_count; c++) {
  514. if (!transfer2sfs( gNVMData[c].id, sfs_tempfile, gNVMData[c].pathName)){
  515. printf( "\nERROR!!! transfer2sfs fail!!!\n");
  516. return false;
  517. }
  518. }
  519. int outfile_size = getFileSize(sfs_tempfile);
  520. dbgMsg( "%d copyFileToMemory %s %d\n",i, sfs_tempfile, outfile_size);
  521. cpy_mtab_head((char*)&codeTmpMem[SIMFS_PHYADDR-FLASH_HEAD_SIZE], flashModuleInfo[i].moduleName, outfile_size);
  522. copyFileToMemory(&codeTmpMem[SIMFS_PHYADDR], sfs_tempfile , outfile_size);
  523. showMsg( "0x%08x \t%d\tNVM\t%s\n", SIMFS_PHYADDR-FLASH_HEAD_SIZE, outfile_size, "sfs/nvm.bin");
  524. ACC_Offset = SIMFS_PHYADDR + outfile_size;
  525. #else
  526. cpy_mtab_head((char*)&codeTmpMem[SIMFS_PHYADDR-FLASH_HEAD_SIZE], flashModuleInfo[i].moduleName, 0);
  527. ACC_Offset = SIMFS_PHYADDR;
  528. #endif
  529. break;
  530. }
  531. //dynamic address start here..
  532. default:
  533. last_module_offset = ACC_Offset;
  534. cpy_mtab_head((char*)&codeTmpMem[ACC_Offset], flashModuleInfo[i].moduleName, fileSize);
  535. ACC_Offset += sizeof(mtab_head_s);
  536. copyFileToMemory(&codeTmpMem[ACC_Offset], flashModuleInfo[i].tmpBinName, fileSize);
  537. showMsg( "0x%08x \t%d\t%s\t%s\n", ACC_Offset-sizeof(mtab_head_s), fileSize, flashModuleInfo[i].moduleName, flashModuleInfo[i].fileName);
  538. ACC_Offset += ROUND_16B_ALIGNMENT(fileSize);
  539. break;
  540. }
  541. }
  542. /* check size */
  543. showMsg( "End offset %x\n", ACC_Offset);
  544. fRealFlashSize = (float)ACC_Offset / 1024.0 / 1024.0;
  545. showMsg( "Real BIN size=%.2fM\n", fRealFlashSize);
  546. //write to flash temp file
  547. #ifdef CONFIG_SUPPORT_FLASH_MODULE_CRC_CHECK
  548. FillEachModuleDataSize(codeTmpMem, ACC_Offset);
  549. CalculatEachModuleCRC(codeTmpMem, ACC_Offset);
  550. #endif
  551. writeToFlashTempFile( FILENAME_CODETMP, codeTmpMem, ACC_Offset );
  552. free( codeTmpMem );
  553. ret = generateFinalFlashBin( FILENAME_CODETMP, FILENAME_CODEBIN, miCodeBinName );
  554. #if( CONFIG_DATA_FLASH_SIZE != 0 )
  555. if( ret ) ret = generateFinalFlashBin( FILENAME_DATATMP, FILENAME_DATABIN, miDataBinName );
  556. #endif
  557. #ifdef CONFIG_APPEND_NAME_TO_CIKEY_HDCPKEY
  558. #ifdef CONFIG_CI_SUPPORT
  559. removeTempFile(flashModuleInfo[MODULE_CIKEY].tmpBinName);
  560. #endif
  561. removeTempFile(flashModuleInfo[MODULE_HDCPKEY].tmpBinName);
  562. #ifdef CONFIG_SUPPORT_STORE_HDCP2X_TO_FLASH
  563. removeTempFile(flashModuleInfo[MODULE_HDCP2XKEY].tmpBinName);
  564. #endif
  565. #endif
  566. return ret;
  567. }
  568. bool transferPnelSet2Bin(char* out_filename, char* pnl_ini_name)
  569. {
  570. #define MAX_PNLSET_SIZE 2048
  571. FILE *OutFile;
  572. char* buff;
  573. int size;
  574. buff = malloc(MAX_PNLSET_SIZE); // max panelset bin file size 2k.
  575. if (buff == NULL)
  576. return false;
  577. size = ini2binmem(pnl_ini_name, buff, MAX_PNLSET_SIZE);
  578. //get writed size
  579. if(size < 0) {
  580. free(buff);
  581. return false;
  582. }
  583. OutFile = fopen(out_filename,"wb");
  584. if (OutFile == NULL) {
  585. fprintf(stderr, "Can't open will write file\n");
  586. free(buff);
  587. return false;
  588. }
  589. fwrite(buff, size, 1, OutFile);
  590. fclose(OutFile);
  591. free(buff);
  592. #undef MAX_PNLSET_SIZE
  593. return true;
  594. }
  595. //bool transferLogo2Bin( u8* memOut, NorFlashModuleInfo *info )
  596. bool transferLogo2Bin(char* out_filename, char* input_name)
  597. {
  598. int ret = false;
  599. showMsg( "[transferLogoFileToMemory] %s\n", input_name );
  600. if( checkFileNameExtension( input_name, ".bmp" ) )
  601. {
  602. ret = BMP2Bin( input_name, FILENAME_LOGOTMP );
  603. if( syscmd( "./../tools/lzma460/lzma e %s %s", FILENAME_LOGOTMP, FILENAME_LOGOGZTMP ) )
  604. {
  605. ret = false;
  606. }
  607. if( syscmd( "mv %s %s ", FILENAME_LOGOGZTMP, out_filename ) )
  608. {
  609. ret = false;
  610. }
  611. }
  612. else if( checkFileNameExtension( input_name, ".jpg" ) || \
  613. checkFileNameExtension( input_name, ".mp3" ) || \
  614. checkFileNameExtension( input_name, ".jpeg" ))
  615. {
  616. ret = JPG2Bin( input_name, out_filename );
  617. }
  618. return ret;
  619. }
  620. bool transferCustable2GZIPBin(char* out_filename, char* input_name)
  621. {
  622. int ret = true;
  623. //char* out_file[30];
  624. showMsg( "[transferCustomertable2lzma] %s\n", input_name );
  625. if( checkFileNameExtension( input_name, ".bin" ) )
  626. {
  627. if(syscmd("./../tools/lzma460/lzma e %s %s",input_name,FILENAME_CUSTABLEGZTMP))
  628. {
  629. ret = false;
  630. }
  631. if( syscmd( "mv %s %s ", FILENAME_CUSTABLEGZTMP, out_filename ) )
  632. {
  633. ret = false;
  634. }
  635. }
  636. return ret;
  637. }
  638. bool genTempBinFiles()
  639. {
  640. int i, ret = true;
  641. #ifdef CONFIG_APPEND_NAME_TO_CIKEY_HDCPKEY
  642. int char_read;
  643. char buffer[1024];
  644. char tempstring[] = "temp";
  645. char temp[512];
  646. FILE *f_in, *f_out;
  647. #endif
  648. //char outname[32];
  649. dbgMsg( "genTempBinFiles..\n" );
  650. for( i = 0; i < MODULE_MAX; i++ )
  651. {
  652. //transfer all ini files
  653. if( !flashModuleInfo[i].isValid )
  654. continue;
  655. #if 0 // if not support Multi-panel bin file
  656. //if get PanelSet.ini
  657. if( i == MODULE_PANELSET ){
  658. sprintf(flashModuleInfo[i].tmpBinName, "%s.bin", flashModuleInfo[i].moduleName);
  659. ret = transferPnelSet2Bin(flashModuleInfo[i].tmpBinName, flashModuleInfo[i].fileName);
  660. }
  661. //if get ExtraPanelSet1.ini
  662. else if( i == MODULE_EXTRAPANELSET1 ){
  663. sprintf(flashModuleInfo[i].tmpBinName, "%s.bin", flashModuleInfo[i].moduleName);
  664. ret = transferPnelSet2Bin(flashModuleInfo[i].tmpBinName, flashModuleInfo[i].fileName);
  665. }
  666. //if get ExtraPanelSet2.ini
  667. else if( i == MODULE_EXTRAPANELSET2 ){
  668. sprintf(flashModuleInfo[i].tmpBinName, "%s.bin", flashModuleInfo[i].moduleName);
  669. ret = transferPnelSet2Bin(flashModuleInfo[i].tmpBinName, flashModuleInfo[i].fileName);
  670. }
  671. //if get ExtraPanelSet3.ini
  672. else if( i == MODULE_EXTRAPANELSET3 ){
  673. sprintf(flashModuleInfo[i].tmpBinName, "%s.bin", flashModuleInfo[i].moduleName);
  674. ret = transferPnelSet2Bin(flashModuleInfo[i].tmpBinName, flashModuleInfo[i].fileName);
  675. }
  676. //Logo
  677. else if( i == MODULE_LOGO ){
  678. #endif
  679. #if 0
  680. else if( i == MODULE_OPTION){
  681. sprintf(flashModuleInfo[i].tmpBinName, "%s.bin", flashModuleInfo[i].moduleName);
  682. if( !mergeToBin_GenerateOption(flashModuleInfo[i].tmpBinName) )
  683. return false;
  684. }
  685. #endif
  686. else if( i == MODULE_CUSTABLE){
  687. sprintf(flashModuleInfo[i].tmpBinName, "%s.bin", flashModuleInfo[i].moduleName);
  688. if( !transferCustable2GZIPBin(flashModuleInfo[i].tmpBinName, flashModuleInfo[i].fileName) )
  689. return false;
  690. }
  691. #ifdef CONFIG_APPEND_NAME_TO_CIKEY_HDCPKEY
  692. else if(0||
  693. #ifdef CONFIG_CI_SUPPORT
  694. ( i == MODULE_CIKEY ) ||
  695. #endif
  696. ( i == MODULE_HDCPKEY)||
  697. #ifdef CONFIG_SUPPORT_STORE_HDCP2X_TO_FLASH
  698. ( i == MODULE_HDCP2XKEY)||
  699. #endif
  700. 0){
  701. strcpy(temp, flashModuleInfo[i].fileName);
  702. strcat(temp , tempstring);
  703. f_in = fopen (flashModuleInfo[i].fileName, "rb");
  704. if(f_in == NULL)
  705. {
  706. showMsg( "\nCan not find module binfile: %s\n", flashModuleInfo[i].fileName);
  707. return false;
  708. }
  709. f_out = fopen (temp, "wb");
  710. if (f_out == NULL)
  711. {
  712. fclose(f_in);
  713. return false;
  714. }
  715. while(!feof(f_in)) {
  716. char_read=fread(buffer, 1, 32, f_in);
  717. fwrite(buffer,1, char_read, f_out);
  718. }
  719. fseek(f_out, 0, SEEK_END);
  720. fwrite(flashModuleInfo[i].eachfileName, 1, (int)32, f_out);
  721. fclose(f_in);
  722. fclose(f_out);
  723. sprintf(flashModuleInfo[i].tmpBinName, "%s", temp);
  724. }
  725. #endif
  726. else{
  727. //just copy fileName to tmpBinName
  728. if(checkFileNameExtension( flashModuleInfo[i].fileName, ".jpg" ) || \
  729. checkFileNameExtension( flashModuleInfo[i].fileName, ".mp3" ) || \
  730. checkFileNameExtension( flashModuleInfo[i].fileName, ".jpeg" ) || \
  731. checkFileNameExtension( flashModuleInfo[i].fileName, ".bmp" ) ){
  732. showMsg( "use %s %s\n", flashModuleInfo[i].moduleName, flashModuleInfo[i].fileName );
  733. sprintf(flashModuleInfo[i].tmpBinName, "%s.bin", flashModuleInfo[i].moduleName);
  734. ret = transferLogo2Bin(flashModuleInfo[i].tmpBinName, flashModuleInfo[i].fileName);
  735. }else{ //bmp or jpeg
  736. showMsg( "use %s\n", flashModuleInfo[i].fileName );
  737. snprintf(flashModuleInfo[i].tmpBinName, sizeof(flashModuleInfo[i].tmpBinName), "%s", flashModuleInfo[i].fileName);
  738. }
  739. }
  740. }
  741. #if 0 //todo
  742. if( !mergeToBin_GenerateUMFDefaultSetting() ) return false;
  743. #endif
  744. /**/
  745. return ret;
  746. }