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

DVD

开发平台:

Others

  1. /* **************************************************************************************
  2.  *  Copyright (c) 2001 ZORAN Corporation, All Rights Reserved
  3.  *  THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF ZORAN CORPORATION
  4.  *
  5.  *  File: "NVM_BMK.c"                                            05/27/03
  6.  *
  7.  * Description:
  8.  * ============
  9.  * NVM Bookmark 
  10.  * 
  11.  * Log:
  12.  * ====
  13.  * $Revision: 7 $
  14.  * Last Modified by $Author: Johnk $ at $Modtime: 4/01/04 9:55p $ 
  15.  ****************************************************************************************
  16.  * Updates:
  17.  ****************************************************************************************
  18.  * $Log: /I76/I76_Common/I76_Reference/Playcore/Coremain/NVM_BMK.c $
  19.  * 
  20.  * 7     4/01/04 10:57p Johnk
  21.  * support HW POWER_ON_RESUME
  22.  * 
  23.  * 6     03-06-17 14:59 Fwang
  24.  * Add API -- NVM_BMK_Flush(). Optimize API parameters.
  25.  * 
  26.  * 5     03-06-02 18:24 Fwang
  27.  * Add API function for get available setting slot.
  28.  * Optimize verifier.
  29.  * 
  30.  * 4     03-05-28 11:18 Fwang
  31.  * Add NVM_BMK_Get() to get bookmark
  32.  * Support specified postion in NVM_BMK_SET()
  33.  * 
  34.  * 3     03-05-28 9:40 Fwang
  35.  * Set bookmark type in NVM_BMK_SET()
  36.  * 
  37.  * 2     03-05-28 9:08 Fwang
  38.  * 
  39.  * 1     03-05-27 22:47 Fwang
  40.  * Creat
  41. ****************************************************************************************/
  42. #include "Config.h" // Global Configuration - do not remove!
  43. #ifndef EXINO2 //ZKR JK0331 : for power_on_resume in EEPROM
  44. #include "PlaycoreCoremainnvm_bmk.h"
  45. #ifdef HW_POWER_ON_RESUME
  46. #ifdef _DEBUG
  47. #undef IFTRACE
  48. #define IFTRACE if (gTraceCore) 
  49. #include "DebugDbgMain.h"
  50. #endif
  51. #include "PlaycorePSps.h"
  52. #include "PlaycoreScPadscmgr.h"
  53. #include "PlaycoreCoremaincoremain.h"
  54. #include "CPUCPU_API.h"
  55. #ifndef STORE_PS_DATA_IN_FLASH
  56. #include "eeprom.h"
  57. #endif
  58. #ifdef STORE_PS_DATA_IN_FLASH
  59. #define MK_FP(seg,ofs) ((void __seg *)(seg) + (void __near *)(ofs))
  60. static const BYTE huge *NVM_flash_base =  MK_FP(PS_SEG, 0);
  61. #define BMK_FLASH_BASE_ADDR  (NVM_flash_base + ((sizeof(NV_STORAGE) + 1)&0xfffe))
  62. #else
  63. #define BMK_EEPROM_BASE_ADDR (PS_OFFSET_ADDR+ ((sizeof(NV_STORAGE) + 1)&0xfffe))
  64. #endif
  65. #define BMK_SLOT_SIZE ((sizeof(NVM_GENERIC_BMK)+1)&0xfffe)
  66. #ifdef STORE_PS_DATA_IN_FLASH
  67. #define BMK_FLASH_SLOT_ADDR(slot)  (BMK_FLASH_BASE_ADDR + slot*BMK_SLOT_SIZE)
  68. #else
  69. #define BMK_EEPROM_SLOT_ADDR(slot)  (BMK_EEPROM_BASE_ADDR + slot*BMK_SLOT_SIZE)
  70. #endif
  71. static WORD sc_handle =  NULL_HANDLE;
  72. static const WORD sc_buffer_size = NUM_OF_NVM_BMK * CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK));
  73. static BOOL (*p_IsMatch)(NVM_GENERIC_BMK*) = NULL;
  74. static void (*p_SetDiscMarker)(WORD handle) = NULL;
  75. static void (*p_BmkPlay)(NVM_GENERIC_BMK*) = NULL;
  76. static BMK_TYPE Current_BMK_Type = BMK_NONE;
  77. static BYTE __CalculateCheckSum(BYTE* buff, int size);
  78. static BYTE __CalculateCheckSum_sc(WORD sc, int size);
  79. #ifdef STORE_PS_DATA_IN_FLASH
  80. #ifdef _DEBUG
  81. static void __trace_sc(int slot)
  82. {
  83. int i;
  84. NVM_GENERIC_BMK bmk;
  85. BYTE *buffer = (BYTE*)&bmk;
  86. sc_GetBytes(sc_handle+slot*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), 0, sizeof(NVM_GENERIC_BMK), (BYTE*)&bmk);
  87. dbg_printf(("nSC Slot %d", slot));
  88. for (i=0; i<sizeof(NVM_GENERIC_BMK);)
  89. {
  90. dbg_printf(("n%3d: ", i));
  91. dbg_printf((" 0x%2x", buffer[i])); i++;
  92. dbg_printf((" 0x%2x", buffer[i])); i++;
  93. dbg_printf((" 0x%2x", buffer[i])); i++;
  94. dbg_printf((" 0x%2x", buffer[i])); i++;
  95. dbg_printf(("   0x%2x", buffer[i])); i++;
  96. dbg_printf((" 0x%2x", buffer[i])); i++;
  97. dbg_printf((" 0x%2x", buffer[i])); i++;
  98. dbg_printf((" 0x%2x", buffer[i])); i++;
  99. }
  100. }
  101. static void __trace_flash(int slot)
  102. {
  103. int i;
  104. BYTE* buffer = (BYTE*)BMK_FLASH_SLOT_ADDR(slot);
  105. dbg_printf(("nFlash Slot %d", slot));
  106. for (i=0; i<sizeof(NVM_GENERIC_BMK);)
  107. {
  108. dbg_printf(("n%3d   (%p): ", i, &buffer[i]));
  109. dbg_printf((" 0x%2x", buffer[i])); i++;
  110. dbg_printf((" 0x%2x", buffer[i])); i++;
  111. dbg_printf((" 0x%2x", buffer[i])); i++;
  112. dbg_printf((" 0x%2x", buffer[i])); i++;
  113. dbg_printf(("   0x%2x", buffer[i])); i++;
  114. dbg_printf((" 0x%2x", buffer[i])); i++;
  115. dbg_printf((" 0x%2x", buffer[i])); i++;
  116. dbg_printf((" 0x%2x", buffer[i])); i++;
  117. }
  118. }
  119. void NVM_BMK_DebugOut()
  120. {
  121. int i;
  122. for (i=0; i < NUM_OF_NVM_BMK; i++)
  123. {
  124. __trace_flash(i);
  125. }
  126. }
  127. #endif //_DEBUG
  128. #endif
  129. /**********************************************************************************
  130.  * Purpose          : Cache NVM bookmark
  131.  * Input Parameters :  None
  132.  * Return Value     :  BOOL
  133.  * Description :  Allocate cache from Scpad and preload bookmark from NVM
  134.  **********************************************************************************/
  135. BOOL NVM_BMK_Cache()
  136. {
  137. int i;
  138. #ifndef STORE_PS_DATA_IN_FLASH
  139. BYTE nvmdata[sizeof(NVM_GENERIC_BMK)]; 
  140. #endif
  141. //Allocate buffer from Scpad
  142. sc_handle = sc_Malloc(sc_buffer_size);
  143. if (NULL_HANDLE == sc_handle)
  144. return FALSE;
  145. //Cache NVM bookmark
  146. for( i = 0; i < NUM_OF_NVM_BMK ; i++ ){
  147. #ifdef STORE_PS_DATA_IN_FLASH
  148. sc_SetBytes( sc_handle+i*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), 0, sizeof(NVM_GENERIC_BMK), (BYTE *)BMK_FLASH_SLOT_ADDR(i));
  149. #else
  150. eeprom_read( BMK_EEPROM_SLOT_ADDR(i),nvmdata, sizeof(NVM_GENERIC_BMK) );
  151. sc_SetBytes( sc_handle+i*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), 0, sizeof(NVM_GENERIC_BMK), nvmdata);
  152. #endif
  153. }
  154. return TRUE;
  155. }
  156. /**********************************************************************************
  157.  * Purpose          : Uncache NVM bookmark
  158.  * Input Parameters :  None
  159.  * Return Value     :  None
  160.  * Description :  Free Scpad cache
  161.  **********************************************************************************/
  162. void NVM_BMK_UnCache()
  163. {
  164. if (NULL_HANDLE != sc_handle)
  165. {
  166. //Free Scpad cache
  167. sc_Free( sc_handle, sc_buffer_size );
  168. sc_handle = NULL_HANDLE;
  169. }
  170. }
  171. /**********************************************************************************
  172.  * Purpose          : Check if NVM bookmark is cached
  173.  * Input Parameters :  None
  174.  * Return Value     :  True if bookmark is cached in Scpad
  175.  * Description :  
  176.  **********************************************************************************/
  177. BOOL NVM_BMK_IsCached()
  178. {
  179. return (sc_handle != NULL_HANDLE);
  180. }
  181. /**********************************************************************************
  182.  * Purpose          : If bookmark of curren disc exits
  183.  * Input Parameters :  h_BmkSlot - slot position if hit
  184.  * Return Value     :  True if exists
  185.  * Description :  Comapre fingure print of disc with bookmark.
  186.  **********************************************************************************/
  187. BOOL NVM_BMK_hit(int *h_BmkSlot)
  188. {
  189. int i;
  190. #ifndef STORE_PS_DATA_IN_FLASH
  191. BMK_STORAGE bmk_storage;
  192. NVM_GENERIC_BMK *pGenric_bmk = &bmk_storage.bmk;
  193. #else
  194. NVM_GENERIC_BMK *pGenric_bmk;
  195. #endif
  196. if (NULL == p_IsMatch)
  197. return FALSE;
  198. for (i=0; i < NUM_OF_NVM_BMK; i++)
  199. {
  200. #ifdef STORE_PS_DATA_IN_FLASH
  201. pGenric_bmk = (NVM_GENERIC_BMK*)BMK_FLASH_SLOT_ADDR(i);
  202. #else
  203. eeprom_read( BMK_EEPROM_SLOT_ADDR(i),&(bmk_storage.data[0]), sizeof(NVM_GENERIC_BMK) );
  204. #endif
  205. if ( pGenric_bmk->bmk_type == Current_BMK_Type)
  206. {
  207. //Match with disc info
  208. if (p_IsMatch(pGenric_bmk))
  209. {
  210. if (h_BmkSlot != NULL)
  211. *h_BmkSlot = i;
  212. return TRUE;
  213. }
  214. }
  215. }
  216. return FALSE;
  217. }
  218. /**********************************************************************************
  219.  * Purpose          : To find a available slot
  220.  * Input Parameters :  h_BmkSlot - slot position
  221.  * Return Value     :  None
  222.  * Description :  If no blank slot exists, replace the oldest one.
  223.  **********************************************************************************/
  224. void NVM_BMK_Get_FreeSlot(int *h_BmkSlot)
  225. {
  226. int i, slot_id;
  227. #ifndef STORE_PS_DATA_IN_FLASH
  228. BMK_STORAGE bmk_storage;
  229. NVM_GENERIC_BMK *pGenric_bmk = &bmk_storage.bmk;
  230. #else
  231. NVM_GENERIC_BMK *pGenric_bmk;
  232. #endif
  233. BYTE oldest_age = 0;
  234. //Try to get a blank slot, otherwise return the oldest one.
  235. for (i=0; i < NUM_OF_NVM_BMK; i++)
  236. {
  237. #ifdef STORE_PS_DATA_IN_FLASH
  238. pGenric_bmk = (NVM_GENERIC_BMK*)BMK_FLASH_SLOT_ADDR(i);
  239. #else
  240. eeprom_read( BMK_EEPROM_SLOT_ADDR(i),&(bmk_storage.data[0]), sizeof(NVM_GENERIC_BMK) );
  241. #endif
  242. if ( pGenric_bmk->bmk_type == BMK_NONE)
  243. {
  244. //Found empty slot
  245. slot_id = i;
  246. break;
  247. }
  248. if (oldest_age <= pGenric_bmk->age)
  249. {
  250. oldest_age = pGenric_bmk->age;
  251. slot_id = i;
  252. }
  253. }
  254. *h_BmkSlot = slot_id;
  255. return;
  256. }
  257. /**********************************************************************************
  258.  * Purpose          : Save NVM bookmark
  259.  * Input Parameters :  bUpdateFlash - if NVM position exists in flash
  260.  * Return Value     :  None
  261.  * Description :  Write cached bookmark back to NVM
  262.  **********************************************************************************/
  263. #ifdef STORE_PS_DATA_IN_FLASH
  264. void NVM_BMK_Save(BOOL bUpdateFlash)
  265. #else
  266. void NVM_BMK_Save(void)
  267. #endif
  268. {
  269. int slot;
  270. #ifdef STORE_PS_DATA_IN_FLASH
  271. int offset;
  272. BYTE buff[2];
  273. unsigned short far *fp_uDestAddr;
  274. #else
  275. BYTE nvmdata[sizeof(NVM_GENERIC_BMK)];
  276. #endif
  277. if (NULL_HANDLE == sc_handle)
  278. return;
  279. #ifdef STORE_PS_DATA_IN_FLASH
  280. if ( bUpdateFlash ){
  281. //Update flash
  282. for (slot = 0; slot < NUM_OF_NVM_BMK; slot++)
  283. {
  284. for( offset = 0; offset < BMK_SLOT_SIZE; offset=offset+2 ){
  285. sc_GetBytes(sc_handle+slot*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), offset, 2, buff);
  286. fp_uDestAddr = BMK_FLASH_SLOT_ADDR(slot) + offset;
  287. Nor_Write((unsigned short huge *)fp_uDestAddr, (unsigned char far *)buff, 2);
  288. }
  289. }
  290. }else{
  291. //Update SRAM
  292. for (slot = 0; slot < NUM_OF_NVM_BMK; slot++)
  293. {
  294. sc_GetBytes(sc_handle+slot*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), 0, BMK_SLOT_SIZE, (BYTE*)BMK_FLASH_SLOT_ADDR(slot));
  295. }
  296. }
  297. #else
  298. for (slot = 0; slot < NUM_OF_NVM_BMK; slot++)
  299. {
  300. sc_GetBytes(sc_handle+slot*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), 0, BMK_SLOT_SIZE, nvmdata);
  301. eeprom_write( BMK_EEPROM_SLOT_ADDR(slot),nvmdata, sizeof(NVM_GENERIC_BMK) );
  302. }
  303. #endif
  304. }
  305. /**********************************************************************************
  306.  * Purpose          : Flush specified NVM bookmark
  307.  * Input Parameters :  position - specified slot. -1 means auto position 
  308.  * Return Value     :  None
  309.  * Description : 
  310.  **********************************************************************************/
  311. void NVM_BMK_Flush( int position )
  312. {
  313. BYTE ucTemp;
  314. int offset, slot;
  315. const BYTE buff[4] = {0,0,0,0};
  316. NVM_GENERIC_BMK *pGenric_bmk;
  317. if ((position>=0) && (position<NUM_OF_NVM_BMK))
  318. {
  319. //Specified position
  320. slot = position;
  321. }else
  322. {
  323. //Find matched slot
  324. if ( FALSE == NVM_BMK_hit(&slot) )
  325. return;
  326. }
  327. if ( FALSE == NVM_BMK_Cache() )
  328. return;
  329. //Flush specified Scpad cache
  330. for (offset=0; offset<CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK));offset++)
  331. sc_SetBytes(sc_handle+slot*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), offset*BYTE_PER_CONTAINER, BYTE_PER_CONTAINER, buff);
  332. ucTemp = __CalculateCheckSum_sc(sc_handle+slot*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), sizeof(NVM_GENERIC_BMK)-1);
  333. offset = (int)&pGenric_bmk->checksum - (int)pGenric_bmk;
  334. sc_SetBytes(sc_handle+slot*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), offset, 1, &ucTemp);
  335. //Write back to NVM
  336. #ifdef STORE_PS_DATA_IN_FLASH
  337. core_save_NVM_setting_In_Flash((unsigned short far *)NVM_flash_base);
  338. #else
  339. NVM_BMK_Save();
  340. #endif
  341. NVM_BMK_UnCache();
  342. return;
  343. }
  344. /**********************************************************************************
  345.  * Purpose          : Flush all NVM bookmark
  346.  * Input Parameters :  None
  347.  * Return Value     :  None
  348.  * Description : 
  349.  **********************************************************************************/
  350. void NVM_BMK_FlushAll()
  351. {
  352. BYTE ucTemp;
  353. int i, offset;
  354. const BYTE buff[4] = {0,0,0,0};
  355. NVM_GENERIC_BMK *pGenric_bmk;
  356. if ( FALSE == NVM_BMK_Cache() )
  357. return;
  358. //Flush all Scpad cache
  359. for (i=0; i < NUM_OF_NVM_BMK; i++)
  360. {
  361. for (offset=0; offset<CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK));offset++)
  362. sc_SetBytes(sc_handle+i*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), offset*BYTE_PER_CONTAINER, BYTE_PER_CONTAINER, buff);
  363. ucTemp = __CalculateCheckSum_sc(sc_handle+i*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), sizeof(NVM_GENERIC_BMK)-1);
  364. offset = (int)&pGenric_bmk->checksum - (int)pGenric_bmk;
  365. sc_SetBytes(sc_handle+i*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), offset, 1, &ucTemp);
  366. }
  367. //Write back to NVM
  368. #ifdef STORE_PS_DATA_IN_FLASH
  369. core_save_NVM_setting_In_Flash((unsigned short far *)NVM_flash_base);
  370. #else
  371. NVM_BMK_Save();
  372. #endif
  373. NVM_BMK_UnCache();
  374. return;
  375. }
  376. /**********************************************************************************
  377.  * Purpose          : Verify the consistence of NVM bookmark
  378.  * Input Parameters :  None
  379.  * Return Value     :  None
  380.  * Description :  Flush NVM bookmark if contains error
  381.  **********************************************************************************/
  382. void NVM_BMK_Verify()
  383. {
  384. int i, offset;
  385. BOOL bError = FALSE;
  386. #ifndef STORE_PS_DATA_IN_FLASH
  387. BMK_STORAGE bmk_storage;
  388. NVM_GENERIC_BMK *pGenric_bmk = &bmk_storage.bmk;
  389. #else
  390. NVM_GENERIC_BMK *pGenric_bmk;
  391. #endif
  392. const BYTE buff[4] = {0,0,0,0};
  393. BYTE temp;
  394. for (i=0; i<NUM_OF_NVM_BMK; i++)
  395. {
  396. #ifdef STORE_PS_DATA_IN_FLASH
  397. pGenric_bmk = (NVM_GENERIC_BMK*)BMK_FLASH_SLOT_ADDR(i);
  398. #else
  399. eeprom_read( BMK_EEPROM_SLOT_ADDR(i),&(bmk_storage.data[0]), sizeof(NVM_GENERIC_BMK) );
  400. #endif
  401. if ( pGenric_bmk->checksum !=  __CalculateCheckSum((BYTE*)pGenric_bmk, sizeof(NVM_GENERIC_BMK)-1) )
  402. {
  403. bError = TRUE;
  404. break;
  405. }
  406. }
  407. if (!bError)
  408. return;
  409. dbg_printf(("nNVM Bookmark check sume error! "));
  410. if ( FALSE == NVM_BMK_Cache() )
  411. return;
  412. for (i=0; i<NUM_OF_NVM_BMK; i++)
  413. {
  414. #ifdef STORE_PS_DATA_IN_FLASH
  415. pGenric_bmk = (NVM_GENERIC_BMK*)BMK_FLASH_SLOT_ADDR(i);
  416. #else
  417. eeprom_read( BMK_EEPROM_SLOT_ADDR(i),&(bmk_storage.data[0]), sizeof(NVM_GENERIC_BMK) );
  418. #endif
  419. if ( pGenric_bmk->checksum !=  __CalculateCheckSum((BYTE*)pGenric_bmk, sizeof(NVM_GENERIC_BMK)-1) )
  420. {
  421. //Flush cache
  422. for (offset=0; offset<CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK));offset++)
  423. sc_SetBytes(sc_handle+i*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), offset*BYTE_PER_CONTAINER, BYTE_PER_CONTAINER, buff);
  424. temp = __CalculateCheckSum_sc(sc_handle+i*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), sizeof(NVM_GENERIC_BMK)-1);
  425. offset = (int)&pGenric_bmk->checksum - (int)pGenric_bmk;
  426. sc_SetBytes(sc_handle+i*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), offset, 1, &temp);
  427. #ifdef STORE_PS_DATA_IN_FLASH
  428. #ifdef _DEBUG
  429. dbg_printf(("nERR In "));
  430. __trace_flash(i);
  431. #endif
  432. #endif
  433. }
  434. }
  435. #ifdef STORE_PS_DATA_IN_FLASH
  436. core_save_NVM_setting_In_Flash((unsigned short far *)NVM_flash_base);
  437. #else
  438. NVM_BMK_Save();
  439. #endif
  440. NVM_BMK_UnCache();
  441. }
  442. /**********************************************************************************
  443.  * Purpose          : Hook callback navigator functiones
  444.  * Input Parameters :  bmk_type - bmk type according to Navigator
  445.  *      match_func - function to check disc figure print
  446.  *                              set_func - function to set disc bookmark info
  447.  *                              play_func - function to retore disc bookmark info
  448.  * Return Value     :  None
  449.  * Description : 
  450.  **********************************************************************************/
  451. void NVM_BMK_Hook(BMK_TYPE bmk_type, BOOL(*match_func)(NVM_GENERIC_BMK*), void(*set_func)(WORD), void(*play_func)(NVM_GENERIC_BMK*))
  452. {
  453. p_IsMatch = match_func;
  454. p_SetDiscMarker = set_func;
  455. p_BmkPlay = play_func;
  456. Current_BMK_Type = bmk_type;
  457. return;
  458. }
  459. /**********************************************************************************
  460.  * Purpose          : Unhook callback navigator functiones
  461.  * Input Parameters :  None
  462.  * Return Value     :  None
  463.  * Description : 
  464.  **********************************************************************************/
  465. void NVM_BMK_UnHook()
  466. {
  467. p_IsMatch = NULL;
  468. p_SetDiscMarker = NULL;
  469. p_BmkPlay = NULL;
  470. Current_BMK_Type = BMK_NONE;
  471. return;
  472. }
  473. /**********************************************************************************
  474.  * Purpose          : Get available slot position
  475.  * Input Parameters :  None
  476.  * Return Value     :  available position
  477.  * Description :  Find available slot to set bookmark for the current disc
  478.  **********************************************************************************/
  479. int NVM_BMK_AvailableSlot()
  480. {
  481. int slot = 0;
  482. //Find available slot
  483. if (!NVM_BMK_hit(&slot))
  484. {
  485. NVM_BMK_Get_FreeSlot(&slot);
  486. }
  487. return slot;
  488. }
  489. /**********************************************************************************
  490.  * Purpose          : Set NVM bookmark
  491.  * Input Parameters :  position - specified position. -1 for auto posisition
  492.  * Return Value     :  None
  493.  * Description :  Save disc info to available NVM bookmark slot, and update age of each slot
  494.  **********************************************************************************/
  495. void NVM_BMK_SET(int position)
  496. {
  497. BYTE ucTemp;
  498. int i, slot, offset;
  499. #ifndef STORE_PS_DATA_IN_FLASH
  500. BMK_STORAGE bmk_storage;
  501. NVM_GENERIC_BMK *pGenric_bmk = &bmk_storage.bmk;
  502. #else
  503. NVM_GENERIC_BMK *pGenric_bmk;
  504. #endif
  505. if (NULL == p_SetDiscMarker)
  506. return;
  507. if ( FALSE == NVM_BMK_Cache() )
  508. return;
  509. if ((position>=0) && (position<NUM_OF_NVM_BMK))
  510. {
  511. //Specified position
  512. slot = position;
  513. }else
  514. {
  515. //Find available slot
  516. slot = NVM_BMK_AvailableSlot();
  517. }
  518. //Set disc info
  519. p_SetDiscMarker( sc_handle + slot*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)) );
  520. //Set bookmark type
  521. ucTemp = Current_BMK_Type;
  522. offset = (int)&pGenric_bmk->bmk_type - (int)pGenric_bmk;
  523. sc_SetBytes(sc_handle+slot*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), offset, sizeof(BYTE), (BYTE *) &ucTemp);
  524. //Set age as zero
  525. ucTemp = 0;
  526. offset = (int)&pGenric_bmk->age - (int)pGenric_bmk;
  527. sc_SetBytes(sc_handle+slot*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), offset, sizeof(BYTE), &ucTemp);
  528. //Calculate check sum
  529. ucTemp = __CalculateCheckSum_sc(sc_handle + slot*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), sizeof(NVM_GENERIC_BMK)-1) ;
  530. offset =(int)& pGenric_bmk->checksum - (int)pGenric_bmk;
  531. sc_SetBytes(sc_handle + slot*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), offset, sizeof(BMK_TYPE), (BYTE *) &ucTemp);
  532. //Update the age counting of each slot
  533. for (i=0; i < NUM_OF_NVM_BMK; i++)
  534. {
  535. #ifdef STORE_PS_DATA_IN_FLASH
  536. pGenric_bmk = (NVM_GENERIC_BMK*)BMK_FLASH_SLOT_ADDR(i);
  537. #else
  538. eeprom_read( BMK_EEPROM_SLOT_ADDR(i),&(bmk_storage.data[0]), sizeof(NVM_GENERIC_BMK) );
  539. #endif
  540. if (BMK_NONE == pGenric_bmk->bmk_type)          //Don't update blank slot
  541. continue;
  542. if (i == slot) //Don't update selected slot whose age is zero
  543. continue;
  544. if (pGenric_bmk->age < 0xFF)               //Maxium limitation
  545. {
  546. //Increment age
  547. ucTemp = pGenric_bmk->age + 1;
  548. offset = (int)&pGenric_bmk->age - (int)pGenric_bmk;
  549. sc_SetBytes(sc_handle+i*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), offset, sizeof(BYTE), &ucTemp);
  550. ucTemp = __CalculateCheckSum_sc(sc_handle+i*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), sizeof(NVM_GENERIC_BMK)-1);
  551. offset = (int)&pGenric_bmk->checksum - (int)pGenric_bmk;
  552. sc_SetBytes(sc_handle+i*CONTAINER_COUNT(sizeof(NVM_GENERIC_BMK)), offset, 1, &ucTemp);
  553. }
  554. }
  555. //Write back to NVM
  556. #ifdef STORE_PS_DATA_IN_FLASH
  557. core_save_NVM_setting_In_Flash((unsigned short far *)NVM_flash_base);
  558. #else
  559. NVM_BMK_Save();
  560. #endif
  561. NVM_BMK_UnCache();
  562. return;
  563. }
  564. /**********************************************************************************
  565.  * Purpose          : Play from NVM bookmark
  566.  * Input Parameters :  None
  567.  * Return Value     :  Whether found matched bookmark or not
  568.  * Description :  If bookmark of current disc exists, play from the bookmark.
  569.  **********************************************************************************/
  570. BOOL NVM_BMK_Play()
  571. {
  572. int slot;
  573. #ifndef STORE_PS_DATA_IN_FLASH
  574. BMK_STORAGE bmk_storage;
  575. NVM_GENERIC_BMK *pGenric_bmk = &bmk_storage.bmk;
  576. #endif
  577. if (NULL == p_BmkPlay)
  578. return;
  579. #ifdef D_MEMORY_SETTING
  580. if (gps->memory_mode)
  581. {
  582. #endif
  583. if (NVM_BMK_hit(&slot))
  584. {
  585. //Bookmark play
  586. #ifdef STORE_PS_DATA_IN_FLASH
  587. p_BmkPlay( (NVM_GENERIC_BMK*)BMK_FLASH_SLOT_ADDR(slot) );
  588. #else
  589. eeprom_read( BMK_EEPROM_SLOT_ADDR(slot),&(bmk_storage.data[0]), sizeof(NVM_GENERIC_BMK) );
  590. p_BmkPlay(pGenric_bmk);
  591. #endif
  592. NVM_BMK_Flush(slot);
  593. return TRUE;
  594. }
  595. #ifdef D_MEMORY_SETTING
  596. }
  597. #endif
  598. return FALSE;
  599. }
  600. /**********************************************************************************
  601.  * Purpose          : Get bookmark info from NVM
  602.  * Input Parameters :  slot - postion
  603.  * Return Value     :  pointer to NVM bookmark. NULL if not exists
  604.  * Description : 
  605.  **********************************************************************************/
  606. #if 0
  607. NVM_GENERIC_BMK *NVM_BMK_Get(int slot)
  608. {
  609. NVM_GENERIC_BMK *pGenric_bmk;
  610. if ((slot>=0) && (slot<NUM_OF_NVM_BMK))
  611. {
  612. pGenric_bmk = BMK_FLASH_SLOT_ADDR(slot);
  613. if (pGenric_bmk->bmk_type != BMK_NONE)
  614. return pGenric_bmk;
  615. else
  616. return NULL;
  617. }
  618. else
  619. return NULL;
  620. }
  621. #endif
  622. /**********************************************************************************
  623.  * Purpose          : Calculate check sum of given buffer
  624.  **********************************************************************************/
  625. static BYTE __CalculateCheckSum(BYTE* buff, int size)
  626. {
  627. int i;
  628. BYTE checksum=0;
  629. for (i=0; i< size; i++) 
  630. {
  631. checksum += buff[i];
  632. }
  633. return checksum^0xFF;
  634. }
  635. /**********************************************************************************
  636.  * Purpose          : Calculate check sum of given Scpad buffer
  637.  **********************************************************************************/
  638. static BYTE __CalculateCheckSum_sc(WORD sc, int size)
  639. {
  640. int i;
  641. BYTE temp;
  642. BYTE checksum = 0;
  643. for (i=0; i< size; i++) 
  644. {
  645. sc_GetBytes(sc, i, 1, &temp);
  646. checksum += temp;
  647. }
  648. return checksum^0xFF;
  649. }
  650. #else
  651. void NVM_BMK_Verify()
  652. {
  653. }
  654. #pragma argsused
  655. void NVM_BMK_SET(int position)
  656. {
  657. }
  658. BOOL NVM_BMK_Play()
  659. {
  660. }
  661. #pragma argsused
  662. void NVM_BMK_Hook(BMK_TYPE bmk_type, BOOL(*match_func)(NVM_GENERIC_BMK*), void(*set_func)(WORD), void(*play_func)(NVM_GENERIC_BMK*))
  663. {
  664. }
  665. void NVM_BMK_UnHook()
  666. {
  667. }
  668. #endif //HW_POWER_ON_RESUME
  669. #endif //EXINO2