ZYNQ AXI-DMA Linux Cache 一致

这篇具有很好参考价值的文章主要介绍了ZYNQ AXI-DMA Linux Cache 一致。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


概括

平台为 ZYNQ MPSOC
项目使用到AXI-DMA ,ADC模块传输数据到DDR,应用层进行数据的读取。在此做些记录
用到了AXI-Stream , IP核用的 米联客的ui_axisbufw,可以把流数据转为AXI-Stream 接口

比较重要的参考链接
1.UltraScale+MPSoC+Cache+Coherency
https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18842098/Zynq+UltraScale+MPSoC+Cache+Coherency
2.MPSoC逻辑加速模块数据通道快速设计
https://cloud.tencent.com/developer/article/1663578
3.git上开源的 axi-dma Linux 驱动, 实现零拷贝
https://github.com/bperez77/xilinx_axidma
4.
Petalinux 加速axi-dma内核驱动缓冲区读过程

一、FPGA部分关键点

1.AXI-DMA IP核的配置,配置好一次最大传输字节数,这里没有使用SG模式,一次最大传输字节数设置为了2的26次方也就是一次DMA最大传输64MB数据,地址宽度设置为64bit,如果设置为32bit 可能会出现DMA 访问不了 ARM 的 另一块内存的问题。(当然Linux cma内存预留的时候 可以指定到32位地址空间)
ZYNQ AXI-DMA Linux Cache 一致
测试发现使用 bperez77/xilinx_axidma 的内核驱动, 开启SG模式,会有接收错误,关闭SG模式,正常,问题还待解决(当然不解决也能用哈哈)。
这里只使能了 DMA 写入通道,也就是从PL发送到PS的DDR, 也就是S2MM(stream to mem map)。

2.AXI-DMA 与 ARM 连接
ZYNQ AXI-DMA Linux Cache 一致
这里最好是使用AXI SmartConnect 进行连接, 以减少出错的可能。ARM端使用HPC0进行连接
3.AXCACHE 与AXPROT
这一部分涉及 Cache 同步问题, 也就是FPGA 刷新 应用DDR内存的问题, FPGA 刷新完 内存, CPU可能不知道,CPU再次读的时候有可能Cache命中 读取到了旧数据。
这部分主要是为了cache 同步,测试发现这个最好是做,当然不做cache 同步 也好像没啥问题, 但是 可能会突然给你点儿小惊喜。
cache 同步需要 比较繁杂的配置,参考官方wiki 的8.2

ZYNQ AXI-DMA Linux Cache 一致
主要是配置这4个
①PL部分配置 AXCACHE 设置 0xF
②AxPORT 配置为 0x02,也就是第2bit 为1 ,不安全模式
③是能cache侦听, 需要配合vitis,在 FSBL部分进行处理
④设备树增加 dma-coherent
这几步可以参考 一开始提到的 MPSoC逻辑加速模块数据通道快速设计

二、ARM部分的关键配置

1.设备树

设备(示例):
这里需要注意 dma-coherent; 这个属性得加一下,然后axi_dma 部分参考 vitis 生成的就行。
a0000000 为 ip和分配的地址,需要对应起来。

	/* AXI-DMA */
	axidma_chrdev: axidma_chrdev@0 {
		#dma-cells = <1>;
		compatible = "xlnx,axidma-chrdev";
		dmas       =  <&axi_dma_0 0 &axi_dma_0 1>;
		dma-names  = "tx_channel", "rx_channel";
		dma-coherent;
	};

	axi_dma_0: dma@a0000000 {
		status = "okay";
		#dma-cells = <1>;
		clock-names = "s_axi_lite_aclk", "m_axi_mm2s_aclk", "m_axi_s2mm_aclk", "m_axi_sg_aclk";
		clocks = <&zynqmp_clk 71>, <&zynqmp_clk 71>, <&zynqmp_clk 71>, <&zynqmp_clk 71>;
		compatible = "xlnx,axi-dma-1.00.a";
		interrupt-names = "mm2s_introut", "s2mm_introut";
		interrupt-parent = <&gic>;
		interrupts = <0 91 4>, <0 92 4>;
		reg = <0x0 0xa0000000 0x0 0x10000>;
		xlnx,addrwidth = <0x40>;//64bit addr 
		xlnx,sg-length-width = <0x1A>;//buffer len    26 bit 64M  <0x17>;//buffer len  23 bit 8M
		dma-coherent;
		dma-channel@a0000000 {
			compatible = "xlnx,axi-dma-mm2s-channel";
			dma-channels = <0x1>;
			interrupt-parent = <&gic>;
			interrupts = <0 91 4>;
			xlnx,datawidth = <0x80>;//data width 128
			xlnx,device-id = <0x0>;
		};
		
		dma-channel@a0000030 {
			compatible = "xlnx,axi-dma-s2mm-channel";
			dma-channels = <0x1>;
			interrupt-parent = <&gic>;
			interrupts = <0 92 4>;
			xlnx,datawidth = <0x80>;//data width 128
			xlnx,device-id = <0x1>;
		};
		
	};

2.AXI-DMA 应用层 驱动

git 上 大佬做的 xilinx_axidma 驱动 , 以下可能需要修改的地方,因为我的内核是4.19。
of_dma_configure的第一个参数 不要搞错了, 不然 会出现 应用层读buf 缓慢的现象,当时博主也是找问题找了好久。
剩下的就是 可能要包含以下 of 的头文件了。
ZYNQ AXI-DMA Linux Cache 一致
ZYNQ AXI-DMA Linux Cache 一致
注意!!!不要按上述的patch 去修改 ,否则会有问题!!!!DMA mask not set 这个log
好像没啥影响。

3.应用层编程

应用层主要使用的api 可以参考 xilinx_axidma 的demo,主要用到了以下的API

    axidma_init(); //初始化 axi dma 设备,获取fd
    axidma_malloc(axidma_dev, tx_size);//这里会做内存映射,映射cma 内存到用户空间
    axidma_oneway_transfer(dev, rx_channel, rx_buf, rx_size, true);//单向传输,可以发送、接收
    axidma_free(axidma_dev, tx_buf, tx_size);//释放内存映射,也就是cma 内存
    axidma_destroy(axidma_dev);//关闭设备

总结

1.AXI-DMA 个人理解为PL到PS交互提供了一个桥梁,如果只是控制寄存器的话,使用AXI-Lite就可以,AXI-Stream 适合数据流交互(PL2PS PS2PL 都是互通的)。

2.xilinx 虽然做了axi-dma 的驱动,但是为应用层提供接口的驱动还不是很完善(虽然wiki上有xilinx官方开源的)。

3.使用 https://github.com/bperez77/xilinx_axidma 这个axidma 可以很方便的实现 应用层的dma 数据零拷贝,直接dma 到 内核的CMA 内存区域,其实这个CMA内存也是在DDR上,零拷贝的实现是通过内核空间内存映射实现的,所以是0拷贝,最终测试下来 内存的读写速度和读写DDR基本一致。

在其中mmap 函数在其中发挥了很大作用,用户层调用mmap,转到驱动的 mmap,驱动的mmap 拿到用户空间的地址和大小之后 对内核的 cma 内存进行dma 映射。

4.Cache一致 配置的可能稍微复杂一点儿,但是 最终做下来 也能达到相应的效果,并且能对 ZYNQ这个 芯片架构更了解一些。关于cache 同步可以参考这个
关于linux内存管理中DMA ZONE和dma_alloc_coherent若干误解的澄清文章来源地址https://www.toymoban.com/news/detail-435592.html

到了这里,关于ZYNQ AXI-DMA Linux Cache 一致的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【正点原子FPGA连载】第二十一章AXI DMA环路测试 摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Vitis开发指南

    1)实验平台:正点原子MPSoC开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=692450874670 3)全套实验源码+手册+视频下载地址: http://www.openedv.com/thread-340252-1-1.html DMA(Direct Memory Access,直接存储器访问)是计算机科学中的一种内存访问技术。它允许某些计算机内部的硬件子系

    2024年02月16日
    浏览(48)
  • ZYNQ使用AXI DMA(Scatter/Gather)模式进行PL与PS数据交互附源码(ps端移植freertos或者裸机)

    AXI DMA 操作需要先提供一个在内存中驻留的不变空间,用于存储需要进行的DMA操作。形容这“每一次操作”的东西叫做Buffer Descriptor,缩写叫BD,这些BD是连接成链表的形式的,因为BD会动态增加,而预先分配存储BD的空间是恒定的,因此BD被连成一个环(BD Ring),其实就是一个循

    2024年02月09日
    浏览(29)
  • arm Linux中dma的cache管理

    概述 前两周有人询问DMA下的cache操作和dma-coherent。以前零碎看过代码。临时找,还没有找到。 这两天整理了调用流程,也找到了dma-coherent的用法。Linux的文档里没有详细说明dma-coherent的用法。根据代码,如果dma的设备树里有dma-coherent,Linux则认为硬件会维护cache一致性,不会在

    2024年02月04日
    浏览(26)
  • ZYNQ PS与PL通过AXI-LITE连接,在Linux下直接读写PL的物理地址,实现PS与PL的交互

    ZYNQ开发,如果PL与PS的交互方式仅为AXI-Lite总线的话,在Linux下可以通过直接访问PL的寄存器物理地址来实现PS-PL的数据交互。 测试代码的PC开发平台为Ubuntu18.04,QT5。 ZYNQ为7020,并移植了Linux系统和Ubuntu16.04的最小系统。 将PL的程序封装成IP核,通过AXI-LITE与PS连接,对外是18个寄

    2024年04月10日
    浏览(34)
  • XILINX Zynq UltraScale+ MPSoC 在 4K 视频图像处理和会议系统的应用

        赛灵思 Zynq UltraScale+™ MPSoC EV 器件的 4K 视频处理功能。EV 器件具有继承的多标准视频编解码器,能够以 60帧/秒 的速度同步编码和解码。       Arm 四核 Cortex-A53 核以及集成的定制化的视频处理引擎,ZU7EV 器件可以作为多媒体应用方案的主控。        ZCU106 评估套件可作

    2024年02月01日
    浏览(36)
  • XILINX ZYNQ 7000 AXI总线 (二)

    了解了AXI 的大部分内容后,开始做一个实战,就是完成AXI 结构的输入输出搭建。 一.创建一个IP 3. 4. 5. 6.选择AXI FULL,创界主接口和从接口 7. 8.可以看到XILINX AXI FULL 的源代码 二.创建一个新的工程,把IP导入到这个工程 2.创建 block design 放入两个AXI IP 三 设计 创建两个 接口进行

    2024年02月16日
    浏览(45)
  • Zynq AXI_HP 接口详解

    Zynq AXI_HP 接口详解 如果你是一名 FPGA 开发者,那么你一定对 Zynq 这个硬件平台不会陌生。Zynq 平台以其强大的功能和高性能而受到广泛关注。其中,AXI_HP 接口是 Zynq 平台中非常重要的一部分,它是 High Performance AXI Master 和 Slave 的缩写,具有高速数据传输和 DMA(Direct Memory Ac

    2024年02月08日
    浏览(32)
  • ZYNQ PS使用axi uartlite进行串口收发

    由于使用的ZYNQ PS部分只有两个串口,其中一个还当成了控制台用,串口不够用,于是使用PL的逻辑部分并利用IP核:AXI UARTLITE 为PS增加串口数量,并添加了AXI TIMER。 Vivado和Vitis为2020,PS为裸机使用。 包含以下内容: 1、Vivado的配置 2、axi uartlite代码 3、axi timer代码 4、利用IP核:

    2024年04月12日
    浏览(33)
  • AXI4-写DMA如何使用verilog实现(三)DMA例子

    这里给一个小例子: 往0地址写入 突发长度为256突发,数据位宽为64bit 数据为0~255

    2024年02月12日
    浏览(36)
  • AXI DMA IP核使用说明

    AXI DMA提供内存和AXI4-Stream 目标外设之间的高带宽直接内存访问。DMA除了配置为直接DMA模式外,还可以配置为scatter/gather(S/G)模式,S/G模式减轻CPU负担。 为了掌握对DMA的使用方法,需要对DMA IP核有足够的了解。这篇文章主要对AXI DMA IP 核的使用进行简单的说明,接下来详细论

    2024年02月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包