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=${objtree}/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 if ${MKIMAGE} 2>&1 | grep -q "\[-B size\]"; then 123 MKIMAGE_ARG="-B 0x200 ${MKIMAGE_ARG}" 124 fi 125} 126 127unpack_itb() 128{ 129 rm -rf ${OUT} 130 mkdir -p ${OUT} 131 132 for NAME in $(fdtget -l ${ITB} /images) 133 do 134 # generate image 135 NODE="/images/${NAME}" 136 OFFS=$(fdtget -ti ${ITB} ${NODE} data-position) 137 SIZE=$(fdtget -ti ${ITB} ${NODE} data-size) 138 if [ -z ${OFFS} ]; then 139 continue; 140 fi 141 142 if [ ${SIZE} -ne 0 ]; then 143 dd if=${ITB} of=${OUT}/${NAME} bs=${SIZE} count=1 skip=${OFFS} iflag=skip_bytes >/dev/null 2>&1 144 else 145 touch ${OUT}/${NAME} 146 fi 147 done 148 149 [ ! -f ${OUT}/kernel ] && echo "FIT ${ITB} no kernel" >&2 && exit 1 || true 150} 151 152gen_its() 153{ 154 TMP_ITB=${OUT}/boot.tmp 155 156 # add placeholder 157 cp ${ITB} ${TMP_ITB} 158 for NAME in $(fdtget -l ${ITB} /images); do 159 fdtput -t s ${TMP_ITB} /images/${NAME} data "/INCBIN/(${NAME})" 160 done 161 dtc -I dtb -O dts ${TMP_ITB} -o ${ITS} >/dev/null 2>&1 162 rm -f ${TMP_ITB} 163 164 # fixup placeholder: data = "/INCBIN/(...)"; -> data = /incbin/("..."); 165 sed -i "s/\"\/INCBIN\/(\(.*\))\"/\/incbin\/(\"\1\")/" ${ITS} 166 167 # remove 168 sed -i "/memreserve/d" ${ITS} 169 sed -i "/timestamp/d" ${ITS} 170 sed -i "/data-size/d" ${ITS} 171 sed -i "/data-position/d" ${ITS} 172 sed -i "/value/d" ${ITS} 173 sed -i "/hashed-strings/d" ${ITS} 174 sed -i "/hashed-nodes/d" ${ITS} 175 sed -i "/signer-version/d" ${ITS} 176 sed -i "/signer-name/d" ${ITS} 177} 178 179gen_itb() 180{ 181 [ -f ${OUT}/fdt ] && cp -a ${DTB_PATH} ${OUT}/fdt && FDT=" + ${DTB}" 182 [ -f ${OUT}/resource ] && cp -a resource.img ${OUT}/resource && RESOURCE=" + resource.img" 183 COMP=$(fdtget ${ITB} /images/kernel compression) 184 case "${COMP}" in 185 gzip) EXT=".gz";; 186 lz4) EXT=".lz4";; 187 bzip2) EXT=".bz2";; 188 lzma) EXT=".lzma";; 189 lzo) EXT=".lzo";; 190 esac 191 cp -a ${KERNEL_IMAGE_PATH}${EXT} ${OUT}/kernel && \ 192 ${MKIMAGE} ${MKIMAGE_ARG} -f ${ITS} boot.img >/dev/null && \ 193 echo " Image: boot.img (FIT ${BOOT_IMG} + Image${EXT}${FDT}${RESOURCE}) is ready"; 194 if [ "${EXT}" == "" ] && [ -f ${KERNEL_ZIMAGE_PATH} ]; then 195 cp -a ${KERNEL_ZIMAGE_PATH} ${OUT}/kernel && \ 196 ${MKIMAGE} ${MKIMAGE_ARG} -f ${ITS} zboot.img >/dev/null && \ 197 echo " Image: zboot.img (FIT ${BOOT_IMG} + zImage${FDT}${RESOURCE}) is ready"; 198 fi 199} 200 201repack_itb() 202{ 203 check_mkimage 204 unpack_itb 205 gen_its 206 gen_itb 207} 208 209# Create U-Boot FIT Image use ${BOOT_ITS} 210make_fit_boot_img() 211{ 212 ITS=${OUT}/boot.its 213 214 check_mkimage 215 mkdir -p ${OUT} 216 rm -f ${OUT}/fdt ${OUT}/kernel ${OUT}/resource ${ITS} 217 218 cp -a ${BOOT_ITS} ${ITS} 219 cp -a ${DTB_PATH} ${OUT}/fdt 220 cp -a ${KERNEL_ZIMAGE_PATH} ${OUT}/kernel 221 cp -a resource.img ${OUT}/resource 222 223 if [ "${ARCH}" == "arm64" ]; then 224 sed -i -e 's/arch = ""/arch = "arm64"/g' -e 's/compression = ""/compression = "lz4"/' ${ITS} 225 else 226 sed -i -e 's/arch = ""/arch = "arm"/g' -e 's/compression = ""/compression = "none"/' ${ITS} 227 fi 228 FIT_DESC=$(${MKIMAGE} ${MKIMAGE_ARG} -f ${ITS} boot.img | grep "FIT description" | sed 's/FIT description: //') 229 echo " Image: boot.img (${FIT_DESC}) is ready"; 230} 231 232if [ -x ${srctree}/scripts/bmpconvert ]; then 233 if [ -f ${LOGO_PATH} ]; then 234 ${srctree}/scripts/bmpconvert ${LOGO_PATH}; 235 fi 236 if [ -f ${LOGO_KERNEL_PATH} ]; then 237 ${srctree}/scripts/bmpconvert ${LOGO_KERNEL_PATH}; 238 fi 239fi 240 241if [ "${srctree}" != "${objtree}" ]; then 242 if [ -f ${LOGO_PATH} ]; then 243 cp -a ${LOGO_PATH} ${objtree}/; 244 fi 245 if [ -f ${LOGO_KERNEL_PATH} ]; then 246 cp -a ${LOGO_KERNEL_PATH} ${objtree}/; 247 fi 248fi 249scripts/resource_tool ${DTB_PATH} ${LOGO} ${LOGO_KERNEL} >/dev/null 250echo " Image: resource.img (with ${DTB} ${LOGO} ${LOGO_KERNEL}) is ready" 251 252if [ -f "${BOOT_IMG}" ]; then 253 if file -L -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