S3C44B0X键盘的uClinux驱动程序设计

2008-06-16 17:08:42来源: 电子设计技术

  用三星公司的嵌入式微处理器S3C44B0X设计的嵌入式开发板大多采用1×4按键键盘,在移植uClinux到这类开发板上时,必须设计键盘驱动程序。1×4键盘驱动程序通过修改uClinux源代码PC键盘的驱动程序得到。

  根据实际电路,对键盘的初始化、键盘中断处理程序进行了处理,用户可根据需要决定各键的扫描码。此驱动程序利用操作系统计时器解决了键盘的抖动问题。1×4键盘驱动程序可用于其他类似的嵌入式系统

  引言

  三星公司的ARM7系列微处理器得到了广泛使用,其中S3C44B0X是制作手持式设备的良好选择。目前以S3C44B0X为核心制作的开发板大多采用1×4按键键盘,其电路简单,容易实现。在移植uClinux到s3C44B0X开发板时,必须自己设计键盘的驱动程序。1×4按键键盘的驱动程序根据硬件特点,对源代码中PC键盘驱动程序进行修改而得到,并在开发板上成功使用。

  1 uClinux键盘驱动程序概述

  在uClinux操作系统中,键盘驱动程序与Linux基本相同,其中PC键盘驱动程序比较典型。键盘是一种字符设备,可以在目录/drivers/char 中找到驱动程序。PC键盘的驱动程序由keyboard.c和pc_keyb.c两个程序组成。其中:keyboard.c是键盘的高层驱动,与硬件不直接相关;pc_keyb.c是键盘的底层驱动,与键盘硬件直接相关。

  PC键盘在uClinux中的工作过程如下:

  在uClinux启动时初始化键盘,相关函数是kbd_init,kbd_init运行时调用pckbd_init_hw函数(初始化的一部分)。初始化键盘时,对键盘上的LED(发光二极管)也进行初始化。同时,因为PC上鼠标与键盘都采用PS2接口,所以驱动程序中还包括鼠标的初始化。

  在使用过程中,键盘以中断形式工作。当按下某个键时,就产生一个中断,使CPU进入键盘中断处理程序keyboard_interrupt

  keyboard_interrupt运行后,逐个调用下列函数:handle_kbd_event、handle_keyboard_event、do_acknowledge、handle_scancode、pckbd_translate、put_queue,完成后退出keyboard_interrupt 。

  PC键盘工作中牵涉的这些函数都在keyboard.c和pc_kbd.c中,其中pckbd_init_hw、keyboard_interrupt、handle_kbd_event、handle_keyboard_event、do_acknowledge、pckbd_translate都在pc_keyb.c中。

  整个键盘中断处理程序完成的工作是;从键盘获得被按下键的扫描码(scancode),将其转换成键码(keycode),再转换成目标码(多为ASCII码),最后将目标码送人控制台。

  因键盘是控制台的一部分,驱动程序中还有与控制台相关的函数(如kbd_setkeyeode和kbd_getkeycode),如果处理不好则会导致控制台不能运行。

  2 按键键盘驱动程序设计原理

  从PC键盘驱动程序原理分析,按键式键盘驱动程序要完成的工作是:

  a)初始化。

  b)按键被按下时产生中断,启动中断控制程序keyboard_interrupt,产生被按下的键对应的扫描码,并转换成键码、目标码,送入控制台。因控制台需要扫描码进行处理(例如kbd_setkeycode),必须在中断程序中首先产生扫描码,不能直接产生键码或目标码。

  根据上述原理,只需修改pc_keyb.c程序。不更改keyboard.c,就可以完成驱动程序的设计。具体方法是:

  a)根据按键键盘具体情况进行初始化,设置好键盘中断,去掉鼠标相关部分。

  b)让键盘中断程序keyboard_interrupt根据按键产生扫描码,调用handle_scancode完成后面的工作。

  3 S3C44B0X开发板1×4按键键盘电路

  S3C44B0X开发板采用的1×4键盘电路很简单,就是将PG4、PG5、PG6、PG7引脚各自连到一个按键开关,如图1所示。

  

  图1 S3C44B0X开发板1×4按键键盘电路

  S3C44B0X的PG4、PG5、PG6、PG7这4个引脚可设置成共用一个中断口(中断号21)的4个外部中断EINT4、EINT5、EINT6、EINT7,可用EXTINTPND寄存器来区分4个中断源。这样按下任何一个键就产生一个中断信号,就是键盘中断信号。

  在uClinux源代码中已经提供了一个S3C44B0X的开发板——MBA44,因此可以在字符设备驱动程序增加一个mba44_keyb.c(/drivers/char/目录),并driver/char/Makefile进行适当修改,添加mba44_keyb.c的目标程序进入内核。mba44_keyb.c可通过pc_keyb.c直接修改得到,keyboard.c不用修改。

  mba44_keyb.c中的键盘初始化部分kbd_init_hw函数中最关键的部分是键盘中断口的初始化,在这里是irq21。可用pckbd_init_hw进行简化,去掉按键键盘无关部分得到。

  键盘中断处理程序也可从PC键盘的相关部分简化得到。按键键盘电路没有LED,要去掉LED相关部分。最关键的部分是获得每个键的扫描码,可以用EXTINTPND寄存器区分4个按键,对每个按键提供一个扫描码(scancode),并将扫描码送入handle_scancode函数处理。注意在分清4个按键后,要向EXTINTPND寄存器中写入0xf清零,还要将中断悬挂指示寄存器INTPND的相应位清零,以免中断处理程序死循环。

  在mba44_keyb.c中注意要有pckbd_translate、kbd_setkeycode、kbd_getkeycode等几个函数,其他函数(例如do_acknowledge等)都可不要。

  在驱动程序mba44_keyb.c设计的同时,应注意修改相关的头文件(例如keyboard.h)。

  5 按键键盘去抖动

  1×4按键键盘的去抖动采用了一个较简单的方法。因为4个按键都接着中断口,所以抖动表现为一次按键、多次中断,且几个中断间隔时间很短。去抖动方法就是对短时间内(例如1s)的多次键盘中断只对第1次全部处理,后面的几次不产生扫描码,也不调用handle_scancode,只简单地对EXTINTPND寄存器和INTPND寄存器的相应位清零后就退出中断。

  程序的实现方法是:定义一个全局变量(unsigned long),在初始化时赋值为0;键盘中断产生时首先读取系统的jiffies值,与这个全局变量相减,若差值大于HZ(一般为100),则这个全局变量赋值为刚读取的jiffies值,并实现全部中断程序;若差值小于HZ,就表示是一次抖动,如上所述简单清零后退出中断。这里jiffies值是系统定时器的时钟数,HZ是1s内的时钟数,在系统中都有定义。

  6 结束语

  S3C44B0X开发板1×4按键键盘的uClinux驱动程序具有普遍性,其他种类的嵌入式系统也可采用类似的方法,用类似的驱动程序使用按键键盘。此驱动程序经过修改,可以驱动更复杂的键盘,例如矩阵式键盘等。

关键字:键盘电路  驱动程序  uClinux  中断处理程序  全局变量  中断源  外部中断  

编辑:孙树宾 引用地址:http://www.eeworld.com.cn/gykz/2008/0616/article_1021.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
论坛活动 E手掌握
微信扫一扫加关注
论坛活动 E手掌握
芯片资讯 锐利解读
微信扫一扫加关注
芯片资讯 锐利解读
推荐阅读
全部
键盘电路
驱动程序
uClinux
中断处理程序
全局变量
中断源
外部中断

小广播

独家专题更多

富士通铁电随机存储器FRAM主题展馆
富士通铁电随机存储器FRAM主题展馆
馆内包含了 纵览FRAM、独立FRAM存储器专区、FRAM内置LSI专区三大部分内容。 
走,跟Molex一起去看《中国电子消费品趋势》!
走,跟Molex一起去看《中国电子消费品趋势》!
 
带你走进LED王国——Microchip LED应用专题
带你走进LED王国——Microchip LED应用专题
 
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2016 EEWORLD.com.cn, Inc. All rights reserved