Как получить доступ к XDMA BAR0 в Petalinux?

У меня блочный дизайн и аппаратная конфигурация с процессором Zynq под управлением Petalinux. Кроме того, у меня есть XDMA IP, настроенный как конечная точка с отображением памяти. Я настроил BAR0 и BAR2 на вкладке PCI BARs.

Я пытаюсь написать простую программу/приложение для petalinux, которое устанавливает правильные значения конфигурации в BAR0 для чтения хостом. Однако я не уверен, где находится BAR0 и как в него писать. Как найти указатель на BAR0 в Petalinux?

1 ответ

Когда вы экспортируете файл .xsa, у вас будет адрес BAR0, определенный в пространстве регистров вашего PS. Кроме того, вы можете декомпилировать дерево устройств, чтобы проверить, что IP-адрес xilinx-xdma имеет правильные регистры BAR:

      ./build/tmp/work/..../usr/bin/dtc -I dtb -O dts images/linux/system.dtb  > system.dts

vi system.dts

Там вы должны найти что-то вроде этого (для ясности я опустил некоторые поля):

                      axi-pcie@B0200000{
                        #address-cells = <0x03>;
                        #interrupt-cells = <0x01>;
                        #size-cells = <0x02>;
                        compatible = "xlnx,xdma-host-3.00";
                        device_type = "pci";
                        interrupt-names = "misc\0msi0\0msi1";
                        ranges = <0x2000000 0x00 0xb0200000 0x00 0xb0200000 0x00 0x100000>;
                        reg = <0x05 0x00 0x00 0x20000000>;
                        phandle = <0xab>;

Важная информация находится вrangesсвойство. Эта информация анализируется linux во время загрузки, чтобы узнать, где находится BAR0.

Мы также знаем, что водитель будетxdma-host-3.00который управляет низкоуровневой связью PCI (источник), проверяет, работает ли ссылка, и обрабатывает прерывания MSI.

Отсюда у вас есть бесчисленные возможности в зависимости от того, какое устройство вы подключили к шине PCIe. Например, если есть диск NVMe, драйверы Xilinx для NVMe будут использовать драйверы PCIe для связи с конечной точкой.

Однако, если вы хотите иметь доступ к регистрам BAR для специальной или пользовательской конечной точки, вы можете использоватьpci_uio_genericдрайвер, который сопоставляет ресурсы PCIe с универсальным устройством ввода-вывода пользовательского пространства.

Здесь есть некоторая документация или в библиотеке DPDK .

Основная идея, однако, заключается в том, что как только вы привяжете драйвер к устройству PCIe, вы обнаружите новыйuioустройство под

/sys/class/uio/uio<dev_num>/device/resource0

И если выmmapтакой ресурс, у вас будет адрес виртуальной памяти, указывающий непосредственно на BAR0 вашего устройства PCIe.

Другие вопросы по тегам