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

📄 i2cdev-keyboard.cpp

📁 s3c2410 wince 4.2 下 iic 的驱动原代码 三星提供的bsp里没有 iic的原代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// IIC.cpp : Defines the entry point for the DLL application.
//

#include <windows.h>
#include <tchar.h>
#include <nkintr.h>
#include <string.h>
#include "D:\WINCE420\PUBLIC\COMMON\OAK\INC\pkfuncs.h"
#include "D:\WINCE420\PLATFORM\UT2410X\INC\s2410.h"
#include "D:\WINCE420\PLATFORM\UT2410X\INC\oalintr.h"
#include "iicmacro.h"
#include "mega8i2c.h"

#define ADDMATCH 1
#define DATARCV 2
#define DATARCV_OK 3
#define UNKNOWNSTATUS 0

HANDLE g_hevInterrupt;
HANDLE g_htIST,g_htIST1;
typedef struct{
	volatile IICreg *pIICreg;
}IICKBD_DEV;
IICKBD_DEV IICdev;
IICKBD_DEV *pIICdev;
BYTE KeyboardPack[8];
int RcvCount;
BYTE NumLock=0;
BYTE ScrollLock=0;
BYTE CapsLock=0;


void DealRcvData(void)
{
	DWORD KeyStatus=KEYEVENTF_KEYUP;
	UINT keydata=0;
	UINT Virkey=0;
	if(KeyboardPack[0]==0xe1)
	{
		if(RcvCount<8)
			return;
		keydata=0;
		Virkey=0x13;
		RETAILMSG(1,(TEXT("IIC:PAUSE Received!\r\n")));
		RcvCount=0;
	}
	else if(KeyboardPack[0]==0xe0)
	{
		if(RcvCount<2)
			return;
		keydata=KeyboardPack[1];
		if(keydata==0x12)
		{
			if(RcvCount<4)
				return;
			keydata=0;
			RETAILMSG(1,(TEXT("IIC:PrintScreen Down Received!\r\n")));
			RcvCount=0;
			Virkey=VK_SNAPSHOT;
		}
		else if(keydata==0xf0)
		{
			if(RcvCount<3)
				return;
			keydata=KeyboardPack[2];
			if(keydata==0x7c)
			{
				if(RcvCount<6)
					return;
				keydata=0;
				RETAILMSG(1,(TEXT("IIC:PrintScreen Up Received!\r\n")));
				RcvCount=0;
				Virkey=VK_SNAPSHOT;
			}
			else
			{
				RETAILMSG(1,(TEXT("IIC:Special Function Key Up Received!\r\n")));
				RcvCount=0;
			}
		}
		else
		{
			RETAILMSG(1,(TEXT("IIC:Special Function Key Down Received!\r\n")));
			KeyStatus=0;
			RcvCount=0;
		}
		if(keydata!=0) keydata+=(0xe0<<8);
	}
	else if(KeyboardPack[0]==0xf0)
	{
		if(RcvCount<2)
			return;
		RETAILMSG(1,(TEXT("IIC:Only Key Up Received!\r\n")));
		keydata=KeyboardPack[1];
		RcvCount=0;
	}
	else
	{
		RETAILMSG(1,(TEXT("IIC:Only Key Down Received!\r\n")));
		keydata=KeyboardPack[0];
		KeyStatus=0;
		RcvCount=0;
	}
	if(keydata!=0)
	{
		Virkey=MapVirtualKey(keydata,1);
		if(Virkey==0)
		{
			RETAILMSG(1,(TEXT("IIC:Can't Map Scan Code to VirtualKey Code!\r\n")));
			return;
		}
	}
	RETAILMSG(1,(TEXT("IIC:Key Code Received is: %x !\r\n"),keydata));
	keybd_event(Virkey,keydata,KeyStatus,0);

}
DWORD TransferToPS2(BYTE Data)
{
	DWORD rv;
	while(1)
	{
		Sleep(1000);
		//RETAILMSG(1,(TEXT("IIC:About To Transmite START & Mega8 Address!\r\n")));
		TRANS_DATA(pIICdev->pIICreg,(0x60<<1))	
		TRANS_START(pIICdev->pIICreg)
		rv=WaitForSingleObject(g_hevInterrupt,1000);
		if((pIICdev->pIICreg->rIICSTAT&1)||(TRANS_FAIL( pIICdev->pIICreg))||(rv!=WAIT_OBJECT_0))
		{
			TRANS_STOP(pIICdev->pIICreg)
				IIC_RESUME(pIICdev->pIICreg)
				InterruptDone(SYSINTR_IIC);

			//RETAILMSG(1,(TEXT("IIC:NO ACK!Trans Again!\r\n")));
			continue;
		}
		//RETAILMSG(1,(TEXT("IIC:START  Received!\r\n")));
		//RETAILMSG(1,(TEXT("IIC:Transmite CMD_PS2_0!\r\n")));
		TRANS_DATA(pIICdev->pIICreg,CMD_PS2_0)
		IIC_RESUME(pIICdev->pIICreg)
		InterruptDone(SYSINTR_IIC);
		rv=WaitForSingleObject(g_hevInterrupt,1000);
		if((pIICdev->pIICreg->rIICSTAT&1)||(TRANS_FAIL( pIICdev->pIICreg))||(rv!=WAIT_OBJECT_0))
		{
			TRANS_STOP(pIICdev->pIICreg)
			InterruptDone(SYSINTR_IIC);
			//RETAILMSG(1,(TEXT("IIC:NO ACK!Trans Again!\r\n")));
			continue;
		}
		//RETAILMSG(1,(TEXT("IIC:CMD_PS2_0 Received!\r\n")));
		//RETAILMSG(1,(TEXT("IIC:Transmite %x!\r\n"),Data));
		TRANS_DATA(pIICdev->pIICreg,Data)
		IIC_RESUME(pIICdev->pIICreg)
		InterruptDone(SYSINTR_IIC);
		rv=WaitForSingleObject(g_hevInterrupt,1000);
		if((pIICdev->pIICreg->rIICSTAT&1)||(TRANS_FAIL( pIICdev->pIICreg))||(rv!=WAIT_OBJECT_0))
		{
			TRANS_STOP(pIICdev->pIICreg)
			InterruptDone(SYSINTR_IIC);
			//RETAILMSG(1,(TEXT("IIC:NO ACK!Trans Again!\r\n")));
			continue;
		}

		//RETAILMSG(1,(TEXT("IIC:%x Received!\r\n"),Data));
		//RETAILMSG(1,(TEXT("IIC:Transmite STOP!\r\n")));
		
		TRANS_STOP(pIICdev->pIICreg)
		InterruptDone(SYSINTR_IIC);
		break;
	}
	return 0;
}
DWORD WaitForPS2ACK(BYTE Data)
{
	DWORD rv;
	BYTE iicdata;
	BYTE CurrStatus=UNKNOWNSTATUS;
	CONFIG_AS_SLAVE_RCV(pIICdev->pIICreg)
	while(1)
	{
		rv=WaitForSingleObject(g_hevInterrupt,1000);
		if(rv!=WAIT_OBJECT_0) 
		{
			//RETAILMSG(1,(TEXT("IIC:Wait For Ack TimeOut!\r\n")));
			break;
		}
		RCV_DATA(iicdata,pIICdev->pIICreg)
		/////////////////////////////如果地址匹配
		if(RCV_START(pIICdev->pIICreg))
		{
			//RETAILMSG(1,(TEXT("IIC:Address Match!\r\n")));
			CurrStatus=ADDMATCH;
			IIC_RESUME(pIICdev->pIICreg)
			InterruptDone(SYSINTR_IIC);
		}
		/////////////////////////////如果接收到数据
		else if((iicdata==CMD_PS2_0)&&( CurrStatus==ADDMATCH))
		{
			//RETAILMSG(1,(TEXT("IIC:Received	CMD_PS2_0!\r\n")));
			CurrStatus=DATARCV;
			IIC_RESUME(pIICdev->pIICreg)
			InterruptDone(SYSINTR_IIC);

		}
		else if((CurrStatus==DATARCV)&&(iicdata==Data))
		{
			//RETAILMSG(1,(TEXT("IIC:IICDS Sent is %x\r\n"),iicdata));
			CurrStatus=DATARCV_OK;
			IIC_RESUME(pIICdev->pIICreg)
			InterruptDone(SYSINTR_IIC);
			break;
		}
		else
		{
			//RETAILMSG(1,(TEXT("IIC:IICDS Sent is %x\r\n"),iicdata));
			//RETAILMSG(1,(TEXT("IIC:UNKOWN Status!\r\n")));
			CurrStatus=UNKNOWNSTATUS;
			IIC_RESUME(pIICdev->pIICreg)
			InterruptDone(SYSINTR_IIC);
			break;;
		}
		///////////////////////////////////////////////////////////
	}
	if(CurrStatus==DATARCV_OK)
		return 0;
	return 1;
}

	

//necessary entry in every DLL file
BOOL WINAPI DllEntryPoint ( HANDLE hinstDLL, 
							DWORD  dwReason, 
							LPVOID lpvReserved)
{	
	switch (dwReason)
	{
		case DLL_PROCESS_ATTACH:
			RETAILMSG(1,(TEXT("IIC:DLL_PROCESS_ATTACH\t\n")));
			return TRUE;
		case DLL_THREAD_ATTACH:
			RETAILMSG(1,(TEXT("IIC:DLL_THREAD_ATTACH\t\n")));
			break;
		case DLL_THREAD_DETACH:
			RETAILMSG(1,(TEXT("IIC:DLL_THREAD_DETACH\t\n")));
			break;
		case DLL_PROCESS_DETACH:
			RETAILMSG(1,(TEXT("IIC:DLL_PROCESS_DETACH\t\n")));
			break;
	#ifdef UNDER_CE
		case DLL_PROCESS_EXITING:
			RETAILMSG(1,(TEXT("IIC:DLL_PROCESS_EXITING\t\n")));
			break;
		case DLL_SYSTEM_STARTED:
			RETAILMSG(1,(TEXT("IIC:DLL_SYSTEM_STARTED\t\n")));
			break;
	#endif
		default:
			break;
	}
    return TRUE;
}
DWORD WINAPI IICEventInit(LPVOID a)//
{
//	BYTE iicdata;
//	DWORD rv;
	RETAILMSG(1,(TEXT("IIC:Entered IST1 !\r\n")));

	///////////////////////////独占寄存器///////////////////

	/////////////////////////独占寄存器结束/////////////////
	CONFIG_IICCON(pIICdev->pIICreg)
	CONFIG_IICADD(pIICdev->pIICreg)
	//CONFIG_AS_MASTER_TRANS(pIICdev->pIICreg)
//=============================发送本机地址===================================
	while(1)
	{
		RETAILMSG(1,(TEXT("IIC:About To Transmite START & Mega8 Address!\r\n")));

		TRANS_DATA(pIICdev->pIICreg,(0x60<<1))	
		TRANS_START(pIICdev->pIICreg)

		WaitForSingleObject(g_hevInterrupt,INFINITE);
		if((pIICdev->pIICreg->rIICSTAT&1)||(TRANS_FAIL( pIICdev->pIICreg)))
		{
			TRANS_STOP(pIICdev->pIICreg)
			InterruptDone(SYSINTR_IIC);
			RETAILMSG(1,(TEXT("IIC:NO ACK!Trans Again!\r\n")));
			continue;
		}

		RETAILMSG(1,(TEXT("IIC:START  Received!\r\n")));
		RETAILMSG(1,(TEXT("IIC:Transmite CMD_MST_ADDR!\r\n")));
		
		TRANS_DATA(pIICdev->pIICreg,CMD_MST_ADDR)
		IIC_RESUME(pIICdev->pIICreg)
		InterruptDone(SYSINTR_IIC);

		WaitForSingleObject(g_hevInterrupt,INFINITE);
		if((pIICdev->pIICreg->rIICSTAT&1)||(TRANS_FAIL( pIICdev->pIICreg)))
		{
			TRANS_STOP(pIICdev->pIICreg)

⌨️ 快捷键说明

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