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

📄 sysdebug.c

📁 车载电子影音系统dvd播放系统原程序代码
💻 C
📖 第 1 页 / 共 4 页
字号:
            putchar_SBUF(ACK_READ_DRAMDM_CMD);
        }
        else
        {
            _SYSDEBUG_EndCommand();
            putchar_SBUF(ERROR_READ_DRAMDM_CMD);
        }
        break;
    case WRITE_DRAMDM_CMD:
        _bSYSDEBUGType = _SYSDEBUG_ReadInBuffer(); //To get DRAM or DM
        _wROMSize = _SYSDEBUG_ReadInBuffer();  
        _wROMSize <<= 8;
        _wROMSize |= _SYSDEBUG_ReadInBuffer();
        _bSYSDEBUGTemp = _SYSDEBUG_ReadAndCheckInBuffer(&_bSYSDEBUGTemp1);
        if (_bSYSDEBUGTemp1 == END_CMD) 
        {
            putchar_SBUF(ACK_WRITE_DRAMDM_CMD);
            _bChangeRxToRomBuffer = TRUE;
            _wROMdataBufIndex = 0;
        }
        else
        {
            _SYSDEBUG_EndCommand();
            putchar_SBUF(ERROR_WRITE_DRAMDM_CMD);
        }
        break;
    case WRITE_DATA_CMD:
        /* receive write data command, then change rx buffer to rom data buffer */
        _wROMSize = _SYSDEBUG_ReadInBuffer();  
        _wROMSize <<= 8;
        _wROMSize |= _SYSDEBUG_ReadInBuffer();
        _bSYSDEBUGTemp = _SYSDEBUG_ReadAndCheckInBuffer(&_bSYSDEBUGTemp1);
        if (_bSYSDEBUGTemp1 == END_CMD)    
        {
            putchar_SBUF(ACK_WRITE_DATA_CMD);
            _bChangeRxToRomBuffer = TRUE;
            _wROMdataBufIndex = 0;
        }
        else
        {
            _SYSDEBUG_EndCommand();
            putchar_SBUF(ERROR_WRITE_DATA_CMD);
        }
        break;
    case PREPARE_AUTO_UPGRADE_CMD:
        _bSYSDEBUGTemp = _SYSDEBUG_ReadAndCheckInBuffer(&_bSYSDEBUGTemp1);
        if (_bSYSDEBUGTemp1 == END_CMD)    
        {
			//CoCo1.22, disable watch dog before auto-upgrade.
			_SYSDEBUG_DisableWatchDog();

            _bAutoUpgrade = TRUE;

			//CoCo1.23, reset audio to fix the problem about can't auto-upgrade when playing MP3/WMA.
			if (__bAttrPlay & TYPE_CDROM_AUDIO)
				HAL_Reset(HAL_RESET_AUDIO);

            HAL_VCD30_Area(FALSE);
            HAL_SetBorderColor(HAL_COLOR_BLACK);
            HAL_Display(HAL_DISPLAY_VIDEO, FALSE);
            OSD_OUTPUT_MACRO (MSG_STOP, NULL, NULL );
            OSD_OUTPUT_MACRO(MSG_OSDAPP, OSD_APPMODE_AUTOUPGRADE, 0xFF); 
            OSD_OUTPUT_MACRO(MSG_AUTOUPGRADE,AUTOUPGRADE_PREPARE,0xff);
            _bpROMBuf = &__bPool[LENGTH_SHAREPOOL - ROW_SIZE - 6];
                
//#ifdef  USE_32M_SDRAM        
			//Write the dvd908.bin address to let Serial Debug Tool read it.
			W99AV_WriteDRAMData(W99AV_DRAM_VERSION_ADR, W99AV_UPGRADE_DRAMADDR);

			//Write the flash.bin address to let Serial Debug Tool read it.
			W99AV_WriteDRAMData(W99AV_DRAM_FLASH_BIN_ADDR, W99AV_FLASH_DRAMADDR_SERIALONLY);
//#endif 			

            putchar_SBUF(ACK_PREPARE_AUTO_UPGRADE_CMD);
        }
        else
        {
            _SYSDEBUG_EndCommand();
            putchar_SBUF(ERROR_PREPARE_AUTO_UPGRADE_CMD);
        }
        break;
    case AUTO_UPGRADE_CMD:
        _bINITIALTemp = _SYSDEBUG_ReadInBuffer();    //receive the 2048's multiple of flash.bin
        _bSYSDEBUGTemp2 = _SYSDEBUG_ReadInBuffer();  //for 4M or 8M flash
        _bSYSDEBUGTemp = _SYSDEBUG_ReadAndCheckInBuffer(&_bSYSDEBUGTemp1);
        if (_bSYSDEBUGTemp1 == END_CMD)    
        {
            _bBinMode = FALSE;
            //__btDIGEST = TRUE;
            //LJY1.20, remove DIGEST for supporting 4M flash, use __btMute instead of __btDIGEST
            __btMute = TRUE;
            /*
            if (_bSYSDEBUGTemp2 == 4)
                W99AV_WriteFlash(FLASH_TYPE_4M);
            else
                W99AV_WriteFlash(FLASH_TYPE_8M);
                */
            //W99AV_WriteFlash(_bSYSDEBUGTemp2);
            W99AV_UpdateFlash(_bSYSDEBUGTemp2); //alex1.26-1,clear setup value before autoupgrade
        }
        break; 
    case EXIT_AUTO_UPGRADE_CMD:
		//CoCo1.22, enable watch dog when exiting auto-upgrade.
		_SYSDEBUG_EnableWatchDog();

        _bSYSDEBUGTemp = _SYSDEBUG_ReadAndCheckInBuffer(&_bSYSDEBUGTemp1);
        if (_bSYSDEBUGTemp1 == END_CMD)    
        {
            _bAutoUpgrade = FALSE;
            OSD_OUTPUT_MACRO(MSG_AUTOUPGRADE,AUTOUPGRADE_ABORT,0xff);
            HAL_SetBorderColor(HAL_COLOR_RED);
            UTL_DelayTime((WORD)COUNT_1_SEC,0);        
            OSD_OUTPUT_MACRO(MSG_OSDAPP, OSD_APPMODE_EXIT | EXIT_AUTOUPGRADE, 0x0);
            HAL_Display(HAL_DISPLAY_VIDEO, TRUE);    
            HAL_SetBorderColor(HAL_COLOR_BORDER);                   
            OSD_Output(MSG_LOGO, OSD_LOGO_CLEAR, NULL);
            OSD_Output (MSG_LOGO, NULL, 0xff);

            putchar_SBUF(ACK_EXIT_AUTO_UPGRADE_CMD);
        }
        else
        {
            _SYSDEBUG_EndCommand();
            putchar_SBUF(ERROR_EXIT_AUTO_UPGRADE_CMD);
        }
        break;
    default :  
        putchar_SBUF(_bCurrentCommand);    
        break;
   }
}

/****************************************************************************
 ** Function:           _SYSDEBUG_ReadInBuffer
 ** Description:        
 ** Parameters:         none.
 ** Return:             none.
 ***************************************************************************/
BYTE _SYSDEBUG_ReadInBuffer(void)
{         
    if(_bSCONinBufReadIndex != _bSCONinBufWriteIndex)
    {
        _bSYSDEBUGTemp3 = _bRXCommandData[_bSCONinBufReadIndex++];
        if(_bSCONinBufReadIndex >= RX_COMMAND_SIZE)
            _bSCONinBufReadIndex = 0;    
    }
    else  /* no data in Rx buffer, error read */
        _bSYSDEBUGTemp3=0xff;

    return _bSYSDEBUGTemp3;
}

/****************************************************************************
 ** Function:           _SYSDEBUG_ReadAndCheckInBuffer
 ** Description:        
 ** Parameters:         none.
 ** Return:             none.
 ***************************************************************************/
BYTE _SYSDEBUG_ReadAndCheckInBuffer(BYTE * bRetValue)
{          
    if(_bSCONinBufReadIndex != _bSCONinBufWriteIndex)
    {
        *bRetValue = _bRXCommandData[_bSCONinBufReadIndex++];
        if (_bSCONinBufReadIndex >= RX_COMMAND_SIZE)
            _bSCONinBufReadIndex = 0;    
    }
    else  /* no data in Rx buffer, error read */
        return FALSE;
    
    return TRUE;
}

void _SYSDEBUG_ProcessWriteData(void)
{
    _wSYSDEBUGTemp = _bpROMBuf[_wROMSize-5]; //get the check sum
    _wSYSDEBUGTemp <<= 8;
    _wSYSDEBUGTemp |= _bpROMBuf[_wROMSize-6];
    
    _dwSYSDEBUGTemp = 0; 
    for (_bSYSDEBUGTemp = 0; _bSYSDEBUGTemp < 4; _bSYSDEBUGTemp++) //calculate download address
    {
        _dwSYSDEBUGTemp <<= 8;
        _dwSYSDEBUGTemp |= _bpROMBuf[_wROMSize-4+_bSYSDEBUGTemp];
    }
    
    _wSYSDEBUGTemp1 = 0; //calculate check sum
    for (_wROMdataBufIndex = 0; _wROMdataBufIndex < (_wROMSize-6); _wROMdataBufIndex++)
    {
        _wSYSDEBUGTemp1 += (WORD)_bpROMBuf[_wROMdataBufIndex]; 
    }

    _bChangeRxToRomBuffer = FALSE;
    
    if (_wSYSDEBUGTemp1 != _wSYSDEBUGTemp)
        putchar_SBUF(ACK_RECEIVE_WRONG_DATA);
    else  //cheksum is equal, write to DRAM to do auto upgrade*/
    {
        W99AV_WriteDRAMBurst(_dwSYSDEBUGTemp, (DWORD *)_bpROMBuf, (_wROMSize-6)/4);
        putchar_SBUF(ACK_RECEIVE_ROM_DATA);
    } 
}            

void _SYSDEBUG_ProcessReadDRAMDM(void)
{
    _dwSYSDEBUGTemp = 0;
    for (_bSYSDEBUGTemp = 0; _bSYSDEBUGTemp < 4; _bSYSDEBUGTemp++) //address
    {
        _dwSYSDEBUGTemp <<= 8;
        _dwSYSDEBUGTemp |= _bpROMBuf[_bSYSDEBUGTemp];
    }

    _dwSYSDEBUGTemp1 = 0;
    for (_bSYSDEBUGTemp = 0; _bSYSDEBUGTemp < 4; _bSYSDEBUGTemp++) //size
    {
        _dwSYSDEBUGTemp1 <<= 8;
        _dwSYSDEBUGTemp1 |= _bpROMBuf[_bSYSDEBUGTemp+4];
    }
   
    _bChangeRxToRomBuffer = FALSE;

	//CoCo1.22, disable watch dog
	_SYSDEBUG_DisableWatchDog();

    EA = 0;
    for (_dwSYSDEBUGTemp3 = 0; _dwSYSDEBUGTemp3 < _dwSYSDEBUGTemp1; _dwSYSDEBUGTemp3++)
    {
        if (RI)
        {
            if (SBUF == END_CMD)
            {
                RI = 0;
                EA = 1;
				//CoCo1.22, Enable watch dog
				if (!_bAutoUpgrade)
				{
					_SYSDEBUG_EnableWatchDog();
				}
                return;
            }
        }        

        if (_bSYSDEBUGType == SERIAL_DEBUG_READ_DRAM)
            W99AV_ReadDRAMData(_dwSYSDEBUGTemp, &_dwSYSDEBUGTemp2); 
        else if (_bSYSDEBUGType == SERIAL_DEBUG_READ_DM)
            W99AV_ReadDM(_dwSYSDEBUGTemp, &_dwSYSDEBUGTemp2);           

        putchar_SBUF(HIBYTE(HIWORD(_dwSYSDEBUGTemp2)));
        putchar_SBUF(LOBYTE(HIWORD(_dwSYSDEBUGTemp2)));
        putchar_SBUF(HIBYTE(LOWORD(_dwSYSDEBUGTemp2)));
        putchar_SBUF(LOBYTE(LOWORD(_dwSYSDEBUGTemp2)));
        _dwSYSDEBUGTemp++;
    }

    EA = 1;

	//CoCo1.22, Enable watch dog
	if (!_bAutoUpgrade)
	{
		_SYSDEBUG_EnableWatchDog();
	}
}

void _SYSDEBUG_ProcessWriteDRAMDM(void)
{
    _dwSYSDEBUGTemp = 0;
    for (_bSYSDEBUGTemp = 0; _bSYSDEBUGTemp < 4; _bSYSDEBUGTemp++)
    {
        _dwSYSDEBUGTemp <<= 8;
        _dwSYSDEBUGTemp |= _bpROMBuf[_bSYSDEBUGTemp];
    }

    _dwSYSDEBUGTemp1 = 0;
    for (_bSYSDEBUGTemp = 0; _bSYSDEBUGTemp < 4; _bSYSDEBUGTemp++)
    {
        _dwSYSDEBUGTemp1 <<= 8;
        _dwSYSDEBUGTemp1 |= _bpROMBuf[_bSYSDEBUGTemp+4];
    }

    if (_bSYSDEBUGType == SERIAL_DEBUG_WRITE_DRAM)
        W99AV_WriteDRAMData(_dwSYSDEBUGTemp, _dwSYSDEBUGTemp1); 
    else if (_bSYSDEBUGType == SERIAL_DEBUG_WRITE_DM)
        W99AV_WriteDM(_dwSYSDEBUGTemp, _dwSYSDEBUGTemp1); 
        
    _bChangeRxToRomBuffer = FALSE;
    
    putchar_SBUF(ACK_COMPLETE_WRITE_DRAMDM);
}

void _SYSDEBUG_EndCommand(void)
{
    while ((_bSYSDEBUGTemp1!=END_CMD) && (_bSYSDEBUGTemp==TRUE))
    {
        _bSYSDEBUGTemp = _SYSDEBUG_ReadAndCheckInBuffer(&_bSYSDEBUGTemp1);
    }
}

void _SYSDEBUG_AnalyzeCommand(BYTE bStart)
{
    _wSYSDEBUGTemp1 = _SYSDEBUG_SearchCommand(bStart);
    _bSYSDEBUGLen = (BYTE)(_wSYSDEBUGTemp1 & 0xff);    //The length of the address

    //The first parameter
    _dwSYSDEBUGTemp = _SYSDEBUG_StrToHexval(&_bRXCommandData[bStart], _bSYSDEBUGLen);

    _bSYSDEBUGTemp3 = (_wSYSDEBUGTemp1 & 0xFF00) >> 8; //to see if have space

    //Get the second parameter, _dwSYSDEBUGTemp1
    if (_bSYSDEBUGTemp3) //have first space            
    {
        //CoCo2.32, judge if have the second space
        _wSYSDEBUGTemp1 = _SYSDEBUG_SearchCommand(bStart+_bSYSDEBUGLen+1); //DDRN+_bSYSDEBUGLen+SPACE
        _bSYSDEBUGTemp3 = (_wSYSDEBUGTemp1 & 0xFF00) >> 8; //to see if have second space
        if (_bSYSDEBUGTemp3)
        {
            _bSYSDEBUGLen1 = (BYTE)(_wSYSDEBUGTemp1 & 0xff); //length of the second parameter
            _dwSYSDEBUGTemp1 = _SYSDEBUG_StrToHexval(&_bRXCommandData[bStart+_bSYSDEBUGLen], _bSYSDEBUGLen1); //The size = _bRXCommandLen - DDRN - _bSYSDEBUGLen - SPACE - ENTER
            _dwSYSDEBUGTemp4 = _SYSDEBUG_StrToHexval(&_bRXCommandData[bStart+_bSYSDEBUGLen+1+_bSYSDEBUGLen1], (_bRXCommandLen - bStart - _bSYSDEBUGLen - 1 - _bSYSDEBUGLen1 -1 - 1)); //The size = _bRXCommandLen - DDRN - _bSYSDEBUGLen - SPACE - _bSYSDEBUGLen1 - SPACE - ENTER           
        }
        else
        {
            _dwSYSDEBUGTemp1 = _SYSDEBUG_StrToHexval(&_bRXCommandData[bStart+_bSYSDEBUGLen], (_bRXCommandLen - bStart - _bSYSDEBUGLen - 1 - 1)); //The size = _bRXCommandLen - DDRN - _bSYSDEBUGLen - SPACE - ENTER
            _dwSYSDEBUGTemp4 = 1;
        }
    }
    else
    {
        _dwSYSDEBUGTemp1 = SYSDEBUG_DUMP_SIZE;
    }
}

//***************************************************************************
//  Function    :   _SYSDEBUG_DisableWatchDog
//  Abstract    :   This function will disable watch dog.
//  Arguments   :   none.
//  Return      :   none.
//  Side Effect :   none.
//  Notes       :   none.
//***************************************************************************
void _SYSDEBUG_DisableWatchDog(void)
{
#ifdef SUPPORT_WATCHDOG
	TIMED_ACCESS();
	WTCON = 0x00;
#endif
}

//***************************************************************************
//  Function    :   _SYSDEBUG_EnableWatchDog
//  Abstract    :   This function will enable watch dog.
//  Arguments   :   none.
//  Return      :   none.
//  Side Effect :   none.
//  Notes       :   none.
//***************************************************************************
void _SYSDEBUG_EnableWatchDog(void)
{
#ifdef SUPPORT_WATCHDOG
	__dwProgressCount = UTL_GetSysTimer();
	TIMED_ACCESS();
	WTCON = 0x03;
#endif
}

#endif //#ifndef SYSDEBUG_SUPPORT_MIN_FUNCTION

#endif //#define SERIAL_DEBUG

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -