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

📄 i2cdev-keyboard.cpp

📁 s3c2410 wince 4.2 下 iic 的驱动原代码 三星提供的bsp里没有 iic的原代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			InterruptDone(SYSINTR_IIC);
			RETAILMSG(1,(TEXT("IIC:NO ACK!Trans Again!\r\n")));
			continue;
		}

		RETAILMSG(1,(TEXT("IIC:CMD_MST_ADDR Received!\r\n")));
		RETAILMSG(1,(TEXT("IIC:Transmite ARM Address!\r\n")));

		TRANS_DATA(pIICdev->pIICreg,OWN_ADD)
		IIC_RESUME(pIICdev->pIICreg)
		InterruptDone(SYSINTR_IIC);

		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:ARM Address Received!\r\n")));
		RETAILMSG(1,(TEXT("IIC:Transmite STOP!\r\n")));
		TRANS_STOP(pIICdev->pIICreg)
		InterruptDone(SYSINTR_IIC);
		break;
	}
//========================================使能PS2_0==============================
	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)

		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_CTRL!\r\n")));

		TRANS_DATA(pIICdev->pIICreg,CMD_CTRL)
		IIC_RESUME(pIICdev->pIICreg)
		InterruptDone(SYSINTR_IIC);

		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:CMD_CTRL  Received!\r\n")));
		RETAILMSG(1,(TEXT("IIC:Transmite CTRL_PS0En!\r\n")));

		TRANS_DATA(pIICdev->pIICreg,CTRL_PS0En)
		IIC_RESUME(pIICdev->pIICreg)
		InterruptDone(SYSINTR_IIC);

		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:CTRL_PS0En Received!\r\n")));
		RETAILMSG(1,(TEXT("IIC:Transmite STOP!\r\n")));
		
		TRANS_STOP(pIICdev->pIICreg)
		InterruptDone(SYSINTR_IIC);
		break;
	}

//===================================复位设备================================	
	TransferToPS2(0xff);
//=============================等待接受鼠标数据=============================
	WaitForPS2ACK(0xfa);
	WaitForPS2ACK(0xaa);
//	TransferToPS2(0xf0);
//	WaitForPS2ACK(0xfa);
//	TransferToPS2(0x01);
//	WaitForPS2ACK(0xfa);
	WaitForPS2ACK(0x00);
//===============================Remote模式===================================
//	TransferToPS2(0xf4);
//=============================等待接受鼠标数据=============================
//	WaitForPS2ACK(0xfa);
	RETAILMSG(1,(TEXT("IIC:IST Resumed!\r\n")));
	///////////////////////////释放寄存器///////////////////

	////////////////////////释放寄存器结束//////////////////
	
	/*************************设置寄存器结束***************************/

	ResumeThread(g_htIST);
	RETAILMSG(1,(TEXT("IIC:IST1 Returned!\r\n")));

return 0;
}

DWORD WINAPI IICEventHandler(LPVOID a)//
{
		RETAILMSG(1,(TEXT("IIC:Entered IST!\r\n")));
//		HWND hWindow;
//		int KeyTable[32]={
//			0,			0,			 VK_NUMLOCK, 0,		0,		VK_NUMPAD7,VK_NUMPAD4,VK_NUMPAD1,
//			0,			0,			 VK_DIVIDE,  0,		0,		VK_NUMPAD8,VK_NUMPAD5,VK_NUMPAD2,
//			VK_NUMPAD0, VK_SUBTRACT,VK_MULTIPLY, 0,		0,		VK_NUMPAD9,VK_NUMPAD6,VK_NUMPAD3,
//			VK_DECIMAL, 0,			 0,			 0,		0,		VK_ADD,	   0,		  VK_RETURN};
//		unsigned char iicstat;
		unsigned char iicdata;
		int i=0;
		BOOL TansStart=FALSE;
		RcvCount=0;
		DWORD rv;
		BYTE CurrStatus=UNKNOWNSTATUS;
		CONFIG_AS_SLAVE_RCV(pIICdev->pIICreg)
			while(1)
			{
				rv=WaitForSingleObject(g_hevInterrupt,INFINITE);
				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:Receive 	CMD_PS2_0!\r\n")));
					CurrStatus=DATARCV;
					IIC_RESUME(pIICdev->pIICreg)
					InterruptDone(SYSINTR_IIC);

				}
				////////////////////////////如果收到数据
				else if(CurrStatus==DATARCV)
				{
					RETAILMSG(1,(TEXT("IIC:IICDS To Be Send is %x\r\n"),iicdata));
					KeyboardPack[RcvCount]=iicdata;
					CurrStatus=UNKNOWNSTATUS;
					RcvCount++;
					DealRcvData();
					IIC_RESUME(pIICdev->pIICreg)
					InterruptDone(SYSINTR_IIC);
				}
				/////////////////////////////如果不知道收到了什么东西
				else
				{
					RETAILMSG(1,(TEXT("IIC:IICDS To Be Send is %x\r\n"),iicdata));
					RETAILMSG(1,(TEXT("IIC:UNKOWN Status!\r\n")));
					IIC_RESUME(pIICdev->pIICreg)
					InterruptDone(SYSINTR_IIC);
				}
				///////////////////////////////////////////////////////////
			}
		return 0;

}

DWORD   IIC_Init (DWORD dwContextv)
{



//	DWORD dwThreadID;
	pIICdev=&IICdev;
	RETAILMSG(1,(TEXT("IIC:Driver Init!\r\n")));
	////////////////Initialize Event/////////////////
	g_hevInterrupt = CreateEvent(NULL,FALSE,FALSE,NULL);//create event

	if(g_hevInterrupt==NULL)
	{
		RETAILMSG(1,(TEXT("Event creation failed!\r\n")));
		return 0;
	}

	//注册中断
	if(!InterruptInitialize(SYSINTR_IIC,g_hevInterrupt,NULL,0))
	{
		RETAILMSG(1,(TEXT("InterruptInitialize failed!\r\n")));
		return 0;
	}
	////////////////Initialize Event Over//////////////
	

/***************************设置寄存器*****************************/
	IICdev.pIICreg=(volatile IICreg *)IIC_BASE;	
	//恢复IST
	return 1;
}


/////////////////////////////////////////////////////////////////////////////////
DWORD IIC_Open(HANDLE hDeviceContext,
			   DWORD AccessCode,
			   DWORD ShareMode)
{
	////////////////Initialize Thread/////////////////
	g_htIST= CreateThread(NULL,
						  0,
						  IICEventHandler,
						  0,
						  CREATE_SUSPENDED,
						  0);
	RETAILMSG(1,(TEXT("IIC:IST Created!\r\n")));

	//设置优先级
	if(!CeSetThreadPriority(g_htIST,251))
	{
		RETAILMSG(1,(TEXT("IIC_INIT: Failed setting Thread Priority.\r\n")));
		return 1;
	}
	g_htIST1= CreateThread(NULL,
						  0,
						  IICEventInit,
						  0,
						  CREATE_SUSPENDED,
						  0);
	//设置优先级
	if(!CeSetThreadPriority(g_htIST1,251))
	{
		RETAILMSG(1,(TEXT("IIC_INIT: Failed setting Thread Priority.\r\n")));
		return 1;
	}

	if(ResumeThread(g_htIST1)==0xFFFFFFFF) 	
		RETAILMSG(1,(TEXT("IIC:Resume IST1 Failed!!\r\n")));
	else
		RETAILMSG(1,(TEXT("IIC:IST1 Resumed!!\r\n")));

	return(1);
}

BOOL IIC_Close(DWORD hOpenContext)
{
	return TRUE;
}


DWORD IIC_Deinit(DWORD dwDeviceContext)
{
	return FALSE;
}


BOOL IIC_IOControl(DWORD hOpenContext,
					DWORD dwCode,
					PBYTE pBufIn,
					DWORD dwLenIn,
					PBYTE pBufOut,
					DWORD dwLenOut,
					PDWORD pdwActualOut)
{
	return(TRUE);
}

////////////OK
DWORD IIC_Read(DWORD hOpenContext,
			   LPVOID pBuffer,
			   DWORD Count)
{
	return 0;
}

///////////OK
DWORD IIC_Write(DWORD hOpenContext,
				LPCVOID pSourceBytes,
				DWORD NumberOfBytes)
{
return 0;
}

/////////OK
DWORD IIC_Seek(DWORD hOpenContext,
			   long Amount,
			   DWORD Type)
{
	return FALSE;
}

⌨️ 快捷键说明

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