📄 rsm_util.h
字号:
/*
* Terry,2003/8/7 12:23AM
* reduce function
* Maoyong,2004.02.20 15:41PM
To divide POWER_RESUME, RECORD_KEY, SAME_DISC_RESUME for no confusion
POWER_RESUME: when power down, record the current playing pos.
RECORD_KEY: when push RECORD, record the current playing pos
SAME_DISC_RESUME: when TRAY OUT, record the current playing pos
Maoyong, 2004.03.05 13:22
To move record resume relative functions from "sysmain2.c" to this file
Maoyong 2004.03.18 for combinaton usage
Maoyong 2004.04.07 fix bug: When shut down power supply, the next same type disc not recorded will do resume play,
which is wrong.
*/
#ifdef DISC_ID_IN_FLASH
//#include "io_uart0.h"
//#include "UartComm.h"
//static char debug_buffer[64]; //for debugging purpose
extern int FlashRead(UINT32 iStartAddr, BYTE *pBuf, UINT32 iLen);
extern int FlashWrite(UINT32 iStartAddr, BYTE *pBuf, UINT32 iLen);
#define TOTAL_RESUME 20 //Number of disc resume
#define SIZE_PER_ID 64 // Number of bytes storage reserved for disc resume
#define SETUP_MENU_BASE 0
#define DVD_INFO_BASE 128
#define CDROM_INFO_BASE 180
#define CDDA_INFO_BASE 200
#define VCD_INFO_BASE 220
#define DVD_DISC_INFO 244
#define CDDA_DISC_INFO 248
#define VCD_DISC_INFO 252
typedef struct {
BYTE disc_id[4];
BYTE disc_info[SIZE_PER_ID];
}DISC_RESUME_INFO;
//index table of the disc resume. It will store the latest TOTAL_RESUME disc
BYTE disc_resume_index[TOTAL_RESUME];
//store the information to flash for resume together with
//array[TOTAL_RESUME+1] stores the disc resume index table.
//array[TOTAL_RESUME+2] and array[TOTAL_RESUME+3] stores the setup information
#ifdef SETUP_IN_FLASH
DISC_RESUME_INFO disc_resume[TOTAL_RESUME+3];
#else
DISC_RESUME_INFO disc_resume[TOTAL_RESUME+1];
#endif
//current index
int current_resume = 0;
#endif
#ifdef CHECK_RECORD_DISK_PARENT_LVL //Maoyong 2004.03.04
extern void setup_CheckPasswd(void);
extern int user_input_pwd;
extern void ShowPasswordGUI(void);
#ifdef NEW_PARENTAL_GUI//zhaoyanhua add 2003-11-28 19:50
extern void ExitParentalGUI(void);
#endif
#endif
#ifdef RECORD_KEY//zhaoyanhua add 03-11-6 15:27
extern void osd_DrawRegionString(BYTE xStart, BYTE yStart, const BYTE *str, BYTE fontColor, BYTE bkColor, BYTE r);
extern void osd_init_record(void);
extern void osd_init(void);
#define FAST2NORM 0x01<<0
#define PAUSE2NORM 0x01<<1
#define SLOW2NORM 0x01<<2
#define REALPLAY 1
//#define TRANSFER 0//nono 2004-2-17 18:05
extern void chg2normal_play(UINT8 md,UINT8 realplay);
extern void run_pause_setting(void);
#endif
#ifdef DYNAMIC_SPECTRUM //zhaoyanhua add 03-11-6 15:26
extern void Show3dspectrum(void);
#endif
#ifdef SAME_DISC_RESUME
extern BYTE same_disc_onoff;
#endif
/*
#ifndef DVDRELEASE
//#define RSM_DBG 1
#endif
#ifndef RSM_DBG
#undef printf
#undef print_block
#define printf(f, a...) do {} while (0)
#define print_block(x,y) do {} while (0)
#endif*/
int is_cdg_disc(int show)
{
#ifdef SUPPORT_CDG
if( (cd_type_loaded==CDDA) && (cd_subtype==CD_DA) && bReadSubChannel && CDG_IsCDGNow())
{
if(show) invalid_key();
return 1;
}else
#endif
return 0;
}
/*
Maoyong changed for resume function define, compile will not give error message
*/
#if !defined(SAME_DISC_RESUME) && !defined(POWER_RESUME) && !defined(RECORD_KEY)
void save_cmp_disc_info(UINT32 info1){ if(info1){} }//terry,2004/4/8 05:36PM
#endif
/*========================================================================
basic I2C read and write function for public use in this file
=========================================================================*/
/*
* i2c device addr : a0
*/
void ReadFromI2cA0(UINT16 iAddr,BYTE *bBuffer,UINT16 len)
{
#ifndef DISC_ID_IN_FLASH
memset(bBuffer,0,len);
if(ReadFromI2c(0xa0, iAddr,bBuffer, len) >=0 )
{//sucess
printf("read flash data:\n");
print_block(bBuffer,len);
}else
{
printf("read flash error\n");
}
#else//#ifndef DISC_ID_IN_FLASH
int result,i,j,k;
BYTE *p;
// memset(bBuffer,0,len);
i = sizeof(disc_resume);
if (iAddr >= DVD_INFO_BASE)
{
if ((iAddr >= DVD_INFO_BASE) && (iAddr <DVD_DISC_INFO))
{
if ((iAddr >= DVD_INFO_BASE) && (iAddr <CDROM_INFO_BASE))
j = iAddr - DVD_INFO_BASE;
else if ((iAddr >= CDROM_INFO_BASE) && (iAddr <CDDA_INFO_BASE))
j = iAddr - CDROM_INFO_BASE;
else if ((iAddr >= CDDA_INFO_BASE) && (iAddr <VCD_INFO_BASE))
j = iAddr - CDDA_INFO_BASE;
else if ((iAddr >= VCD_INFO_BASE) && (iAddr <DVD_DISC_INFO))
j = iAddr - VCD_INFO_BASE;
result = FlashRead(FLASH_START_ADDR,disc_resume,i);
p= &disc_resume[current_resume].disc_info;
p+= j;
for (k=0; k<len;k++) *bBuffer++ = *p++;
//memcpy(bBuffer,&disc_resume[current_resume].disc_info+j,len);
}
else
{
result = FlashRead(FLASH_START_ADDR,disc_resume,i);
p= &disc_resume[current_resume].disc_id;
for (k=0; k<len;k++) *bBuffer++ = *p++;
// memcpy(bBuffer,&disc_resume[current_resume].disc_id,len);
}
}
else
{
#ifdef SETUP_IN_FLASH
result = FlashRead(FLASH_START_ADDR, disc_resume,i);
for (k=0; k<len;k++)
{
j=iAddr+k;
p=&disc_resume[TOTAL_RESUME+1].disc_info;
if (j>=(SETUP_MENU_BASE+SIZE_PER_ID))
//Wrap around for the next 64 (SIZE_PER_ID) bytes for setup
{
j-= SIZE_PER_ID;
p=&disc_resume[TOTAL_RESUME+2].disc_info;
}
*bBuffer++ = *(p+j);
}
#else
result = ReadFromI2c(0xa0, iAddr,bBuffer, len);
#endif
}
if(result >=0 )
{//sucess
printf("read flash data:\n");
print_block(bBuffer,len);
}else
{
printf("read flash error\n");
}
#endif//#ifndef DISC_ID_IN_FLASH
}
/*
* i2c device addr : a0 , read UINT32 parameter
*/
int ReadFromI2cA0_32(UINT16 iAddr,BYTE *bBuffer,UINT16 len)
{
UINT32 v=0;
#ifndef DISC_ID_IN_FLASH
if(ReadFromI2c(0xa0, iAddr,bBuffer, len) >=0 )
{//sucess
printf("read flash data:\n");
print_block(bBuffer,len);
if(len == 4) v = getUINT32_li(bBuffer);
else v = getUINT16_li(bBuffer);
}else
{
printf("read flash error\n");
}
#else//#ifndef DISC_ID_IN_FLASH
int result, i,j,k;
BYTE *p;
// memset(bBuffer,0,len);
if (iAddr >= DVD_INFO_BASE)
{
i = sizeof(disc_resume);
if ((iAddr >= DVD_INFO_BASE) && (iAddr <DVD_DISC_INFO))
{
if ((iAddr >= DVD_INFO_BASE) && (iAddr <CDROM_INFO_BASE))
j = iAddr - DVD_INFO_BASE;
else if ((iAddr >= CDROM_INFO_BASE) && (iAddr <CDDA_INFO_BASE))
j = iAddr - CDROM_INFO_BASE;
else if ((iAddr >= CDDA_INFO_BASE) && (iAddr <VCD_INFO_BASE))
j = iAddr - CDDA_INFO_BASE;
else if ((iAddr >= VCD_INFO_BASE) && (iAddr <DVD_DISC_INFO))
j = iAddr - VCD_INFO_BASE;
result = FlashRead(FLASH_START_ADDR,disc_resume,i);
p= &disc_resume[current_resume].disc_info;
p +=j;
for (k=0; k<len;k++) *(bBuffer+k) = *p++;
// memcpy(bBuffer,&disc_resume[current_resume].disc_info+j,len);
}
else
{
result = FlashRead(FLASH_START_ADDR,disc_resume,i);
p= &disc_resume[current_resume].disc_id;
for (k=0; k<len;k++) *(bBuffer+k) = *p++;
// memcpy(bBuffer,&disc_resume[current_resume].disc_id,len);
}
}
else
{
result = ReadFromI2c(0xa0, iAddr,bBuffer, len);
}
if(result >=0 )
{//sucess
printf("read flash data:\n");
print_block(bBuffer,len);
if(len == 4) v = getUINT32_li(bBuffer);
else v = getUINT16_li(bBuffer);
}else
{
printf("read flash error\n");
}
#endif//#ifndef DISC_ID_IN_FLASH
return v;
}
/*
* i2c device addr : a0 , write function
*/
void WriteToI2cA0(int iAddr,BYTE *bData,int len)
{
#ifndef DISC_ID_IN_FLASH
//printf("i2c,iAddr:%d len:%d\n",iAddr,len);
if( WriteToI2c(0xa0,iAddr,bData,len) < 0 )
{//write fail
printf("!!!! ======== write flash error ======== !!!!!\n");
}
#else//#ifndef DISC_ID_IN_FLASH
int result,i,j,k;
BYTE *p, *q;
i = sizeof(disc_resume);
if (iAddr >= DVD_INFO_BASE)
{
if ((iAddr >= DVD_INFO_BASE) && (iAddr <DVD_DISC_INFO))
{
if ((iAddr >= DVD_INFO_BASE) && (iAddr <CDROM_INFO_BASE))
j = iAddr - DVD_INFO_BASE;
else if ((iAddr >= CDROM_INFO_BASE) && (iAddr <CDDA_INFO_BASE))
j = iAddr - CDROM_INFO_BASE;
else if ((iAddr >= CDDA_INFO_BASE) && (iAddr <VCD_INFO_BASE))
j = iAddr - CDDA_INFO_BASE;
else if ((iAddr >= VCD_INFO_BASE) && (iAddr <DVD_DISC_INFO))
j = iAddr - VCD_INFO_BASE;
FlashEraseSector(FLASH_ERASE_SECTOR);
// memcpy(&disc_resume[current_resume].disc_info+j,bData,len);
p= &disc_resume[current_resume].disc_info;
p += j;
for (k=0; k<len;k++) *p++ = *bData++;
result = FlashWrite(FLASH_START_ADDR,disc_resume,i);
}
else
{
FlashEraseSector(FLASH_ERASE_SECTOR);
p= &disc_resume[current_resume].disc_id;
for (k=0; k<len;k++) *p++ = *bData++;
// memcpy(&disc_resume[current_resume].disc_id,bData,len);
//update disc_resume_index;
p= &disc_resume[TOTAL_RESUME].disc_id;
q= disc_resume_index;
for (k=0; k<sizeof(disc_resume_index);k++) *p++ = *q++;
// memcpy(&disc_resume[TOTAL_RESUME].disc_id,disc_resume_index,sizeof(disc_resume_index));
result = FlashWrite(FLASH_START_ADDR,disc_resume,i);
}
}
else
{
#ifdef SETUP_IN_FLASH
FlashEraseSector(FLASH_ERASE_SECTOR);
for (k=0; k<len;k++)
{
j=iAddr+k;
p=&disc_resume[TOTAL_RESUME+1].disc_info;
if (j>=(SETUP_MENU_BASE+SIZE_PER_ID))
//Wrap around for the next 64 (SIZE_PER_ID) bytes for setup
{
j-= SIZE_PER_ID;
p=&disc_resume[TOTAL_RESUME+2].disc_info;
}
*(p+j)=*bData++;
}
result = FlashWrite(FLASH_START_ADDR,disc_resume,i);
#else
result = WriteToI2c(0xa0,iAddr,bData,len) ;
#endif
}
if( result < 0 )
{//write fail
printf("!!!! ======== write flash error ======== !!!!!\n");
}
#endif//#ifndef DISC_ID_IN_FLASH
}
#ifdef RECORD_PER_SECOND //Maoyong add pre-def condition 2004.02.20
/*
* power resume function for record every secode
*/
static inline void power_rsm_ps_RsmInfo2Flash(int clr)
{
static BYTE savetemparry[50];
BYTE *p;
//printf("!!!run save_tuner_setup ,size:%d\n",sizeof(pDSV->rsm_info[0]));
#ifdef SUPPORT_FILE_SYSTEM_MODE
if ((cd_type_loaded == CDROM) && (GetCurrentFileType() == CDROM_MPG))
return ;
#endif
if( is_menu() || clr )
{
resumeMSF = 0;
resumeTRK = 0;
pFsJpeg->fsnav_dir_now = 0;
pFsJpeg->fsnav_trk_now = 0;
myTime=0;
}else
{
if(cd_type_loaded!=CDDVD)
{
resumeMSF = s_msf&0x00ffffff;
resumeTRK = cd_trk_now;
if( (cd_type_loaded==CDROM)&&( !Is_MP3_STATE() ) )
{ //Jeff 20021114//nono 20021123 modified
resumeMSF = 0; //we only support MP3, not contain JPEG/Game
}
}
else
{
resumeMSF = 1;
if(play_state!=VCD_STATE_STOP)//20021014
RSM_save(0xff,0);
}
}
if(cd_type_loaded==CDDVD)
{
int k;
int changlen=0;
BYTE first_flag=1;
p=(BYTE *)&pDSV->rsm_info[0];
for(k=(sizeof(pDSV->rsm_info[0])-1);k>=0;k--)
{
if(savetemparry[k] != p[k])
{
if(first_flag)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -