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

2016-01-29 13:00 38 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 软件模块描述

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

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

延伸阅读
      好几次看到有人提问问到如何实现 iframe 的自适应高度,能够随着页面的长度自动的适应以免除页面和 iframe 同时出现滚动条的现象,刚好我在工作中也碰到了类似问题,于是上网翻查,东抄抄西看看,弄出来这么一个函数,贴到页面里面就能用了。不敢独享,大家要是觉得有用,欢迎使用 源代码如下 <script type="t...
标签: 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
1. dotnet连接fb Embedded Server版本 firebird分为两种版本,一种为安装版一种为嵌入式版本(该版本只需要一个fbembed.dll文件支持即可,此文件一定要是嵌入式版本中的(1.5.2版的文件大小为1489KB),不能使用安装版的fbembed.dll文件) 使用方法: 首先把 fb Embedded Server 的 fbembed.dll 拷贝到应用程序目录下。并且要使用fb.net provid...
作为嵌入式系统,使用环境通常都比较恶劣,而应用又比较简单。为系统的稳定通常都需要使用DOM、CF卡一类的存储设备来代替硬盘。因此需要制作一个小于32M的linux运行系统。 使用到的软件包括:syslinux, busybox, linux kernel 2.4.18, redhat 9 作为嵌入式系统,使用环境通常都比较恶劣,而应用又比较简单。为系统的稳定通常都需要使用DOM、...

经验教程

676

收藏

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