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

📄 tmmon.c

📁 wince host 和 target PCI驱动程序
💻 C
📖 第 1 页 / 共 4 页
字号:
			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 + -