📄 ucode3.c
字号:
#include "winav.h"
#include "w99av.h"
#include "ucode.h"
#include "cc.h"
/////////////////////////////////////////////////////////////////////
// ***** Big Modification History Area *****
// Chuan 278 2002/10/28: The PRAM/ERAM must download together, else DSP will run at wrong
// code after release audio. For example: The first instruction is jump to ERAM for JPGPRAM.
// But at that time, JPGERAM is not ready. If it jump to critical point, it may make DSP crash.
// UCODE_PMRAM_XXX / UCODE_ERAM_XXX -> UCODE_DSPRAM_XXX
// include the micro-code of RISC URAM
#ifdef SUPPORT_GZIP_COMPRESSION
#ifndef RUNTIME_UNZIP_DSP_UCODE
WORD code _wDSPData[]=
{
#include "dsp.txt"
};
#else //#ifndef RUNTIME_UNZIP_DSP_UCODE //Kevin2.31
WORD code _wAC3Data[]=
{
#include "ac3.txt"
};
WORD code _wPCMData[]=
{
#include "pcm.txt"
};
WORD code _wDTSData[]=
{
#include "dts.txt"
};
WORD code _wMPGData[]=
{
#include "mpg.txt"
};
WORD code _wMP3Data[]=
{
#include "mp3.txt"
};
#ifdef SUPPORT_WMA
WORD code _wWMAData[]=
{
#include "wma.txt"
};
#endif
#endif //#ifndef RUNTIME_UNZIP_DSP_UCODE
//Kevin2.37, modify
void _Unzip_DSP(BYTE bUcode)
{
extern BYTE *_bpArray;
WORD code *_wpArray;
switch(bUcode)
{
#ifndef RUNTIME_UNZIP_DSP_UCODE
case UCODE_DSPRAM:
_wpArray = _wDSPData;
break;
#else //#ifndef RUNTIME_UNZIP_DSP_UCODE
case UCODE_DSPRAM_AC3:
_wpArray = _wAC3Data;
break;
case UCODE_DSPRAM_PCM:
_wpArray = _wPCMData;
break;
case UCODE_DSPRAM_DTS:
_wpArray = _wDTSData;
break;
case UCODE_DSPRAM_MPG:
_wpArray = _wMPGData;
break;
case UCODE_DSPRAM_MP3:
_wpArray = _wMP3Data;
break;
#ifdef SUPPORT_WMA
case UCODE_DSPRAM_WMA:
_wpArray = _wWMAData;
break;
#endif
#endif //#ifndef RUNTIME_UNZIP_DSP_UCODE
}
W99AV_FillDataToIABFIFO(_wpArray[1], &_wpArray[5]);
}
#else
DWORD code _dwCRAM[]=
{
#include "cram.inc"
};
DWORD code _dwMPGPRAM[]=
{
#include "mpgpram.inc"
};
DWORD code _dwMPGERAM[]=
{
#include "mpgeram.inc"
};
DWORD code _dwMP3PRAM[]=
{
#include "mp3pram.inc"
};
DWORD code _dwMP3ERAM[]=
{
#include "mp3eram.inc"
};
DWORD code _dwPCMPRAM[]=
{
#include "pcmpram.inc"
};
DWORD code _dwPCMERAM[]=
{
#include "pcmeram.inc"
};
// ********************************************************************
// Function : UCODE2_LoadCode
// Description : Download the desired micro-code
// Arguments : bRam, the desired ucode;
// Return : TRUE or FALSE
// Side Effect :
// ********************************************************************
#pragma DISABLE
BYTE UCODE3_LoadCode(BYTE bRam, BYTE bCode)
{
bRet = TRUE ;
switch (bRam)
{
case UCODE_CRAM :
// Chuan2.80, Load CRAM Code for CT908.
#ifdef SYSTEM_8051
dwRAM = _dwCRAM ;
#else
bRet = _OpenUCODE ("cram.inc");
#endif
for (_UCODEIndex=0; _UCODEIndex<dwRAM[1]; _UCODEIndex++)
{
W99AV_OutIndex (W99AV_AIRID_RISCCRAM | _UCODEIndex) ;
W99AV_OutData (dwRAM [_UCODEIndex+START]) ;
}
break;
// Chuan0.83, Move Load DSP Code Part form UCODE to UCODE2
case UCODE_DSPRAM :
// Chuan 278 2002/10/28: Load DSP PRAM first.
if (_bDSPramCur == bCode)
{
// TCC040, let upper level know that code not changed
bRet = UCODE_LOAD_NONE ;
break ;
}
_bDSPramCur = bCode ;
switch (bCode)
{
case UCODE_DSPRAM_MPG:
#ifdef SYSTEM_8051
dwRAM = _dwMPGPRAM ;
#else
bRet = _OpenUCODE ( "mpgpram.inc" );
#endif
break ;
case UCODE_DSPRAM_MP3:
#ifdef SYSTEM_8051
dwRAM = _dwMP3PRAM ;
#else
bRet = _OpenUCODE ( "mp3pram.inc" );
#endif
break ;
case UCODE_DSPRAM_PCM:
#ifdef SYSTEM_8051
dwRAM = _dwPCMPRAM ;
#else
bRet = _OpenUCODE ( "pcmpram.inc" );
#endif
break ;
}
// Chuan 278 2002/10/28: Keep A_RST high
W99AV_WriteRegDW (PCR, (WORD)(__wW99AVPCRLow|0x20), __wW99AVPCRHigh) ;
_UCODEIndex = (WORD)dwRAM[1];
dwRAM += START;
for (__wTemp=0; __wTemp<_UCODEIndex; __wTemp++)
{
// Chuan DVD_171 12/11/2001: use simple way
#if IO == IO_PCI
W99AV_OutIndex (W99AV_AIRID_DSPMEM | 0x00010000L | __wTemp) ;
#else
// Chuan1.00, Don't use function in order to reduce load code time.
OUTB(AIR3, HIBYTE(HIWORD(W99AV_AIRID_DSPMEM))) ;
OUTB(AIR2, LOBYTE(HIWORD(W99AV_AIRID_DSPMEM|0x00010000L))) ;
OUTB(AIR1, HIBYTE(__wTemp)) ;
OUTB(AIR0, LOBYTE(__wTemp)) ;
#endif
W99AV_OutData (dwRAM [__wTemp]) ;
}
#ifndef SYSTEM_8051
if (pdwUcode)
{
_hfree(pdwUcode);
pdwUcode = NULL;
}
#endif
// Chuan 278 2002/10/28: Load DSP ERAM
switch (bCode)
{
case UCODE_DSPRAM_MPG:
#ifdef SYSTEM_8051
dwRAM = _dwMPGERAM ;
#else
bRet = _OpenUCODE ( "mpgeram.inc" );
#endif
#ifndef NO_BACKUP_ERAM
// Chuan1.00, Use DRAMCOPY CMD to copy or store DSP ERAM code.
if (_bDSPBackup&MPGERAM)
{
__dwW99AV_SrcDRAM = MPGERAM_ADDR;
__dwW99AV_DestDRAM = ERAM_ADDR;
}
else
{
__dwW99AV_SrcDRAM = ERAM_ADDR;
__dwW99AV_DestDRAM = MPGERAM_ADDR;
_bDSPBackup|=MPGERAM;
}
#endif
break ;
case UCODE_DSPRAM_MP3:
#ifdef SYSTEM_8051
dwRAM = _dwMP3ERAM ;
#else
bRet = _OpenUCODE ( "mp3eram.inc" );
#endif
#ifndef NO_BACKUP_ERAM
// Chuan1.00, Use DRAMCOPY CMD to copy or store DSP ERAM code.
if (_bDSPBackup&MP3ERAM)
{
__dwW99AV_SrcDRAM = MP3ERAM_ADDR;
__dwW99AV_DestDRAM = ERAM_ADDR;
}
else
{
__dwW99AV_SrcDRAM = ERAM_ADDR;
__dwW99AV_DestDRAM = MP3ERAM_ADDR;
_bDSPBackup|=MP3ERAM;
}
#endif
break ;
case UCODE_DSPRAM_PCM:
#ifdef SYSTEM_8051
dwRAM = _dwPCMERAM ;
#else
bRet = _OpenUCODE ( "pcmeram.inc" );
#endif
#ifndef NO_BACKUP_ERAM
// Chuan1.00, Use DRAMCOPY CMD to copy or store DSP ERAM code.
if (_bDSPBackup&PCMERAM)
{
__dwW99AV_SrcDRAM = PCMERAM_ADDR;
__dwW99AV_DestDRAM = ERAM_ADDR;
}
else
{
__dwW99AV_SrcDRAM = ERAM_ADDR;
__dwW99AV_DestDRAM = PCMERAM_ADDR;
_bDSPBackup|=PCMERAM;
}
#endif
break ;
}
#ifdef SUPPORT_DRAM_PROTECTION
//Kevin1.01, unprotect ERAM
W99AV_WriteRegDW( UCPR1, 0x0000, 0x0000);
#endif
#ifndef NO_BACKUP_ERAM
if (__dwW99AV_SrcDRAM == ERAM_ADDR)
#endif
{
if (!W99AV_WriteDRAMBurst (ERAM_ADDR, &(dwRAM[START]), (WORD)dwRAM[1]))
{
#ifdef SUPPORT_PRINTF
printf ("\nWrite ERAM Error [0x%x] = [0x%lx]", ERAM_ADDR+_UCODEIndex, dwRAM[_UCODEIndex+2]) ;
#endif
_bDSPBackup = 0; // Chuan1.05, ERAM load fail, so reset _bDSPBackup.
bRet = FALSE ;
}
#if defined(SUPPORT_DRAM_PROTECTION) && !defined(NO_BACKUP_ERAM)
//Chuan1.05, unprotect ERAM Backup when need copy ERAM to ERAM Backup
W99AV_WriteRegDW( UCPR2, 0x0000, 0x0000);
#endif
}
#ifndef NO_BACKUP_ERAM
W99AV_DRAMCopy(dwRAM[1]);
#ifdef SUPPORT_DRAM_PROTECTION
//Kevin1.01, protect ERAM backup form UCODE_BACKUP_ADDR to UCODE_BACKUP_END_ADDR
dwTemp = 0x01000000 | ((DWORD)(UCODE_BACKUP_END_ADDR>>8)<<12) | UCODE_BACKUP_ADDR>>8;
W99AV_WriteRegDW( UCPR2, LOWORD(dwTemp), HIWORD(dwTemp));
#endif // SUPPORT_DRAM_PROTECTION
#endif // NO_BACKUP_ERAM
#ifdef SUPPORT_DRAM_PROTECTION
//Kevin1.01, protect ERAM form ERAM_ADDR to ERAM_END_ADDR
dwTemp = 0x01000000 | ((DWORD)(ERAM_END_ADDR>>8)<<12) | ERAM_ADDR>>8;
W99AV_WriteRegDW( UCPR1, LOWORD(dwTemp), HIWORD(dwTemp));
#endif // SUPPORT_DRAM_PROTECTION
// Chuan 278 2002/10/28: Release A_RST
W99AV_WriteRegDW (PCR, __wW99AVPCRLow, __wW99AVPCRHigh) ;
break ;
}
#ifndef SYSTEM_8051
if (pdwUcode)
{
_hfree(pdwUcode);
pdwUcode = NULL;
}
#endif
return bRet ;
}
// ********************************************************************
// Function : UCODE3_CheckCode
// Description : Check the desired micro-code
// Arguments : bRam, the desired ucode;
// Return : TRUE or FALSE
// Side Effect :
// ********************************************************************
#pragma DISABLE
BYTE UCODE3_CheckCode (BYTE bRam, BYTE bCode)
{
bRet = TRUE ;
#ifdef CHECK_UCODE_LOAD
switch (bRam)
{
case UCODE_DSPRAM :
// Chuan 278 2002/10/28: Check DSP PRAM first.
switch (bCode)
{
case UCODE_DSPRAM_MPG:
#ifdef SYSTEM_8051
dwRAM = _dwMPGPRAM ;
#else
bRet = _OpenUCODE ( "mpgpram.inc" );
#endif
break ;
case UCODE_DSPRAM_MP3:
#ifdef SYSTEM_8051
dwRAM = _dwMP3PRAM ;
#else
bRet = _OpenUCODE ( "mp3pram.inc" );
#endif
break ;
case UCODE_DSPRAM_PCM:
#ifdef SYSTEM_8051
dwRAM = _dwPCMPRAM ;
#else
bRet = _OpenUCODE ( "pcmpram.inc" );
#endif
break ;
}
dwData = W99AV_AIRID_DSPMEM | 0x00010000L ;
// Chuan 278 2002/10/28: Keep A_RST high
W99AV_WriteRegDW (PCR,(WORD) (__wW99AVPCRLow|0x0020), __wW99AVPCRHigh) ;
for (_UCODEIndex=0; _UCODEIndex<dwRAM[1]; _UCODEIndex++)
{
W99AV_OutIndex(dwData | _UCODEIndex) ;
W99AV_InData();
W99AV_OutIndex(dwData | _UCODEIndex) ;
dwTemp=W99AV_InData() & 0x0fffffff;
if(dwTemp!=dwRAM[_UCODEIndex+START])
{
#ifdef SUPPORT_PRINTF
printf ("\nCheck DSP PM RAM %d Error [0x%lx] != [0x%lx]", _UCODEIndex, dwTemp, dwRAM[_UCODEIndex+START]) ;
#endif
bRet = FALSE ;
break ;
}
}
#ifndef SYSTEM_8051
if (pdwUcode)
{
_hfree(pdwUcode);
pdwUcode = NULL;
}
#endif
// Chuan 278 2002/10/28: Check DSP ERAM
switch (bCode)
{
case UCODE_DSPRAM_MPG:
#ifdef SYSTEM_8051
dwRAM = _dwMPGERAM ;
#else
bRet = _OpenUCODE ( "mpgeram.inc" );
#endif
break ;
case UCODE_DSPRAM_MP3:
#ifdef SYSTEM_8051
dwRAM = _dwMP3ERAM ;
#else
bRet = _OpenUCODE ( "mp3eram.inc" );
#endif
break ;
case UCODE_DSPRAM_PCM:
#ifdef SYSTEM_8051
dwRAM = _dwPCMERAM ;
#else
bRet = _OpenUCODE ( "pcmeram.inc" );
#endif
break ;
}
for (_UCODEIndex=0; _UCODEIndex<dwRAM[1]; _UCODEIndex++)
{
W99AV_ReadDRAMData (ERAM_ADDR+_UCODEIndex, &dwTemp) ;
if(dwTemp!=dwRAM[_UCODEIndex+START])
{
#ifdef SUPPORT_PRINTF
printf ("\nCheck ERAM %d Error [0x%lx] != [0x%lx]", _UCODEIndex, dwTemp, dwRAM[_UCODEIndex+START]) ;
#endif
_bDSPBackup = 0; // Chuan1.05, ERAM load fail, so reset _bDSPBackup.
bRet = FALSE ;
break ;
}
}
W99AV_WriteRegDW (PCR, __wW99AVPCRLow, __wW99AVPCRHigh) ;
break ;
}
#ifndef SYSTEM_8051
if (pdwUcode)
{
_hfree(pdwUcode);
pdwUcode = NULL;
}
#endif
#endif // #ifdef CHECK_UCODE_LOAD
return bRet ;
}
#endif // #ifndef SUPPORT_GZIP_COMPRESSION
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -