1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd. 4 5set -e 6 7usage() { 8 cat >&2 << USAGE 9usage: $0 [-h] --dtb DTB 10 11optional arguments: 12 -h, --help show this help message and exit 13 --dtb DTB the dtb file name 14USAGE 15} 16 17# Parse command-line arguments 18while [ $# -gt 0 ]; do 19 case $1 in 20 --dtb) 21 DTB=$2 22 shift 2 23 ;; 24 -h) 25 usage 26 exit 0 27 ;; 28 --help) 29 usage 30 exit 0 31 ;; 32 *) 33 shift 34 ;; 35 esac 36done 37 38srctree=${srctree-"."} 39objtree=${objtree-"."} 40if [ "${ARCH}" == "" ]; then 41 if [ "$($srctree/scripts/config --state CONFIG_ARM)" == "y" ]; then 42 ARCH=arm 43 else 44 ARCH=arm64 45 fi 46fi 47 48LOGO_PATH=${srctree}/logo.bmp 49[ -f ${LOGO_PATH} ] && LOGO=logo.bmp 50 51LOGO_KERNEL_PATH=${srctree}/logo_kernel.bmp 52[ -f ${LOGO_KERNEL_PATH} ] && LOGO_KERNEL=logo_kernel.bmp 53 54KERNEL_IMAGE_PATH=${objtree}/arch/${ARCH}/boot/Image 55KERNEL_IMAGE_ARG="--kernel ${KERNEL_IMAGE_PATH}" 56if [ "${ARCH}" == "arm" ]; then 57 DTB_PATH=${objtree}/arch/arm/boot/dts/${DTB} 58 ZIMAGE=zImage 59else 60 DTB_PATH=vendor/arch/arm64/boot/dts/rockchip/${DTB} 61 ZIMAGE=Image.lz4 62fi 63KERNEL_ZIMAGE_PATH=${objtree}/arch/${ARCH}/boot/${ZIMAGE} 64KERNEL_ZIMAGE_ARG="--kernel ${KERNEL_ZIMAGE_PATH}" 65if [ ! -f ${DTB_PATH} ]; then 66 echo "No dtb" >&2 67 usage 68 exit 1 69fi 70 71OUT=out 72ITB=${BOOT_IMG} 73ITS=${OUT}/boot.its 74MKIMAGE=${MKIMAGE-"mkimage"} 75MKIMAGE_ARG="-E -p 0x800" 76 77make_boot_img() 78{ 79 RAMDISK_IMG_PATH=${objtree}/ramdisk.img 80 [ -f ${RAMDISK_IMG_PATH} ] && RAMDISK_IMG=ramdisk.img && RAMDISK_ARG="--ramdisk ${RAMDISK_IMG_PATH}" 81 82 ${srctree}/scripts/mkbootimg \ 83 ${KERNEL_IMAGE_ARG} \ 84 ${RAMDISK_ARG} \ 85 --second resource.img \ 86 -o boot.img && \ 87 echo " Image: boot.img (with Image ${RAMDISK_IMG} resource.img) is ready"; 88 ${srctree}/scripts/mkbootimg \ 89 ${KERNEL_ZIMAGE_ARG} \ 90 ${RAMDISK_ARG} \ 91 --second resource.img \ 92 -o zboot.img && \ 93 echo " Image: zboot.img (with ${ZIMAGE} ${RAMDISK_IMG} resource.img) is ready" 94} 95 96repack_boot_img() 97{ 98 ${srctree}/scripts/repack-bootimg \ 99 --boot_img ${BOOT_IMG} --out ${OUT} \ 100 ${KERNEL_IMAGE_ARG} \ 101 --second resource.img \ 102 --dtb ${DTB_PATH} \ 103 -o boot.img && 104 echo " Image: boot.img (${BOOT_IMG} + Image) is ready"; 105 ${srctree}/scripts/repack-bootimg \ 106 --boot_img ${BOOT_IMG} --out ${OUT} \ 107 ${KERNEL_ZIMAGE_ARG} \ 108 --second resource.img \ 109 --dtb ${DTB_PATH} \ 110 -o zboot.img && \ 111 echo " Image: zboot.img (${BOOT_IMG} + ${ZIMAGE}) is ready" 112} 113 114check_mkimage() 115{ 116 MKIMAGE=$(type -p ${MKIMAGE} || true) 117 if [ -z "${MKIMAGE}" ]; then 118 # Doesn't exist 119 echo '"mkimage" command not found - U-Boot images will not be built' >&2 120 exit 1; 121 fi 122} 123 124unpack_itb() 125{ 126 mkdir -p ${OUT} 127 rm -f ${OUT}/fdt ${OUT}/kernel ${OUT}/resource 128 129 for NAME in $(fdtget -l ${ITB} /images) 130 do 131 # generate image 132 NODE="/images/${NAME}" 133 OFFS=$(fdtget -ti ${ITB} ${NODE} data-position) 134 SIZE=$(fdtget -ti ${ITB} ${NODE} data-size) 135 if [ -z ${OFFS} ]; then 136 continue; 137 fi 138 139 if [ ${SIZE} -ne 0 ]; then 140 dd if=${ITB} of=${OUT}/${NAME} bs=${SIZE} count=1 skip=${OFFS} iflag=skip_bytes >/dev/null 2>&1 141 else 142 touch ${OUT}/${NAME} 143 fi 144 done 145 146 [ ! -f ${OUT}/kernel ] && echo "FIT ${ITB} no kernel" >&2 && exit 1 || true 147} 148 149gen_its() 150{ 151 TMP_ITB=${OUT}/boot.tmp 152 153 # add placeholder 154 cp -a ${ITB} ${TMP_ITB} 155 for NAME in $(fdtget -l ${ITB} /images); do 156 fdtput -t s ${TMP_ITB} /images/${NAME} data "/INCBIN/(${NAME})" 157 done 158 dtc -I dtb -O dts ${TMP_ITB} -o ${ITS} >/dev/null 2>&1 159 rm -f ${TMP_ITB} 160 161 # fixup placeholder: data = "/INCBIN/(...)"; -> data = /incbin/("..."); 162 sed -i "s/\"\/INCBIN\/(\(.*\))\"/\/incbin\/(\"\1\")/" ${ITS} 163 164 # remove 165 sed -i "/memreserve/d" ${ITS} 166 sed -i "/timestamp/d" ${ITS} 167 sed -i "/data-size/d" ${ITS} 168 sed -i "/data-position/d" ${ITS} 169 sed -i "/value/d" ${ITS} 170 sed -i "/hashed-strings/d" ${ITS} 171 sed -i "/hashed-nodes/d" ${ITS} 172 sed -i "/signer-version/d" ${ITS} 173 sed -i "/signer-name/d" ${ITS} 174} 175 176gen_itb() 177{ 178 [ -f ${OUT}/fdt ] && cp -a ${DTB_PATH} ${OUT}/fdt && FDT=" + ${DTB}" 179 [ -f ${OUT}/resource ] && cp -a resource.img ${OUT}/resource && RESOURCE=" + resource.img" 180 COMP=$(fdtget ${ITB} /images/kernel compression) 181 case "${COMP}" in 182 gzip) EXT=".gz";; 183 lz4) EXT=".lz4";; 184 bzip2) EXT=".bz2";; 185 lzma) EXT=".lzma";; 186 lzo) EXT=".lzo";; 187 esac 188 cp -a ${KERNEL_IMAGE_PATH}${EXT} ${OUT}/kernel && \ 189 ${MKIMAGE} ${MKIMAGE_ARG} -f ${ITS} boot.img >/dev/null && \ 190 echo " Image: boot.img (FIT ${BOOT_IMG} + Image${EXT}${FDT}${RESOURCE}) is ready"; 191 if [ "${EXT}" == "" ] && [ -f ${KERNEL_ZIMAGE_PATH} ]; then 192 cp -a ${KERNEL_ZIMAGE_PATH} ${OUT}/kernel && \ 193 ${MKIMAGE} ${MKIMAGE_ARG} -f ${ITS} zboot.img >/dev/null && \ 194 echo " Image: zboot.img (FIT ${BOOT_IMG} + zImage${FDT}${RESOURCE}) is ready"; 195 fi 196} 197 198repack_itb() 199{ 200 check_mkimage 201 unpack_itb 202 gen_its 203 gen_itb 204} 205 206# Create U-Boot FIT Image use ${BOOT_ITS} 207make_fit_boot_img() 208{ 209 ITS=${OUT}/boot.its 210 211 check_mkimage 212 mkdir -p ${OUT} 213 rm -f ${OUT}/fdt ${OUT}/kernel ${OUT}/resource ${ITS} 214 215 cp -a ${BOOT_ITS} ${ITS} 216 cp -a ${DTB_PATH} ${OUT}/fdt 217 cp -a ${KERNEL_ZIMAGE_PATH} ${OUT}/kernel 218 cp -a resource.img ${OUT}/resource 219 220 if [ "${ARCH}" == "arm64" ]; then 221 sed -i -e 's/arch = ""/arch = "arm64"/g' -e 's/compression = ""/compression = "lz4"/' ${ITS} 222 else 223 sed -i -e 's/arch = ""/arch = "arm"/g' -e 's/compression = ""/compression = "none"/' ${ITS} 224 fi 225 FIT_DESC=$(${MKIMAGE} ${MKIMAGE_ARG} -f ${ITS} boot.img | grep "FIT description" | sed 's/FIT description: //') 226 echo " Image: boot.img (${FIT_DESC}) is ready"; 227} 228 229if [ -x ${srctree}/scripts/bmpconvert ]; then 230 if [ -f ${LOGO_PATH} ]; then 231 ${srctree}/scripts/bmpconvert ${LOGO_PATH}; 232 fi 233 if [ -f ${LOGO_KERNEL_PATH} ]; then 234 ${srctree}/scripts/bmpconvert ${LOGO_KERNEL_PATH}; 235 fi 236fi 237 238if [ "${srctree}" != "${objtree}" ]; then 239 if [ -f ${LOGO_PATH} ]; then 240 cp -a ${LOGO_PATH} ${objtree}/; 241 fi 242 if [ -f ${LOGO_KERNEL_PATH} ]; then 243 cp -a ${LOGO_KERNEL_PATH} ${objtree}/; 244 fi 245fi 246vendor/scripts/resource_tool ${DTB_PATH} ${LOGO} ${LOGO_KERNEL} >/dev/null 247echo "dtb ${DTB_PATH}" 248echo "logo ${LOGO}" 249echo "logo_kernel ${LOGO_KERNEL}" 250echo " Image: resource.img (with ${DTB} ${LOGO} ${LOGO_KERNEL}) is ready" 251 252if [ -f "${BOOT_IMG}" ]; then 253 if file -p -b ${BOOT_IMG} | grep -q 'Device Tree Blob' ; then 254 repack_itb; 255 elif [ -x ${srctree}/scripts/repack-bootimg ]; then 256 repack_boot_img; 257 fi 258elif [ -f "${BOOT_ITS}" ]; then 259 make_fit_boot_img; 260elif [ -x ${srctree}/scripts/mkbootimg ]; then 261 make_boot_img; 262fi 263