首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 维修教程知识 > 单片机栏
基于嵌入式Linux的矩阵键盘驱动程序研究与开发
来源:本站整理  作者:佚名  2009-04-24 10:51:21




2 嵌入式Linux设备驱动程序
    在Linux内核源代码中,各种驱动程序的代码量占据了整个Linux代码的85%。可见,Linux设备驱动在整个操作系统中起着举足轻重的作用。设备驱动是操作系统内核和机器硬件之间的接口,它们控制着设备的操作动作,并且提供了一组API接口给应用程序,使得应用程序能够与这个设备互动。而且,设备驱动为应用程序屏蔽了硬件的细节,在应用程序看来,硬件设备只是1个设备文件,应用程序就可以像操作普通文件一样对硬件设备进行操作。在Linux操作系统中,通常将外围设备分为3种类型:字符设备、块设备和网络设备。
    而在Linux操作系统中,还有一类设备被定义为“平台设备”,通常So(System on Chip)系统中集成的独立的外设单元都被当作平台设备来处理,这里把4×5的矩阵键盘也定义为平台设备。所谓的“平台设备”并不是与字符设备、块设备和网络设备并列的概念,而是Linux系统提供的一种附加手段,例如,键盘驱动,它本身是字符设备,但也将其归纳为平台设备。
    另外,键盘又属于输入设备,Linux内核提供了输入子系统,如键盘、触摸屏、鼠标等输入设备都可以利用输入子系统的接口函数来实现设备驱动。输入子系统由核心层(Input Core)、驱动层和事件处理层(EventHandler)三部分组成。在Linux内核中,使用输入子系统实现输入设备驱动的时候,驱动的核心工作是向系统报告按键、触摸屏、鼠标等输入事件。而不再需要关心文件操作接口,因为输入子系统已经完成了文件操作接口。通过输入子系统,实现输入设备驱动时只需要完成以下工作:
    (1)在模块加载函数中告知输入子系统输入设备可以报告的事件。例如,可通过_set_bit(EV_KEY,input_dex,一>evbit)来告知输入子系统该设备可报告按键事件。
    (2)在模块加载函数中注册输入设备。注册函数为:int input_register_device(struct input_dev*dev);
    (3)当有输入事件发生时,如按键按下/抬起、触摸屏被触摸/抬起/移动时,通过input_report_xxx()报告发生的事件及对应的键值、坐标等状态。主要的事件类型包括EV_KEY(按键事件)、EV_REL(相对值,如鼠标移动,报告相对于最后一次位置的偏移)和EV_ABS(绝对值,如触摸屏)。用于报告EV_KEY事件的函数为:void input_report_key(struct input_dev*dev,un—signed int code,int value);
    (4)在模块卸载函数中注销输入设备。注销输入设备的函数为:void input_unregister_device(struct in—put_dev*dev);


3 矩阵键盘驱动中的数据结构
    首先,定义一个整型数组osk_keymap[]用来定义按键映射表,把20个按键返回的码值映射成内核中标准的键码,这样有利于与上层应用程序的交互。通过KEY(col,row,code)宏定义来实现映射关系,如要把第2行第4列的按键映射为回车键,则通过KEY(3,1,KEY_ENTER)便可实现。其中KEY_ENTER是内核中定义的标准的键码。
    其次,定义矩阵键盘的设备结构体omap_kp,其定义如下:


4 矩阵键盘驱动程序设计及测试
    首先,实现矩阵键盘驱动的加载和卸载函数,分别通过调用platform_drivet_register()和platform_driV—er_unregister()实现矩阵键盘作为一个平台设备的注册和注销。
    其次,实现矩阵键盘驱动的探测和移除函数。在探测函数中,初始化行数、列数、中断号以及按键映射表。然后分配内存空间和输入设备,初始化omap_kp这个设备结构体和输入设备结构体input_dev,初始化定时器,设置输入设备可以报告的事件类型,并注册输入设备。最后申请中断,申请中断成功后,使能中断。移除函数则完成相反的工作。
    最后,实现矩阵键盘驱动的核心部分,也就是中断部分。众所周知,在Linux的中断处理中分为2部分,分别是顶半部(top half)和底半部(bottom half)。顶半部完成尽可能少的比较紧急的功能,它只是简单地读取寄存器中的中断状态并清除中断标志后就进行“登记中断”的工作。“登记中断”意味着将底半部处理程序挂到该设备的底半部执行队列中去。这样。顶半部执行的速度就会很快,可以服务更多的中断请求。底半部,是实现中断处理的真正部分,它来完成一些延缓的耗时任务,首先通过列扫描法检测各个按键状态有没有变化,若有变化再判断是哪一列哪一行发生变化,按键的行和列确定以后,通过键值映射表来查找其有没有对应的键值;若有则通过input_report_key()向内核报告按键的键值;否则,对应的按键没有定义键值,向内核报告为假按键(Spurious Key)。然后,延时(1/20)Hz再判断按键是否抬起。
    驱动开发完成后,以模块方式加入到内核,并在MiniGui和Qtopia下进行了测试,在Qtopia下测试结果如图2所示,证明矩阵键盘驱动工作正常、有效。

5 结 语
    在此介绍了基于0MAP5912和嵌入式Linux的一种矩阵键盘驱动的工作原理和开发方案。该驱动以静态方式加入内核后,通过测试证明矩阵键盘驱动工作稳定、高效,在MiniGui和Qtopia的记事本中,都能正确显示正确的键值,基本上实现了其功能,并成功地应用于所开发的嵌入式语音识别系统中。

上一页  [1] [2] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)

推荐阅读

图文阅读

热门阅读

Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:267,847.70000 毫秒