【问题标题】:Any built-in Linux methods for AXI-burst type devices?任何用于 AXI-burst 类型设备的内置 Linux 方法?
【发布时间】:2014-03-13 09:06:18
【问题描述】:

我需要与基于 AXI-burst 接口的 FPGA 设备通信。在不涉及 DMA 的情况下,通过 Linux 访问此类设备的方法有哪些? Burst 是 AXI 标准的固有属性,通常应在传输大量数据时自动触发。更大的问题是 FPGA 被设计成只响应 AXI 总线上的突发类型请求。因此,当应用程序尝试顺序复制时,这会在 Linux 上引起严重问题。我已经尝试过memcpy,但它不起作用。

【问题讨论】:

  • 内存访问的其他限制是什么?强令?设备?
  • 这是 Xilinx Zync 或 Altera SoC 还是其他?您是否尝试过mmaping 地址区域? Altera SoC here 有一个很好的教程。还请阅读 these blog posts 关于写入组合 MMIO 访问(对于 x68 而不是 ARM,但仍然很好的上下文)。
  • 该设备是基于 ARM Cortex A9 的 Zynq SoC。订购 - 未明确指定。
  • @Chiggs - 我试过 mmap 和 memcpy。但是它最终会触发单个读/写请求。
  • 硬件每次突发需要多少字节?您可以从 ARM CPU 进行的最大传输来自 LDM/STM 指令。任何更大的东西都需要 DMA。

标签: linux arm fpga dma amba


【解决方案1】:

我假设您的“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

【讨论】:

    【解决方案2】:

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

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

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

    属性定义如下(来自Zynq Technical Reference Manual):

    Encoding Bits   Cache Attribute
      C   B
      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#47406this forum post

    【讨论】:

    • 谢谢,我浏览了链接。但这在 Linux 下可行吗?我需要它在无法使用 Xil_SetTlbAttributes(); 的 Linux 驱动程序中工作
    • @AshishKulkarni 你能不只在 Linux 中包含 xil_mmu.h 吗?否则,您可以查看源代码,了解它是如何设置 MMU 的。
    • 我会看的。另外,我需要更多的突发 read 访问而不是 write.. 这个解决方案是否适用于两者?
    • @AshishKulkarni write-back 通常意味着读+写被CPU(L1/L2)缓存缓存,写可以随时完成并且可以重新排序;内存可能被预取或推测读取,因此读取不能有副作用。尽管行为是特定于架构的,但您需要查看 ARM 手册:L2C-310 Cache controllerMMU 500
    猜你喜欢
    • 2022-01-24
    • 2013-02-27
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多