按键映射_4.查询方式来写按键驱动程序(详解)

本节目标:

写second程序,内容:通过查询方式驱动按键

1.写出框架

1.1写file_oprations结构体,second_drv_open函数,second_drv_read函数

1.2写入口函数,并自动创建设备节点,修饰入口函数

1.3写出口函数,并自动注销设备节点,修饰出口函数

1.4 写MODULE_LICENSE(“GPL v2”)声明函数许可证

1.5 在入口函数中,利用class_create和class_device_create自动创建设备节点

在出口函数中,利用class_destroy和class_device_unregister注销设备节点

2.写Makefile并编译后,放在板子上insmod后,看看lsmod、cat /porc/devices、 ls -l /dev/second是否加载成功,如下图:

88ed25d12763594aa4076c257abbb254.png

3.在框架中实现硬件操作

3.1看原理图,确定用什么寄存器控制按键引脚,如下图

f30280b915298089af3ebd797bd787ab.png

按键0~3分别是GPF0,GPF2,GPG3,GPG11

由于是使用查询模式,并不是外部中断模式

所以配置 GPFCON(0x56000050)的位[0:1]、位[4:5]等于0x00(输入模式)

GPGCON(0x56000060)的位[6:7]、位[22:23]等于0x00

通过GPGDAT (0x56000054) 和GPGDAT(0x56000064)来查询按键状态

3.2写代码

init入口函数中使用ioremap()函数映射寄存器虚拟地址

exit出口函数中使用iounmap()函数注销虚拟地址

open函数中配置GPxCON初始化按键

read函数中先检查读出的字符是否是4个,然后获取GPxDAT状态,用key_vals[4]数组保存4个按键值,最后使用 copy_to_user(buf, key_vals,sizeof(key_vals)) 上传给用户层

4.写测试程序Secondtext.c

用法就是./ Secondtext

使用read(fd,val,sizeof(val));函数读取内核层的数据

5.然后输入./ Secondtext进行测试,按下key2时,如下图:

66733620f460b57ca6ef66d2af2c7beb.png

6.使用./ Secondtext & 后台运行测试程序

后台会一直运行这个程序,当我们有按键按下时,就会打印数据出来,如下图:

d7467e158d77821cfe585cbe8ebdfdcb.png

7.通过top命令可以发现这个./ Secondtext占了CPU的99%时间

f4df0b6fa6a95eee2b153915547aa98f.png

因为,我们的Secondtext测试程序一直在while中通过查询方式读取按键状态,这样的效率是非常低的.

接下来开始使用中断方式来改进按键驱动程序,提高效率,先来分析内核里中断如何运行的。

本节Secondtext测试程序代码如下:

#include  //调用sys目录下types.h文件#include  //stat.h获取文件属性#include #include #include /*secondtext while一直获取按键信息 */int main(int argc,char **argv){ int fd,ret; unsigned char val[4]; fd=open("/dev/buttons
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值