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的记事本中,都能正确显示正确的键值,基本上实现了其功能,并成功地应用于所开发的嵌入式语音识别系统中。