📄 tmmon.c
字号:
break;
case 'R' : // si se so
if ( ( wIdxArg + 1 ) == argc )
goto main_argerr;
switch ( toupper ( argv[wIdxArg][2] ) )
{
case 'I' :
if ( argv[wIdxArg + 1][0] == '-' )
{
goto main_argerr;
}
strcpy ( szFilenameIn, argv[++wIdxArg] );
break;
case 'O' :
if ( argv[wIdxArg + 1][0] == '-' )
{
goto main_argerr;
}
strcpy ( szFilenameOut, argv[++wIdxArg] );
break;
case 'E' :
if ( argv[wIdxArg + 1][0] == '-' )
{
goto main_argerr;
}
strcpy ( szFilenameErr, argv[++wIdxArg] );
break;
default :
goto main_argerr;
}
break;
case 'W' :
sscanf(&argv[wIdxArg][2], "%d", &pObject->dwWindowLines );
if ( ( pObject->dwWindowLines <= 50) || ( pObject->dwWindowLines >= 999 ) )
{
goto main_argerr;
}
break;
case 'X' :
pObject->CRT = True;
break;
case '?':
default :
fprintf ( stderr,
"\r\n\r\nusage : TMMon [-x] [-w WindowSize]\r\n");
goto mainEXIT1;
}
}
// check if we are requried to runover a COM port.
if ( pObject->UseCOMPort )
{
sprintf ( szFilenameIn, "COM:%u:%u", pObject->dwPort, pObject->dwBaud );
sprintf ( szFilenameOut, "COM:%u:%u", pObject->dwPort, pObject->dwBaud );
sprintf ( szFilenameErr, "COM:%u:%u", pObject->dwPort, pObject->dwBaud );
fprintf ( stderr,
"\r\nOPTIONS : IN[%s] OUT[%s] ERR[%s] PORT[%d] SPEED[%d]\r\n",
( szFilenameIn[0] ? szFilenameIn : "StdIn" ),
( szFilenameOut[0] ? szFilenameOut : "StdOut" ),
( szFilenameErr[0] ? szFilenameErr : "StdErr" ),
pObject->dwPort, pObject->dwBaud );
}
// BEGIN Delete
if ( ! iodevCreate ( &pObject->pIODev, &pObject->pIODevVTBL ) )
{
goto mainEXIT1;
}
if ( ! OpenIoDevice ( pObject, szFilenameIn, IODEV_HANDLE_IN ) )
{
fprintf ( stderr,
"\r\nTMMon : ERROR : Open Input File : FAILED : Terminating ... " );
goto mainEXIT2;
// stdin open error
}
if ( ! OpenIoDevice ( pObject, szFilenameOut, IODEV_HANDLE_OUT ) )
{
fprintf ( stderr,
"\r\nTMMon : ERROR : Open Output File : FAILED : Terminating ... " );
goto mainEXIT2;
}
if ( ! OpenIoDevice ( pObject, szFilenameErr, IODEV_HANDLE_ERR ) )
{
fprintf ( stderr,
"\r\nTMMon : ERROR : Open Error File : FAILED : Terminating ... " );
goto mainEXIT2;
}
//END delete
Version.Major = verGetFileMajorVersion();
Version.Minor = verGetFileMinorVersion();
tmmanNegotiateVersion (
constTMManDefault,
&Version );
if ( ( Version.Major != verGetFileMajorVersion() ) ||
( Version.Minor != verGetFileMinorVersion()) )
{
fprintf (stderr, "\r\nTMMon : ERROR : tmmon.exe Version[%d.%d] is INCOMPATIBLE With TMMan32.dll Version[%d.%d]\n",
verGetFileMajorVersion(), verGetFileMinorVersion(),
Version.Major, Version.Minor );
goto mainEXIT3;
}
pObject->DSPCount = tmmanDSPGetNum();
sprintf (TempString, "\r\nTMMon : TriMedia Processor Count[%u]\r\n",
pObject->DSPCount );
pObject->pIODevVTBL->WriteStr(pObject->pIODev, TempString);
for ( DSPIdx = 0 ; DSPIdx < pObject->DSPCount ; DSPIdx++ )
{
UInt32 DSPHandle;
tmmanDSPInfo DSPInfo;
if ( ( TMMANStatus = tmmanDSPOpen ( DSPIdx, &DSPHandle ) ) != statusSuccess )
{
fprintf ( stderr, "\r\nTMMon : ERROR : Cannot initialize TMMAN : Terminating ... " );
break;
}
if ( ( TMMANStatus = tmmanDSPGetInfo ( DSPHandle, &DSPInfo ) ) != statusSuccess )
{
break;
}
PrintProcessorInfo(pObject, &DSPInfo);
tmmanDSPClose(DSPHandle);
}
pObject->CurrentDSPNumber = 0;
if ( ( TMMANStatus = tmmanDSPOpen (
pObject->CurrentDSPNumber,
&pObject->CurrentDSPHandle ) ) != statusSuccess )
{
fprintf ( stderr, "\r\nTMMon : ERROR : Cannot initialize TMMAN : Terminating ... " );
goto mainEXIT3;
}
if ( ( TMMANStatus = tmmanDSPGetInfo (
pObject->CurrentDSPHandle,
&pObject->CurrentDSPInfo ) ) != statusSuccess )
{
goto mainEXIT4;
}
if ( pObject->CRT )
{
cruntimeInit();
}
// main execution loop.
for ( ; ! fExitFlag ; )
{
UInt8 szInputString[constTMManStringLength];
UInt8 szToken[constTMManStringLength];
UInt16 wPosition = 0;
UInt32 dwDSPNumber = 0;
Bool fNewLine = False;
UInt16 wIdxCmd, wCommandIndex;
Bool fTokenStatus;
sprintf (szPrompt, "\r\n[%x]>> ", pObject->CurrentDSPNumber );
pObject->pIODevVTBL->WriteStr(pObject->pIODev, szPrompt);
if ( ! ReadInputLine (pObject, szInputString) )
{
pObject->pIODevVTBL->WriteStr(pObject->pIODev,
"\r\nTMMon:ERROR:Command Input Buffer Overflow");
}
if ( ( fTokenStatus = GetNextToken (
szInputString, &wPosition , szToken ) ) == False )
{
//just pressed enter so give a new prompt.
// and read the next line
continue;
}
else
{
for ( wIdxCmd = 0 ; wIdxCmd < MaxCommands ; wIdxCmd++ )
{
if ( stricmp ( szToken , CommandTable[wIdxCmd].szCommand ) == 0 )
{
wCommandIndex = wIdxCmd;
break;
}
}
if ( wIdxCmd == MaxCommands )
{
pObject->pIODevVTBL->WriteStr(pObject->pIODev,
"\r\nTMMon:ERROR:Command Invalid : Use \'help\' for Command List");
// command not found
continue;
}
}
// valid command idx in CommandIndex
for ( ; ; )
{
CMD_STATUS_CODE CommandStatus;
pObject->pCmdContext = CommandTable[wCommandIndex].pContext;
CommandStatus = CommandTable[wCommandIndex].CommandFunction (
( fTokenStatus ? szToken : Null ),
&CommandTable[wCommandIndex].dwState,
pObject );
// get the next token
fTokenStatus = GetNextToken (
szInputString, &wPosition , szToken );
if ( CommandStatus == CMD_STATUS_OK )
continue;
// assumes that all commands start with 0 as the first
// state BUGCHECK
CommandTable[wCommandIndex].dwState = 0;
switch ( CommandStatus )
{
case CMD_STATUS_PARSEERR :
pObject->pIODevVTBL->WriteStr(pObject->pIODev,
"\r\nTMMon:ERROR:Command Syntax Error");
break;
case CMD_STATUS_INADEQUATE :
pObject->pIODevVTBL->WriteStr(pObject->pIODev,
"\r\nTMMon:ERROR:Command Incomplete");
break;
case CMD_STATUS_PARAMERR :
pObject->pIODevVTBL->WriteStr(pObject->pIODev,
"\r\nTMMon:ERROR:Command Parameter Validation Error");
// syntax error
break;
case CMD_STATUS_QUIT :
fExitFlag = True;
break;
case CMD_STATUS_PARAMEXTRA :
pObject->pIODevVTBL->WriteStr(pObject->pIODev,
"\r\nTMMon:WARNING:Extra Parameters for Command");
break;
// warning extra parameters
case CMD_STATUS_COMPLETE :
break;
case CMD_STATUS_OK :
// never should have gotten here.
break;
default :
// invalid status
break;
}
break;
}
}
if ( pObject->CRT )
{
cruntimeExit();
}
pObject->pIODevVTBL->WriteStr ( pObject->pIODev, "\r\nTMMon : Monitor Terminating\r\n");
goto mainEXIT4;
main_argerr :
fprintf ( stderr, "\r\nTMMon : ERROR : Invalid Command Line Options");
goto mainEXIT1;
mainEXIT4:
tmmanDSPClose ( pObject->CurrentDSPHandle );
mainEXIT3 :
pObject->pIODevVTBL->Close ( pObject->pIODev );
mainEXIT2 :
iodevDestroy ( pObject->pIODev );
//fprintf ( stderr, "\r\nTMMon : Terminating ... ");
mainEXIT1 :
return;
}
/*----------------------------------------------------------------------------
FUNC ValidateData
ABOUT
Determines if he data is within given bounds or not.
----------------------------------------------------------------------------*/
Bool ValidateData ( UInt16 wDataSize, UInt32 dwData )
{
switch (wDataSize )
{
case 1 :
if ( dwData > 0xff )
return False;
break;
case 2 :
if ( dwData > 0xffff )
return False;
break;
// a dword cannot hold more than a a dword.
default :
break;
}
return True;
}
/*----------------------------------------------------------------------------
FUNC IsValidHex
ABOUT
Takes a character string and determines if it a valid hex number of a
given size. This funciton is needed since Xscanf does not translate
hex number correctly if the number of characters > given size of the
number.
----------------------------------------------------------------------------*/
Bool IsValidHex ( UInt8* pszString, UInt32 dwSize )
{
UInt32 dwIdx;
for ( dwIdx = 0 ; *pszString ; dwIdx ++, pszString++ )
{
if ( dwIdx >= dwSize )
return False;
if ( ( isdigit (*pszString ) ) ||
( ( toupper ( *pszString ) >= 'A' ) && ( toupper ( *pszString ) <='F' ) ) )
continue;
return False;
}
return True;
}
UInt32 GetDebugBit ( UInt8* szToken )
{
/*
if ( stricmp ( szToken, "pcmem" ) == 0 )
return TMSTD_DBG_OPTIONVOLATILE;
if ( stricmp ( szToken, "sdram" ) == 0 )
return TMSTD_DBG_OPTIONPERSIST;
if ( stricmp ( szToken, "mono" ) == 0 )
return TMSTD_DBG_OPTIONMONO ;
*/
return 0;
}
void PrintProcessorInfo ( PTMMON_OBJECT pObject, tmmanDSPInfo* pDSPCaps )
{
tmmanMemoryBlock* pSDRAM = &pDSPCaps->SDRAM;
tmmanMemoryBlock* pMMIO = &pDSPCaps->MMIO;
UInt8 szTemp[constTMManStringLength];
UInt8* CPUType = "Unknown";
UInt8* FABType = "Unknown";
UInt8* BoardType = "Unknown";
// begin processor type checking
PCHAR CPUTypeTM1000[] = {
"TM1000 \0", //0
"TM1000 S\0", //1
"TM1100 \0", //2
};
PCHAR CPUTypeTM2000[] = {
"TM2000 \0", //0
};
PCHAR CPUTypeTM1300[] = {
"TM1300 \0", //0
};
PCHAR FabType[] = {
"ST\0", //0
"MOS4\0", //1
"TSMC\0", //2
"Unknown\0" //3
};
PCHAR BoardTypeTM1[] = {
"TM1_DEBUG", //0
"TM1_IREF", //1
"UNKNOWN", //2
"TM1100_DEBUG_1_0" //3
"TM1100_DEBUG_BGA_1_0", //4
"UNKNOWN", //5
"TM2000_DEBUG_1_0", //6
"TM1300_DEBUG", //7
"TM1300_IREF", //8
"TM1_DEBUG", //9
"TM1_DEBUG", //9
"TM1_DEBUG", //9
"TM1_DEBUG", //9
"TM1_DEBUG", //9
"TM1_DEBUG", //9
};
// Revision ID bit Field encoding
// Bits[7:6] = FabType
// Bits[5:4] = Layer Version
// Bits[3:0] = Metal Layer Changes
switch ( ( pDSPCaps->TMDeviceVendorID >> 16 ) & 0xffff )
{
case constTMMANTM1000DeviceID :
// TM1 processor
CPUType = CPUTypeTM1000[(( pDSPCaps->TMClassRevisionID & 0x00000030 ) >> 4)];
FABType = FabType[(( pDSPCaps->TMClassRevisionID & 0x000000c0 ) >> 6)];
break;
case constTMMANTM2000DeviceID :
CPUType = CPUTypeTM2000[(( pDSPCaps->TMClassRevisionID & 0x00000030 ) >> 4)];
FABType = FabType[(( pDSPCaps->TMClassRevisionID & 0x000000c0 ) >> 6)];
break;
case constTMMANTM1300DeviceID :
CPUType = CPUTypeTM1300[(( pDSPCaps->TMClassRevisionID & 0x00000030 ) >> 4)];
FABType = FabType[(( pDSPCaps->TMClassRevisionID & 0x000000c0 ) >> 6)];
break;
default :
break;
}
if ( ( pDSPCaps->TMSubSystemID & 0x0000ffff ) == 0x1131 )
{
switch ( pDSPCaps->TMSubSystemID >> 16 )
{
case 0 : BoardType = "TM1_DEBUG"; break;
case 1 : BoardType = "TM1_IREF"; break;
case 3 : BoardType = "TM1100_DEBUG_1_0"; break;
case 4 : BoardType = "TM1100_DEBUG_BGA_1_0"; break;
case 6 : BoardType = "TM2000_DEBUG_1_0"; break;
case 7 : BoardType = "TM1300_DEBUG"; break;
case 8 : BoardType = "TM1300_IREF"; break;
case 0xa : BoardType = "TM1_VCREF"; break;
case 0x14 : BoardType = "TRICODEC"; break;
case 0x1e : BoardType = "DTV_REF1"; break;
case 0x1f : BoardType = "DTV_C1_1"; break;
case 0x20 : BoardType = "DTV_REF2"; break;
case 0x21 : BoardType = "DTV_REF3"; break;
case 0x22 : BoardType = "DTV_TTR"; break;
case 0x23 : BoardType = "DTV_TR"; break;
case 0x24 : BoardType = "DTV_REF4"; break;
default : BoardType = "UNKNOWN"; break;
}
}
else
{
BoardType = "THIRD_PARTY";
}
sprintf ( szTemp, "\r\nProcessor#[%x] Type[%s1.%d %s] Board[%s]",
pDSPCaps->DSPNumber,
CPUType,
pDSPCaps->TMClassRevisionID & 0x0000000f,
FABType,
BoardType );
pObject->pIODevVTBL->WriteStr(pObject->pIODev, szTemp );
sprintf ( szTemp, "\r\nSDRAM Physical[%08x] Size[%08x] Mapped[%08x]",
pSDRAM->PhysicalAddress, pSDRAM->Size, pSDRAM->MappedAddress);
pObject->pIODevVTBL->WriteStr(pObject->pIODev, szTemp );
sprintf ( szTemp, "\r\nMMIO Physical[%08x] Size[%08x] Mapped[%08x]\r\n",
pMMIO->PhysicalAddress, pMMIO->Size, pMMIO->MappedAddress);
pObject->pIODevVTBL->WriteStr(pObject->pIODev, szTemp );
}
void DumpMemory (
PTMMON_OBJECT pContext,
UInt32 dwAddress,
UInt32 dwLength,
UInt16 wDataSize,
Bool fSDRAM )
{
UInt32 dwLinAddr;
UInt32 dwMemIdx, dwScrIdx;
UInt8 szOutputString [constTMManStringLength];
UInt8 szTempString [constTMManStringLength];
dwLinAddr = tmmanPhysicalToMapped (
( fSDRAM ? &pContext->CurrentDSPInfo.SDRAM : &pContext->CurrentDSPInfo.MMIO ),
dwAddress );
for ( dwMemIdx = 0 ; dwMemIdx < dwLength ; )
{
szOutputString[0] = 0;
sprintf ( szTempString, "\r\n%08x :", dwAddress + dwMemIdx );
strcat ( szOutputString, szTempString );
switch ( wDataSize )
{
case 1:
for ( dwScrIdx = 0 ;
((dwMemIdx < dwLength ) &&
(dwScrIdx < 0x10)) ;
dwScrIdx++, dwMemIdx += 1, dwLinAddr += 1 )
{
sprintf ( szTempString, " %02x", *((UInt8*)dwLinAddr) );
strcat ( szOutputString, szTempString );
}
break;
case 2:
for ( dwScrIdx = 0 ;
((dwMemIdx < dwLength ) &&
(dwScrIdx < 0x8)) ;
dwScrIdx++, dwMemIdx+=2, dwLinAddr += 2 )
{
sprintf ( szTempString, " %04x", *((UInt16*)dwLinAddr) );
strcat ( szOutputString, szTempString );
}
break;
case 4:
for ( dwScrIdx = 0 ;
((dwMemIdx < dwLength ) &&
(dwScrIdx < 0x4)) ;
dwScrIdx++, dwMemIdx+= 4, dwLinAddr += 4 )
{
sprintf ( szTempString, " %08x", *((UInt32*)dwLinAddr) );
strcat ( szOutputString, szTempString );
}
} // switch
pContext->pIODevVTBL->WriteStr ( pContext->pIODev, szOutputString );
} // for
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -