使用Zynq,如何在A53上运行的嵌入式Linux中使用可用的DMA之一

时间:2019-02-22 18:37:45

标签: embedded-linux device-driver dma device-tree zynq

我正在使用带有4个A-53手臂内核的Zynq板,这些内核运行嵌入式Linux(Ubuntu)。我需要使用DMA进行数据传输。当Linux启动时,我看到以下消息,显示一些DMA可用:

terminal

在设备树中,我找到了以下DMA(这里仅显示其中的2个)。如您所见,它们的注册地址与上面的屏幕快照相同。 (gdma0-> 0xfd500000等)。

terminal 2

现在在我的设备驱动程序中,我想从这些DMA之一(例如gdma0)分配一个通道。当我调用以下函数时,它返回错误:

 struct dma_chan    *dmachan;
 dmachan = dma_request_slave_channel_reason(pdev->dev, "gdma0");
 if (IS_ERR(dmachan)){
      printk(KERN_ALERT "error in allocating dma channel!\n");
      return -1;
 }

然后我从gdma0(在设备树中)定义了一个通道,如下所示:

enter image description here

并尝试如下在我的驱动程序中分配一个通道:

 dmachan = dma_request_slave_channel_reason(pdev->dev, "gdma");
 if (IS_ERR(dmachan)){
      printk(KERN_ALERT "error in allocating dma channel!\n");
      return -1;
 }

但是,我仍然无法分配DMA通道,并且该函数返回错误。

然后根据Sanchayan注释,将通道定义从父DMA节点文件移动到另一个文件中,该文件在设备树中定义了我的驱动程序。这是我的方法:

/ {
    ngd-tunnel { // my driver 
        compatible = "NGD,ngd-tunnel-char.a";
    };
    dma_channel: dma-channel@FD500000 {
        compatible = "xlnx,xilinx-zynqmp-dma";
        dmas = <&gdma0 0>;
        dma-names = "gdma";
    };
};

但是,编译项目时会出现错误:

错误(phandle_references):引用不存在的节点或标签“ gdma0”

最初,这是我在父DMA节点中定义通道的原因。

0 个答案:

没有答案