4*5的矩阵键盘,就在友善之比wince6.0 的usekey修改而来,已测试通过
喜欢的可以看看,有疑问的请回个帖
#include <windows.h>
//#include <ceddk.h>
#include <nkintr.h>
//#include <oalintr.h>
#include <pm.h>
#include "pmplatform.h"
#include "Pkfuncs.h"
#include "s2440.h"
volatile IOPreg *s2440IOP = (IOPreg *)IOP_BASE;
volatile INTreg *s2440INT = (INTreg *)INT_BASE;
UINT32 g_KeySysIntr[6];
HANDLE KeyThread;
HANDLE KeyEvent;
BYTE Virtualkey;
void Virtual_Alloc(); // Virtual allocation
DWORD UserKeyProcessThread(void);
const TCHAR szevtUserInput[] = L"FriendlyARM/ButtonEvent";
static void EINT_2_INPUT()
{
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0)) | (0x0 << 0); // GPG0 == EINT8
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 6)) | (0x0 << 6); // GPG3 == EINT11
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 10)) | (0x0 << 10); // GPG5 == EINT13
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 12)) | (0x0 << 12); // GPG6 == EINT14
}
static void INPUT_2_EINT()
{
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x0)) | (0x2 << 0x0); // GPG0 == EINT8
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 0)) | (0x6 << 0);
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 6)) | (0x2 << 6); // GPG3 == EINT11
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 12)) | (0x6 << 12);
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 10)) | (0x2 << 10); // GPG5 == EINT13
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 20)) | (0x6 << 20);
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 12)) | (0x2 << 12); // GPG6 == EINT14
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 24)) | (0x6 << 24);
}
DWORD UserKeyProcessThread(void)
{
HANDLE UserInputEvent = CreateEvent(NULL, FALSE, FALSE, szevtUserInput);
UINT32 IRQ[4]={36,39,41,42};//IRQ_EINT8;IRQ_EINT11;IRQ_EINT13;IRQ_EINT14
static int count=0;
for(int i=0;i<4;i++)
{
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr, sizeof(UINT32), NULL))
{
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr, KeyEvent, NULL, 0))
{
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
}
while(1)
{
WaitForSingleObject(KeyEvent, INFINITE);
SetEvent(UserInputEvent);
RETAILMSG(0,(L"EINTMASK=%X, rGPGCON=%X rGPGDAT=%X\r\n", s2440IOP->rEINTMASK, s2440IOP->rGPGCON, s2440IOP->rGPGDAT));
EINT_2_INPUT();
UINT32 Eint[4]={0x1<<8,0x1<<11,0x1<<13,0x1<<14};
UINT32 Index_Get_Data[4] ={0x1<<0, 0x1<<3, 0x1<<5, 0x1<<6};
UINT32 Output_data[5] ={0x1<<0, 0x1<<1, 0x1<<2, 0x1<<3, 0x1<<4};
//EINT8 - K1
for(int row=0;row<4;row++)
{
if(s2440IOP->rEINTMASK & Eint[row])
{
Sleep(3);
if(s2440IOP->rGPGDAT & Index_Get_Data[row])
{
keybd_event(Virtualkey,0, KEYEVENTF_EXTENDEDKEY|KEYEVENTF_KEYUP, 0);
}
else
{
s2440IOP->rGPFDAT |= (((0x1<<0)|(0x1<<1)|(0x1<<2)|(0x1<<3)|(0x1<<4)));
for(int array=0;array<5;array++)
{
s2440IOP->rGPFDAT &= (~ Output_data[array]);
Sleep(3);
while(!(s2440IOP->rGPGDAT & Index_Get_Data[row]))
{
Sleep(10);
if(count==0)
{
Virtualkey=0x41+5*row+array;
keybd_event(Virtualkey,0, KEYEVENTF_EXTENDEDKEY|0, 0);
count++;
}
}
count=0;
s2440IOP->rGPFDAT |= Output_data[array];
}
s2440IOP->rGPFDAT &= (~((0x1<<0)|(0x1<<1)|(0x1<<2)|(0x1<<3)|(0x1<<4)));
}
InterruptDone(g_KeySysIntr[row]);
}
}
INPUT_2_EINT();
}
}
void Virtual_Alloc()
{
// GPIO Virtual alloc
s2440IOP = (volatile IOPreg *) VirtualAlloc(0,sizeof(IOPreg),MEM_RESERVE, PAGE_NOACCESS);
if(s2440IOP == NULL) {
RETAILMSG(1,(TEXT("For s2440IOP: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2440IOP,(PVOID)(IOP_BASE),sizeof(IOPreg),PAGE_READWRITE | PAGE_NOCACHE )) {
RETAILMSG(1,(TEXT("For s2440IOP: VirtualCopy failed!\r\n")));
}
}
// Interrupt Virtual alloc
s2440INT = (volatile INTreg *) VirtualAlloc(0,sizeof(INTreg),MEM_RESERVE, PAGE_NOACCESS);
if(s2440INT == NULL) {
RETAILMSG(1,(TEXT("For s2440INT: VirtualAlloc failed!\r\n")));
}
else {
if(!VirtualCopy((PVOID)s2440INT,(PVOID)(INT_BASE),sizeof(INTreg),PAGE_READWRITE | PAGE_NOCACHE )) {
RETAILMSG(1,(TEXT("For s2440INT: VirtualCopy failed!\r\n")));
}
}
}
BOOL WINAPI
DllEntry(HANDLE hinstDLL,
DWORD dwReason,
LPVOID Reserved/* lpvReserved */)
{
switch(dwReason)
{
case DLL_PROCESS_ATTACH:
DEBUGREGISTER((HINSTANCE)hinstDLL);
return TRUE;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
#ifdef UNDER_CE
case DLL_PROCESS_EXITING:
break;
case DLL_SYSTEM_STARTED:
break;
#endif
}
return TRUE;
}
BOOL KEY_Deinit(DWORD hDeviceContext)
{
BOOL bRet = TRUE;
RETAILMSG(1,(TEXT("USERKEY: KEY_Deinit\r\n")));
for (int i=0; i<6; i++)
InterruptDisable(g_KeySysIntr);
CloseHandle(KeyThread);
CloseHandle(KeyEvent);
VirtualFree((void*)s2440IOP, sizeof(IOPreg), MEM_RELEASE);
VirtualFree((void*)s2440INT, sizeof(INTreg), MEM_RELEASE);
return TRUE;
}
BOOL KeyGpioInit()
{
RETAILMSG(1,(TEXT("Key_Gpio_Setting----\r\n")));
//s2440IOP->rGPGUP = 0xffff;
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 0x0)) | (0x2 << 0x0); // GPG0 == EINT8
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 0)) | (0x6 << 0);
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 6)) | (0x2 << 6); // GPG3 == EINT11
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 12)) | (0x6 << 12);
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 10)) | (0x2 << 10); // GPG5 == EINT13
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 20)) | (0x6 << 20);
s2440IOP->rGPGCON = (s2440IOP->rGPGCON & ~(0x3 << 12)) | (0x2 << 12); // GPG6 == EINT14
s2440IOP->rEXTINT1 = (s2440IOP->rEXTINT1 & ~(0x7<< 24)) | (0x6 << 24);
s2440IOP->rGPFCON = (s2440IOP->rGPFCON & ~(0x3 << 0)) | (0x1 << 0); //F0--F4
s2440IOP->rGPFCON = (s2440IOP->rGPFCON & ~(0x3 << 2)) | (0x1 << 2);
s2440IOP->rGPFCON = (s2440IOP->rGPFCON & ~(0x3 << 4)) | (0x1 << 4);
s2440IOP->rGPFCON = (s2440IOP->rGPFCON & ~(0x3 << 6)) | (0x1 << 6);
s2440IOP->rGPFCON = (s2440IOP->rGPFCON & ~(0x3 << 8)) | (0x1 << 8);
s2440IOP->rGPFDAT &= (~((0x1<<0)|(0x1<<1)|(0x1<<2)|(0x1<<3)|(0x1<<4)));
return TRUE;
}
DWORD KEY_Init(DWORD dwContext)
{
DWORD threadID; // thread ID
RETAILMSG(1,(TEXT("KEY_Init----\r\n")));
// 1. Virtual Alloc
Virtual_Alloc();
KeyGpioInit();
KeyEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!KeyEvent) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to create event.\r\n")));
return FALSE;
}
KeyThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)UserKeyProcessThread, 0, 0, &threadID);
if (NULL == KeyThread ) {
RETAILMSG(1,(TEXT("ERROR: failed to Create Key Thread!\r\n")));
return FALSE;
}
return TRUE;
}
//-----------------------------------------------------------------------------
DWORD KEY_Open(DWORD hDeviceContext, DWORD AccessCode, DWORD ShareMode)
{
return 0;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
BOOL KEY_Close(DWORD hOpenContext)
{
RETAILMSG(1,(TEXT("USERKEY: KEY_Close\r\n")));
return TRUE;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void KEY_PowerDown(DWORD hDeviceContext)
{
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
void KEY_PowerUp(DWORD hDeviceContext)
{
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Read(DWORD hOpenContext, LPVOID pBuffer, DWORD Count)
{
return 0;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Seek(DWORD hOpenContext, long Amount, DWORD Type)
{
return 0;
}
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
DWORD KEY_Write(DWORD hOpenContext, LPCVOID pSourceBytes, DWORD NumberOfBytes)
{
return 0;
}