在带有微型PCIe总线的Spartan 6 FPGA和ARM cortex A9(IMX6体系结构)之间建立通信的困难

在带有微型PCIe总线的Spartan 6 FPGA和ARM cortex A9(IMX6体系结构)之间建立通信的困难,arm,linux-device-driver,embedded-linux,imx6,spartan,Arm,Linux Device Driver,Embedded Linux,Imx6,Spartan,我正在尝试在Spartan 6 FPGA(带有迷你PCIe总线)和包含运行Linux内核4.13的ARM cortex A9(IMX6体系结构)的板之间建立通信 我想使用RIFFA在Spartan 6 FPGA和使用PCIe的ARM处理器中的Linux之间进行通信 为了做到这一点,我首先遵循RIFFA文档中的所有说明,在带有PCIe总线(不是迷你PCIe)的Spartan 6 FPGA bord和带有Windows操作系统和x86体系结构的主机之间建立了连接,使用testuils.c文件时一切正

我正在尝试在Spartan 6 FPGA(带有迷你PCIe总线)和包含运行Linux内核4.13的ARM cortex A9(IMX6体系结构)的板之间建立通信

我想使用RIFFA在Spartan 6 FPGA和使用PCIe的ARM处理器中的Linux之间进行通信

为了做到这一点,我首先遵循RIFFA文档中的所有说明,在带有PCIe总线(不是迷你PCIe)的Spartan 6 FPGA bord和带有Windows操作系统和x86体系结构的主机之间建立了连接,使用testuils.c文件时一切正常

但是,我的主要目标是在带有迷你PCIe的Spartan 6 FPGA板和带有ARM cortex A9处理器的板之间建立连接。因此,我生成了RIFFA主文件夹中提供的位文件,我刷新了FPGA的PROM,以便在使用Embeded Linux引导板之前在FPGA中获取位文件,然后我使用lspci指令检查FPGA和Embeded Linux之间的良好连接,此时一切似乎都正常

现在,我面临的问题是,当我执行testutil时。带有“0”参数的代码它为我提供了有关my FPGA的正确信息(供应商ID、设备ID等)

但是,当我编译testutils时。带有“10”参数的代码,1代表“重置”,0代表“fpga ID”,它给了我一个分段错误,因此我尝试调试代码,发现分段错误来自调用readl函数的read_reg函数(来自riffa_driver.c)

在互联网上快速搜索后,我发现readl函数试图从一个虚拟地址(sc->bar0)进行读取

同时,在初始化Riffa的引导期间,驱动程序使用相同的参数调用read_reg函数,并且不会给出任何错误

我还注意到,在配置Xilinx PCIe IP core时,基址寄存器BAR0是0xFFFFFC00,Linux为FPGA提供了地址BAR0 0x01100000。这两个地址不同是否正常

为了使RIFFA从x86适应ARM处理器,我应该做哪些更改

您可以在下面找到错误消息的屏幕截图:

和SEGFULT错误: