📄 ucode.c
字号:
__wW99AVPCRHigh |= 0x0004; // PCR[18]:URAM_EN
W99AV_WriteRegDW(PCR,(WORD)(__wW99AVPCRLow|0x10), __wW99AVPCRHigh);
W99AV_WriteRegDW(PCR,(WORD)__wW99AVPCRLow, __wW99AVPCRHigh);
break ;
//////////////////////////////////////////////////////////////////
// ***** Load CRAM Code *****
case UCODE_CRAM :
#ifndef USE_LOAD_CRAM_WORK_AROUND
// Chuan1.21, Uzip will put CRAM.INC at DRAM(UCODE_BACKUP_ADDR)
// Step 1: Specify the desired DRAM address into CBAR[20:0]
W99AV_OutCacheAddr(UCODE_BACKUP_ADDR);
// Step 2: Specify the NO# of bytes which will be moved from DRAM to Cache
// into BMSR1 & BMSR0
W99AV_SetCacheRWNo((WORD)(SIZE_CRAM<<2));
// Step 3: Set Cache R/W mode=011 to assert an block read cache interrupt to RISC
W99AV_SetCacheRWMode(0x33);
__wTemp = 0;
while(__wTemp != SIZE_CRAM)
{
// Step 4: Waiting for Command acknowledge
if (!_W99AV_WaitACK(INT_CACK))
{
return FALSE;
}
//Kevin1.21-2, comment
//W99AV_OutIndex (W99AV_AIRID_RISCCRAM | _UCODEIndex) ;
//W99AV_OutData (dwRAM [_UCODEIndex+START]) ;
// Step 5: Read Data from Cache
while(1)
{
#if IO == IO_PCI
BYTE * bIdx ;
//W99AV_OutIndex (W99AV_AIRID_RISCCRAM |__wTemp) ;
bIdx = (BYTE *)&dwTemp;
*(bIdx+3) = W99AV_InCacheData();
*(bIdx+2) = W99AV_InCacheData();
*(bIdx+1) = W99AV_InCacheData();
*bIdx = W99AV_InCacheData();
W99AV_OutIndex (W99AV_AIRID_RISCCRAM |__wTemp) ;
W99AV_OutData (dwTemp) ;
#else
// Chuan1.00, Don't use function in order to reduce load code time.
OUTB(AIR3, HIBYTE(HIWORD(W99AV_AIRID_RISCCRAM))) ;
OUTB(AIR2, LOBYTE(HIWORD(W99AV_AIRID_RISCCRAM))) ;
OUTB(AIR1, HIBYTE(__wTemp)) ;
OUTB(AIR0, LOBYTE(__wTemp)) ;
OUTB(DPR3, INPB(CDPR)) ;
OUTB(DPR2, INPB(CDPR)) ;
OUTB(DPR1, INPB(CDPR)) ;
OUTB(DPR0, INPB(CDPR)) ;
#endif
__wTemp++;
// Per 256 Byte need wait ACK again.
if ((__wTemp >= SIZE_CRAM)||((__wTemp%64)==0))
break;
}
}
#else // #ifndef USE_LOAD_CRAM_WORK_AROUND
//Kevin2.30, avoid load CRAM wait no command ACK by cache -> burst temp. (cache R/W can be used only after CRAM is loaded)
//Burst Read 1 (read 1 DW for every Command Interrupt)
/*
__wTemp = 0;
while(__wTemp != SIZE_CRAM)
{
#if IO == IO_PCI
W99AV_ReadDRAMData(UCODE_BACKUP_ADDR+__wTemp, &dwTemp);
W99AV_OutIndex (W99AV_AIRID_RISCCRAM |__wTemp) ;
W99AV_OutData (dwTemp);
#else
// Chuan1.00, Don't use function in order to reduce load code time.
W99AV_ReadDRAMData(UCODE_BACKUP_ADDR+__wTemp, &dwTemp);
OUTB(AIR3, HIBYTE(HIWORD(W99AV_AIRID_RISCCRAM))) ;
OUTB(AIR2, LOBYTE(HIWORD(W99AV_AIRID_RISCCRAM))) ;
OUTB(AIR1, HIBYTE(__wTemp)) ;
OUTB(AIR0, LOBYTE(__wTemp)) ;
W99AV_OutData (dwTemp);
#endif
__wTemp++;
}
*/
//Burst Read 2 (read 16 DW for every Command Interrupt)
{
#define MAX_BURST_READ 16
extern DWORD _dwAddr;
__pbBuffer= (BYTE *)__cBuffer;
_UCODEIndex = 0;
__wTemp = SIZE_CRAM;
_dwAddr = UCODE_BACKUP_ADDR;
while (__wTemp)
{
if (__wTemp >= MAX_BURST_READ)
{
__wTemp -= MAX_BURST_READ ;
}
else
{
__wTemp = 0 ;
}
if (!_ReadDRAMBurst (_dwAddr, (DWORD*)__pbBuffer, MAX_BURST_READ))
return FALSE ;
for ( __bTemp=0; __bTemp<MAX_BURST_READ; __bTemp++)
{
#if IO == IO_PCI
W99AV_OutIndex (W99AV_AIRID_RISCCRAM |_UCODEIndex) ;
W99AV_OutData ( *((DWORD*)__pbBuffer+__bTemp) );
#else
// Chuan1.00, Don't use function in order to reduce load code time.
OUTB(AIR3, HIBYTE(HIWORD(W99AV_AIRID_RISCCRAM))) ;
OUTB(AIR2, LOBYTE(HIWORD(W99AV_AIRID_RISCCRAM))) ;
OUTB(AIR1, HIBYTE(_UCODEIndex)) ;
OUTB(AIR0, LOBYTE(_UCODEIndex)) ;
W99AV_OutData (*((DWORD*)__pbBuffer+__bTemp));
#endif
_UCODEIndex++;
}
_dwAddr += MAX_BURST_READ ;
}
__pbBuffer= (BYTE *)__cBuffer;
}
#endif // #ifndef USE_LOAD_CRAM_WORK_AROUND
break;
//alex1.24a SCAN DRAM at poweron
#ifdef SUPPORT_DRAM_SCAN_POWERON
case UCODE_CRAM_DRAMTEST :
#ifdef SYSTEM_8051
dwRAM = _dwCRAMTest ;
#else
bRet = _OpenUCODE ("cramtest.inc");
#endif
for (_UCODEIndex=0; _UCODEIndex<dwRAM[1]; _UCODEIndex++)
{
W99AV_OutIndex (W99AV_AIRID_RISCCRAM | _UCODEIndex) ;
W99AV_OutData (dwRAM [_UCODEIndex+START]) ;
}
break;
#endif //#ifdef SUPPORT_DRAM_SCAN_POWERON
//////////////////////////////////////////////////////////////////
// ***** Load DSP PRAM/ERAM Code *****
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_GZIP:
#ifdef SYSTEM_8051
dwRAM = _dwGZIPPRAM ;
#else
bRet = _OpenUCODE ( "gzippram.inc" );
#endif
// 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: Release A_RST
__wW99AVPCRLow &=~0x20;
W99AV_WriteRegDW (PCR, __wW99AVPCRLow, __wW99AVPCRHigh) ;
return bRet;
break ;
#ifndef RUNTIME_UNZIP_DSP_UCODE
//Kevin1.23, modify relative positions of ucodes ucodezip.bat to increase gzip compression ratio (AD DSP.txt size in 1.22a :0x5a83 -> 0x580c)
case UCODE_DSPRAM_AC3:
__dwW99AV_SrcDRAM = UCODE_BACKUP_ADDR;
__wW99AV_SizeDRAM = SIZE_AC3PRAM;
break ;
case UCODE_DSPRAM_DTS:
__dwW99AV_SrcDRAM = UCODE_BACKUP_ADDR+SIZE_AC3PRAM;
__wW99AV_SizeDRAM = SIZE_DTSPRAM;
break ;
case UCODE_DSPRAM_MP3:
__dwW99AV_SrcDRAM = UCODE_BACKUP_ADDR+SIZE_AC3PRAM+SIZE_DTSPRAM;
__wW99AV_SizeDRAM = SIZE_MP3PRAM;
break ;
case UCODE_DSPRAM_MPG:
__dwW99AV_SrcDRAM = UCODE_BACKUP_ADDR+SIZE_AC3PRAM+SIZE_DTSPRAM+SIZE_MP3PRAM;
__wW99AV_SizeDRAM = SIZE_MPGPRAM;
break ;
case UCODE_DSPRAM_PCM:
__dwW99AV_SrcDRAM = UCODE_BACKUP_ADDR+SIZE_AC3PRAM+SIZE_DTSPRAM+SIZE_MP3PRAM+SIZE_MPGPRAM;
__wW99AV_SizeDRAM = SIZE_PCMPRAM;
break ;
#ifdef SUPPORT_WMA //Kevin1.23, add
case UCODE_DSPRAM_WMA:
__dwW99AV_SrcDRAM = UCODE_BACKUP_ADDR+SIZE_AC3PRAM+SIZE_DTSPRAM+SIZE_MP3PRAM+SIZE_MPGPRAM+SIZE_PCMPRAM;
__wW99AV_SizeDRAM = SIZE_WMAPRAM;
break ;
#endif
#else //#ifndef RUNTIME_UNZIP_DSP_UCODE //Kevin2.31
case UCODE_DSPRAM_AC3:
__dwW99AV_SrcDRAM = W99AV_ADDR_RUNTIME_UNZIP_DSP_UCODE;
__wW99AV_SizeDRAM = SIZE_AC3PRAM;
break ;
case UCODE_DSPRAM_DTS:
__dwW99AV_SrcDRAM = W99AV_ADDR_RUNTIME_UNZIP_DSP_UCODE;
__wW99AV_SizeDRAM = SIZE_DTSPRAM;
break ;
case UCODE_DSPRAM_MP3:
__dwW99AV_SrcDRAM = W99AV_ADDR_RUNTIME_UNZIP_DSP_UCODE;
__wW99AV_SizeDRAM = SIZE_MP3PRAM;
break ;
case UCODE_DSPRAM_MPG:
__dwW99AV_SrcDRAM = W99AV_ADDR_RUNTIME_UNZIP_DSP_UCODE;
__wW99AV_SizeDRAM = SIZE_MPGPRAM;
break ;
case UCODE_DSPRAM_PCM:
__dwW99AV_SrcDRAM = W99AV_ADDR_RUNTIME_UNZIP_DSP_UCODE;
__wW99AV_SizeDRAM = SIZE_PCMPRAM;
break ;
#ifdef SUPPORT_WMA //Kevin1.23, add
case UCODE_DSPRAM_WMA:
__dwW99AV_SrcDRAM = W99AV_ADDR_RUNTIME_UNZIP_DSP_UCODE;
__wW99AV_SizeDRAM = SIZE_WMAPRAM;
break ;
#endif
#endif //#ifndef RUNTIME_UNZIP_DSP_UCODE
}
// Chuan 278 2002/10/28: Keep A_RST high
W99AV_WriteRegDW (PCR, (WORD)(__wW99AVPCRLow|0x20), __wW99AVPCRHigh) ;
// Step 1: Specify the desired DRAM address into CBAR[20:0]
W99AV_OutCacheAddr(__dwW99AV_SrcDRAM);
// Step 2: Specify the NO# of bytes which will be moved from DRAM to Cache
// into BMSR1 & BMSR0
W99AV_SetCacheRWNo((WORD)(__wW99AV_SizeDRAM<<2));
// Step 3: Set Cache R/W mode=011 to assert an block read cache interrupt to RISC
W99AV_SetCacheRWMode(0x33);
__wTemp = 0;
while(__wTemp != __wW99AV_SizeDRAM)
{
// Step 4: Waiting for Command acknowledge
if (!_W99AV_WaitACK(INT_CACK))
{
return FALSE;
}
// Step 5: Read Data from Cache
while(1)
{
#if IO == IO_PCI
BYTE * bIdx ;
W99AV_OutIndex (W99AV_AIRID_DSPMEM | 0x00010000L |__wTemp) ;
bIdx = (BYTE *)&dwTemp;
*(bIdx+3) = W99AV_InCacheData();
*(bIdx+2) = W99AV_InCacheData();
*(bIdx+1) = W99AV_InCacheData();
*bIdx = W99AV_InCacheData();
W99AV_OutData (dwTemp) ;
#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)) ;
OUTB(DPR3, INPB(CDPR)) ;
OUTB(DPR2, INPB(CDPR)) ;
OUTB(DPR1, INPB(CDPR)) ;
OUTB(DPR0, INPB(CDPR)) ;
#endif
__wTemp++;
// Per 256 Byte need wait ACK again.
if ((__wTemp >= __wW99AV_SizeDRAM)||((__wTemp%64)==0))
break;
}
}
#ifndef RUNTIME_UNZIP_DSP_UCODE
//Kevin1.23, add
__dwTemp=UCODE_BACKUP_ADDR+SIZE_AC3PRAM+SIZE_DTSPRAM+SIZE_MP3PRAM+SIZE_MPGPRAM+SIZE_PCMPRAM+SIZE_WMAPRAM;
// Chuan 278 2002/10/28: Load DSP ERAM
switch (bCode)
{
//Kevin1.23, modify relative positions of ucodes ucodezip.bat to increase gzip compression ratio (AD DSP.txt size in 1.22a :0x5a83 -> 0x580c)
case UCODE_DSPRAM_AC3:
__dwW99AV_SrcDRAM = __dwTemp;
__wW99AV_SizeDRAM = SIZE_AC3ERAM;
break ;
case UCODE_DSPRAM_DTS:
__dwW99AV_SrcDRAM = __dwTemp+SIZE_AC3ERAM;
__wW99AV_SizeDRAM = SIZE_DTSERAM;
break ;
case UCODE_DSPRAM_MP3:
__dwW99AV_SrcDRAM = __dwTemp+SIZE_AC3ERAM+SIZE_DTSERAM;
__wW99AV_SizeDRAM = SIZE_MP3ERAM;
break ;
case UCODE_DSPRAM_MPG:
__dwW99AV_SrcDRAM = __dwTemp+SIZE_AC3ERAM+SIZE_DTSERAM+SIZE_MP3ERAM;
__wW99AV_SizeDRAM = SIZE_MPGERAM;
break ;
case UCODE_DSPRAM_PCM:
__dwW99AV_SrcDRAM = __dwTemp+SIZE_AC3ERAM+SIZE_DTSERAM+SIZE_MP3ERAM+SIZE_MPGERAM;
__wW99AV_SizeDRAM = SIZE_PCMERAM;
break ;
#ifdef SUPPORT_WMA //Kevin1.23, add
case UCODE_DSPRAM_WMA:
__dwW99AV_SrcDRAM = __dwTemp+SIZE_AC3ERAM+SIZE_DTSERAM+SIZE_MP3ERAM+SIZE_MPGERAM+SIZE_PCMERAM;
__wW99AV_SizeDRAM = SIZE_WMAERAM;
break ;
#endif
}
#else //#ifndef RUNTIME_UNZIP_DSP_UCODE //Kevin2.31
switch (bCode)
{
//Kevin1.23, modify relative positions of ucodes ucodezip.bat to increase gzip compression ratio (AD DSP.txt size in 1.22a :0x5a83 -> 0x580c)
case UCODE_DSPRAM_AC3:
__dwW99AV_SrcDRAM = W99AV_ADDR_RUNTIME_UNZIP_DSP_UCODE+SIZE_AC3PRAM;
__wW99AV_SizeDRAM = SIZE_AC3ERAM;
break ;
case UCODE_DSPRAM_DTS:
__dwW99AV_SrcDRAM = W99AV_ADDR_RUNTIME_UNZIP_DSP_UCODE+SIZE_DTSPRAM;
__wW99AV_SizeDRAM = SIZE_DTSERAM;
break ;
case UCODE_DSPRAM_MP3:
__dwW99AV_SrcDRAM = W99AV_ADDR_RUNTIME_UNZIP_DSP_UCODE+SIZE_MP3PRAM;
__wW99AV_SizeDRAM = SIZE_MP3ERAM;
break ;
case UCODE_DSPRAM_MPG:
__dwW99AV_SrcDRAM = W99AV_ADDR_RUNTIME_UNZIP_DSP_UCODE+SIZE_MPGPRAM;
__wW99AV_SizeDRAM = SIZE_MPGERAM;
break ;
case UCODE_DSPRAM_PCM:
__dwW99AV_SrcDRAM = W99AV_ADDR_RUNTIME_UNZIP_DSP_UCODE+SIZE_PCMPRAM;
__wW99AV_SizeDRAM = SIZE_PCMERAM;
break ;
#ifdef SUPPORT_WMA //Kevin1.23, add
case UCODE_DSPRAM_WMA:
__dwW99AV_SrcDRAM = W99AV_ADDR_RUNTIME_UNZIP_DSP_UCODE+SIZE_WMAPRAM;
__wW99AV_SizeDRAM = SIZE_WMAERAM;
break ;
#endif
}
#endif //#ifndef RUNTIME_UNZIP_DSP_UCODE
//Kevin2.31, comment
/*
//Kevin1.26, add warning for exceeding ucode backup range
if (__dwW99AV_SrcDRAM+__wW99AV_SizeDRAM > W99AV_ADDR_UCODE_END_BACKUP)
OSD_Output( MSG_VERSION, 1324, 0xff );
*/
__dwW99AV_DestDRAM = ERAM_ADDR;
#ifdef SUPPORT_DRAM_PROTECTION
//Kevin1.01, unprotect ERAM
W99AV_WriteRegDW( UCPR1, 0x0000, 0x0000);
#endif
W99AV_DRAMCopy(__wW99AV_SizeDRAM);
#ifdef SUPPORT_DRAM_PROTECTION
//Kevin1.01, protect ERAM form ERAM_ADDR to ERAM_END_ADDR
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -