定制uboot支持双系统启动--Apple的学习笔记

一,前言

因为学了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

你可能感兴趣的:(定制uboot支持双系统启动--Apple的学习笔记)