包装器驱动程序不处理Linux中断

时间:2015-03-23 14:55:13

标签: linux linux-kernel interrupt-handling dma zynq

我正在为Zynq AXI DMA编写特定于设备的DMA驱动程序。驱动程序实际上是一个包装驱动程序,在DMA引擎驱动程序框架下使用Xilinx DMA驱动程序,如下所示:

  +------------------+
  |   Wrapper driver |
  +------------------+
  |   DMA framework  |
  +------------------+
  | Xilinx DMA Driver|
  +------------------+
  +      Kernel      +
  +------------------+

我使用中断61进行传输完成,使用62进行接收完成。 Xilinx DMA驱动程序的中断处理程序已正确安装(我检查/ proc / interrupts)。但是,我的驱动程序似乎没有通过向我显示这个来正确处理中断:

enter image description here

我检查了/ proc / interrupts。 IRQ62未得到处理。以下是注册中断的代码:

0986     /* find the IRQ line, if it exists in the device tree */
0987     chan->irq = irq_of_parse_and_map(node, 0);
0988     err = devm_request_irq(xdev->dev, chan->irq, dma_intr_handler,
0989                    IRQF_SHARED,
0990                    "xilinx-dma-controller", chan);

这是cat / proc / interrupt的输出:

enter image description here

我有两个问题:

1)如果我只为Xilinx DMA驱动程序而不是包装驱动程序安装中断处理程序,当我使用包装驱动程序作为字符设备时,Xilinx DMA驱动程序不会处理中断?

2)如果是这样,在这种情况下如何让Xilinx DMA驱动程序处理中断? 'irqpoll'是唯一的解决方案吗?与直接中断处理而不是轮询相比,是否存在任何性能问题?

1 个答案:

答案 0 :(得分:0)

您的设备不是好的,更确切地说,是您的pl.dtsi文件。我的pl文件如下所示:

amba_pl: amba_pl {
    #address-cells = <1>;
    #size-cells = <1>;
    compatible = "simple-bus";
    ranges ;
    axi_dma_0: dma@40400000 {
        compatible = "xlnx,axi-dma";
        interrupt-parent = <&intc>;
        interrupts = <0 29 4 0 30 4>;
        reg = <0x40400000 0x10000>;
        xlnx,include-sg ;
        dma-channel@40400000 {
            compatible = "xlnx,axi-dma-mm2s-channel";
            interrupts = <0 29 4>;
            xlnx,datawidth = <0x20>;
            xlnx,device-id = <0x0>;
        };
        dma-channel@40400030 {
            compatible = "xlnx,axi-dma-s2mm-channel";
            interrupts = <0 30 4>;
            xlnx,datawidth = <0x20>;
            xlnx,device-id = <0x0>;
        };
    };

};