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

📄 tmman32.c

📁 wince host 和 target PCI驱动程序
💻 C
📖 第 1 页 / 共 3 页
字号:
{
	TMIF_STRUCT_DSPOPEN	TMIF;
	DWORD		BytesReturned;

	TMIF.ClientHandle	= Global.dwClientHandle;
	TMIF.DSPNumber		= dwDSPNumber;

	if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_DSPOPEN),
		(PVOID)&TMIF, sizeof( TMIF_STRUCT_DSPOPEN),
		(PVOID)&TMIF, sizeof( TMIF_STRUCT_DSPOPEN),
		&BytesReturned, NULL ) != TRUE )
	{
		return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
	}

	*DSPHandle = TMIF.DSPHandle;
	return TMIF.Status;
}

STATUS	tmDSPClose ( DWORD dwHandle )
{
	TMIF_STRUCT_DSPCLOSE	TMIF;
	DWORD					BytesReturned;

	TMIF.ClientHandle	= Global.dwClientHandle;
	TMIF.DSPHandle		= dwHandle;

	if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_DSPCLOSE),
		(PVOID)&TMIF, sizeof( TMIF_STRUCT_DSPCLOSE),
		(PVOID)&TMIF, sizeof( TMIF_STRUCT_DSPCLOSE),
		&BytesReturned, NULL ) != TRUE )
	{
		return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
	}

	return TMIF.Status;
}
// Task Related API

STATUS	tmTaskCreate ( DWORD dwDSPHandle, PTMMAN_TASK_CREATE pTaskAttrib,
	PDWORD pdwHandle )
{
	TMIF_STRUCT_TASKCREATE	TMIF;
	DWORD	dwBytesReturned;

	TMIF.ClientHandle	= Global.dwClientHandle;
	TMIF.DSPHandle 		= dwDSPHandle;
	TMIF.dwFlags		= pTaskAttrib->dwFlags;
	TMIF.dwCallback		= pTaskAttrib->dwCallback;
	TMIF.pvContext		= pTaskAttrib->pvContext;
	TMIF.dwPriority		= pTaskAttrib->dwPriority;
	TMIF.dwStackSize	= pTaskAttrib->dwStackSize;
	strcpy ( TMIF.szTaskFile , pTaskAttrib->szTaskFile );
	TMIF.dwArgumentCount	= pTaskAttrib->dwArgumentCount;
	TMIF.ppbArgumentVector	= pTaskAttrib->ppbArgumentVector;

	if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_TASKCREATE),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKCREATE),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKCREATE),
		&dwBytesReturned, NULL ) != TRUE )
	{
		return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
	}

	*pdwHandle = TMIF.TaskHandle;
	return TMIF.Status;
}


STATUS	tmTaskStart ( DWORD dwHandle )
{
	TMIF_STRUCT_TASKSTART	TMIF;
	DWORD	dwBytesReturned;

	TMIF.TaskHandle = dwHandle;
	TMIF.ClientHandle = Global.dwClientHandle;

	if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_TASKSTART),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKSTART),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKSTART),
		&dwBytesReturned, NULL ) != TRUE )
	{
		return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
	}
	return TMIF.Status;
	
}

STATUS	tmTaskStop ( DWORD dwHandle )
{
	TMIF_STRUCT_TASKSTOP	TMIF;
	DWORD	dwBytesReturned;

	TMIF.TaskHandle = dwHandle;
	TMIF.ClientHandle = Global.dwClientHandle;

	if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_TASKSTOP),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKSTOP),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKSTOP),
		&dwBytesReturned, NULL ) != TRUE )
	{
		return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
	}
	return TMIF.Status;
	
}

STATUS	tmTaskSignal ( DWORD dwHandle, DWORD State )
{
	TMIF_STRUCT_TASKSIGNAL	TMIF;
	DWORD	dwBytesReturned;

	TMIF.TaskHandle = dwHandle;
	TMIF.ClientHandle = Global.dwClientHandle;
	TMIF.State = State;

	if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_TASKSIGNAL),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKSIGNAL),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKSIGNAL),
		&dwBytesReturned, NULL ) != TRUE )
	{
		return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
	}
	return TMIF.Status;
	
}

STATUS	tmTaskDestroy ( DWORD dwHandle )
{
	TMIF_STRUCT_TASKDESTROY	TMIF;
	DWORD	dwBytesReturned;

	TMIF.TaskHandle = dwHandle;
	TMIF.ClientHandle = Global.dwClientHandle;

	if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_TASKDESTROY),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKDESTROY),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_TASKDESTROY),
		&dwBytesReturned, NULL ) != TRUE )
	{
		return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
	}
	return TMIF.Status;
}


// Message Interface
STATUS	tmMsgCreate ( DWORD dwHandle, PTMMAN_MESSAGE_DESC pMessageAttrib, 
	PDWORD pdwMessageHandle  )
{
	TMIF_STRUCT_MSGCREATE	TMIF;
	DWORD	dwBytesReturned;

	TMIF.DSPHandle = dwHandle;
	TMIF.ClientHandle = Global.dwClientHandle;
	TMIF.CallbackFunction = pMessageAttrib->dwCallback;
	TMIF.CallbackContext = (DWORD)pMessageAttrib->pvContext;
	TMIF.Slots = pMessageAttrib->dwMessageSlots;
	TMIF.ChannelID = pMessageAttrib->dwID;

	if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_MSGCREATE),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_MSGCREATE),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_MSGCREATE),
		&dwBytesReturned, NULL ) != TRUE )
	{
		return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
	}
	*pdwMessageHandle = TMIF.MsgHandle;
	return TMIF.Status;
}

STATUS	tmMsgDestroy ( DWORD dwHandle )
{
	TMIF_STRUCT_MSGDESTROY	TMIF;
	DWORD	dwBytesReturned;

	TMIF.MsgHandle = dwHandle;
	TMIF.ClientHandle = Global.dwClientHandle;

	if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_MSGDESTROY),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_MSGDESTROY),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_MSGDESTROY),
		&dwBytesReturned, NULL ) != TRUE )
	{
		return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
	}
	return TMIF.Status;
}


STATUS	tmMsgSend ( DWORD dwHandle, PTMSTD_PACKET pPacket )
{
	TMIF_STRUCT_MSGSEND	TMIF;
	DWORD	dwBytesReturned;

	TMIF.MsgHandle = dwHandle;
	TMIF.Packet = *pPacket;
	TMIF.ClientHandle = Global.dwClientHandle;

	if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_MSGSEND),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_MSGSEND),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_MSGSEND),
		&dwBytesReturned, NULL ) != TRUE )
	{
		return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
	}

	return TMIF.Status;
}

// SHARED MEMORY ALLOCAITON AND FREE FUNCTIONS
STATUS	tmShmemAllocate ( DWORD DSPHandle, DWORD Flags, DWORD Length,
	PVOID *ppLinear, PDWORD pPhysical )
{
	TMIF_STRUCT_SHMEMALLOCATE	TMIF;
	DWORD	dwBytesReturned;

	TMIF.DSPHandle = DSPHandle;
	TMIF.ClientHandle = Global.dwClientHandle;
	TMIF.Flags = Flags;
	TMIF.Size = Length;

	if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_SHMEMALLOCATE),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_SHMEMALLOCATE),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_SHMEMALLOCATE),
		&dwBytesReturned, NULL ) != TRUE )
	{
		return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
	}
	*ppLinear = TMIF.Linear;
	*pPhysical = TMIF.Physical;
	return TMIF.Status;
}

STATUS	tmShmemFree ( DWORD DSPHandle, PVOID pLinear )
{
	TMIF_STRUCT_SHMEMFREE	TMIF;
	DWORD	dwBytesReturned;

	TMIF.DSPHandle = DSPHandle;
	TMIF.ClientHandle = Global.dwClientHandle;
	TMIF.Linear = pLinear;
	
	if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_SHMEMFREE),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_SHMEMFREE),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_SHMEMFREE),
		&dwBytesReturned, NULL ) != TRUE )
	{
		return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
	}
	return TMIF.Status;
}


STATUS	tmDSPExecutableLoad ( DWORD DSPHandle, DWORD dwLoadAddress,
	PCHAR pszImagePath, DWORD dwArgCount, PCHAR pArgVector[] )
{
	TMIF_STRUCT_DSPEXECUTABLELOAD	TMIF;
	PTMSTD_MEMORY_BLOCK	pSDRAM;
	TMMAN_DSP_CAPS DSPCaps;
	TMMAN_DSP_INFO DSPInfo;
	TMDwnLdr_Status LoaderStatus;

	STATUS	Status  = TMOK;
	DWORD	ImageSize;
	DWORD	Alignment;
	DWORD	ClockSpeed = 0x5f5e100;	
	DWORD	CacheOption = TMDwnLdr_LeaveCachingToDownloader;
	PVOID	pBuffer;
	DWORD	BytesXfered;
	DWORD	AlignedDownloadAddress;
	TMDwnLdr_Object_Handle	ObjectHandle;
	Endian endian;
	DWORD	HostType = tmWin95Host;
	DWORD	TargetVersion;
	CHAR	szDeviceName[0x10];

	/* TBD : put error cheking here */
	tmDSPGetCaps ( DSPHandle , &DSPCaps );

	/* TBD : put error checking here */
	tmDSPGetMiscInfo ( DSPHandle , &DSPInfo );

	pSDRAM = &DSPCaps.SDRAM;
	

	if ( dwLoadAddress == TMMAN_DEFAULT )
	{
		dwLoadAddress = DSPCaps.SDRAM.dwPhysical;

	}

	if ( ( LoaderStatus = TMDwnLdr_load_object_from_file ( pszImagePath, 
		NULL, &ObjectHandle ) ) != TMDwnLdr_OK )
	{
		//Status = TM_STATUS ( TMERRTMMAN32_ERR_OPENIMAGEFILEFAIL );
		OutputDebugString ( TMDwnLdr_get_last_error (LoaderStatus) );
		Status = TM_STATUS ( TMERR(TM_STATUS_HCOMP_TMLD, LoaderStatus) );
		goto tmDSPExecutableLoadExit1;
	}

	if ( ( LoaderStatus = TMDwnLdr_get_endian ( ObjectHandle, &endian ) ) != TMDwnLdr_OK )
	{
		OutputDebugString ( TMDwnLdr_get_last_error (LoaderStatus) );
		Status = TM_STATUS ( TMERR(TM_STATUS_HCOMP_TMLD, LoaderStatus) );
		goto tmDSPExecutableLoadExit2;
	}

	if ( endian != LittleEndian )
	{

		OutputDebugString( "tmman32:tmDSPExecutableLoad:WARNING:Executable:BIG ENDIAN\n" );	
		MessageBox ( NULL,
			"Executable:BIG ENDIAN",
			"TriMedia Manager : tmman32.dll : WARNING",
			MB_OK | MB_ICONSTOP | MB_DEFBUTTON1 | MB_APPLMODAL );

	}

	if ( ( LoaderStatus = TMDwnLdr_resolve_symbol( ObjectHandle, 
		"_TMMANSharedPatch", DSPInfo.TMMANSharedPhys ) ) != TMDwnLdr_OK )
	{
		// for future reference store that this target image for this
		// board doesn't have libtmman.a linked with it.
		DSPInfo.Flags |= TMIF_DSPMISCINFO_SYMBOLNOTPATCHED;
		tmDSPSetMiscInfo ( DSPHandle, &DSPInfo );

		OutputDebugString( "tmman32:tmDSPExecutableLoad:WARNING:_TMMANSharedPatch:UNDEFINED\n" );	
		MessageBox ( NULL,
			"_TMMANSharedPatch:Variable:UNDEFINED",
			"TriMedia Manager : tmman32.dll : WARNING",
			MB_OK | MB_ICONSTOP | MB_DEFBUTTON1 | MB_APPLMODAL );

		HostType = tmNoHost;

//		Status = TM_STATUS ( TMERR(TM_STATUS_HCOMP_TMLD, LoaderStatus) );
//		goto tmDSPExecutableLoadExit2; 
	}
	else
	{
		DSPInfo.Flags &= (~TMIF_DSPMISCINFO_SYMBOLNOTPATCHED);
		tmDSPSetMiscInfo ( DSPHandle, &DSPInfo );
	}


  	if ( ( LoaderStatus = TMDwnLdr_get_image_size ( ObjectHandle, 
		&ImageSize, &Alignment 	) ) != TMDwnLdr_OK )
	{
		Status = TM_STATUS ( TMERR(TM_STATUS_HCOMP_TMLD, LoaderStatus) );
		OutputDebugString ( TMDwnLdr_get_last_error (LoaderStatus) );
		goto tmDSPExecutableLoadExit2; 
	}

	AlignedDownloadAddress = ( (dwLoadAddress + Alignment -1 ) & ( ~( Alignment - 1 ) ) );

	// read in clock speed here
	wsprintf ( szDeviceName, "Device.%x", DSPCaps.DSPNumber );
	ClockSpeed = GetPrivateProfileInt (
		szDeviceName, "ClockSpeed", ClockSpeed, "tmman.ini" );

	// read in Cache Option goes here
	// the cache options are the same as the values defined in
	// TMDownLoader.h this is kind of fucked up because
	// TMDownloader enumerate TMDwnLdr_CacheingSupport changes
	// the ini file values and hence documentatino will have to 
	// be update.
	wsprintf ( szDeviceName, "Device.%x", DSPCaps.DSPNumber );
	CacheOption = GetPrivateProfileInt (
		szDeviceName, "CacheOption", CacheOption, "tmman.ini" );

	if ( ( LoaderStatus = TMDwnLdr_relocate  ( 
		ObjectHandle, 
		HostType,
		(Address)DSPCaps.MMIO.dwPhysical, // mmio base
		ClockSpeed,
		(Address)AlignedDownloadAddress,
		DSPCaps.SDRAM.dwSize,
		CacheOption ) ) != TMDwnLdr_OK )
	{
		OutputDebugString ( TMDwnLdr_get_last_error (LoaderStatus) );
		Status = TM_STATUS ( TMERR(TM_STATUS_HCOMP_TMLD, LoaderStatus) );
		goto tmDSPExecutableLoadExit2; 
	}

#ifdef USE_LOADERCOPY
	if ( ( LoaderStatus = TMDwnLdr_get_memory_image ( ObjectHandle, 
		(Address)tmPhysToLin ( AlignedDownloadAddress, &DSPCaps.SDRAM ) ) ) != TMDwnLdr_OK )
	{
		OutputDebugString ( TMDwnLdr_get_last_error (LoaderStatus) );
		Status = TM_STATUS ( TMERR(TM_STATUS_HCOMP_TMLD, LoaderStatus ) );
		goto tmDSPExecutableLoadExit2; 
	}

	TMIF.ImageAddr = (DWORD)NULL;
	TMIF.ImageSize = 0;

#else
	// allocate block of memory on PC for reading file
	if ( ( pBuffer = HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY,
       ImageSize  ) ) == NULL )
	{
		OutputDebugString( "tmman32:tmDSPExecutableLoad:ImageBufferAlloc:FAIL\n" );	
		Status = TM_STATUS ( TMMAN32_ERR_MEMALLOCFAIL );
		goto tmDSPExecutableLoadExit2;
		// maloc error
	}

	if ( ( LoaderStatus = TMDwnLdr_get_memory_image ( ObjectHandle, 
		pBuffer ) ) != TMDwnLdr_OK )
	{
		OutputDebugString ( TMDwnLdr_get_last_error (LoaderStatus) );
		Status = TM_STATUS ( TMERR(TM_STATUS_HCOMP_TMLD, LoaderStatus ) );
		goto tmDSPExecutableLoadExit2; 
	}

	TMIF.ImageAddr = (DWORD)pBuffer;
	TMIF.ImageSize = ImageSize;
#endif

	TMIF.DSPHandle = DSPHandle;
	TMIF.ClientHandle = Global.dwClientHandle;
	TMIF.PhysLoadAddr = AlignedDownloadAddress;
	TMIF.ArgC	= dwArgCount;
	TMIF.ArgV	= (DWORD)pArgVector;

	/* last known good target version that did not support TargetVersion */
	TMIF.TargetMajorVersion	= 4; //verGetFileMajorVersion();
	TMIF.TargetMinorVersion	= 7;//verGetFileMinorVersion();

	if ( ( LoaderStatus = TMDwnLdr_get_contents ( 
		ObjectHandle, 
		"__TMMan_Version",
		&TargetVersion ) )  != TMDwnLdr_OK )
	{
		OutputDebugString ( TMDwnLdr_get_last_error (LoaderStatus) );
	}
	else
	{
		// major version = __TMMan_Version[31:16]
		// minor version = __TMMan_Version[15:0]
		TMIF.TargetMajorVersion = ( ( TargetVersion  & 0xffff0000 ) >> 16 ) ;
		TMIF.TargetMinorVersion = TargetVersion & ( 0x0000ffff );
	}


	if ( DeviceIoControl ( Global.hDevice,
		(DWORD)(TMIF_DIOC_DSPEXECUTABLELOAD),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_DSPEXECUTABLELOAD),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_DSPEXECUTABLELOAD),
		&BytesXfered, NULL ) != TRUE )
	{
		OutputDebugString( "tmman32:tmDSPExecutableLoad:DevIoCtl:FAIL\n" );	
		Status = TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
		goto tmDSPExecutableLoadExit3;
	}

	Status = TMIF.Status;	

tmDSPExecutableLoadExit3 :	

#ifndef USE_LOADERCOPY
	HeapFree ( GetProcessHeap() , 0, pBuffer );
#endif

tmDSPExecutableLoadExit2 :
	TMDwnLdr_unload_object ( ObjectHandle );

tmDSPExecutableLoadExit1 :
	return Status;

}


// DSP FUNCTIONS
STATUS	tmDSPGetStatus ( DWORD dwDSPHandle, PDWORD pdwFlags )
{
	TMIF_STRUCT_DSPGETSTATUS	TMIF;
	DWORD	dwBytesReturned;

	TMIF.DSPHandle = dwDSPHandle;
	TMIF.ClientHandle = Global.dwClientHandle;

	if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_DSPGETSTATUS),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_DSPGETSTATUS),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_DSPGETSTATUS),
		&dwBytesReturned, NULL ) != TRUE )
	{
		return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
	}

	*pdwFlags = TMIF.DSPStatus;
	return TMIF.Status;
}

STATUS	tmDSPGetMiscInfo ( DWORD DSPHandle, PTMMAN_DSP_INFO pDSPInfo )
{
	TMIF_STRUCT_DSPMISCINFO	TMIF;
	DWORD	dwBytesReturned;

	TMIF.DSPHandle = DSPHandle;
	TMIF.ClientHandle = Global.dwClientHandle;

	if ( DeviceIoControl ( Global.hDevice, (DWORD)(TMIF_DIOC_DSPGETMISCINFO),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_DSPMISCINFO),
		(PVOID)&TMIF, sizeof (TMIF_STRUCT_DSPMISCINFO),
		&dwBytesReturned, NULL ) != TRUE )
	{
		return TM_STATUS ( TMMAN32_ERR_DEVIOCTLFAIL );
	}

	*pDSPInfo = TMIF.Info;
	return TMIF.Status;
}

STATUS	tmDSPSetMiscInfo ( DWORD DSPHandle, PTMMAN_DSP_INFO pDSPInfo )
{
	TMIF_STRUCT_DSPMISCINFO	TMIF;
	DWORD	dwBytesReturned;

	TMIF.DSPHandle = DSPHandle;
	TMIF.ClientHandle = Global.dwClientHandle;
	TMIF.Info = *pDSPInfo;

⌨️ 快捷键说明

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