测试用的中断驱动程序

来源:互联网 发布:软件开发 证 编辑:程序博客网 时间:2024/06/05 21:01

中断驱动程序

#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 94struct 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");