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

📄 ucode2.c

📁 车载电子影音系统dvd播放系统原程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "winav.h"
#include "w99av.h"
#include "ucode.h"
#include "cc.h"
#include "isr.h" //Kevin1.24
#include "hal.h" //Kevin2.37
#include "gdi.h" //Kevin2.37

#ifdef SUPPORT_GZIP_COMPRESSION
// Chuan1.21, UCode2: SrvData, UCode3: DSP, UCode4: IRAM

#include "SERVO\srvudeif.h" //Kevin1.26, to get SERVO FIRMWARE_VERSION 
#if !defined (FIRMWARE_VERSION) || (FIRMWARE_VERSION < 0x930526) // < 1.26 SERVO code
WORD code _wSRVData[]=
{
#include "SERVO\SRVUCOD.TXT"
};
#else
//Andy1.26, move to servo obj to fix "change servo code only -> make -> link => servo ucode hasn't been updated" 
// (ucode2.obj must be located in the same bank as srvucode.obj)
extern WORD code _wSRVData[];
#endif


WORD code _wCRAMData[]=
{
#include "cram.txt"
};

void _Unzip_DSP(BYTE bUcode);  
void _Unzip_IRAM(void);
void _Unzip_CRAM(void); 
void _Unzip_SERVO(void); 


//Kevin2.37, add
void _Unzip_CRAM(void)
{
	W99AV_FillDataToIABFIFO(_wCRAMData[1], &_wCRAMData[5]);
}


//Kevin2.37, add
void _Unzip_SERVO(void)
{
	W99AV_FillDataToIABFIFO(_wSRVData[1], &_wSRVData[5]);
}


//  *********************************************************************
//  Function    :   UCODE_Unzip
//  Description :   Feed zipped ucodes for DSP to unzip
//  Arguments   :   NULL
//  Return      :   NULL
//  Side Effect :
//  Reference   :   _OSD_ShowMPEG()
//  *********************************************************************
#pragma DISABLE
//Kevin2.37, modify
BYTE UCODE_Unzip(BYTE bUcode) 
{    
#ifdef  SUPPORT_PRINTF     
    printf("\nunzip %hx", bUcode);     
#endif         
        
	//Reset audio and Issue DSP NPF command
	HAL_Reset (HAL_RESET_AUDIO); 

    switch (bUcode)
    {
    case UCODE_IRAM:
#ifdef SUPPORT_DRAM_PROTECTION //Kevin2.30, move from _Unzip_IRAM() 
        //unprotect IRAM
        W99AV_WriteRegDW( UPR, 0x0000, 0x1E00);
#endif
		//W99AV_WriteDM(W99AV_DM_DEST_ADDR, IRAM_ADDR);  //16-bit only

		W99AV_WriteDM(W99AV_DM_STEPSIZE, 0x20); //Chuan2.27, step size = 1

		// Brian2.41, write only 16-bit to DM, DSP will shift it
		W99AV_WriteDM(W99AV_DM_DEST_ADDR, (IRAM_ADDR >> 8));

        _Unzip_IRAM();
        break;

    case UCODE_CRAM:
		//W99AV_WriteDM(W99AV_DM_DEST_ADDR, UCODE_BACKUP_ADDR);  //16-bit only
		
		W99AV_WriteDM(W99AV_DM_STEPSIZE, 0x20); //Chuan2.27, step size = 1

		// Brian2.41, write only 16-bit to DM, DSP will shift it
		W99AV_WriteDM(W99AV_DM_DEST_ADDR, UCODE_BACKUP_ADDR >> 8);

		_Unzip_CRAM();
		break;

#ifndef RUNTIME_UNZIP_DSP_UCODE
    case UCODE_DSPRAM:
		//W99AV_WriteDM(W99AV_DM_DEST_ADDR, UCODE_BACKUP_ADDR);  //16-bit only
		
		W99AV_WriteDM(W99AV_DM_STEPSIZE, 0x20); //Chuan2.27, step size = 1

		// Brian2.41, write only 16-bit to DM, DSP will shift it
		W99AV_WriteDM(W99AV_DM_DEST_ADDR, UCODE_BACKUP_ADDR >> 8);

#else //RUNTIME_UNZIP_DSP_UCODE //Kevin2.31
    case UCODE_DSPRAM_AC3:
	case UCODE_DSPRAM_PCM:
	case UCODE_DSPRAM_DTS:
	case UCODE_DSPRAM_MPG:
	case UCODE_DSPRAM_MP3:
#ifdef SUPPORT_WMA
	case UCODE_DSPRAM_WMA:
#endif
		//W99AV_WriteDM(W99AV_DM_DEST_ADDR, W99AV_ADDR_RUNTIME_UNZIP_DSP_UCODE);
		
		W99AV_WriteDM(W99AV_DM_STEPSIZE, 0x20); //Chuan2.27, step size = 1

		// Brian2.41, write only 16-bit to DM, DSP will shift it
		W99AV_WriteDM(W99AV_DM_DEST_ADDR, W99AV_ADDR_RUNTIME_UNZIP_DSP_UCODE >> 8);

#endif //#ifndef RUNTIME_UNZIP_DSP_UCODE

#ifdef SUPPORT_DRAM_PROTECTION //Kevin2.30, move from _Unzip_DSP()
#ifndef RUNTIME_UNZIP_DSP_UCODE // Brian2.36, run-time unzip has no DSP backup to protect, we will use UCPR2 to protect font table
        //unprotect Ucode Backup
        W99AV_WriteRegDW( UCPR2, 0x0000, 0x0000);
#endif
#endif
        _Unzip_DSP(bUcode);
        break;

    case UCODE_SERVO:
		//W99AV_WriteDM(W99AV_DM_DEST_ADDR, 0x7F000);  //16-bit only
		
		W99AV_WriteDM(W99AV_DM_STEPSIZE, 0x20); //Chuan2.27, step size = 1

		// Brian2.41, write only 16-bit to DM, DSP will shift it
		W99AV_WriteDM(W99AV_DM_DEST_ADDR, 0x7F0);

		_Unzip_SERVO();
		break;
    
#ifndef REMOVE_SETUP_ICON
	case SETUPICON:
		//W99AV_WriteDM(W99AV_DM_DEST_ADDR, OSD_DRAM_FONT_TABLE_START_0);  //16-bit only
		
		W99AV_WriteDM(W99AV_DM_STEPSIZE, 0x20); //Chuan2.27, step size = 1      
		
		// Brian2.41, write only 16-bit to DM, DSP will shift it
		W99AV_WriteDM(W99AV_DM_DEST_ADDR, OSD_DRAM_FONT_TABLE_START_0 >> 8);

		{
			extern void _UnzipSetupIcon(void);
			_UnzipSetupIcon();
		}
		break;
#endif

	case FONTTABLE:
        //W99AV_WriteDM(W99AV_DM_DEST_ADDR, OSD_DRAM_FONT_TABLE_START_0);  //16-bit only
		
#ifdef FONT_TABLE_AT_ODD_ADDRESS // Brian2.30, CT908S
        W99AV_WriteDM(W99AV_DM_STEPSIZE, 0x40); //Chuan2.27, step size = 2
#else
        W99AV_WriteDM(W99AV_DM_STEPSIZE, 0x20); //Chuan2.27, step size = 1
#endif        

		// Brian2.41, write only 16-bit to DM, DSP will shift it
		W99AV_WriteDM(W99AV_DM_DEST_ADDR, OSD_DRAM_FONT_TABLE_START_0 >> 8);

		{
			extern void OSD_LoadFontTableGzip(void);
			OSD_LoadFontTableGzip();
		}
		break;

#ifdef SUPPORT_UNICODE
	case LOCALFONTTABLE0:
        //W99AV_WriteDM(W99AV_DM_DEST_ADDR, OSD_DRAM_FONT_TABLE_START_0);  //16-bit only
		

#ifdef FONT_TABLE_AT_ODD_ADDRESS // Brian2.30, CT908S
        W99AV_WriteDM(W99AV_DM_STEPSIZE, 0x40); //Chuan2.27, step size = 2
#else
        W99AV_WriteDM(W99AV_DM_STEPSIZE, 0x20); //Chuan2.27, step size = 1
#endif        

		// Brian2.41, write only 16-bit to DM, DSP will shift it
		W99AV_WriteDM(W99AV_DM_DEST_ADDR, OSD_DRAM_FONT_TABLE_START_0 >> 8);

		{
			extern void OSD_LoadLocalFontTableGzip0(void);
			OSD_LoadLocalFontTableGzip0();
		}
		break;
	
	case LOCALFONTTABLE1:
        //W99AV_WriteDM(W99AV_DM_DEST_ADDR, OSD_DRAM_FONT_TABLE_START_0);  //16-bit only
		
#ifdef FONT_TABLE_AT_ODD_ADDRESS // Brian2.30, CT908S
        W99AV_WriteDM(W99AV_DM_STEPSIZE, 0x40); //Chuan2.27, step size = 2
#else
        W99AV_WriteDM(W99AV_DM_STEPSIZE, 0x20); //Chuan2.27, step size = 1
#endif        

		// Brian2.41, write only 16-bit to DM, DSP will shift it
		W99AV_WriteDM(W99AV_DM_DEST_ADDR, OSD_DRAM_FONT_TABLE_START_0 >> 8);

		{
			extern void OSD_LoadLocalFontTableGzip1(void);
			OSD_LoadLocalFontTableGzip1();
		}
		break;
#endif //#ifdef SUPPORT_UNICODE

    } //switch (bUcode)       

/*
	//Kevin2.31, add more s.t. gzippram.inc won't wait for buffer remainder to be larger than a threshold
#ifdef SYSTEM_8051
	for (__bTemp = 0; __bTemp < 255; __bTemp++)
    {
        OUTB(IBDPR0,0x00);
        OUTB(IBDPR0,0x01);
        OUTB(IBDPR0,0x02);
        OUTB(IBDPR0,0x03);
    }
#endif
*/

    //Check Unzip Status 
    __wTemp=0;
    do {

        if (__wTemp++ > 100)    //Kevin1.24, avoid infinite loop
        {        
#ifdef SUPPORT_PRINTF 
            printf("\nunzip %hx timeout => reset uP or retry", bUcode);
            printf("\nDEBR:%lx A:%lx", W99AV_ReadRegDW(DEBR), W99AV_ReadRegDW (ABRR));            
            printf("\nDEBR:%lx A:%lx", W99AV_ReadRegDW(DEBR), W99AV_ReadRegDW (ABRR));            
            printf("\nDEBR:%lx A:%lx", W99AV_ReadRegDW(DEBR), W99AV_ReadRegDW (ABRR));            
#endif                
			
#if 0
			//Kevin2.31, debug
			EA = 1;
			while(1)
			{
				extern void SYSDEBUG_Poll(void);
				SYSDEBUG_Poll(); 
			} 		
#endif
                 
			//Kevin2.32, add retry mechanism in _ChangeDSPCode
			if ( (bUcode>=UCODE_DSPRAM_AC3) && (bUcode<=UCODE_DSPRAM_WMA) )
				return FALSE;

#ifdef SYSTEM_8051
            *( BYTE xdata *)(0x8000) = 0x75;
            *( BYTE xdata *)(0x8001) = 0xC3;
            *( BYTE xdata *)(0x8002) = 0x04;
            *( BYTE xdata *)(0x8003) = 0;
            *( BYTE xdata *)(0x8004) = 0;
            *( BYTE xdata *)(0x8003) = 0;
            *( BYTE xdata *)(0x8004) = 0;
            *( BYTE xdata *)(0x8003) = 0;
            *( BYTE xdata *)(0x8004) = 0;
            *( BYTE xdata *)(0x8003) = 0;
            *( BYTE xdata *)(0x8004) = 0;
            *( BYTE xdata *)(0x8003) = 0;
            *( BYTE xdata *)(0x8004) = 0;
            MONITOR_RUN_PROGRAM=6;
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
            NOP
#else
			printf("\nUCODE_Unzip %hx fails!", bUcode);
			printf("\nPress any key to continue !");
			getch();
#endif
        }
        
        //Kevin2.39a, when unzipping IRAM, F/W reads DM[GZIP_STATUS] to see if DSP has done the unzip.  
        // But at this time, IRAM code may be not intact, so the read DM command has potential danger as tested below: 
        // 4 Wait no ACK! 0013000E, 000017DB, DEBR:40070497 <= read DM[GZIP_STATUS] command 
	    // Sol: Read internal Reg instead of DM (DSP maps the DM value to specific REG)
        //W99AV_ReadDM (W99AV_DM_GZIP_STATUS, &__dwTemp);
        __dwTemp=W99AV_ReadInternalRegDW(0x96);
    } while (__dwTemp!=2);
    


    //Kevin2.30, must wait for gzip finish then protect DRAM
    switch (bUcode)
    {
    case UCODE_IRAM: //Kevin2.30, move from _Unzip_IRAM() 
#ifdef SUPPORT_DRAM_PROTECTION        
    //protect IRAM form IRAM_ADDR to IRAM_END_ADDR
    dwTemp = 0x1F000000 | ((DWORD)(IRAM_END_ADDR>>8)<<12) | IRAM_ADDR>>8;
    W99AV_WriteRegDW( UPR, LOWORD(dwTemp), HIWORD(dwTemp));
#endif
        break;

    case UCODE_DSPRAM: //Kevin2.30, move from _Unzip_DSP()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -