0

0

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

黄舟

黄舟

发布时间:2016-12-23 13:45:16

|

1647人浏览过

|

来源于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系统中给一个特殊键盘编写驱动程序的具体过程。

简单库存管理系统
简单库存管理系统

本系统是一个基于工厂模式的三层架构项目,基于VS2005 开发,结构简洁,配合动软Codematic代码生成器,可以使开发效率事半功倍,倍感轻松。本系统主要功能 1,物品类别管理 实现了物品类别的添加、修改、删除功能,方便库存物品分类管理。 2,物品管理 实现物品添加、修改,管理员可实时对物品做出库、入库记录,也可查看详细历史出入库记录。 3,商家管理 实现商家添加、修改、删除功能,方便公司和客户

下载

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 软件模块描述

 以上就是一个嵌入式Linux系统的键盘驱动实现 (1)的内容,更多相关内容请关注PHP中文网(www.php.cn)!

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

0

2026.01.31

Golang人工智能合集
Golang人工智能合集

本专题整合了Golang人工智能相关内容,阅读专题下面的文章了解更多详细内容。

1

2026.01.31

2026赚钱平台入口大全
2026赚钱平台入口大全

2026年最新赚钱平台入口汇总,涵盖任务众包、内容创作、电商运营、技能变现等多类正规渠道,助你轻松开启副业增收之路。阅读专题下面的文章了解更多详细内容。

76

2026.01.31

高干文在线阅读网站大全
高干文在线阅读网站大全

汇集热门1v1高干文免费阅读资源,涵盖都市言情、京味大院、军旅高干等经典题材,情节紧凑、人物鲜明。阅读专题下面的文章了解更多详细内容。

73

2026.01.31

无需付费的漫画app大全
无需付费的漫画app大全

想找真正免费又无套路的漫画App?本合集精选多款永久免费、资源丰富、无广告干扰的优质漫画应用,涵盖国漫、日漫、韩漫及经典老番,满足各类阅读需求。阅读专题下面的文章了解更多详细内容。

67

2026.01.31

漫画免费在线观看地址大全
漫画免费在线观看地址大全

想找免费又资源丰富的漫画网站?本合集精选2025-2026年热门平台,涵盖国漫、日漫、韩漫等多类型作品,支持高清流畅阅读与离线缓存。阅读专题下面的文章了解更多详细内容。

19

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.2万人学习

Git 教程
Git 教程

共21课时 | 3.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号