新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于Windows CE的7×3手机键盘驱动实现

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

作者:时间:2012-03-22来源:网络收藏

4. 驱动程序模型

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

图2驱动程序分层结构模型

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

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

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

Windows CE的输入系统在启动时加载矩阵键盘驱动程序,其加载流程如下:当输入系统开始运行时,输入系统将从 HKEY_LOCAL_MACHINEHardwareDeviceMapKEYBDDrivername注册键中获取矩阵键盘驱动动态链接库(DLL)的名字。如果没有找到入口函数,系统将使用默认名字Keybddr.dll,然后加载这个DLL文件,并且确认所需要的条目指针是否都存在;然后,系统调用PFN_KEYBD_DRIVER_INITIALIZE 函数去执行一次初始化工作。在这个函数中,模型设备驱动程序()存储一个输入系统回调函数的拷贝,并且处理键盘中断的中断服务线程(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函数来获取按键的扫描码,然后调用ScanCodeToVKeyEx函数将扫描码映射成虚拟码。把从返回的键盘事件发送到输入系统,输入系统对它们进行排队并分发给相应的应用程序。

6. KeypdPdd_GetEventEx函数

当输入系统载入矩阵键盘驱动后,由矩阵键盘驱动执行一系列初始化工作,然后开启一个线程进入键盘中断主循环,等待键盘事件的发生。一旦发生键盘事件,即检测到有按键被按下,立即调用KeypdPdd_GetEventEx函数来获取按键的扫描码。

其中,列为矩阵扫描输入端,行为矩阵键盘输出端,当有按键被按下时,矩阵键盘的相应行和列所对应的输入输出电平将相应地发生变化,通过矩阵键盘的扫描,将此值存储于键盘接口自动扫描寄存器的相应位中,然后将此数据进行如下操作:

1) 屏蔽键盘自动扫描寄存器的列数据的值,将此值存储于C中。

1) 屏蔽键盘自动扫描寄存器的行数据的值,将此值存储于R中。

2) 将上面两步产生的数据进行或运算,所得的数据就是被按下键的扫描码。



评论


相关推荐

技术专区

关闭