米联客FDMA IP在LINUX下实现PL和PS数据共享测试总结
本帖最后由 ぉ沙皮狗的忧伤 于 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完成测试
{:1_144:} emmm,这个预留空间的方法第一次看到哈~~我看到网上很多帖子说修改设备树,用reserved-memory的方法来实现一块不给linux使用的空间的。 我很疑惑,为啥楼主不用reserved-memory的方法哈? 菲尼克兔 发表于 2019-12-3 00:03
emmm,这个预留空间的方法第一次看到哈~~我看到网上很多帖子说修改设备树,用reserved-memory的方法来实现一 ...
不懂的还有很多,能实现就可以了 reserved-memory 方式可以将内存留给驱动用,也可以将内存直接mmap给app使用,更方便。 woshinieao 发表于 2020-4-29 15:45
reserved-memory 方式可以将内存留给驱动用,也可以将内存直接mmap给app使用,更方便。
这段内存直接留个FPGA存储数据,arm端不需要使用 您好。我发现我映射的不对呢。读不出来 我直接这样映射的。mem = (int *)ioremap(0x87D000000, 16*1024*1024);但是发现会提示一些莫名的错误。有的时候直接挂机了。 ymqhfkjq 发表于 2021-8-8 21:26
我直接这样映射的。mem = (int *)ioremap(0x87D000000, 16*1024*1024);但是发现会提示一些莫名的错误。有的 ...
你为啥可以映射出来,你先去看看ioremap这个函数,再看看你自己的参数 ぉ沙皮狗的忧伤 发表于 2021-8-9 09:05
你为啥可以映射出来,你先去看看ioremap这个函数,再看看你自己的参数
你想说我这个地址超了4G是吗。但是我的ZYNQ内存段是不连续的。我的高位是从80000_0000开始到87FFF_FFFF
页:
[1]