开发指南:从 build.sh 到 build_hw.sh 的迁移
以下是将原始 build.sh 升级为支持多设备树构建的开发指南:
1. 增加多设备树支持
1.1 添加 -m 参数支持
- 加入-m选项的提示
echo " -m = build multi dtb "
- 初始化选项为false
BUILD_MULTIDTB=false
- 在
getopts参数解析部分,添加对-m的解析:m) echo "will build multidtb and package all the dtb into resource.img" BUILD_MULTIDTB=true ;;
1.2 定义多设备树文件名数组
在脚本顶部,定义一个数组,包含目标设备支持的所有设备树文件名。例如:
RK3568_HW_DTS=(
"hw-t3568i-lvds-0000-1024x768-s18"
"hw-t3568i-lvds-0001-1680x1050-d24"
"hw-t3568i-lvds-0010-1600x1200-d24"
"hw-t3568i-lvds-0011-1920x1080-d18"
...
)

1.3 创建 build_multidtb() 函数
新增一个函数,用于批量构建设备树文件:
function build_multidtb()
{
if [ "$TARGET_PRODUCT" = "rk3568_HW" ]; then
for (( i = 0 ; i < ${#RK3568_HW_DTS[@]} ; i++ )); do
echo "make ${RK3568_HW_DTS[$i]} ....."
make ARCH=$KERNEL_ARCH ./rockchip/${RK3568_HW_DTS[$i]}.dtb -j$BUILD_JOBS
done
./scripts/mkmultidtb.py RK3568-HW
fi
}
1.4 在构建流程中调用 build_multidtb()
在构建逻辑中,根据 BUILD_MULTIDTB 的值决定是否调用 build_multidtb():
if [ "$BUILD_MULTIDTB" = true ]; then
cd "$LOCAL_KERNEL_PATH" || { echo "Failed to enter directory: $LOCAL_KERNEL_PATH"; exit 1; }
if [ "$TARGET_PRODUCT" = "rk3568_HW" ]; then
make ARCH=arm64 NK_RK3568_defconfig
else
echo "There is no kernel defconfig file for the current TARGET_PRODUCT."
echo "Build build multi dtb failed!"
exit 1
fi
build_multidtb
cd -
fi

1.5 去除charge图片的打包
在原始脚本中:
- charge图标的打包
原始脚本会通过./u-boot/scripts/pack_resource.sh脚本将 charge 图标打包进resource.img中。然而经过测试发现,该脚本存在以下问题:pack_resource.sh会将resource.img中的一个设备树文件(DTB)重命名为rk-kernel.dtb。- 这导致
resource.img中出现了两个rk-kernel.dtb文件。 - 被重命名的设备树文件无法被 HW-ID DTB 正确识别,导致识别异常。
- charge图标的打包过程
原始脚本中对 charge 图标的打包方式如下:
关于使用 mkmultidtb.py 脚本:
- 多设备树打包
使用mkmultidtb.py脚本对多设备树进行打包时,resource.img中也会存在一个rk-kernel.dtb,但与原始脚本不同:mkmultidtb.py会将多个设备树中的一个文件复制后再重命名为rk-kernel.dtb。- 该
rk-kernel.dtb的作用是当硬件拨码条件不满足时,默认选择这个 DTB 文件。 - 由于是复制后重命名,不会影响 HW-ID DTB 对设备树的正确识别。
在修改后的脚本中:
- 取消 charge 图标的打包
当选择编译多设备树时,已取消对 charge 图标的打包,以避免上述问题的发生。
2. 增加调试信息
在脚本末尾,添加调试信息输出,以便快速定位问题。例如:
echo "========== Debug Information =========="
echo "TARGET_PRODUCT: ${TARGET_PRODUCT:-Not Set}"
echo "KERNEL_ARCH: ${KERNEL_ARCH:-Not Set}"
echo "BUILD_JOBS: ${BUILD_JOBS:-Not Set}"
echo "LOCAL_KERNEL_PATH: ${LOCAL_KERNEL_PATH:-Not Set}"
echo "KERNEL_DEFCONFIG: ${KERNEL_DEFCONFIG:-Not Set}"
echo "======================================="
3. 修改内核路径为局部变量
为了方便维护,建议将内核路径设为局部变量,并在所有相关路径中引用该变量:
LOCAL_KERNEL_PATH="./kernel"
在所有内核相关操作中,将硬编码路径替换为变量,例如:
cd $LOCAL_KERNEL_PATH && make $ADDON_ARGS ARCH=$KERNEL_ARCH $KERNEL_DEFCONFIG
总结
通过上述改动,build_hw.sh 在原有功能的基础上新增了对多设备树文件的支持,同时提高了代码的可维护性和可读性。开发者可以参考本指南,将类似的多设备树支持功能集成到其他脚本中。
留下评论