微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > 基于Windows CE的7×3手机键盘驱动实现

基于Windows CE的7×3手机键盘驱动实现

时间:03-22 来源:互联网 点击:

1. 前言

矩阵键盘是嵌入式设备中常用的输入设备。它具有坚固耐用、响应速度快、小巧方便、原理简单、价格便宜、易于交流等诸多优点。利用矩阵键盘,用户只要用手指按下键盘上的数字或符号键就能实现对嵌入式设备进行相应的操作,从而使人机交互更为直接,是极方便的交互设备。矩阵键盘的应用范围非常广泛,特别是在手机、PDA等手持产品的运用更为广泛。本文讨论了矩阵键盘的实现原理和Windows CE操作系统的矩阵键盘驱动程序模型,并详细阐述和分析了嵌入式系统中矩阵键盘驱动程序的设计和实现方法,对开发手机键盘具有重要的参考价值。

2. 矩阵键盘原理

矩阵键盘作为输入设备以默认每秒2次的频率扫描键盘,当有按键被按下时,通过扫描键盘并生成相应的扫描码,并通过处理器中的中断产生器产生一个中断信号,然后通过这个中断信号控制相应的程序获取与之相对应的虚拟码,最后此虚拟码由上层调用,实现按下此键的相应功能。

键盘配置是很关键的,其中包括按键的个数、布局及按键功能的配置。键盘可以按照自定义布局,并且可以按照自己的喜好映射按键,从而实现按键的不同功能;对于Intel PXA272芯片而言,最多支持8×8的矩阵键盘,这个矩阵键盘接口连接PXA272处理器到矩阵键盘上,本次开发只使用7×3的矩阵键盘,键盘布局按照常用手机键盘布局,其中Intel PXA272芯片的GPIO107、GPIO108、GPIO96分别对应矩阵键盘的输出端口4~6,Intel PXA272芯片的GPIO100、GPIO101、GPIO102、GPIO97、GPIO39、GPIO90、GPIO91分别对应矩阵键盘的输入端口0~6。矩阵键盘原理详见下图1所示[1]。


图1 矩阵键盘原理图

3. 键盘接口I/O信号描述

KP_MKIN7:0>信号为来自矩阵键盘的输入信号和矩阵行所读取的信号。

KP_MKOUT7:0>为矩阵键盘的输出信号。这个键盘接口发射扫描信号到矩阵键盘的每一列,并检查是否有键被按下。

4. 矩阵键盘驱动程序模型

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

图2矩阵键盘驱动程序分层结构模型

DDI函数在MDD层实现,由用户应用程序通过GWES子系统调用,键盘驱动的DDI函数有[4]:KeybdDriverGetInfo、 KeybdDriverSetMode、KeybdDriverPowerHandler、KeybdDriverInitializeEx、 KeybdDriverInitStates、KeybdDriverVKeyToUnicode、KeybdDriverMapVirtualKey。

DDSI函数在PDD层实现,由MDD层调用,键盘驱动的DDSI函数有:KeybdPdd_PowerHandler、KeybdPdd_InitializeDriverEx、KeybdPdd_GetEventEx、DllMain。

5. 矩阵键盘驱动程序运行过程

Windows CE的输入系统在启动时加载矩阵键盘驱动程序,其加载流程如下:当输入系统开始运行时,输入系统将从 HKEY_LOCAL_MACHINE\Hardware\DeviceMap\KEYBD\Drivername注册键中获取矩阵键盘驱动动态链接库(DLL)的名字。如果没有找到入口函数,系统将使用默认名字Keybddr.dll,然后加载这个DLL文件,并且确认所需要的条目指针是否都存在;然后,系统调用PFN_KEYBD_DRIVER_INITIALIZE 函数去执行一次初始化工作。在这个函数中,模型设备驱动程序(MDD)存储一个输入系统回调函数的拷贝,并且处理键盘中断的中断服务线程(IST)。当一个中断信号发出时,键盘驱动将与转变硬件扫描码为虚拟按键码有关,并且与回调PFN_KEYBD_DRIVER_INITIALIZE_EX函数和 keybd_event API 有关[3]。

在CAYMAN开发板中,键盘驱动的动态链接库名字为KeyPad.dll,入口点为DllMain。通过入口函数,调用 KPControl::Initialize函数完成键盘时钟、相关GPIO口和键盘中断的一次性初始化。MDD还调用 KeyPdd_InitializeDriverEx函数,该函数启动一个线程处理键盘中断,然后返回到输入系统。

在CAYMAN开发板中,键盘驱动程序的中断服务线程(IST)的名字是m_hevInterrupt。这个线程调用函数 InterruptInitialize注册SYSINTR_KEYBOARD中断,然后等待系统发出SYSINTR_KEYBOARD信号。系统在收到中断信号后,中断处理程序调用KeypdPdd_GetEventEx函数来获取按键的扫描码,然后调用Sca

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top