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

📄 sysdebug.c

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