电子发烧友App

硬声App

0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示
电子发烧友网>电子资料下载>嵌入式开发>嵌入式Linux设备按键驱动程序实例分析

嵌入式Linux设备按键驱动程序实例分析

2017-10-18 | rar | 0.5 MB | 次下载 | 1积分

资料介绍

 11.6 按键驱动程序实例
  11.6.1 按键工作原理
  LED和蜂鸣器是最简单的GPIO的应用,都不需要任何外部输入或控制。按键同样使用GPIO接口,但按键本身需要外部的输入,即在驱动程序中要处理外部中断。按键硬件驱动原理图如图11-7所示。在图11-7的4×4矩阵按键(K1~K16)电路中,使用4个输入/输出端口(EINT0、EINT2、EINT11和EINT19)和4个输出端口(KSCAN0~KSCAN3)。
  嵌入式Linux设备按键驱动程序实例分析
  图11.7 按键驱动电路原理图
  按键驱动电路使用的端口和对应的寄存器如表11-18所示。
  表11.18 按键电路的主要端口
  管 脚端 口输入/输出管 脚端 口输入/输出
  KEYSCAN0GPE11输出EINT0EINIT0/GPF0输入/输出
  KEYSCAN1GPG6输出EINT2EINT2/GPF2输入/输出
  KEYSCAN2GPE13输出EINT11EINT11/GPG3输入/输出
  KEYSCAN3GPG2输出EINT19EINT19/GPG11输入/输出
  因为通常中断端口是比较珍贵且有限的资源,所以在本电路设计中,16个按键复用了4个中断线。那怎么样才能及时而准确地对矩阵按键进行扫描呢?
  某个中断的产生表示,与它所对应的矩阵行的4个按键中,至少有一个按键被按住了。因此可以通过查看产生了哪个中断,来确定在矩阵的哪一行中发生了按键操作(按住或释放)。例如,如果产生了外部2号线中断(EINT2变为低电平),则表示K7、K8、K9和K15中至少有一个按键被按住了。这时候4个EINT端口应该通过GPIO配置寄存器被设置为外部中断端口,而且4个KSCAN端口的输出必须为低电平。
  在确定按键操作所在行的位置之后,我们还得查看按键操作所在列的位置。此时要使用KSCAN端口组,同时将4个EINT端口配置为通用输入端口(而不是中断端口)。在4个KSCAN端口中,轮流将其中某一个端口的输出置为低电平,其他3个端口的输出置为高电平。这样逐列进行扫描,直到按键所在列的KSCAN端口输出为低电平,此时按键操作所在行的EINT管脚的输入端口的值会变成低电平。例如,在确认产生了外部2号中断之后,进行逐列扫描。若发现在KSCAN1为低电平时(其他端口输出均为高电平),GPF2(EINT2管脚的输入端口)变为低电平,则可以断定按键K8被按住了。
  以上的讨论都是在按键的理想状态下进行的,但实际的按键动作会在短时间(几毫秒至几十毫秒)内产生信号抖动。例如,当按键被按下时,其动作就像弹簧的若干次往复运动,将产生几个脉冲信号。一次按键操作将会产生若干次按键中断,从而会产生抖动现象。因此驱动程序中必须要解决去除抖动所产生的毛刺信号的问题。
  11.6.2 按键驱动程序
  首先按键设备相关的数据结构的定义如下所示:
  /* butt_drv.h */
  ……
  typedef struct _st_key_info_matrix /* 按键数据结构 */
  {
  unsigned char key_id; /* 按键ID */
  unsigned int irq_no; /* 对应的中断号 */
  unsigned int irq_gpio_port; /* 对应的中断线的输入端口地址*/
  unsigned int kscan_gpio_port; /* 对应的KSCAN端口地址 */
  } st_key_info_matrix;
  typedef struct _st_key_buffer /* 按键缓冲数据结构 */
  {
  unsigned long jiffy[MAX_KEY_COUNT]; /* 按键时间, 5s以前的铵键作废*/
  unsigned char buf[MAX_KEY_COUNT]; /* 按键缓冲区 */
  unsigned int head,tail; /* 按键缓冲区头和尾 */
  } st_key_buffer;
  ……
  下面是矩阵按键数组的定义,数组元素的信息(一个按键信息)按照0行0列,0行1列,…,3行2列,3行3列的顺序逐行排列。
  static st_key_info_matrix key_info_matrix[MAX_COLUMN][MAX_ROW] =
  {
  {{10, IRQ_EINT0, S3C2410_GPF0, S3C2410_GPE11}, /* 0行0列 */
  {11, IRQ_EINT0, S3C2410_GPF0, S3C2410_GPG6},
  {12, IRQ_EINT0, S3C2410_GPF0, S3C2410_GPE13},
  {16, IRQ_EINT0, S3C2410_GPF0, S3C2410_GPG2}},
  {{7, IRQ_EINT2, S3C2410_GPF2, S3C2410_GPE11}, /* 1行0列 */
  {8, IRQ_EINT2, S3C2410_GPF2, S3C2410_GPG6},
  {9, IRQ_EINT2, S3C2410_GPF2, S3C2410_GPE13},
  {15, IRQ_EINT2, S3C2410_GPF2, S3C2410_GPG2}},
  {{4, IRQ_EINT11, S3C2410_GPG3, S3C2410_GPE11}, /* 2行0列 */
  {5, IRQ_EINT11, S3C2410_GPG3, S3C2410_GPG6},
  {6, IRQ_EINT11, S3C2410_GPG3, S3C2410_GPE13},
  {14, IRQ_EINT11, S3C2410_GPG3, S3C2410_GPG2}},
  {{1, IRQ_EINT19, S3C2410_GPG11, S3C2410_GPE11}, /* 3行0列 */
  {2, IRQ_EINT19, S3C2410_GPG11, S3C2410_GPG6},
  {3, IRQ_EINT19, S3C2410_GPG11, S3C2410_GPE13},
  {13, IRQ_EINT19, S3C2410_GPG11, S3C2410_GPG2}},
  };
  下面是与按键相关的端口的初始化函数。这些函数已经在简单的GPIO字符设备驱动程序里被使用过。此外,set_irq_type()函数用于设定中断线的类型,在本实例中通过该函数将4个中断线的类型配置为下降沿触发式。
下载该资料的人也在下载 下载该资料的人还在阅读
更多 >

评论

查看更多

下载排行

本周

  1. 1TC358743XBG评估板参考手册
  2. 1.36 MB  |  330次下载  |  免费
  3. 2开关电源基础知识
  4. 5.73 MB  |  6次下载  |  免费
  5. 3100W短波放大电路图
  6. 0.05 MB  |  4次下载  |  3 积分
  7. 4嵌入式linux-聊天程序设计
  8. 0.60 MB  |  3次下载  |  免费
  9. 5基于FPGA的光纤通信系统的设计与实现
  10. 0.61 MB  |  2次下载  |  免费
  11. 6基于FPGA的C8051F单片机开发板设计
  12. 0.70 MB  |  2次下载  |  免费
  13. 751单片机窗帘控制器仿真程序
  14. 1.93 MB  |  2次下载  |  免费
  15. 8基于51单片机的RGB调色灯程序仿真
  16. 0.86 MB  |  2次下载  |  免费

本月

  1. 1OrCAD10.5下载OrCAD10.5中文版软件
  2. 0.00 MB  |  234315次下载  |  免费
  3. 2555集成电路应用800例(新编版)
  4. 0.00 MB  |  33564次下载  |  免费
  5. 3接口电路图大全
  6. 未知  |  30323次下载  |  免费
  7. 4开关电源设计实例指南
  8. 未知  |  21548次下载  |  免费
  9. 5电气工程师手册免费下载(新编第二版pdf电子书)
  10. 0.00 MB  |  15349次下载  |  免费
  11. 6数字电路基础pdf(下载)
  12. 未知  |  13750次下载  |  免费
  13. 7电子制作实例集锦 下载
  14. 未知  |  8113次下载  |  免费
  15. 8《LED驱动电路设计》 温德尔著
  16. 0.00 MB  |  6653次下载  |  免费

总榜

  1. 1matlab软件下载入口
  2. 未知  |  935054次下载  |  免费
  3. 2protel99se软件下载(可英文版转中文版)
  4. 78.1 MB  |  537796次下载  |  免费
  5. 3MATLAB 7.1 下载 (含软件介绍)
  6. 未知  |  420026次下载  |  免费
  7. 4OrCAD10.5下载OrCAD10.5中文版软件
  8. 0.00 MB  |  234315次下载  |  免费
  9. 5Altium DXP2002下载入口
  10. 未知  |  233046次下载  |  免费
  11. 6电路仿真软件multisim 10.0免费下载
  12. 340992  |  191185次下载  |  免费
  13. 7十天学会AVR单片机与C语言视频教程 下载
  14. 158M  |  183278次下载  |  免费
  15. 8proe5.0野火版下载(中文版免费下载)
  16. 未知  |  138040次下载  |  免费