tiny6410按键驱动程序2.0(利用中断和定时器去抖)

在1.0的基础上加了队列操作和定时器按键去抖功能,按下K1时不会出现多次输出的情况,

按一下输出一次key down。

修改程序如下:

#include
#include
#include //用来定义miscdevice结构
#include //与中断相关的
#include //与ioremap相关
#include //与file_operations相关
#include //kmalloc的头文件

#define GPNCON 0x7F008830
#define GPNDAT 0x7F008834

struct work_struct *work1;

struct timer_list key_timer;

unsigned int *gpio_data;

void work1_func(struct work_struct *work)
{
 mod_timer(&key_timer,jiffies +HZ/10);//jiffies表示当前的时间,HZ表示1秒
}

//定时超时函数
void key_timer_func(unsigned long data)
{
 unsigned int key_val;
 key_val = readw(gpio_data) &0x01;
 if(key_val == 0)
  printk("key down!\n");
}

//中断处理函数
irqreturn_t key_int(int irq,void *dev_id)
{
 //1.检测是否发生按键中断
 
 //2.清除已经发生的按键中断
 
 //3.提交下半部(利用工作队列)
 schedule_work(work1);
  
 return 0;
}

 

void key_hw_init()
{
 unsigned int *gpio_config;
 
 unsigned short data;
 
 gpio_config = ioremap(GPNCON,4);//物理地址转化成虚拟地址
 data = readw(gpio_config);
 data &= ~0b11;//清0
 data |= 0b10;//设置中断
 writew(data,gpio_config);
 
 gpio_data = ioremap(GPNDAT,4);
  
}

int key_open (struct inode *node,struct file *filp)
{
 
 return 0;
}

struct file_operations key_fops = {
 .open = key_open,
 
};

struct miscdevice key_miscdev = {
 .minor = 200,
 .name = "key",
 .fops = &key_fops,
};

static int button_init()
{
 misc_register(&key_miscdev);
 
 //按键初始化
 key_hw_init();//hw:hardware
 
 //注册中断处理程序
 request_irq(IRQ_EINT(0),key_int,IRQF_TRIGGER_FALLING ,"key",0);//IRQF_TRIGGER_FALLING:表示高电平到低电平产生中断,即按键按下产生中断
 
 //工作初始化
 work1 = kmalloc(sizeof(struct work_struct),GFP_KERNEL);//分配空间
 INIT_WORK(work1,work1_func);
 
 //2.1初始化定时器
 init_timer(&key_timer);
 
 //2.2设置超时函数
 key_timer.function = key_timer_func;
 
 //注册定时器
 add_timer(&key_timer);
  
 return 0;
}

static void button_exit()
{
 misc_deregister(&key_miscdev);
 
 //注销中断处理程序
 //free_irq(IRQ_EINT(0),0);
 
}

module_init(button_init);
module_exit(button_exit);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值