DMA

SOC从此开始,初探ZYNQ的DMA传输

作者:Kevin,来源:开源骚客

很久都没有写文章了,一直想写一篇关于SOC的文章,始终没有想好到底该写什么。

如果说写个串口显示的 “Hello World!”,那就太简单了!

正好最近在弄ZYNQ的SOC图像处理,用到了DMA传输,便决定来写第一篇关于SOC的文章,用第一篇文章来简单的介绍一下DMA传输。

当然,这里还是解释一下什么是DMA,全称Direct Memory Access,直接内存存取。它是一种几乎不需要CPU干预的一种内存访问方式,当然这里的内存指的是DDR3。

ZYNQ的PL和PS进行DMA传输时,使用到的是High Performance AXI4 32bit/64bit Slave Ports。

视频:面向PCI Express的DMA

本视频主要介绍创建一款 PCI Express 解决方案的过程,该解决方案使用 PCI Express IP 子系统的全新 2016.1 DMA。本视频的第一部分回顾了 PCI Express 系统中 DMA 的基本功能。下一步,将介绍 PCI Express 子系统特性的全新 DMA。最后,创建使用该全新 DMA IP 的 IPI 设计,而且这一设计可部署在硬件中,通过 Linux 软件驱动程序和应用执行 PCIe 链路上的流量。

本视频将介绍 Xilinx PCIe DMA 子系统的设置过程与性能测试,先展示可实现的硬件性能,然后说明用软件进行实际传输怎么会影响性能。最后将讨论不同的选项,以提高包括选择最佳传输量与轮询在内的性能。

Zynq PS侧DMA驱动

Linux中,驱动必然会有驱动对应的设备类型。在linux4.4版本中,其设备是以设备树的形式展现的。

PS端设备树的devicetree表示如下
324 dmac_s: dmac@f8003000 {
325 compatible = "arm,pl330", "arm,primecell";
326 reg = <0xf8003000 0x1000>;
327 interrupt-parent = <&intc>;
328 interrupt-names = "abort", "dma0", "dma1", "dma2", "dma3",
329 "dma4", "dma5", "dma6", "dma7";
330 interrupts = <0 13 4>,
331 <0 14 4>, <0 15 4>,
332 <0 16 4>, <0 17 4>,

zynq audio pcm DMA

本篇接着上一篇,概述pcm调用DMA操作流程,

接着ynq alsa说起
​181 static int axi_i2s_probe(struct platform_device *pdev)
182 {
183 struct resource *res;
184 struct axi_i2s *i2s;

...

239 ret = devm_snd_dmaengine_pcm_register(&pdev->dev, NULL, 0);
240 if (ret)

....
}

注册一个基于dmaengine的PCM设备,并且也注册了注销接口。
​140 int devm_snd_dmaengine_pcm_register(struct device *dev,
141 const struct snd_dmaengine_pcm_config *config, unsigned int flags)
142 {
143 struct device **ptr;
144 int ret;
145
146 ptr = devres_alloc(devm_dmaengine_pcm_release, sizeof(*ptr), GFP_KERNEL);

基于PCIe的高速接口设计

作者:李晓宁,姚远程,秦明伟 2016年微型机与应用第1期

摘要:PCIe总线是第三代I/O总线的代表,提供高性能、高速、点到点的串行连接,支持单双工传输,通过差分链路来互连设备。该设计由Xilinx公司的Virtex-6 FPGA平台和PC机组成,为了实现PFGA与CPU之间的高速通信,开发了基于FPGA IPcore 的PCIe总线 DMA数据传输平台。通过硬件测试表明,该接口设计方案成本低,传输速率可以达到 1.5 Gb/s。

0引言

  随着电子行业的飞速发展,人们对数据处理能力和存储速率的要求越来越高,并行数据传输的PCI总线技术逐渐成为系统整体性能提升的瓶颈[1]。尤其在接收机的设计中,总线架构关系到系统的整体性能。串行点对点的PCIe总线克服了PCI总线在系统带宽、传输速度等方面固有的缺陷,有效地提高了系统的整体性能。目前实现PCIe总线功能有两种方法:采用FPGA实现PCIe的功能[2];使用PCIe桥接芯片。由于通过FPGA实现PCIe接口要比使用PCIe桥接芯片更加灵活,成本更低,可靠性更好,所以采用前者完成FPGA与PC机之间的信息的交互。

PCIe调试心得_DMA part3

作者: East  FPGA那点事儿

上一章讲述了PCIe总线如何提高DMA的效率。

本章以服务器常用的4通道1000M以太网卡为例讲述如何实现多个虚拟DMA通道。

1.多通道DMA发

4通道以太网卡的数据相互独立,需要4个虚拟DMA发通道实现4路数据独立传输。4个虚拟DMA发通道如下:

4个虚拟DMA发通道

PCIe调试心得_DMA part2

作者:East  FPGA那点事儿

上一章讲述了PCIe总线DMA的原理和XAPP1052存在的问题。

本章以服务器常用的4通道1000M以太网卡为例讲述如何提高DMA的效率。

1.内存重分配
Windows操作系统会划分一部分硬盘空间作为虚拟内存,将长时间不用得应用程序或内存交换到硬盘中,而释放出一部分内存空间供其他应用程序使用,提高计算机的性能。

或者操作系统会定进行内存碎片整理,将应用程序中零散的内存收集起来重新分配,减少内存碎片。

PCIe调试心得_DMA part1

作者 :East  FPGA那点事儿

1.PCIe的DMA介绍
在PCIe中需要使用DMA的项目,一定要先看XAPP1052,里面包含一个DMA的参考设计,对初学者有极大的帮助。

XAPP1052中包含FPGA源代码和驱动程序源代码,其中FPGA源代码最主要的文件为:
1、《TX_ENGINE.v》:是产生TLP包的逻辑,包含读TLP请求用于DMA读;写TLP请求用于DMA写;CPLD用于BAR空间读。
2、《RX_ENGINE.v》:是解析TLP包的逻辑,包含读TLP解析用于BAR空间读、写TLP解析用于BAR空间写、CPLD解析用于DMA读。

DMA分为读和写种操作,两种操作在细节上不同。

这里先简单介绍一下DMA读过程:
1、驱动程序向操作系统申请一片物理连续的内存;
2、主机向该地址写入数据;

作者:Steve Leibson, 赛灵思战略营销与业务规划总监

在我上一篇博客里,我们达成一个观点,就是使用DMA(直接内存访问)的好处很明显,我之前在“Adam Taylor MicroZed系列之21”也提到使用AXI接口的DMA的好处。

虽然达成这样一个观点,但我们还有一个值得思考的问题,DMA到底是什么?

最基本的,一旦处理器配置好传输方式之后,DMA可以自己完成内存数据的搬进或者搬出,而不需要处理器的介入。如果使用方法得当,DMA可以显著地提高系统性能。

同步内容