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