我正在为Zynq AXI DMA编写特定于设备的DMA驱动程序。驱动程序实际上是一个包装驱动程序,在DMA引擎驱动程序框架下使用Xilinx DMA驱动程序,如下所示:
+------------------+ | Wrapper driver | +------------------+ | DMA framework | +------------------+ | Xilinx DMA Driver| +------------------+ + Kernel + +------------------+
我使用中断61进行传输完成,使用62进行接收完成。 Xilinx DMA驱动程序的中断处理程序已正确安装(我检查/ proc / interrupts)。但是,我的驱动程序似乎没有通过向我显示这个来正确处理中断:
我检查了/ 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的输出:
我有两个问题:
1)如果我只为Xilinx DMA驱动程序而不是包装驱动程序安装中断处理程序,当我使用包装驱动程序作为字符设备时,Xilinx DMA驱动程序不会处理中断?
2)如果是这样,在这种情况下如何让Xilinx DMA驱动程序处理中断? 'irqpoll'是唯一的解决方案吗?与直接中断处理而不是轮询相比,是否存在任何性能问题?
答案 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>;
};
};
};