前言
为了更深入了解rk1808 sdk,对其中关于uboot部分的脚本和makefile等做一个分析
主要参考文件:Rockchip_Developer_Guide_Linux_Software_CN.pdf
uboot的编译
根据文档的说法,编译uboot有两种方法
- 在uboot目录下编译
这种方法,先cd到uboot目录下,然后执行
sudo ./make.sh rk1808
- 在顶层目录下编译
这种方法,利用底层目录的build.sh,传递参数uboot进行编译
sudo ./build.sh uboot
其实利用build.sh脚本,实际上也是cd到uboot目录下,去调用make.sh脚本进行编译,因此这两种方式其实可以认为是一种,那要想弄清楚来龙去脉,就得先分析build.sh脚本
build.sh分析
直接跳到末尾,有这样一段话,首先判断是不是需要打印usage,如果不是,然后再对输入的参数,也就是$@
进行遍历,并判断它是什么
例如我这样输入sudo ./build.sh uboot
,在下面的case分支语句中,就会进入eval build_$option || usage
,这个意思是||
前能执行,就去执行,不能执行,就打印usage
#=========================
# build targets
#=========================
if echo $@|grep -wqE "help|-h"; then
usage
exit 0
fi
OPTIONS="$@"
for option in ${OPTIONS:-allsave}; do
echo "processing option: $option"
case $option in
BoardConfig*.mk)
option=$TOP_DIR/device/rockchip/$RK_TARGET_PRODUCT/$option
;&
*.mk)
CONF=$(realpath $option)
echo "switching to board: $CONF"
if [ ! -f $CONF ]; then
echo "not exist!"
exit 1
fi
ln -sf $CONF $BOARD_CONFIG
;;
buildroot|debian|distro|yocto)
build_rootfs $option
;;
recovery)
build_kernel
;&
*)
eval build_$option || usage
;;
esac
done
再往上看,可以找到编译uboot的函数,它首先删除了一个loader什么的bin文件,据说是用于初始化ddr的,这个暂时没太想明白
然后cd到uboot的目录下,执行./make.sh rk1808
,它这个参数$RK_UBOOT_DEFCONFIG
通过打印可以很清楚地知道,其实就是rk1808,然后判断上一个命令的退出状态,来确定执行成功与否
接下来就是分析make.sh了
function build_uboot(){
echo "============Start build uboot============"
echo "TARGET_UBOOT_CONFIG=$RK_UBOOT_DEFCONFIG"
echo "========================================="
if [ -f u-boot/*_loader_*.bin ]; then
rm u-boot/*_loader_*.bin
fi
cd u-boot && ./make.sh $RK_UBOOT_DEFCONFIG && cd -
if [ $? -eq 0 ]; then
echo "====Build uboot ok!===="
else
echo "====Build uboot failed!===="
exit 1
fi
}
make.sh
这个脚本比刚才的复杂的多,因为瑞星微的sdk是针对所有产品的,一份sdk可以编译出多款芯片的镜像文件,所以这个makefile、编译脚本等都很复杂,但是我们只要抽丝剥茧,抓住核心即可
还是老规矩,直接跳到末尾,看它调用了哪些函数
prepare
select_toolchain
select_chip_info
fixup_platform_configure
sub_commands