REFLASHER.C
上传用户:super_houu
上传日期:2008-09-21
资源大小:4099k
文件大小:32k
源码类别:

DVD

开发平台:

Others

  1. /****************************************************************************************
  2.  *  Copyright (c) 2002 ZORAN Corporation, All Rights Reserved
  3.  *  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
  4.  *
  5.  *  File: $Workfile: REFLASHER.C $             
  6.  *
  7.  * Description: Interface for creating and manipulating a generic Array.
  8.  * ============
  9.  * 
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 25 $
  14.  * Last Modified by $Author: Mikex $ at $Modtime: 04-04-02 19:23 $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /I76/I76_Common/I76_Reference/Playcore/Download/REFLASHER.C $
  19.  * 
  20.  * 25    04-04-03 15:13 Mikex
  21.  * add the option about save keys to eeprom
  22.  * 
  23.  * 24    04-04-01 23:33 Mikex
  24.  * added HDCP key and DVD-AUDIO key download support
  25.  * 
  26.  * 23    4/01/04 10:47a Jimmyp
  27.  * Include Hdcp_keys.h
  28.  * 
  29.  * 22    3/31/04 4:44p Jimmyp
  30.  * For HDCP update feature
  31.  * 
  32.  * 21    3/19/04 5:03p Terencet
  33.  * fixed can't CD update because of set SDRAM semphore twice
  34.  * 
  35.  * 20    3/01/04 6:28p Lotan
  36.  * merge with Divx certification DB
  37.  * 
  38.  * 19    11/03/03 6:06p Nmaurer
  39.  * Add protection against ilegal request margins
  40.  * 
  41.  * 18    10/30/03 6:07p Leslie
  42.  * Define NBR_SECTORS_AT_A_TIME as NBR_CACHED_CDSECT to speed up CD-Update
  43.  * 
  44.  * 17    5/13/03 4:16p Rinata
  45.  * fixed force image 
  46.  * 
  47.  * 16    5/11/03 5:52p Rinata
  48.  * 1. restore PS just before update CD
  49.  * 2. first search for force.img file if found don't replace "feature
  50.  * select"  data
  51.  * 
  52.  * 15    5/06/03 3:38p Rinata
  53.  * put code under UPDATE_CD_WITH_PLAYER_SETTING
  54.  * 
  55.  * 14    5/01/03 5:51p Rinata
  56.  * update code UPDATE_CD_WITH_PLAYER_SETTING
  57.  * 
  58.  * 13    03-04-14 11:23 Leslie
  59.  * Remove margin for Disc Read Block, which is not usefule for I64
  60.  * 
  61.  * 12    2/11/03 8:50p Rinata
  62.  * fixed cd-update return data address value ( the lbn )
  63.  * 
  64.  * 11    1/27/03 10:42p Rinata
  65.  * CD_UPDATE_MULTIPLE_MODELS
  66.  * 
  67.  * 10    03-01-10 12:27 Leslie
  68.  * Memory optimization
  69.  * Update with file-system changes
  70.  * 
  71.  * 8     12/09/02 6:06p Leslie
  72.  * Code cleanup
  73.  * Support Error Message display on screen
  74.  * Change SDRAM BASE Address
  75.  * 
  76.  * 7     10/31/02 17:02 Hamadk
  77.  * 
  78.  * 4     10/24/02 14:28 Hamadk
  79.  * Corrected the address of the SDRAM which is used to hold the image file
  80.  * 
  81.  * 3     10/10/02 14:26 Hamadk
  82.  * Increaced sleep time to enable openning the tray after downloading the
  83.  * bin file to the dram
  84.  * 
  85.  * 2     27/06/02 11:31 Atai
  86.  * merging with 5e golden version
  87.  * 
  88.  * 14    5/28/02 14:15 Rinata
  89.  * add 2 to number of read blocks in discReadBlock in order to avoid bug
  90.  * in Sanyo drive which read error data
  91.  * 
  92.  * 13    5/20/02 11:53 Rinata
  93.  * clean code and add comments
  94.  * 
  95.  * 12    5/19/02 16:10 Rinata
  96.  * remove warnings
  97.  * 
  98.  * 11    5/19/02 15:24 Rinata
  99.  * fix open tray
  100.  * 
  101.  * 10    5/16/02 11:21 Rinata
  102.  * prepare new stack for copy and run function which copy reflsher to
  103.  * scratch pad and run it
  104.  * 
  105.  * 9     5/14/02 14:48 Rinata
  106.  * make fixes in read from SDRAM
  107.  * 
  108.  * 8     5/14/02 8:36 Rinata
  109.  * fixes for reflahser
  110.  * 
  111.  * 7     23/04/02 9:29 Nirm
  112.  * - Added dependency in "Config.h".
  113.  * 
  114.  * 6     2/28/02 10:12 Rinata
  115.  * DiscReadyDownload get image name from update.ver file
  116.  * 
  117.  * 5     3/02/02 12:01 Nirm
  118.  * Switched to using the new File-System.
  119.  * 
  120.  * 4     1/31/02 1:04a Tomasp
  121.  * Changed printf->tr_printf
  122.  * 
  123.  * 3     16/01/02 11:37 Atai
  124.  * Change debug printing
  125.  * 
  126.  * 2     9/01/02 14:52 Nirm
  127.  * Corrected Include-Paths.
  128.  * 
  129.  * 2     9/01/02 14:48 Nirm
  130.  * Corrected Include-Paths.
  131.  * 
  132.  * 1     26/12/01 14:57 Nirm
  133.  ****************************************************************************************/
  134. #include "Config.h" // Global Configuration - do not remove!
  135. #ifdef _DEBUG
  136. #undef IFTRACE
  137. #define IFTRACE if (gTraceCore)
  138. #include "DebugDbgMain.h"
  139. #endif
  140. #include "IncludeSysDefs.h"
  141. #include "CPU/cpu_api.h"
  142. #include "PlaycoreCoremaincoregdef.h"
  143. #include "PlaycoreCoremain/Corenvg.h"
  144. #include "PlaycoreAuxCacheAuxCache.h"
  145. #include "PlaycoreFileSysFileSystem.h"
  146. #include "PlaycoreScPadscmgr.h"
  147. #include "DecoderDecoder.h"
  148. #include "KernelEventDef.h"
  149. #include "Includestring_ex.h"
  150. #include "Customerlib_setuplib_setup.h"
  151. #ifdef SUPPORT_KEYS_UPDATE
  152. #ifdef STORE_KEYS_IN_FLASH
  153. #include "UartStore_keys.h"
  154. #endif//STORE_KEYS_IN_FLASH
  155. #endif
  156. #ifdef EXINO2 // ZKR GL080703
  157. #include "CPUV186treflasherdefs.h"
  158. #endif // EXINO2
  159. #ifdef D_QS_UPGRADE_WAY
  160. #include "customerMercury_Referenceversion.h"
  161. #endif
  162. #define MAX_FILE_NAME_LEN 100
  163. #define NBR_SECTORS_AT_A_TIME (MAX_CACHED_SECTORS - 1)    // Aiden_08_20_2004: The max cached sector one time should be 63
  164. #ifdef DA1_USE_BIG_TRACK_BUFFER // Aiden_11_26_2004: For DA1 Big TB, change the sdram copy address
  165. #define SDRAM_COPY_ADDR_BASE (OSD_BUFFER_SIZE_CD_AUX + VCB_SIZE_CD_AUX + ACB_SIZE_CD_AUX + SPB_SIZE_CD_AUX + APP_BUFFER_SIZE_CD_AUX + NAV_BUFFER_SIZE_CD_AUX)
  166. #define SDRAM_COPY_ADDR ((UINT32)SDRAM_COPY_ADDR_BASE << 9UL) // R1 Start: 2260K = 0x11a800 Words
  167. #else
  168. #define SDRAM_COPY_ADDR (( (UINT32)DEC_LL_VCD_AUX_REF2_START)<<9ul)// 1438K = 0xB3C00 words
  169. #endif
  170. #define BUFF_SIZE 32 // 32 words of 2bytes
  171. #define COUNT_1_SECTOR (1024/BUFF_SIZE) // Number of buff copies to copy one sector
  172. #define SDRAM_ADDRESS_POINTER ((1438L << 9 ) - 10) // 0xB3BF6
  173. #define SD_ADDR_INDICATION 0xF0A1
  174. #define SDRAM_4M_ADDR 0x200000UL
  175. #define MK_FP(seg,ofs) ((void __seg *)(seg) + (void __near *)(ofs))
  176. DWORD g_dwImageFileSize= 0;
  177. DWORD g_dwImageFileAddr = 0;
  178. BOOL discCopyToDram(void);
  179. int DiscReadyDownload(void);
  180. BOOL DiscDownload(void);
  181. extern int drv_tray_open( void );
  182. static void copy_reflsher_and_run(void);
  183. #ifdef UPDATE_CD_WITH_PLAYER_SETTING
  184. static BOOL ReplacePlayerSetting(void);
  185. static BOOL IsImageEOS( unsigned char buff_char );
  186. static BOOL IsPlayerEOS( unsigned char buff_char );
  187. #ifdef FORCE_CD_IMAGE_SETTING_UPDATE
  188. static BOOL IsForceImage = FALSE;
  189. #endif
  190. #endif
  191. #ifdef SUPPORT_KEYS_UPDATE
  192. #ifdef STORE_KEYS_IN_FLASH
  193. static BOOL ReplaceHDCPKeys(void);
  194. #endif//STORE_KEYS_IN_FLASH
  195. #endif
  196. static BYTE _CalcCheckSum(void);
  197. #ifdef AVI_DRM_SUPPORT
  198. #ifdef STORE_PS_DATA_IN_FLASH
  199. extern CONST unsigned char default_factory_settings_signature;
  200. static BOOL _ReplaceDivXDRMMemory(void);
  201. static BOOL _SearchFactorySetting(UINT32 *dwSettingStartAddr, UINT16 *wSettingOffset);
  202. #endif // D_STORE_KEYS_IN_FLASH
  203. #endif // AVI_DRM_SUPPORT
  204. /**********************************************************************************
  205.  Purpose          :  copy image data from disv to SDRAM
  206.  Input Parameters :  lbn - image data in disc start address
  207.  Return Value     :  FALSE if fail - else TRUE
  208.  Comment:   :  SDRAM Start address - 2 bytes - file size
  209.                      - 1 bytes - checksum
  210.                      - Image code
  211. **********************************************************************************/
  212. BOOL discCopyToDram(void)
  213. {
  214. unsigned long offset_t; // Target offset 
  215. unsigned long offset_s; // Source offset  
  216. unsigned long i;
  217. unsigned long count_sum;
  218. unsigned char discsum = 0;
  219. unsigned char buff_s[64];
  220. unsigned short buff_sum[32];
  221. unsigned short *buff_t;
  222. unsigned int file_sectors_size =(int)( (g_dwImageFileSize-1) / 2048);
  223. unsigned int count_lbn = 0;
  224. BOOL b_res = TRUE;
  225. unsigned short retry_cnt = 10;  // need to retry twice at least because decoder may not be initiliaze in proper CD mode 1 or mode 2
  226. unsigned long lbn = g_dwImageFileAddr; 
  227. dbg_printf(("START discCopyToDramn"));
  228.    
  229. /*****************************************************************************
  230. Aiden_11_26_2004: 
  231. Write to the address 0xB3BF6 (SDRAM_ADDRESS_POINTER) the following data:
  232.   0xB3BF6: 0xF0A1
  233.   0xB3BF7: 0xF0A1
  234.   0xB3BF8: sdram_copy_addr_low
  235.   0xB3BF9: sdram_copy_addr_high
  236. In Reflasher code: 
  237. it will read 4 bytes form 0xB3BF6, if first 2 bytes is equal to 0xF0A1,
  238. then it will use the data from 0xB3BF8 and 0xB3BF9 as SDRAM_COPY_ADDR, 
  239. otherwise it will use the address: (1438L << 9 ) as SDRAM_COPY_ADDR
  240. Then we can change the sdram_copy_address easily and no need to compile reflasher.h
  241. ***********************************************************************************/
  242. buff_sum[0] = SD_ADDR_INDICATION;
  243. buff_sum[1] = SD_ADDR_INDICATION;
  244. buff_sum[2] = (SDRAM_COPY_ADDR&0xffff);
  245. buff_sum[3] = (SDRAM_COPY_ADDR>>16)&0xffff;
  246. tr_printf(("SDRAM copy address = 0x%x 0x%xn",buff_sum[3], buff_sum[2]));
  247. if (DEC_WriteDRAMData( SDRAM_ADDRESS_POINTER, buff_sum, 4) != 4){
  248. ie_send_ex(IE_UI_FP_UPDATE_ERROR, (void *)1);
  249. return FALSE;
  250. }
  251.    
  252.     /* write image size */
  253. buff_sum[0] = file_sectors_size & 0xff;
  254. buff_sum[1] = file_sectors_size >> 8;
  255. if (DEC_WriteDRAMData( SDRAM_COPY_ADDR, buff_sum, 2) != 2){
  256. ie_send_ex(IE_UI_FP_UPDATE_ERROR, (void *)1);
  257. return FALSE;
  258. }
  259. /* Start write image to SDRAM */
  260. offset_t = SDRAM_COPY_ADDR+ 3;
  261. while (file_sectors_size) { // Read and copy all the CD .BIN file
  262. if (!(count_lbn % NBR_SECTORS_AT_A_TIME)) {
  263. do{
  264. b_res = TRUE;
  265. DEC_CacheSector(lbn,NBR_SECTORS_AT_A_TIME);
  266. /* ilegal request margins */
  267. if (drv_check_valid_lbn(lbn) == FALSE)
  268. {
  269. b_res = FALSE;
  270. retry_cnt = 0;
  271. }
  272. else
  273. {
  274. AuxCache_DiscReadBlock( lbn, NBR_SECTORS_AT_A_TIME );
  275. b_res = DEC_WaitCacheComplete();
  276. if (!b_res)
  277. retry_cnt--;
  278. }
  279. }while( (!b_res) && retry_cnt);
  280. }
  281. offset_s = 0;
  282. for (i=0;i<32;i++) { // Copy one sector
  283. if (!AuxCache_GetBytes (lbn, offset_s, 64, buff_s)){
  284. ie_send_ex(IE_UI_FP_UPDATE_ERROR, (void *)2);
  285. return FALSE;
  286. }
  287. buff_t = (unsigned short*)buff_s;
  288. if ((offset_t < SDRAM_4M_ADDR) && (offset_t+32 >= SDRAM_4M_ADDR))
  289. {
  290. UINT16 temp_size_low;
  291. UINT16 temp_size_high;
  292.         // Aiden_11_26_2004: if write to SDRAM corss the 4M boundary, HW will write to address 0
  293. // then OSD will crashed, so write it in 2 times.
  294. tr_printf(("nMapping crossing 4M n"));
  295. temp_size_low = SDRAM_4M_ADDR-offset_t;
  296. temp_size_high = offset_t + 32 - SDRAM_4M_ADDR;
  297. if (DEC_WriteDRAMData( offset_t, buff_t, temp_size_low) != temp_size_low){
  298. ie_send_ex(IE_UI_FP_UPDATE_ERROR, (void *)3);
  299. return FALSE;
  300. }
  301. if (DEC_ReadDRAMData( offset_t, buff_sum, temp_size_low) != temp_size_low){
  302. ie_send_ex(IE_UI_FP_UPDATE_ERROR, (void *)4);
  303. return FALSE;
  304. }
  305. if (DEC_WriteDRAMData( SDRAM_4M_ADDR, &buff_t[temp_size_low], temp_size_high) != temp_size_high){
  306. ie_send_ex(IE_UI_FP_UPDATE_ERROR, (void *)3);
  307. return FALSE;
  308. }
  309. if (DEC_ReadDRAMData( SDRAM_4M_ADDR, &buff_sum[temp_size_low], temp_size_high) != temp_size_high){
  310. ie_send_ex(IE_UI_FP_UPDATE_ERROR, (void *)4);
  311. return FALSE;
  312. }
  313. }
  314. else
  315. {
  316. if (DEC_WriteDRAMData( offset_t, buff_t, 32) != 32){
  317. ie_send_ex(IE_UI_FP_UPDATE_ERROR, (void *)3);
  318. return FALSE;
  319. }
  320. if (DEC_ReadDRAMData( offset_t, buff_sum, 32) != 32){
  321. ie_send_ex(IE_UI_FP_UPDATE_ERROR, (void *)4);
  322. return FALSE;
  323. }
  324. }
  325. for (count_sum=0;count_sum<32;count_sum++) {
  326. if (buff_sum[count_sum] != buff_t[count_sum]) {
  327. dbg_printf (("ERROR buff_sum != buff_tn"));
  328. ie_send_ex(IE_UI_FP_UPDATE_ERROR, (void *)5);
  329. return FALSE;
  330. }
  331. discsum += (char)(buff_sum[count_sum] & 0x00FF);
  332. discsum += (char)((buff_sum[count_sum] >> 8) & 0x00FF);
  333. }
  334. offset_s += 64;
  335. offset_t += 32;
  336. }
  337. dbg_printf (("."));
  338. file_sectors_size--;
  339. lbn ++;
  340. count_lbn++;
  341. }
  342. dbg_printf(("nFOUND sum disc"));
  343. if (!AuxCache_GetBytes (lbn, 0, 1, buff_s)) {
  344. ie_send_ex(IE_UI_FP_UPDATE_ERROR, (void *)6);
  345.   dbg_printf(("ERROR can't read disc check sum wordn"));
  346. return FALSE;
  347. }
  348. else {
  349. dbg_printf(("READ sum from discn"));
  350. }
  351. if (discsum != buff_s[0]) {
  352. ie_send_ex(IE_UI_FP_UPDATE_ERROR, (void *)7);
  353.   dbg_printf (("ERROR sdram check sum doens't match disc check sumn"));
  354.   return FALSE;
  355. buff_sum[0] = discsum;
  356. #ifdef UPDATE_CD_WITH_PLAYER_SETTING
  357. #ifdef FORCE_CD_IMAGE_SETTING_UPDATE
  358. if( IsForceImage == FALSE ) // is "feature select" data should be replace ?
  359. #endif
  360. if( ReplacePlayerSetting() == FALSE )
  361. {
  362. return FALSE;
  363. }
  364. else
  365. {
  366. buff_sum[0] = CalcCheckSum();
  367. }
  368. #endif
  369. #ifdef SUPPORT_KEYS_UPDATE
  370. #ifdef STORE_KEYS_IN_FLASH
  371. if( ReplaceHDCPKeys() == FALSE )
  372. {
  373. return FALSE;
  374. }
  375. else
  376. {
  377. tr_printf(("HDCP Keys was restoren"));
  378. buff_sum[0] = _CalcCheckSum();
  379. }
  380. #endif //STORE_KEYS_IN_FLASH
  381. #endif //SUPPORT_KEYS_UPDATE
  382. #ifdef AVI_DRM_SUPPORT
  383. #ifdef STORE_PS_DATA_IN_FLASH
  384. if( _ReplaceDivXDRMMemory() == FALSE )
  385. {
  386. return FALSE;
  387. }
  388. else
  389. {
  390. tr_printf(("DivX DRM Memory was restoren"));
  391. buff_sum[0] = _CalcCheckSum();
  392. }
  393. #endif //D_STORE_KEYS_IN_FLASH
  394. #endif // AVI_DRM_SUPPORT
  395. /* write check sum */
  396. if (DEC_WriteDRAMData( SDRAM_COPY_ADDR+2, buff_sum, 1) != 1){
  397. ie_send_ex(IE_UI_FP_UPDATE_ERROR, (void *)8);
  398. return FALSE;
  399. }
  400. return TRUE;
  401. }
  402. #ifdef UPDATE_CD_WITH_PLAYER_SETTING
  403. /**********************************************************************************
  404.  Purpose          : Search for buff_char character in string_buff until search_index 
  405.   reached to length 
  406.  Input Parameters :  
  407.  Description      : search_index used as the index runnig on the string    
  408.  Return Value     : TRUE - String was found, else FALSE 
  409.  Comment:   :
  410. **********************************************************************************/
  411. extern CONST unsigned char lib_setup_signature[];
  412. extern CONST unsigned char lib_setup_end[]; 
  413. static int search_index = 0;
  414. static BOOL SearchForString(  unsigned char buff_char , CONST unsigned char  *string_buff, int length )
  415. {
  416. if( string_buff[search_index] == buff_char )
  417. {
  418. search_index ++;
  419. if( search_index >= length )
  420. {
  421. // player setting erea found
  422. return TRUE;
  423. }
  424. }
  425. else
  426. {
  427. search_index = 0;
  428. if( string_buff[search_index] == buff_char )
  429. {
  430. search_index ++;
  431. }
  432. return FALSE;
  433. }
  434. /**********************************************************************************
  435.  Purpose          : Search for EOS ( End Of Set ) string using image_eos_index index
  436.  Input Parameters :  
  437.  Description      : image_eos_index used as teh index runnig on the string    
  438.  Return Value     : TRUE - String was found, else FALSE  
  439.  Comment:   :
  440. **********************************************************************************/
  441. static int image_eos_index = 0;
  442. static BOOL IsImageEOS( unsigned char buff_char )
  443. {
  444. if( ( *((&EOS_Macro.endOfSettings0) + image_eos_index) ) == buff_char )
  445. {
  446. image_eos_index ++;
  447. if( image_eos_index >= 10 )  // is all string "END OF SET" found ?
  448. {
  449. // player setting erea found
  450. dbg_printf(("IsImageEOS return TRUE n"));
  451. return TRUE;
  452. }
  453. }
  454. else
  455. {
  456. image_eos_index = 0;
  457. if( ( *((&EOS_Macro.endOfSettings0) + image_eos_index) ) == buff_char )
  458. {
  459. image_eos_index ++;
  460. }
  461. return FALSE;
  462. }
  463. /**********************************************************************************
  464.  Purpose          : Search for EOS ( End Of Set ) string using player_eos_index index
  465.  Input Parameters :  
  466.  Description      : player_eos_index used as the index runnig on the string    
  467.  Return Value     : TRUE - String was found, else FALSE  
  468.  Comment:   :
  469. **********************************************************************************/
  470. static int player_eos_index = 0;
  471. static BOOL IsPlayerEOS( unsigned char buff_char )
  472. {
  473. if( ( *((&EOS_Macro.endOfSettings0) + player_eos_index) ) == buff_char )
  474. {
  475. player_eos_index ++;
  476. if( player_eos_index >= 10 )
  477. {
  478. // player setting erea found
  479. dbg_printf(("IsPlayerEOS return TRUE n"));
  480. return TRUE;
  481. }
  482. }
  483. else
  484. {
  485. player_eos_index = 0;
  486. if( ( *((&EOS_Macro.endOfSettings0) + player_eos_index) ) == buff_char )
  487. {
  488. player_eos_index ++;
  489. }
  490. return FALSE;
  491. }
  492. /**********************************************************************************
  493.  Purpose          : Replace player configuration setting in cd-image with curret player setting 
  494.  Input Parameters :  
  495.  Description      : read cd-image data from SDRAM searching for the "configuration setting"
  496.   data and replace it with the player configuration data.  
  497.   The algorithm to copy the "feature select" erea is :
  498. Copy "feature select" area bits from player until EOS will be found on player 
  499. "feature select" data or on cd-image "feature select" data or FSA end was found.  
  500.  Return Value     : TRUE - replacment successed, else FALSE 
  501.  Comment:   :
  502. **********************************************************************************/
  503. static BOOL ReplacePlayerSetting(void)
  504. {
  505. unsigned int image_sectors_size;
  506. UINT32 dram_addr = SDRAM_COPY_ADDR+3;
  507. UINT32 setting_start_addr = NULL;
  508.     UINT16 i_sectors,i_buff,x;
  509. UINT16 *buff;
  510.     unsigned char buff_s[BUFF_SIZE*2];
  511. int byte_count = 0;
  512.    
  513. buff= (unsigned short*)buff_s;
  514. search_index = 0;  
  515. if (!(DEC_ReadDRAMData(SDRAM_COPY_ADDR, buff, 2) == 2))
  516.     return FALSE;
  517. image_sectors_size = buff[0] + (buff[1] << 8 );
  518. for (i_sectors=0; i_sectors< image_sectors_size ; i_sectors++) { // Process REFLASH_CODE_SIZE CD sectors
  519. for (i_buff=0; i_buff<COUNT_1_SECTOR; i_buff++) { // Copy 1 CD sector
  520.        /* read image from SDRAM */
  521. if (!(DEC_ReadDRAMData(dram_addr, buff, BUFF_SIZE) == BUFF_SIZE))
  522. return FALSE;
  523. // Search for the player setting erea
  524. for( x=0; x < 64; x++)
  525. {         
  526. if( setting_start_addr == NULL )
  527. if( SearchForString(buff_s[x], lib_setup_signature, 33) )
  528. {
  529. dbg_printf(("Find lib_setup_signature n"));
  530. setting_start_addr = dram_addr + (UINT32)x/2;
  531.                    search_index = 0;
  532.                    image_eos_index = 0;
  533.                    player_eos_index = 0;                              
  534. }
  535. }
  536. else
  537. {
  538. BOOL isImageEnd = IsImageEOS( buff_s[x]);
  539. BOOL isPlayerEnd = IsPlayerEOS( *(&lib_setup_signature[33]+byte_count) );
  540. BOOL isFSAEnd = SearchForString(buff_s[x],lib_setup_end, 32);
  541.              byte_count ++;
  542. if( isImageEnd || isPlayerEnd || isFSAEnd )   // Is EOS or FSA end was found ?
  543. {
  544. dbg_printf(("Find FSA or EOS n"));
  545. byte_count = byte_count - 9; // minus size of EOS string     
  546. {                     
  547. UINT32 current_player_setting_size = (&(lib_setup_end[31]) - &(lib_setup_signature[32]))/2;
  548. if(  byte_count/2 <= current_player_setting_size ) // is byte_count offset is before FSA end ?
  549. {
  550. // replace can be done
  551.                          CONST unsigned char *setting_data;
  552.                                dbg_printf(("Start replacement n"));
  553. setting_data = (unsigned char*)(&(lib_setup_signature[32]));
  554.                         
  555.                         if( byte_count/2 < 64 )
  556.                         {
  557.   if (DEC_WriteDRAMData( setting_start_addr, setting_data, byte_count/2) != byte_count/2)                              
  558.                                return FALSE;   
  559.   dbg_printf(("Replace done n"));                               
  560.   return TRUE;                                                                                  
  561.                         }
  562.                         else
  563.                         {
  564.                          // buff size is not enouph - not need it now ...
  565.                            return FALSE;
  566.                         }
  567. }
  568. else
  569. {
  570. return FALSE;
  571. }
  572. }
  573.     break;
  574. }
  575. }
  576. }
  577. // continue reading from SDRAM addressed in words
  578. dram_addr += BUFF_SIZE;
  579. }
  580. }
  581. return TRUE;
  582. }
  583. #endif
  584. /**********************************************************************************
  585.  Purpose          : Calculate check sum 
  586.  Input Parameters : none 
  587.  Description      :     
  588.  Return Value     : checksum number 
  589.  Comment:   :
  590. **********************************************************************************/
  591. static BYTE _CalcCheckSum(void)
  592. {
  593. unsigned int image_sectors_size;
  594. UINT32 dram_addr = SDRAM_COPY_ADDR+3;
  595.     UINT16 i_sectors,i_buff,x;
  596. UINT16 *buff;
  597.    BYTE discsum = 0;
  598.    unsigned char buff_s[BUFF_SIZE*2];      
  599. buff= (unsigned short*)buff_s;
  600.      
  601. buff= (unsigned short*)buff_s;
  602. if (!(DEC_ReadDRAMData(SDRAM_COPY_ADDR, buff, 2) == 2))
  603.     return FALSE;
  604. image_sectors_size = buff[0] + (buff[1] << 8 );
  605. for (i_sectors=0; i_sectors< image_sectors_size ; i_sectors++) { // Process REFLASH_CODE_SIZE CD sectors
  606. for (i_buff=0; i_buff<COUNT_1_SECTOR; i_buff++) { // Copy 1 CD sector
  607.        /* read image from SDRAM and calculate checksum */
  608. if (!(DEC_ReadDRAMData(dram_addr, buff, BUFF_SIZE) == BUFF_SIZE))
  609. return FALSE;
  610.    
  611. for( x=0; x < 64; x++)
  612. {         
  613. discsum += buff_s[x];
  614. }
  615. dram_addr += BUFF_SIZE; // SDRAM addressed in words
  616. }
  617. }
  618. return discsum;
  619. }
  620. /**********************************************************************************
  621.  Purpose          :  
  622.  Input Parameters :  
  623.  Description      :     
  624.  Return Value     :  
  625.  Comment:   :
  626. **********************************************************************************/
  627. #ifdef CD_UPDATE_MULTIPLE_DIRECTORIES
  628. static void SetImageModelPath(WCHAR *ImageDirectory )
  629. {
  630. wcscpy( ImageDirectory, L" ");  // set root directory as default
  631. IFDEF(Decoder_Macro.bNO_ANALOG_6CHANNEL)
  632. // 2 Channel
  633. switch(HW_Macro.eDacType)
  634. {
  635. case CS4392:
  636. wcscpy( ImageDirectory ,L"VADDIS6E\2CH\CS4392");
  637. break;
  638. case AK4382A:
  639. wcscpy( ImageDirectory ,L"VADDIS6E\2CH\AK4382A");
  640. break;
  641. ELSE   // 6 Channel
  642.     switch(HW_Macro.eDacType)
  643. {
  644. case AK4356:
  645. wcscpy( ImageDirectory ,L"VADDIS6E\6CH\AK4356");
  646. break;
  647. case PCM1606:
  648. wcscpy( ImageDirectory ,L"VADDIS6E\6CH\PCM1606");
  649. break;
  650. }
  651. ENDIF
  652. }
  653. #endif //CD_UPDATE_MULTIPLE_DIRECTORIES  
  654. /**********************************************************************************
  655.  Purpose          :  identfy if disc is CD Update
  656.  Input Parameters :  none
  657.  Description      :  search for the file update.ver if exist read from it the 
  658.    image file name
  659.  Return Value     :  return image file start address or FLASE if fail read it
  660.  Comment:   :
  661. **********************************************************************************/
  662. int DiscReadyDownload(void)
  663. {
  664. BOOL   bSuccess= FALSE;
  665. DWORD  dwFileAddr;
  666. LPWSTR pImageFilename;
  667. LPSTR  pszExtension;
  668. UINT16 uFilenameLegth;
  669. UINT16 hFindFile;
  670. FindData fdCDUpdateInfo;
  671. g_dwImageFileSize= 0;
  672. if (! FileSys_selectType(eAny) || ! FileSys_initialize(FALSE)) {
  673. return FALSE;
  674. }
  675. #ifdef D_QS_UPGRADE_WAY
  676. pImageFilename = g_upgrade_file_name;
  677. uFilenameLegth= wcslen((LPCWSTR)g_upgrade_file_name);
  678. #else
  679. FileSys_getFileLocation(L"UPDATE.VER" , &dwFileAddr);
  680. #ifdef CD_UPDATE_MULTIPLE_DIRECTORIES
  681. SetImageModelPath(fdCDUpdateInfo.szFileID);   // set image directory
  682. FileSys_goToRootDir();    // start search path from root directory
  683. FileSys_setPathDelimiter( '\');  
  684. FileSys_changeDir(fdCDUpdateInfo.szFileID); 
  685. /* we reached this point we are in the requested directory or in the root
  686. directory , there should not be any image.bld there */
  687. #endif // CD_UPDATE_MULTIPLE_DIRECTORIES
  688. /* read image file name */
  689.     AuxCache_GetBytes(dwFileAddr, 0, MAX_FILE_NAME_LEN, (BYTE*)fdCDUpdateInfo.szFileID);
  690. pszExtension= strrchr((LPCSTR)fdCDUpdateInfo.szFileID, '.');
  691. if (NULL != pszExtension)
  692. *pszExtension= 0;
  693. uFilenameLegth= strlen((LPCSTR)fdCDUpdateInfo.szFileID);
  694. pImageFilename= (LPWSTR)malloc((1 + uFilenameLegth) * sizeof(WCHAR));
  695.    
  696. if (NULL == pImageFilename)
  697. return FALSE;
  698. _str2wcs((LPCSTR)fdCDUpdateInfo.szFileID, pImageFilename, 
  699.  ((1 + uFilenameLegth) * sizeof(WCHAR)));
  700. #ifdef CD_UPDATE_MULTIPLE_MODELS
  701. // update image name with player UNIQUE_BUILD_ID   
  702.     pImageFilename[uFilenameLegth-1] = 0x30 + (Model_Macro.uniqueBuildID%10);
  703.     pImageFilename[uFilenameLegth-2] = 0x30 + (Model_Macro.uniqueBuildID/10); 
  704. #endif // CD_UPDATE_MULTIPLE_MODELS
  705. #ifdef FORCE_CD_IMAGE_SETTING_UPDATE
  706. /* If update.ver contains the string "force" or "force.img"  it should directly
  707. load force.img to the flash without modifying FSA. */  
  708. IsForceImage = FALSE;   
  709. if (0 == _wcsnicmp( L"force" , pImageFilename, 5))
  710. {
  711. IsForceImage = TRUE;
  712. }
  713. #endif //FORCE_CD_IMAGE_SETTING_UPDATE 
  714. #endif  //D_QS_UPGRADE_WAY
  715.     /* search for Image file name in CD , not sensetive case */
  716.    hFindFile= FileSys_findFirstFile(FILESYS_WILDCARD_SEARCH, &fdCDUpdateInfo);
  717. do
  718. {
  719. if (0 == _wcsnicmp(pImageFilename, fdCDUpdateInfo.szFileID, uFilenameLegth))
  720. {
  721. FileSys_findClose(hFindFile);
  722. g_dwImageFileAddr =  fdCDUpdateInfo.dwStartAddr;
  723. g_dwImageFileSize=   fdCDUpdateInfo.cbFileSizeLow;
  724. bSuccess= TRUE;
  725. break;
  726. }
  727. } while (FileSys_findNextFile(hFindFile, &fdCDUpdateInfo));
  728. // <<< ZKR GL080703 : Support new version string display with firmware upgrade menu.
  729. #ifdef EXINO2
  730. if ( bSuccess )
  731. {
  732. extern CONST char g_pszVersionString[];
  733. DWORD dwLBN;
  734. DWORD dwOffset;
  735. CHAR csVersion[VERSION_STRING_SZ];
  736. DWORD dwVersionOffset = (g_dwImageFileSize-VERSION_STRING_SZ-1L/*CHECKSUM_SZ*/);
  737. dwLBN = g_dwImageFileAddr + ( dwVersionOffset / SECTOR_SIZE );
  738. dwOffset = ( dwVersionOffset % SECTOR_SIZE );
  739. if (!AuxCache_GetBytes(dwLBN, dwOffset, VERSION_STRING_SZ, csVersion)) {
  740. tr_printf(("Can't read the version on CDn"));
  741. return FALSE;
  742. }
  743.         tr_printf(("nCurrent Version : %s", (char *)(g_pszVersionString+VERSION_SIGNATURE_SZ))); 
  744. tr_printf(("nNew Version : %s", csVersion));
  745. if (strlen(csVersion) >= (SC_VERSION_MSG_SZ<<2)) {
  746. tr_printf(("ERROR version strlen >= SC_VERSION_MSG_SZ"));
  747. return FALSE;
  748. }
  749.        // Save new version string into scpad.
  750. csVersion[strlen(csVersion)] = 0;
  751.        // SEC BK.LIM080803: 18 Characters are enabled for version string
  752. sc_SetBytes(SC_VERSION_MSG_ADDR, 0, VERSION_STRING_SZ-14, (BYTE *)csVersion);
  753. }
  754. #endif // EXINO2
  755. // ZKR GL080703 >>>
  756. free(pImageFilename);
  757.    return bSuccess;
  758. }
  759. /**********************************************************************************
  760.  Purpose          : copy image to SDRAM and download reflasher program into scratch pad
  761.  Input Parameters : disc_addr -  start address of image file
  762.  Description      : Copy image to SDRAM , copy reflasher program to RAM and jump to
  763. teh reflasher program which read the image from SDRAM and burn it.
  764.  Return Value     : if successed should never return 
  765.  Comment:   :
  766. **********************************************************************************/
  767. BOOL DiscDownload(void)
  768. {
  769. if (discCopyToDram()) 
  770. {
  771.    BYTE i;
  772.    
  773. #if defined(RESTORE_PS_ON_CD_UPDATE)||defined(EXINO2)
  774. PS_RestoreFactoryDefault(); 
  775. #endif
  776. drv_tray_open();
  777. #ifdef D_QSI_LOADER
  778. for (i = 0; i < 3; i++)
  779. usleep(5000000UL);  
  780. #else
  781. usleep(5000000UL);  
  782. #endif
  783. #ifdef D_FLASH_UPDATA_OPEN//tecobest gxd 20050724 for do not open after flash updated
  784.               for(i=0;i<10;i++)
  785.               {
  786. usleep(1000000L);
  787. if(TrayLL_IsTrayOpened())
  788. break;
  789.               }
  790. #endif
  791. dbg_printf(("Start to Copy Reflasher to SRAMn"));
  792. cpu_disable_all_interrupts();
  793. asm    // prepare new stack
  794. {
  795. mov ax,0
  796. mov ss,ax
  797. mov sp,0x200
  798. mov bp,0x200
  799. }
  800. copy_reflsher_and_run();
  801. }
  802. dbg_printf (("nERROR discCopyToDramn"));
  803. return FALSE;
  804. }
  805. /**********************************************************************************
  806.  Purpose          : copy reflasher to RAM and run it
  807.  Input Parameters : none
  808.  Return Value     : if successed should never return 
  809.  Comment:   :
  810. **********************************************************************************/
  811. static void copy_reflsher_and_run(void)
  812. {
  813. unsigned long i;
  814.     void (*ReflashFromRam)(void);
  815. unsigned short *flash_address;
  816. flash_address = (unsigned short *)cpu_get_reflasher_base_address();
  817. for(i=0;i<cpu_reflasher_length();i++)
  818.     {
  819. *flash_address++ = reflasher[i];
  820. }
  821. ReflashFromRam = (void (*)(void))cpu_get_reflasher_base_address();
  822. (*ReflashFromRam)();  // never return from here
  823. }
  824. #ifdef SUPPORT_KEYS_UPDATE
  825. #ifdef STORE_KEYS_IN_FLASH
  826. /**********************************************************************************
  827.  Purpose          : Replace player configuration setting in cd-image with curret player setting 
  828.  Input Parameters :  
  829.  Description      : read cd-image data from SDRAM searching for the "configuration setting"
  830.   data and replace it with the player configuration data.  
  831.   The algorithm to copy the "feature select" erea is :
  832. Copy "feature select" area bits from player until EOS will be found on player 
  833. "feature select" data or on cd-image "feature select" data or FSA end was found.  
  834.  Return Value     : TRUE - replacment successed, else FALSE 
  835.  Comment:   :
  836. **********************************************************************************/
  837. static BOOL ReplaceHDCPKeys(void)
  838. {
  839. UINT32 offset;
  840. UINT32 dram_addr = SDRAM_COPY_ADDR+3;
  841.     unsigned int *buff_s = (unsigned int *)STORE_KEYS_START_ADDRESS;
  842. offset = ((UINT32)STORE_KEYS_SEG - 0x4000UL) >> 1;
  843. offset <<= 0x8; //hansj 04/08/2005
  844. if (DEC_WriteDRAMData( dram_addr + offset, buff_s, STORE_KEYS_SIZE) != STORE_KEYS_SIZE)
  845. return FALSE;   
  846. return TRUE;
  847. }
  848. #endif//STORE_KEYS_IN_FLASH
  849. #endif //SUPPORT_KEYS_UPDATE
  850. #ifdef AVI_DRM_SUPPORT
  851. #ifdef STORE_PS_DATA_IN_FLASH
  852. /****************************************************************************************************
  853. * Function : _ReplaceDivXDRMMemory
  854. * Input :
  855. * Output :
  856. * Return : FALSE - failed, TRUE - else
  857. * Description : Protect the DRM memory not to change during CD-update
  858. ****************************************************************************************************/
  859. static BOOL _ReplaceDivXDRMMemory(void)
  860. {
  861. UINT32 dwDramAddr;
  862. UINT16 wOffset;
  863. BOOL bOddFlag;
  864.     unsigned int *buff_s = (unsigned int *)MK_FP(PS_SEG, 0);
  865. UINT8 TempBuf[PACKED_ALLOCATION_BYTES + 2];
  866. if (!_SearchFactorySetting(&dwDramAddr, &wOffset))
  867. return FALSE;
  868. dwDramAddr += (wOffset/2);
  869. bOddFlag = (0 != wOffset%2);
  870. if (DEC_ReadDRAMData(dwDramAddr, (UINT16*)&TempBuf[0], (PACKED_ALLOCATION_BYTES+2)/2) != (PACKED_ALLOCATION_BYTES+2)/2)
  871. return FALSE;
  872. if (bOddFlag)
  873. memcpy(&TempBuf[1], (UINT8*)buff_s, PACKED_ALLOCATION_BYTES);
  874. else
  875. memcpy(&TempBuf[0], (UINT8*)buff_s, PACKED_ALLOCATION_BYTES);
  876. if (DEC_WriteDRAMData(dwDramAddr, (UINT16*)&TempBuf[0], (PACKED_ALLOCATION_BYTES+2)/2) != (PACKED_ALLOCATION_BYTES+2)/2)
  877. return FALSE;   
  878. return TRUE;
  879. }
  880. static BOOL _SearchFactorySetting(UINT32 *dwSettingStartAddr, UINT16 *wSettingOffset)
  881. {
  882. UINT16 wImageSectorsSize;
  883. UINT16 wSectorCount;
  884. unsigned char cBuff[BUFF_SIZE*2];
  885. UINT16 wBuffCount, wBuffOffset;
  886. UINT32 dwDramAddr = SDRAM_COPY_ADDR+3;
  887. UINT16 wSettingIndex = 0;
  888. unsigned char  *string_buff = (unsigned char *)&default_factory_settings_signature;
  889. UINT16 wSettingLength = 33;
  890. UINT16 wBuff[2];
  891. if (!(DEC_ReadDRAMData(SDRAM_COPY_ADDR, (UINT16*)&wBuff[0], 2) == 2))
  892.     return FALSE;
  893. wImageSectorsSize = wBuff[0] + (wBuff[1] << 8 );
  894. for (wSectorCount=0; wSectorCount<wImageSectorsSize; wSectorCount++)
  895. {
  896. for (wBuffCount=0; wBuffCount<COUNT_1_SECTOR; wBuffCount++)
  897. {
  898. // read image from SDRAM 
  899. if (!(DEC_ReadDRAMData(dwDramAddr, (UINT16*)&cBuff[0], BUFF_SIZE) == BUFF_SIZE))
  900. return FALSE;
  901. // Search for the factory setting area
  902. for( wBuffOffset=0; wBuffOffset< 64; wBuffOffset++)
  903. {
  904. if (string_buff[wSettingIndex] == cBuff[wBuffOffset])
  905. {
  906. wSettingIndex++;
  907. }
  908. else
  909. {
  910. wSettingIndex = 0;
  911. }
  912. if (wSettingIndex >= wSettingLength)
  913. {
  914. *dwSettingStartAddr = dwDramAddr;
  915. *wSettingOffset = wBuffOffset + 1;
  916. return TRUE;
  917. }
  918. }
  919. // continue reading from SDRAM addressed in words
  920. dwDramAddr += BUFF_SIZE;
  921. }
  922. }
  923. return FALSE;
  924. }
  925. #endif // D_SUPPORT_KEYS_UPDATE
  926. #endif // AVI_DRM_SUPPORT