本帖最后由 ぉ沙皮狗的忧伤 于 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完成测试
|