#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
//define a devid
static int mydev=1119;
static int irq;
static char* devname=NULL;
//define arguments for this module
module_param(irq,int,0644);
module_param(devname,charp,0644);
//define a argument of tasklet struct
static struct tasklet_struct mytasklet;
static void mytasklet_handler(unsigned long data)
{
printk("This is tasklet handler..\n");
}
static irqreturn_t myirq_handler(int irq,void* dev)
{
static int count=0;
if(count<10)
{
printk("-----------%d start--------------------------\n",count+1);
printk("The interrupt handeler is working..\n");
printk("The most of interrupt work will be done by following tasklet..\n");
tasklet_init(&mytasklet,mytasklet_handler,0);
tasklet_schedule(&mytasklet);
printk("The top half has been done and bottom half will be processed..\n");
}
count++;
return IRQ_HANDLED;
}
static int __init mytasklet_init()
{
//request a irq
printk("My module is working..\n");
if(request_irq(irq,myirq_handler,IRQF_SHARED,devname,&irq)!=0)
{
printk("tasklet_init:can not request irq %d for %s.\n",irq,devname);
return -1;
}
printk("%s request irq:%d success..\n",devname,irq);
return 0;
}
static void __exit mytasklet_exit()
{
printk("My module is leaving..\n");
free_irq(irq,&irq);
printk("Free the irq %d..\n",irq);
}
module_init(mytasklet_init);
module_exit(mytasklet_exit);
MODULE_LICENSE("GPL");
再来一个work queue例子:
#include<linux/kernel.h>
#include<linux/module.h>
#include<linux/init.h>
#include<linux/interrupt.h>
#include<linux/workqueue.h>
static int irq;
static char *devname;
static struct work_struct mywork;
module_param(irq,int,0644);
module_param(devname,charp,0644);
struct myirq
{
int devid;
};
struct myirq mydev={1119};
static void mywork_handler(void *data)
{
printk("work is working\n");
}
static irqreturn_t myirq_handler(int irq,void *dev)
{
struct myirq mydev;
static int count =0 ;
mydev=*(struct myirq*)dev;
printk("key:%d\n",count+1);
printk("devid %d isr is working\n",mydev.devid);
printk("botoom half will be working\n");
schedule_work(&mywork);
printk("isr is leaving\n");
count++;
return IRQ_HANDLED;
}
static int __init myirq_init()
{
printk(KERN_NOTICE "MODULE is working...\n");
if(request_irq(irq,myirq_handler,IRQF_SHARED,devname,&mydev)!=0)
{
printk("%s request irq %d faild\n",devname,irq);
return -1;
}
INIT_WORK(&mywork,mywork_handler);
printk("%s request irq %d success \n",devname,irq);
return 0;
}
static int __exit myirq_exit()
{
printk("module is leaving\n");
free_irq(irq,&mydev);
return 0;
}
module_init(myirq_init);
module_exit(myirq_exit);
MODULE_LICENSE("GPL");