linux 按键驱动中断 rockchip_Linux按键驱动程序——查询方式

无论在规模庞大的大型系统中,抑或是功能简单的小型系统中,按键都是出现频率最高的模块之一,很大的原因在于它作为人机交互较为容易实现,成本也相对较低,所以不管是从学习的角度还是实用的角度来看,按键驱动都是需要我们牢牢掌握的。

首先,驱动的主要框架如下:

  1. 写file_oprations结构体,key_drv_open函数,key_drv_read函数;
  2. 写入口函数,并自动创建设备节点,修饰入口函数;
  3. 写出口函数,并自动注销设备节点,修饰出口函数;
  4. 在入口函数中,利用class_create和class_device_create自动创建设备节点;
  5. 在出口函数中,利用class_destroy和class_device_unregister注销设备节点;
  6. 写声明许可证;

所需要的具体硬件操作

看原理图确定按键与哪个IO引脚相连,以我的硬件来看四个按键分别接在GPF0,GPF2,GPG3和GPG11。这里要说明一点:由于是使用查询模式,并不是外部中断模式,所以配置IO引脚的控制寄存器GPFCON的位[0:1]、位[4:5]为0x00,GPGCON的位[6:7]、位[22:23]为0x00,也就是将其配置为输入模式,然后通过IO引脚的数据寄存器GPFDAT和GPGDAT来查询按键的状态。

写代码

  • 写open函数,read函数和file_oprations结构体
3f3c28031b9113529925073ef49f8598.png

open函数和read函数

3128def7821b9b01541f224113c211d3.png

file_oprations

open函数中配置引脚的控制寄存器GPxCON初始化按键,read函数中先检查读出的字符是否是4个,然后获取引脚的数据寄存器GPxDAT中的引脚状态,用key_vals[4]数组保存4个按键值,最后使用 copy_to_user(buf,key_vals,sizeof(key_vals)) 上传给用户应用层。

  • 写入口函数,并自动创建设备节点
52ea181c5eab30abba678edae162bcbb.png

模块入口函数

init入口函数中使用ioremap()函数映射寄存器的虚拟地址,在入口函数中,利用class_create和class_device_create自动创建设备节点。

  • 写出口函数,并自动注销相关资源
400cee5ccfe287c1b37844428157a5e5.png

模块出口函数

exit出口函数中使用iounmap()函数注销虚拟地址,并调用class_destroy和class_device_unregister注销设备节点。

写声明许可证
7e523c0a9d16e86982f6e9c302133b53.png

修改Makefile并编译,开机后使用命令insmod,lsmod、cat /porc/devices、 ls -l /dev/key是否加载成功

写用于测试的应用程序

72b78b02ae21eaf5fd5ca018af9466dc.png

应用程序

实现的效果为:运行该测试程序,当按下按键key1时,就会在控制台打印出四个按键IO的状态信息,依次为0,1,1,1;同理,如果按下key2时,就会在控制台打印出四个按键IO的状态信息依次为1,0,1,1

性能分析

最后,通过top命令可以知道这个应用程序占用了CPU 99%的时间,这是因为测试程序一直在while(1)中通过查询方式读取按键状态,这样查询的效率其实是非常低的。另外说一句:我们不能就此简单的判定轮询方式和中断方式的孰优孰略,在此处看轮询的效率确实是比较低的,轮询是CPU主动去查询该设备是否有请求,而中断是CPU处于被动状态下来接受设备的信号。凡事都具有两面性,所以我们看效率不能简单的说哪个效率高,如果请求设备是一个频繁请求cpu的设备,或者有大量数据请求的网络设备,那么轮询的效率会比中断高;而如果设备只是一般的普通设备,并且该设备请求cpu的频率比较低,那么使用中断效率会高一些。总结为:主要是看请求的频率

所以对于按键驱动来说,使用中断相对于轮询是更具效率的一种方式,下一篇文章将使用中断方式来改进按键驱动程序,提高效率。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值