分类: LINUX
2008-12-13 16:34:50
#include
#include
#include
#include
static int irq;
static char *interface;
module_param(interface,charp,0644);
module_param(irq,int,0644);
static int mycount = 0;
static long mytime = 0;
static unsigned long data=0;
static struct tasklet_struct mytasklet;//定义小任务
//小任务函数
static void mylet(unsigned long data)
{
printk(”tasklet running.\n”);
if(mycount==0)
mytime=jiffies;
if (mycount < 10)
{
mytime=jiffies-mytime;
printk(”Interrupt number %d –time %ld \n”,irq,mytime);
mytime=jiffies;
}
mycount++;
return;
}
//中断服务程序
static irqreturn_t myinterrupt(int intno,void *dev_id)
{
tasklet_schedule(&mytasklet);//调度小任务,让它运行
return IRQ_NONE;
}
static int __init mytasklet_init(void)
{
printk(”init…\n”);
tasklet_init(&mytasklet, mylet,data);//初始化小任务
tasklet_schedule(&mytasklet);
if (request_irq(irq,&myinterrupt,IRQF_SHARED,interface,&irq))
{
printk(KERN_ERR “myirqtest: cannot register IRQ %d\n”, irq);
tasklet_kill(&mytasklet);//删除小任务
free_irq(irq,&irq);//释放中断
return -EIO;
}
printk(”%s Request on IRQ %d succeeded\n”,interface,irq);
return 0;
}
static void __exit mytasklet_exit(void)
{
tasklet_kill(&mytasklet);//删除小任务
free_irq(irq,&irq);//释放中断
printk(”Freeing IRQ %d\n”, irq);
printk(”exit…\n”);
return;
}
MODULE_LICENSE(”GPL”);
module_init(mytasklet_init);
module_exit(mytasklet_exit);