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

📄 ucode.c

📁 车载电子影音系统dvd播放系统原程序代码
💻 C
📖 第 1 页 / 共 4 页
字号:
        __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 + -