Как получить доступ к Xilinx Axi DMA из Linux?
Я разработчик программного обеспечения, но я новичок в разработке встроенного программного обеспечения. У меня есть плата Zynq Ultrascale с Axi DMA в своем оборудовании, и я хочу получить доступ к этому DMA из Linux. Я знаю, что должен использовать DMA-Engine для доступа к DMA в Linux, и я нашел следующую ссылку, которая является драйвером DMA Xilinx, но я не могу добавить эти файлы в свой проект qt без каких-либо ошибок, и я получил файл (файл заголовка) не обнаружил ошибки.драйверы / dma / xilinx / xilinx_dma.c
У меня есть разрозненная информация о драйвере DMA, дереве устройств и DMA-Engine, но я ничего не знаю о том, как использовать их для доступа к аппаратному DMA.
Я создал проект Petalinux и добавил в его ядро DMA-Engine и DMA Test client.
Я не знаю, что добавления DMAEngine в проект Petalinux достаточно, или у меня тоже должен быть драйвер.
Я не знаю, что добавления спецификации оборудования (с помощью файла .xsa и .bit файла) в проект Petalinux достаточно, или я должен добавить дерево устройств в свой Linux для обнаружения DMA.
Я ищу пошаговое руководство о том, как настроить Linux и qt Creator для доступа к DMA, или, по крайней мере, четкую дорожную карту для моей цели.
заранее спасибо.
1 ответ
Во-первых, вы сталкиваетесь с ошибками при добавлении xilinx_dma.c в проект Qt, потому что этот файл предназначен для компиляции как часть ядра или как модуль ядра.
Добавления DMA Engine в Petalinux недостаточно для работы с DMA из пользовательского пространства. DMA Engine предоставляет только стандартизированный API, позволяющий интегрировать различные DMA в ядро. Вам также необходимо добавить клиентский драйвер. Xilinx, насколько мне известно, предоставила простой клиентский драйвер под названием DMA Proxy Driver. Он также включает в себя несколько простых примеров, которые показывают, как вы можете получить доступ к DMA из пользовательского пространства. Однако, если вашему приложению требуется высокая пропускная способность, вам, вероятно, придется рассмотреть другие варианты.
Существует также клиентский драйвер с открытым исходным кодом для Axi DMA, который обеспечивает более высокую пропускную способность по сравнению с драйвером Proxy DMA. Это API пользовательского пространства также позволяет вам зарегистрировать функцию обратного вызова, которая будет вызываться всякий раз, когда транзакция завершена.
Третий вариант — реализовать драйвер в пользовательском пространстве. Это можно сделать, определив DMA как устройство UIO в дереве устройств и обратившись к его карте регистров непосредственно из пользовательского пространства. В этом случае вам нужно выделить несколько смежных блоков памяти в пространстве ядра, чтобы избежать сложностей с MMU, с которыми нельзя работать из пользовательского пространства.