主题 : Tiny6410 WinCE按键驱动 复制链接 | 浏览器收藏 | 打印
级别: 骑士
UID: 9169
精华: 0
发帖: 249
金钱: 1330 两
威望: 299 点
贡献值: 0 点
综合积分: 498 分
注册时间: 2009-09-19
最后登录: 2017-08-14
楼主  发表于: 2011-06-16 22:42

 Tiny6410 WinCE按键驱动

请问为什么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);

    }
}