阅读:1232回复:2
请教一个linux下pci驱动的问题...
在写了一个pci的驱动,用ioctl读写寄存器已经正常,但是采用中断方式碰到麻烦,请指教!
1、芯片只用到INTA#,所以我在probe里面把pci配置空间的interrupt pin设为1; 2、然后在open函数里面申请中断,成功 if(error = request_irq(card->irq, &des_interrupt, SA_SHIRQ, DES_NAME , card)) return error; 3、des_interrupt是中断处理函数,如下 static void des_interrupt(int irq, void *dev_id, struct pt_regs *regs) { printk("<0>enter into des_interrupt!\n"); card = (struct des_card *)dev_id; u32 status; spin_lock(&card->lock); status = readl(card->iobase0 + ISR); if(!(status & 0x00000001)) { spin_unlock(&card->lock); return; // not for us } writel(0x0, card->iobase0 + ISR); spin_unlock(&card->lock); 。。。 } 现在的情况是,中断产生时立刻死机,提示消息是: EIP is at des_interrupt ...... <0> kernel panic: Aice, killing interrupt handler In interrupt handler -- not syncing 这个是什么原因导致的啊? 本人已经被它困扰好多天了,请大虾们不吝赐教,感激不尽啊~~ |
|
沙发#
发布于:2005-08-09 16:10
确定 if(!(status & 0x00000001)) 没有问题,看看芯片资料关于中断状态标志位说明,有可能是把自己设备产生的中断错当成别的设备中断给抛弃掉,导致没有清中断而死机。这只是我个人的猜测
|
|
板凳#
发布于:2007-01-09 20:15
解决了么
|
|
|