按键驱动程序之查询方式的总结

按键驱动程序和led驱动程序相似,框架都是一样的。

file_operations中定义
static struct file_operations second_drv_fops = {
.owner = THIS_MODULE,
.open = second_drv_open,
.read = second_drv_read,
};

而这个程序使用的是查询方式,所以要把引脚配置为输入模式。看了原理图可以知道,三个按键分别对应GPIOG5、6、7pin,当按键按下的时候是低电平。所以要设置的寄存器就是gpgcon,还要读取gpgdat的数据。

在second_drv_open()函数中实现按键的配置,配置为输入模式,需要往寄存器里写00:
*gpgcon &= ~((0x3<<(5*2)) | (0x3<<(6*2)) | (0x3<<(7*2)));

还要在second_drv_read()函数里读取gpgdat的值。我认为这才是这个驱动程序的核心。由于是3个按键,因此要unsigned char key_value[3];int valkey = *gpgdat;这样我们就定义了一个长度为3的数组,传递的时候把数组的地址传给应用程序就可以了。那如何取出寄存器某一位的值呢?比如pin5,我们可以valkey & (1<<5),如果结果为0,则第5位的值就为0。因此有
key_value[0] = (valkey & (1<<5)) ? 1 : 0;
同理有:
key_value[1] = (valkey & (1<<6)) ? 1 : 0;
key_value[2] = (valkey & (1<<7)) ? 1 : 0;

这样,我们就完成了对按键值的保存。接下来就是拷贝到应用程序了,需要用到copy_to_user(buff,key_value, sizeof(key_value));这样,整个驱动程序就完成了。

还要注意,应在second_drv_init()和second_drv_exit()完成对地址的重映射和解除。

接下来就是测试程序了:

int fd;
int cnt=0;
unsigned char key_values[3];//定义一个储存按键值的数组
fd = open(“/dev/buttons”, O_RDWR);
if (fd < 0)
printf(“can’t open\n”);
while(1){
read(fd, key_values, sizeof(key_values));
//一旦有任何一个按键被按下就打印
if(!key_values[0] || !key_values[1] || !key_values[2]){
printf(“%d %d %d %d \n”,cnt++,key_values[0],key_values[1],key_values[2]);
}
}

如此,这个测试程序就完结了。

但是在执行之后可以看到,一旦按下按键就会打印出很多个信息,并且后台运行,输入top命令可以看到这个程序占用了CPU 99%的资源,是有缺陷的,因此又引出了下一节,用中断方式的按键驱动程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值