亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? hal_platform.c

?? 用C語言設計的EPSON LCD控制器S1D13700驅動。
?? C
字號:
//===========================================================================
//	HAL_PLATFORM.C
//---------------------------------------------------------------------------
//
//  Copyright (c) 2002 Epson Research and Development, Inc.
//  All Rights Reserved.
//
//===========================================================================


#include <stdlib.h>
#include "hal_private.h"
#include "hal_platform.h"
#include "pcibridge.h"

#if defined(_WIN32)
  #define WIN32_LEAN_AND_MEAN
  #include <windows.h>
	static HANDLE	ghHalMutex;				// Process synchronization mutex handle

  #ifdef HAL_SIMULATE
	static HANDLE	ghSharedMemory;			// Handle to shared memory
	static VOID	   *gpSharedMemory;			// Pointer to shared memory
  #endif
#elif defined(_MSDOS)
  #include "dos32.h"
#endif



#define DEFAULT_BLOCK_SIZE	0x00400000UL			// Total size of PCI virtual memory block



static void		ExitHandler( void );
static int		Pci2Hal( Boolean fPCIResult );
static UInt32	Get13xxxBaseAddress( Boolean fEnable );
static int		AllocateSharedMemory( UInt32 PhysicalAddr, UInt32 *pVirtualAddr, UInt32 *pBlockSize );
static void		FreeSharedMemory( void );




//----------------------------------------------------------------------------
// PLATFORM FUNCTION: halpDelayUS()
//----------------------------------------------------------------------------
Boolean halpDelayUS( UInt32 microseconds )
{
#ifdef _WIN32

	static UInt32 NsPerTick = 0;
	__int64 nanoseconds = microseconds*1000i64;
	__int64 Count, Target;

	// Init the ns/Tick constant if this is the first time here.

	if ( !NsPerTick )
	{
		if ( QueryPerformanceFrequency((PLARGE_INTEGER)&Count) )
			NsPerTick = (UInt32)(1000000000i64/Count);
		else
			return FALSE;
	}

	// Exit OK if requested delay is too short.

	if ( nanoseconds < NsPerTick )
		return TRUE;

	// Get the starting initial counter value now.

	if ( !QueryPerformanceCounter((PLARGE_INTEGER)&Target) )
		return FALSE;

	// Calculate the terminal count of ticks required for requested delay.

	Target += nanoseconds/NsPerTick;

	// Loop until the counter exceeds the number of ticks in the requested delay.

	do
	{
		QueryPerformanceCounter( (PLARGE_INTEGER)&Count );
	} while ( Count < Target );

	return TRUE;

#elif defined(MV850E)

	volatile UInt32 i;
	volatile UInt32 adjust;

	adjust = (microseconds * 10L) / 18L;

	for (i = 0; i < adjust; ++i)
		continue;

	return TRUE;

#elif defined(_MSDOS)

	UInt32 nTicks = (((microseconds+1UL)/2UL)*105UL)/(88UL/2UL);

	dos32Delay838NS( nTicks );

	return TRUE;

#else //_WIN32

	#pragma message(">>>>> Function halpDelayUS() must be written for this platform. <<<<<")
	return FALSE;

#endif
}



//---------------------------------------------------------------------------
// PLATFORM FUNCTION: halpMapPhysicalToVirtual()
//---------------------------------------------------------------------------
int halpMapPhysicalToVirtual( UInt32 PhysicalAddr, UInt32 *pVirtualAddr, UInt32 *pBlockSize )
{
	static Boolean fExitHandler = FALSE;

	// Always register the atexit routine at least once, so any allocated
	// resources are guaranteed to be released and freed.

	if ( !fExitHandler )
	{
		fExitHandler = TRUE;
		atexit( ExitHandler );
	}

#if defined(_WIN32)

  #ifndef HAL_SIMULATE
	return Pci2Hal( pcibMapAddress(PhysicalAddr,pVirtualAddr,pBlockSize) );
  #else
	return AllocateSharedMemory( PhysicalAddr, pVirtualAddr, pBlockSize );
  #endif

#else

  #if defined(_MSDOS)
	{
		MIDStruct MemData;

		dos32Initialize( &MemData );
		if ( MemData.fV86Mode || !MemData.fA20State )
			return ERR_FAILED;

		if ( !PhysicalAddr )
			PhysicalAddr = Get13xxxBaseAddress( TRUE );
	}
  #endif

	// On non-Windows system, a physical address of zero is bad karma.

	if ( PhysicalAddr == 0 )
		return ERR_FAILED;

	if ( pVirtualAddr )
		*pVirtualAddr = PhysicalAddr;
	if ( pBlockSize )
		*pBlockSize = DEFAULT_BLOCK_SIZE;

	return ERR_NONE;

#endif
}



//---------------------------------------------------------------------------------------
// PLATFORM FUNCTION: halpAddInterruptRegister()
//---------------------------------------------------------------------------------------
int halpAddInterruptRegister( UInt32 EnableReg, UInt32 StatusReg, UInt32 BitMask, UInt32 AccessSize, Boolean fRawStatus )
{
#ifdef _WIN32

  #ifndef HAL_SIMULATE
	EnableReg += HalInfo.dwRegisterOffset;
	StatusReg += HalInfo.dwRegisterOffset;
	return Pci2Hal( pcibAddInterruptRegister(EnableReg,StatusReg,BitMask,AccessSize,fRawStatus) );
  #else
	EnableReg, StatusReg, BitMask, AccessSize, fRawStatus;
	return ERR_IRQ_FAILURE;					// Not simulated.
  #endif

#else

	// On non-Windows system, new code to handle interrupts must be written.

	#pragma message(">>>>> halpAddInterruptRegister() must be written for this platform. <<<<<")
	return ERR_IRQ_FAILURE;

#endif
}



//---------------------------------------------------------------------------------------
// PLATFORM FUNCTION: halpSetISRCallback()
//---------------------------------------------------------------------------------------
int halpSetISRCallback( void(*pISRCallback)(void) )
{
#ifdef _WIN32

  #ifndef HAL_SIMULATE
	return Pci2Hal( pcibHookInterrupt(pISRCallback) );
  #else
	pISRCallback;
	return ERR_IRQ_FAILURE;					// Not simulated.
  #endif

#else

	// On non-Windows system, new code to handle interrupts must be written.

	#pragma message(">>>>> halpSetISRCallback() must be written for this platform. <<<<<")
	return ERR_IRQ_FAILURE;

#endif
}



//---------------------------------------------------------------------------------------
// PLATFORM FUNCTION: halpDirectRead()
//---------------------------------------------------------------------------------------
UInt32 halpDirectRead( int Size, UInt32 Address )
{
#if !defined(_MSDOS)

	if ( Size == sizeof(UInt8) )
	{
		return *(pUInt8)Address;
	}
	else if ( Size == sizeof(UInt16) )
	{
		return *(pUInt16)Address;
	}
	else if ( Size == sizeof(UInt32) )
	{
		return *(pUInt32)Address;
	}

#else //_MSDOS

	if ( Size == sizeof(UInt8) || Size == sizeof(UInt16) || Size == sizeof(UInt32) )
	{
		return dos32ReadAbsolute( Address, Size );
	}

#endif //_MSDOS

	return 0;
}



//---------------------------------------------------------------------------------------
// PLATFORM FUNCTION: halpDirectWrite()
//---------------------------------------------------------------------------------------
void halpDirectWrite( int Size, UInt32 Address, UInt32 Value, UInt32 Count )
{
	if ( Count )
	{

#if !defined(_MSDOS)

		if ( Size == sizeof(UInt8) )
		{
			pUInt8 pWrite = (pUInt8)Address;
			do
				*pWrite++ = (UInt8)Value;
			while ( --Count );
		}
		else if ( Size == sizeof(UInt16) )
		{
			pUInt16 pWrite = (pUInt16)Address;
			do
				*pWrite++ = (UInt16)Value;
			while ( --Count );
		}
		else if ( Size == sizeof(UInt32) )
		{
			pUInt32 pWrite = (pUInt32)Address;
			do
				*pWrite++ = Value;
			while ( --Count );
		}

#else //_MSDOS

		if ( Size == sizeof(UInt8) || Size == sizeof(UInt16) || Size == sizeof(UInt32) )
		{
			do
			{
				dos32WriteAbsolute( Address, Value, Size );
				Address += Size;
			}
			while ( --Count );
		}

#endif //_MSDOS

	}
}



//---------------------------------------------------------------------------------------
// PLATFORM FUNCTION: halpDirectReadData()
//---------------------------------------------------------------------------------------
void halpDirectReadData( int Size, UInt32 Address, void* pData, UInt32 Count )
{
	if ( Count && pData )
	{

#if !defined(_MSDOS)

		if ( Size == sizeof(UInt8) )
		{
			pUInt8 pRead = (pUInt8)Address;
			pUInt8 pWrite = pData;
			do
				*pWrite++ = *pRead++;
			while ( --Count );
		}
		else if ( Size == sizeof(UInt16) )
		{
			pUInt16 pRead = (pUInt16)Address;
			pUInt16 pWrite = pData;
			do
				*pWrite++ = *pRead++;
			while ( --Count );
		}
		else if ( Size == sizeof(UInt32) )
		{
			pUInt32 pRead = (pUInt32)Address;
			pUInt32 pWrite = pData;
			do
				*pWrite++ = *pRead++;
			while ( --Count );
		}

#else //_MSDOS

	#pragma message(">>>>> halpDirectReadData() must be written for this platform. <<<<<")

#endif //_MSDOS

	}
}



//---------------------------------------------------------------------------------------
// PLATFORM FUNCTION: halpDirectWriteData()
//---------------------------------------------------------------------------------------
void halpDirectWriteData( int Size, UInt32 Address, const void* pData, UInt32 Count )
{
	if ( Count && pData )
	{

#if !defined(_MSDOS)

		if ( Size == sizeof(UInt8) )
		{
			const UInt8* pRead = pData;
			pUInt8 pWrite = (pUInt8)Address;
			do
				*pWrite++ = *pRead++;
			while ( --Count );
		}
		else if ( Size == sizeof(UInt16) )
		{
			const UInt16* pRead = pData;
			pUInt16 pWrite = (pUInt16)Address;
			do
				*pWrite++ = *pRead++;
			while ( --Count );
		}
		else if ( Size == sizeof(UInt32) )
		{
			const UInt32* pRead = pData;
			pUInt32 pWrite = (pUInt32)Address;
			do
				*pWrite++ = *pRead++;
			while ( --Count );
		}

#else //_MSDOS

	#pragma message(">>>>> halpDirectWriteData() must be written for this platform. <<<<<")

#endif //_MSDOS

	}
}



//---------------------------------------------------------------------------------------
// PLATFORM FUNCTION: halpSetProcessExclusivity()
//---------------------------------------------------------------------------------------
void halpSetProcessExclusivity( Boolean fExclusive )
{
#ifdef _WIN32

	if ( fExclusive )
	{
		if ( !ghHalMutex )
			ghHalMutex = CreateMutex( NULL, FALSE, HALCHIPID"HalMutex" );

		if ( ghHalMutex )
			WaitForSingleObject( ghHalMutex, INFINITE );
	}
	else
	{
		if ( ghHalMutex )
			ReleaseMutex( ghHalMutex );
	}

#else

	#pragma message(">>>>> halpSetProcessExclusivity() must be written for this platform. <<<<<")

#endif
}




//---------------------------------------------------------------------------
// PRIVATE FUNCTION: ExitHandler() - Free up resources at exit time.
//---------------------------------------------------------------------------
static void ExitHandler( void )
{
#if defined(_WIN32)

  #ifndef HAL_SIMULATE
	pcibUnmapAddress();
  #else
	FreeSharedMemory();
  #endif

	if ( ghHalMutex )
		CloseHandle( ghHalMutex ), ghHalMutex = NULL;

#elif defined(_MSDOS)

	dos32Terminate();

#endif
}



#ifdef _WIN32

//---------------------------------------------------------------------------
// PRIVATE FUNCTION: Pci2Hal() - Map PCI to HAL return code. >>>WIN32 ONLY<<<
//---------------------------------------------------------------------------
static int Pci2Hal( Boolean fPCIResult )
{
	int Result = ERR_NONE;

	if ( !fPCIResult )
	{
		switch ( pcibGetLastError() )
		{
		  case PCIE_ERR_ADAPTER_NOT_FOUND:		Result = ERR_PCI_ADAPTER_NOT_FOUND;		break;
		  case PCIB_ERR_DRIVER_NOT_FOUND:		Result = ERR_PCI_DRIVER_NOT_FOUND;		break;
		  case PCIB_ERR_IRQ_FAILURE:			Result = ERR_IRQ_FAILURE;				break;
		  case PCIB_ERR_ADAPTER_NOT_MAPPED:		Result = ERR_NOT_ACQUIRED;				break;
		  default:								Result = ERR_FAILED;					break;
		}
	}

	return Result;
}

#endif	//_WIN32



#ifdef _MSDOS

#define VENDEV			0x002014EBL		// device_Id + vendor_Id
#define CONFIG_ADDRESS	0x0CF8
#define CONFIG_DATA		0x0CFC
#define PCI_ENABLE		(1L<<31)

//---------------------------------------------------------------------------
// PRIVATE FUNCTION: Get13xxxBaseAddress() - Find S1D13xxx PCI. >>>MSDOS ONLY<<<
//---------------------------------------------------------------------------
static UInt32 Get13xxxBaseAddress( Boolean fEnable )
{
	UInt32	b, d, f, f2, x;
	UInt32	Addr = 0UL;

	for (b = 0; b < (1L<<24); b += (1L<<16))
	{
		for (d = 0; d < (1L<<16); d += (1L<<11))
		{
			outpd( CONFIG_ADDRESS, PCI_ENABLE | b | d | 0x0C );
			if ( (x = inpd(CONFIG_DATA)) == -1 )
				continue;

			f2 = (x & 0x00800000L) ? (1L<<11) : (1L<<8);
			for (f = 0; f < f2; f += (1L<<8))
			{
				outpd( CONFIG_ADDRESS, PCI_ENABLE | b | d | f | 0x00 );
				x = inpd( CONFIG_DATA );

				if ( x == VENDEV )
				{
					if ( fEnable )		// Enable decoding (may be enabled by BIOS)
					{
						outpd( CONFIG_ADDRESS, PCI_ENABLE | b | d | f | 0x04 );
						x = inpd( CONFIG_DATA );
						outpd( CONFIG_DATA, x | 2 );
					}

					// Read DWREG[5] to get the physical ("base") address

					outpd( CONFIG_ADDRESS, PCI_ENABLE | b | d | f | 0x10 );
					Addr = inpd( CONFIG_DATA );
				}
			}
		}
	}

	return Addr;
}

#endif	//_MSDOS



#if defined(_WIN32) && defined(HAL_SIMULATE)

//---------------------------------------------------------------------------
// PRIVATE FUNCTION: AllocateSharedMemory()		>>>HAL_SIMULATE ONLY<<<
//---------------------------------------------------------------------------
static int AllocateSharedMemory( UInt32 PhysicalAddr, UInt32 *pVirtualAddr, UInt32 *pBlockSize )
{
	DWORD dwLastError;

	// We can't simulate a specific user-specified physical address.

	if ( PhysicalAddr )
		return ERR_FAILED;

	// If we haven't allocated shared memory yet, do it now.

	if ( gpSharedMemory == NULL )
	{
		ghSharedMemory = CreateFileMapping( INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, DEFAULT_BLOCK_SIZE, HALCHIPID"HalSharedMemory" );
		dwLastError = GetLastError();				// Remember result code for later.

		// If we allocated shared memory successfully, then get a pointer to it.

		if ( ghSharedMemory != NULL && ghSharedMemory != INVALID_HANDLE_VALUE )
		{
			gpSharedMemory = MapViewOfFile( ghSharedMemory, FILE_MAP_ALL_ACCESS, 0, 0, 0 );
			if ( gpSharedMemory == NULL )
			{
				CloseHandle( ghSharedMemory );
				ghSharedMemory = NULL;
			}
		}

		// If we failed to allocation shared memory, exit with error condition.

		if ( gpSharedMemory == NULL )
			return ERR_FAILED;

		// If we are the first to allocate shared memory, then initialize it to ZERO.

		if ( dwLastError != ERROR_ALREADY_EXISTS )
			ZeroMemory( gpSharedMemory, DEFAULT_BLOCK_SIZE );
	}

	if ( pVirtualAddr )
		*pVirtualAddr = (UInt32)gpSharedMemory;
	if ( pBlockSize )
		*pBlockSize = DEFAULT_BLOCK_SIZE;

	return ERR_NONE;
}



//---------------------------------------------------------------------------
// PRIVATE FUNCTION: FreeSharedMemory()			>>>HAL_SIMULATE ONLY<<<
//---------------------------------------------------------------------------
static void FreeSharedMemory( void )
{
	// Only free up these resources, if they are currently allocated and in use.

	if ( gpSharedMemory )
	{
		UnmapViewOfFile( gpSharedMemory );
		gpSharedMemory = NULL;
	}
	if ( ghSharedMemory )
	{
		CloseHandle( ghSharedMemory );
		ghSharedMemory = NULL;
	}
}

#endif //defined(_WIN32) && defined(HAL_SIMULATE)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合久久综合久久| 午夜精品久久久久久久99樱桃 | 2023国产精品| 成人欧美一区二区三区视频网页| 日韩精品电影在线| 99国产精品国产精品久久| 欧美一级理论片| 亚洲国产精品久久久久婷婷884 | 美洲天堂一区二卡三卡四卡视频| 99精品桃花视频在线观看| 久久久久国产精品麻豆ai换脸 | 国产精品国产a| 国产成人精品一区二区三区四区| 欧美一级艳片视频免费观看| 亚洲综合免费观看高清完整版 | 成人美女在线观看| 久久这里都是精品| 久久精品国产亚洲高清剧情介绍 | 久久av老司机精品网站导航| 欧美日韩中字一区| 亚洲高清中文字幕| 精品视频一区三区九区| 亚洲综合清纯丝袜自拍| 在线观看一区二区视频| 亚洲日本一区二区三区| 99国产一区二区三精品乱码| 国产精品毛片无遮挡高清| 国产在线国偷精品产拍免费yy| 欧美一级日韩免费不卡| 人人超碰91尤物精品国产| 91精品国产福利| 男人的天堂久久精品| 日韩欧美国产一区二区在线播放| 丝袜亚洲精品中文字幕一区| 884aa四虎影成人精品一区| 日日夜夜精品视频天天综合网| 欧美三级电影网站| 日韩福利电影在线| 欧美成人在线直播| 国产一区二区影院| 国产精品美女视频| 色94色欧美sute亚洲线路一久| 亚洲无线码一区二区三区| 欧美精品一级二级| 伦理电影国产精品| 欧美精彩视频一区二区三区| 91同城在线观看| 亚洲一区二区高清| 日韩欧美电影在线| 成人污污视频在线观看| 亚洲蜜臀av乱码久久精品| 欧美片网站yy| 国产一区二区三区四区在线观看| 国产精品网曝门| 欧美网站一区二区| 国产麻豆视频精品| 亚洲激情自拍偷拍| 日韩一区二区三区高清免费看看| 国产精品一区二区免费不卡| 亚洲视频电影在线| 日韩欧美电影一区| 99r国产精品| 蜜桃av噜噜一区| 日韩美女视频一区| 日韩精品一区二区三区swag| 成人动漫一区二区在线| 亚洲成av人片在www色猫咪| 精品sm捆绑视频| 色婷婷综合中文久久一本| 毛片一区二区三区| 亚洲天堂成人在线观看| 日韩女优av电影在线观看| 91精品国产91久久久久久最新毛片| 精品福利一二区| 成人h精品动漫一区二区三区| 亚洲影院免费观看| 欧美电视剧在线观看完整版| 日本韩国欧美三级| 国产乱码字幕精品高清av| 一区二区免费在线| 国产日韩欧美综合在线| 欧美精品久久一区| 99精品偷自拍| 国产伦精一区二区三区| 日韩国产欧美在线视频| 亚洲精品网站在线观看| 国产欧美一区二区精品性色 | 国产精品美日韩| 欧美va日韩va| 正在播放亚洲一区| 色国产精品一区在线观看| 国产精品综合久久| 日本美女一区二区三区视频| 亚洲精品乱码久久久久久黑人| 国产亚洲精品7777| 精品国产乱码久久久久久图片| 欧美自拍偷拍一区| 99久久精品国产麻豆演员表| 国产乱人伦精品一区二区在线观看| 美女视频第一区二区三区免费观看网站| 亚洲天堂免费在线观看视频| 国产精品久久久久久久第一福利| 久久久九九九九| 精品国产成人系列| 欧美不卡一区二区| 久久综合九色综合97婷婷女人| 欧美一区二区视频观看视频| 欧美二区在线观看| 欧美日本一道本| 欧美剧情电影在线观看完整版免费励志电影| 91免费视频大全| 色综合亚洲欧洲| 在线观看www91| 欧美午夜不卡视频| 在线成人免费视频| 日韩一区二区免费视频| 日韩女优电影在线观看| 欧美精品一区二区久久久| 欧美va亚洲va国产综合| 久久综合九色综合欧美亚洲| 久久久噜噜噜久久人人看| 国产欧美一区二区在线观看| 国产欧美日韩三级| 亚洲欧美一区二区三区孕妇| 伊人色综合久久天天人手人婷| 一区二区三区在线播| 亚洲国产另类精品专区| 图片区小说区国产精品视频| 麻豆精品一二三| 福利电影一区二区| 在线观看亚洲精品| 欧美一区二区三区精品| 26uuu国产一区二区三区| 国产精品久久久久婷婷二区次| 亚洲色欲色欲www在线观看| 亚洲一区在线看| 青青草原综合久久大伊人精品| 国内成人精品2018免费看| 成人高清视频在线观看| 欧美撒尿777hd撒尿| 337p粉嫩大胆噜噜噜噜噜91av| 中文一区二区完整视频在线观看| 日韩毛片精品高清免费| 午夜亚洲国产au精品一区二区| 久久精工是国产品牌吗| aaa亚洲精品| 日韩一区二区视频在线观看| 欧美激情一区二区三区蜜桃视频| 亚洲人成网站影音先锋播放| 午夜久久电影网| 豆国产96在线|亚洲| 欧美三级电影网站| 欧美国产一区在线| 日韩av不卡在线观看| 成人激情文学综合网| 欧美一区二区久久| 亚洲六月丁香色婷婷综合久久| 免费日本视频一区| 91丝袜国产在线播放| 精品国产一区二区三区四区四| 亚洲六月丁香色婷婷综合久久 | 日韩精品一级中文字幕精品视频免费观看| 久久国产视频网| 日本高清不卡在线观看| 日韩三级中文字幕| 一级中文字幕一区二区| 高清在线观看日韩| 日韩精品一区二区三区中文精品 | 中文字幕欧美三区| 免费在线一区观看| 91麻豆国产自产在线观看| 久久丝袜美腿综合| 日韩—二三区免费观看av| 色国产综合视频| 亚洲色图欧美激情| 成人av电影在线网| 久久精品网站免费观看| 麻豆成人91精品二区三区| 欧美日韩国产高清一区| 亚洲女人****多毛耸耸8| 国产99精品国产| 久久亚洲捆绑美女| 久久精品久久精品| 欧美成人免费网站| 久久99热国产| 日韩欧美中文字幕公布| 婷婷国产在线综合| 欧美精品三级日韩久久| 亚洲综合激情另类小说区| 一本色道久久加勒比精品 | 日本韩国欧美一区二区三区| 国产欧美精品区一区二区三区 | 毛片不卡一区二区| 欧美一区二区视频在线观看2022| 亚洲国产精品一区二区久久恐怖片| 在线这里只有精品| 亚洲国产cao| 91麻豆精品国产91久久久使用方法 | 91国偷自产一区二区三区观看| 中文av字幕一区|