您的位置:首页 > 其它

你的第一个中断处理程序

2011-02-16 13:23 225 查看
//平台:ubuntu9.10

#include "linux/init.h"

#include "linux/module.h"

#include "linux/kernel.h"

#include "linux/interrupt.h"

static int irq;

static char * interface;

module_param(interface,charp,0644);

module_param(irq,int,0644);

static irqreturn_t myinterrupt(int irq,void * dev_id)

{

static int mycount = 0;

static long mytime = 0;

struct net_device *dev=(struct net_device *)dev_id;

if(mycount==0){

mytime=jiffies;

}

//count the interval between two irqs

if (mycount < 10) {

mytime=jiffies-mytime;

printk("Interrupt number %d — intterval(jiffies) %ld — jiffies:%ld /n", irq,mytime, jiffies);

mytime=jiffies;

//printk("Interrupt on %s —–%d /n",dev->name,dev->irq);

}

mycount++;

return IRQ_NONE;

}

static int __init myirqtest_init(void)

{

printk ("My module worked!/n");

//regist irq

//if (request_irq(irq,&myinterrupt,SA_SHIRQ,interface,&irq)) { //early than 2.6.23

if (request_irq(irq,&myinterrupt,IRQF_SHARED,interface,&irq)) { //later than 2.6.23

printk(KERN_ERR "myirqtest: cannot register IRQ %d/n", irq);

return -EIO;

}

printk("%s Request on IRQ %d succeeded/n",interface,irq);

return 0;

}

static void __exit myirqtest_exit(void)

{

printk ("Unloading my module./n");

free_irq(irq, &irq); //release irq

printk("Freeing IRQ %d/n", irq);

return;

}

module_init(myirqtest_init);

module_exit(myirqtest_exit);

MODULE_AUTHOR("lin.tang");

MODULE_LICENSE("GPL");

对应Makefile文件:

obj-m += interrupt.o

#generate the path

CURRENT_PATH:=$(shell pwd)

#the current kernel version number

LINUX_KERNEL:=$(shell uname -r)

#the absolute path

LINUX_KERNEL_PATH:=/usr/src/linux-headers-$(LINUX_KERNEL)

#complie object

all:

make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) modules

#clean

clean:

make -C $(LINUX_KERNEL_PATH) M=$(CURRENT_PATH) clean

rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

//参考文档:

http://www.kerneltravel.net/?p=133

http://edsionte.com/techblog/archives/1521
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: