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

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

?? i2c.c

?? WinCE5.0BSP for Renesas SH7770
?? C
?? 第 1 頁 / 共 2 頁
字號:
//
// Copyright(C) Renesas Technology Corp. 2002-2003. All rights reserved.
//
// I2C driver for ITS-DS7
//
// FILE      : I2C.C
// CREATED   : 2002.06.26
// MODIFIED  : 2003.06.20
// AUTHOR    : Renesas Technology Corp.
// HARDWARE  : RENESAS ITS-DS7
// HISTORY   : 
//             2003.06.20
//              - Created release code.
//                (based on I2C driver for ITS-DS4 Ver.1.2.0 for WCE4.2)
//

#define WINCEMACRO 1
#include <windows.h>
#include <types.h>
#include <tchar.h>
#include <devload.h>
#include <memory.h>
#include <oalintr.h>
#include <excpt.h>

#include "platform.h"
#include "sh7770.h"
#include "I2C.H"
#include "I2CDBG.H"
#include "drv_glob.h"
#include "ioctl_its_ds7.h"

DWORD AdjustMicroSecondsToLoopCount( DWORD dwMicroSeconds );
DWORD BusyWait( DWORD dwLoopCount );

BOOL __stdcall
DllEntry(
	HINSTANCE	hInstDll,			// @parm Instance pointer
	DWORD		dwReason,			// @parm Reason routine is called
	LPVOID		lpReserved			// @parm system parameter
	)
{
	switch( dwReason ){
		case DLL_PROCESS_ATTACH :
			DEBUGREGISTER( hInstDll );
			break;
		case DLL_PROCESS_DETACH :
			break;
		case DLL_THREAD_ATTACH :
			break;
		case DLL_THREAD_DETACH :
			break;
		default :
			break;
	}
	return TRUE;
}

//	@func HANDLE | I2C_Init | device initialization routine
//	@parm DWORD  | dwIndex  | info passed to RegisterDevice
//	@rdesc	Returns a HANDLE which will be passed to Open & Deinit or NULL if
//			unable to initialize to driver.
HANDLE
I2C_Init(
	DWORD	dwIndex
	)
{
PI2C_DRIVER_INFO	pI2c;

	pI2c = VirtualAlloc(NULL, sizeof(I2C_DRIVER_INFO), MEM_COMMIT, PAGE_READWRITE);
	if ( pI2c == NULL ){
		return NULL;
	}
	memset( pI2c, 0, sizeof(I2C_DRIVER_INFO) );

	pI2c -> hIntEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
	if ( pI2c -> hIntEvent == NULL ){
		VirtualFree(pI2c, sizeof(I2C_DRIVER_INFO), MEM_DECOMMIT);
		return NULL;
	}

	pI2c -> pvBaseAddress = VirtualAlloc(0, I2C_REGSIZE, MEM_RESERVE, PAGE_NOACCESS);
	if ( pI2c -> pvBaseAddress == NULL ){
		VirtualFree(pI2c, sizeof(I2C_DRIVER_INFO), MEM_DECOMMIT);
		CloseHandle( pI2c -> hIntEvent );
		return NULL;
	}
	if ( !VirtualCopy((PVOID)pI2c -> pvBaseAddress, (PVOID)(I2C_REGBASE),
					I2C_REGSIZE, PAGE_READWRITE | PAGE_NOCACHE) ){
			VirtualFree(pI2c, sizeof(I2C_DRIVER_INFO), MEM_DECOMMIT);
			CloseHandle( pI2c -> hIntEvent );
			VirtualFree( (PVOID)pI2c -> pvBaseAddress, 0, MEM_RELEASE );
			return NULL;
	}

	pI2c -> data = (PI2C_WORK)VirtualAlloc(0, I2C_BUFFER_SIZE, MEM_RESERVE, PAGE_NOACCESS);
	if ( pI2c -> data != NULL ){
		if ( !VirtualCopy((PVOID)pI2c -> data, (PVOID)(I2C_BUFFER_BASE|UNCACHED_BASE),
				I2C_BUFFER_SIZE, PAGE_READWRITE | PAGE_NOCACHE) ){
		}
	}

	if ( !InterruptInitialize(SYSINTR_I2C, pI2c -> hIntEvent, NULL, 0) ){
		VirtualFree(pI2c, sizeof(I2C_DRIVER_INFO), MEM_DECOMMIT);
		CloseHandle( pI2c -> hIntEvent );
		VirtualFree((PVOID)pI2c -> pvBaseAddress, 0, MEM_RELEASE );
		VirtualFree((PVOID)pI2c -> data, 0, MEM_RELEASE);
		return NULL;
	}

	InitializeCriticalSection( &(pI2c -> csI2C) );

	pI2c -> SCR  = pI2c -> pvBaseAddress;
	pI2c -> MCR  = pI2c -> SCR + I2C_MCR_OFFSET;
	pI2c -> SSR  = pI2c -> SCR + I2C_SSR_OFFSET;
	pI2c -> MSR  = pI2c -> SCR + I2C_MSR_OFFSET;
	pI2c -> SIER = pI2c -> SCR + I2C_SIER_OFFSET;
	pI2c -> MIER = pI2c -> SCR + I2C_MIER_OFFSET;
	pI2c -> CCR  = pI2c -> SCR + I2C_CCR_OFFSET;
	pI2c -> SAR  = pI2c -> SCR + I2C_SAR_OFFSET;
	pI2c -> MAR  = pI2c -> SCR + I2C_MAR_OFFSET;
	pI2c -> RXD  = pI2c -> SCR + I2C_RXD_OFFSET;
	pI2c -> TXD  = pI2c -> SCR + I2C_TXD_OFFSET;

    DEBUGMSG(ZONE_TRACE, (TEXT("Revision %08x \r\n"), (ULONG)READ_REGISTER_ULONG(pI2c -> SCR) ));
    DEBUGMSG(ZONE_TRACE, (TEXT("%08x \r\n"), (ULONG)READ_REGISTER_ULONG(pI2c -> MCR) ));
    DEBUGMSG(ZONE_TRACE, (TEXT("%08x \r\n"), (ULONG)READ_REGISTER_ULONG(pI2c -> SSR) ));
    DEBUGMSG(ZONE_TRACE, (TEXT("%08x \r\n"), (ULONG)READ_REGISTER_ULONG(pI2c -> MSR) ));
    DEBUGMSG(ZONE_TRACE, (TEXT("%08x \r\n"), (ULONG)READ_REGISTER_ULONG(pI2c -> SIER) ));
    DEBUGMSG(ZONE_TRACE, (TEXT("%08x \r\n"), (ULONG)READ_REGISTER_ULONG(pI2c -> MIER) ));
    DEBUGMSG(ZONE_TRACE, (TEXT("%08x \r\n"), (ULONG)READ_REGISTER_ULONG(pI2c -> CCR) ));
    DEBUGMSG(ZONE_TRACE, (TEXT("%08x \r\n"), (ULONG)READ_REGISTER_ULONG(pI2c -> SAR) ));
    DEBUGMSG(ZONE_TRACE, (TEXT("%08x \r\n"), (ULONG)READ_REGISTER_ULONG(pI2c -> MAR) ));
    DEBUGMSG(ZONE_TRACE, (TEXT("%08x \r\n"), (ULONG)READ_REGISTER_ULONG(pI2c -> RXD) ));
	DEBUGMSG(ZONE_TRACE, (TEXT("%08x \r\n"), (ULONG)READ_REGISTER_ULONG(pI2c -> TXD) ));

	DEBUGMSG(ZONE_TRACE, (TEXT("0xffc00000 : %08x \r\n"), (ULONG)READ_REGISTER_ULONG(0xffc00000) ));

	return (HANDLE)pI2c;
}

//	@func BOOL | I2C_Deinit | device deinitialization routine
//	@parm ??
//	@rdesc	Returns TRUE for success, FALSE for failure
BOOL
I2C_Deinit(
	PI2C_DRIVER_INFO pI2c
	)
{
	SetEvent( pI2c -> hIntEvent );
	Sleep( 100 );
	VirtualFree( (PVOID)pI2c -> pvBaseAddress, 0, MEM_RELEASE);
	VirtualFree((PVOID)pI2c -> data, 0, MEM_RELEASE);
	CloseHandle( pI2c -> hIntEvent );

	VirtualFree(pI2c, sizeof(I2C_DRIVER_INFO), MEM_DECOMMIT);
	return TRUE;
}

//	@func HANDLE | I2C_Open    | device open routine
//	@parm DWORD  | dwData      | value returned from I2C_Init call
//	@parm DWORD  | dwAccess    | requested access (combination of GENERIC_READ
//								 and GENERIC_WRITE)
//	@parm DWORD  | dwShareMode | requested share mode (combination of 
//								 FILE_SHARE_READ and FILE_SHARE_WRITE)
//	@rdesc	Returns a HANDLE which will be passed to Read, Write, etc or NULL if
//			unable to open device.
HANDLE
I2C_Open(
	DWORD	dwData,
	DWORD	dwAccess,
	DWORD	dwShareMode
	)
{
PI2C_OPEN_INFO pOpen;

	pOpen = LocalAlloc(LPTR, sizeof(I2C_OPEN_INFO));
	if ( pOpen == NULL ){
		return NULL;
	}
	pOpen -> dwAccess = dwAccess;
	pOpen -> dwShareMode = dwShareMode;
	pOpen -> pI2CHandle = (PI2C_DRIVER_INFO)dwData;

	pOpen -> dwMaster = I2C_MASTER_MODE;
	pOpen -> bSingleStage = TRUE;
	pOpen -> dwBaudrate = 0;
	return (HANDLE)pOpen;
}

//	@func BOOL | I2C_Close | device close routine
//	@parm ???
//	@rdesc	Returns TRUE for success, FALSE for failure
BOOL
I2C_Close(
	PI2C_OPEN_INFO pOpen
	)
{
	LocalFree( pOpen );
	return TRUE;
}

//	@func DWORD  | I2C_Read | device read routine
//	@parm DWORD  | dwData   | value returned from I2C_Open call
//	@parm LPVOID | pBuf     | buffer to receive data
//	@parm DWORD  | dwLen    | maximum length to read
//	@rdesc	Returns 0 for end of file, -1 for error, otherwise the number of
//			bytes read.
DWORD
I2C_Read(
	DWORD	dwData,
	LPVOID	pBuf,
	DWORD	dwLen
	)
{
PI2C_OPEN_INFO pOpen = (PI2C_OPEN_INFO)dwData;
DWORD	ReadLength = 0;

	EnterCriticalSection( &(pOpen -> pI2CHandle -> csI2C) );
	if ( pOpen -> dwMaster == I2C_MASTER_MODE ){
		ReadLength = I2C_MasterRead(pOpen, pBuf, dwLen);
	}else if ( pOpen -> dwMaster == I2C_SLAVE_MODE ){
		ReadLength = I2C_SlaveRead(pOpen, pBuf, dwLen);
	}
	LeaveCriticalSection( &(pOpen -> pI2CHandle -> csI2C) );
	return ReadLength;
}

//	@func DWORD   | I2C_Write | device write routine
//	@parm DWORD   | dwData    | value returned from I2C_Open call
//	@parm LPCVOID | pBuf      | buffer containing data
//	@parm DWORD   | dwLen     | data length to write
//	@rdesc	Returns -1 for error, otherwise the number of bytes written
DWORD
I2C_Write(
	DWORD	dwData,
	LPCVOID	pBuf,
	DWORD	dwLen
	)
{
PI2C_OPEN_INFO pOpen = (PI2C_OPEN_INFO)dwData;
DWORD	WriteLength = 0;

	EnterCriticalSection( &(pOpen -> pI2CHandle -> csI2C) );
	if ( pOpen -> dwMaster == I2C_MASTER_MODE ){
		WriteLength = I2C_MasterWrite(pOpen, pBuf, dwLen);
	}else if ( pOpen -> dwMaster == I2C_SLAVE_MODE ){
		WriteLength = I2C_SlaveWrite(pOpen, pBuf, dwLen);
	}
	LeaveCriticalSection( &(pOpen -> pI2CHandle -> csI2C) );
	return WriteLength;
}

//	@func DWORD | I2C_Seek | device seek routine
//	@parm DWORD | dwData   | value returned from I2C_Open call
//	@parm long  | lPos     | position to seek to
//	@parm DWORD | dwType   | FILE_BEGIN, FILE_CURRENT, or FILE_END
//	@rdesc	Returns current position relative to start of file, or -1 on error
DWORD
I2C_Seek(
	DWORD	dwData,
	long	lPos,
	DWORD	dwType
	)
{
	return -1;
}

//	@func VOID | I2C_PowerUp | device powerup routine
//	@comm	Called power up device
VOID
I2C_PowerUp(
	DWORD	dwData
	)
{
}

//	@func VOID | I2C_PowrDown | device powerdwn routine
//	@comm	Called suspend device
VOID
I2C_PowerDown(
	DWORD dwData
	)
{
}

//	@func BOOL   | I2C_IOControl | Device IO control routine
//	@parm DWORD  | dwData        | value returned from I2C_Open call
//	@parm DWORD  | dwCode        | io control code to be performed
//	@parm PVOID  | pBufIn        | input data to the device
//	@parm DWORD  | dwLenIn       | number of bytes being passed in
//	@parm PVOID  | pBufOut       | output data from the device
//	@parm DWORD  | dwLenOut      | maximum number of bytes to receive from device
//	@parm PDWORD | pdwActualOut  | actual number of bytes received from device
//	@rdesc	Returns TRUE for success, FALSE for failure
BOOL
I2C_IOControl(
	DWORD	dwData,
	DWORD	dwCode,
	PVOID	pBufIn,
	DWORD	dwLenIn,
	PVOID	pBufOut,
	DWORD	dwLenOut,
	PDWORD	pdwActualOut
	)
{
BOOL	bRet = TRUE;
PI2C_OPEN_INFO pOpen = (PI2C_OPEN_INFO)dwData;

	*pdwActualOut = 0;
	switch( dwCode ){
		case IOCTL_I2C_SET_BAUDRATE :
			if ( pOpen -> dwMaster == I2C_MASTER_MODE ){
				pOpen -> dwBaudrate = *((PDWORD)pBufIn);
			}
			break;
		case IOCTL_I2C_SET_MODE :
			if ( *((PDWORD)pBufIn) == I2C_MASTER_MODE ){
				pOpen -> dwMaster = I2C_MASTER_MODE;
			}else{
				pOpen -> dwMaster = I2C_SLAVE_MODE;
			}
			break;
		case IOCTL_I2C_SET_BUFFER_MODE :
			if ( *((PDWORD)pBufIn) == I2C_SINGLE_STAGE ){
				pOpen -> bSingleStage = TRUE;
			}else{
				pOpen -> bSingleStage = FALSE;
			}
			break;
		default :
			bRet = FALSE;
			break;
	}
	return bRet;
}

BOOL
InitializeI2C(
	PI2C_OPEN_INFO	pi2c,
	BOOL	bMaster				// Master is TRUE, Slave is FALSE
	)
{
PI2C_DRIVER_INFO pI2c = pi2c -> pI2CHandle;
RegMCR	mcr;

	try {
		mcr.AsDWORD = 0;
		mcr.bits.FSB = 1;

		WRITE_REGISTER_ULONG(pI2c -> SCR, 0x00000000);
		WRITE_REGISTER_ULONG(pI2c -> MCR, READ_REGISTER_ULONG(pI2c -> MCR) & mcr.AsDWORD);
		WRITE_REGISTER_ULONG(pI2c -> SSR, 0x00000000);
		WRITE_REGISTER_ULONG(pI2c -> MSR, 0x00000000);
		WRITE_REGISTER_ULONG(pI2c -> SIER, 0x00000000);
		WRITE_REGISTER_ULONG(pI2c -> MIER, 0x00000000);
		WRITE_REGISTER_ULONG(pI2c -> CCR, 0x00000000);
		WRITE_REGISTER_ULONG(pI2c -> SAR, 0x00000000);
		WRITE_REGISTER_ULONG(pI2c -> MAR, 0x00000000);
	} except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
		EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
		return FALSE;
	}
	return TRUE;
}

BOOL
SetCCR(
	PI2C_OPEN_INFO	pi2c
	)
{
	try {
		WRITE_REGISTER_ULONG(pi2c -> pI2CHandle -> CCR, pi2c -> dwBaudrate);
	} except (GetExceptionCode() == EXCEPTION_ACCESS_VIOLATION ?
		EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH) {
		return FALSE;
	}
	return TRUE;
}

// pBuf : [0] [1-n]
//        Adr Data0 - Datan
// dwLen: n+1
DWORD
I2C_MasterWrite(
	PI2C_OPEN_INFO		pOpen,
	LPVOID				pBuf,
	DWORD				dwLen

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91美女片黄在线观看91美女| 九九热在线视频观看这里只有精品| 欧美日韩免费观看一区二区三区 | 日韩欧美中文字幕一区| 国产老肥熟一区二区三区| 亚洲午夜在线电影| 国产精品视频看| 欧美xxxxx裸体时装秀| 欧美日韩一区二区三区在线看| 国产一区二区福利视频| 丝袜美腿一区二区三区| 亚洲精品免费看| 中文字幕欧美激情一区| 精品少妇一区二区三区视频免付费 | 青草国产精品久久久久久| 亚洲日本在线天堂| 欧美激情中文字幕一区二区| 日韩一级大片在线| 5566中文字幕一区二区电影| 欧美午夜一区二区三区免费大片| 99精品国产91久久久久久| 韩国成人精品a∨在线观看| 欧美aaaaaa午夜精品| 亚洲韩国精品一区| 亚洲乱码国产乱码精品精小说| 国产精品三级电影| 国产日韩精品一区二区三区 | 成人黄色网址在线观看| 激情五月播播久久久精品| 琪琪一区二区三区| 蜜桃在线一区二区三区| 人人狠狠综合久久亚洲| 天天av天天翘天天综合网 | 国产成人av影院| 成人少妇影院yyyy| 国产激情91久久精品导航 | 成人福利在线看| 成人精品在线视频观看| 国产精品一区二区黑丝| 国产一区在线视频| 国产一区二区三区在线看麻豆| 久久爱www久久做| 激情综合色播激情啊| 国产自产2019最新不卡| 国产一区二区按摩在线观看| 国产一区二区三区精品视频| 国产激情一区二区三区桃花岛亚洲| 国产乱码精品一区二区三区av | 欧美三级视频在线播放| 欧美午夜电影网| 欧美男人的天堂一二区| 欧美一区二区精美| 日韩一区二区视频在线观看| 欧美精品少妇一区二区三区| 欧美一区2区视频在线观看| 欧美成人aa大片| 国产精品网曝门| 亚洲精品va在线观看| 五月天婷婷综合| 国产精品一区一区| 色悠久久久久综合欧美99| 欧美片在线播放| 欧美精品一区二区三区视频| 中文字幕欧美国产| 亚洲已满18点击进入久久| 午夜成人在线视频| 久久99国产精品久久99| av资源网一区| 欧美日韩亚洲国产综合| 精品久久久久久无| 国产精品乱码妇女bbbb| 一区av在线播放| 精品亚洲国产成人av制服丝袜| 国产成人亚洲精品狼色在线 | 精品国产伦一区二区三区观看方式| 国产天堂亚洲国产碰碰| 亚洲一区电影777| 激情五月激情综合网| 在线视频欧美精品| 日韩亚洲欧美在线观看| 中文字幕五月欧美| 美女性感视频久久| 97精品电影院| 中文字幕亚洲一区二区va在线| 亚洲成人高清在线| 国产高清亚洲一区| 91精品午夜视频| 中文字幕人成不卡一区| 青青草伊人久久| 91精品福利在线| 国产欧美综合在线观看第十页| 一区二区三区欧美视频| 国产精品亚洲成人| 欧美久久免费观看| 中文字幕日本乱码精品影院| 精品一区二区三区免费毛片爱| 色呦呦一区二区三区| 国产午夜精品福利| 日韩国产欧美在线观看| 91色porny在线视频| 久久亚洲精品小早川怜子| 香蕉加勒比综合久久| 成人高清免费观看| 久久久亚洲综合| 日本女优在线视频一区二区| 日本二三区不卡| 日本一区二区三级电影在线观看 | 亚洲成av人综合在线观看| 国产福利91精品一区二区三区| 91精品国产乱码| 亚洲午夜电影网| 91国偷自产一区二区三区观看| 国产农村妇女精品| 国产伦精品一区二区三区在线观看 | 亚洲成人中文在线| 99r国产精品| 中文字幕一区二区三区精华液| 国产一区二区三区在线观看免费视频 | 成人午夜视频福利| 久久亚洲一区二区三区明星换脸 | 亚洲国产视频在线| 色综合网色综合| 国产精品毛片无遮挡高清| 国产精品自拍网站| 久久久国产一区二区三区四区小说| 免费看黄色91| 日韩一区二区在线观看视频| 国产成人福利片| 久久久九九九九| 国产激情视频一区二区在线观看| 久久婷婷成人综合色| 国产一区不卡精品| 欧美激情在线观看视频免费| 国产伦精一区二区三区| 久久精品一区二区三区不卡 | 国产精品久久久久久久久晋中| 国产麻豆精品在线| 国产视频一区二区在线| 国产成人午夜99999| 久久精品免费在线观看| 粉嫩av一区二区三区在线播放 | 国产99久久久国产精品潘金| 久久综合色播五月| 国产精品2024| 国产精品美女久久久久久久 | 欧美日韩视频第一区| 日韩影院免费视频| 欧美成人女星排名| 国产不卡在线一区| 亚洲欧洲日产国码二区| 色婷婷久久久亚洲一区二区三区| 亚洲精品日日夜夜| 91精品国产一区二区三区| 精品一区二区综合| 久久久不卡网国产精品一区| eeuss鲁片一区二区三区在线观看| 国产精品高潮呻吟久久| 欧美亚洲综合网| 蓝色福利精品导航| 国产精品高潮呻吟久久| 欧美日韩国产一区二区三区地区| 日韩精品国产精品| 久久久www成人免费无遮挡大片| av中文一区二区三区| 亚洲国产精品久久一线不卡| 欧美zozo另类异族| 99在线热播精品免费| 日欧美一区二区| 国产嫩草影院久久久久| 欧美日韩一区二区三区在线| 精品一区二区三区影院在线午夜| 一区免费观看视频| 91麻豆精品国产自产在线| 国产91对白在线观看九色| 亚洲午夜精品久久久久久久久| 久久亚洲综合色一区二区三区| 一本色道久久综合精品竹菊| 日韩av在线免费观看不卡| 亚洲国产精品嫩草影院| 国产亚洲婷婷免费| 欧美做爰猛烈大尺度电影无法无天| 蜜桃一区二区三区在线观看| 亚洲欧洲精品天堂一级| 宅男噜噜噜66一区二区66| 国产91在线观看| 奇米777欧美一区二区| 亚洲少妇30p| 2014亚洲片线观看视频免费| 欧美亚洲动漫精品| 成人a区在线观看| 麻豆精品国产91久久久久久| 一区二区三区.www| 欧美激情一区不卡| 日韩精品一区二区三区蜜臀| 91美女片黄在线观看| 国产精品亚洲第一| 久久精品国产亚洲一区二区三区| 椎名由奈av一区二区三区| 久久久亚洲欧洲日产国码αv| 欧美精品欧美精品系列|