📄 sysdebug.c
字号:
{
_SYSDEBUG_ProcessCommand();
}
else //_bChangeRxToRomBuffer==TRUE, finish received data to rom data buffer, then starting to write flash
{
switch (_bCurrentCommand)
{
case WRITE_DATA_CMD:
_SYSDEBUG_ProcessWriteData();
break;
case READ_DRAMDM_CMD:
_SYSDEBUG_ProcessReadDRAMDM();
break;
case WRITE_DRAMDM_CMD:
_SYSDEBUG_ProcessWriteDRAMDM();
break;
}
}
}
}
#endif //SYSDEBUG_SUPPORT_MIN_FUNCTION
}
/****************************************************************************
** Function: _DRVSIO_CheckRX
** Description: This function will check the Rx buufer. If an "carriage retun"
** is received, it will parse the command to SYSDEBUG.
** Parameters: none.
** Return: none.
***************************************************************************/
void _SYSDEBUG_CheckRX(void)
{
if (_bSIOrxReady==TRUE)
{
/* receive '\n' or '\r' */
_SYSDEBUG_CommandParse();
_bBackupCommandLen = _bRXCommandLen;
_bRXCommandLen=0;
_bSIOrxReady=FALSE;
}
}
/****************************************************************************
**
** Fucntion: _SYSDEBUG_CommandParse
** Description: This function will parse the command and do the action
** Parameters: none.
** Return: none.
***************************************************************************/
void _SYSDEBUG_CommandParse(void)
{
_dwSYSDEBUGTemp4 = 0;
//Analyze the read/write DRAM, DM, XDATA, IDATA, DATA commands
#ifndef SYSDEBUG_SUPPORT_MIN_FUNCTION
_SYSDEBUG_AnalyzeCommand(4);
#endif
switch (_bRXCommandData[0])
{
#ifndef SYSDEBUG_SUPPORT_MIN_FUNCTION
case 'M' : //This command should be put before "D" command.
if (_bRXCommandData[1] == 'M') //Modify memory
{
if (_bRXCommandData[2] == 'X') //XDATA
_bSYSDEBUGTemp1 = SYSDEBUG_MEM_XDATA;
else if (_bRXCommandData[2] == 'I') //IDATA
_bSYSDEBUGTemp1 = SYSDEBUG_MEM_IDATA;
else if (_bRXCommandData[2] == 'D') //DATA
_bSYSDEBUGTemp1 = SYSDEBUG_MEM_DATA;
if (_bRXCommandData[3] == 'A') //And
_bSYSDEBUGTemp = SERIAL_DEBUG_OPERATE_AND;
else if (_bRXCommandData[3] == 'O') //Or
_bSYSDEBUGTemp = SERIAL_DEBUG_OPERATE_OR;
else
_bSYSDEBUGTemp = SERIAL_DEBUG_OPERATE_NONE;
_SYSDEBUG_ModifyMem(_bSYSDEBUGTemp1, (WORD)_dwSYSDEBUGTemp, (4+_bSYSDEBUGLen), (_bRXCommandLen - 4 - _bSYSDEBUGLen - 1 - 1), _bSYSDEBUGTemp);
//_dwSYSDEBUGTemp1 = 16;
}
else if (_bRXCommandData[1] == 'D')
{
if (_bRXCommandData[2] == 'R') //Modify DRAM data, MDRN, MDRA, MDRO
{
W99AV_ReadDRAMData(_dwSYSDEBUGTemp, &_dwSYSDEBUGTemp2);
if (_bRXCommandData[3] == 'A') //And
_dwSYSDEBUGTemp1 &= _dwSYSDEBUGTemp2;
else if (_bRXCommandData[3] == 'O') //Or
_dwSYSDEBUGTemp1 |= _dwSYSDEBUGTemp2;
//CoCo2.32, to support write multiple DRAM/DM at the same time.
for (_dwSYSDEBUGTemp2 = 0; _dwSYSDEBUGTemp2 < _dwSYSDEBUGTemp4; _dwSYSDEBUGTemp2++)
{
W99AV_WriteDRAMData(_dwSYSDEBUGTemp+_dwSYSDEBUGTemp2, _dwSYSDEBUGTemp1);
}
}
else if (_bRXCommandData[2] == 'M') //Modify DM data, MDMN, MDMA, MDMO
{
W99AV_ReadDM(_dwSYSDEBUGTemp, &_dwSYSDEBUGTemp2);
if (_bRXCommandData[3] == 'A') //And
_dwSYSDEBUGTemp1 &= _dwSYSDEBUGTemp2;
else if (_bRXCommandData[3] == 'O') //Or
_dwSYSDEBUGTemp1 |= _dwSYSDEBUGTemp2;
//CoCo2.32, to support write multiple DRAM/DM at the same time.
for (_dwSYSDEBUGTemp2 = 0; _dwSYSDEBUGTemp2 < _dwSYSDEBUGTemp4; _dwSYSDEBUGTemp2++)
{
W99AV_WriteDM(_dwSYSDEBUGTemp+_dwSYSDEBUGTemp2, _dwSYSDEBUGTemp1);
}
}
if (_dwSYSDEBUGTemp4 == 0)
_dwSYSDEBUGTemp1 = 1; //Dump one DWORD
else
_dwSYSDEBUGTemp1 = _dwSYSDEBUGTemp4;
}
case 'D' :
if (_bRXCommandData[1] == 'M')
{
if (_bRXCommandData[2] == 'X') //XDATA
_bSYSDEBUGTemp1 = SYSDEBUG_MEM_XDATA;
else if (_bRXCommandData[2] == 'I') //IDATA
_bSYSDEBUGTemp1 = SYSDEBUG_MEM_IDATA;
else if (_bRXCommandData[2] == 'D') //DATA
_bSYSDEBUGTemp1 = SYSDEBUG_MEM_DATA;
_SYSDEBUG_DumpMem(_bSYSDEBUGTemp1, (WORD)_dwSYSDEBUGTemp, (WORD)_dwSYSDEBUGTemp1);
}
else if (_bRXCommandData[1] == 'D')
{
if (_bRXCommandData[2] == 'R') //dump DRAM data, DDRxxxxxxxx
_SYSDEBUG_DumpDRAMOrDM(_dwSYSDEBUGTemp, _dwSYSDEBUGTemp1, SYSDEBUG_DRAM_DATA);
else if (_bRXCommandData[2] == 'M') //dump DM data, DDMxxxxxxxx
_SYSDEBUG_DumpDRAMOrDM(_dwSYSDEBUGTemp, _dwSYSDEBUGTemp1, SYSDEBUG_DM_DATA);
else
{
_printf("\nERROR\n");
return;
}
}
else
{
_printf("\nERROR\n");
return;
}
break;
case 'I': //Show debug information for W9922QF
//_SYSDEBUG_ShowDebugInfo();
_ShowDebug();
break;
#endif //SYSDEBUG_SUPPORT_MIN_FUNCTION
case 'P':
if (_bRXCommandData[1] == 'M') //MPEG debug info.
{
__bDumpType = (BYTE)_SYSDEBUG_StrToHexval(&_bRXCommandData[2], 2); //BYTE
if (__bDumpType)
__btDumpFlag = TRUE;
else
__btDumpFlag = FALSE;
}
else if (_bRXCommandData[1] == 'S') //Servo debug info.
{
gbDBFlag = (BYTE)_SYSDEBUG_StrToHexval(&_bRXCommandData[2], 2); //BYTE
}
break;
#ifndef SYSDEBUG_SUPPORT_MIN_FUNCTION
case 'R':
if (_bRXCommandData[1] == 'R') //Read W9922QF's register. RRxx
{
_bSYSDEBUGTemp = (BYTE)_SYSDEBUG_StrToHexval(&_bRXCommandData[3], 2); //BYTE
if (_bRXCommandData[2] == 'S') //Read system register. RRSxx
_dwSYSDEBUGTemp = W99AV_ReadHostRegDW(_bSYSDEBUGTemp);
else if (_bRXCommandData[2] == 'I') //Read internal register. RRIxx
_dwSYSDEBUGTemp = W99AV_ReadInternalRegDW(_bSYSDEBUGTemp);
else
break;
_printf("0x");
put_DWORD(_dwSYSDEBUGTemp);
}
break;
case 'W':
if (_bRXCommandData[1] == 'R') //Write W9922QF's register. WRxx xxxxxxxx
{
_SYSDEBUG_AnalyzeCommand(4);
if (_bRXCommandData[2] == 'S') //system register. WRSN, WRSA, WRSO
_dwSYSDEBUGTemp2 = W99AV_ReadHostRegDW(_bSYSDEBUGTemp);
else if (_bRXCommandData[2] == 'I') //Internal register: WRIN, WRIA, WRIO
_dwSYSDEBUGTemp2 = W99AV_ReadInternalRegDW(_dwSYSDEBUGTemp);
else
break;
if (_bRXCommandData[3] == 'A') //And
_dwSYSDEBUGTemp1 &= _dwSYSDEBUGTemp2;
else if (_bRXCommandData[3] == 'O') //Or
_dwSYSDEBUGTemp1 |= _dwSYSDEBUGTemp2;
if (_bRXCommandData[2] == 'S') //system register. WRSN, WRSA, WRSO
W99AV_WriteHostRegDW((BYTE)_dwSYSDEBUGTemp, LOWORD(_dwSYSDEBUGTemp1), HIWORD(_dwSYSDEBUGTemp1));
else //Internal register: WRIN, WRIA, WRIO
W99AV_WriteInternalRegDW((BYTE)_dwSYSDEBUGTemp, LOWORD(_dwSYSDEBUGTemp1), HIWORD(_dwSYSDEBUGTemp1));
}
break;
#ifdef SYSDEBUG_SUPPORT_MACROVISION_TEST
case 'O': //for read/write macrovision.
if (_bRXCommandData[1] == 'D') //OD==>Write macrovision default.
{
W99AV_WrieN0N22Default();
}
else if (_bRXCommandData[1] == 'R') //ORxx==>Read macrovision register.
{
_bSYSDEBUGTemp = (BYTE)_SYSDEBUG_StrToHexval(&_bRXCommandData[2], 2); //BYTE
_wSYSDEBUGTemp = W99AV_ReadMVRegN0N22W(_bSYSDEBUGTemp);
_printf("0x");
put_WORD(_wSYSDEBUGTemp);
}
else if (_bRXCommandData[1] == 'W') //OWxx xxxx==>Write macrovision register.
{
_SYSDEBUG_AnalyzeCommand(2);
W99AV_WriteMVRegN0N22W((BYTE)_dwSYSDEBUGTemp, (WORD)(_dwSYSDEBUGTemp1));
}
break;
#endif //SYSDEBUG_SUPPORT_MACROVISION_TEST
case 'C': //I2C
if (_bRXCommandData[1] == 'R') //Read I2C //CRxx xx xx: the sequence is device ID, address, count
{
_bSYSDEBUGTemp = (BYTE)_SYSDEBUG_StrToHexval(&_bRXCommandData[2], 2); //Device ID
_bSYSDEBUGTemp1 = (BYTE)_SYSDEBUG_StrToHexval(&_bRXCommandData[5], 2); //Address
_bSYSDEBUGTemp2 = (BYTE)_SYSDEBUG_StrToHexval(&_bRXCommandData[8], 2); //Size
for (_bSYSDEBUGTemp3 = 0; _bSYSDEBUGTemp3 < _bSYSDEBUGTemp2; _bSYSDEBUGTemp3++)
{
_I2C_Read(_bSYSDEBUGTemp, _bSYSDEBUGTemp1, 1, &_bSYSDEBUGLen);
_SYSDEBUG_DumpI2C(_bSYSDEBUGTemp1, _bSYSDEBUGLen);
_bSYSDEBUGTemp1++;
}
}
else if (_bRXCommandData[1] == 'W') //Write I2C //WRxx xx (xx xx xx xx....). The (xx xx xx xx..) are the values to be written
{
_bSYSDEBUGTemp = (BYTE)_SYSDEBUG_StrToHexval(&_bRXCommandData[2], 2); //Device ID
_bSYSDEBUGLen = (BYTE)_SYSDEBUG_StrToHexval(&_bRXCommandData[5], 2); //count
for (_bSYSDEBUGTemp1 = 0; _bSYSDEBUGTemp1 < _bSYSDEBUGLen; _bSYSDEBUGTemp1++)
{
_REG[_bSYSDEBUGTemp1] = (BYTE)_SYSDEBUG_StrToHexval(&_bRXCommandData[8+3*_bSYSDEBUGTemp1], 2);
}
_I2C_Write(_bSYSDEBUGTemp, _REG, _bSYSDEBUGLen);
}
break;
#ifdef SYSDEBUG_SUPPORT_HELP
case '?':
case 'H':
_SYSDEBUG_Help();
break;
#endif //SYSDEBUG_SUPPORT_HELP
#endif //SYSDEBUG_SUPPORT_MIN_FUNCTION
default :
_printf("\nERROR\n");
return;
}
//_printf("\nOK\n");
}
/****************************************************************************
** Function: _SYSDEBUG_StrToHexval
** Description: This function will translate a string to a Hex value.
** Parameters: pTemp==>the string.
** bNum==>the number of the the characters.
** Return: The Translated Hex value.
***************************************************************************/
#pragma NOAREGS // called in ISR
DWORD _SYSDEBUG_StrToHexval(BYTE *pTemp, BYTE bNum)
{
BYTE i;
BYTE c;
BYTE *pbStr;
_dwSYSDEBUGTemp3=0;
pbStr = pTemp;
while (*pbStr==' ')
pbStr++;
for (i = 0; i < bNum; i++)
{
c=*pbStr++;
if (c>='0' && c<='9')
c &= 0x0f;
else if (c>='A' && c<='F')
//c= (c&0x0f)+9;
c=c-65+10; //The ASCII code of 'A' is 65
else
break;
_dwSYSDEBUGTemp3 = (_dwSYSDEBUGTemp3 << 4) + c;
}
return _dwSYSDEBUGTemp3;
}
/****************************************************************************
** Function: _SYSDEBUG_ShowDebugInfo
** Description: This function will show debug information for W9922QF
** Parameters: none.
** Return: none.
***************************************************************************/
/*
void _SYSDEBUG_ShowDebugInfo(void)
{
W99AV_ReadInfo (W99AV_INFO_RISC_PC, &_dwSYSDEBUGTemp) ;
printf ("RISC PC=0x%lx", _dwSYSDEBUGTemp);
W99AV_ReadInfo (W99AV_INFO_DSP_PC, &_dwSYSDEBUGTemp) ;
printf ("\nDSP PC=0x%lx", _dwSYSDEBUGTemp);
W99AV_ReadInfo (W99AV_INFO_VIDEO_REMAIN, &_dwSYSDEBUGTemp) ;
printf ("\nV-REM=0x%lx", _dwSYSDEBUGTemp);
//W99AV_ReadInfo (W99AV_INFO_AUDIO_REMAIN, &_dwSYSDEBUGTemp) ;
_dwSYSDEBUGTemp = W99AV_ReadRegDW (ABRR); //CoCo, get real audio remainder.
printf ("\nA-REM=0x%lx", _dwSYSDEBUGTemp);
//W99AV_ReadInfo(W99AV_INFO_AUDIO2_REMAIN, &_dwSYSDEBUGTemp) ;
W99AV_ReadDM(W99AV_DM_AUDIO2_REMAIN, &_dwSYSDEBUGTemp); //CoCo, get real audio remainder.
printf ("\nA2-REM=0x%lx", _dwSYSDEBUGTemp);
_wSYSDEBUGTemp=W99AV_ReadRegW(PARSTATUSR);
printf("\nParser-Status=0x%x", _wSYSDEBUGTemp);
_wSYSDEBUGTemp=W99AV_ReadRegW(BSFORMATR);
printf("\nBSFORMATR=0x%x", _wSYSDEBUGTemp);
_dwSYSDEBUGTemp=W99AV_ReadRegDW(PARCTLR);
printf("\nPARCTLR=0x%lx", _dwSYSDEBUGTemp);
_dwSYSDEBUGTemp=W99AV_ReadRegDW(VCR);
printf("\nVCR=0x%lx", _dwSYSDEBUGTemp);
_dwSYSDEBUGTemp=W99AV_ReadInternalRegDW(AVIDR);
printf("\nAVIDR=0x%lx", _dwSYSDEBUGTemp);
_dwSYSDEBUGTemp=W99AV_ReadRegDW(PCR);
printf("\nPCR=0x%lx", _dwSYSDEBUGTemp);
W99AV_ReadInfo(W99AV_INFO_AFIFO_REMAIN, &_dwSYSDEBUGTemp);
_printf("\nIABFIFO Rem=0x");
put_DWORD (_dwSYSDEBUGTemp);
W99AV_ReadInfo(W99AV_INFO_IFIFO_REMAIN, &_dwSYSDEBUGTemp);
printf("\nIBFIFO Rem=0x%lx", _dwSYSDEBUGTemp);
_dwSYSDEBUGTemp=W99AV_GetPSRDW();
printf("\nPSR=0x%lx", _dwSYSDEBUGTemp);
__dwTemp=W99AV_ReadRegDW(PARFIFOCTLR);
printf("\nPARFIFOCTLR=0x%lx", __dwTemp);
__dwTemp=W99AV_ReadRegDW(BSFIFOREMR);
printf("\nBSFIFOREMR=0x%lx", __dwTemp);
__dwTemp=W99AV_ReadRegDW(PARFIFOREMR);
printf("\nPARFIFOREMR=0x%lx", __dwTemp);
// Issue command debug 1 to readback SP buffer count
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -