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