测试用的中断驱动程序

中断驱动程序


#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 IRQF_TRIGGER_HIGH 0x00000004
#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");
    //初始化DECLARE_WORK宏用于静态定义一个work_struct。而INIT_WORK宏用于动态初始化一个work_struct。延时任务使用INIT_DELAYED_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");


猜你喜欢

转载自blog.csdn.net/arunboy/article/details/78676577