嵌入式移动设备的应用越来越广,以其体积小、重量轻、便于携带等特点而备受青睐。键盘是一种最为普遍使用的输入工具,但嵌入式移动设备因其体积小的特点决定了它的键盘不大可能采用普通PC机上的标准键盘,因而大多数采用键数相对较少的矩阵键盘。

利用矩阵键盘用户可以很方便的实现对嵌入式移动设备进行相应的操作,是极方便的人机交互设备。随着微软的嵌入式操作系统Windows CE的普及,Windows CE的矩阵键盘开发得到了越来越多开发者的重视,本文与大家分享我在开发矩阵键盘的一些总结。

  1.Windows CE驱动分类

  Windows CE提供了许多用于开发设备驱动的模型,这些驱动程序模型使得Windows CE 能适应大部分的内部和外围设备。因此,在深入探讨Windows CE矩阵键盘驱动程序之前,先了解在WinCE平台上使用的两种设备:内建设备和可安装设备。因此,从驱动加载方式来看WinCE可分为本机设备驱动 (Built-In Driver)、可加载驱动(Loadable Driver)。

本机设备驱动即Native Device Drivers,WinCE设计成可直接使用内建设备,这些设备由本机驱动过程控制。本机驱动程序是与WinCE的核心组件紧密相连,这些驱动对应的设备 通常在系统启动时,在GWES的进程空间内被加载,因此它们不是以独立的DLL形式存在。可加载设备是指可与平台连接和分离的第三方接口设备,可由用户随 时安装和卸载这些驱动,可以在系统启动时或者和启动后的任何时候由设备管理器动态加载。通常这类驱动是以DLL动态链接库的形式存在,系统加载后这些驱动 程序是以用户态的角色运行,这种外围设备的驱动也被称为流驱动。

两者的差别在于它们提供的编程接口不同:本地设备驱动可以根据具体设备的需求提供本机的相应接口;而流接口驱动则是提供一组通用接口即流接口函数,应用程序可以通过流接口提供的接口函数来访问外围设备。

  2.嵌入式矩阵键盘驱动原理

嵌入式设备上的键盘受设备本身体积影响,键盘设计大多数采用矩阵形式。支持Windows CE系统的CPU有很多种,不同CPU之间矩阵键盘硬件设计也不尽相同。因此,键盘可以按照自定义布局,并且可以按照自己的喜好映射按键,从而实现按键的 不同功能,包括按键的个数、布局及按键功能的配置。

(1)矩阵键盘驱动核心是中断处理
  矩阵键盘一般是采用中断方式,因此矩阵键盘驱动首先要在OAL层加入中断源。简单的说,矩阵键盘驱动的主要作用就是实时监测外部按键中断,一旦发现外部有 键按下就向内核发送键盘消息实现键盘输入功能。这时键盘驱动会创建中断服务线程和键盘中断事件,每个按键对应一个键盘中断事件。因此,矩阵键盘驱动的设计 核心就是键盘中断处理的设计。

(2)中断服务例程(ISR)
  矩阵键盘作为输入设备一般以默认的频率扫描键盘,当有按键被按下时,通过扫描键盘并生成相应的扫描码,并通过处理器中的中断产生器产生一个中断信号,这时 内核会进入异常中断处理程序,由它屏蔽所有中断,再调用中断服务例程ISR得到该中断的逻辑中断标识。然后,中断服务例程把得到对应的中断标识符报告给系 统任务调度进程,同时产生键盘中断事件,键盘中断服务线程响应键盘中断事件,开始扫描矩阵键盘。然后,再通过这个中断信号控制相应的程序获取与之相对应的 虚拟码,最后此虚拟码由上层调用,实现按下此键的相应功能。鉴于ISR的任务比较单一,ISR通常都要求越短、越快越好。

(3)中断服务线程(IST)
  中断服务例程以键盘中断的逻辑中断标识符形式返回给系统任务调度进程,中断服务线程则在矩阵键盘驱动中负责具体中断处理。因此,矩阵键盘驱动的中断事件 HANDLE hKEYEvents要分别对应矩阵键盘产生的中断。一般来说,中断服务例程较小,并且只做很少的处理工作,中断服务线程就必须完成大多数中断处理工作, 包括响应中断、扫描按键位置、发送键盘消息等。

例如,在矩阵键盘驱动IST中会先调用CreateEvent函数创建事件对象,接着调用系统函数InterruptInitialize完成中断。完成 这些初始化工作后,接着调用 WaitForMultipleObjects (hKEYEvents)函数进入键盘事件的等待队列中。最后,当有事件被捕获后,根据不同的事件类型进入不同的键盘扫描处理程序。

  3.矩阵键盘驱动程序的设计和实现

  (1)矩阵键盘驱动程序模型
  Windows CE的最大好处是具有可定制性,当它自带的驱动程序不能满足用户的要求时,用户可以自己编写相应的驱动程序。Windows CE一般可以分为独立驱动和层次型驱动两类。独立驱动程序是指将驱动程序编写成同时包含Model Device Driver(MDD)和Platform Dependent Driver(PDD)的独立驱动。层次型驱动是指分为两层,较上层的MDD和比较下层的PDD。其中MDD实现的是和平台无关的功能,它描述了一个通用 的驱动程序框架;而PDD是和硬件以及平台相关的代码组成,MDD调用PDD中特定的接口来获取硬件相关的信息。

矩阵键盘驱动一般是层次型的,故驱动程序由两个独立的层组成:上层是模型设备驱动程序(MDD),映射矩阵键盘扫描码到虚拟键的编码上,产生与虚拟键编码 相关的字符。然后打包键盘信息,并将此信息输入到系统信息队列中。下层是依赖平台的驱动程序(PDD),它将从硬件重新获得扫描码。设备驱动程序服务器提 供的接口(DDSI)是在PDD中的函数集实现,并由MDD调用。由于微软提供了所有与MDD模块相关的源代码,所以对这部分不用做任何改动,只需将自己 的PDD模块与MDD模块链结成一个公用库即可。

矩阵键盘驱动DDI函数是在MDD层实现,由用户应用程序通过GWES子系统调用。其中DDI函数有:KeybdDriverGetInfo、 KeybdDriverSetMode、KeybdDriverPowerHandler、KeybdDriverInitializeEx、 KeybdDriverInitStates、KeybdDriverVKeyToUnicode、KeybdDriverMapVirtualKey。 而DDSI函数是在PDD层实现,由MDD层调用。DDSI函数有:KeybdPdd_PowerHandler、 KeybdPdd_InitializeDriverEx、KeybdPdd_GetEventEx、DllMain。
  
  (2)矩阵键盘驱动的接口函数
  流接口驱动程序的主要任务就是把外设的使用传递给应用程序,是通过把设备表示为文件系统的一个特殊文件来实现的,每个流接口的驱动程序都必须实现一组标准 的接口函数。由于矩阵键盘驱动采用了流驱动模式设计,故矩阵键盘驱动使用标准的流驱动接口函数,也称为矩阵键盘驱动的DLL接口。

但因为矩阵键盘作为一种输入设备与其他外围设备有很大的区别,应用层不能对其发布命令来操作它。所以,一般流驱动接口函数中对设备进行操作的接口函数在矩 阵键盘驱动中只是作了保留,并未有实质性的功能。其中,矩阵键盘接口函数中比较重要的有PWR_Init、PWR_DllEntry、 KeypdPdd_GetEventEx、KeypdPdd_GetEventEx、ScanCodeToVKeyEx等。

(3)矩阵键盘驱动加载过程
  Windows CE系统运行时会默认启动DEVICE.EXE进程。DEVICE.EXE负责加载所有流驱动,进程对流驱动的加载是通过注册表列举器 (RegEnum.dll)来实现。矩阵键盘的资源信息由OEM适配层(OAL)记录在注册表中,RegEnum.dll是通过扫描注册表项 HKEYLOCALMACHINE\Drivers\BuiltIn\PWRBUTTON下的键值对矩阵键盘进行初始化的。

因此,WinCE输入系统(GWES)会在启动时装载键盘驱动,输入系统将从HKEY_LOCAL_MACHINE\Hardware \DeviceMap\KEYBD\Drivername注册键中获取矩阵键盘驱动动态链接库(DLL)的名字。如果没有找到入口函数,系统将使用默认名 字Keybddr.dll,然后加载这个DLL文件,并且确认所需要的条目指针是否都存在。然后,系统调用 PFN_KEYBD_DRIVER_INITIALIZE 函数执行初始化工作。这时,模型设备驱动程序(MDD)会在本地保存复制的一份输入系统回调函数的副本以及初始化硬件和IST来处理中断。

当一个中断信号来的时候,键盘驱动负责把硬件扫描码转换为虚拟键值,然后虚拟键值会再发送给输入系统。输入系统从队列中取出按键事件,然后返回到驱动程序 的函数KeybdDriverVKeyToUnicode中。驱动程序根据分析特定的键事件和虚拟键的状态产生相应的字符。最后,输入系统把虚拟键值和字 符发送给合适的程序。

例如,在我所用的CAYMAN开发板中,键盘驱动的动态链接库名字为KeyPad.dll,入口点为DllMain,中断服务线程(IST)的名字是 m_hevInterrupt。这个线程调用函数InterruptInitialize注册SYSINTR_KEYBOARD中断,然后等待系统发出 SYSINTR_KEYBOARD信号。系统在收到中断信号后,中断处理程序调用KeypdPdd_GetEventEx函数来获取按键的扫描码,然后再 调用ScanCodeToVKeyEx函数将扫描码映射成虚拟码,把从PDD返回的键盘事件发送到输入系统,输入系统进行排队并分发给相应的应用程序。

一般来说,对于Windows CE特殊布局的按键式矩阵键盘来说,使用流接口驱动模式能快速有效的进行开发。因为可以尽量使用微软提供的样板程序,只需修改相应的硬件相关代码就能大大缩短开发流程,而且可以提高键盘驱动程序的可靠性。

WINCE 矩阵键盘 介绍相关推荐

  1. 【51单片机快速入门指南】2.3:GPIO读取矩阵键盘 8个IO读16键

    目录 硬知识 矩阵键盘介绍 测试程序 Key_Board.c Key_Board.h main.c 实验现象 普中51-单核-A2 STC89C52 Keil uVision V5.29.0.0 PK ...

  2. (五)51单片机基础——矩阵键盘

    矩阵键盘介绍: 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或逐列的"扫描",就可以读出任何位置按键的状态 扫描: 数码管扫描(输出扫描) 原 ...

  3. 【STM32】 4X4矩阵键盘电路

    目录 一:矩阵键盘介绍 二:矩阵电路原理图设计 三:矩阵键盘模块特点 四:4X4矩阵键盘模块实物图 五:4X4矩阵键盘模块电路原理图设计 六:4X4矩阵键盘模块电路PCB图设计 一:矩阵键盘介绍 轻触 ...

  4. 51单片机矩阵键盘——LCD1602显示

    1.前言 本次的实验需要用到LCD1602液晶屏,需要用到LCD1602.c 与LCD1602.h文件链接: https://download.csdn.net/download/YLG_lin/86 ...

  5. AutoLeaders控制组——51单片机学习笔记(模块化编程、LCD_1602、矩阵键盘)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  6. 51单片机 c语言 yl236,基于亚龙YL236单片机设备的矩阵键盘程序设计.doc

    基于亚龙YL236单片机设备的矩阵键盘程序设计.doc 基于亚龙YL236单片机设备的矩阵键盘程序设计 摘 要矩阵键盘在单片机技能大赛题目中基本是必备模块,连接贯穿整个题目的设计完成.本文介绍了基于亚 ...

  7. LINUX矩阵键盘简单介绍,stm32矩阵键盘原理图及程序介绍

    描述 STM32F0 系列产品基于超低功耗的 ARM Cortex-M0 处理器内核,整合增强的技术和功能,瞄准超低成本预算的应用.该系列微控制器缩短了采用 8 位和 16 位微控制器的设备与采用 3 ...

  8. LINUX矩阵键盘简单介绍,介绍一种新型的矩阵键盘电路

    这款新型的矩阵键盘电路,把传统的矩阵键盘与单片机的中断结合起来,提高了按键输入的响应,同时利用数码管作为显示终端,显示输入的按键值. 原理简介 普通的4X4矩阵键盘接口原理图如下图所示,可以控制16按 ...

  9. 【模块介绍】6×6矩阵键盘(硬件部分和扫描方式)

    目录 概述 原理图 扫描方式 扫描法 单个按键按下 多个按键按下 行反转法 图解 成品 概述 矩阵键盘非常常见 就是利用键盘组成矩阵来减少IO口的使用 做成6×6的矩阵键盘可以使用12个IO口读取36 ...

  10. 4x4矩阵键盘工作原理及扫描程序_4X4矩形键盘

    介绍 什么是矩阵键盘 矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组,由于电路设计时需要更多的外部输入,单独的控制一个按键需要浪费很多的IO资源,所以就有了矩阵键盘,常用的矩阵键盘有4X4和 ...

最新文章

  1. android aliasactivity作用,android activity-alias 的作用
  2. Centos7 Docker Compose部署mysql5.7
  3. 搞定ubuntu下环境变量的配置
  4. Spring Boot----SpringBoot整合 Dubbo 和 Zookeeper
  5. 悟空php微信复制的东西在哪找,微信收藏的文件在哪?从哪里能看到?
  6. JNDI配置原理详解
  7. PHP中empty,is_null,isset中的异同和功能
  8. 基于任务编程_如何理解任何编程任务
  9. 全国中小学生计算机竞赛试题,全国中小学电脑制作活动
  10. PHP拼接SQL语句批量更新多个字段
  11. html5的图片上传插件,分享5个好用的javascript文件上传插件
  12. java 如何打印自己快捷键_怎么快捷键取消正在执行的打印操作?
  13. 电池充电语音警报——隐私政策
  14. 用c语言实现BF算法
  15. 刚上市就名声鹊起,nova3和NEX拍照谁能更甚一筹?
  16. d3.js环形统计图代码
  17. 诚迈科技智能汽车软件产业峰会落幕,智达诚远峰昇操作系统FusionOS发布!
  18. Python 终极指南:进阶之路
  19. ctfshow 萌新计划 writeup1-8
  20. python-opencv基础

热门文章

  1. windows server 2012 AD 活动目录部署系列(二)创建域控制器
  2. layui模板引擎嵌套
  3. RGB颜色值与十六进制颜色码转换及颜色码对照表
  4. 20210725:FLAC刻录音乐CD教程03-Flac转wav格式
  5. local_listener参数(1)---elaine
  6. v4l2-ctl基本使用方法
  7. 数据敏捷,HTAP数据库既决效率又决生死
  8. apscheduler报错maximum number of running instances
  9. ORCAD中occurences 和 instances的区别
  10. Axure 8 - 中继器实战篇