一个嵌入式Linux系统的键盘驱动实现 (1)

2016-01-29 13:00 44 1 收藏

一个嵌入式Linux系统的键盘驱动实现 (1),一个嵌入式Linux系统的键盘驱动实现 (1)

【 tulaoshi.com - PHP 】

1 引言

Linux由于其具有内核强大且稳定,易于扩展和裁减,丰富的硬件支持等诸多优点,在嵌入式系统中得到了广泛的应用。很多嵌入式Linux系统,特别是一些具有与用户强交互的嵌入式系统,往往需要配备一个特殊键盘,此时开发者需要根据实际情况,为自己的特殊键盘编写驱动程序。

2 Linux键盘驱动简介

Linux中的大多数驱动程序都采用了层次型的体系结构,键盘驱动程序也不例外。在Linux中,键盘驱动被划分成两层来实现。其中,上层是一个通用的键盘抽象层,完成键盘驱动中不依赖于底层具体硬件的一些功能,并且负责为底层提供服务;下层则是硬件处理层,与具体硬件密切相关,主要负责对硬件进行直接操作。键盘驱动程序的上层公共部分都在driver/keyboard.c中。该文件中最重要的就是内核用EXPORT_SYMBOL这个宏导出的handle_scancode函数。handle_scancode完成的功能是:首先将扫描码转换成键码,接着根据shift, alt等扩展键的按下情况将键码转换成目标码,一般情况下是ASCII码,最后将该ASCII码放到终端设备的缓冲区中,并且调度一个tasklet负责将其在显示器上回显出来。可以看出,这个函数完成的是键盘驱动程序中最核心的一些工作,而这些核心的逻辑功能是不依赖于底层硬件的,所以可以将其独立出来,并且导出给底层的硬件处理函数调用。在这个文件中还定义了其它几个回调函数,它们由键盘驱动程序中的上层公共部分调用,并由底层硬件处理函数实现。比如kbd_init_hw, kbd_translate, kbd_unexpected_up等等。其中kbd_translate由handle_scancode调用,负责将扫描码转换成键码;键盘驱动程序的底层硬件处理部分则根据不同的硬件有不同的实现。例如PC平台上标准键盘的底层硬件处理函数都集中在driver/Pc_keyb.c中。这个文件包括了键盘中断处理函数keyboard_interrupt,扫描码到键码转换函数pckbd_translate等其他一些与底层硬件密切相关的函数。

在这种体系结构下,要添加一块特殊键盘到系统中就显得格外清晰。开发者只需为其编写驱动程序中的底层硬件处理函数,就可以将该键盘驱动起来。一般说来,底层硬件处理函数中最重要的工作就是在键盘中断处理中获取被按下键的扫描码,并且以它为参数调用handle_scancode,该扫描码可以自己定义,但它必须唯一地标识出被按下键在键盘上的位置。此外,开发者还需要提供对应的从自定义扫描码到键码的转换函数kbd_translate。具体的键码转换,将目标码放到终端的输入缓冲区,以及回显等工作都由handle_scancode负责完成。在此我们也可以看出,内核导出函数handle_scancode在整个键盘驱动程序中,起着将上层通用抽象层和底层硬件处理层粘和起来的关键作用。

3 应用实例

下面我们将以一个具体的应用实例来说明在嵌入式Linux系统中给一个特殊键盘编写驱动程序的具体过程。

3.1 硬件模块描述

本系统的构建选用了三星公司的S3C2410开发板作为硬件平台。特殊键盘的硬件模块主要由两个SN74hc164芯片和一个4行16列的矩阵扫描电路构成。SN74hc164是一个8位的串形输入并形输出移位寄存器,它的内部由8个D触发器串联而成。其工作原理简单说来是这样的,SN74hc164芯片在时钟CLK脉冲的上升沿将A,B引脚上的串形输入在8个时钟脉冲以后并行输出到输出引脚QA到QH。其真值表见图1所示。

两个SN74hc164芯片先串联后,将它们的CLK引脚和CLR引脚分别接到S3C2410开发板的GPB2和GPB4端口上,并且将第一个SN74hc164芯片的A,B引脚接到开发板的GPB1端口上,这三个GPIO端口配置成输出端口。这样我们就借助于两个SN74hc164寄存器,实现了只占用3个GPIO端口,给矩阵扫描电路的16列提供输入,从而既节约了成本,又避免了GPIO资源的浪费。但这同时也给键盘驱动程序的实现带来了一定的麻烦,驱动程序首先要将SN74hc164驱动起来,然后才能对矩阵电路的16列进行控制。该矩阵电路的4个行引脚分别被接到S3C2410的GPG6,GPG7,GPG8,GPG9端口上,并且这四个端口被配置成中断源。无键按下时直接读为高电位,使用时通过SN74hc164芯片先将键盘的16列置低电位,任何一个键被按下,相应的行GPG端口就会有从高到低的电压跳变,从而触发一次中断。

3.2 软件模块描述

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/php/)

来源:http://www.tulaoshi.com/n/20160129/1488526.html

延伸阅读
卧室衣柜在卧室中有着举足轻重的作用,根据卧室装修的风格搭配不同款式的、不同色彩的衣柜,在保证 其本身的使用功能以外还有更好的装饰作用。在时下的家居装修中,衣柜设计也是多样化的,开放式衣柜、 嵌入式衣柜等等,个性化的设计也给卧室生活增加不少乐趣。 嵌入式衣柜的优点就是衣柜空间大,节省室内空间,并且可以随心所欲地定制样式...
1. dotnet连接fb Embedded Server版本 firebird分为两种版本,一种为安装版一种为嵌入式版本(该版本只需要一个fbembed.dll文件支持即可,此文件一定要是嵌入式版本中的(1.5.2版的文件大小为1489KB),不能使用安装版的fbembed.dll文件) 使用方法: 首先把 fb Embedded Server 的 fbembed.dll 拷贝到应用程序目录下。并且要使用fb.net provid...
标签: Web开发
在当今信息社会,各单位都进行信息化改造以顺应社会发展趋势,使自己在激烈的竞争中立于不败之地。电子政务、电子商务在中国如火如荼的开展。高校网站在信息化改造中起了排头兵的作用。高校网站总体架构之下是各个系(学院)或部门网站。系(学院)网站是高校网站重要的子系统。 目前高校系(学院)网站的开发大部分采用IIS+ASP+data...
mini-itx的嵌入式linux开发的第一套设备 包括有:1.atiosys的mini-itx主板一块,cpu via c3 ebga 733Mhz2. 20G 2.5"硬盘一个3.dvd rom一个4.cf to ide转换卡一块5.256M cf卡6.2.5"硬盘线一条 整套设备: 主板: cf to ide
嵌入式系统是计算机技术、通信技术、半导体技术、微电子技术、语音图像数据传输技术等先进技术和具体应用对象相结合后的新产品。系统无多余软件,硬件亦无多余存储器,可靠性高,成本低,体积小,功耗少;可应用于家电、工业、通信、国防等领域。其产品形态丰富多样,市场潜力巨大。 Linux具有内核可裁剪、效率高、稳定性好、移植性好、源代码...

经验教程

658

收藏

90
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部