Zynq MPSOC上用户面DMA传输的实现

本文介绍了在Zynq MPSOC系统中,如何在Linux用户面实现AXI DMA传输。通过Linux内核的dma驱动框架和Xilinx的DMA驱动引擎,结合ping-pong缓冲区和ioctl接口,实现从FPGA到A53的单向大帧数据传输,减少数据拷贝提高效率。
摘要由CSDN通过智能技术生成

一、引言

ZynqMP SOC是xilinx公司推出的面向AI应用(如:云计算、边缘计算)、高度灵活、高性能的处理器系列,我们选择它作为产品的处理器平台,以保证未来的可持续演进。本文简要说明在基于Zynq MPSOC的产品开发中,如何在Linux的用户面实现AXI DMA传输。
Linux内核提供了dma的驱动框架,为在内核空间添加不同的dma驱动提供了标准的API接口,该框架支持多种形式的dma传输,如:内存与内存之间的axi-cdma,内存到设备或者设备到内存的axi-dma等。

二、用户面dma传输的实现

Xilinx则针对自己的SOC芯片,基于Linux dma驱动框架的基础上,提供了多种dma驱动引擎,允许用户在内核空间编写特定的dma驱动代码。但是,上述无论是linux的 dma框架,还是xilinx的dma驱动引擎,都没有提供用户面的接口,也就是说,要在用户空间使用dma,还需要另外编写代码来实现。
Xilinx的FPGA的dma-ip在linux内核中的驱动代码在文件drivers/dma/xilinx/xilinx-dma.c中,添加的user plane代码包括了一系列函数以及新增的数据结构,这部分代码在xilinx-dma.c文件中实现。几个要点:
1、dma缓冲区采用ping-pang buffer,缓冲区在内核驱动中予以分配,在驱动代码中提供了mmap接口,在user plane中程序可以访问该缓冲区,不需要进行数据从内核空间到用户空间的拷贝;
2、user plane程序通过ioctl()来启动dma、获取dma的数据;
3、在我们的应用中,dma数据传输是单方向的,即:从fpga到A53,且每一次dma传输的数据帧很大,约600K+ bytes;
4、在fpga中使用了2个axi-dma IP,连接到MPSOC的HPC口,在linux的设备树中,配置了2路axi-dma;

相关的代码片段如下:

/**
* Map the dma memory into user space 
*/
static int zynqmp_axidma_mmap(struct file *file_p, struct vm_area_struct *vma)
{
	struct xilinx_dma_device *pchannel_p;


	pchannel_p = (struct xilinx_dma_device *)file_p->private_data;
	return dma_mmap_coherent(pchannel_p->dev, vma,
					   pchannel_p->interface_p, pchannel_p->interface_phys_addr,
					   vma->vm_end - vma->vm_start);
}

/**
* Open the device file 
*/
static int zynqmp_axidma_open(struct inode *inode, struct file *file)
{
	/* get the address of 'zynqmp_dma_device' structure */
	file->private_data = container_of(inode->i_cdev, struct xilinx_dma_device, cdev);
	return 0;
}


/**
* Close the file 
*/
static i
  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值