📄 sysdebug.c
字号:
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 + -