先快速过一遍 有个概念先~
init
shell启动 传参 init ------> build_select_board
90 BOARD_CONFIG=$TOP_DIR/device/rockchip/.BoardConfig.mk
91 TARGET_PRODUCT="$TOP_DIR/device/rockchip/.target_product"
92 TARGET_PRODUCT_DIR=$(realpath ${TARGET_PRODUCT})
38 function choose_target_board()
39 {
40 echo
41 echo "You're building on Linux"
42 echo "Lunch menu...pick a combo:"
43 echo ""
44
45 echo "0. default BoardConfig.mk"
46 echo ${RK_TARGET_BOARD_ARRAY[@]} | xargs -n 1 | sed "=" | sed "N;s/\n/. /"
47
48 local INDEX
49 read -p "Which would you like? [0]: " INDEX
50 INDEX=$((${INDEX:-0} - 1))
51
52 if echo $INDEX | grep -vq [^0-9]; then
53 RK_BUILD_TARGET_BOARD="${RK_TARGET_BOARD_ARRAY[$INDEX]}"
54 else
55 echo "Lunching for Default BoardConfig.mk boards..."
56 #RK_BUILD_TARGET_BOARD=BoardConfig.mk
57 RK_BUILD_TARGET_BOARD=${RK_TARGET_BOARD_ARRAY[0]}
58 fi
59 }
60
61 function build_select_board()
62 {
63 RK_TARGET_BOARD_ARRAY=( $(cd ${TARGET_PRODUCT_DIR}/; ls BoardConfig*.mk | sort) )
64
65 RK_TARGET_BOARD_ARRAY_LEN=${#RK_TARGET_BOARD_ARRAY[@]}
66 if [ $RK_TARGET_BOARD_ARRAY_LEN -eq 0 ]; then
67 echo "No available Board Config"
68 return
69 fi
70
71 choose_target_board
72
73 ln -rfs $TARGET_PRODUCT_DIR/$RK_BUILD_TARGET_BOARD device/rockchip/.BoardConfig.mk
74 echo "switching to board: `realpath $BOARD_CONFIG`"
75 }
init命令,会显示TARGET_PRODUCT_DIR目录下所有以BoardConfig开头mk结尾的文件。
然后你选一个,脚本会将你选的文件创建一个软链接到device/rockchip/.BoardConfig.mk,默认是没有这个文件的。
kernel
check_config RK_KERNEL_DTS RK_KERNEL_DEFCONFIG || return 0
24 function check_config(){
25 unset missing
26 for var in $@; do
27 eval [ \$$var ] && continue
28
29 missing="$missing $var"
30 done
31
32 [ -z "$missing" ] && return 0
33
34 echo "Skipping ${FUNCNAME[1]} for missing configs: $missing."
35 return 1
36 }
首先检查变量 RK_KERNEL_DTS 、 RK_KERNEL_DEFCONFIG这俩变量没有赋值的话就退出了。
这里扩展一下,这两个变量在上一步init
中选中的MK文件中进行export
。这个被选中的MK文件在shell启动的时候被source:
85 CMD=`realpath $0`
86 COMMON_DIR=`dirname $CMD`
87 TOP_DIR=$(realpath $COMMON_DIR/../../..)
88 cd $TOP_DIR
89
90 BOARD_CONFIG=$TOP_DIR/device/rockchip/.BoardConfig.mk
91 TARGET_PRODUCT="$TOP_DIR/device/rockchip/.target_product"
92 TARGET_PRODUCT_DIR=$(realpath ${TARGET_PRODUCT})
93
94 if [ ! -L "$BOARD_CONFIG" -a "$1" != "init" ]; then
95 build_select_board
96 fi
97 unset_board_config_all
98 [ -L "$BOARD_CONFIG" ] && source $BOARD_CONFIG
450 function build_check_cross_compile(){
451
452 case $RK_ARCH in
453 arm|armhf)
454 if [ -d "$TOP_DIR/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf" ]; then
455 CROSS_COMPILE=$(realpath $TOP_DIR)/prebuilts/gcc/linux-x86/arm/gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf/bin/arm-none-linux-gnueabihf-
456 export CROSS_COMPILE=$CROSS_COMPILE
457 fi
458 ;;
459 arm64|aarch64)
460 if [ -d "$TOP_DIR/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu" ]; then
461 CROSS_COMPILE=$(realpath $TOP_DIR)/prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
462 export CROSS_COMPILE=$CROSS_COMPILE
463 fi
464 ;;
465 *)
466 echo "the $RK_ARCH not supported for now, please check it again\n"
467 ;;
468 esac
469 }
根据RK_ARCH变量,决定CROSS_COMPILE变量,指定交叉编译链的位置(RK_ARCH上面说到了,参考kernel节)
763 cd kernel
764 if [ ! -f ".config" ]; then
765 make ARCH=$RK_ARCH $RK_KERNEL_DEFCONFIG $RK_KERNEL_DEFCONFIG_FRAGMENT
766 fi
767 cd -
这里就是开始编译内核了,指定了架构(ARCH)、默认配置(RK_KERNEL_DEFCONFIG)、默认配置片段(RK_KERNEL_DEFCONFIG_FRAGMENT)这里错了,这里是判断是否有默认配置文件,没有的话创建默认配置文件(.config)。
769 echo "------ start build dtb------"
770 ¦ if [[ $MULTI_DTB = "true" ]] ; then
771 ¦ ¦ export MULTI_DTB=false
772 ¦ ¦ ¦ create_multi_dts
773 ¦ ¦ ¦ build_resource_multi_dtb
774 ¦ ¦ export MULTI_DTB=true
775 ¦ ¦ ¦ MULTI_DTB="MULTI_DTB=true"
776 ¦ fi
777 echo "------ end build dtb------"
778
779 cd kernel
780 make ARCH=$RK_ARCH $MULTI_DTB $RK_KERNEL_DTS.img -j$RK_JOBS
782 cd -
- create_multi_dts 这个略复杂,没有看太细,大意是:根据变量SUPPORT_BOARD 和 DTB_DIR(都在.mk文件中声明)找到
dts
文件,dts文件有关于lcd
的dtsi
include,出时状态是注释掉的,关闭注释,然后编译设备数源码生成dtb文件。 这块处理的是lcd的设备树 - build_resource_multi_dtb
cd kernel && ./scripts/mkmultidtb.py $RK_KERNEL_DTS && cp resource.img resource_multi_dtb.img && cd ..
-
make ARCH=$RK_ARCH $MULTI_DTB $RK_KERNEL_DTS.img -j$RK_JOBS
又是编译设备树。 - 这里小总结一下 设备树这块目前不熟,看样子是根据传入的设备树名称.img来确定编译哪个设备树。后续再看把。
- 编译内核在这里
make ARCH=$RK_ARCH $MULTI_DTB $RK_KERNEL_DTS.img -j$RK_JOBS
,其中XX_DTS.img决定了要编译哪个dts文件。
783 if [[ $MULTI_DTB = "MULTI_DTB=true" ]] ; then
784 build_resource_multi_dtb
785 fi
- 看上面
786 cd kernel
787
788 if [ -f "$TOP_DIR/device/rockchip/$RK_TARGET_PRODUCT/$RK_KERNEL_FIT_ITS" ]; then
789 $COMMON_DIR/mk-fitimage.sh $TOP_DIR/kernel/$RK_BOOT_IMG \
790 $TOP_DIR/device/rockchip/$RK_TARGET_PRODUCT/$RK_KERNEL_FIT_ITS
791 fi
792
793 if [ -f "$TOP_DIR/kernel/$RK_BOOT_IMG" ]; then
794 mkdir -p $TOP_DIR/rockdev
795 ln -sf $TOP_DIR/kernel/$RK_BOOT_IMG $TOP_DIR/rockdev/boot.img
796 fi
797
798 if [ "$RK_RAMDISK_SECURITY_BOOTUP" = "true" ];then
799 cp $TOP_DIR/kernel/$RK_BOOT_IMG \
800 $TOP_DIR/u-boot/boot.img
801 fi
- 引导相关。