android13/kernel-5.10/scripts/mkimg

263 lines
6.3 KiB
Bash
Executable File

#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd.
set -e
usage() {
cat >&2 << USAGE
usage: $0 [-h] --dtb DTB
optional arguments:
-h, --help show this help message and exit
--dtb DTB the dtb file name
USAGE
}
# Parse command-line arguments
while [ $# -gt 0 ]; do
case $1 in
--dtb)
DTB=$2
shift 2
;;
-h)
usage
exit 0
;;
--help)
usage
exit 0
;;
*)
shift
;;
esac
done
srctree=${srctree-"."}
objtree=${objtree-"."}
if [ "${ARCH}" == "" ]; then
if [ "$($srctree/scripts/config --state CONFIG_ARM)" == "y" ]; then
ARCH=arm
else
ARCH=arm64
fi
fi
LOGO_PATH=${srctree}/logo.bmp
[ -f ${LOGO_PATH} ] && LOGO=logo.bmp
LOGO_KERNEL_PATH=${srctree}/logo_kernel.bmp
[ -f ${LOGO_KERNEL_PATH} ] && LOGO_KERNEL=logo_kernel.bmp
KERNEL_IMAGE_PATH=${objtree}/arch/${ARCH}/boot/Image
KERNEL_IMAGE_ARG="--kernel ${KERNEL_IMAGE_PATH}"
if [ "${ARCH}" == "arm" ]; then
DTB_PATH=${objtree}/arch/arm/boot/dts/${DTB}
ZIMAGE=zImage
else
DTB_PATH=${objtree}/arch/arm64/boot/dts/rockchip/${DTB}
ZIMAGE=Image.lz4
fi
KERNEL_ZIMAGE_PATH=${objtree}/arch/${ARCH}/boot/${ZIMAGE}
KERNEL_ZIMAGE_ARG="--kernel ${KERNEL_ZIMAGE_PATH}"
if [ ! -f ${DTB_PATH} ]; then
echo "No dtb" >&2
usage
exit 1
fi
OUT=out
ITB=${BOOT_IMG}
ITS=${OUT}/boot.its
MKIMAGE=${MKIMAGE-"mkimage"}
MKIMAGE_ARG="-E -p 0x800"
make_boot_img()
{
RAMDISK_IMG_PATH=${objtree}/ramdisk.img
[ -f ${RAMDISK_IMG_PATH} ] && RAMDISK_IMG=ramdisk.img && RAMDISK_ARG="--ramdisk ${RAMDISK_IMG_PATH}"
${srctree}/scripts/mkbootimg \
${KERNEL_IMAGE_ARG} \
${RAMDISK_ARG} \
--second resource.img \
-o boot.img && \
echo " Image: boot.img (with Image ${RAMDISK_IMG} resource.img) is ready";
${srctree}/scripts/mkbootimg \
${KERNEL_ZIMAGE_ARG} \
${RAMDISK_ARG} \
--second resource.img \
-o zboot.img && \
echo " Image: zboot.img (with ${ZIMAGE} ${RAMDISK_IMG} resource.img) is ready"
}
repack_boot_img()
{
${srctree}/scripts/repack-bootimg \
--boot_img ${BOOT_IMG} --out ${OUT} \
${KERNEL_IMAGE_ARG} \
--second resource.img \
--dtb ${DTB_PATH} \
-o boot.img &&
echo " Image: boot.img (${BOOT_IMG} + Image) is ready";
${srctree}/scripts/repack-bootimg \
--boot_img ${BOOT_IMG} --out ${OUT} \
${KERNEL_ZIMAGE_ARG} \
--second resource.img \
--dtb ${DTB_PATH} \
-o zboot.img && \
echo " Image: zboot.img (${BOOT_IMG} + ${ZIMAGE}) is ready"
}
check_mkimage()
{
MKIMAGE=$(type -p ${MKIMAGE} || true)
if [ -z "${MKIMAGE}" ]; then
# Doesn't exist
echo '"mkimage" command not found - U-Boot images will not be built' >&2
exit 1;
fi
if ${MKIMAGE} 2>&1 | grep -q "\[-B size\]"; then
MKIMAGE_ARG="-B 0x200 ${MKIMAGE_ARG}"
fi
}
unpack_itb()
{
rm -rf ${OUT}
mkdir -p ${OUT}
for NAME in $(fdtget -l ${ITB} /images)
do
# generate image
NODE="/images/${NAME}"
OFFS=$(fdtget -ti ${ITB} ${NODE} data-position)
SIZE=$(fdtget -ti ${ITB} ${NODE} data-size)
if [ -z ${OFFS} ]; then
continue;
fi
if [ ${SIZE} -ne 0 ]; then
dd if=${ITB} of=${OUT}/${NAME} bs=${SIZE} count=1 skip=${OFFS} iflag=skip_bytes >/dev/null 2>&1
else
touch ${OUT}/${NAME}
fi
done
[ ! -f ${OUT}/kernel ] && echo "FIT ${ITB} no kernel" >&2 && exit 1 || true
}
gen_its()
{
TMP_ITB=${OUT}/boot.tmp
# add placeholder
cp ${ITB} ${TMP_ITB}
for NAME in $(fdtget -l ${ITB} /images); do
fdtput -t s ${TMP_ITB} /images/${NAME} data "/INCBIN/(${NAME})"
done
dtc -I dtb -O dts ${TMP_ITB} -o ${ITS} >/dev/null 2>&1
rm -f ${TMP_ITB}
# fixup placeholder: data = "/INCBIN/(...)"; -> data = /incbin/("...");
sed -i "s/\"\/INCBIN\/(\(.*\))\"/\/incbin\/(\"\1\")/" ${ITS}
# remove
sed -i "/memreserve/d" ${ITS}
sed -i "/timestamp/d" ${ITS}
sed -i "/data-size/d" ${ITS}
sed -i "/data-position/d" ${ITS}
sed -i "/value/d" ${ITS}
sed -i "/hashed-strings/d" ${ITS}
sed -i "/hashed-nodes/d" ${ITS}
sed -i "/signer-version/d" ${ITS}
sed -i "/signer-name/d" ${ITS}
}
gen_itb()
{
[ -f ${OUT}/fdt ] && cp -a ${DTB_PATH} ${OUT}/fdt && FDT=" + ${DTB}"
[ -f ${OUT}/resource ] && cp -a resource.img ${OUT}/resource && RESOURCE=" + resource.img"
COMP=$(fdtget ${ITB} /images/kernel compression)
case "${COMP}" in
gzip) EXT=".gz";;
lz4) EXT=".lz4";;
bzip2) EXT=".bz2";;
lzma) EXT=".lzma";;
lzo) EXT=".lzo";;
esac
cp -a ${KERNEL_IMAGE_PATH}${EXT} ${OUT}/kernel && \
${MKIMAGE} ${MKIMAGE_ARG} -f ${ITS} boot.img >/dev/null && \
echo " Image: boot.img (FIT ${BOOT_IMG} + Image${EXT}${FDT}${RESOURCE}) is ready";
if [ "${EXT}" == "" ] && [ -f ${KERNEL_ZIMAGE_PATH} ]; then
cp -a ${KERNEL_ZIMAGE_PATH} ${OUT}/kernel && \
${MKIMAGE} ${MKIMAGE_ARG} -f ${ITS} zboot.img >/dev/null && \
echo " Image: zboot.img (FIT ${BOOT_IMG} + zImage${FDT}${RESOURCE}) is ready";
fi
}
repack_itb()
{
check_mkimage
unpack_itb
gen_its
gen_itb
}
# Create U-Boot FIT Image use ${BOOT_ITS}
make_fit_boot_img()
{
ITS=${OUT}/boot.its
check_mkimage
mkdir -p ${OUT}
rm -f ${OUT}/fdt ${OUT}/kernel ${OUT}/resource ${ITS}
cp -a ${BOOT_ITS} ${ITS}
cp -a ${DTB_PATH} ${OUT}/fdt
cp -a ${KERNEL_ZIMAGE_PATH} ${OUT}/kernel
cp -a resource.img ${OUT}/resource
if [ "${ARCH}" == "arm64" ]; then
sed -i -e 's/arch = ""/arch = "arm64"/g' -e 's/compression = ""/compression = "lz4"/' ${ITS}
else
sed -i -e 's/arch = ""/arch = "arm"/g' -e 's/compression = ""/compression = "none"/' ${ITS}
fi
FIT_DESC=$(${MKIMAGE} ${MKIMAGE_ARG} -f ${ITS} boot.img | grep "FIT description" | sed 's/FIT description: //')
echo " Image: boot.img (${FIT_DESC}) is ready";
}
if [ -x ${srctree}/scripts/bmpconvert ]; then
if [ -f ${LOGO_PATH} ]; then
${srctree}/scripts/bmpconvert ${LOGO_PATH};
fi
if [ -f ${LOGO_KERNEL_PATH} ]; then
${srctree}/scripts/bmpconvert ${LOGO_KERNEL_PATH};
fi
fi
if [ "${srctree}" != "${objtree}" ]; then
if [ -f ${LOGO_PATH} ]; then
cp -a ${LOGO_PATH} ${objtree}/;
fi
if [ -f ${LOGO_KERNEL_PATH} ]; then
cp -a ${LOGO_KERNEL_PATH} ${objtree}/;
fi
fi
scripts/resource_tool ${DTB_PATH} ${LOGO} ${LOGO_KERNEL} >/dev/null
echo " Image: resource.img (with ${DTB} ${LOGO} ${LOGO_KERNEL}) is ready"
if [ -f "${BOOT_IMG}" ]; then
if file -L -p -b ${BOOT_IMG} | grep -q 'Device Tree Blob' ; then
repack_itb;
elif [ -x ${srctree}/scripts/repack-bootimg ]; then
repack_boot_img;
fi
elif [ -f "${BOOT_ITS}" ]; then
make_fit_boot_img;
elif [ -x ${srctree}/scripts/mkbootimg ]; then
make_boot_img;
fi