uboot编译
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:29