- 论坛徽章:
- 0
|
最近编写的一个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触发。
我申请中断的代码如下:
irq = irq_create_mapping(NULL, 13);
ret = request_irq(irq, handler_Dma1Done, IRQF_DISABLED, "fb_dma", &dev_id);
不知道哪位高手能够给我指引,已经好几天了(我现在还没有积分,不能悬赏,求高手不吝指点)。 |
|