代码编织梦想

AXI-DMA的linux驱动

一、搭建硬件环境

vivado版本2017.4,芯片为7010,不过不管什么版本和芯片大致步骤是一样的
本文工程文件:https://gitee.com/long_fly/AXIDMA_linux
硬件平台PL的搭建同ZYNQ基础系列(六) DMA基本用法,在这个工程的基础上添加SD卡(根据自己的开发板硬件选择相应的引脚)
这里写图片描述
然后直接生成bit文件,然后记得要导出硬件(包含bit文件)进SDK

二、生成设备树

1.解压设备树工具文件夹到一个地方
https://github.com/Xilinx/device-tree-xlnx下载
2.菜单栏 –> Xilinx –> Repositories
添加刚刚解压的位置
这里写图片描述
3.菜单栏 –> File –> New –> Board Support Package
创建BSP,可以发现多了一栏device_tree,直接点确定到下一步
这里写图片描述
4.设置环境变量
这里写图片描述
内容为:console=ttyPS0,115200 root=/dev/mmcblk0p2 rw rootfstype=ext4 earlyprintk rootwait
5.最后可以在工程文件夹中找到生成的设备树文件
这里写图片描述
待用

三、生成FSBL引导文件

1.在SDK中新建一个APP,选择FSBL模板工程,然后完成创建
这里写图片描述
这里写图片描述
2.使能调试信息打印
这里写图片描述
添加#define FSBL_DEBUG_INFO后,保存文件,会生成FSBL.elf文件,文件待用

四、编译u-boot

0.具体的相关环境(不装会报错)和SDK环境安装(不装没法编译,建议去官网下载)
参考ZYNQ跑系统 系列(一) 传统方式移植linux,不再赘述;u-boot和kernel直接在https://github.com/Xilinx下载;还有注意以下路径是我自己的,要根据实际修改相应路径
1.linux超级用户模式,定位settings64.sh文件(在SDK安装文件夹里)
source /opt/Xilinx/SDK/2017.1/settings64.sh
2.进入u-boot目录(自己解压的路径)
cd /home/hlf/mnt/u-boot-xlnx-master
3.打开GUI配置u-boot
make menuconfig,load预配置的文件,绝对路径为/home/hlf/mnt/u-boot-xlnx-master/configs/zynq_ax7010_defconfig
这里写图片描述,观察了一下没什么需要修改的,直接保存并退出
4.读配置文件(zynq_ax7010_defconfig)
make CROSS_COMPILE=arm-xilinx-linux-gnueabi- zynq_ax7010_defconfig
5.编译
make CROSS_COMPILE=arm-xilinx-linux-gnueabi-
6.查看 u-boot 文件的不同段的内存分配情况 (可以不看)
arm-xilinx-linux-gnueabi-objdump -h u-boot
7.修改后缀为u-boot.elf,待用
这里写图片描述

五、编译kernel

1.进入kernel目录(自己解压的路径)并和之前一样定位文件
cd /home/hlf/mnt/linux-xlnx-master
source /opt/Xilinx/SDK/2017.1/settings64.sh
2.打开GUI配置kernel
make ARCH=arm menuconfig,load预配置的文件,绝对路径为/home/hlf/mnt/linux-xlnx-master/arch/arm/configs/xilinx_zynq_defconfig,这里不通过GUI方式更改配置,关闭
3.开启DMA的相关功能
也可以不通过GUI的方式配置kernel,这里我们直接命令行(要在超级用户模式下,不然没有权限修改):
gedit /home/hlf/mnt/linux-xlnx-master/arch/arm/configs/xilinx_zynq_defconfig
打开文件,确保以下选项开启(=y)

CONFIG_CMA=y
CONFIG_DMA_CMA=y
CONFIG_XILINX_DMA_ENGINES=y
CONFIG_PL330_DMA=y
CONFIG_XILINX_DMA=y
CONFIG_XILINX_AXIDMA=y
CONFIG_XILINX_AXIVDMA=y
CONFIG_DMA_SHARED_BUFFER=y

4.读配置
make ARCH=arm xilinx_zynq_defconfig
5.编译内核
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi- uImage LOADADDR=0x00008000
6.编译完成后,命令行会提示生成的uImage的位置
uImage拷贝出来待用
7.生成devicetree.dtb
将设备树文件夹拷贝到虚拟机的相应路径下
这里写图片描述
pl.dtsi中添加:

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

这里写图片描述
保存后,生成devicetree.dtb:
./scripts/dtc/dtc -I dts -O dtb -o /home/hlf/mnt/device_tree_bsp_0/devicetree.dtb /home/hlf/mnt/device_tree_bsp_0/system-top.dts

六、准备运行linux

1.生成BOOT.bin
之前产生了FSBL.elfu-boot.elfbit文件,直接通过SDK生成BOOT.bin
2.拷贝文件至SD卡
将之前产生的BOOT.bindevicetree.dtbuImage拷贝到SD卡
3.插上串口开机运行
这里写图片描述
确保可以运行系统

七、编译例程

0.下载例程
例程下载地址:https://github.com/bperez77/xilinx_axidma或者https://gitee.com/long_fly/AXIDMA_linux
1.拷贝例程文件夹到kernel文件夹里
这里写图片描述
我将文件夹命名为了extra,直接将例程文件夹的内容放到里面,如果没有权限的话,直接命令行chmod 777 文件夹名获取相应权限就可以了
2.cd到extra文件夹里
3.编译
使用交叉编译链,定位到kernel(已经编译好的)的路径,编译driver:
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm KBUILD_DIR=/home/hlf/mnt/linux-xlnx-master/ driver
使用交叉编译链,编译examples:
make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm examples
编译完成后,生成文件将出现在outputs文件夹里
这里写图片描述
4.将这些文件拷贝到SD卡中,开机
5.挂载SD卡
cd ..到达系统目录
mount /dev/mmcblk0p1 /mnt挂载SD卡
cd /mnt进入SD目录
insmod axidma.ko载入刚刚生成的模块
这里写图片描述
打印信息提示通道的ID冲突
6.修改设备树中通道的ID号
这里写图片描述
然后按照之前的步骤重新生成devicetree.dtb,将新设备树文件拷贝到SD卡中,然后开机,挂载SD卡,加载模块
这次没有打印信息提示ID冲突
7.查看是否成功
cd /dev到达dev目录
ls查看内容
这里写图片描述
会发现多了一个axidma,然后运行dmesg,可以看到如下信息:
这里写图片描述
8.运行例程里的APP1
这里写图片描述
发现CMA内存不够,导致接收缓存空间申请不了这么大,在设备树文件夹中修改.dts后缀的文件,添加cma空间的申请
这里写图片描述
然后重新生成devicetree.dtb文件,拷贝到SD卡中,开机,挂载SD卡,加载模块,运行APP
这里写图片描述
可以测试收发通道的数据速率
9.运行例程里的APP2
在SD卡中新建两个文本,在其中一个文本文件中写入内容,另一个为空
这里写图片描述
运行应用程序,将文件1的内容通过DMA环路写入文件2,因为文件太小了,所以显示的是0.00Mb
这里写图片描述
运行结束后打开文件2,会发现和文件1里的内容完全一致

八、代码分析与修改及应用到VDMA

……

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/long_fly/article/details/80482248

axidma 驱动的使用_yanhe156的博客-爱代码爱编程

AXIDMA 驱动的使用 Yan He本文档主要是对github上的一个开源项目AXIDMA的README进行一些补充 环境 linux 4.4(对应的是xilinx-linux-2016.2 )vivado 2016

ubuntu下petalinux移植中设备树的修改 - zynq7021学习_逸璞丷昊的博客-爱代码爱编程_petalinux 设备树修改

Device Tree是一种描述硬件的数据结构,由一系列被命名的结点(node)和属性(property)组成,而结点本身可包含子结点。所谓属性,其实就是成对出现的name和value。在Device Tree中,可描述的信息包括(原先这些信息大多被hard code到kernel中):CPU的数量和类别,内存基地址和大小,总线和桥,外设连接,中断控制器和

zynq #4 - linux环境下使用axi-dma读取pl外接adc_里先森的博客-爱代码爱编程

该篇文章是上一篇博客(https://blog.csdn.net/sements/article/details/90230188)的实际应用版本。在上篇中我们只是在PL端搭建了一个简单的AXI-DMA回环数据流进行测试,在该篇博客中,我们将实际的使用AXI-DMA这个IP核,使用xilinx_axidma库对一个挂载在PL端的ADC(AD7606,

axi dma linux驱动-爱代码爱编程

1.PL端设计: PL端设计包括四个AXI DMA IP,它们分别和zynq处理IP的HP口相连接。 这个设计是基于Avnet-Digilent-ZedBoard-v2016.1-final.bsp,由于其它的i

zynq7000学习 1.如何在linux平台上运行dma模块-爱代码爱编程

本文中所使用的实验环境说明:VMware虚拟机,ubuntu16.04版本的linux系统,Xilinx SDK2017.4(文中用到了它的编译器),Petalinux2019.1(可以选装黑金的2017.4版本,笔者这里安

基于xilinx zynq7000平台(zynq7030),使用 github上的axi_dma驱动操作dma(PL与PS通信)-爱代码爱编程

前言 最近公司项目中使用到了赛灵思Xilinx zynq7000系列(7030)平台,产品中需要在arm(PS)与fpga(PL)之间进行大批量数据传输,还要考虑效率问题,因此使用了axi_dma模块,我用的xilinx工具(xilinx-sdk)以及组件(u-boot、kernel)都是2018.2版本。 驱动选择 方式一: 采用proxy-dm

ubuntu16.04 Xllinx SDx 2018.2 安装教程-爱代码爱编程

ubuntu16.04 Xllinx SDx 2018.2 安装教程一、安装Ubuntu16.04 下载地址: 链接:https://pan.baidu.com/s/1oyKo5XS7QDqSqHUnx-vN6w 提取码:fleg 具体安装步骤网上有很多教程,大家可以自己去按照教程安装。二、Xllinx SDx 2018.2 安装 1、首先到官网下载安装包

AXI DMA总结、内核axidmatest.c测试程序分析、SG mode-爱代码爱编程

AXI DMA 概述: XILINX提供的AXI DMA支持Scatter/Gather mode和Direct Register mode 数据位宽支持32,64,128,256,512,1024bits,stream数据位宽支持8,16,32,64,128,256,512,1024bits,这里数据位宽表示DDR到上图中DataMover的数据位

ZYNQ | AXI DMA数据环路测试-爱代码爱编程

利用AXI DMA进行批量数据环路的测试 背景软硬件平台原理概述工程搭建1.新建一个vivado工程2.创建block design①zynq ip核的添加与配置②AXI DMA ip核的添加与配置③AXI4-Stream Data FIFO核的添加与配置④让vivado自行添加余下ip核⑤连接未连接的部分⑥可选:添加ILA ip核观察DMA的2个

AXI DMA设备树-爱代码爱编程

接上一篇博客《PS与PL通信(AXI DMA)》https://blog.csdn.net/hongmao6/article/details/110626857   设备节点为: /* * CAUTION: This file is automatically generated by Xilinx. * Version: * Today

Petalinux2020.01 内核DMA驱动调试-爱代码爱编程

1、在用户设备树中 pl-custom中 /delete-node/ &axi_dma_0; / { axi_dma_0: dma@a0000000 { #dma-cells = <1>; clock-names = "s_axi_lite_aclk", "m_axi_mm2s_aclk", "m_axi_s2mm_aclk

zynq操作系统: Linux驱动开发AXIDMA篇-爱代码爱编程

前言    由于bram形式的速率限制,在同样紧急的时间条件下,还是改回了axidma的方式来降维打击,对于几兆的速率,颇有种杀鸡用牛刀的感觉,没办法,原来的刀就是差一点,牛刀好用是好用但是终究得提升一点内功 裸机下的DMA相对是比较简单的,参考之前裸板对于DMA的操作,而对于LINUX下,只能说苦不堪言。先不谈如何实现用户空间的零拷贝DMA传输,光是L

linux设置dma 大小,linux DMA接口知识点详解-爱代码爱编程

1.两种DMA映射类型 1.1. 一致性DMA映射(Consistent DMA mappings ) 主要用于映射长时间使用的区域。 CPU和DMA controller不需要考虑cache的影响。 这里的consistent实际上是coherent的概念,不能保证consistent,也就是说需要memory barrier来保证memor

ZYNQ系列(十二)linux的DMA使用-爱代码爱编程

ZYNQ系列(十二)linux的DMA使用 文章目录 ZYNQ系列(十二)linux的DMA使用前言开发环境准备工作petalinux工程建立建立工程配置内核1. 配置DMA2. 配置CMA修改设备树生成BOOT.BIN烧录编译Github的DMA代码运行收工出错集锦 前言 linux的DMA对于新手而言一直是一个噩梦,先不谈如何实现用户空

zynq ps linux设备驱动,Zynq PS侧DMA驱动-爱代码爱编程

Linux中,驱动必然会有驱动对应的设备类型。在linux4.4版本中,其设备是以设备树的形式展现的。 PS端设备树的devicetree表示如下 324 dmac_s: dmac@f8003000 { 325 compatible = "arm,pl330", "arm,primecell"; 326 reg = <0xf80

linux dma zone大小,关于Linux内核 ZONE_DMA-爱代码爱编程

ZONE_DMA设置的原因是因为,当年主板上的ISA总线中的DMA控制器只能寻址24位物理地址,因此最多能够寻址到16MB的地方。现在,随着硬件的发展,ISA早已经成为历史。可是,为什么现在还要保留着ZONE_DMA区呢? 这是在linux-kernel mail list上的答案: While ISA is gone as a true peri