请问为什么Tiny6410下的WinCE按键驱动不像mini2440下的按键驱动一样,采用中断呢?请问有没有什么好的办法修改为中断模式呢?
mini2440下的按键驱动如下:
DWORD UserKeyProcessThread(void)
{
UINT32 IRQ;
HANDLE UserInputEvent = CreateEvent(NULL, FALSE, FALSE, szevtUserInput);
IRQ = 36; //IRQ_EINT8;
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")));
return FALSE;
}
IRQ = 39; //IRQ_EINT11;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[1], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}
IRQ = 41; //IRQ_EINT13;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[2], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}
IRQ = 42; //IRQ_EINT14;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[3], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}
IRQ = 43; //IRQ_EINT15;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[4], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}
IRQ = 47; //IRQ_EINT19;
if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &IRQ, sizeof(UINT32), &g_KeySysIntr[5], sizeof(UINT32), NULL)) {
RETAILMSG(1, (TEXT("ERROR: kEYBD: Failed to request sysintr value.\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[0], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[1], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[2], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[3], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[4], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
if (!InterruptInitialize(g_KeySysIntr[5], KeyEvent, NULL, 0)) {
RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event\r\n")));
return FALSE;
}
while(1)
{
WaitForSingleObject(KeyEvent, INFINITE);
SetEvent(UserInputEvent);
SetEvent(APIEvent);
RETAILMSG(0,(L"EINTMASK=%X, rGPGCON=%X rGPGDAT=%X\r\n", s2440IOP->rEINTMASK, s2440IOP->rGPGCON, s2440IOP->rGPGDAT));
const char Index[] = { 0, 3, 5, 6, 7, 11, };
for (int i = 0; i < 6; i++) {
int bit_index = Index;
bool down = !(s2440IOP->rGPGDAT & (1 << bit_index));
KeyValues = down;
RETAILMSG(1, (L"%s", down ? L"1" : L"0"));
}
RETAILMSG(1, (L"\r\n"));
//EINT8 - K1
if(s2440IOP->rEINTMASK & (DWORD)(0x1<<8))
{
InterruptDone(g_KeySysIntr[0]);
}
}
}
Tiny6410下的WinCE按键驱动:
static DWORD UserKeyProcessThread(void)
{
UINT32 IRQ;
HANDLE UserInputEvent = CreateEvent(NULL, FALSE, FALSE, szevtUserInput);
while(1)
{
Sleep(80);
BYTE Keys[KEY_COUNT];
bool Changed = false;
GetKeyValues(Keys);
for (int i = 0; i < KEY_COUNT; i++) {
if (Keys != KeyValues) {
KeyValues = Keys;
Changed = true;
}
}
if (!Changed) {
continue;
}
//WaitForSingleObject(KeyEvent, INFINITE);
SetEvent(UserInputEvent);
SetEvent(APIEvent);
}
}