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