Windows CE S3C2440A下按鍵驅動程式編碼分析

來源:互聯網
上載者:User

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

   

     從硬體圖可以看出,按鍵串連EINT1、EINT2、EINT4和EINT0四個中斷引腳。在WindowsCE中,我們只需要處理好這四個中斷即可,如下詳細介紹;

    從這幅圖中可以看出,EINT0~4的是由GPF0~4控制的,因此在驅動之前需要先配置這四個GPIO口,使其下降延觸發,如下代碼;

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")));
        return FALSE;
    }

    IRQ = 32; //IRQ_EINT4;
    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 = 2; //IRQ_EINT2;
    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 = 0; //IRQ_EINT0;
    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;
    }

    if (!InterruptInitialize(g_KeySysIntr[0], IntEvent, NULL, 0))
    {
        RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event/r/n")));
        return FALSE;
    }
    if (!InterruptInitialize(g_KeySysIntr[1], IntEvent, NULL, 0))
    {
        RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event/r/n")));
        return FALSE;
    }
    if (!InterruptInitialize(g_KeySysIntr[2], IntEvent, NULL, 0))
    {
        RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event/r/n")));
        return FALSE;
    }
    if (!InterruptInitialize(g_KeySysIntr[3], IntEvent, NULL, 0))
    {
        RETAILMSG(1,(TEXT("Fail to initialize userkey interrupt event/r/n")));
        return FALSE;
    }

    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);
            Sleep(30);
            keybd_event(VK_DOWN ,0x28, KEYEVENTF_KEYUP, 0);
            InterruptDone(g_KeySysIntr[1]);
        }

        //EINT2 - K3 - VK_LEFT - 0x25
        if(v_pINTRregs->INTMSK & (1<        {
            RETAILMSG(1,(TEXT("[K3 - LEFT]/r/n")));
            keybd_event(VK_LEFT ,0x25, 0, 0);
            Sleep(30);
            keybd_event(VK_LEFT ,0x25, KEYEVENTF_KEYUP, 0);
            InterruptDone(g_KeySysIntr[2]);
        }
        //EINT0 - K4 - VK_RIGHT - 0x27
        if(v_pINTRregs->INTMSK & (1<        {
            RETAILMSG(1,(TEXT("[K4 - RIGHT]/r/n")));
            keybd_event(VK_RIGHT ,0x27, 0, 0);
            Sleep(30);
            keybd_event(VK_RIGHT ,0x27, KEYEVENTF_KEYUP, 0);
            InterruptDone(g_KeySysIntr[3]);
        }
    }

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.