button_irqs [] ={ {IRQ_EINT8,S3C2410_GPG0,S3C2410_GPG0_EINT8, 0,“R1″},

{IRQ_EINT9,S3C2410_GPG1,S3C2410_GPG1_EINT9, 1,”R2″},

…}。//中断号(irq),引脚(pin),引脚设置,序号,名称

矩阵键盘是作为Linux的一个字符设备注册到系统中的。我们首先向系统注册矩阵键盘设备,包括设备号,设备名及file_operations结构体;file_operations结构体的成员函数是字符设备驱动程序设计的主体内容,这些函数实际会在应用程序进行Linux的open()、write()、read()、close()等系统调用时最终被调用[3]。用户对键盘没有写操作,其file_operations结构体的成员函数为open()、read()、close()、poll()。

中断的注册和行列初始化在打开键盘时(即open()函数中)实现。注册中断包括:中断号,中断入口程序,中断方式,中断名和代号。关键语句为:request_irq(button_irqs[i].irq,buttons_interrupt,IRQ_TYPE_EDGE_FALLING,button_irqs[i].name,(void*)&button_irqs[i])。IRQ_TYPE_EDGE_FALLING意思为下降沿触发。然后再进行行列初始化:设置行线为中断,使能上拉,在linux中其表达方式为:

s3c2410_gpio_cfgpin(button_irqs[i]。

pin,S3C2410_GPIO_SFN2); //设置第i行引脚为中断

s3c2410_gpio_pullup(button_irqs[i]。

pin,1); //第i行引脚上拉

设置列线为输出,置低电平。语句表达同理,由于篇幅所限,这里不再一一列出。

read()函数实现从设备中读取数据。该函数实现无按键按下时程序进入休眠,关键代码:

static DECLARE_WAIT_QUEUE_HEAD(button_waitq); //生成一个等待队列头队列,名为button_waitq

static volatile int ev_press = 0;//置1,表示有键按下

ev_press为0时执行语句:wait_event_interruptible(button_waitq,ev_press),程序即进入休眠。ev_press为1时把数据从内核空间复制到用户空间,关键语句:

copy_to_user(buff,(const void *)key_values,min(sizeof(key_values),count));//buff为用户空间的指针,key_values为内核空间指针,最后一个参数为从内核空间向用户空间拷贝数据的字节数,我们取实际大小与用户指定大小中的最小值。数据复制成功时返回零;出错时返回没有复制成功的数据字节数。

close()函数实现关闭矩阵键盘设备,释放已注册的中断,关键语句:free_irq(button_irqs[i].irq,(void *)&button_irqs[i])。

Poll()函数实现轮询,如果没有按键数据,调用linux的poll_wait函数等待;如果有按键数据,则select函数会立刻返回。

矩形键盘 linux,基于ARM的矩阵键盘设计及其linux驱动实现相关推荐

  1. 基于8086简易电子琴系统仿真设计-基于8086红外自动门控制系统设计-基于单片机8x8矩阵键盘两机串口通信-基于单片机8层电梯控制系统仿真设计-基于单片机ADC0809和DAC0832模数和数模设计

    1189基于8086简易电子琴系统仿真设计-设计资料 编写一实现电子琴的程序,并实现若干扩展功能. 基本功能:用键盘输入对应的七个音阶,通过实验箱的喇叭发出声音,并通过七段数码管显示输入音阶: 扩展功 ...

  2. 实验六 键盘扫描显示实验(矩阵键盘)

    实验六 键盘扫描显示实验(矩阵键盘) 一.实验要求 在上一个实验的基础上,利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显示实验,把按键输入的键码在八位数码管上显示出来. 实验程序可分成 ...

  3. 矩阵键盘+CH559制作国产USB矩阵键盘

    矩阵键盘+CH559制作国产USB矩阵键盘 文章目录 矩阵键盘+CH559制作国产USB矩阵键盘 为什么选择CH559作为主控芯片? 如何实现该款矩阵USB键盘? 如何将矩阵键盘的信号转化为USB键盘 ...

  4. Linux之ARM(IMX6U)裸机汇编LED驱动实验--烧写bin文件到SD卡中并运行

    Linux之ARM(IMX6U)裸机汇编LED驱动实验--烧写bin文件到SD卡中并运行 代码烧写 2.烧写的工具 2.把生成的将 imxdownload 放在工程目录下(led.bin同一个文件夹下 ...

  5. Linux之ARM(IMX6U)裸机汇编LED驱动实验--编译驱动

    Linux之ARM(IMX6U)裸机汇编LED驱动实验--编译驱动 前言 编译代码 1.把 .s 文件编译成 .o文件 2.把 .o文件编译成连接文件 .elf 3.arm-linux-gnueabi ...

  6. Linux系统运维与架构设计之Linux概述

    Linux系统运维与架构设计之Linux概述 Linux系统运维与架构设计 1.1 浅谈计算机系统 1.1.1 计算机硬件系统 现代计算机是基于冯·诺依曼体系结构,由运算器.控制器.存储器.输入设备. ...

  7. ARM开发(4)基于STM32的矩阵键盘按键控制TM1629A LED显示

    一 矩阵键盘按键控制TM1629ALED显示原理: 1.1 本实验实现矩阵键盘按键控制TM1629ALED显示1.2 实验思路:共阴极数码管,掌握数码管段选位选原理 熟悉TM1629A芯片手册1.3 ...

  8. 41 linux标准输入设备之矩阵键盘驱动的实现

    准备知识点: 原子位操作 , linux输入设备的应用程序编程 在linux内核里用struct input_dev的一个对象来表示一个输入设备. 用一位二进制表示是否支持相应的功能, 多种功能需要多 ...

  9. c51单片机矩阵键盘1602计算器_基于51单片机矩阵键盘的简易计算器制作

    1. 运算过程.符号公式实时显示在显示屏上(I2C 1602). 2. 自带三角函数.开根号.平方运算. 3. 计算得出的结果可设置保存并用以下一次计算. 4. 所有运算结果精确到至少小数点后两位. ...

最新文章

  1. [JLOI2011]飞行路线
  2. 根据Word表格自动生成SQL数据库脚本的VBScript代码
  3. png 微软ppt 透明度_用5个技巧教你做出让人眼前一亮的「PPT章节页」,一看就会...
  4. 【Win 10 应用开发】文件读写的三种方案
  5. DEV C++如何不需要通过建项目可以调试程序
  6. 动态改变eachers图表高_让你的Excel图表动起来
  7. 使用EfficientNet深度学习模型对植物叶病进行分类
  8. iOS 时间校准解决方案
  9. java二进制文件转xml_简单Java类与XML之间的转换
  10. 基于JavaWeb的幼儿园信息管理
  11. 微擎-人人商城接入Facebook授权登录
  12. vega56刷64_Vega56显卡怎么刷Bios VEGA56显卡刷Vega64方法
  13. 非平衡电桥电阻计算_用非平衡电桥如何测量电阻_非平衡电桥测量电阻详解
  14. 飞鱼星路由器如何限制外网访问服务器网站,飞鱼星路由器指定ip/mac禁止上网设置教程...
  15. Taro 3.x 开发 APP 记录 (持续记录中。。。)
  16. SQL:简单查询语句操作实例
  17. jlink怎么调试linux程序_【转】ubuntu linux下openocd + gdb-insight 用Jlink调试arm程序
  18. 服务器取证——服务器基础知识
  19. x265 码率控制算法(一)CQP
  20. html如何上下滚动字幕,css如何做滚动字幕效果?

热门文章

  1. HYSBZ 1734 二分
  2. mysql中生成列与JSON类型的索引
  3. 201671010119 2016-2017-2《Java程序设计》第十四周学习心得
  4. 微信支付官方SDK V3 .NET版的坑
  5. Eclipse启动jboss局域网无法访问的问题
  6. Eclipse Pydev 技巧汇编
  7. chajian8.com谈:SyntaxHighlighter 代码高亮
  8. VBA学习过程中遇到的问题(主要针对Excel)
  9. Android多种样式的进度条
  10. Android中数据的存储操作