[X]关闭

米联客FDMA IP在LINUX下实现PL和PS数据共享测试总结

文档创建者:ぉ沙皮狗的忧伤
浏览次数:13043
最后更新:2021-08-09
 
本帖最后由 ぉ沙皮狗的忧伤 于 2019-10-12 10:22 编辑

1、先讲一下一个小问题,我将FDMA裸机测试的.bit文件重命名为system.bit.bin文件放入SD卡启动时,在VDMA的地方卡住无法启动
fpga相当于你的芯片内部硬件结构,43000000这个就是这个硬件的地址,你有vdma硬件,那就有这个地址,就可以操作这个地址,如果你bit里没有vdma的硬件,那就没有这个地址,那你再去操作就相当于操作非法地址,解决办法删去设备树中的VDMA硬件描述信息或者在IP核中添加VDMA功能


这个路径~/Xilinx/osrc-lab-mz7xab/boards/MZ7X/ubuntu/dts/下存放的system-top.dts就是内核的设备树文件

将下面这段删掉就可以了


dtc -I dts -O dtb -o  $(shell pwd)/devicetree.dtb  $(shell pwd)/dts/system-top.dts
通过条命令将system-top.dts文件编译成devicetree.dtb


2、接下来将先测试FDMA裸机对DDR的读写,打开FDMA工程修改一下偏移地址,这块板子的DDR大小为1G,前一段内存用来存放uboot、spl、Kernel等,所以往后偏移768M(由于1024-768=256M为一块完整的内存块)用于给PL存放数据

查看ila仿真,对裸机DDR读写的数据是否正确




将.bit文件重命名为system.bit.bin文件,放入SD卡启动(注:米联客的BOOT.bin由bootgen将u-boot.elf、zynq_fsbl.elf以及system.bit.bin集成在一起,我的已经将FPGA的.bit剥离出来,而且取消了加密位流校验,可以动态加载.bit文件,具体操作请看以前的帖子)


3、我们要告诉PS在DDR内存的768M~1024M分配给PL端使用,PS不可将其分配给其他使用
在kernel代码arch/arm/mach-zynq/common.c中,函数zynq_memory_init,增加两句话即可:

memblock_free(0x30000000, 256 * SZ_1M);
memblock_remove(0x30000000, 256 * SZ_1M);
printk(“reserve 256MB@0x30000000 forPL\n”);


其中,0x30000000为内存物理地址,256*SZ_1M为大小。
我们的芯片的内存物理地址是从0开始的,0x30000000相当于PS使用768M内存,给256M给PL使用


注:如果不这么做,DDR的768M~1024M这段内存的某一块区域可能会被PS占用了,当其地址被映射出去后你在次去映射,会造成将空地址映射出来,你读取数据时将会产生错误

PS端的测试代码,①先通过ioremap对物理地址进行映射,②通过IS_ERR()查看映射地址是否出错,③打印映射地址及地址中的内容


启动开发板,设置printk打印级别
cat /proc/sys/kernel/printk

4       4       1       7
不是7就echo 7 > /proc/sys/kernel/printk

7       4       1       7




PS开始测试0~1023完成测试






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

发表评论已发布 9

uisrc

发表于 2019-10-11 22:51:44 | 显示全部楼层

越努力越幸运!加油!
回复

使用道具 举报

菲尼克兔

发表于 2019-12-3 00:03:59 | 显示全部楼层

emmm,这个预留空间的方法第一次看到哈~~我看到网上很多帖子说修改设备树,用reserved-memory的方法来实现一块不给linux使用的空间的。 我很疑惑,为啥楼主不用reserved-memory的方法哈?

ぉ沙皮狗的忧伤

发表于 2019-12-3 08:46:16 | 显示全部楼层

菲尼克兔 发表于 2019-12-3 00:03
emmm,这个预留空间的方法第一次看到哈~~我看到网上很多帖子说修改设备树,用reserved-memory的方法来实现一 ...

不懂的还有很多,能实现就可以了

woshinieao

发表于 2020-4-29 15:45:04 | 显示全部楼层

reserved-memory 方式可以将内存留给驱动用,也可以将内存直接mmap给app使用,更方便。

ぉ沙皮狗的忧伤

发表于 2020-5-6 10:15:28 | 显示全部楼层

woshinieao 发表于 2020-4-29 15:45
reserved-memory 方式可以将内存留给驱动用,也可以将内存直接mmap给app使用,更方便。

这段内存直接留个FPGA存储数据,arm端不需要使用

ymqhfkjq

发表于 2021-8-8 21:23:56 | 显示全部楼层

您好。我发现我映射的不对呢。读不出来

ymqhfkjq

发表于 2021-8-8 21:26:07 | 显示全部楼层

我直接这样映射的。mem = (int *)ioremap(0x87D000000, 16*1024*1024);但是发现会提示一些莫名的错误。有的时候直接挂机了。

ぉ沙皮狗的忧伤

发表于 2021-8-9 09:05:17 | 显示全部楼层

ymqhfkjq 发表于 2021-8-8 21:26
我直接这样映射的。mem = (int *)ioremap(0x87D000000, 16*1024*1024);但是发现会提示一些莫名的错误。有的 ...

你为啥可以映射出来,你先去看看ioremap这个函数,再看看你自己的参数

ymqhfkjq

发表于 2021-8-9 10:18:27 | 显示全部楼层

ぉ沙皮狗的忧伤 发表于 2021-8-9 09:05
你为啥可以映射出来,你先去看看ioremap这个函数,再看看你自己的参数

你想说我这个地址超了4G是吗。但是我的ZYNQ内存段是不连续的。我的高位是从80000_0000开始到87FFF_FFFF
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则