主题 : wince6.0  4*5矩阵键盘 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 16436
精华: 0
发帖: 21
金钱: 105 两
威望: 21 点
贡献值: 0 点
综合积分: 42 分
注册时间: 2010-03-17
最后登录: 2013-03-30
楼主  发表于: 2010-07-23 16:44

 wince6.0  4*5矩阵键盘

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;
}




级别: 新手上路
UID: 26144
精华: 0
发帖: 8
金钱: 40 两
威望: 8 点
贡献值: 0 点
综合积分: 16 分
注册时间: 2010-08-04
最后登录: 2011-03-06
1楼  发表于: 2010-08-14 23:38

 Re:wince6.0 4*5矩阵键盘

不错,受教了