xref: /OK3568_Linux_fs/kernel/scripts/mkimg (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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