本节目标:
写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是否加载成功,如下图:
3.在框架中实现硬件操作
3.1看原理图,确定用什么寄存器控制按键引脚,如下图
按键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时,如下图:
6.使用./ Secondtext & 后台运行测试程序
后台会一直运行这个程序,当我们有按键按下时,就会打印数据出来,如下图:
7.通过top命令可以发现这个./ Secondtext占了CPU的99%时间
因为,我们的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