当前位置: 首页 > backend >正文

zynq-PS篇——bperez77中DMA驱动注意事项

前段时间在我的一篇博客 “zynq-PS篇——petalinux2022.2的DMA实现” 中带大家搭建了DMA回环的PL工程以及PS端的相关配置。

个人认为该驱动还是蛮好用的,但毕竟该驱动是2017年写的,以及有很多年了,存在一些局限性。但自己又不想找新的DMA驱动,据说proxy-DMA这个驱动也蛮好的,且一直在更新,但笔者实在不想再花时间去了解这个。

本篇主要探讨在利用 https://github.com/bperez77/xilinx_axidma驱动时一些可能导致问题的注意事项。
1、 DMA IP只开启s2mm,mm2s其中一个通道时,需要修改驱动
2、 DMA IP的 lite 和 hpm 时钟需要一致

一、单DMA IP开启S2MM,MM2S双通道

在这里插入图片描述
当你的需求只是一个简单的DMA回环,且该DMA IP同时承担了s2mm以及mm2s的功能时,设备树和驱动都依照我在前篇博客中讲到的一样设置即可。

此时你可以看到,你的设备树的pl.dtsi文件中 DMA IP 的s2mm、mm2s通道。把两路的xlnx,device-id设置为不同的值
在这里插入图片描述
system-user.dtsi对应的设置为

&amba_pl{axidma_chrdev: axidma_chrdev@0{compatible = "xlnx,axidma-chrdev";dmas = <&axi_dma_0 0 &axi_dma_0 1>;dma-names = "mm2s_dir0_channel", "s2mm_dir1_channel";}
}

其中,dma-names是dma的名称,你可以随意修改。dmas属性中,mm2s方向要写0,s2mm方向要写1.

二、双DMA IP分别负责S2MM,MM2S

在这里插入图片描述
此时你的设备树会有两个DMA IP的信息,且他们子节点中仅有一个通道
在这里插入图片描述
在这里插入图片描述
此时你的system-user.dtsi也做对应的修改

&amba_pl{axidma_chrdev: axidma_chrdev@0{compatible = "xlnx,axidma-chrdev";dmas = <&axi_dma_0 0 &axi_dma_1 1>;	#axi_dma_0负责mm2s,axi_dma_1负责s2mmdma-names = "mm2s_dir0_channel", "s2mm_dir1_channel";}
}

此时如果用原本的那套内核,在 insmod axidma.ko 时会报错,出现段错误导致问题
在这里插入图片描述
此时两种解决办法,一个是给两个 PL 端的两个 DMA IP都开启两个方向,但这很麻烦,因为PL的编译时间总是比较久的。

另一种方法,你可以修改源码/driver/axidma_of.c里面,将第98-100行注释
在这里插入图片描述
用这样子的内核操作后,驱动插入正常
在这里插入图片描述

至于为什么出现该问题,以及为什么这样子可以解决,笔者还没有仔细想过。有了解的可以留言或私信讨论。
在单DMA IP承担双通道任务时,不要注释这个,否则有一路通道会找不到

三、lite和fpd的时钟最好一致

假设我现在需要PL端内部的时钟是分置开的(不同时钟源),
在这里插入图片描述
在这里插入图片描述
在驱动中你可以看到,s_axi_lite_aclk的时钟源是<&zynqmp_clk 71>,而m_axi_mm2s_aclk的时钟源是<&misc_clk_0>。笔者实测下来这样子会报错找不到通道,
在这里插入图片描述

最好把他们三个的时钟统一,如果需要时钟转换,就在DMA数据在PL的流中给个FIFO来转时钟阈。(如图中1,3)
在这里插入图片描述
在这里插入图片描述

这样子即可插入内核成功
在这里插入图片描述

反正简单而言,
1、 mm2s方向要写0,s2mm方向要写1
2、 根据你的需要选择是否注释axidma_of.c中的98-100行
3 、尽量保持DMA IP接口与示例工程统一,把修改留在PL内部,而不是PS-PL的接口上
4、 中断记得要接
在这里插入图片描述

以上讲解并没有讲述原理,只是简单提一种解决方案,若有对此了解的,欢迎与我联系。

http://www.xdnf.cn/news/15230.html

相关文章:

  • 飞算 JavaAI 智能编程助手:颠覆编程旧模式,重构新生态
  • 深入解析Java的G1收集器:原理、实战与优缺点
  • Umi-OCR 的 Docker安装(win制作镜像,Linux(Ubuntu Server 22.04)离线部署)
  • 企业采购成本越来越贵?根源在哪,数据怎么分析?
  • 奇哥面试记:SpringBoot整合RabbitMQ与高级特性,一不小心吊打面试官
  • 供应链管理-计划:产能策略
  • Java 并发AQS为什么是双向链表
  • [面试] 手写题-选择排序
  • 学习C++、QT---20(C++的常用的4种信号与槽、自定义信号与槽的讲解)
  • JavaAI时代:重塑企业级智能开发新范式
  • 秋招小白学数据结构-1-数据结构前置知识
  • 面向构件的编程(COP)深度解析:构建模块化系统的工程范式
  • Linux_3:进程间通信
  • (六)复习(OutBox Message)
  • 游戏的程序员会不会偷偷改自己账号的数据?
  • C++迭代器失效
  • 数据结构 顺序表(3)---顺序表的应用
  • 计算机基础:内存模型
  • 深入理解JVM的垃圾收集(GC)机制
  • 【U-Boot】Shell指令
  • 今日行情明日机会——20250711
  • 运行ssh -T git@github.com报错
  • 【工具变量】全国省市区县土地出让结果公告数据(2000-2024年)
  • 限流算法
  • time_wait状态分析
  • 数据库大文件损坏后,数据恢复操作(记录)
  • windows exe爬虫:exe抓包
  • 开源“具身大脑” 实现不同机器人群体协作-RoboBrain
  • 电力分析仪的“双语对话”:CCLinkIE与Modbus TCP的无缝连接
  • ParaCAD 笔记 png 图纸标注数据集