因客户要求zynq开发板只有FLASH和emmc,然而还得在petalinux进行开发系统,因FLASH大小有限,所以没办法把内核和根文件地址全部存储到FLASH中,于是想配合emmc进行启动,但是在网上搜索的大多都是只把根文件系统放到了emmc,然后把内核和BOOT.bin放到了FLASH,但是烧写FLASH真的很费时间,所以就想出了一个新的办法(被逼的):
启动文件分配:
存储区域 | 分区 | 存储文件 |
FLASH | - | BOOT【fsbl、u-boot、bit(可选)】 |
EMMC | FAT32 | image.ub【Image】 |
Ext4 | rootfs.tar.gz【解压后的】 |
这样分配下来,BOOT.bin 的大小只有几M,烧写起来方便很多
接下来直接讲解实现过程:
首先想介绍一下我的环境:
petalinux2021.2、vivado2021.2、zynq7020、zynqMP 7ev
一、向EMMC存储文件
首先应该使用ramdisk模式创建一个很小的petalinux系统:(这个需要打包一起放到FLASH启动)
1、需要把FLASH内存进行分配(添加kernel、bootscr和rootfs分区)
2、 修改 Root filesystem type 为 (INITRD),并进行地址配置
3、 修改 Boot script offset的值 (0x3E80000),这个值为boot.scr的基地址
然后直接petalinux-build即可
然后对这些文件进行打包(网上都是一个一个的分地址烧录到FLASH,但是太麻烦):
这边分享一个把上述文件全部打包成一个BOOT.bin
petalinux-package --boot --force --format BIN --fsbl --u-boot --kernel images/linux/Image --offset 0x1E40000 --cpu a53-0 --boot-script --offset 0x3E80000 --add images/linux/rootfs.cpio.gz.u-boot --offset 0x4000000 --cpu a53-0 --file-attribute partition_owner=uboot
这样只需要把BOOT.bin(大概50Mb)烧写到FLASH即可,时间有点久(去厕所钓会鱼)
烧写完之后,把启动模式切换到FLASH启动,即可进入系统了,然后如果有网络可以通过网络把image.ub和rootfs.tar.gz 传到系统,参考我以前的文章进行分区和存放即可。
Linux下给emmc进行分区操作总结-CSDN博客
二、配置从EMMC启动
1、只需修改Root filesystem type 为 (EXT4 (SD/eMMC/SATA/USB)),并修改rootfs存放的mmc位置
然后进行petalinux-build
然后进行打包BOOT.bin (只有5Mb)(只需打包fsbl、u-boot、bit(可选))
petalinux-package --boot --fsbl ./zynq_fsbl.elf --fpga ./system.bit --u-boot ./u-boot.elf --force
这样的BOOT.bin只有5M大小,烧写到FLASH用时很短
然后启动开发板,进入到u-boot界面:(在执行到U-BOOT倒计时的时候按任意键暂停)
在这里修改u-boot启动的指令:
查看当前的启动变量:
print bootcmd
如下所示,在bootcmd的命令中我们使用的默认的distro_bootcmd
查看iamge.ub文件
ls emm 1:1
如下所示,即我把image.ub存放到了emmc1的第一个分区
查看rootfs文件
ls emm 1:2
如下所示,即我把根文件系统放到了emmc1的第二个分区
挂载emmc1
mmc dev 1
修改启动内核环境变量
setenv run_emmc_boot "mmc dev 1:1 && load mmc 1:1 0x10000000 /image.ub && bootm 0x10000000"
将bootcmd的命令修改成run_emmc_boot
setenv bootcmd "run run_emmc_boot"
保存环境变量
saveenv
重启开发板即可查看到,从emmc中读取iamge.ub
然后就是进行读取根文件系统,直至进入到petalinux系统
大功告成!!!(开香槟!!)
更多关于zynq和zynqMP的问题,可以评论留言
如果感觉文章对您有用,麻烦三连支持一下,方便下次用到的时候,就可以快速找到我,非常感谢您的支持!!!