三个 sn74hc164级联串联在一起, 串行接收的数据具体是怎么处理的? 如图

基于嵌入式Linux系统的键盘驱动设计
查看: 342|
摘要: 为了适应嵌入式设备外设的多样性,本文以特殊矩阵键盘为例,设计了一套完整的驱动控制模块。硬件电路设计采用外扩3片SN74HC164芯片的方式,节省了GPIO引脚的使用,大大提高了利用效率。同时,在此基础上引出了Linux内核中input子系统的特性和工作机制,呈现了较为完整的输入事件由内核空间传递到用户空间进程的过程。实验结果表明,设计的驱动模块具有良好的实时性和准确性。
& 敬请登录网站在线投稿 2013 年第2 期   21  
基于嵌入式Linux系统的键盘驱动设计
徐德龙,余瑾
(北京邮电大学,北京100876)
摘要:为了适应嵌入式设备外设的多样性,本文以特殊矩阵键盘为例,设计了一套完整的驱动控制模块。硬件电路设计
采用外扩3片SN74HC164芯片的方式,节省了GPIO引脚的使用,大大提高了利用效率。同时,在此基础上引出了
Linux内核中input子系统的特性和工作机制,呈现了较为完整的输入事件由内核空间传递到用户空间进程的过程。实
验结果表明,设计的驱动模块具有良好的实时性和准确性。
关键词:SN74HC164;矩阵键盘;驱动控制模块;Linux内核;input子系统
中图分类号:TP39    文献标识码:A
Keyboard Driver Design Based on Embedded Linux
Xu Delong,Yu Jin
(Beijing University of Posts and Telecommunications,Beijin 100876,China)
Abstract:In order to adapt the diversity of embedded device peripheral,this paper takes special matrix keyboard as an example,and a
complete set of drive control module is designed.Hardware circuit design takes 3expanding SN74HC164chips to save the GPIO pins,
and it greatly improves the utilization efficiency.Meanwhile,on the basis it leads to the characteristics and working mechanism of input
subsystem in Linux kernel,presenting a complete process of input events from kernel space to user space.The experimental results
show that,the driving module has good performance in real-time and accuracy.
Key words:SN74HC164;matrix keyboard;driver control module;Linux kernel;input subsystem
随着微处理器技术的不断发展和数字化产品的普及,
嵌入式系统的研究开发逐渐成为热点,Linux也以其开
源、稳定、可裁剪的优势成为嵌入式操作系统的主流。在
众多的嵌入式系统中,键盘成为一种应用最为广泛的输入
设备。然而,嵌入式设备的功能差异性又决定了为其提供
一种通用性键盘是不可行的,往往需要根据系统的实际功
能设计所需的特殊键盘,并实现相应的驱动程序。
S3C6410是三星公司高性能的32位RISC微处理器,
内部集成了多种强大的硬件加速器,适合进行视频和图像
处理,成为了目前嵌入式处理器领域的主流产品。本文以
在S3C6410微处理器基础上实现一个24键矩阵键盘为
例,呈现了在嵌入式系统中开发设备驱动程序的整体流
程,并对Linux系统下输入事件的底层传递机制进行了研
究和分析。
1 接口电路的设计
在嵌入式设备上扩展键盘的常用方式是通过对CPU
的GPIO端口进行扫描实现的,显然这种方式在键盘按键
数目较多的情况下,会占用过多的GPIO 资源,增加了
GPIO端口资源较为紧张的嵌入式处理器的负担。
本系统的硬件设计通过增加3片SN74HC164芯片
来达到节约GPIO资源的目的。SN74HC164是一种8位
的串行输入、并行输出移位寄存器,它的内部由8个D触
发器串联而成。每当时钟信号由低电平变为高电平时,两
个输入端将当前输入信号传送到并行输出端,并实现移位
操作。系统硬件原理图如图1所示。
3个SN74HC164芯片串联后,将它们的CLK引脚接
到S3C6410开发板的GPE4端口上。第一个SN74HC164
芯片的A、B输入引脚共同接到开发板的GPE3端口上,
并且将这两个GPIO端口配置成输出模式。GPE2端口与
键盘按键的上拉端连接,系统运行时在中断模式和输入模
式之间切换,以达到触发中断和对键盘扫描的目的。这样
我们就借助于3个SN74HC164移位寄存器,只占用3个
GPIO端口,给扫描键盘的24个按键提供输入信号,既节
约了成本,又避免了GPIO资源的浪费。
22  Microcontrollers &Embedded Systems  2013 年第2 期www.mesnet.com.cn 
图1 硬件原理图
2 扫描工作原理
扩展硬件电路的同时给键盘驱动程序的实现带来了
一定的麻烦,驱动程序首先要将SN74HC164驱动起来,
然后才能对电路进行控制。该电路的输出引脚被接到
S3C6410的GPE2端口上,并且这个端口被配置成中断
源,无键按下时直接读为高电位。键盘扫描时通过
SN74HC164芯片先将键盘的24个键置低电平,任何一个
键被按下,GPE2端口就会有从高电平到低电平的跳变,
从而触发一次中断。
在中断处理过程中,将GPE2端口置为输入状态。然
后根据SN74HC164芯片的输入/输出特性,给串联的3
个SN74HC164芯片发送24个高电平信号,使得键盘的
各键位均为高电平。在随后的24 个时钟脉冲下,给
SN74HC164芯片送入1个0和23个1,使得0在每个键
位的输入端都只出现一次,同时在GPE2端口进行扫描。
当被按下键处于0输入状态时,其所在行就会读到一个低
电平,也就可以确定出键盘上哪个键被按下了。
3 驱动模块结构
在Linux2.6的版本中新加入了input子系统,给驱动
编写者提供了一个完整的输入事件———从底层设备传递
到用户进程的模型。本文基于input子系统架构,设计了
一个较为完善的特殊键盘驱动模块。键盘驱动模块结构
如图2所示。
图2 键盘驱动模块结构
在input子系统的设备内核模型中,最重要的数据结
构体是struct input_dev,作为驱动的主体,每个struct
input_dev代表一个输入设备。该结构体中既包含了设备
所能响应的输入事件类型、响应按键种类、键盘码表,以及
坐标范围等字段,同时还包含了设备打开、关闭以及回调
函数等字段,能够完整地记录和标识整个设备的功能与行
为。在向内核注册input_dev之前,需要进行input_dev结
构的初始化,同时向内核申请键盘中断。
首先设置输入设备的功能,input_set_capability
(&sim_key,EV_KEY,KEY_A)函数完成键盘A键的输
入使能,类似可完成B~X共24个按键的输入使能。然
后设置键盘的码表。该键盘包含20个按键,码表可表示
为:static unsigned char sim_keycode[24]={KEY_A,
KEY_B,KEY_C,KEY_D,KEY_E,KEY_F,KEY_G,
KEY_H,KEY_I,KEY_J,KEY_K,KEY_L,KEY_M,
KEY_N,KEY_O,KEY_P,KEY_Q,KEY_R,KEY_S,
KEY_T,KEY_U,KEY_V,KEY_W,KEY_X}。当相应
键按下时,码表中的键值将被作为键盘码上报到用户空间
的进程。初始化工作完成之后,调用函数input_register_
device(&sim_kb)向内核注册输入设备。
由于键盘设备的输入是异步的,可能会在任何时间得
到按键事件,所以需向内核申请中断以保证对键盘输入的
实时响应。中断函数完成键盘的扫描操作,并上报输入事
件到用户进程,是整个驱动模块的功能主体。然而使用中
断会遇到一个问题,在键盘的扫描过程中,按键的每次按
下和抬起都会有10~20ms的毛刺抖动存在,会将用户的
一次按键操作误当作几次按键来处理。所以为了获取稳
定的按键信息,必须要想办法去掉这种抖动。去毛刺的一
种常见的方法是在注册输入设备时定义一个定时器timer,
当触发中断时先关闭I/O中断,然后启动定时器,等跳过
毛刺抖动以后再去调用扫描程序得到键值,并重新打开中
断。按键事件被发送到input子系统核心后通知给用户
进程,从而实现查键过程。
4 基于input子系统的事件传递机制
实现底层驱动程序与用户进程通信的最主要的函数
 敬请登录网站在线投稿 2013 年第2 期   23  
是input_event(struct input_dev*dev,unsigned int type,
unsigned int code,int value),也是input输入子系统的核
心,其实现机制如下。
Linux系统在启动过程中会向系统核心注册input_
handler,一般将其称为handler处理器,表示对输入事件
的具体处理,input_handler为输入设备的功能实现了一个
接口。在执行input_register_device注册输入设备的时
候,会自动将input_dev结构与系统中已注册的input_
handler进行遍历匹配。与对应的input_handler成功匹配
后,Linux内核自动创建evdev结构体来表示输入事件设
备,该结构中包含了input_handle等字段,作为连接input
_dev与input_handler的媒介。其中Linux内核中与键盘
设备匹配的input_handler代码为:
static struct input_handler evdev_handler={
.event=evdev_event,
.connect=evdev_connect,
.disconnect=evdev_disconnect,
.fops=&evdev_fops,
.minor=EVDEV_MINOR_BASE,
.name="evdev",
.id_table=evdev_ids,
evdev_event函数为事件处理函数,输入设备所上报
的事件通过evdev_handler中的evdev_event函数包装成
input_event标准输入格式,并存放在evdev下的evdev_
list缓冲区中,该结构代码如下:
struct input_event{
struct timeval time; //事件发生的时间
__u16type; //事件类型
__u16code; //子事件
__s32value; //事件发生的相关值
用户进程读取键盘事件时即会按照此种特定格式进
行。值得注意的是,当读取事件为鼠标输入时,需要先后
读取X轴坐标和Y轴坐标两种数据,以完成完整的读取
在Linux系统中,所有的外设都是通过虚拟文件系统
向应用程序提供接口,所以每个具有独立功能的外设在
Linux系统中都对应着相应的设备文件。同时,在内核中
代表设备文件的结构体包含了实现该设备功能的特定操
完成驱动模块的安装之后,Linux系统会在/dev目录
下自动创建输入事件设备文件,本文中该设备名为
event0。用户进程打开对应的输入事件设备文件event0,
即可执行相应的文件操作,如read、ioctl等。文件操作函
数最终要进入内核,并调用存储在事件设备结构体中的
evdev_handler.evdev_fops操作函数集完成对应的文件
static struct file_operations evdev_fops= {
.owner=THIS_MODULE,
.read=evdev_read,
.write=evdev_write,
.poll=evdev_poll,
.open=evdev_open,
.release=evdev_release,
.unlocked_ioctl=evdev_ioctl,
.compat_ioctl=evdev_ioctl_compat,
.fasync=evdev_fasync,
.flush=evdev_flush
例如用户进程在执行read操作时,会调用内核中
evdev_fops->evdev_read函数,先判断当前输入事件设
备缓冲区中是否有待读取的input_event事件。若缓冲区
中无按键事件,进程则放入等待队列进行睡眠,直到有按
键事件产生并保存到缓冲区后,将睡眠进程唤醒,调用
copy_to_user复制函数完成输入事件从内核空间到用户
空间的拷贝,从而实现读取操作。
通过以上分析可以得出,键盘设备所产生的输入事件
以input子系统为传递介质,并通过虚拟文件系统接口得
以通知用户进程。本文从键盘的驱动开发出发,呈现了较
为完整的输入事件由内核空间传递到用户空间进程的过
程,对于驱动开发者了解底层驱动的机制和更加有效地设
计驱动模块有着较为重要的意义。经过测试,该键盘具有
良好的响应特性,并实现了所预期的功能。
[1]吴金华,李驹光.基于ARM9的多行列键盘设计及其驱动实
现[J].微计算机信息,2008,24(2):123 126.
[2]何永琪.嵌入式Linux系统实用开发[M].北京:电子工业出
版社,2010.
[3]阴晓峰,葛安林.Linux环境下设备驱动模型及开发技术
[J].计算机工程与应用,2009,38(8):104 109.
[4]倪继利.Linux内核分析及编程[M].北京:电子工业出版
社,2007.
[5]Robert Love.Linux Kernel Development[M].北京:机械工
业出版社,2006.
(责任编辑:杨迪娜 收稿日期:2012-10-23)】优领域
Copyright &君,已阅读到文档的结尾了呢~~
SN74HC164N 说明书说明书,8,◆
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
SN74HC164N 说明书
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口74HC164 SN74HC164
测试座 编程座
(点击图片看大图)
技术资料——
SN74HC164 概述
74HC164 8位移位寄存器特有与门控串行输入和一个异步的清零(CLR)输入。该门控串行(A和B)输入可完全控制输入数据;在任一端输入低电平,可以阻止新数据输入,并在下个时钟(CLK)脉冲把首个触发器复位为低电平。而在任一端输入高电平则会使能另一端,使另一端决定首个触发器的状态。74HC164的CLK处于高电平或低电平状态时,串行输入上的数据可以更改,但只有建立时间满足最小需求的信息才会被输入。74HC164计时发生在CLK的上升沿。
SN74HC164 参数
74HC164 主要参数
2.0~6.0 V
最大传输延迟
74HC164 其他特性
74HC164 封装与引脚
PDIP14, SOIC14, SOP14, TSSOP14
SN74HC164 特性
宽工作电压范围:2.0~6.0 V
输出驱动能力高达10个LSTTL负载
低功耗,最大ICC 80μA
典型tpd = 20 ns
5 V下驱动电流为±4 mA
低输入电流,最大1μA
与门控(使能/禁用)串行输入
全缓冲时钟和串行输入供应 SN74HC164D 原装进口NXP 八位串行入/并列输出移位寄存器
最近被加入的企业
名片夹还没有企业信息,赶紧查看企业联系方式加入吧!
『深圳市航东科技有限公司』的联系方式为755-, 755 ,联系人:蔡忠钟 &nbsp
品牌/型号:NXP/74HC164D类型:逻辑IC品牌:NXP型号:74HC164D功率:标准针脚数:SOP-14用途:仪器封装:SOP-14
以上是供应 SN74HC164D 原装进口NXP 八位串行入/并列输出移位寄存器的详细介绍,包括供应 SN74HC164D 原装进口NXP 八位串行入/并列输出移位寄存器的价格、型号、图片、厂家等信息!
'温馨提示:因为本店IC型号比较多,没办法一一打上详细的价格,而价格也会随市场行情随时变动,没办法每天进行 更改,所以网上标的价格不作为双方买卖价格,仅供各位买家的参考,详情请咨询我们销售人员, 数量越多价格就越优惠, 请与我们联系!深圳市...
商机库包括所有采购、招标信息的汇总
与供应 SN74HC164D 原装进口NXP 八位串行入/并列输出移位寄存器相关的产品信息
供应 SN74HC164D 原装进口NXP 八位串行入/并列输出移位寄存器产品相关搜索
最新集成电路/IC产品
按排行字母分类:
我需要采购集成电路/IC,请供应商联系我....
马可波罗&&全心服务
联系电话:*
允许同品类其他优质供应商联系我
联系电话:

我要回帖

更多关于 74hc164驱动数码管 的文章

 

随机推荐