📄 rw_nvmem.c
字号:
#include "user_init.h"
#include "rw_nvmem.h"
#include "total_rsm.h"
#include "flash.h"//kaiji 20070410
#ifdef FLASH_HISTORY
#include "rsm_upd.h"
#endif
extern int current_resume;
extern BYTE disc_resume_index[TOTAL_RESUME];
extern UINT32 rsm_flash_start_addr;
#if (defined(SETUP_IN_FLASH)||defined(SAME_DISC_RESUME) || defined(POWER_RESUME) || defined(RECORD_KEY)) && defined(RW_NVMEM)//zxb 061019
extern UINT32 rsm_disc_type;//wangwei 070209
typedef struct
{
BYTE setup_info[SETUP_INF_SIZE];
BYTE resume_info[TOTAL_RESUME][RESUME_INF_SIZE];
//[0 ~ TOTAL_RESUME-1] : disc_id, [TOTAL_RESUME] : disc_resume_index
BYTE disc_id[TOTAL_RESUME+1][4][ID_LEN];
BYTE drm_info[DRM_INF_SIZE];
// can extent other type information ...
//ted.chang 2006 1117 padding for multiple of 4
#define PAD_SIZE ((SETUP_INF_SIZE+(TOTAL_RESUME*RESUME_INF_SIZE)+ID_LEN*(TOTAL_RESUME+1)*4+DRM_INF_SIZE)%4)
BYTE pad4[PAD_SIZE];
} NVMEM_INFO;
NVMEM_INFO nv_info;
/*** end of new data structure ***/
/* write to new nv_info structure */
int WriteToNVMEM(int inf_type, int addr, BYTE *pBuffer, UINT32 size)
{
BYTE *p, *q;
UINT32 iStart1, i;
int ret=1;
#ifdef FLASH_HISTORY
UINT32 iStart2;
#endif
UINT32 is_write_flash =1;
#ifdef RW_NVMEM_DBG
printf_w("Write to NV_MEM\n");
FlashDelay(1000);
#endif
//ret = Resume_FlashEraseSector(1, 0); //for boot sector
switch (inf_type)
{
case TYPE_SETUP_W:
p = nv_info.setup_info;
//printf_w("Write To NV_MEM : TYPE_SETUP_W, is_write_flash = %d\n", is_write_flash);
break;
case TYPE_SETUP_NW:
p = nv_info.setup_info;
is_write_flash = 0;
//printf_w("Write To NV_MEM : TYPE_SETUP, is_write_flash = %d\n", is_write_flash);
break;
case TYPE_RESUME:
p = nv_info.resume_info[current_resume];
is_write_flash = addr; //0 or others
//printf_w("Write To NV_MEM : TYPE_RESUME, is_write_flash = %d\n", is_write_flash);
break;
case TYPE_DISC_ID:
p = nv_info.disc_id[current_resume][rsm_disc_type];
//printf_w("Write To NV_MEM : TYPE_DISC_ID, current resume is %x, is_write_flash = %d\n",current_resume, is_write_flash);
break;
case TYPE_DRM:
p = nv_info.drm_info;
//printf_w("Write To NV_MEM : TYPE_DRM, is_write_flash = %d\n", is_write_flash);
break;
default:
//printf_w("Write To NV_MEM : UNKNOWN, is_write_flash = %d\n", is_write_flash);
return -1;
}
iStart1 = (UINT32)p-(UINT32)&nv_info;
q = pBuffer;
for (i=0; i<size; i++)
{
p[addr+i] = *q++;
}
if (inf_type == TYPE_DISC_ID)
{
p = nv_info.disc_id[TOTAL_RESUME][rsm_disc_type];
q = disc_resume_index;
#ifdef FLASH_HISTORY
iStart2 = (UINT32)p-(UINT32)&nv_info;
i = sizeof(nv_info);
ret = Resume_Info_Write_Update(iStart2,(BYTE*)&nv_info, i, q, sizeof(disc_resume_index));
#endif
for (i=0; i<sizeof(disc_resume_index); i++)
{
*p++ = *q++;
}
}
#ifdef FLASH_HISTORY
i = sizeof(nv_info);
ret = Resume_Info_Write_Update(iStart1+addr, (BYTE*)&nv_info, i, pBuffer, size); //swpong 2006 0410
#else
if (is_write_flash)
{
ret = Resume_Info_Write(rsm_flash_start_addr,(BYTE *)&nv_info,sizeof(nv_info));
}
#endif
return ret;
}
/* Read from new nv_info structure */
int ReadFromNVMEM(int inf_type, int addr, BYTE *pBuffer, UINT32 size)
{
UINT32 i;
BYTE *p, *q;
int result;
#ifdef RW_NVMEM_DBG
printf_w("Read from NV_MEM\n");
FlashDelay(1000);
#endif
//Flash_Read(&nv_info)
//result = FlashRead(rsm_flash_start_addr, &nv_info, sizeof(nv_info));
#ifdef FLASH_HISTORY
i = sizeof(nv_info);
result = Resume_Info_Read_Update((BYTE*)&nv_info, i); //swpong 2006 0410
#else
result = Resume_Info_Read(rsm_flash_start_addr, (BYTE *)&nv_info,sizeof(nv_info));
#endif
switch (inf_type)
{
case TYPE_SETUP:
p = nv_info.setup_info;
//printf_w("Read from NV_MEM, TYPE_SETUP\n");
break;
case TYPE_RESUME:
p = nv_info.resume_info[current_resume];
//printf_w("Read from NV_MEM, TYPE_RESUME\n");
break;
case TYPE_DISC_ID:
p = nv_info.disc_id[current_resume][rsm_disc_type];
//printf_w("Read from NV_MEM, TYPE_DISC_ID\n");
break;
case TYPE_DRM:
p = nv_info.drm_info;
//printf_w("Read from NV_MEM, TYPE_DRM\n");
break;
default:
return -1;
}
q = pBuffer;
for (i=0; i<size; i++)
{
*q++ = p[addr+i];
}
return result;
}
//////chik 070405
#if defined(SUPPORT_SPI_FLASH)&defined(DVD_5_DISC_RESUME)//nono add.2007 0410
void reset_5_disc_rsm(void)
{
printf_w("good~~~\n");
BYTE FirstMark[4];
BYTE *pbuf1 = (BYTE*)&nv_info;
UINT32 iBuf1Len;
iBuf1Len = sizeof(nv_info);
int k,j,i=0;
//clear dvd vcd cdda cdrom
for(i=0;i<TOTAL_RESUME;i++){
for(j=0;j<4;j++)
for(k=0;k<ID_LEN;k++)
nv_info.disc_id[i][j][k] = 0;//reset DVD's disc id
}
//clear setup information
//nv_info.setup_info = 0;
//erase and update all.
//extern Resume_FlashEraseSector(int, int);
//extern SPI_Resume_Write(UINT32, BYTE, UINT32);
Resume_FlashEraseSector(rsm_flash_sec_type, rsm_flash_start_addr);
FirstMark[0] = (iBuf1Len+4)>>8;
FirstMark[1] = (iBuf1Len+4)&0xff;
//ted.chang 2006 1117
FirstMark[2] = 0x00;
FirstMark[3] = 0x00;
////////////////////
SPI_Resume_Write(rsm_flash_start_addr, FirstMark, 4);
SPI_Resume_Write(rsm_flash_start_addr+4,pbuf1,iBuf1Len);
}
#endif//#if defined(SUPPORT_SPI_FLASH)&defined(DVD_5_DISC_RESUME)//nono add.2007 0410
#endif //RW_NVMEM
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -