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

📄 tmman32.c

📁 wince host 和 target PCI驱动程序
💻 C
📖 第 1 页 / 共 4 页
字号:
	
		DownLoaderStatus = TMDwnLdr_multiproc_relocate(ObjectHandle,
					   HostType,
					   (Address*)MMIOPhysicalAddressArray,
					   DSPInfo.DSPNumber,
					   iDSPCount,
					   ClockSpeed,
					   (Address)AlignedDownloadAddress,
					   DSPInfo.SDRAM.Size,
					   CacheOption);

		if (DownLoaderStatus != TMDwnLdr_OK) 
		{
 			Status = tmmanDownloaderStatusToTMManStatus(DownLoaderStatus);
			goto tmmanDSPLoadExit3; 
		}
	}

#else


	if ( ( DownLoaderStatus = TMDwnLdr_relocate  ( 
		ObjectHandle, 
		HostType,
		(Address)DSPInfo.MMIO.PhysicalAddress, // mmio base
		ClockSpeed,
		(Address)AlignedDownloadAddress, //physical adderss of download
		DSPInfo.SDRAM.Size,
		 CacheOption ) ) != TMDwnLdr_OK )
	{
		Status = tmmanDownloaderStatusToTMManStatus(DownLoaderStatus);
		goto tmmanDSPLoadExit3; 
	}

#endif

	if ( ( DownLoaderStatus = TMDwnLdr_get_endian ( ObjectHandle,
		&endian )) != TMDwnLdr_OK )
	{
		Status = tmmanDownloaderStatusToTMManStatus(DownLoaderStatus);
		goto tmmanDSPLoadExit3; 
	}

	// 1 = little endian & 0 = big endian
	// LittleEndian = 1 & BigEndian = 0
	if ( INIEndianess != endian )
	{
		Status = statusExecutableFileWrongEndianness;
		goto tmmanDSPLoadExit3;
	}

	// we know what is the target executables endianess
	// call the kernel mode driver to reconfigure itself in the correct
	// endianess

	TMIF.DSPHandle		= DSPHandle;
	TMIF.Endianess	=  
		( endian == LittleEndian ) ? constTMManEndianessLittle : constTMManEndianessBig;

	if ( ( TMDwnLdr_get_contents ( 
		ObjectHandle, 
		"__TMMan_Version",
		&TargetVersion ) )  != TMDwnLdr_OK )
	{
		/*
		//OutputDebugString ( TMDwnLdr_get_last_error (DownLoaderStatus) );
		if ( ! Global.DisableDialogBox )
		{
			WarningBox(TEXT("Target Executable has not been linked with [-host WinNT] or [-host Windows]\n"));
		}
		*/

		TMIF.PeerMajorVersion	= constTMManDefaultVersionMajor; 
		TMIF.PeerMinorVersion	= constTMManDefaultVersionMinor;
	}
	else
	{
		// major version = __TMMan_Version[31:16]
		// minor version = __TMMan_Version[15:0]
		TMIF.PeerMajorVersion = ( ( TargetVersion  & 0xffff0000 ) >> 16 ) ;
		TMIF.PeerMinorVersion = TargetVersion & ( 0x0000ffff );

		if ( ! Global.DisableDialogBox )
		{
			if ( ( TMIF.PeerMajorVersion != verGetFileMajorVersion() ) || 
				( TMIF.PeerMinorVersion != verGetFileMinorVersion() ) )
			{
				wsprintf ( szTemp, TEXT("Target Executable Version [%d.%d] is INCOMPATIBLE with TriMedia Driver Version [%d.%d]\n"),
						TMIF.PeerMajorVersion, TMIF.PeerMinorVersion, verGetFileMajorVersion(), verGetFileMinorVersion() );
				//WarningBox ( szTemp );

				switch ( ( MessageBox ( NULL,
					szTemp,
					TEXT("TriMedia Manager : tmman32.dll : Continue ? "),
					MB_OKCANCEL | MB_ICONQUESTION | MB_DEFBUTTON1 | MB_APPLMODAL )  ) )
				{
					case	IDOK :
					break;

					case	IDCANCEL :
					default :
					Status = ( TMIF.PeerMajorVersion != verGetFileMajorVersion() ) ? statusMajorVersionError : statusMinorVersionError;
					goto tmmanDSPLoadExit3;
 				}
			}
		}
	}


	if ( DeviceIoControl ( Global.hDevice, 
		constIOCTLtmmanDSPLoad,
		(PVOID)&TMIF, sizeof( tmifDSPLoad),
		(PVOID)&TMIF, sizeof( tmifDSPLoad),
		&BytesReturned, NULL ) != TRUE )
	{
		Status = TMIF.Status;
		goto tmmanDSPLoadExit3; 
	}

	// BUGCHECK - adjust this based on download address
	if ( ( DownLoaderStatus = TMDwnLdr_get_memory_image ( 
		ObjectHandle, 
		(UInt8*)tmmanPhysicalToMapped (&DSPInfo.SDRAM, AlignedDownloadAddress)) ) != TMDwnLdr_OK )
	{
		Status = tmmanDownloaderStatusToTMManStatus(DownLoaderStatus);
		goto tmmanDSPLoadExit3; 
	}


tmmanDSPLoadExit3 :
	TMDwnLdr_unload_object ( ObjectHandle );

tmmanDSPLoadExit2 :
	tmmanDSPUnmapSDRAM ( DSPHandle );

tmmanDSPLoadExit1 :
	return Status;

}



TMStatus  tmmanDSPStart ( 
	UInt32 DSPHandle )
{
	tmifGenericFunction	TMIF;

	TMStatus	Status = statusSuccess;
	UInt32		BytesReturned;

	TMIF.Handle = DSPHandle;

	//TMIF.ClientHandle = Global.dwClientHandle;

	if ( DeviceIoControl ( Global.hDevice,
		constIOCTLtmmanDSPStart,
		(PVOID)&TMIF, sizeof (tmifGenericFunction),
		(PVOID)&TMIF, sizeof (tmifGenericFunction),
		&BytesReturned, NULL ) != TRUE )
	{
		return statusDeviceIoCtlFail;
	}
	else
	{
		Status = TMIF.Status;
	}

	return Status;
}

TMStatus  tmmanDSPStop ( 
	UInt32 DSPHandle )
{
	tmifGenericFunction	TMIF;

	UInt32		BytesReturned;

	TMIF.Handle = DSPHandle;

	//TMIF.ClientHandle = Global.dwClientHandle;

	if ( DeviceIoControl ( Global.hDevice,
		constIOCTLtmmanDSPStop,
		(PVOID)&TMIF, sizeof (tmifGenericFunction),
		(PVOID)&TMIF, sizeof (tmifGenericFunction),
		&BytesReturned, NULL ) != TRUE )
	{
		return statusDeviceIoCtlFail;
	}
	return TMIF.Status;
}

TMStatus  tmmanDSPReset ( 
	UInt32 DSPHandle )
{
	tmifGenericFunction	TMIF;
	UInt32		BytesReturned;

	TMIF.Handle = DSPHandle;

	if ( DeviceIoControl ( Global.hDevice,
		constIOCTLtmmanDSPReset,
		(PVOID)&TMIF, sizeof (tmifGenericFunction),
		(PVOID)&TMIF, sizeof (tmifGenericFunction),
		&BytesReturned, NULL ) != TRUE )
	{
		return statusDeviceIoCtlFail;
	}

	return TMIF.Status;
}


// DEBUGGING INTERFACES 
TMStatus	tmmanDebugOptions (
	UInt32	DSPHandle, 
	UInt32	Option )
{
	TMStatus	Status;
	
	tmmanDSPInternalInfo DSPInternalInfo;
	Status = tmmanDSPGetInternalInfo ( DSPHandle, &DSPInternalInfo );
	if ( Status != statusSuccess )
		return Status;

	DSPInternalInfo.DebugOptionBitmap = Option;

	return tmmanDSPSetInternalInfo ( DSPHandle, &DSPInternalInfo );
}


TMStatus	tmmanDebugDPBuffers (
	UInt32	DSPHandle, 
	UInt8*	*FirstHalfPtr, 
	UInt32*	FirstHalfSizePtr, 
	UInt8*	*SecondHalfPtr, 
	UInt32*	SecondHalfSizePtr )
{
	tmifDebugBuffers TMIF;
	UInt32			BytesReturned;
	tmmanDSPInfo	DSPInfo;
	TMStatus		Status;

	TMIF.DSPHandle = DSPHandle;

	//TMIF.ClientHandle = Global.dwClientHandle;

	if ( DeviceIoControl ( Global.hDevice,
		constIOCTLtmmanGetDebugDPBuffers,
		(PVOID)&TMIF, sizeof (tmifDebugBuffers),
		(PVOID)&TMIF, sizeof (tmifDebugBuffers),
		&BytesReturned, NULL ) != TRUE )
	{
		return statusDeviceIoCtlFail;
	}

	

	if ( ( Status  = tmmanDSPGetInfo ( 
		DSPHandle, 
		&DSPInfo ) ) != statusSuccess )
	{
		return Status;
	}

/*
	DSPInfo.DSPHandle = DSPHandle;

	if ( DeviceIoControl ( Global.hDevice, 
		constIOCTLtmmanDSPInfo,
		(PVOID)&DSPInfo, sizeof( tmifDSPInfo) ,
		(PVOID)&DSPInfo, sizeof( tmifDSPInfo) ,
		&BytesReturned, NULL ) != TRUE )
	{
		return statusDeviceIoCtlFail;
	}
*/

	// remove this by changing the HalfPtrs to Offsets.
	if ( TMIF.FirstHalfPtr )
	{
		*FirstHalfPtr		= 
			(UInt8*)((DWORD)DSPInfo.SDRAM.MappedAddress + 
				(DWORD)TMIF.FirstHalfPtr );
	}

	if ( TMIF.SecondHalfPtr )
	{
		*SecondHalfPtr		= 
			(UInt8*)((DWORD)DSPInfo.SDRAM.MappedAddress + 
				(DWORD)TMIF.SecondHalfPtr );
	}

	*FirstHalfSizePtr	= TMIF.FirstHalfSize; 
	*SecondHalfSizePtr	= TMIF.SecondHalfSize;

	return TMIF.Status;
}

TMStatus	tmmanDebugHostBuffers (
	UInt8*	*FirstHalfPtr, 
	UInt32*	FirstHalfSizePtr, 
	UInt8*	*SecondHalfPtr, 
	UInt32*	SecondHalfSizePtr )
{
	tmifDebugBuffers TMIF;
	UInt32		BytesReturned;


	if ( DeviceIoControl ( Global.hDevice,
		constIOCTLtmmanGetDebugHostBuffers,
		(PVOID)&TMIF, sizeof (tmifDebugBuffers),
		(PVOID)&TMIF, sizeof (tmifDebugBuffers),
		&BytesReturned, NULL ) != TRUE )
	{
		return statusDeviceIoCtlFail;
	}

	*FirstHalfPtr		= TMIF.FirstHalfPtr;
	*SecondHalfPtr		= TMIF.SecondHalfPtr;
	*FirstHalfSizePtr	= TMIF.FirstHalfSize; 
	*SecondHalfSizePtr	= TMIF.SecondHalfSize;

	return TMIF.Status;
}

TMStatus	tmmanDebugTargetBuffers (
	UInt32	DSPHandle, 
	UInt8*	*FirstHalfPtr, 
	UInt32*	FirstHalfSizePtr, 
	UInt8*	*SecondHalfPtr, 
	UInt32*	SecondHalfSizePtr )
{
	tmifDebugBuffers TMIF;
	UInt32		BytesReturned;
	tmmanDSPInfo		DSPInfo;
	TMStatus		Status;

	TMIF.DSPHandle = DSPHandle;

	
	if ( DeviceIoControl ( Global.hDevice,
		constIOCTLtmmanGetDebugTargetBuffers,
		(PVOID)&TMIF, sizeof (tmifDebugBuffers),
		(PVOID)&TMIF, sizeof (tmifDebugBuffers),
		&BytesReturned, NULL ) != TRUE )
	{
		return statusDeviceIoCtlFail;
	}



	if ( ( Status  = tmmanDSPGetInfo ( 
		DSPHandle, 
		&DSPInfo ) ) != statusSuccess )
	{
		return Status;
	}

/*
	DSPInfo.DSPHandle = DSPHandle;

	if ( DeviceIoControl ( Global.hDevice, 
		constIOCTLtmmanDSPInfo,
		(PVOID)&DSPInfo, sizeof( tmifDSPInfo) ,
		(PVOID)&DSPInfo, sizeof( tmifDSPInfo) ,
		&BytesReturned, NULL ) != TRUE )
	{
		return statusDeviceIoCtlFail;
	}
*/

	// remove this by changing the HalfPtrs to Offsets.
	if ( TMIF.FirstHalfPtr )
	{
		*FirstHalfPtr		= 
			(UInt8*)((DWORD)DSPInfo.SDRAM.MappedAddress + 
				(DWORD)TMIF.FirstHalfPtr );
	}

	if ( TMIF.SecondHalfPtr )
	{
		*SecondHalfPtr		= 
			(UInt8*)((DWORD)DSPInfo.SDRAM.MappedAddress + 
				(DWORD)TMIF.SecondHalfPtr );
	}

	*FirstHalfSizePtr	= TMIF.FirstHalfSize;
	*SecondHalfSizePtr	= TMIF.SecondHalfSize;

	return TMIF.Status;
}

UInt32 tmmanDebugPrintf ( Int8 *Format, ... )
{
	UInt8	DebugBuffer[constTMManDebugStringLength];
	UInt32	Sentinel = 0xdeadbeef;

	UInt32	StringLength;
	UInt32		BytesReturned;
	va_list va;

    va_start(va, Format);
    vsprintf( DebugBuffer, Format, va);
    va_end(va);

	if ( Sentinel != 0xdeadbeef )
	{
		return statusStringBufferOverflow;
	}

	StringLength = strlen ( DebugBuffer );

	if ( DeviceIoControl ( Global.hDevice,
		constIOCTLtmmanDebugPrintf,
		(PVOID)DebugBuffer, StringLength + 1,
		Null, 0,
		&BytesReturned, NULL ) != TRUE )
	{
		return statusDeviceIoCtlFail;
	}

	return statusSuccess;

}


UInt32	tmmanMappedToPhysical ( 
	tmmanMemoryBlock* MemoryBlock, 
	UInt32 MappedAddress )
{
	return MemoryBlock->PhysicalAddress + (MappedAddress - MemoryBlock->MappedAddress);
}

UInt32	tmmanPhysicalToMapped ( 
	tmmanMemoryBlock* MemoryBlock, 
	UInt32 PhysicalAddress )
{
	return MemoryBlock->MappedAddress + (PhysicalAddress - MemoryBlock->PhysicalAddress);
}


Bool    tmmanValidateAddressAndLength ( 
	tmmanMemoryBlock* MemoryBlock, 
	UInt32 Address, 
	UInt32 Length )
{

    // assumes that MMIO and SDRAM are not contigious.
    if ( ( Address >= MemoryBlock->PhysicalAddress ) &&
        ( Address < (MemoryBlock->PhysicalAddress + MemoryBlock->Size - 1) ) )
    {
        if ( ( Address + Length ) <=
            (MemoryBlock->PhysicalAddress + MemoryBlock->Size - 1))
            return True;
        else
            return False;
    }
    return False;
}

Bool    tmmanTranslateAdapterAddress ( 
	UInt32 MappedAddress,
	UInt32 Length,
	UInt32 *PhysicalAddressPtr )
{
	tmifGenericFunction	TMIF;
	UInt32	BytesReturned;
	HANDLE MutexHandle;


	if ( ( MutexHandle = CreateMutex( 
		NULL,
		FALSE,  // flag for initial ownership
		TEXT("tmman32XlateMutex") ) ) == NULL )
	{
		return statusDeviceIoCtlFail;
	}

	WaitForSingleObject( MutexHandle, INFINITE );

	if ( DeviceIoControl ( Global.hDevice,
		constIOCTLtmmanXlateAdapterAddress1,
		(PVOID)&TMIF, sizeof (tmifGenericFunction),
		(PVOID)MappedAddress, Length,
		&BytesReturned, NULL ) != TRUE )
	{
		CloseHandle ( MutexHandle );
		return statusDeviceIoCtlFail;
	}

	if ( DeviceIoControl ( Global.hDevice,
		constIOCTLtmmanXlateAdapterAddress2,
		(PVOID)&TMIF, sizeof (tmifGenericFunction),
		(PVOID)&TMIF, sizeof (tmifGenericFunction),
		&BytesReturned, NULL ) != TRUE )
	{
		CloseHandle ( MutexHandle );
		return statusDeviceIoCtlFail;
	}

	ReleaseMutex ( MutexHandle );

	CloseHandle ( MutexHandle );

	*PhysicalAddressPtr = TMIF.Handle;
	return statusSuccess;
}


Int8*	tmmanGetErrorString (
	TMStatus	StatusCode )
{
	return errorGetErrorString( StatusCode );
}

// HELPER FUNCTIONS - NOT EXPORTED BY THE INTERFACE
void	ErrorBox ( TCHAR* ErrorString )
{
	MessageBox ( NULL,
	ErrorString,
	TEXT("TriMedia Manager : tmman32.dll : FATAL ERROR"),
	MB_OK | MB_ICONSTOP | MB_DEFBUTTON1 | MB_APPLMODAL );

}

void	WarningBox ( TCHAR* ErrorString )
{
	MessageBox ( NULL,
		ErrorString,
		TEXT("TriMedia Manager : tmman32.dll : WARNING"),
		MB_OK | MB_ICONWARNING | MB_DEFBUTTON1 | MB_APPLMODAL );

}

TMStatus  tmmanMessageCreate ( 
	UInt32	DSPHandle,
	Int8*	Name,
	UInt32	SynchronizationHandle,
	UInt32	SynchronizationFlags,

	UInt32* MessageHandlePointer )
{
	tmifMessageCreate TMIF;
	UInt32		BytesReturned;
	TMIF.DSPHandle = DSPHandle;

	if ( strlen ( Name ) >= constTMManNameSpaceNameLength )
	{
		return statusNameSpaceLengthExceeded;
	}

	strcpy ( TMIF.Name, Name );


	switch ( WindowsVersion )
	{
		case WINDOWS_OS_WIN98 :
		case WINDOWS_OS_WINNT40 :
		case WINDOWS_OS_WINNT50 :
		TMIF.SynchObject = SynchronizationHandle;
		break;

		case WINDOWS_OS_WIN95 :
		{
			HMODULE		InstanceHandle;
			FARPROC		ProcAddress;

			if ( ( InstanceHandle = LoadLibrary (TEXT("Kernel32.dll")) ) == NULL )
			{
				OutputDebugString( TEXT("tmman32:LoadLibrary:FAIL\n") );
				//return statusCannotLoadKernel32DLL;
				return statusDeviceIoCtlFail;
			}

			if ( ( ProcAddress = GetProcAddress(InstanceHandle, TEXT("OpenVxDHandle")) ) == NULL )
			{
				OutputDebugString( TEXT("tmman32:LoadLibrary:FAIL\n") );
				FreeLibrary (InstanceHandle);
				//return statusCannotLoadKernel32DLL;
				return statusDeviceIoCtlFail;

			}

			TMIF.SynchObject = (ProcAddress)(SynchronizationHandle);

			FreeLibrary (InstanceHandle);
		}
		break;
	}

	TMIF.SynchFlags = SynchronizationFlags;

	//TMIF.ClientHandle = Global.dwClientHandle;

	
	EnterCriticalSection ( &Global.MessageCriticalSection );
	

	if ( DeviceIoControl ( Global.hDevice,
		constIOCTLtmmanMessageCreate,
		(PVOID)&TMIF, sizeof (tmifMessageCreate),
		(PVOID)&TMIF, sizeof (tmifMessageCreate),
		&BytesReturned, NULL ) != TRUE )
	{
		LeaveCriticalSection ( &Global.MessageCriticalSection );
		return statusDeviceIoCtlFail;
	}

	*MessageHandlePointer = TMIF.MessageHandle;

	
	LeaveCriticalSection ( &Global.MessageCriticalSection );

	return TMIF.Status;
}

TMStatus  tmmanMessageDestroy ( 
	UInt32 MessageHandle )
{
	tmifGenericFunction	TMIF;
	UInt32		BytesReturned;

	TMIF.Handle = MessageHandle;

	//TMIF.ClientHandle = Global.dwClientHandle;

	
	EnterCriticalSection ( &Global.MessageCriticalSection );
	

	if ( DeviceIoControl ( Global.hDevice,
		constIOCTLtmmanMessageDestroy,
		(PVOID)&TMIF, sizeof (tmifGenericFunction),
		(PVOID)&TMIF, sizeof (tmifGenericFunction),
		&BytesReturned, NULL ) != TRUE )
	{
		LeaveCriticalSection ( &Global.MessageCriticalSection );
		return statusDeviceIoCtlFail;
	}

⌨️ 快捷键说明

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