1#!/bin/bash -e
2
3message() {
4	echo -e "\e[36m$@\e[0m"
5}
6
7fatal() {
8	echo -e "\e[31m$@\e[0m"
9	exit 1
10}
11
12# Get partition size limit, 0 means unlimited or not exists.
13partition_size_kb() {
14	PART_SIZE="$(rk_partition_size "$1")"
15	echo $(( ${PART_SIZE:-0} / 2))
16}
17
18link_image() {
19	SRC="$1"
20	DST="$2"
21	message "Linking $DST from $SRC..."
22	ln -rsf "$SRC" "$DST"
23}
24
25pack_extra_partitions() {
26	for idx in $(seq 1 "$(rk_extra_part_num)"); do
27		# Skip built-in partitions
28		if rk_extra_part_builtin $idx; then
29			continue
30		fi
31
32		PART_NAME="$(rk_extra_part_name $idx)"
33		FS_TYPE="$(rk_extra_part_fstype $idx)"
34		SIZE="$(rk_extra_part_size $idx)"
35		FAKEROOT_SCRIPT="$(rk_extra_part_fakeroot_script $idx)"
36		OUTDIR="$(rk_extra_part_outdir $idx)"
37		DST="$(rk_extra_part_img $idx)"
38
39		if [ -z "$(rk_extra_part_src $idx)" ]; then
40			echo "Ignoring $PART_NAME for no sources"
41			continue
42		fi
43
44		rk_extra_part_prepare $idx
45
46		if [ "$SIZE" = max ]; then
47			SIZE="$(partition_size_kb "$PART_NAME")K"
48			if [ "$SIZE" = 0K ]; then
49				fatal "Unable to detect max size of $PART_NAME"
50			fi
51
52			echo "Using maxium size: $SIZE"
53		fi
54
55		sed -i '/mk-image.sh/d' "$FAKEROOT_SCRIPT"
56		echo "\"$SCRIPTS_DIR/mk-image.sh\" \
57			\"$OUTDIR\" \"$DST\" \"$FS_TYPE\" \
58			\"$SIZE\" \"$PART_NAME\"" >> "$FAKEROOT_SCRIPT"
59
60		message "Packing $DST from $FAKEROOT_SCRIPT"
61		cd "$OUTDIR"
62		fakeroot -- "$FAKEROOT_SCRIPT"
63		message "Done packing $DST"
64	done
65}
66
67build_firmware()
68{
69	if ! which fakeroot &>/dev/null; then
70		echo "fakeroot not found! (sudo apt-get install fakeroot)"
71		exit 1
72	fi
73
74	mkdir -p "$RK_FIRMWARE_DIR" "$RK_SECURITY_FIRMWARE_DIR"
75	if [ "$RK_SECURITY" ]; then
76		FIRMWARE_DIR="$RK_SECURITY_FIRMWARE_DIR"
77	else
78		FIRMWARE_DIR="$RK_FIRMWARE_DIR"
79	fi
80
81	rm -rf "$RK_ROCKDEV_DIR"
82	ln -rsf "$FIRMWARE_DIR" "$RK_ROCKDEV_DIR"
83
84	"$SCRIPTS_DIR/check-grow-align.sh"
85	link_image "$CHIP_DIR/$RK_PARAMETER" "$RK_FIRMWARE_DIR/parameter.txt"
86
87	if [ "$RK_MISC_IMG" ]; then
88		link_image "$RK_IMAGE_DIR/$RK_MISC_IMG" \
89			"$RK_FIRMWARE_DIR/misc.img"
90	fi
91
92	pack_extra_partitions
93
94	if [ "$RK_SECURITY" ]; then
95		# Link non-security images
96		for f in $(ls "$RK_FIRMWARE_DIR/"); do
97			if [ -r "$FIRMWARE_DIR/$f" ]; then
98				continue
99			fi
100
101			link_image "$RK_FIRMWARE_DIR/$f" "$FIRMWARE_DIR/$f"
102		done
103	fi
104
105	echo "Packed files:"
106	for f in "$FIRMWARE_DIR"/*; do
107		NAME=$(basename "$f")
108
109		echo -n "$NAME"
110		if [ -L "$f" ]; then
111			echo -n "($(readlink -f "$f"))"
112		fi
113
114		FILE_SIZE=$(ls -lLh $f | xargs | cut -d' ' -f 5)
115		echo ": $FILE_SIZE"
116
117		echo "$NAME" | grep -q ".img$" || continue
118
119		# Assert the image's size smaller then the limit
120		PART_SIZE_KB="$(partition_size_kb "${NAME%.img}")"
121		[ ! "$PART_SIZE_KB" -eq 0 ] || continue
122
123		FILE_SIZE_KB="$(( $(stat -Lc "%s" "$f") / 1024 ))"
124		if [ "$PART_SIZE_KB" -lt "$FILE_SIZE_KB" ]; then
125			fatal "error: $NAME's size exceed parameter's limit!"
126		fi
127	done
128
129	message "Images in $FIRMWARE_DIR are ready!"
130
131	finish_build
132}
133
134# Hooks
135
136usage_hook()
137{
138	echo -e "firmware                          \tpack and check firmwares"
139}
140
141clean_hook()
142{
143	rm -rf "$RK_FIRMWARE_DIR" "$RK_SECURITY_FIRMWARE_DIR" "$RK_ROCKDEV_DIR"
144}
145
146POST_BUILD_CMDS="firmware"
147post_build_hook()
148{
149	echo "=========================================="
150	echo "          Start packing firmwares"
151	echo "=========================================="
152
153	build_firmware
154}
155
156source "${BUILD_HELPER:-$(dirname "$(realpath "$0")")/../build-hooks/build-helper}"
157
158post_build_hook $@
159