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

📄 tmcrt.c

📁 wince host 和 target PCI驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/*COPYRIGHT (c) 1997 by Philips SemiconductorsTHIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED AND COPIED IN ACCORDANCE WITH THE TERMS AND CONDITIONS OF SUCH A LICENSE AND WITH THE INCLUSION OF THE THIS COPY RIGHT NOTICE. THIS SOFTWARE OR ANY OTHER COPIES OF THIS SOFTWARE MAY NOT BE PROVIDED OR OTHERWISE MADE AVAILABLE TO ANY OTHERPERSON. THE OWNERSHIP AND TITLE OF THIS SOFTWARE IS NOT TRANSFERRED. THE INFORMATION IN THIS SOFTWARE IS SUBJECT TO CHANGE WITHOUT ANY PRIOR NOTICEAND SHOULD NOT BE CONSTRUED AS A COMMITMENT BY Philips Semiconductor. PHILIPS ASSUMES NO RESPONSIBILITY FOR THE USE OR RELIABILITY OF THIS SOFTWAREON PLATFORMS OTHER THAN THE ONE ON WHICH THIS SOFTWARE IS FURNISHED.*//*	Copyright (c) 1996 Philips Semiconductors - TriMedia. All rights reserved.FILE	tmcrt.cHISTORY	:	960201 Tilakraj Roy				Created 	961113 Tilakraj Roy				Pulled in from ctcmon sources	970226	Tilakraj Roy			Pulled in from TMCons sources to incorporate functionality into TMMan32.dll	970310	Tilakraj Roy			Added the file redirection + event signalling + context passing functionality.	970627	Tilakraj Roy		Added multiple DSP support and interfaces for the new TMMan interface	970929	Tilakraj Roy
		Retrofitted for the new TMIF interface
		COMMNETS	Requires host_comm.lib & TMMan32.dll services	Also requires that host_comm:INITFunc return immedately and create another worked thread.*/#include "windows.h"#include "stdio.h"#include "fcntl.h"#include "io.h"#include "time.h"#include "sys\stat.h"#include "tmtypes.h"#include "tmwincom.h"#include "tmman32.h"#include "TM1IF.h"#include "OpenDll.h"#include "tmcrt.h"/* CONSTANTS */#define	MAX_PATH_INDEX	0x20 // maximum of 32 entries may be picked from the ini file#undef USE_TRACE// this is worst kludge i have ever made
// to save a parameter to a callback function.

#define TMCRT_MAGIC_PATTERN 0x005a5a5a
#define MAXIMUM_DSPS		10

/* TYPEDEFS */
enum tStdHandles
{
	kLevel2StdinHandle = 0,
	kLevel2StdoutHandle = 1,
	kLevel2StderrHandle = 2
};

typedef struct _TMCRT_STD_HANDLE
{
	DWORD	Magic:24;
	DWORD	StdType:3;
	DWORD	DSPNumber:5;
}	TMCRT_STD_HANDLE, *PTMCRT_STD_HANDLE;

/* GLOBALS */typedef struct _TMCRT_CONTEXT {	DWORD   OptionBitmap;	DWORD   DSPHandle;	DWORD   DSPNumber;	HANDLE	StdInHandle;	HANDLE	StdOutHandle;	HANDLE	StdErrHandle;	//event that is sianalled when the exit function is called.	HANDLE	SynchObject;	HANDLE	ExitObject;	DWORD   ExitCode;	BOOL    fServerLoaded;	DWORD	VirtualNodeNumber;	DWORD   ServerStatus;	BOOL    fTargetExited;		DWORD   ArgumentCount;	PVOID   ArgumentVector;}	TMCRT_CONTEXT, *PTMCRT_CONTEXT;

///////////////////////////////////////////////////////////VOID	StripCR ( PCHAR pBuffer, DWORD *BytesRead );UInt32	crtPrintf ( HANDLE FileHandle, UInt8* Format, ...);UInt32 ODS( UInt8* FormatString, ... );DWORD	OpenFunc (  PCHAR PathName, DWORD Flags, DWORD Mode );



///////////////////////////////////////////////////////////PTMCRT_CONTEXT	GlobalContext[MAXIMUM_DSPS];BOOL     fExitProcess = FALSE;
///////////////////////////////////////////////////////////
DWORD	ExitCodeFunc ( DWORD DSPNumber, DWORD ExitCode ){	PTMCRT_CONTEXT	pCRT = (PTMCRT_CONTEXT)GlobalContext[DSPNumber];	DWORD	BytesWritten;	CHAR	szTemp[0x80];
#ifdef USE_TRACE	ODS("[ExitCodeFunc|NodeID:%x]", NodeID );#endif	if ( pCRT->OptionBitmap & constCRunTimeFlagsNonInteractive );	else	{		crtPrintf ( pCRT->StdOutHandle, 				"\r\nCRunTime : TriMedia # %d Program Exit Code [%x]\n", 			DSPNumber, ExitCode );	}	/*fprintf(stdout, szTemp ); */	if ( pCRT->OptionBitmap & constCRunTimeFlagsUseSynchObject)	{		SetEvent ( pCRT->SynchObject );	}	/* get out of this program */	pCRT->fTargetExited = TRUE;	pCRT->ExitCode = ExitCode;	SetEvent ( pCRT->ExitObject );	return 0;}DWORD	OpenDLLFunc( PCHAR pszFilename ){#ifdef USE_TRACE   ODS("[OpenDLLFunc|FileName:%s]", pszFilename );#endif	return OpenDll_open_dll ( pszFilename, (PVOID)OpenFunc, LittleEndian );}DWORD	ReadFunc (  DWORD Handle, PVOID pBuffer, DWORD Count ){	

	PTMCRT_STD_HANDLE	EncodedHandle = (PTMCRT_STD_HANDLE)&Handle;
static   DWORD FuncCount = 0;	DWORD	BytesRead;#ifdef USE_TRACE   ODS("[ReadFunc#%x|Handle:%x|Buffer:%x|Count:%x]", FuncCount, Handle, pBuffer, Count );#endif

   	if ( fExitProcess == TRUE )
	{
		BytesRead = 0;
		goto ReadFuncExit;
	}

	if ( EncodedHandle->Magic == TMCRT_MAGIC_PATTERN )
	{
		PTMCRT_CONTEXT	pCRT = (PTMCRT_CONTEXT)GlobalContext[EncodedHandle->DSPNumber];
		
		if ( EncodedHandle->StdType == kLevel2StdinHandle )		{			BOOL Status;			HANDLE		Objects[2];			DWORD		ObjectSignalled;			if ( pCRT->OptionBitmap & constCRunTimeFlagsNoConsole )			{  				BytesRead = 0;			 goto ReadFuncExit;			}			Objects[0] =  pCRT->StdInHandle; 			Objects[1] =  pCRT->ExitObject;							ObjectSignalled = WaitForMultipleObjects  ( 2, Objects, FALSE, INFINITE );			if ( (ObjectSignalled - WAIT_OBJECT_0 ) == 1 )		  {  				BytesRead = 0;			 goto ReadFuncExit;		  }			Status = ReadFile (  pCRT->StdInHandle, 				pBuffer, 				Count, 				&BytesRead,				NULL );		  if ( GetFileType (pCRT->StdInHandle) == FILE_TYPE_CHAR )			   StripCR ( pBuffer, &BytesRead );			if ( Status == TRUE  )			{			goto ReadFuncExit;			}			else			{				BytesRead = 0;			 goto ReadFuncExit;			}		}

	}
	BytesRead = _read ( Handle, pBuffer, Count );	// fall throughReadFuncExit :#ifdef USE_TRACE   ODS("[ReadFunc#%x|Returned:%x]", FuncCount++, BytesRead );#endif	return BytesRead;}DWORD	WriteFunc ( DWORD Handle, PVOID pBuffer, DWORD Count ){	PTMCRT_STD_HANDLE	EncodedHandle = (PTMCRT_STD_HANDLE)&Handle;

		DWORD	BytesWritten;   static DWORD FuncCount = 0;#ifdef USE_TRACE   ODS("[WriteFunc#%x|Handle:%x|Buffer:%x|Count:%x]",       FuncCount, Handle, pBuffer, Count );#endif
	if ( EncodedHandle->Magic == TMCRT_MAGIC_PATTERN )
	{
			PTMCRT_CONTEXT	pCRT = (PTMCRT_CONTEXT)GlobalContext[EncodedHandle->DSPNumber];
			
		if ( EncodedHandle->StdType == kLevel2StdoutHandle )		{			if ( pCRT->OptionBitmap & constCRunTimeFlagsNoConsole )			{				BytesWritten = 0;			 goto WriteFuncExit;			}			if ( WriteFile (  pCRT->StdOutHandle, 				pBuffer, 				Count, 				&BytesWritten,				NULL ) != TRUE )			{				BytesWritten = 0;			 goto WriteFuncExit;			}			else			{				goto WriteFuncExit;			}		}		// fall through		if ( EncodedHandle->StdType == kLevel2StderrHandle )		{			if ( pCRT->OptionBitmap & constCRunTimeFlagsNoConsole )			{				BytesWritten = 0;			 goto WriteFuncExit;			}			if ( WriteFile ( pCRT->StdErrHandle, 				pBuffer, 				Count, 				&BytesWritten,				NULL ) != TRUE )			{				BytesWritten = 0;			 goto WriteFuncExit;			}			else			{				goto WriteFuncExit;			}		}

	}
	BytesWritten  = _write ( Handle, pBuffer, Count );	// fall throughWriteFuncExit :#ifdef USE_TRACE   ODS("[WriteFunc#%x|Returned:%x]", FuncCount++, BytesWritten );#endif	return BytesWritten;}DWORD	FstatFunc (DWORD Handle,  struct stat *pStat ){
	PTMCRT_STD_HANDLE	EncodedHandle = (PTMCRT_STD_HANDLE)&Handle;
#ifdef USE_TRACE   ODS("[FstatFunc|Handle:%x|pStat:%x]", Handle, pStat );#endif
	if ( EncodedHandle->Magic == TMCRT_MAGIC_PATTERN )
	{
		PTMCRT_CONTEXT	pCRT = (PTMCRT_CONTEXT)GlobalContext[EncodedHandle->DSPNumber];
		
		if ( ( EncodedHandle->StdType == kLevel2StdinHandle ) || 			( EncodedHandle->StdType == kLevel2StdoutHandle ) ||			( EncodedHandle->StdType == kLevel2StderrHandle ) )		{			pStat->st_mode	= S_IFCHR;			pStat->st_size	= 512;			return 0;		}
	}
	return _fstat ( Handle, (struct _stat *)pStat );}DWORD	StatFunc (PCHAR pFilename,  struct stat *pStat ){#ifdef USE_TRACE   ODS("[StatFunc|FileName:%s|pStat:%x]", pFilename, pStat );#endif	return _stat ( pFilename, (struct _stat *)pStat );}DWORD	FcntlFunc ( DWORD Handle, DWORD Command, DWORD Flags ){#ifdef USE_TRACE   ODS("[FcntlFunc|Handle:%x|Command:%x|Flags:%x]", Handle, Command, Flags );

⌨️ 快捷键说明

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