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