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

    这些程序基于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]);
        }
    }

时间: 2024-08-02 00:11:27

Windows CE S3C2440A下按键驱动程序编码分析的相关文章

Windows CE S3C2440A开机启动滚动条编码分析

    和Windows XP一样,Windows CE任然可以绘制美妙的进度条,其实这个操作过程主要是对屏幕缓存进行操作.在S3C2440 CPU BSP代码中已经给出了这段缓冲的地址即IMAGE_FRAMEBUFFER_UA_BASE_eboot,这段缓冲支持的视频编码格式是RGB16,默认颜色为白色,在这个过程当中,并不像EVC一样提供了很多GDI绘图的函数,如绘制线条.矩形等,所有的操作都是从点开始的,由点绘制成线,由线绘制成矩形.可以发现,整个缓冲可以定义为一个二唯数据,每一个元素就是

Windows CE环境下无线网卡的自动安装

摘要:讨论了Windows CE环境下无线网卡的安装,并提出了一种在系统断电重启时自动安装无线网卡的解决方案.对Windows CE的系统定制.应用程序的开发及系统封装进行了介绍. 关键词:嵌入式系统 Windows CE 无线网卡 设备驱动 Windows CE是为多种嵌入式系统和产品而设计的紧凑.高效.可升级的操作系统,并特别为有限的硬件资源设计了多线程.多任务和完全优先的操作系统环境.在无线通信领域有很大的应用前景. 本文重点讨论了Windows CE环境下无线网卡的安装,并提出了一种在系

Windows CE S3C2440A显示驱动编码分析

在Windows CE下显示驱动是一个比较复杂的驱动,不仅仅设计到硬件的操作,还有上层驱动的GDI接口支持,有时候还需要支持DirectDraw等绘图接口.如果所有的编码工作都重新做一遍的话,难度还是挺大的,庆幸的是微软已经把大部分的接口都提供好了,DDI中包含的20个接口函数(以函数指针的方式表示),需要我们实现的也仅仅只有GPEEnableDriver.闲话不多说,我们先来看看S3C2440A_LCD_REG结构体吧,如下所示: typedef struct {     UINT32 LCD

Windows CE嵌入式导航系统研究(内核相关)

1.1 嵌入式车载导航系统的软件设计流程 嵌入式车载系统软件主要包括系统内核.驱动程序.应用程序三部分.设计的过程当中,我们采用瀑布模型进行设计,首先制定Windows CE5.0系统内核,再次编写相关设备驱动,最后编写或移植应用程序. 制定内核时,我们采用SunSaung2440 BSP(板级支持包)进行制定,同时提交组建保证系统支持网络通讯.文件系统.CAB包安装.汉语支持等功能.不仅如此,为方便系统应用程序开发,内核制定之后,我们发布相应的SDK. 图 5.1 软件设计流程 1.2 Win

基于S3C2410的Windows CE 5.0 BSP移植

基于S3C2410的Windows CE 5.0 BSP移植 摘要  嵌入式开发中一个重要的环节是板级支持包(BSP)的开发,实际开发过程更倾向于移植BSP而不是重新开发BSP.本文先介绍了samsung公司的S3C2410微处理器和嵌入式操作系统Windows CE 5.0 特性,分析BSP结构,在此基础上,通过bootloader, OAL, 触摸屏驱动的移植来具体探讨BSP移植过程.   1 引言 在当今后PC时代,嵌入式系统应用得越来越广泛,嵌入式产品充斥着许多领域,日常生活的手机,MP

Windows CE S3C440A LED驱动编码分析

      基于TQ2440硬件平台,该平台处理器S3C2440A,在这个平台当中存在四个LED,用于测试,显示其他硬件运行情况等.LED驱动是一个典型的I/O驱动,简单但健全,是学习Windows CE嵌入式平台的典型例子.首先我们来看看这个平台这这部分电路图吧!           这四个LED分别加了1K偶的电阻,另一端接3.3V电压,接下来看看核心板的接口.       从这里可以看住,这四个LED分别由GPB5.GPB6.GPB7和GPB8控制,都处于B组GPIO口.接下来介绍具体的编

Windows CE下驱动开发基础

这是我从1月6日开始主持天极网论坛嵌入式开发版以来第一次发表文章,加上以前琐碎的文章共计30篇.研究的越多就越感觉自己懂的太少,其实在驱动开发方面我还是个菜鸟,我是想再次抛砖引玉,让做驱动有N年经验的人奉献一点出来,让大家减少一些研究驱动源码而又缺少注释所带来的痛苦. 我想即使读者看过微软的关于驱动开发的培训教材和CE帮助文档中的驱动部分,头脑中仍然一片茫然.要想真正了解驱动程序必须结合一些驱动程序源码,在此我以串口驱动程序(COM16550)中初始化过程为线索简单讲一讲驱动开发的基础知识. W

Windows CE中实现蓝牙串口驱动程序

Windows CE中实现蓝牙串口驱动程序 [日期:2006-10-19] 来源:互联网  作者:佚名 [字体:大 中 小]     Windows CE作为一种典型的嵌入式操作系统,通过将蓝牙应用移植到Widows CE中,对于如pSOS+.Nucleus等其它嵌入式系统,具有典型意义.由于OBEX上的文件传输应用建立在RFCOMM实现的蓝牙仿真串口上,本文介绍OBEX文件传输的蓝牙虚拟串口驱动程序的实现. 1 Windows CE设备驱动程序概述 Windows CE支持广泛的基于各种CE平

【windows下进程searchfilterhost.exe分析】

  searchfilterhost.exe [进程信息] 进程文件: searchfilterhost.exe 进程名称: n/a 英文描述: searchfilterhost.exe is a process associated with Microsoft Windows Operating System from Microsoft Corporation. 进程分析: Microsoft Windows Vista 桌面搜索过滤器程序 进程位置: unknown 程序用途: unkn