我正在使用带有4个A-53手臂内核的Zynq板,这些内核运行嵌入式Linux(Ubuntu)。我需要使用DMA进行数据传输。当Linux启动时,我看到以下消息,显示一些DMA可用:
在设备树中,我找到了以下DMA(这里仅显示其中的2个)。如您所见,它们的注册地址与上面的屏幕快照相同。 (gdma0-> 0xfd500000等)。
现在在我的设备驱动程序中,我想从这些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(在设备树中)定义了一个通道,如下所示:
并尝试如下在我的驱动程序中分配一个通道:
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节点中定义通道的原因。