Как получить доступ к 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.