⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsm_util.h

📁 Sunplus 8202S source code.
💻 H
📖 第 1 页 / 共 3 页
字号:
/*
*  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 + -