Используя Zynq, как использовать один из доступных DMA во встроенном Linux, работающем на A53 - PullRequest
0 голосов
/ 22 февраля 2019

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

Затем, основываясь на комментарии Санчаяна, я переместил определение канала из файла родительского узла 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.

...