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

📄 ucode2.c

📁 车载电子影音系统dvd播放系统原程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifdef SUPPORT_DRAM_PROTECTION        
    //protect Ucode 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
        break;
    }

	//Kevin2.32
	return TRUE;
}

#else //#ifdef SUPPORT_GZIP_COMPRESSION

DWORD code _dwAC3PRAM[]=
{
#include "ac3pram.inc"
};
DWORD code _dwAC3ERAM[]=
{
#include "ac3eram.inc"
};

DWORD code _dwDTSPRAM[]=
{
#include "dtspram.inc"
};
DWORD code _dwDTSERAM[]=
{
#include "dtseram.inc"
};

BYTE    _bDSPBackup;  // Chuan1.00, record which ERAM code to be stored at DRAM
// ********************************************************************
//  Function    :   UCODE2_LoadCode
//  Description :   Download the desired micro-code
//  Arguments   :   bRam, the desired ucode;
//  Return      :   TRUE or FALSE
//  Side Effect :
// ********************************************************************
#pragma DISABLE
BYTE UCODE2_LoadCode(BYTE bRam, BYTE bCode)
{
   bRet = TRUE ;

    switch (bRam)
    {
    // Chuan0.85, 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_AC3:
    #ifdef SYSTEM_8051
            dwRAM = _dwAC3PRAM ;
    #else
            bRet = _OpenUCODE ( "ac3pram.inc" );
    #endif
            break ;
        case UCODE_DSPRAM_DTS:
    #ifdef SYSTEM_8051
            dwRAM = _dwDTSPRAM ;
    #else
            bRet = _OpenUCODE ( "dtspram.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_AC3:
    #ifdef SYSTEM_8051
            dwRAM = _dwAC3ERAM ;
    #else
            bRet = _OpenUCODE ( "ac3eram.inc" );
    #endif
#ifndef NO_BACKUP_ERAM
            // Chuan1.00, Use DRAMCOPY CMD to copy or store DSP ERAM code.
            if (_bDSPBackup&AC3ERAM)
            {
                __dwW99AV_SrcDRAM = AC3ERAM_ADDR;
                __dwW99AV_DestDRAM = ERAM_ADDR;
            }
            else
            {
                __dwW99AV_SrcDRAM = ERAM_ADDR;
                __dwW99AV_DestDRAM = AC3ERAM_ADDR;
                _bDSPBackup|=AC3ERAM;
            }
#endif
            break ;
        case UCODE_DSPRAM_DTS:
    #ifdef SYSTEM_8051
            dwRAM = _dwDTSERAM ;
    #else
            bRet = _OpenUCODE ( "dtseram.inc" );
    #endif
#ifndef NO_BACKUP_ERAM
            // Chuan1.00, Use DRAMCOPY CMD to copy or store DSP ERAM code.
            if (_bDSPBackup&DTSERAM)
            {
                __dwW99AV_SrcDRAM = DTSERAM_ADDR;
                __dwW99AV_DestDRAM = ERAM_ADDR;
            }
            else
            {
                __dwW99AV_SrcDRAM = ERAM_ADDR;
                __dwW99AV_DestDRAM = DTSERAM_ADDR;
                _bDSPBackup|=DTSERAM;
            }
#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    :   UCODE2_CheckCode
//  Description :   Check the desired micro-code
//  Arguments   :   bRam, the desired ucode;
//  Return      :   TRUE or FALSE
//  Side Effect :
// ********************************************************************
#pragma DISABLE
BYTE UCODE2_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_AC3:
    #ifdef SYSTEM_8051
            dwRAM = _dwAC3PRAM ;
    #else
            bRet = _OpenUCODE ( "ac3pram.inc" );
    #endif
            break ;
        case UCODE_DSPRAM_DTS:
    #ifdef SYSTEM_8051
            dwRAM = _dwDTSPRAM ;
    #else
            bRet = _OpenUCODE ( "dtspram.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_AC3:
    #ifdef SYSTEM_8051
            dwRAM = _dwAC3ERAM ;
    #else
            bRet = _OpenUCODE ( "ac3eram.inc" );
    #endif
            break ;
        case UCODE_DSPRAM_DTS:
    #ifdef SYSTEM_8051
            dwRAM = _dwDTSERAM ;
    #else
            bRet = _OpenUCODE ( "dtseram.inc" );
    #endif
            break ;
        case UCODE_DSPRAM_DVD:
    #ifdef SYSTEM_8051
            dwRAM = _dwDVDERAM ;
    #else
            bRet = _OpenUCODE ( "dvderam.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 check 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 + -