中断驱动程序
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/fb.h>
#include <linux/backlight.h>
#include <linux/err.h>
#include <linux/pwm.h>
#include <linux/slab.h>
#include <linux/miscdevice.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <mach/gpio.h>
#include <linux/timer.h> /*timer*/
#include <asm/uaccess.h> /*jiffies*/
#include <linux/delay.h>
#include <linux/interrupt.h>
#include <linux/workqueue.h>
#define gpio 94
struct tasklet_struct task_t ;
struct workqueue_struct *mywor ;
struct work_struct wor;
static void task_fuc(unsigned long data)
{
if(in_interrupt()){
printk("1111111111111111111111111111111111111\n");
}
}
static void mywork_fuc(struct wor_struct *wor)
{
if(in_interrupt()){
printk("2222222222222222222222222222\n");
}
msleep(2);
printk("33333333333333333333333333333\n");
}
static irqreturn_t irq_fuction(int irq, void *dev_id)
{
if(gpio_get_value(gpio) == 0)
{
tasklet_schedule(&task_t);
schedule_work(&wor);
if(in_interrupt()){
printk("44444444444444444444444444444\n");
}
printk("555555555555555555555555555\n");
return IRQ_HANDLED ;
}
else{
return IRQ_NONE ;
}
}
static int __init irq_test_init(void)
{
int err = 0 ;
int irq_num1 ;
int data_t = 100 ;
gpio_direction_input(gpio);
mywor = create_singlethread_workqueue("my work");
INIT_WORK(&wor,mywork_fuc);
queue_work(mywor,&wor);
tasklet_init(&task_t,task_fuc,data_t);
printk("irq_key init\n");
irq_num1 = gpio_to_irq(gpio);
err = request_irq(irq_num1,irq_fuction,IRQF_TRIGGER_FALLING,"gpio94",(void *)"key1");
if(err != 0){
free_irq(irq_num1,(void *)"key1");
return -1 ;
}
return 0 ;
}
static void __exit irq_test_exit(void)
{
int irq_num1 ;
printk("irq_key exit\n");
irq_num1 = gpio_to_irq(gpio);
destroy_workqueue(mywor);
free_irq(irq_num1,(void *)"key1");
}
module_init(irq_test_init);
module_exit(irq_test_exit);
MODULE_LICENSE("GPL");