我需要与基于AXI突发接口(interface)的FPGA器件进行通信。在不涉及DMA的情况下通过Linux访问这种设备的方法有哪些?突发是AXI标准的固有属性,通常在传输大量数据时应自动触发。更大的问题是FPGA设计为仅通过AXI总线响应突发类型的请求。因此,当应用程序尝试顺序复制时,这会在Linux上引起严重的问题。我已经尝试过memcpy
,但是它不起作用。
最佳答案
我假设您的“FPGA设备”是一个自定义模块,通过AXI接口(interface)与Cortex-A9进行了内存映射。我认为您可以通过2或3种方式来完成这项工作。
1)可缓存的映射。高速缓存硬件接口(interface)一次一次突发传输整个高速缓存行。您将需要手动清理(写入之后)和使它们无效(读取之前)。
2)不可缓存的映射,并具有ARM汇编语言例程来处理低级传输。我认为“加载和存储多个寄存器”指令可以提供您所需的内容。
我有一个类似的问题,需要通过从Cortex-A9处理器进行8字节传输来访问AXI外设(自定义内存 Controller )。当然,通常的ARM指令会传输1、2或4个字节(字节,半字,字)。那些通过可缓存的映射起作用,但不是通过不可缓存的映射起作用。 LDM/STM,一次两个单词,适用于两个映射。
当然,AHB/AXI传输模式取决于实现。根据您的描述,您需要INCR或WRAP模式而不是SINGLE。但这不必是那样的。这提出了使这项工作可行的第三种方式:
3)与您的数字硬件设计师交谈,使他意识到实现对软件的影响。
我认为,您不必进行异常/自定义的低级MMU操作。 Linux具有高级方法,您可以在设备驱动程序和/或board.c中放置标准钩子(Hook),主要选项是是否不进行缓存(即COHERENT)。请引用LDD3。
关于linux - AXI突发类型设备是否有内置的Linux方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22373717/