WinCE下非标准键盘的驱动程序设计

    键盘作为收入设备,在嵌入式系统中应用广泛。它与PC键盘不同,嵌入式系统中的键盘千差万别,随实际应用的场景不同而不同。今天在这里介绍就是一种非标准键盘的驱动程序设计。在一些应用中,可能只会用到有限的几个按键。为了节省硬件成本,并充分利用既有的硬件资源,通常将这些按键连接到MCU的外部中断引脚上。如S3C2410有一百多个GPIO,几十个外部中断,我们就可以用几个外部中断来实现系统的按键功能。
    虽然嵌入式系统中的键盘形形色色,各不相同,但驱动的框架基本一致。从工作模式的角度来看,一般有中断方式和扫描方式。在中断服务线程中读取按键的扫描码,并将其转换为虚拟按键信息发送给系统。采用扫描方式的过程与此类似。但如前所述的非标准键盘驱动就可不必采用该框架,而使用普通的中断处理方式,在中断服务线程中模拟相应的按键信息,调用函数keybd_event()即可。
    下面以S3C2410的外部中断4为例,简单介绍一下整个处理过程。    

Code
 1UINT32 Irq1 = IRQ_EINT4;
 2UINT32 SysIntr1 = SYSINTR_UNDEFINED;
 3HANDLE IntrEvent1 = NULL;
 4BOOL bThreadExit1 = FALSE;
 5UINT IntrThreadProc1(LPVOID);
 6//模拟按键
 7void SimulateKey(BYTE bVk)
 8{
 9    keybd_event(bVk,0,0,0);
10    keybd_event(bVk,0,KEYEVENTF_KEYUP,0);
11}
12KEY_Init()中的关键代码:
13//初始化中断
14EnableInterrupt();
15//创建中断服务线程
16if(!CreateThread(0, 0, (LPTHREAD_START_ROUTINE)IntrThreadProc1,0,0,NULL))
17{
18    RETAILMSG(1, (TEXT("***KEYDrv: KEY_Init fail(1).\r\n")));
19    return FALSE;
20}
21KEY_Deinit()中的关键代码:
22//设置退出线程的标志
23bThreadExit1 = TRUE;
24//模拟一个中断事件
25SetInterruptEvent(SysIntr1);
26//中断服务线程
27UINT IntrThreadProc1(LPVOID ptr)
28{
29    IntrEvent1 = CreateEvent(NULL, FALSE, FALSE, NULL);
30
31    if (!KernelIoControl(IOCTL_HAL_REQUEST_SYSINTR, &Irq1, sizeof(UINT32), &SysIntr1, sizeof(UINT32), NULL))
32    {
33        RETAILMSG(1, (TEXT("ERROR:IntrThreadProc1 Failed to request sysintr.\r\n")));
34        return(0);
35    }
36
37    //关联SYSINTR和之前创建的事件
38    if (!(InterruptInitialize(SysIntr1, IntrEvent1, 0, 0)))
39    {
40        RETAILMSG(1, (TEXT("ERROR: IntrThreadProc1 InterruptInitialize failed.\r\n")));
41    }
42
43    while(1)
44    {
45    WaitForSingleObject(IntrEvent1, INFINITE);
46    
47    if(bThreadExit1)
48    {
49            break;
50    }
51
52    SimulateKey(VK_F1);
53    Sleep(1);
54    InterruptDone(SysIntr1);
55    }
56    //取消IRQ与SYSINTR之间的关联
57     KernelIoControl(IOCTL_HAL_RELEASE_SYSINTR,&SysIntr1, sizeof(UINT32),NULL,0, NULL);
58    //取消Event与PwrButtonSysIntr之间的关联
59    InterruptDisable(SysIntr1);
60    CloseHandle(IntrEvent1);
61    RETAILMSG(1, (TEXT("IntrThreadProc1 IST Exit.\r\n")));
62    return 0;
63}
64

    在该中断服务线程中模拟了F1按键按下抬起的过程,所以当外部中断4被触发时,系统会接收到F1键的信息,上层应用程序可以对此做进一步的处理。如果硬件系统中只有两三个这样的按键,采用该方法还是比较方便的。如果按键较多,则可以定义一个结构,将啰嗦的代码精简一下。

    另外,如果中断不能正常工作,可以按照以下几个步骤逐一排查。

1.     硬件中断有没有被触发。这里可以借助于示波器查看中断引脚的信号。

2.       驱动中有没有正确配置中断的工作模式。一般来说,中断与IO复用,在使用中断时需要配置。配置完了以后,还需要防止被别的程序修改。

3.       如果有中断信号且配置完全正确,也没有被别人修改,则需要考虑当前中断是否已经被别的驱动注册。WinCE中,硬件中断可被多次注册而不会出错,但却不能正常工作了。这一点在WinCE 6.0中断驱动程序分析中曾做过分析。

4.       如果以上步骤都没有问题,则需要考虑中断服务例程中有没有对该中断作出正确的处理。

时间: 2024-09-20 16:51:47

WinCE下非标准键盘的驱动程序设计的相关文章

虚拟网卡 TUN/TAP 驱动程序设计原理

原文http://www.ibm.com/developerworks/cn/linux/l-tuntap/index.html 简介 虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装.本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱动程序在linux环境下的设计思路. tun/tap驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装.利用

虚拟网卡TUN/TAP驱动程序设计原理

虚拟网卡Tun/tap驱动是一个开源项目,支持很多的类UNIX平台,OpenVPN和Vtun都是基于它实现隧道包封装.本文将介绍tun/tap驱动的使用并分析虚拟网卡tun/tap驱动程序在linux环境下的设计思路. tun/tap 驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网络包实施不同的封装.利用tun/tap 驱动,可以将tcp/ip协议栈处理好的网络分包传给任何一个使用tun/tap驱动的进程,由进程重新处理后再发到物理链路

qtp点击非标准控件(下拉框)之后,页面对象全部变成page。(第一次运行时,可以识别所有对象)

问题描述 qtp点击非标准控件(下拉框)之后,页面对象全部变成page.(第一次运行时,可以识别所有对象) 页面有两个输入框,还有两个非标准的下拉框(type不是weblist而是自定义的pullbigtree),qtp识别不了下拉框,但是下拉框支持输入,因此我自己增加了对象库text,通过页面源代码找到下拉框的name,然后qtp运行时,第一次是可以输入的,但是输入后下拉框控件会调用后台执行查询,此时,所有的页面对象都探测不到(聚焦不到),只能探测到最外面的page

WinCE下自定义的大软键盘

      WinCE下默认的大软键盘如下图所示.             在实际应用中,很多按键,如最上面一行的F1~F12几乎很少使用,只有数字.字母和几个重要的功能键用的较多,所以,我们可以根据自己的需求定制软键盘.       WinCE6.0中,其源代码位于C:\WINCE600\PUBLIC\COMMON\SDK\SAMPLES\LARGEKB.至于如何修改,这里就不做介绍了,应该不困难的.附上以前修改过的一个实例,如下图所示.             实际效果图如下,       

USB设备的Bulk模式驱动程序设计

USB设备的Bulk模式驱动程序设计   引言 通用串行总线(USB)是一种串行接口,具有自动配置能力和良好的兼容性,从而简化了计算机与外设的连接,被计算机外设硬件制造商广泛采纳.USB总线标准由1.1版升级到2.0版后,传输率由12Mbps增加到了480Mbps,更适宜于高速数据传输.USB设备支持打印机.扫描仪.数码相机等外设时,由于这些外设与主机间传输的数据量大,要求驱动程序采用Bulk模式进行高速数据传输. USB设备驱动的整体结构 USB设备驱动的整体结构包括如下五个主要部分:USB应

垂直电商寄望O2O非标准品盈利模式趋向多样化

随着红星美凯龙网上商城.齐家商城的正式试水,非标准品 (满足不同客户个性化需求的商品)正有望成为电商竞争的另一片蓝海. 今年8月,新入驻天猫的100多名商家中,家居类占据了近五分之一.截至8月,老牌建材家居网站齐家网宣布今年的销售额已达到120亿元,超过了去年全年的110亿元. 业内人士预计,随着O2O(把线上能力和线下用户生活关联起来的一种服务)的不断升温,售卖非标准品的垂直电商将迎来井喷. 线上向线下导流 O2O并不是一个新鲜的概念,只不过借着移动互联网的东风,这一领域越来越受到关注. 公开

WinCE下电池充放电测试

        对手持设备来说,电池的充放电曲线非常重要,一般由电池厂家提供.我们在开发的过程中会按照这个标准的充放电曲线设计程序.但设备的工作模式有很多种,为了测试在各模式下电池的放电情况,我们可以自己写个小工具记录下电池的放电状态,然后通过Excel或者Matlab绘制出其放电曲线.       WinCE下电池驱动分MDD和PDD两层,对于一般应用来说,只要实现PDD层,链接标准的MDD层LIB,生成电池驱动battery.dll即可.PDD层的代码实现可参考C:\WINCE600\PLA

WinCE下WIFI模块AR6102的调试

      今天调试了一款SDIO的无线网卡AR6102,由于该芯片是板载的,所以写了一个应用程序,模拟无线网卡的插入拔出,然后简单修改了SDHC驱动,检测应用程序发出的模拟卡插拔的动作,并控制芯片的PWR和RST引脚.幸运的很,改完之后,就可以用了.通过应用程序模拟无线网卡的插入动作后,在超级终端看到了加载无线网卡驱动的打印信息,在控制面板的网络连接里也看到了WIFI设备,AR6K_SD1.       用于测试的无线AP是Cisco的,加密方式是WPA-Personal,根据路由器的设置,选

垂直电商寄望O2O 非标准品盈利模式趋向多样化

每日经济新闻(博客,微博)记者 陶力 发自上海 随着红星美凯龙网上商城.齐家商城的正式试水,非标准品(满足不同客户个性化需求的商品)正有望成为电商竞争的另一片蓝海. 今年8月,新入驻天猫的100多名商家中,家居类占据了近五分之一.截至8月,老牌建材家居网站齐家网宣布今年的销售额已达到120亿元,超过了去年全年的110亿元. 业内人士预计,随着O2O (把线上能力和线下用户生活关联起来的一种服务)的不断升温,售卖非标准品的垂直电商将迎来井喷. 线上向线下导流 O2O并不是一个新鲜的概念,只不过借着