新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于I2C总线的键盘驱动的设计与实现

基于I2C总线的键盘驱动的设计与实现

作者:时间:2009-07-03来源:网络收藏

3.2 软件框架

Windows CE操作系统层分为MDD层(Model Device Driver,模型设备)和PDD(Platform Dependent Driver,平台相关)两层,框架结构如图4所示。MDD层是抽象出来的一些功能,不与硬件直接相关,他接收PDD层传来的数据,完成处理得到的键值,发出消息通知处理处理响应操作的程序,PDD层与硬件直接相关,硬件接口以及获得的硬件特性传递给MDD层。

驱动流程,PDD层主要实现的监控,开辟两个线程,线程MaxKeyCheckPro监控INT脚的电平变化。当有键按下,INT拉低,此时在准备完毕的情况下,通过发送读取键值的命令读取芯片的FIFO,芯片在接收到命令之后会将FIFO中存储的键值通过发出传回给线程MaxKeyCheckPro,同时发出通知给线程KeybdIstThreadProc,将传递回来的键值传给线程KeybdIstThreadProc,再由线程KeybdIstThreadProc负责将键值传给MDD层,MDD层负责存储键值,并发出消息通知相应的程序对键值做出响应。

采用两个线程的目的是让各自完成自己的操作,不会造成相互的影响,在按键频繁触发的情况下,线程MaxKey CheckPro可以在快速得到键值传递出去之后立即等待下一次按键的发生,不会因为在处理其他的操作而使得下一次按键的响应有所延迟。

3.3 I2C总线的通信流程

由于按键的频繁按下会导致不停地使用I2C总线读取芯片FIFO,所以防止2次读写之间的干扰(即在一次读写没有完成之前另一次读写操作也占用I2C总线,两次的数据会造成紊乱)是一个重要的问题。

针对一次读写操作,考虑到其不可打断性以防止数据的破坏,采用mutex互斥锁。即每次只允许1个读写操作占用I2C总线。在1次读写操作开始之前,等待互斥锁,直到读写操作完毕,释放互斥锁。这样当在一次读写没有完成之前,另一次读写无法占用I2C总线,而只能等待。具体流程如图5所示:

3.4 具体读写操作

这里的驱动与普通驱动不同,不需要通过判断键盘矩阵的电平变化来得到键值,这些操作由芯片内部完成。键盘控制器对按键操作去抖并且自动存入FIFO中,因此所需要做的操作就是在检测到键盘按下之后读取FIFO。如图6所示。

但值得注意的是,每次按键按下之后,INT脚会被拉高,但是只有在将FIFO清空之后INT才会被拉低,拉低之后如果继续有键盘按下,会继续把键值存放在FIFO中。所以每次的读取操作需要清空FIFO。但是在实际应用中发现当键盘在被快速按下时,对于FIFO中的操作都做出响应会影响系统的性能,所以选择丢掉FIFO队列中其他键值,只保留最后一个。

4 性能分析

整个过程CPU通过3根主线和芯片通信,实现了按键操作的快速响应和处理,可以控制最多达64个按键的防抖及响应,由于芯片封装了一部分功能,由硬件来处理使得速度变快。由于I2C的多主控特点,不会影响挂在I2C上的其他外设的工作和性能。

5 结 语

本文介绍PXA270处理器和WindowsCE 5.0操作系统上的键盘驱动的和实现。目前已经在本平台上稳定运行,具有很好的按键处理能力。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭