从零开始zynq linux AXI DMA传输

2023-11-20

本文从0开始叙述过程。

使用的工具为vivado2016.4,sdk也是2016.4.

准备工作:

首先下载如下的目标文件:

1.下载xilinx官方的bootloader文件

$ git clone https://github.com/Xilinx/u-boot-xlnx.git boot_loader-generator

2.下载xilinx device tree生成工具

git clone https://github.com/Xilinx/device-tree-xlnx.git device_tree-generator

3.下载dtc编译工具

git clone https://git.kernel.org/pub/scm/utils/dtc/dtc.git dtc

4.下载linux kernel

git clone https://github.com/Xilinx/linux-xlnx.git  linux_kernel-sources

5.下载root file system

$ git clone git://git.buildroot.net/buildroot file_system

6.拷贝用户空间AXIDMA测试程序

git clone https://github.com/bperez77/xilinx_axidma

PL端

1.创建PL端工程

这里给一张图,按图在vivado里设置该工程,(我用的是zedboard)


2.创建设备树

a)在生成bit文件并export后的vivado工程中,选择file--》launch sdk---》点击ok

b)在菜单栏中选择Xilinx Tools --> Repositories

c)在弹窗中选择New,并添加在第一小节中下载的device tree,如下图所示。

d)接下来创建BSP

选择File-->New-->Board Support Package,在Board Support Package框中选择 device tree,然后点击Finish。在跳出的窗口中选择bootargs,并填入如下:

console=ttyPS0,115200 root=/dev/mmcblk0p2 rw rootfstype=ext4 earlyprintk rootwait

完成后会多出如下内容:

生成的设备树位于axidma_user/axidma_user.sdk/device_tree_bsp_0:

其中pl.dtsi是PL侧设备树信息,正确的工程生成的设备树如下:

/*
 * CAUTION: This file is automatically generated by Xilinx.
 * Version:  
 * Today is: Sun Apr  2 18:20:15 2017
*/


/ {
    amba_pl: amba_pl {
        #address-cells = <1>;
        #size-cells = <1>;
        compatible = "simple-bus";
        ranges ;
        axi_dma_0: dma@40400000 {
            #dma-cells = <1>;
            clock-names = "s_axi_lite_aclk", "m_axi_sg_aclk", "m_axi_mm2s_aclk", "m_axi_s2mm_aclk";
            clocks = <&clkc 15>, <&clkc 15>, <&clkc 15>, <&clkc 15>;
            compatible = "xlnx,axi-dma-1.00.a";
            interrupt-parent = <&intc>;
            interrupts = <0 29 4 0 30 4>;
            reg = <0x40400000 0x10000>;
            xlnx,addrwidth = <0x20>;
            dma-channel@40400000 {
                compatible = "xlnx,axi-dma-mm2s-channel";
                dma-channels = <0x1>;
                interrupts = <0 29 4>;
                xlnx,datawidth = <0x20>;
                xlnx,device-id = <0x0>;
            };
            dma-channel@40400030 {
                compatible = "xlnx,axi-dma-s2mm-channel";
                dma-channels = <0x1>;
                interrupts = <0 30 4>;
                xlnx,datawidth = <0x20>;
                xlnx,device-id = <0x0>;
            };
        };
        axi_gpio_0: gpio@41200000 {
            #gpio-cells = <2>;
            compatible = "xlnx,xps-gpio-1.00.a";
            gpio-controller ;
            reg = <0x41200000 0x10000>;
            xlnx,all-inputs = <0x0>;
            xlnx,all-inputs-2 = <0x0>;
            xlnx,all-outputs = <0x1>;
            xlnx,all-outputs-2 = <0x0>;
            xlnx,dout-default = <0x00000000>;
            xlnx,dout-default-2 = <0x00000000>;
            xlnx,gpio-width = <0x8>;
            xlnx,gpio2-width = <0x20>;
            xlnx,interrupt-present = <0x0>;
            xlnx,is-dual = <0x0>;
            xlnx,tri-default = <0xFFFFFFFF>;
            xlnx,tri-default-2 = <0xFFFFFFFF>;
        };
    };
};

生成FSBL

依然是刚刚打开的skd中。

a)File->New->Application Project.注意:按如下方式核对一下。无误后点击finish。


b)在Project explorer中右键FSBL,然后选择Bulid Configuration项,然后选择Set Active ->Release。再一次右键FSBL,然后选择Clean Project,然后在邮件FSBL,然后选择Build Project。

如果顺利console窗口的输出如下:


其所在目录和device tree在统一个目录下:


编译u-boot

按如下方式修改u-boot,使用SD上的文件系统而非ramdisk文件系统


导出xilinx路径:

export PATH=/opt/Xilinx/SDK/2016.4/gnu/arm/lin/bin:$PATH
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-                                                
然后编译

gsc@gsc-250:~/zynq7000/ZedBoard/resources/boot_loader/boot_loader-generator$ make distclean
gsc@gsc-250:~/zynq7000/ZedBoard/resources/boot_loader/boot_loader-generator$ make zynq_zed_config
编译完成以后,u-boot跟目录变成:


我们需要图中绿色的u-boot文件,这里将其重命名成u-boot.elf。下一小节将使用它。

生成二进制文件

依然是SDK里。选择Xilinx Tools->Create Boot Image,切记相关配置。


其中-boot.elf,FSBL.elf以及bit文件是前面生成的。

最终将在output path下指定的路径里将生成Boot.bin文件供后面使用。至此可以退出SDK。

编译linux

导出xilinx路径:

export PATH=/opt/Xilinx/SDK/2016.4/gnu/arm/lin/bin:$PATH
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-                                                
配置linux

$ make distclean
$make ARCH=arm xilinx_zynq_defconfig
$ make ARCH=arm menuconfig
$ export PATH=/home/gsc/zynq7000/ZedBoard/projects/boot_loader/tools/:$PATH(这个是前面编译生成uboot下的tools路径)
$make ARCH=arm UIAMGE_LOADADDR=0x8000 uImage
这里需要配置linux,具体来说就是去掉ramdisk的支持,并且开启代码的支持。


文件太长不单独列出,有需要,下载地址:

编译完成后


生成linux加载使用的设备树

如果没错,则生成的设备树在如下目录:


使使用如下命令生成设备树

gsc@gsc-250:~/zynq7000/ZedBoard/projects/linux_kernel/scripts/dtc$ dtc -O dtb -I dts -o devicetree.dtb  /home/gsc/zynq7000/ZedBoard/projects/hardware_design/axidma_user/axidma_user.sdk/device_tree_bsp_0/system.dts 

生成文件系统

导出xilinx路径:

export PATH=/opt/Xilinx/SDK/2016.4/gnu/arm/lin/bin:$PATH
export CROSS_COMPILE=arm-xilinx-linux-gnueabi-           
make xconfig
make  
整个编译过程会根据配置先下载相关工具,然后进行编译。


在生成的目录中

file_system/output/images/rootfs.ext4

编译DMA测试程序:

make CROSS_COMPILE=arm-linux-gnueabihf- ARCH=arm KBUILD_DIR=</path/to/kernel/tree> driver

拷贝到SD中

1.拷贝跟文件系统到ext4分区:

sudo mount -t ext4 -o loop XXX/rootfs.ext4 /mnt
sudo cp -rf /mnt/* ${Where you mount SD card}
sudo umount -l /mnt


如生成的是rootfs.tar这种形式的

sudo tar -C /destination/of/extraction -xf images/rootfs.tar

将生成的DMA测试程序拷贝到SD卡的/media目录下

2.拷贝系统镜像到FAT分区

boot.bin
devicetree.dtb
uIamge


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从零开始zynq linux AXI DMA传输 的相关文章

  • Ubuntu16.04主机安装基于ZYNQ的QT交叉编译库

    Ubuntu16 04主机尝试安装基于ZYNQ的QT交叉编译库 前言 基于vivado2016 4 SDK的交叉编译环境 主机Linux上安装vivado2016 4版本 qtcreator上添加基于ZYNQ的交叉编译工具 基本环境 参考资
  • cdc多bit信号-握手处理

    对于多bit数据跨时钟 各个bit之间路径延迟不一样 源时钟域给的数据是2 b11 目的时钟域采样到的数据可能2 b10 因此两级触发器对于单bit数据跨时钟是可以用的 但是对于多bit数据跨时钟就会出错 握手处理的关键是利用源的时钟req
  • PLL时钟约束

    方法 1 自动创建基时钟和 PLL 输出时钟 例 derive pll clocks 这一方法使您能够自动地约束 PLL 的输入和输出时钟 ALTPLL megafunction 中指定的 所有 PLL 参数都用于约束 PLL 的输入和输出
  • HLS图像处理系列——在ZEDBoard搭建DDR图像处理通路

    ZYNQ芯片内包含一个丰富特性的基于双核ARM Cortex A9的处理子系统 Processing System PS 和Xilinx 28nm可编程逻辑 Programmable Logic PL PS除了核心外还包括片上存储器 外部存
  • FPGA同步复位和异步复位的区别以及设计处理

    FPGA复位信号的设计处理 同步复位 同步复位 同步复位信号跟触发器的时钟是同步的 只有在时钟的跳变沿到来之后才会生效 对应verilog代码如下 这种写法会被编译器综合成同步复位 always posedge clk begin if r
  • SD卡读写实验(SPI模式)

    对于 SD 卡的 SPI 模式而言 采用的 SPI 的通信模式为模式 3 即 CPOL 1 CPHA 1 在 SD 卡 2 0 版 本协议中 SPI CLK 时钟频率可达 50Mhz SD 卡的 SPI 模式 只用到了 SDIO D3 SP
  • FPGA实战--等精度频率测量

    首先放置效果图 本次试验中采用的是等精度测频率 等精度测频的原理是产生一个1s的高电平 在高电平中对被测方波进行计数 所测得数字即该波形频率 具体等精度测量原理请参考 http www elecfans com d 591858 html
  • FPGA(3)验证数字逻辑(与门、与非门、二选一数据选择器、2-4译码器、半加器、全加器)

    目录 一 验证与门 二 验证与非门 三 验证二选一数据选择器 四 验证2 4译码器 五 验证半加器 六 验证全加器 0 初始化定义 1 第一个半加器 2 第二个半加器 3 得到最终进位Co 代码 0决定与 1决定或 一 验证与门 只要有一个
  • FPGA学习笔记(一)__电平知识

    常见电平标准 文章目录 1 TTL电平标准 2 LVTTL电平标准 1 LVTTL3V3 2 LVTTL2V5 3 CMOS电平标准 4 LVCOMS电平标准 1 LVCOMS3V3 2 LVCOMS2V5 3 LVCOMS1V8 4 LV
  • FPGA_MIG驱动DDR3

    FPGA MIG驱动DDR3 说明 FPGA zynq 7z100 DDR3 MT41K256M16TW 107 内存大小为512MB 数据接口为16bit 环境 Vivado2018 2 IP核 Memory Interface Gene
  • Verilog、FPGA、统一寄存器的使用

    我有一个问题 关于我正在开发的 AGC SPI 控制器在我看来奇怪的行为 它是用 Verilog 完成的 针对的是 Xilinx Spartan 3e FPGA 该控制器是一个依赖外部输入来启动的 FSM FSM的状态存储在状态寄存器它没有
  • 基于FPGA的简易BPSK和QPSK

    1 框图 2 顶层 3 m generator M序列的生成 输出速率为500Kbps 4 S2P是串并转换模块 将1bit的m序列转换到50M时钟下的2bit M序列数据 就有4个象限 5 my pll是生成256M的时钟作为载波 因为s
  • 用于 Verilog 或 SystemVerilog 的 TAP(测试任何协议)模块

    是否有 TAP 测试任何协议 http testanything org Verilog 的实现 那就太好了 因为这样我就可以使用证明来自动检查我的结果 更新 10 9 09 有人问为什么不使用断言 部分 TAP 为我提供了一些很好的报告
  • 如何生成异步复位verilog总是阻塞凿子

    Chisel 始终生成敏感度列表中仅包含时钟的块 always posedge clk begin end 是否可以将模块配置为使用异步重置并生成这样的始终块 always posedge clk or posedge reset begi
  • PyOpenCL 中的时间测量

    我正在 FPGA 和 GPU 中使用 PyOpenCL 运行内核 为了测量执行所需的时间 我使用 t1 time event mykernel queue c width c height block size block size d c
  • 您可以使用类 C 语言对 FPGA 进行编程吗? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 在大学里 我用类似 C 的语言编写了 FPGA 不过 我也知道人们通常使用 Verilog 或 VHD
  • FPGA 有哪些实际应用?

    我对我的程序为一个小型七段显示器提供动力感到非常兴奋 但是当我向不在现场的人展示它时 他们总是说 那么你能用它做什么 我永远无法给他们一个简洁的答案 谁能帮我吗 第一 它们不需要具有易失性存储器 事实上 大厂商 Xilinx Altera
  • 从 OpenCV 代码到 FPGA 代码的转换是否比 Matlab 代码更容易? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想做一个关于图像处理的项目 我想知道如果我想在FPGA上实现这个项目 我应该在第一阶段选择Matla
  • 映射 MMIO 区域写回不起作用

    我希望对 PCIe 设备的所有读写请求都由 CPU 缓存进行缓存 然而 它并没有像我预期的那样工作 这些是我对回写 MMIO 区域的假设 对 PCIe 设备的写入仅在缓存回写时发生 TLP 有效负载的大小是缓存块大小 64B 然而 捕获的
  • 在 Verilog 程序中使用连续分配?

    在 Verilog 程序中使用连续赋值是否可能和 或有用 例如 是否有任何理由将assign里面一个always堵塞 例如这段代码 always begin assign data in Data end 此外 是否可以用这种方法生成顺序逻

随机推荐

  • 输出数组的最大值、最小值及其位置

    题目 输入一个长度为10的数组 输出数组的最大值 最小值及其最大值 最小值在数组里的位置 思路 如果只需找出最大值 我们可以假定最大值max为数组的第一个元素 然后将剩余的元素逐个和max比较 如果有比max更大的元素 就将其记录下来 直到
  • Qt HTTP POST json 访问服务器

    form格式访问服务器 QByteArray postArray postArray append grant type authorization code postArray append client id 32u2w95f200D4
  • 数据中台与数据仓库区别

    1 数据源不同 先从数据来源上来说 数据中台的数据来源可以是结构化数据或者非结构化的数据 而传统数仓的数据来源主要是业务数据库 数据格式也是以结构化数据为主 2 数据的处理不同 数据中台不仅仅是汇聚企业各种数据 而且让这些数据遵循相同的标准
  • 用户复购周期计算

    用户复购周期 两次购买之间的时间间隔 一 首先使用SQL进行计算 注 用户在一天中发生多次购买则只记为1次购买 1 根据用户id与购买日期进行分组 将一天内发生多次消费记录进行合并 DROP TABLE member Repurchase
  • Python播放GIF图片(ChatGPT代码参考)

    在网上找了好几个方法 最后还是出现各种问题 解决不了播放GIF的功能 最后 通过ChatGPT给出了简单明了的方案 使用第三方库imageio和matplotlib animation来实现 调试直接通过 但有小瑕疵 就是显示gif时隐藏掉
  • caffe源码 之 CPU与GPU数据同步类

    本文主要解析caffe源码文件 src caffe SycedMem cpp 该文件主要实现cpu与gpu的内存同步 先看SycedMem hpp中SycedMem的类定义 ifndef CAFFE SYNCEDMEM HPP define
  • 简单的连接数据库的Web登录界面

    简单的连接数据库的Web登录界面 一 需求分析 实现在登录界面输入用户名和密码 连接数据库 与数据库信息进行比对 若用户名和密码相互匹配 则显示登陆成功 若不正确 选择重新输入 二 工具 1 MySql 2 Tomcat 3 Java EE
  • spring boot 定时任务参数设置

    cron参数 分别对应 秒 分 时 日 月 年 0 0 10 14 16 每天上午10点 下午2点 4点 逗号之间连接起来算一个 0 0 12 每天中午12点触发 0 0 5 0 每5分钟执行一次 0 10 14 16 每天上午10点 下午
  • 程序删除自身

    Windows平台下删除自身的方法 通过bat文件删除 echo off loop del access exe if exist access exe goto loop del DelMe bat 用C C 语言表示创建DelMe ba
  • Python 变量与赋值

    一 变量及类型 1 变量可以是任意的数据类型 在程序中用一个变量名表示 2 变量名区分大小写 3 变量名必须是大小写英文 数字和下划线 的组合 且不能以数字开头 如 gt gt gt a 1 变量a是一个整数 gt gt gt t 007
  • 执行存储过程 获得 table 返回结果

    调用存偖过程 写入投诉信息 SqlConnection conn db GetCon 连接数据库 conn Open 并打开了连接 SqlCommand sqlcmd new SqlCommand 存偖过程名称 conn 使用存偖过程 sq
  • 如果老板要求你的系统接入春晚大流量活动,你会心慌慌吗?

    目录 回头看看 原始系统技术架构 基于CDN的活动静态页面缓存方案 基于Nginx Tomcat Redis的多级缓存方案 超高并发写请求RocketMQ削峰填谷方案 系统限流防雪崩体系架构方案 今天给大家分享一个话题 就是如果要是你老板突
  • MyBatis实现Mapper配置并查询数据

    什么是Mapper 在MyBatis工程搭建 中我们主要讲解的是 MyBatis 如何连接数据库 具体执行 SQL 语句使用的是 JDBC 方式 但在实际应用中是不会选择 JDBC 来执行 SQL 的 MyBatis 提供了 Mapper
  • MeterSphere接口测试cookie提取正则表达式

    在接口自动化测试中经常需要提取header cookie信息 MeterSphere接口自动化测试 添加cookie提取方法如下 0 开启场景共享cookie 1 选择要提取cookie的请求步骤 2 点击后置操作 3 添加参数提取 类型选
  • Vuetify笔记(3):v-btn按钮和v-text-field文本

    1 v btn按钮 在UI组件中v btn组件是用一个material design主题和多个选项来替换标准的html按钮 任何色彩辅助类都可以用来改变背景或文字的颜色 v btn按钮常用属性 1 flat 移除按钮的背景色 布尔值类型 默
  • 蓝桥杯真题:迷宫

    目录 题目描述 运行限制 dfs bfs 结果 题目描述 本题为填空题 只需要算出结果后 在代码中使用输出语句将所填结果输出即可 下图给出了一个迷宫的平面图 其中标记为 11 的为障碍 标记为 00 的为可以通行的地方 010000 000
  • 前端趋势 2022

    大家好 我是若川 持续组织了近一年的源码共读活动 感兴趣的可以 加我微信lxchuan12 参与 每周大家一起学习200行左右的源码 共同进步 同时极力推荐订阅我写的 学习源码整体架构系列 包含20余篇源码文章 历史面试系列 另外 目前建有
  • js判断字符串以某字符开头或结尾

    一 substr start length 函数 1 概述 substr start length 从start开始往后截取length位 下标从0开始 长度从开始下标计算 2 举例 var str 我是一只快乐的小青蛙 str subst
  • XSS(跨站脚本攻击)详解

    XSS攻击通常指的是通过利用网页开发时留下的漏洞 通过巧妙的方法注入恶意指令代码到网页 使用户加载并执行攻击者恶意制造的网页程序 这些恶意网页程序通常是JavaScript 但实际上也可以包括Java VBScript ActiveX Fl
  • 从零开始zynq linux AXI DMA传输

    本文从0开始叙述过程 使用的工具为vivado2016 4 sdk也是2016 4 准备工作 首先下载如下的目标文件 1 下载xilinx官方的bootloader文件 git clone https github com Xilinx u