基于中断的按键驱动以及其测试程序

原创 2017年02月28日 10:46:45

驱动程序如下

#include <linux/device.h>

#include <linux/interrupt.h>

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/fs.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/irq.h>
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
#include <mach/gpio.h>
#include<linux/cdev.h>
 
int key_id;
struct cdev cdev;
dev_t devno;
/*等待队列头*/
wait_queue_head_t key_q;
/*中断事件标志,中断服务程序将它置为1,read函数将它置为0*/
unsigned int key_num=0;
#define DRIVER_NAME "my_key_driver"
struct class *my_class;

static irqreturn_t key_func(int irq,void *dev_id)
{
key_id=(int)dev_id;


/*唤醒*/
key_num=1;
wake_up(&key_q);




return 0;
}


static int key_open(struct inode *inode,struct file *file)
{


request_irq(IRQ_EINT(16),key_func,IRQF_TRIGGER_FALLING,"k1",1);
request_irq(IRQ_EINT(17),key_func,IRQF_TRIGGER_FALLING,"k2",2);
request_irq(IRQ_EINT(18),key_func,IRQF_TRIGGER_FALLING,"k3",3);
request_irq(IRQ_EINT(19),key_func,IRQF_TRIGGER_FALLING,"k4",4);
request_irq(IRQ_EINT(24),key_func,IRQF_TRIGGER_FALLING,"k5",5);
request_irq(IRQ_EINT(25),key_func,IRQF_TRIGGER_FALLING,"k6",6);
request_irq(IRQ_EINT(26),key_func,IRQF_TRIGGER_FALLING,"k7",7);
request_irq(IRQ_EINT(27),key_func,IRQF_TRIGGER_FALLING,"k8",8);
return 0;
}


static int key_close(struct inode *inode,struct file *file)
{


free_irq(IRQ_EINT(16),1);
free_irq(IRQ_EINT(17),2);
free_irq(IRQ_EINT(18),3);
free_irq(IRQ_EINT(19),4);
free_irq(IRQ_EINT(24),5);
free_irq(IRQ_EINT(25),6);
free_irq(IRQ_EINT(26),7);
free_irq(IRQ_EINT(27),8);


return 0;
}


ssize_t key_read(struct file *filp, char __user *buf, size_t size,loff_t *pos)
{
/*如果没有按键按下,休眠,让出CPU*/
wait_event(key_q,key_num);
/*如果有按键按下*/
copy_to_user(buf,&key_id,sizeof(key_id)); 
key_num=0;


return 0;
}




static struct file_operations key_fops =
{
.owner = THIS_MODULE,
.open = key_open,
.release = key_close,
.read=key_read,
};




static int __init key_interrupt_init(void)
{
cdev_init(&cdev,&key_fops);
alloc_chrdev_region(&devno, 0 , 1 , "mykey_interrupt");
cdev_add(&cdev, devno, 1);
my_class = class_create(THIS_MODULE, "key_interrupt_class");
if(IS_ERR(my_class))
{
printk("Err: failed in creating class.\n");
return -1;
}
device_create(my_class, NULL, devno,NULL,"key_interrput_driver");
init_waitqueue_head(&key_q);
return 0;
}


static void key_interrupt_exit(void)
{
device_destroy(my_class,devno);
class_destroy(my_class);
cdev_del(&cdev);
unregister_chrdev_region(devno,1);
}


module_init(key_interrupt_init);
module_exit(key_interrupt_exit);
MODULE_LICENSE("GPL");

MODULE_AUTHOR("EIGHT_FIVE");


测试程序如下

#include<stdio.h>
#include<sys/ioctl.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>


int main(int argv,char **argc)
{
int fd,buf;
fd=open("/dev/key_interrput_driver",0x666);


while(1)
{


read(fd,&buf,4);
printf("key_val =%d\n",buf);
}
return 0;


}



2440 Linux按键驱动及测试程序

原文地址:http://www.cnblogs.com/nick123/archive/2010/03/26/1696966.html  以下是驱动程序: [cpp] view pla...
  • daguanggo
  • daguanggo
  • 2014年03月15日 22:30
  • 588

Tiny6410 + Linux2.6.38 按键驱动改写和说明

四个按键分别接在GPN11, GPL8, GPL9, GPL10
  • zgrjkflmkyc
  • zgrjkflmkyc
  • 2014年11月14日 16:45
  • 923

按键驱动测试程序

宝剑锋从磨砺出,梅花香自苦寒来。——《警世贤文》 上一篇分析了一波驱动程序的代码,虽然有一些部分还是不懂,但还是挤出来一个测试程序,不足之处,请各位告知: ...
  • Peter_tang6
  • Peter_tang6
  • 2017年04月28日 18:27
  • 208

zigbee 协议栈 按键驱动

1、在hal_key.h中增加下面代码,其中第一、二个WDS--是我修改原有的,最后一个WDS--是我增加的。如果增加自己的按键则,像我最后一个WDS-- 增加一样就好了,上面两个WDS--可以不理 ...
  • u014608334
  • u014608334
  • 2017年05月11日 09:54
  • 218

mtk 按键中断驱动

mtk 按键中断驱动
  • u014767700
  • u014767700
  • 2016年11月01日 16:04
  • 1427

335x按键中断驱动

拿到一个新板子玩段时间,
  • qixi_feng
  • qixi_feng
  • 2014年05月03日 13:46
  • 1298

platform_button 按键驱动的测试程序

这个测试程序主要实现的功能是 4个按键分别控制4个灯,按一下亮,再按一下灭,再按一下闪,如此重复循环。 /*********************************************...
  • liuzijiang1123
  • liuzijiang1123
  • 2015年04月21日 18:38
  • 322

platform按键驱动(二)——编程测试实例以及select()函数详解

一、测试程序:     之前对按键驱动程序原理大概进行了分析,那么现在给出测试程序了。。。 /***************************************************...
  • qicheng777
  • qicheng777
  • 2017年04月18日 16:06
  • 457

ok6410学习笔记(16.按键中断控制led驱动)

这一节是我学驱动这么多天来,最头疼的一节,事后想了想应该是poll驱动当时没有做练习,再加上对前面的一些知识开始遗忘了,出现了好多不该出现的错误,还有些错误仍然没有解决,但是好歹功能是实现了,看来不动...
  • qq418674358
  • qq418674358
  • 2013年07月03日 00:48
  • 2956

Hi3515按键中断驱动程序(完整版)

摸索了一个星期,终于把海思HI3515开发板的按键中断程序搞出来了,hi3515的核心芯片与网上例子较多的s3c之类的有一些区别,以至于浪费了好些时间去琢磨。管脚配置方式不一样,中断的使用情况也不一样...
  • xiufu004
  • xiufu004
  • 2012年01月13日 11:29
  • 1967
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于中断的按键驱动以及其测试程序
举报原因:
原因补充:

(最多只允许输入30个字)