Во внешнем модуле ядра, использующем DMA Engine, при вызове dma_request_chan()
возвращается указатель ошибки со значением -19, т.е. ENODEV или «Нет такого устройства». Теперь, в активном дереве устройств, я нахожу запись dma-names с тем, для чего я пытаюсь получить канал, поэтому я подозреваю, что что-то еще глубже в лесу уже не найдено.
Как узнать, что не так?
Справочная информация:
У меня здесь плата Zynq MP Ultrascale + с дизайном FPGA, в котором используется AXI Блок VDMA для обеспечения одного канала данных, которые должны быть получены на Cortex A Linux, где данные записываются в DDR4 с помощью FPGA и читаются из Linux.
Я обнаружил, что существует Драйвер Xilinx DMA, включенный в ядро, в любом случае в репозитории исходного кода Xilinx, в настоящее время ядро версии 5.6.0. И что у этого драйвера нет интерфейса пользовательского пространства, поэтому необходим промежуточный драйвер ядра.
Это изображено, и у них есть пример здесь: Раздел «4 Проектирование прокси DMA» . Я изменил код в dma-proxy. c связанного с ним zip-файла, так что он использует только канал RX, т.е. также пытается только запросить его.
Код это здесь, чтобы не делать этот пост огромным: Модифицированный dma-proxy. c на onlinegdb.com
Дерево устройств для моей платы имеет добавленный узел для драйвера dma-proxy, как показано на верхняя часть dma-proxy. c
dma_proxy {
compatible ="xlnx,dma_proxy";
dmas = <&axi_dma_0 0>;
dma-names = "dma_proxy_rx";
};
Имя «axi_dma_0» совпадает с именем в узле дерева устройств DMA axi:
axi_dma_0: dma@a0000000 {
#dma-cells = <0x1>;
clock-names = "s_axi_lite_aclk", "m_axi_s2mm_aclk";
clocks = <0x3 0x47 0x3 0x47>;
compatible = "xlnx,axi-dma-7.1", "xlnx,axi-dma-1.00.a";
interrupt-names = "s2mm_introut";
interrupt-parent = <0x1d>;
interrupts = <0x0 0x2>;
reg = <0x0 0xa0000000 0x0 0x1000>;
xlnx,addrwidth = <0x28>;
xlnx,sg-length-width = <0x1a>;
phandle = <0x1e>;
dma-channel@a0000030 {
compatible = "xlnx,axi-dma-s2mm-channel";
dma-channels = <0x1>;
interrupts = <0x0 0x2>;
xlnx,datawidth = <0x40>;
xlnx,device-id = <0x0>;
};
Если я сейчас посмотрю сюда:
% cat /proc/device-tree/dma_proxy/dma-names
dma_proxy_rx
Похоже, мой dma_proxy_rx , канал для которого я пытаюсь запросить, находится там.
Редактировать: В журнале загрузки я вижу следующее:
xilinx-vdma a0000000.dma: Please ensure that IP supports buffer length > 23 bits
irq: no irq domain found for interrupt-controller@a0010000 !
xilinx-vdma a0000000.dma: unable to request IRQ 0
xilinx-vdma a0000000.dma: WARN: Device release is not defined so it is not safe to unbind this driver while in use
xilinx-vdma a0000000.dma: Xilinx AXI DMA Engine Driver Probed!!
Есть предупреждения - но в конце Xilinx AXI DMA Engine «зондировал», что означает загруженный драйвер самого низкого уровня и готово, верно?
Мне кажется, что там должно быть мое устройство, но ядро не соглашается.