我有一个块设计和硬件配置的Zynq处理器运行Petalinux。此外,我还将XDMA IP配置为内存映射端点。我已经在PCI BAR0选项卡中配置了BAR0和BAR2。
我试图为petalinux编写一个简单的程序/应用程序,在BAR0中设置正确的配置值,供主机读取。然而,我不知道BAR0在哪里,也不知道如何给它写信。如何在Petalinux中找到指向BAR0的指针?
发布于 2022-06-22 13:42:57
导出.xsa文件时,您将在PS的寄存器空间中定义BAR0地址。此外,还可以对设备树进行反编译,以检查xilinx是否具有正确的条形寄存器:
./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在哪里。
我们还知道驱动程序将是驱动PCI低层通信(来源)的xdma-host-3.00,检查链接是否已打开并处理MSI中断。
从这里开始,您有无数的机会,取决于您已经连接到PCIe总线的设备。例如,如果有NVMe磁盘,NVMe的Xilinx驱动程序将使用PCIe驱动程序与端点对话。
但是,如果希望访问特定或自定义端点的条形寄存器,可以使用pci_uio_generic驱动程序,该驱动程序将PCIe资源映射到一般用户空间IO设备上。
但是,基本思想是,一旦将驱动程序绑定到PCIe设备,您将在
/sys/class/uio/uio<dev_num>/device/resource0
如果您mmap这样的资源,您将有一个虚拟内存地址直接指向您的PCIe设备的BAR0。
https://stackoverflow.com/questions/71737576
复制相似问题