這些程式基于TQ2440平台,主要是實作鍵盤按鍵的運作,友善起見,隻實作了上下左右四個按鍵。該部分硬體結構圖如下;

從硬體圖可以看出,按鍵連接配接EINT1、EINT2、EINT4和EINT0四個中斷引腳。在WindowsCE中,我們隻需要處理好這四個中斷即可,如下詳細介紹;
v_pIOPregs->GPFCON &= ~(0x3 << 0); /* Set EINT0(GPF0) as EINT0 */
v_pIOPregs->GPFCON |= (0x2 << 0);
v_pIOPregs->EXTINT0 &= ~(0x7 << 0); /* Configure EINT0 as Falling Edge Mode */
v_pIOPregs->EXTINT0 |= (0x2 << 0);
v_pIOPregs->GPFCON &= ~(0x3 << 2); /* Set EINT1(GPF0) as EINT1 */
v_pIOPregs->GPFCON |= (0x2 << 2);
v_pIOPregs->EXTINT0 &= ~(0x7 << 4); /* Configure EINT1 as Falling Edge Mode */
v_pIOPregs->EXTINT0 |= (0x2 << 4);
v_pIOPregs->GPFCON &= ~(0x3 << 4); /* Set EINT2(GPF2) as EINT */
v_pIOPregs->GPFCON |= (0x2 << 4);
v_pIOPregs->EXTINT0 &= ~(0x7 << 8); /* Configure EINT2 as Falling Edge Mode */
v_pIOPregs->EXTINT0 |= (0x2 << 8);
v_pIOPregs->GPFCON &= ~(0x3 << 8); /* Set EINT0(GPF4) as EINT4 */
v_pIOPregs->GPFCON |= (0x2 << 8);
v_pIOPregs->EXTINT0 &= ~(0x7 << 16); /* Configure EINT4 as Falling Edge Mod */
v_pIOPregs->EXTINT0 |= (0x2 << 16);
配置好之後,進行中斷處理線程,如下代碼;
IntEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
if (!IntEvent)
{
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to create event./r/n")));
return FALSE;
}
IRQ = 1; //IRQ_EINT1;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[0], sizeof(UINT32), NULL))
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value./r/n")));
IRQ = 32; //IRQ_EINT4;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[1], sizeof(UINT32), NULL))
IRQ = 2; //IRQ_EINT2;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[2], sizeof(UINT32), NULL))
IRQ = 0; //IRQ_EINT0;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[3], sizeof(UINT32), NULL))
if (!InterruptInitialize(g_KeySysIntr[0], IntEvent, NULL, 0))
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event/r/n")));
if (!InterruptInitialize(g_KeySysIntr[1], IntEvent, NULL, 0))
if (!InterruptInitialize(g_KeySysIntr[2], IntEvent, NULL, 0))
if (!InterruptInitialize(g_KeySysIntr[3], IntEvent, NULL, 0))
while(1)
WaitForSingleObject(IntEvent, INFINITE);
RETAILMSG(0,(L"INTMASK=%X, EINTMASK=%X, GPGCON=%X/r/n", v_pINTRregs->INTMSK, v_pIOPregs->EINTMASK, v_pIOPregs->GPFCON));
//EINT1 - K1 - VK_UP - 0x26
if(v_pINTRregs->INTMSK & (1< {
RETAILMSG(1,(TEXT("[Key1 - UP]/r/n")));
keybd_event(VK_UP ,0x26, 0, 0);
Sleep(30);
keybd_event(VK_UP ,0x26, KEYEVENTF_KEYUP, 0);
InterruptDone(g_KeySysIntr[0]);
}
//EINT4 - K2 - VK_DOWN - 0x28
if(v_pIOPregs->EINTMASK & (1< {
RETAILMSG(1,(TEXT("[Key2 - DOWN]/r/n")));
keybd_event(VK_DOWN ,0x28, 0, 0);
keybd_event(VK_DOWN ,0x28, KEYEVENTF_KEYUP, 0);
InterruptDone(g_KeySysIntr[1]);
//EINT2 - K3 - VK_LEFT - 0x25
RETAILMSG(1,(TEXT("[K3 - LEFT]/r/n")));
keybd_event(VK_LEFT ,0x25, 0, 0);
keybd_event(VK_LEFT ,0x25, KEYEVENTF_KEYUP, 0);
InterruptDone(g_KeySysIntr[2]);
//EINT0 - K4 - VK_RIGHT - 0x27
RETAILMSG(1,(TEXT("[K4 - RIGHT]/r/n")));
keybd_event(VK_RIGHT ,0x27, 0, 0);
keybd_event(VK_RIGHT ,0x27, KEYEVENTF_KEYUP, 0);
InterruptDone(g_KeySysIntr[3]);