xref: /rk3399_rockchip-uboot/scripts/repack-bootimg (revision 8a334094eed8b1101b3678f75f102162249c5866)
1*8a334094SJoseph Chen#!/bin/bash
2*8a334094SJoseph Chen# SPDX-License-Identifier: GPL-2.0
3*8a334094SJoseph Chen# Copyright (c) 2019 Fuzhou Rockchip Electronics Co., Ltd.
4*8a334094SJoseph Chenset -e
5*8a334094SJoseph Chen
6*8a334094SJoseph Chenusage() {
7*8a334094SJoseph Chen	cat >&2 << USAGE
8*8a334094SJoseph Chenusage: $0 [-h] [-z] --boot_img BOOT_IMG [--out OUT] [--kernel KERNEL] [--ramdisk RAMDISK] [--second SECOND] [--dtb DTB ] [--recovery_dtbo RECOVERY_DTBO] -o OUTPUT
9*8a334094SJoseph Chen
10*8a334094SJoseph Chenoptional arguments:
11*8a334094SJoseph Chen  -h, --help            show this help message and exit
12*8a334094SJoseph Chen  -z                    pack compressed kernel image
13*8a334094SJoseph Chen  --boot_img BOOT_IMG   path to the original boot image
14*8a334094SJoseph Chen  --out OUT             path to out binaries (default: out)
15*8a334094SJoseph Chen  --kernel KERNEL       path to the new kernel
16*8a334094SJoseph Chen  --ramdisk RAMDISK     path to the new ramdisk
17*8a334094SJoseph Chen  --second SECOND       path to the new 2nd bootloader (default: resource.img)
18*8a334094SJoseph Chen  --dtb DTB             path to the new dtb
19*8a334094SJoseph Chen  --recovery_dtbo RECOVERY_DTBO
20*8a334094SJoseph Chen                        path to the new recovery DTBO
21*8a334094SJoseph Chen  -o OUTPUT, --output OUTPUT
22*8a334094SJoseph Chen                        output file name
23*8a334094SJoseph ChenUSAGE
24*8a334094SJoseph Chen}
25*8a334094SJoseph Chen
26*8a334094SJoseph Chen# Parse command-line arguments
27*8a334094SJoseph Chenwhile [ $# -gt 0 ]; do
28*8a334094SJoseph Chen	case $1 in
29*8a334094SJoseph Chen		--boot_img)
30*8a334094SJoseph Chen			boot_img=$2
31*8a334094SJoseph Chen			shift 2
32*8a334094SJoseph Chen			;;
33*8a334094SJoseph Chen		--out)
34*8a334094SJoseph Chen			out=$2
35*8a334094SJoseph Chen			shift 2
36*8a334094SJoseph Chen			;;
37*8a334094SJoseph Chen		--kernel)
38*8a334094SJoseph Chen			kernel=$2
39*8a334094SJoseph Chen			shift 2
40*8a334094SJoseph Chen			;;
41*8a334094SJoseph Chen		--ramdisk)
42*8a334094SJoseph Chen			ramdisk=$2
43*8a334094SJoseph Chen			shift 2
44*8a334094SJoseph Chen			;;
45*8a334094SJoseph Chen		--second)
46*8a334094SJoseph Chen			second=$2
47*8a334094SJoseph Chen			shift 2
48*8a334094SJoseph Chen			;;
49*8a334094SJoseph Chen		--dtb)
50*8a334094SJoseph Chen			dtb=$2
51*8a334094SJoseph Chen			shift 2
52*8a334094SJoseph Chen			;;
53*8a334094SJoseph Chen		--recovery_dtbo)
54*8a334094SJoseph Chen			recovery_dtbo=$2
55*8a334094SJoseph Chen			shift 2
56*8a334094SJoseph Chen			;;
57*8a334094SJoseph Chen		-h)
58*8a334094SJoseph Chen			usage
59*8a334094SJoseph Chen			exit 0
60*8a334094SJoseph Chen			;;
61*8a334094SJoseph Chen		--help)
62*8a334094SJoseph Chen			usage
63*8a334094SJoseph Chen			exit 0
64*8a334094SJoseph Chen			;;
65*8a334094SJoseph Chen		-z)
66*8a334094SJoseph Chen			compressed_kernel=y
67*8a334094SJoseph Chen			shift
68*8a334094SJoseph Chen			;;
69*8a334094SJoseph Chen		-o)
70*8a334094SJoseph Chen			output=$2
71*8a334094SJoseph Chen			shift 2
72*8a334094SJoseph Chen			;;
73*8a334094SJoseph Chen		--output)
74*8a334094SJoseph Chen			output=$2
75*8a334094SJoseph Chen			shift 2
76*8a334094SJoseph Chen			;;
77*8a334094SJoseph Chen		*)
78*8a334094SJoseph Chen			shift
79*8a334094SJoseph Chen			;;
80*8a334094SJoseph Chen        esac
81*8a334094SJoseph Chendone
82*8a334094SJoseph Chen
83*8a334094SJoseph Chenif [ "$boot_img" == "" -o ! -e "$boot_img" ]; then
84*8a334094SJoseph Chen	echo "No boot img"
85*8a334094SJoseph Chen	usage
86*8a334094SJoseph Chen	exit 1
87*8a334094SJoseph Chenfi
88*8a334094SJoseph Chen
89*8a334094SJoseph Chenif [ "$output" == "" ]; then
90*8a334094SJoseph Chen	echo "No output file name"
91*8a334094SJoseph Chen	usage
92*8a334094SJoseph Chen	exit 1
93*8a334094SJoseph Chenfi
94*8a334094SJoseph Chen
95*8a334094SJoseph Chensrctree=${srctree-"."}
96*8a334094SJoseph Chenobjtree=${objtree-"."}
97*8a334094SJoseph Chenout=${out-"out"}
98*8a334094SJoseph Chenif [ "$($srctree/scripts/config --state CONFIG_ARM64)" == "y" ]; then
99*8a334094SJoseph Chen	if [ "$compressed_kernel" == "y" ]; then
100*8a334094SJoseph Chen		default_kernel=arch/arm64/boot/Image.lz4
101*8a334094SJoseph Chen	else
102*8a334094SJoseph Chen		default_kernel=arch/arm64/boot/Image
103*8a334094SJoseph Chen	fi
104*8a334094SJoseph Chenelse
105*8a334094SJoseph Chen	if [ "$compressed_kernel" == "y" ]; then
106*8a334094SJoseph Chen		default_kernel=arch/arm/boot/zImage
107*8a334094SJoseph Chen	else
108*8a334094SJoseph Chen		default_kernel=arch/arm/boot/Image
109*8a334094SJoseph Chen	fi
110*8a334094SJoseph Chenfi
111*8a334094SJoseph Chenkernel=${kernel-$objtree/$default_kernel}
112*8a334094SJoseph Chensecond=${second-$objtree/resource.img}
113*8a334094SJoseph Chenramdisk=${ramdisk-$out/ramdisk}
114*8a334094SJoseph Chendtb=${dtb-$out/dtb}
115*8a334094SJoseph Chenrecovery_dtbo=${recovery_dtbo-$out/recovery_dtbo}
116*8a334094SJoseph Chenlog="$out/unpack.log"
117*8a334094SJoseph Chen
118*8a334094SJoseph Chenmkdir -p $out
119*8a334094SJoseph Chen$srctree/scripts/unpack_bootimg --boot_img $boot_img --out $out > $log
120*8a334094SJoseph Chen
121*8a334094SJoseph Chencmdline=$(grep -a "^command line args: " $log | tr '\0' '\n'| sed "s/^command line args: //")
122*8a334094SJoseph Chenextra_cmdline=$(grep -a "^additional command line args: " $log | tr '\0' '\n'| sed "s/^additional command line args: //")
123*8a334094SJoseph Chenversion=$(grep -a "^boot image header version: " $log | sed "s/^boot image header version: //")
124*8a334094SJoseph Chen
125*8a334094SJoseph Chenos_version_patch_level=$(grep -a "^os version and patch level: " $log | sed "s/^os version and patch level: //")
126*8a334094SJoseph Chen
127*8a334094SJoseph Chenv=$(($os_version_patch_level >> 11))
128*8a334094SJoseph Chena=$(($v >> 14))
129*8a334094SJoseph Chenb=$((($v >> 7) & 0x7f))
130*8a334094SJoseph Chenc=$(($v & 0x7f))
131*8a334094SJoseph Chenos_version=$(printf '%d.%d.%d' $a $b $c)
132*8a334094SJoseph Chen
133*8a334094SJoseph Chenv=$(($os_version_patch_level & 0x7ff))
134*8a334094SJoseph Cheny=$((($v >> 4) + 2000))
135*8a334094SJoseph Chenm=$((($v & 15)))
136*8a334094SJoseph Chenos_patch_level=$(printf '%d-%02d-01' $y $m)
137*8a334094SJoseph Chen
138*8a334094SJoseph Chendtb_size=$(grep -a "^dtb size: " $log | sed "s/^dtb size: //")
139*8a334094SJoseph Chendtb_size=${dtb_size:-0}
140*8a334094SJoseph Chenif [ $dtb_size -gt 0 -a -e "$dtb" ]; then
141*8a334094SJoseph Chen	DTB="--dtb $dtb"
142*8a334094SJoseph Chenfi
143*8a334094SJoseph Chen
144*8a334094SJoseph Chenrecovery_dtbo_size=$(grep -a "^recovery dtbo size: " $log | sed "s/^recovery dtbo size: //")
145*8a334094SJoseph Chenrecovery_dtbo_size=${recovery_dtbo_size:-0}
146*8a334094SJoseph Chenif [ $recovery_dtbo_size -gt 0 -a -e "$recovery_dtbo" ]; then
147*8a334094SJoseph Chen	RECOVERY_DTBO="--recovery_dtbo $recovery_dtbo"
148*8a334094SJoseph Chenfi
149*8a334094SJoseph Chen
150*8a334094SJoseph Chen$srctree/scripts/mkbootimg \
151*8a334094SJoseph Chen--kernel $kernel \
152*8a334094SJoseph Chen--second $second \
153*8a334094SJoseph Chen--ramdisk $ramdisk \
154*8a334094SJoseph Chen$DTB \
155*8a334094SJoseph Chen$RECOVERY_DTBO \
156*8a334094SJoseph Chen--cmdline "${cmdline}${extra_cmdline}" \
157*8a334094SJoseph Chen--header_version $version \
158*8a334094SJoseph Chen--os_version $os_version \
159*8a334094SJoseph Chen--os_patch_level $os_patch_level \
160*8a334094SJoseph Chen--output $output
161