#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/irq.h>
#include <linux/interrupt.h>
#include <asm/uaccess.h>
#include <asm/arch/regs-gpio.h>
#include <linux/device.h>
#include <linux/poll.h>
#include <asm/hardware.h>
MODULE_LICENSE("Dual BSD/GPL");
int i=1;
static irqreturn_t buttons_irq(int irq,void *dev_id)
{
printk("irq=%d\n",irq);
return IRQ_RETVAL(IRQ_HANDLED);
}
static int third_drv_open(struct inode *inode,struct file *file)
{
int err;
request_irq(IRQ_EINT0,buttons_irq,IRQT_BOTHEDGE,"s0",&i);
request_irq(IRQ_EINT2,buttons_irq,IRQT_BOTHEDGE,"s1",&i);
request_irq(IRQ_EINT4,buttons_irq,IRQT_BOTHEDGE,"s2",&i);
err= request_irq(IRQ_EINT1,buttons_irq,IRQT_BOTHEDGE,"s3",&i);
if(!err)
printk("request success!\n");
return 0;
}
static int third_drv_read(struct file *file,char __user *buf,size_t size,loff_t *ppos)
{
rerurn 0;
}
static int third_drv_close(struct inode *inode, struct file *file)
{
free_irq(IRQ_EINT0,&i);
free_irq(IRQ_EINT2,&i);
free_irq(IRQ_EINT4,&i);
free_irq(IRQ_EINT1,&i);
return 0;
}
static struct file_operations third_drv_fops={
.owner=THIS_MODULE,
.open=third_drv_open,
.read=third_drv_read,
.release =third_drv_close,
};
static int third_drv_init(void)
{
register_chrdev(113,"third_drv",&third_drv_fops);//register_chrdev_region()是register_chrdev()的升级版,使用前者的话还要多一个步骤:设备的注册,用cdev_add()函数。
return 0;
}
static void third_drv_exit(void)
{
unregister_chrdev(113,"third_drv");
}
module_init(third_drv_init);
module_exit(third_drv_exit);