📄 ucode2.c
字号:
#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 + -