阅读:2363回复:2
关于linux中断的一个奇怪问题
最近编写的一个DMA驱动(CPU:powerpc405ex),是将framebuffer的数据不断重复的向协处理器(FPGA)传输,所以在open()时设置了DMA中断,传输流程如:“open()申请中断和设置DMA寄存器——>传输完framebuffer数据,DMA中断触发——>中断处理函数重新设置好DMA——>传输完framebuffer数据,DMA中断重新触发——>不断重复传输”,现在的问题是当我把所有需要的所有驱动都编译进内核时,DMA在open执行完后就不再传输,但当我把其他驱动不全部编进内核(如把USB或IIC的驱动删掉),DMA就能一直正常传输,初步判断是中断的问题,用cat /proc/interrupts显示如下(DMA驱动是fb_dma):
所有驱动都编进内时(不能传输): CPU0 17: 3 UIC Level dwc_otg, dwc_otg_pcd, dwc_otg_hcd:usb1 19: 0 UIC Level dwc_otg_plbdma 20: 23 UIC Level MAL TX EOB 21: 38 UIC Level MAL RX EOB 22: 0 UIC Level MAL SERR 23: 0 UIC Level MAL TX DE 24: 0 UIC Level MAL RX DE 25: 0 UIC Level EMAC 26: 500 UIC Level serial 27: 1 UIC Level IBM IIC 31: 0 UIC Level IBM IIC 32: 102 UIC Edge fb_dma BAD: 0 当把USB的驱动不编进内核时(能正常传输): CPU0 17: 23 UIC Level MAL TX EOB 18: 57 UIC Level MAL RX EOB 19: 0 UIC Level MAL SERR 20: 0 UIC Level MAL TX DE 21: 0 UIC Level MAL RX DE 22: 10 UIC Level IBM IIC 23: 0 UIC Level IBM IIC 24: 0 UIC Level EMAC 25: 153 UIC Level fb_dma 26: 350 UIC Level serial BAD: 0 大家可以注意到我的fb_dma在上面第一次是Edge触发,在第二次变成了Level触发,不知道哪位高手能够给我指引,已经好几天了。 |
|
|
沙发#
发布于:2009-07-06 11:45
再追加一个信息:我申请中断的代码如下:
irq = irq_create_mapping(NULL, 13); ret = request_irq(irq, handler_Dma1Done, IRQF_DISABLED, "fb_dma", &dev_id); |
|
|
板凳#
发布于:2009-11-05 23:45
你的出错信息是什么呢?知道是在哪里停掉的吗?把出错信心打出来看看
|
|
|