Zynq7000 1.Linux平台AXI-DMA

本文详细介绍了在VMware虚拟机上,使用Ubuntu和XilinxSDK构建Petalinux工程,配置Linux内核,修改设备树,编译并安装axi_dma模块,以及执行测试代码的过程。
摘要由CSDN通过智能技术生成

本文中所使用的实验环境说明:VMware虚拟机,ubuntu16.04版本的linux系统,Xilinx SDK2017.4(文中用到了它的编译器),Petalinux2019.1(可以选装黑金的2017.4版本,笔者这里安装错了版本也就没有卸载重装)。
目录:
1.下载参考工程的axi_dma模块文件包,下载链接——https://github.com/bperez77/xilinx_axidma/tree/master
1.建立petalinux工程
2.配置Linux内核
3.修改设备树文件
4.修改KERNEL_VERSION_SANITY_SKIP=“1”(可选步骤)
5.添加axi_dma模块
6.执行编译及安装axidma模块
7.编译示范代码

8.挂载nfs目录及执行示范代码

1-建立petalinux工程

黑金教程中有提到的一些source到petalinux软件的sh路径的过程,就不再过多介绍,读者如有疑问可以进行留言。
*在你的petalinux工程路径下创建一个新的工程,命名为"dma_Show"
在这里插入图片描述
*使用cd指令进入到刚刚创建好的工程路径下 cd dma_Show
*为这个工程配置hdf硬件描述文件,可以选择使用黑金教程s4下面"05_sg_dma_test"这个工程中的文件。这里我是直接拷贝了黑金的hdf文件,并且自定义了文件夹的名字(后缀要保持.sdk)随后拷贝到petalinux工程目录的平行目录中。

在这里插入图片描述在这里插入图片描述
*这里已经成功获取到硬件描述文件了。

*同时,将linux源码的路径选择为本地,填入你的源码路径,具体设置可参考黑金教程S1下,Petalinux下的HDMI显示这一章节。实在查找不到的话,也可以留言提问。

2-配置Linux内核

*运行以下指令,进入Linux内核配置界面。
*在配置界面中,依次进入Device Drivers -> Generic Driver Options -> Default contiguous memory area size ,并将 Size in Mega Bytes修改为25。这一部是为了最终编译出的测试程序,能够申请到足够的内存。
在这里插入图片描述
*确认CONFIG_CMA=y
CONFIG_DMA_CMA=y
CONFIG_DMA_SHARED_BUFFER=y 这三个配置项的值为y。
从界面上查找比较繁琐,笔者也没有找到。我们采用简单一点的方法,上一步修改完Size in Mega Bytes的值为25后,选择Save保存。从界面上可以手动输入文件名,这里命名为axi_dma_test.config。保存完后先不要关闭。
在这里插入图片描述
*随后进入你的工程目录中,查找axi_dma_test.config这个文件,并确认以上3个配置项的值是否为y,若不是则受到修改。修改完成后回到配置界面,再次保存并命名为.config,以便petalinux能够根据这个文件正确的编译出linux相关的组件。
在这里插入图片描述
以上步骤完成后,选择Exit退出。

3-修改设备树

*打开如下路径中的文件在这里插入图片描述
*注意,笔者在这里花了两三天的时间,设备树文件对于格式中的空格,TAB制表应该是有严格要求的。我的设备树文件起初一直编译不过,后来参考其他人的格式改成了首字符全部缩进才得以解决。
&amba_pl{
axidma_chrdev: axidma_chrdev@0 {
compatible = “xlnx,axidma-chrdev”;
dmas = <&axi_dma_0 0 &axi_dma_0 1>;
dma-names = “tx_channel”, “rx_channel”;
};
};
&axi_dma_0{
dma-channel@40400000 {
xlnx,device-id = <0x0>;
};
dma-channel@40400030 {
xlnx,device-id = <0x1>;
};
};
*复制上面这段代码到你的设备树文件中
在这里插入图片描述
修改完成,保存并关闭

4-修改KERNEL_VERSION_SANITY_SKIP=“1”(可选步骤)

*如果你使用的petalinux版本与linux源代码版本不一直,那么你需要进行这一步操作,在/home/alinx/Downloads/peta_prj/dma_Show/project-spec/meta-plnx-generated/recipes-kernel/linux 这个路径下,打开linux-xlnx_%.bbappend 这个文件,并在最后添加这行:KERNEL_VERSION_SANITY_SKIP=“1”,这是为了使petalinux跳过版本一致性检查。如果使用的petalinux版本与linux源代码版本一致,则无需进行这一步设置。
在这里插入图片描述
修改完成,保存关闭。

5-添加axi_dma模块

*还记得前面下载的axi_dma模块吗,这一步我们需要用到它。
*运行指令 petalinux-create -t modules -n xilinx-axidma --enable 创建一个module
在这里插入图片描述
*创建完成后,可以在你的工程目录下找到如下路径/home/alinx/Downloads/peta_prj/dma_Show/project-spec/meta-user/recipes-modules/xilinx-axidma/files,进入这个路径,删除其中的xilinx-axidma.c文件。
*打开下载的模块文件包,将driver文件下的全部.c文件和.h头文件拷贝进files文件夹下,再将include文件夹下的axidma_ioctl.h文件也拷贝进来。
*接下来,打开这个路径中的Makefile文件,将它的第一行替换为如下代码:

DRIVER_NAME = xilinx-axidma
$(DRIVER_NAME)-objs = axi_dma.o axidma_chrdev.o axidma_dma.o axidma_of.o
obj-m := $(DRIVER_NAME).o
在这里插入图片描述
保存退出。

*修改xilinx-axidma.bb文件中,SRC_URI右侧的赋值为:
SRC_URI = "file://Makefile \
file://xilinx-axidma.c \
file://axi_dma.c
file://axidma_chrdev.c
file://axidma_dma.c
file://axidma_of.c
file://axidma.h
file://axidma_ioctl.h
file://COPYING
"
在这里插入图片描述
从该文件的首行SUMMARY中可以看出,这是petalinux建立一个外部xilinx-axidma内核模块的参考规则。我们在前面删掉了xilinx-axidma.c,当然要对应修改这个.bb文件。同事也能看出添加的文件,都是前面一步中拷贝进来的文件,再加上Makefile文件。

6-执行编译及安装axidma模块

*运行petalinux-build,编译linux,petalinux工具会为我们编译出kernel,设备树,fsbl,以及u-boot文件。
*编译过程有点慢,需要耐心等待一下
在这里插入图片描述
在这里插入图片描述
出现以上错误信息可能由于大小写导致。
*运行petalinux-package --boot --fsbl ./images/linux/zynq_fsbl.elf --fpga --u-boot --force 打包文件。执行完成后,到图中路径,拷贝如下两个文件到SD中,文中涉及到的一些文件拷贝,笔者均是采用的复制粘贴方式,因为笔者接触linux还不到一个月,是个真正的菜鸟,慢慢学吧,有经验的朋友可以用像一些共享文件夹等等更高级且安全的方式进行文件转移。拷贝完成后,将SD卡插入开发板,从Putty工具上可以看到linux已经启动了。
在这里插入图片描述
在这里插入图片描述
依次进入以下目录,找到我们所编译的模块的位置
在这里插入图片描述
可以看到,这个位置下有一个xilinx-axidma.ko
执行insmod xilinx-axidma.ko
在这里插入图片描述
出现几行信息,说明模块安装成功了,接下来我们继续编译测试的示范代码。

7-编译示范代码

*在工程目录下新建一个test文件夹,把下载的axidma模块文件,全部拷贝进去。
*执行cd test,进入test文件夹
在这里插入图片描述
注意,这一步很重要,前面我们提到的Xilinx SDK环境,需要用它的时候到了,我们这里使用它文件路径下的arm-linux编译器,你需要找到安装这个软件的路径,并找到arm-linux-gnueabihf-gcc这个编译器的所在文件夹。笔者的路径是:/opt/Xilinx/SDK/2017.4/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin。
运行make CROSS_COMPILE=/opt/Xilinx/SDK/2017.4/gnu/aarch32/lin/gcc-arm-linux-gnueabi/bin/arm-linux-gnueabihf- ARCH=arm examples , 编译示例代码。在这里插入图片描述
编译成功后,可以在output文件夹下找到生成的可供zynq开发板执行的文件。

*将这几个文件,全部拷贝到你的虚拟机上的nfs共享文件夹内,以便开发板挂载nfs文件夹后,可以在其下找到这几个文件并执行。
在这里插入图片描述

8-挂载nfs目录及执行示范代码

*在putty窗口上执行:mount -t nfs -o nolock 192.168.2.238:/home/alinx/work /mnt
注意:你的虚拟机上的linux系统的IP地址,是与笔者这边不同的,具体怎样挂载nfs工具,可以参考黑金的S1教程,里面的讲解还算比较详细。这里不再介绍这部分内容,如有疑问,可采用留言方式,谢谢理解。
*挂载成功后,进入nfs路径,并进入并找到存放第7步中的4个文件的位置。
在这里插入图片描述
*注意:因为笔者在虚拟机的nfs目录中执行过一些其他实验,所以读者们的文件夹内容可能会与我的不同。
*找到这4个文件的所在位置后,执行./axidma_benchmark,就可以开始运行axidma_benchmark.c这个文件中的函数了,具体的函数内容, 我也不懂 ,我会在下一篇文章中作进一步的介绍。
在这里插入图片描述
可以看到,DMA测试完成,发送数据量7.91MiB,接收量相同。

在这里插入图片描述
出现如上信息则说明FPGA的DMA模块fifo设置太小导致的

*这是笔者在CSDN上完成的第一篇博客,感谢各位看官能够耐心看到结尾。创作不易,转载请注明出处,谢谢!@TOC

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值