任何内置的AXI突发型设备的Linux方法?

我需要与基于AXI-burst接口的FPGA器件进行通信。 有什么方法通过Linux访问这样的设备,而不涉及DMA? 突发是AXI标准的固有属性,当传输大量数据时,通常应该自动触发。 更大的问题是FPGA的devise只能响应A​​XI总线上的突发型请求。 所以当应用程序尝试顺序复制时,这会导致严重的问题。 我已经尝试了memcpy ,它不工作。

我假设你的“FPGA器件”是一个自定义模块,通过Cortex-A9的AXI接口进行存储器映射。 我认为有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 。

您需要设置MMU以通知硬件组件的功能。 您还需要确保整个互连支持突发,并且不进行任何转换(如果在生成互连时组件的功能存在任何歧义,则可能发生这种转换)。

要设置MMU,请执行如下所示的调用:

 /* shareable device: S=b0 TEX=b000 AP=b11, C=b0, B=b1 = 0xC06*/ Xil_SetTlbAttributes(COMPONENT_BASE_ADDRESS, 0xC06); 

属性定义如下(来自Zynq技术参考手册 ):

 Encoding Bits Cache Attribute CB 0 0 Non-cacheable 0 1 Write-back, write-allocate 1 0 Write-through, no write-allocate 1 1 Write-back, no write-allocate 

因此,上面的行将设置该区域回写,写入分配,这可能会给你写突发访问。

另请参见Xilinx AR#47406和此论坛帖子 。