【Xlinx】【ZynqMP】petalinux2020.1版本QSPI FLASH启动linux教程

一,背景

使用petalinux2020.1版本,编译打包后得到的系统文件,希望烧录到qspi flash,通过qspi flash启动系统。

过程中遇到了很多问题,包括官网的资料都不很全面,因此这里总结问题的解决办法,如果你遇到了下面的几种问题,那么这篇文章应该对你有所帮助。

1,qspi启动时,报“Offset exceeds device limit”或者“Size exceeds partition or device limit”的错误

【Xlinx】【ZynqMP】petalinux2020.1版本QSPI FLASH启动linux教程_第1张图片

2,好不容易把分区地址都梳理好,烧录完成后,上电启动报校验错误“Bad data crc”

【Xlinx】【ZynqMP】petalinux2020.1版本QSPI FLASH启动linux教程_第2张图片

二,操作步骤

1,petalinux-config中,增加分区用于存储boot.scr,并且根据qspi flash大小合理划分空间

【Xlinx】【ZynqMP】petalinux2020.1版本QSPI FLASH启动linux教程_第3张图片

开发板的qspi flash是32MB,因此分给BOOT.BIN的是10MB,给kernel的是21MB,

bootscr分给64KB,bootenv我们没用到,但不能删除,删除后编译报错,因此也分给64KB。

注意:这里划分时,要注意最小单位应该是flash芯片的擦除块大小,可以参考uboot中打印的参数,本例程中是64KB。

2,设置boot脚本在flash上的偏移地址:

执行petalinux-conifg -c u-boot,

进入“ARM_architecture”,修改“Boot script offset”值,本例程中是0x1F10000。

【Xlinx】【ZynqMP】petalinux2020.1版本QSPI FLASH启动linux教程_第4张图片

3,根据地址设计,更改u-boot加载脚本中的kernel地址及大小

修改文件/project-spec/meta-user/recipes-bsp/u-boot/u-boot-zynq-scr.bbappend

【Xlinx】【ZynqMP】petalinux2020.1版本QSPI FLASH启动linux教程_第5张图片

只需要根据实际设计更改kernel相关的两个值,

> QSPI_KERNEL_OFFSET设置为kernel分区首地址,也就是image.ub文件存放在flash上的偏移地址,本例程中是0xA10000。

> QSPI_FIT_IMAGE_SIZE设置为kernel分区分配大小,本例程中是0x1500000。

4,重新执行petalinux-build进行编译,并通过petalinux-package进行打包

最后需要的是3个文件,打包后的固件BOOT.BIN,包括kernel的文件image.ub,以及boot的加载脚本文件boot.scr。

正常的话,将这三个文件分别烧录到qspi flash的boot/kernel/bootscr分区,然后启动模式设置为qspi flash启动即可。

但是这样操作,加载boot.scr文件时,u-boot会报crc校验错误。因此需要下面的重要操作。

5,重要:生成的boot.scr,要手动扩展空间到分区大小,且填入为“0”

objcopy -I binary -O binary --pad-to=0x10000 --gap-fill=0x00 boot.scr bootscr-pad.bin

本例程中分区大小设置为0x10000,因此这里将boot.scr扩展至0x10000。

将新生成的bootscr-pad.bin替代上面的boot.scr,烧入qspi flash的bootscr分区空间,本例程是0x1F10000,启动模式设置为qspi flash启动,即可看到系统正常加载了。

【Xlinx】【ZynqMP】petalinux2020.1版本QSPI FLASH启动linux教程_第6张图片

三,尾声与总结:

1,2020.1开始,petalinux的uboot使用了distro boot,需要boot script,qspi flash启动时,需要指定存放脚本的分区。

2,qspi flash启动系统,需要在petalinux-conifg中设计并划分各分区空间;并且在u-boot的设置中指明boot脚本偏移地址,以及kernel地址和大小。

3,为啥boot不用指定呢?应该是默认BOOT.BIN放在flash最开始地址,所以不用特意指定。

4,u-boot读脚本的长度,是设置的空间长度,之后要做crc,应该是flash默认擦除后是全0xFF,因此crc后值会变,因此将剩余的部分全写为0,crc值就不会被改掉了。

5,这里没有说明如何烧录qspi flash,推荐用u-boot中的sf指令进行操作。

> 启动u-boot的方式,可以使用sd卡启动、xsdb、或者petalinux-boot等方法,这里不再说明。

> 启动u-boot后,可以通过xsdb的dow,或者u-boot的loady、tftpboot等工具将文件传入内存,再由sf指令将文件烧入qspi指定位置。

6,为了简便,一次性烧入,可以考虑先将各个文件增加填充,然后合并成完成的qspi flash大小的固件,一次性完整烧录,下面是本例程中的操作示例:

objcopy -I binary -O binary --pad-to=0xA10000 --gap-fill=0x00 BOOT.BIN BOOT-pad.bin
objcopy -I binary -O binary --pad-to=0x1500000 --gap-fill=0x00 image.ub image-pad.bin
objcopy -I binary -O binary --pad-to=0xF0000 --gap-fill=0x00 boot.scr bootscr-pad.bin
cat BOOT-pad.bin image-pad.bin bootscr-pad.bin > BOOT-ALL.bin

boot.scr填充到0xF0000,是由于这是flash最后的部分,因此全部填入0了。

最后将BOOT_ALL.bin从qspi flash首地址0直接烧入即可。

【Xlinx】【ZynqMP】petalinux2020.1版本QSPI FLASH启动linux教程_第7张图片

【Xlinx】【ZynqMP】petalinux2020.1版本QSPI FLASH启动linux教程_第8张图片

7,有用的参考文章链接:https://forums.xilinx.com/t5/Embedded-Development-Tools/Unable-to-boot-from-QSPI-using-Petalinux-2020-1-Upgrading-from/td-p/1145107

你可能感兴趣的:(xilinx,嵌入式,linux)