Я использую плату Zynq с четырьмя ядрами A-53, которые работают под управлением встроенного 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, и функция возвращает ошибку.
Затем, основываясь на комментарии Санчаяна, я переместил определение канала из файла родительского узла 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.