免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6076 | 回复: 9
打印 上一主题 下一主题

求解决linux驱动中断的一个奇怪问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-06 11:59 |只看该作者 |倒序浏览
最近编写的一个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);
不知道哪位高手能够给我指引,已经好几天了(我现在还没有积分,不能悬赏,求高手不吝指点)。

论坛徽章:
5
2 [报告]
发表于 2009-07-06 12:58 |只看该作者
好奇怪的问题. 关注一下.

你的外设都是挂在FPGA上吗? 是否可能是中断共享引起的问题?
设备本身的触发模式是怎样的? (level or edge)

论坛徽章:
0
3 [报告]
发表于 2009-07-06 14:35 |只看该作者
外设CPU和FPGA有各自的内存和外设,FPGA是挂在CPU的外部总线上的。我的DMA是将CPU的framebuffer数据传给FPGA,FPGA再将接收的数据同它自己采集的图像叠加再给液晶屏显示。我的cpu(ppc405ex)的DMA 控制器有自己单独的中断(cpu主动触发,非外部中断),没有共享,dma中断的触发模式是可由寄存器设置的,但是我在驱动里设置没有起到什么作用,还是一样。所以我觉得是不是在向内核申请中断时是不是有哪个参数可以设置中断为level或edge的?请指教。

论坛徽章:
0
4 [报告]
发表于 2009-07-06 17:05 |只看该作者
我做过一个项目,硬件结构跟你一样,不过我是用Timer来定时传输到FPGA的

论坛徽章:
5
5 [报告]
发表于 2009-07-06 17:32 |只看该作者

回复 #3 driversun 的帖子

From interrupt.h in kernel 2.6.28.

/*
* These correspond to the IORESOURCE_IRQ_* defines in
* linux/ioport.h to select the interrupt line behaviour.  When
* requesting an interrupt without specifying a IRQF_TRIGGER, the
* setting should be assumed to be "as already configured", which
* may be as per machine or firmware initialisation.
*/
#define IRQF_TRIGGER_NONE        0x00000000
#define IRQF_TRIGGER_RISING        0x00000001
#define IRQF_TRIGGER_FALLING        0x00000002
#define IRQF_TRIGGER_HIGH        0x00000004
#define IRQF_TRIGGER_LOW        0x00000008
#define IRQF_TRIGGER_MASK        (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \
                                 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)


/**
*        request_irq - allocate an interrupt line
*        @irq: Interrupt line to allocate
*        @handler: Function to be called when the IRQ occurs
*        @irqflags: Interrupt type flags
*        @devname: An ascii name for the claiming device
*        @dev_id: A cookie passed back to the handler function
*
*        This call allocates interrupt resources and enables the
*        interrupt line and IRQ handling. From the point this
*        call is made your handler function may be invoked. Since
*        your handler function must clear any interrupt the board
*        raises, you must take care both to initialise your hardware
*        and to set up the interrupt handler in the right order.
*
*        Dev_id must be globally unique. Normally the address of the
*        device data structure is used as the cookie. Since the handler
*        receives this value it makes sense to use it.
*
*        If your interrupt is shared you must pass a non NULL dev_id
*        as this is required when freeing the interrupt.
*
*        Flags:
*
*        IRQF_SHARED                Interrupt is shared
*        IRQF_DISABLED        Disable local interrupts while processing
*        IRQF_SAMPLE_RANDOM        The interrupt can be used for entropy
*        IRQF_TRIGGER_*                Specify active edge(s) or level
*
*/
int request_irq(unsigned int irq, irq_handler_t handler,
                unsigned long irqflags, const char *devname, void *dev_id)

论坛徽章:
0
6 [报告]
发表于 2009-07-06 19:43 |只看该作者
问题终于解决了,果然是中断没设置触发方式,看了yidou帅哥(衣兜)的回复后, 我把request_irq(irq, handler_Dma1Done, IRQF_DISABLED, "fb_dma", &dev_id)改成
request_irq(irq, handler_Dma1Done, IRQF_DISABLED | IRQF_TRIGGER_HIGH, "fb_dma", &dev_id)问题就解决了,现在用cat /proc/interrupts,显示如下:
           CPU0      
17:          0   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:         46   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:        283   UIC   Level     serial
27:         10   UIC   Level     IBM IIC
31:          0   UIC   Level     IBM IIC
32:        811   UIC   Level     fb_dma
BAD:          0
多谢大家的帮忙,尤其要谢谢yidou帅哥(衣兜)。
前面看的驱动书都没把
IRQF_TRIGGER_NONE
IRQF_TRIGGER_RISING
IRQF_TRIGGER_FALLING
IRQF_TRIGGER_HIGH
IRQF_TRIGGER_LOW
IRQF_TRIGGER_MASK列到request_irq的参数中。对于为什么系统把DMA中断默认为边沿触发就不行了(CPU的手册中对DMA中断是支持level和edge两种方式的),还需要继续好好研究一下,不知道yidou帅哥(衣兜)对此有什么看法?
中断这部分我还了解的很少,要好好学习一下了

论坛徽章:
5
7 [报告]
发表于 2009-07-06 20:59 |只看该作者
不要帅哥来帅哥去, 我汗阿...

恭喜你了。我也不甚清楚by default触发方式是哪个。你看看kernel代码。有心得再告诉我.

论坛徽章:
0
8 [报告]
发表于 2009-07-07 12:56 |只看该作者
呵呵,帅哥是我把你的名字复制过来,中间那个符号就自动转换成帅哥两个字了。
我先看看内核,有什么心得我会在这个帖子上再写出来,多谢哈

论坛徽章:
0
9 [报告]
发表于 2009-07-07 17:46 |只看该作者
再看了一下cpu的数据手册,发现前面弄错了,DMA中断是只能设置成电平触发的,所以当内核默认把它设置成边沿触发时,DMA就不能产生中断了。至于内核默认设置的触发方式会是怎样的,还没搞明白,再查查看。

论坛徽章:
0
10 [报告]
发表于 2011-11-15 21:16 |只看该作者
lz,能够提供一下您的DMA是怎么实现的呢,我现在也是PPC405EX,想用DMA,谢谢~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP