使用petalinux2020.1版本,编译打包后得到的系统文件,希望烧录到qspi flash,通过qspi flash启动系统。
过程中遇到了很多问题,包括官网的资料都不很全面,因此这里总结问题的解决办法,如果你遇到了下面的几种问题,那么这篇文章应该对你有所帮助。
1,qspi启动时,报“Offset exceeds device limit”或者“Size exceeds partition or device limit”的错误
2,好不容易把分区地址都梳理好,烧录完成后,上电启动报校验错误“Bad data crc”
开发板的qspi flash是32MB,因此分给BOOT.BIN的是10MB,给kernel的是21MB,
bootscr分给64KB,bootenv我们没用到,但不能删除,删除后编译报错,因此也分给64KB。
注意:这里划分时,要注意最小单位应该是flash芯片的擦除块大小,可以参考uboot中打印的参数,本例程中是64KB。
执行petalinux-conifg -c u-boot,
进入“ARM_architecture”,修改“Boot script offset”值,本例程中是0x1F10000。
修改文件
只需要根据实际设计更改kernel相关的两个值,
> QSPI_KERNEL_OFFSET设置为kernel分区首地址,也就是image.ub文件存放在flash上的偏移地址,本例程中是0xA10000。
> QSPI_FIT_IMAGE_SIZE设置为kernel分区分配大小,本例程中是0x1500000。
最后需要的是3个文件,打包后的固件BOOT.BIN,包括kernel的文件image.ub,以及boot的加载脚本文件boot.scr。
正常的话,将这三个文件分别烧录到qspi flash的boot/kernel/bootscr分区,然后启动模式设置为qspi flash启动即可。
但是这样操作,加载boot.scr文件时,u-boot会报crc校验错误。因此需要下面的重要操作。
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启动,即可看到系统正常加载了。
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直接烧入即可。
7,有用的参考文章链接:https://forums.xilinx.com/t5/Embedded-Development-Tools/Unable-to-boot-from-QSPI-using-Petalinux-2020-1-Upgrading-from/td-p/1145107