function build_uboot(){
    check_config RK_UBOOT_DEFCONFIG || return 0
    build_check_cross_compile
    prebuild_uboot

    echo "============Start building uboot============"
    echo "TARGET_UBOOT_CONFIG=$RK_UBOOT_DEFCONFIG"
    echo "========================================="

    if [ "$RK_RAMDISK_SECURITY_BOOTUP" = "true" ];then
        if [ -n "$RK_CFG_RAMBOOT" ];then
            build_ramboot
        else
            build_kernel
        fi

        if [ -n "$RK_CFG_RECOVERY" ]; then
            build_recovery
        fi
        cp -f $TOP_DIR/rockdev/boot.img $TOP_DIR/u-boot/boot.img
        cp -f $TOP_DIR/rockdev/recovery.img $TOP_DIR/u-boot/recovery.img || true
    fi

    cd u-boot
    rm -f *_loader_*.bin
    if [ "$RK_LOADER_UPDATE_SPL" = "true" ]; then
        rm -f *spl.bin
    fi

    if [ -n "$RK_UBOOT_DEFCONFIG_FRAGMENT" ]; then
        if [ -f "configs/${RK_UBOOT_DEFCONFIG}_defconfig" ]; then
            make ${RK_UBOOT_DEFCONFIG}_defconfig $RK_UBOOT_DEFCONFIG_FRAGMENT
        else
            make ${RK_UBOOT_DEFCONFIG}.config $RK_UBOOT_DEFCONFIG_FRAGMENT
        fi
        ./make.sh $UBOOT_COMPILE_COMMANDS
    elif [ -d "$TOP_DIR/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf" ]; then
        ./make.sh $RK_UBOOT_DEFCONFIG \
            $UBOOT_COMPILE_COMMANDS CROSS_COMPILE=$CROSS_COMPILE
    elif [ -d "$TOP_DIR/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu" ]; then
        ./make.sh $RK_UBOOT_DEFCONFIG \
            $UBOOT_COMPILE_COMMANDS CROSS_COMPILE=$CROSS_COMPILE
    else
        ./make.sh $RK_UBOOT_DEFCONFIG \
            $UBOOT_COMPILE_COMMANDS
    fi

    if [ "$RK_IDBLOCK_UPDATE_SPL" = "true" ]; then
        ./make.sh --idblock --spl
    fi

    if [ "$RK_RAMDISK_SECURITY_BOOTUP" = "true" ];then
        ln -rsf $TOP_DIR/u-boot/boot.img $TOP_DIR/rockdev/
        ln -rsf $TOP_DIR/u-boot/recovery.img $TOP_DIR/rockdev/ || true
    fi

    finish_build
}
  • check_config检查是否有 RK_UBOOT_DEFCONFIG 这个配置变量,定义了U-boot编译用到的配置文件, 这个变量定义在device/rockchip/rk356x/BoardConfig-*.mk中

  • build_check_cross_compilep判断是否存在arm-none-linux-gnueabihf或aarch64-none-linux-gnu交叉编译工具链, 我们没有使用,这一部分可以忽略。

  • prebuild_uboot根据BoardConfig-*.mk中的定义来设定编译参数UBOOT_COMPILE_COMMANDS

  • 判断RK_RAMDISK_SECURITY_BOOTUP值是否为true,是否使用secure boot来对镜像进行签名认证, 我们没有定义,直接跳过

  • cd进入u-boot目录,先清除以前生成的miniloader文件,再判断uboot前一阶段是否为SPL, 如果是的话还要清除spl文件

  • RK_UBOOT_DEFCONFIG_FRAGMENT:由于RK版本U-boot支持配置文件的overlay功能, 这里判断是否开启了该功能,如果开启的话先将配置文件合并,我们没有使用到

  • 判断有没有arm-none-linux-gnueabihf或aarch64-none-linux-gnu来进行编译,没有使用,可以忽略。

  • 没有找到上面两个编译器,向./make.sh传递构建参数进行构建U-boot操作

  • RK_IDBLOCK_UPDATE_SPL和RK_RAMDISK_SECURITY_BOOTUP都没有定义,直接跳过

  • finish_build编译完成的一个提示函数。

 

原生的U-Boot只支持使用U-Boot自己的DTB,RK平台增加了kernel DTB机制的支持, 即使用kernel DTB去初始化外设。主要目的是为了兼容外设板级差异,如:power、clock、display 等。
二者的作用:

  • U-Boot DTB:负责初始化存储、打印串口等设备;

  • Kernel DTB:负责初始化存储、打印串口以外的设备;

U-Boot初始化时先用U-Boot DTB完成存储、打印串口初始化, 然后从存储上加载Kernel DTB并转而使用这份DTB继续初始化其余外设。

作者:SteveChen  创建时间:2025-06-12 09:26
最后编辑:SteveChen  更新时间:2025-06-12 09:29
上一篇:
下一篇: