0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ZYNQ跑系统系列开发:AXI-DMA的linux驱动案例

电子设计 来源:CSDN博主 作者:long_fly 2021-01-02 09:11 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、搭建硬件环境

vivado版本2017.4,芯片为7010,不过不管什么版本和芯片大致步骤是一样的

本文工程文件:https://gitee.com/long_fly/AXIDMA_linux

硬件平台PL的搭建同ZYNQ基础系列(六) DMA基本用法,在这个工程的基础上添加SD卡(根据自己的开发板硬件选择相应的引脚)

o4YBAF9uJIOAE8PDAAB1-qbQiXc289.png

然后直接生成bit文件,然后记得要导出硬件(包含bit文件)进SDK

二、生成设备树

1.解压设备树工具文件夹到一个地方
https://github.com/Xilinx/device-tree-xlnx下载

2.菜单栏 –> Xilinx –> Repositories
添加刚刚解压的位置

pIYBAF9uJISALIXNAADC-32FTL0002.png

3.菜单栏 –> File –> New –> Board Support Package
创建BSP,可以发现多了一栏device_tree,直接点确定到下一步

pIYBAF9uJIaAGFnxAACepXuBb_Y518.png

4.设置环境变量

pIYBAF9uJIeAB4d2AACVvVQ4PwI263.png

内容为:console=ttyPS0,115200 root=/dev/mmcblk0p2 rw rootfstype=ext4 earlyprintk rootwait

5.最后可以在工程文件夹中找到生成的设备树文件

o4YBAF9uJImAY1BMAADBqPjxGaA048.png

待用

三、生成FSBL引导文件
1.在SDK中新建一个APP,选择FSBL模板工程,然后完成创建

pIYBAF9uJIqAPLSuAACHcwdr2xc592.png


pIYBAF9uJIyATDjWAAB0yQ8VkRU433.png

2.使能调试信息打印

o4YBAF9uJI2AUdlVAACCtvB3KyI720.png

添加#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

pIYBAF9uJI-AV4E7AACJwy_ISGY398.png

,观察了一下没什么需要修改的,直接保存并退出
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,待用

o4YBAF9uJJCAWA5vAACa9KV2dG8679.png

五、编译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
将设备树文件夹拷贝到虚拟机的相应路径下

o4YBAF9uJJKADGNQAACrrB0rMKI819.png

在pl.dtsi中添加:
axidma_chrdev: axidma_chrdev@0 {
compatible = "xlnx,axidma-chrdev";
dmas = ;
dma-names = "tx_channel", "rx_channel";
};

o4YBAF9uJJSAcJpdAAEkCMbdlDk404.png

保存后,生成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.elf、u-boot.elf和bit文件,直接通过SDK生成BOOT.bin
2.拷贝文件至SD卡
将之前产生的BOOT.bin、devicetree.dtb和uImage拷贝到SD卡
3.插上串口开机运行

o4YBAF9uJJaATzV2AACFlsHzJVM678.png

确保可以运行系统

七、编译例程
0.下载例程
例程下载地址:https://github.com/bperez77/xilinx_axidma或者https://gitee.com/long_fly/AXIDMA_linux
1.拷贝例程文件夹到kernel文件夹里

pIYBAF9uJJeAKM4wAABjap-9Mu8872.png

我将文件夹命名为了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文件夹里

pIYBAF9uJJiAALJlAABCCSN5GY4347.png

4.将这些文件拷贝到SD卡中,开机
5.挂载SD卡
cd ..到达系统目录
mount /dev/mmcblk0p1 /mnt挂载SD卡
cd /mnt进入SD目录
insmod axidma.ko载入刚刚生成的模块

o4YBAF9uJJqAAkI4AABLjWMxNxE427.png

打印信息提示通道的ID冲突
6.修改设备树中通道的ID号

pIYBAF9uJJuAQHU4AAD8AjUdrH4385.png

然后按照之前的步骤重新生成devicetree.dtb,将新设备树文件拷贝到SD卡中,然后开机,挂载SD卡,加载模块
这次没有打印信息提示ID冲突

7.查看是否成功
cd /dev到达dev目录
ls查看内容

o4YBAF9uJJ2Ac92zAACVCVPnSKw610.png

会发现多了一个axidma,然后运行dmesg,可以看到如下信息:

pIYBAF9uJJ6ALFTHAAArEpSGWbM768.png

8.运行例程里的APP1

o4YBAF9uJJ-AW1FVAABQEwLKDJs247.png

发现CMA内存不够,导致接收缓存空间申请不了这么大,在设备树文件夹中修改.dts后缀的文件,添加cma空间的申请

o4YBAF9uJKGAeyyNAACkJ3heuTo366.png

然后重新生成devicetree.dtb文件,拷贝到SD卡中,开机,挂载SD卡,加载模块,运行APP

o4YBAF9uJKOAPpoCAABmFUh0QTo817.png

可以测试收发通道的数据速率

9.运行例程里的APP2
在SD卡中新建两个文本,在其中一个文本文件中写入内容,另一个为空

pIYBAF9uJKSAfhdBAAAsgluNW3Q186.png

运行应用程序,将文件1的内容通过DMA环路写入文件2,因为文件太小了,所以显示的是0.00Mb

o4YBAF9uJKWAJ0PtAAAsSiw63Qc613.png

运行结束后打开文件2,会发现和文件1里的内容完全一致

编辑:hfy

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    88

    文章

    11628

    浏览量

    217986
  • Zynq
    +关注

    关注

    10

    文章

    625

    浏览量

    49241
  • AXI
    AXI
    +关注

    关注

    1

    文章

    143

    浏览量

    17791
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Linux驱动开发的必备知识

    内核基础知识: 1、熟悉 Linux 内核的架构、模块系统、进程管理、内存管理等。 了解内核的编译和加载过程。 2、C编程技能: 精通 C 语言编程,包括指针操作、内存管理、结构体等
    发表于 12-04 07:58

    利用开源uart2axi4实现串口访问axi总线

    ,可以实现跨fpga平台使用。利用uart2axi4我们可以通过python,轻松访问axi4_lite_slave寄存器,大大方便fpga工程师进行系统调试和定位bug。
    的头像 发表于 12-02 10:05 1580次阅读
    利用开源uart2<b class='flag-5'>axi</b>4实现串口访问<b class='flag-5'>axi</b>总线

    基于AXI DMA IP核的DDR数据存储与PS端读取

    添加Zynq Processing System IP核,配置DDR控制器和时钟。7000系列Zynq可以参考正点原子DMA回环测试设置。
    的头像 发表于 11-24 09:25 2641次阅读
    基于<b class='flag-5'>AXI</b> <b class='flag-5'>DMA</b> IP核的DDR数据存储与PS端读取

    【免费送书】成为硬核Linux开发者:《Linux 设备驱动开发(第 2 版)》

    Linux系统的设备驱动开发,一直给人门槛较高的印象,主要因内核机制抽象、需深度理解硬件原理、开发调试难度大所致。2021年,一本讲解
    的头像 发表于 11-18 08:06 443次阅读
    【免费送书】成为硬核<b class='flag-5'>Linux</b><b class='flag-5'>开发</b>者:《<b class='flag-5'>Linux</b> 设备<b class='flag-5'>驱动</b><b class='flag-5'>开发</b>(第 2 版)》

    【书籍评测活动NO.67】成为硬核Linux开发者:《Linux 设备驱动开发(第 2 版)》

    Linux 设备驱动开发(第 2 版)》。第2版系统讲解内存管理、IRO管理、加锁机制等嵌入式系统关键内容,透彻分析时钟源、
    发表于 11-17 17:52

    Xilinx高性能NVMe Host控制器IP+PCIe 3.0软核控制器IP,纯逻辑实现,AXI4和AXI4-Stream DMA接口,支持PCIe 3.0和4.0

    )读写、DMA读写和数据擦除功能,提供用户一个简单高效的接口实现高性能存储解决方案。NVMe AXI4 Host Controller IP读写的顺序传输长度是RTL运行时动态可配置的,最小
    发表于 11-14 22:40

    利用蜂鸟E203搭建SoC【5】——DMA使用

    前文介绍了DDR3扩展,然而,对于大块数据而言,使用CPU进行搬运速度较慢,因此可以使用DMA进行数据搬运。这里会使用到前文提到的中断与DDR3。 本例中使用了Vivado提供的AXI-DMA
    发表于 10-29 08:21

    开发板在Linux系统下进行E203内核指令集测试以及分程序的测试

    本文为描述在没有开发板的前提下如何在Linux系统进行指令集测试。 在不同的开发板上移植蜂鸟E203软核的过程请参考前文 1.将文件传输进入Linu
    发表于 10-24 11:43

    基于E203的DMA ip的使用

    1.BD设计 2.AXI DMA寄存器 编写SDK代码,需要根据xilinx的官方例程和dma ip使用手册进行寄存器的配置。 重要寄存器: MM2S S2MM
    发表于 10-22 06:00

    一文详解AXI DMA技术

    ,SG)功能还可以将数据移动任务从位于于处理器系统中的中央处理器(CPU)中卸载出来。可以通过一个AXI4-Lite从接口访问初始化、状态和管理寄存器。如图4. 8展现了DMA IP的功能构成核心。
    的头像 发表于 04-03 09:32 2073次阅读
    一文详解<b class='flag-5'>AXI</b> <b class='flag-5'>DMA</b>技术

    从零开始驯服Linux(一):ZYNQ-Linux启动文件构建全解析

    源码需要在linux系统(虚拟机)中安装相应的交叉编译工具链。安装ZYNQ-7000系列芯片的交叉编译工具链需要sdk.sh文件。把开发板资
    发表于 03-20 16:48

    AXI接口FIFO简介

    AXI接口FIFO是从Native接口FIFO派生而来的。AXI内存映射接口提供了三种样式:AXI4、AXI3和AXI4-Lite。除了Na
    的头像 发表于 03-17 10:31 1778次阅读
    <b class='flag-5'>AXI</b>接口FIFO简介

    双目视觉处理系统开发实例-基于米尔安路国产DR1M90开发

    下实现双摄,为复杂系统调度应用铺平道路。 内核加载5640驱动下通过dma搬运ddr数据,在应用层中通过v4l2框架显示到HDMI上,完整数据流如下: FPGA DDR → AXI-DMA
    发表于 02-21 14:20

    迅为RK3568开发驱动指南Linux中通用SPI设备驱动

    迅为RK3568开发驱动指南Linux中通用SPI设备驱动
    的头像 发表于 01-23 11:02 3433次阅读
    迅为RK3568<b class='flag-5'>开发</b>板<b class='flag-5'>驱动</b>指南<b class='flag-5'>Linux</b>中通用SPI设备<b class='flag-5'>驱动</b>

    ZYNQ基础---AXI DMA使用

    前言 在ZYNQ中进行PL-PS数据交互的时候,经常会使用到DMA,其实在前面的ZYNQ学习当中,也有学习过DMA的使用,那就是通过使用自定义的IP,完成HP接口向内存写入和读取数据的
    的头像 发表于 01-06 11:13 3586次阅读
    <b class='flag-5'>ZYNQ</b>基础---<b class='flag-5'>AXI</b> <b class='flag-5'>DMA</b>使用