- 论坛徽章:
- 0
|
还有看网上都说msi ,与ioapic的区别就是,要首先调用Pci_enable_msi()初始化设备Msi结构,分配msi中断号,并替换INTx中断号,在调用request_irq,在free_irq后,要pci_disable_msi(),
于是我在上面那个中断的基础上,如此写:
~#include <linux/module.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/pci.h>
static int irq;
static char *interface;
//module_param(interface,charp,0644);//表示这个参数要在插入模块时给出值
//module_param(irq,int,0644);
int dev_id=127;
static irqreturn_t myinterrupt(int irq,void *dev_id)//中断服务程序
{
static int count = 0;
if(count<10) {
printk("interrupt :%d,%d\n",irq,*(int *)dev_id);
count++;
}
return IRQ_NONE;
}
struct pci_dev *dev;
static int __init myirqtest_init(void)
{
int i=pci_enable_msi(dev);
if(i)
printk("pci_enable_msi\n");
else
{
printk("pci_enable_msi%d",i);
return i;
}
printk("my module worked\n");
if(request_irq(dev->irq,&myinterrupt,IRQF_SHARED,"hello",&dev_id)){//注册中断
printk(KERN_ERR "myirqtest:cannot register IRQ %d\n",irq);
return -EIO;
}
printk("%s request on irq %d success ,dev_id is %d\n",interface,irq,dev_id);
return 0;
}
static void __exit myirqtest_exit(void)
{
printk("unloading my module\n");
free_irq(irq,&irq);
pci_disable_msi(dev);
printk("freeing IRQ %d\n",irq);
}
module_init(myirqtest_init);
module_exit(myirqtest_exit);
MODULE_LICENSE("GPL");
make 不报错,但是一insmod就被杀死,求原因。。。。。。。
|
|