📄 i2cdev-keyboard.cpp
字号:
// 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 + -