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

📄 tmcons.c

📁 wince host 和 target PCI驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
// wait for keypress ebfore termination.#define DEFAULT_WAITFORKEY		1int main ( int argc, char *argv[] ){	TMSTD_VERSION_INFO Version;	HANDLE	hStartEvent;	WORD	wIdxArg;//	INPUT_RECORD	CarriageReturn[2];	CHAR	szEventName[80];	CHAR	szDeviceName[16];	BOOL	fWaitForKey = TRUE;	STATUS	Status;        TMMAN_DSP_CAPS          Caps;	fprintf ( stderr, 		"\r\nTriMedia Console - (c)Philips Semiconductors Version [%d.%d.%d]\r\n",		verGetFileMajorVersion (),		verGetFileMinorVersion (),		verGetFileBuildVersion () );	Stdin = GetStdHandle ( STD_INPUT_HANDLE );	Stdout = GetStdHandle ( STD_OUTPUT_HANDLE );	Stderr = GetStdHandle ( STD_ERROR_HANDLE );	// initialize the command parameter structures	StdInParam.Redirected  = FALSE;	StdOutParam.Redirected  = FALSE;	StdErrParam.Redirected  = FALSE;	/*		process the command line arguments here	*/	for ( wIdxArg = 1; wIdxArg < argc ; wIdxArg++ )	{		if( argv[wIdxArg][0] != '-' )		{			goto mainExit1;		}		switch ( toupper ( argv[wIdxArg][1]) )		{			case 'W' :			{				DWORD	dwWindowLines;				COORD	ConsoleSize;				sscanf(&argv[wIdxArg][2], "%x", &dwWindowLines );				ConsoleSize.X = 80;				ConsoleSize.Y = (WORD)dwWindowLines;				SetConsoleScreenBufferSize (					GetStdHandle ( STD_OUTPUT_HANDLE ), ConsoleSize );			}			break;			case 'D' :			sscanf(&argv[wIdxArg][2], "%x", &DSPNumber );			// use the dsp number to link to the server event 			sprintf( szEventName, "TMConsStartEvent%x", DSPNumber );			// we signal the start event so that tmDSPLoadExecutable can go ahead			// and start the excecutable. this needs to be done since the DSP 			// start up before tmcons is ready to service requests and screws up.			if ( ( hStartEvent = OpenEvent ( EVENT_MODIFY_STATE, TRUE,				szEventName ) ) == NULL )			{				fprintf ( stderr, 				"\r\nTMCons : OpenEvent [%s] : FAIL[%x] \r\n" , szEventName, GetLastError() );				goto mainExit1;			}			break;			case 'A' :			fprintf ( stderr,				"\nAuthor Tilakraj Roy : troy@trimedia.scs.philips.com\n");			break;			case 'R'	: // si  se so			if ( ( wIdxArg + 1 ) == argc )			{				goto mainExit2;			}			switch ( toupper ( argv[wIdxArg][2] ) )			{				case 'I'	:				if ( argv[wIdxArg + 1][0] == '-' )				{						fprintf ( stderr,					"\r\nTMCons : ERROR : Invalid Input Redirection File Name\r\n" );					break;				}				if ( ( StdInParam.Handle =					(DWORD)_open ( argv[++wIdxArg],					_O_BINARY | O_RDONLY  ) ) == 0xffffffff )				{						fprintf ( stderr,						"\r\nTMCons : ERROR : Cannot Open StdIn Redirection File [%s]\r\n",						argv[wIdxArg] );					break;				}				StdInParam.Redirected  = TRUE;				break;				case 'O'	:				if ( argv[wIdxArg + 1][0] == '-' )				{					fprintf ( stderr,					"\r\nTMCons : ERROR : Invalid Output Redirection File Name\r\n" );					break;				}				if ( ( StdOutParam.Handle =					(DWORD)_open ( argv[++wIdxArg],					_O_BINARY | _O_CREAT | _O_TRUNC | _O_WRONLY ) ) ==					0xffffffff )				{					fprintf ( stderr,						"\r\nTMCons : ERROR : Cannot Open StdOut Redirection File [%s]\r\n",						argv[wIdxArg] );					break;				}				StdOutParam.Redirected = TRUE;				break;							case 'E'	:				if ( argv[wIdxArg + 1][0] == '-' )				{					fprintf ( stderr,					"\r\nTMCons : ERROR : Invalid Error Redirection File Name\r\n" );					break;				}				if ( ( StdErrParam.Handle =					(DWORD)_open ( argv[++wIdxArg],					_O_BINARY | _O_CREAT | _O_TRUNC | _O_WRONLY ) ) ==					0xffffffff )				{					fprintf ( stderr,						"\r\nTMCons : ERROR : Cannot Open StdErr Redirection File [%s]\r\n",						argv[wIdxArg] );				}				StdErrParam.Redirected  = TRUE;				break;				default :				fprintf ( stderr, 					"\r\nTMCons : Cannot be invoked from command line\r\n" );				goto mainExit2;			}		}	}	Version.dwMajor = verGetFileMajorVersion();	Version.dwMinor = verGetFileMinorVersion();	if ( ( tmNegotiateVersion (  TMMAN_DEFAULT,		&Version ) ) != TMOK )	{		fprintf ( stderr,			"\r\nTMCons : ERROR : Obsolete version of TMCons.exe : Terminating ... " );		goto mainExit3;	}	if ( ( Version.dwMajor  < verGetFileMajorVersion() ) ||		( Version.dwMinor  < verGetFileMinorVersion()) )	{		fprintf ( stderr,			"\r\nTMCons : ERROR : Obsolete version of TMMan32.dll : Terminating ... " );		goto	mainExit3;	}	if ( ( Status = tmDSPOpen ( DSPNumber, &DSPHandle ) ) != TMOK )	{		fprintf ( stderr, 			"\r\nTMCons : tmDSPOpen:DSP[%x]:FAIL[%x]\r\n", DSPNumber, Status );		goto mainExit3;	}	if ( ( ThreadExitObject = 		CreateEvent (NULL, TRUE, FALSE, NULL) ) == NULL )	{		fprintf ( stderr, "\r\nTMCons : Cannot Create Thread Event \r\n" );			goto	mainExit3;	}		sprintf( szEventName, "TMConsExitEvent%x", DSPNumber );	if ( ( ExitObject = 		CreateEvent (NULL, TRUE, FALSE, szEventName ) ) == NULL )	{		fprintf ( stderr, "\r\nTMCons : Alredy Running \r\n" );			goto	mainExit3;	} 	if (!TM1IF_init(		   (RPCServ_OpenFunc) OpenFunc,		   (RPCServ_OpenDllFunc) OpenDllFunc,		   (RPCServ_CloseFunc) CloseFunc,		   (RPCServ_ReadFunc) ReadFileFunc,		   (RPCServ_WriteFunc) WriteFileFunc,		   (RPCServ_SeekFunc) LseekFunc,		   (RPCServ_IsattyFunc) IsattyFunc,		   (RPCServ_FstatFunc) FstatFunc,		   (RPCServ_FcntlFunc) FcntlFunc,		   (RPCServ_StatFunc) _stat,		   (RPCServ_ExitFunc) ExitCodeFunc,		   LittleEndian /* no big endian support yet */ )) {		fprintf( stdout,			"\r\nTMCons: ERROR  : Cannot Initialize RPCServ : CRT I/O calls will not work"  );		goto	mainExit3;        }	if ( ( Status = tmDSPGetCaps ( DSPHandle, &Caps ) ) != TMOK )	{		fprintf ( stderr, 			"\r\nTMCons : tmDSPGetCaps:DSP[%x]:FAIL[%x]\r\n", DSPNumber, Status );		goto mainExit3;	}	if (!TM1IF_add_node_info(
		0, 
		ArgCountFunc(DSPNumber), 
		ArgVectorFunc(DSPNumber), 		kLevel2StdinHandle, 
		kLevel2StdoutHandle, 
		kLevel2StderrHandle, 		Caps.SDRAM.dwLinear - Caps.SDRAM.dwPhysical, 		Caps.SDRAM.dwPhysical, 		Caps.SDRAM.dwPhysical + Caps.SDRAM.dwSize, 		(Pointer)DSPNumber )) 
	{		fprintf( stdout,		"\r\nTMCons: ERROR  : Cannot Add Node To RPCServ : CRT I/O calls will not work"  );		goto	mainExit3;	}	if ( TM1IF_start_serving() == TM1IF_Serving_Failed )	{		fprintf( stdout,			"\r\nTMCons: ERROR  : Cannot Start RPCServ : CRT I/O calls will not work"  );		goto	mainExit3;	}	else	{		DWORD PathIdx;		CHAR	Key[0x10]; // HARDCODED max 16 bytes for key number		CHAR	Path[TMSTD_PATH_LENGTH];		for ( PathIdx = 0; PathIdx < MAX_PATH_INDEX ; PathIdx++ )		{			sprintf ( Key, "%u", PathIdx );			GetPrivateProfileString (				"DLLPath", Key, "DEFAULT", Path, TMSTD_PATH_LENGTH, "tmman.ini" );			if( _stricmp ( Path, "DEFAULT" ) == 0 )				break;			OpenDll_add_dll_path ( Path );		}		fServerLoaded = TRUE;	}		SetEvent ( hStartEvent  );	CloseHandle ( hStartEvent  );	/*			RPCServ should have created thread by now so we block here on our global event 		to be signalled 	*/		WaitForSingleObject( ExitObject, INFINITE );	// perform thread clean up here	fExitProcess = TRUE;/*		// insert a CR in to the Stdin queue to release ReadFile	// key down 	CarriageReturn[0].EventType = KEY_EVENT;	CarriageReturn[0].Event.KeyEvent.bKeyDown			= TRUE;	CarriageReturn[0].Event.KeyEvent.wRepeatCount     = 1;	CarriageReturn[0].Event.KeyEvent.wVirtualKeyCode  = 13;	CarriageReturn[0].Event.KeyEvent.wVirtualScanCode = 28;	CarriageReturn[0].Event.KeyEvent.dwControlKeyState = 0;	// key up	CarriageReturn[1] = CarriageReturn[0];	CarriageReturn[1].Event.KeyEvent.bKeyDown			= FALSE;	WriteConsoleInput( Stdin, CarriageReturn, 2, &Written );*/	SetEvent ( ThreadExitObject );	TM1IF_term();	CloseHandle ( ExitObject );	CloseHandle (  hStartEvent  );	sprintf ( szDeviceName, "Device.%x", DSPNumber );	fWaitForKey = GetPrivateProfileInt (		szDeviceName, "WaitForKey", DEFAULT_WAITFORKEY, "tmman.ini" );	if ( fTargetExited && fWaitForKey )	{		fprintf ( stdout,  			"\r\nTMCons : Press ENTER to terminate TriMedia Console >> " );		getchar();	}	return 0;mainExit3:	if ( StdErrParam.Redirected == TRUE )	{		_close ( StdErrParam.Handle );	}	if ( StdOutParam.Redirected == TRUE )	{		_close ( StdOutParam.Handle );	}	if ( StdInParam.Redirected == TRUE )	{		_close ( StdInParam.Handle );	}	CloseHandle ( ExitObject );	CloseHandle ( ThreadExitObject );mainExit2:	SetEvent ( hStartEvent  );	CloseHandle ( hStartEvent  );mainExit1:	sprintf ( szDeviceName, "Device.%x", DSPNumber );	fWaitForKey = GetPrivateProfileInt (		szDeviceName, "WaitForKey", DEFAULT_WAITFORKEY, "tmman.ini" );	if ( fWaitForKey )	{		fprintf ( stdout,  			"\r\nTMCons : Press ENTER to terminate TriMedia Console >> " );		getchar();	}	return 1;}/*	StripCR	Unix is a brain dead OS, it cannot undestrand input string terminated with CRLF.	And of course trimedia will blindly follow what Unix does.	So we have to strip all CR in the input that is being read from 	StdIn. This function does that and accordingly reduces the lenth of the 	string that is read in.*/VOID	StripCR ( PCHAR pBuffer, DWORD *BytesRead ){	DWORD Idx, InnerIdx;	DWORD OrigLength = *BytesRead;	for ( Idx = 0; Idx < *BytesRead ; Idx++ )	{		if  ( ( pBuffer[Idx] == '\r' ) && ( pBuffer[Idx + 1]  == '\n' ) )		{			(*BytesRead)--;			for ( InnerIdx =  Idx ;  InnerIdx < *BytesRead ; InnerIdx++ )			{				pBuffer[InnerIdx] = pBuffer[InnerIdx+1];			}		}	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -