Windows CE S3C2440A下按键驱动程序编码分析

    这些程序基于TQ2440平台,主要是实现键盘按键的运作,方便起见,只实现了上下左右四个按键。该部分硬件结构图如下;

    image

     从硬件图可以看出,按键连接EINT1、EINT2、EINT4和EINT0四个中断引脚。在WindowsCE中,我们只需要处理好这四个中断即可,如下详细介绍;

image    从这幅图中可以看出,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]);
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
s3c2440是一款由三星公司开发的嵌入式处理器,广泛应用于嵌入式系统和开发板中。以下是s3c2440开发板的一些主要功能和特点: 1. 处理器:s3c2440采用ARM920T核心,工作频率可达到400MHz。它具有较高的计算性能和低功耗特性,适合嵌入式应用。 2. 存储器:s3c2440开发板通常具有内置的Flash存储器和SDRAM,用于存储操作系统、应用程序和数据。Flash存储器可用于存储启动加载程序和操作系统映像。 3. 外设口:s3c2440开发板提供了多种外设口,以支持各种外部设备的连和扩展。这些口包括UART(串口)、USB、SPI、I2C、GPIO等,可用于连显示器、键盘、鼠标、传感器等外部设备。 4. 显示控制器:s3c2440具有强大的显示控制功能,支持LCD显示屏的驱动。它可以输出彩色图像和视频,适用于嵌入式显示应用。 5. 多媒体支持:s3c2440内置了音频编解码器和摄像头口,可用于实现音频播放、录制和视频捕捉功能。 6. 网络连:s3c2440开发板通常具有以太网口,可用于实现网络连和数据传输。 7. 操作系统支持:s3c2440开发板可以运行各种操作系统,如Linux、Windows CE等。这使得开发者可以使用标准的开发工具和软件库进行应用程序开发。 请注意,s3c2440开发板的具体功能和特点可能因不同的厂商和型号而有所差异。建议您参考所使用的具体开发板的官方文档以获取更详细的信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值