定时器可以在中断里处理抖动
比如按键中断里,按键参数会进行跳变,所以要等待数值的稳定时候,才进行上报
我们可以把数值设置的大一点,模仿机械跳变,这样就可以看得出来,定时器真的被使用了
驱动编写
给每个按键提供定时器
在结构体里放入定时器
初始化定时器
1.给每个定时器设置,触发函数,并且为出发的函数提供数据
setup_timer(&buttons[i].timer, x6818_buttons_timer,(unsigned long)&buttons[i]);
2. 设置第一次的定时器超时时间
3. 把定时器进行添加
定时器函数编写
当到时间就可以触发定时器了,在里面进行按键的读取
触发定时器
我们在中断函数里触发定时器,所以先触发中断函数
中断函数里,设置超时时间,要是一直按就会延长超时时间,直到没有中断产生,才会触发定时器
这里设置了 HZ/5 = 1s/5 200ms 的延时,我们只要按的快,就不会读取值,为了测试定时器有没有用
测试结果
按的快就当作抖动消掉,还是不错的
源码
button_drv.ko
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/poll.h>
#include <linux/sched.h>
#include <linux/irq.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <linux/interrupt.h>
#include <asm/uaccess.h>
#include <linux/platform_device.h>
#include <linux/cdev.h>
#include <linux/miscdevice.h>
#include <linux/gpio.h>
#include <asm/mach-types.h>
#include <asm/gpio.h>
#include <asm/delay.h>
#include <mach/gpio.h>
#include <mach/soc.h>
#include <mach/platform.h>
#define DEVICE_NAME "gecBt" //设备名字
//按键结构体
struct button_desc {
int gpio;
int number;
char *name;
struct timer_list timer;
};
//按键的管脚,编号,名字
static struct button_desc buttons[] = {
{
(PAD_GPIO_B + 9 ), 0, "KEY0" },//B9
{
(PAD_GPIO_A + 28), 1, "KEY1" },//A28
{
(PAD_GPIO_B + 30), 2, "KEY2" },//volup//B30
{
(