定制uboot支持双系统启动--Apple的学习笔记
2020-10-01 本文已影响0人
applecai
一,前言
因为学了uboot的启动流程和kernel的启动流程。为了检验自己的理解及灵活运行,那么我就想到做一个uboot支持双系统启动。我的文件系统一样,只是kernel版本不同。
其实也可以再分个区做文件系统备份,就变成了具备系统还原功能了,mmc写入数据,我的tf卡是老卡比较慢,这个就不尝试了。
二,双系统切换设计思路
先要有一个flag来区分到底引导哪个zImage及dtb。而引导的zImage和dtb名字若一样的话需要放不同分区,为了简单起见,我就放同一个分区,不常用的老版本boot就修改名字添加后缀1。
然后就是这个flag应该保存在哪里,用哪种方式识别的问题了。网上参考了下是放在自定义的新分区中,通过echo>"xx" /dev/sdb3等命令来设置flag,而uboot代码中直接通过mmc读取地址中的内容到ram中。这个方法我尝试了,主要是mmc无法通过命令mmc dev 0 3切换到我的分区。我按我的应用需求的话,flag完全可以放入环境变量中的呀!
步骤1:自定义环境变量
setenv mybootflag "new"或setenv mybootflag "old"
saveenv
print mybootflag
步骤2:修改uboot添加判断条件来引导不同kernel
/studybr/u-boot-2020.10-rc4工程中
c代码修改,在autoboot.c的autoboot_command函数中一开始就添加
/* start add by applecai */
char *st = env_get("mybootflag");
if (st && !strcmp(st, "new"))
{
env_set("bootcmd", "mmc dev 0; fatload mmc 0:1 82000000 zImage;fatload mmc 0:1 88000000 am335x-boneblack.dtb; bootz 82000000 - 88000000;"); //use old one
}
else
{
env_set("bootcmd", "mmc dev 0; fatload mmc 0:1 82000000 zImage1;fatload mmc 0:1 88000000 am335x-boneblack1.dtb; bootz 82000000 - 88000000;");//use new one
}
/* end add by applecai */
步骤3:验证通过
需要切换启动kernel时候,按空格,修改环境变量mybootflag后,通过reset重启。设置new为启动5.4.61是我当前主要使用的。设置old为启动之前buildroot自带的4.19.59
image.png
image.png