xref: /OK3568_Linux_fs/device/rockchip/common/scripts/partition-helper (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun
3*4882a593Smuzhiyun# Make sure that we are sourced and called inside of RK build scripts.
4*4882a593Smuzhiyunif [ "$BASH_SOURCE" = "$0" -o -z "$RK_SESSION" ];then
5*4882a593Smuzhiyun	echo "$(realpath $0) is not supposed to be executed directly"
6*4882a593Smuzhiyun	exit 1
7*4882a593Smuzhiyunfi
8*4882a593Smuzhiyun
9*4882a593Smuzhiyun# Parsed partition table file
10*4882a593SmuzhiyunPART_TABLE="$RK_LOG_DIR/part-table"
11*4882a593Smuzhiyun
12*4882a593Smuzhiyun# Hidden header partition (part-table and idblock)
13*4882a593SmuzhiyunHDR_PART="<hidden>"
14*4882a593Smuzhiyun
15*4882a593Smuzhiyunrk_partition_size_sector_to_readable()
16*4882a593Smuzhiyun{
17*4882a593Smuzhiyun	# Consider 0 as unlimited
18*4882a593Smuzhiyun	case "${1:-grow}" in
19*4882a593Smuzhiyun		- | 0 | grow)
20*4882a593Smuzhiyun			echo grow
21*4882a593Smuzhiyun			return 0 ;;
22*4882a593Smuzhiyun	esac
23*4882a593Smuzhiyun
24*4882a593Smuzhiyun	SIZE=$(( $1 * 512 ))
25*4882a593Smuzhiyun	if [ "$SIZE" -lt 1024 ]; then
26*4882a593Smuzhiyun		echo $SIZE
27*4882a593Smuzhiyun	elif [ "$SIZE" -ge $(( 1024 * 1024 * 1024 )) ]; then
28*4882a593Smuzhiyun		echo "$(echo "scale=1; $SIZE / 1024 / 1024 / 1024" | bc | \
29*4882a593Smuzhiyun			sed 's/\.0$//')G"
30*4882a593Smuzhiyun	elif [ "$SIZE" -ge $(( 1024 * 1024 )) ]; then
31*4882a593Smuzhiyun		echo "$(echo "scale=1; $SIZE / 1024 / 1024" | bc | \
32*4882a593Smuzhiyun			sed 's/\.0$//')M"
33*4882a593Smuzhiyun	else
34*4882a593Smuzhiyun		echo "$(echo "scale=1; $SIZE / 1024" | bc | \
35*4882a593Smuzhiyun			sed 's/\.0$//')K"
36*4882a593Smuzhiyun	fi
37*4882a593Smuzhiyun}
38*4882a593Smuzhiyun
39*4882a593Smuzhiyunrk_partition_size_readable_to_sector()
40*4882a593Smuzhiyun{
41*4882a593Smuzhiyun	SIZE=${1%B}
42*4882a593Smuzhiyun
43*4882a593Smuzhiyun	case "${SIZE:-grow}" in
44*4882a593Smuzhiyun		# Consider 0 as unlimited
45*4882a593Smuzhiyun		- | 0 | grow)
46*4882a593Smuzhiyun			echo '-'
47*4882a593Smuzhiyun			return 0
48*4882a593Smuzhiyun			;;
49*4882a593Smuzhiyun		0x*)
50*4882a593Smuzhiyun			echo $SIZE
51*4882a593Smuzhiyun			return 0
52*4882a593Smuzhiyun			;;
53*4882a593Smuzhiyun	esac
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun	{
56*4882a593Smuzhiyun		case "$SIZE" in
57*4882a593Smuzhiyun			*K) echo "${SIZE%K} * 2" | bc ;;
58*4882a593Smuzhiyun			*M) echo "${SIZE%M} * 2 * 1024" | bc ;;
59*4882a593Smuzhiyun			*G) echo "${SIZE%G} * 2 * 1024 * 1024" | bc ;;
60*4882a593Smuzhiyun			*) echo "$SIZE / 512" | bc ;;
61*4882a593Smuzhiyun		esac
62*4882a593Smuzhiyun	} | cut -d'.' -f1 | awk '{printf "0x%08x",$1}'
63*4882a593Smuzhiyun}
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun# Parse parameter to "<name> <size>" pairs
66*4882a593Smuzhiyunrk_partition_parse()
67*4882a593Smuzhiyun{
68*4882a593Smuzhiyun	PARAMETER="${1:-$CHIP_DIR/$RK_PARAMETER}"
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun	if [ ! -r "$PARAMETER" ]; then
71*4882a593Smuzhiyun		echo -e "\e[36m$PARAMETER not exists!\e[0m" >&2
72*4882a593Smuzhiyun		exit 1
73*4882a593Smuzhiyun	fi
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun	PARTS="$(grep "^CMDLINE:" "$PARAMETER" | grep -o "0x.*")"
76*4882a593Smuzhiyun
77*4882a593Smuzhiyun	# NOTE: Assuming partitions are contiguous
78*4882a593Smuzhiyun	echo "$HDR_PART $(echo $PARTS | awk -F '[@():]' '{print $2}')"
79*4882a593Smuzhiyun	echo "${PARTS//,/ }" | xargs -n 1 | \
80*4882a593Smuzhiyun		awk -F '[@():]' '{print $3,$1}'
81*4882a593Smuzhiyun}
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun# Parse parameter to "<name>" arrays
84*4882a593Smuzhiyunrk_partition_parse_names()
85*4882a593Smuzhiyun{
86*4882a593Smuzhiyun	rk_partition_parse "$1" | grep -v "^$HDR_PART " | cut -d' ' -f1 | xargs
87*4882a593Smuzhiyun}
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun# Cache parsed partition table
90*4882a593Smuzhiyunrk_partition_init()
91*4882a593Smuzhiyun{
92*4882a593Smuzhiyun	rk_partition_parse > "$PART_TABLE"
93*4882a593Smuzhiyun}
94*4882a593Smuzhiyun
95*4882a593Smuzhiyunrk_partition_size()
96*4882a593Smuzhiyun{
97*4882a593Smuzhiyun	grep "^$1 " "$PART_TABLE" | cut -d' ' -f2 | tr -d '\-' || true
98*4882a593Smuzhiyun}
99*4882a593Smuzhiyun
100*4882a593Smuzhiyunrk_partition_num()
101*4882a593Smuzhiyun{
102*4882a593Smuzhiyun	echo $(( $(cat "$PART_TABLE" | wc -l) - 1 ))
103*4882a593Smuzhiyun}
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun# Print partition table info
106*4882a593Smuzhiyunrk_partition_print()
107*4882a593Smuzhiyun{
108*4882a593Smuzhiyun	echo
109*4882a593Smuzhiyun	echo "=========================================="
110*4882a593Smuzhiyun	echo "          Partition table"
111*4882a593Smuzhiyun	echo "=========================================="
112*4882a593Smuzhiyun	{
113*4882a593Smuzhiyun		OFFSET=0
114*4882a593Smuzhiyun		while read NAME SIZE; do
115*4882a593Smuzhiyun			OFFSET=$(echo $OFFSET | awk '{printf "0x%08x",$1}')
116*4882a593Smuzhiyun			SIZE_STR=$(rk_partition_size_sector_to_readable $SIZE)
117*4882a593Smuzhiyun
118*4882a593Smuzhiyun			if [ "$NAME" != "$HDR_PART" ]; then
119*4882a593Smuzhiyun				NAME=$(echo $NAME | awk '{printf "%12s",$1}')
120*4882a593Smuzhiyun				echo -e "$NAME at $OFFSET size=$SIZE($SIZE_STR)"
121*4882a593Smuzhiyun			fi
122*4882a593Smuzhiyun
123*4882a593Smuzhiyun			# NOTE: Assuming partitions are contiguous
124*4882a593Smuzhiyun			OFFSET=$(( $OFFSET + ${SIZE/-/0} ))
125*4882a593Smuzhiyun		done < "$PART_TABLE"
126*4882a593Smuzhiyun	} | sed "=" | sed "N;s/\n/: /"
127*4882a593Smuzhiyun
128*4882a593Smuzhiyun	echo
129*4882a593Smuzhiyun	echo "Legacy cmdline:"
130*4882a593Smuzhiyun	rk_partition_to_cmdline
131*4882a593Smuzhiyun	echo
132*4882a593Smuzhiyun}
133*4882a593Smuzhiyun
134*4882a593Smuzhiyun# Convert partition table to Rockchip legacy cmdline format
135*4882a593Smuzhiyunrk_partition_to_cmdline()
136*4882a593Smuzhiyun{
137*4882a593Smuzhiyun	OFFSET=0
138*4882a593Smuzhiyun	while read NAME SIZE; do
139*4882a593Smuzhiyun		case "$SIZE" in
140*4882a593Smuzhiyun			-)
141*4882a593Smuzhiyun				# Latest grow part
142*4882a593Smuzhiyun				echo "$NAME $OFFSET" | \
143*4882a593Smuzhiyun					awk '{printf "-@0x%08x(%s:grow)",$2,$1}'
144*4882a593Smuzhiyun				break ;;
145*4882a593Smuzhiyun			*) SIZE=$(rk_partition_size_readable_to_sector $SIZE) ;;
146*4882a593Smuzhiyun		esac
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun		# Visible parts
149*4882a593Smuzhiyun		if [ "$NAME" != "$HDR_PART" ]; then
150*4882a593Smuzhiyun			echo "$NAME $OFFSET $(( $SIZE ))" | \
151*4882a593Smuzhiyun				awk '{printf "0x%08x@0x%08x(%s)",$3,$2,$1}'
152*4882a593Smuzhiyun		fi
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun		# NOTE: Assuming partitions are contiguous
155*4882a593Smuzhiyun		OFFSET=$(( $OFFSET + $SIZE ))
156*4882a593Smuzhiyun	done < "$PART_TABLE" | sed 's/)\([^$]\)/),\1/g'
157*4882a593Smuzhiyun}
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun# Save partition table to parameter
160*4882a593Smuzhiyunrk_partition_save()
161*4882a593Smuzhiyun{
162*4882a593Smuzhiyun	PARAMETER="${1:-$CHIP_DIR/$RK_PARAMETER}"
163*4882a593Smuzhiyun	[ -r "$PARAMETER" ] || return 1
164*4882a593Smuzhiyun
165*4882a593Smuzhiyun	PARTS=$(rk_partition_to_cmdline)
166*4882a593Smuzhiyun	[ "$PARTS" ] || return 1
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun	sed -i "/^CMDLINE:/s/0x.*/$PARTS/" "$PARAMETER"
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun	# Reflush
171*4882a593Smuzhiyun	rk_partition_init
172*4882a593Smuzhiyun}
173*4882a593Smuzhiyun
174*4882a593Smuzhiyun# Edit raw partition table
175*4882a593Smuzhiyunrk_partition_edit()
176*4882a593Smuzhiyun{
177*4882a593Smuzhiyun	sed -i '1i # name size' "$PART_TABLE"
178*4882a593Smuzhiyun	eval ${EDITOR:-vi} "$PART_TABLE"
179*4882a593Smuzhiyun	sed -i '/#/d' "$PART_TABLE"
180*4882a593Smuzhiyun	rk_partition_save
181*4882a593Smuzhiyun}
182*4882a593Smuzhiyun
183*4882a593Smuzhiyunrk_partition_parse_name()
184*4882a593Smuzhiyun{
185*4882a593Smuzhiyun	unset PART_NAME
186*4882a593Smuzhiyun
187*4882a593Smuzhiyun	[ "$#" -eq 1 ] || return 1
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun	# Part name
190*4882a593Smuzhiyun	if ! echo $1 | grep -qE "^[0-9]*$"; then
191*4882a593Smuzhiyun		if ! grep -q "^$1 " "$PART_TABLE"; then
192*4882a593Smuzhiyun			echo -e "\e[35mNo such part ($1)!\e[0m"
193*4882a593Smuzhiyun			return 1
194*4882a593Smuzhiyun		fi
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun		PART_NAME=$1
197*4882a593Smuzhiyun		return 0
198*4882a593Smuzhiyun	fi
199*4882a593Smuzhiyun
200*4882a593Smuzhiyun	# Part idx
201*4882a593Smuzhiyun	IDX=$1
202*4882a593Smuzhiyun	if [ "$IDX" -lt 1 ]; then
203*4882a593Smuzhiyun		echo -e "\e[35mIndex should not be less than 1!\e[0m"
204*4882a593Smuzhiyun		return 1
205*4882a593Smuzhiyun	fi
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun	NUM=$(rk_partition_num)
208*4882a593Smuzhiyun	if [ "$IDX" -gt "$NUM" ]; then
209*4882a593Smuzhiyun		echo -e "\e[35mIndex should not be greater than $NUM!\e[0m"
210*4882a593Smuzhiyun		return 1
211*4882a593Smuzhiyun	fi
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun	PART_NAME=$(sed -n "$(($IDX + 1))s/\(^[^ ]*\) .*/\1/p" "$PART_TABLE")
214*4882a593Smuzhiyun}
215*4882a593Smuzhiyun
216*4882a593Smuzhiyunrk_partition_del()
217*4882a593Smuzhiyun{
218*4882a593Smuzhiyun	[ "$#" -gt 0 ] || return 1
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun	rk_partition_parse_name $1 || return 1
221*4882a593Smuzhiyun	sed -i "/^$PART_NAME /d" "$PART_TABLE"
222*4882a593Smuzhiyun
223*4882a593Smuzhiyun	rk_partition_save
224*4882a593Smuzhiyun}
225*4882a593Smuzhiyun
226*4882a593Smuzhiyunrk_partition_rename()
227*4882a593Smuzhiyun{
228*4882a593Smuzhiyun	[ "$#" -gt 1 ] || return 1
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun	echo $2 | grep -qE "^[a-zA-Z]" || return 1
231*4882a593Smuzhiyun	if rk_partition_parse_name $2 >/dev/null; then
232*4882a593Smuzhiyun		echo -e "\e[35mPart already exists ($2)!\e[0m"
233*4882a593Smuzhiyun		return 1
234*4882a593Smuzhiyun	fi
235*4882a593Smuzhiyun
236*4882a593Smuzhiyun	rk_partition_parse_name $1 || return 1
237*4882a593Smuzhiyun	sed -i "s/^$PART_NAME /$2 /" "$PART_TABLE"
238*4882a593Smuzhiyun
239*4882a593Smuzhiyun	rk_partition_save
240*4882a593Smuzhiyun}
241*4882a593Smuzhiyun
242*4882a593Smuzhiyunrk_partition_move()
243*4882a593Smuzhiyun{
244*4882a593Smuzhiyun	[ "$#" -gt 1 ] || return 1
245*4882a593Smuzhiyun
246*4882a593Smuzhiyun	echo $2 | grep -qE "^[0-9]*$" || return 1
247*4882a593Smuzhiyun	rk_partition_parse_name $2 || return 1
248*4882a593Smuzhiyun
249*4882a593Smuzhiyun	rk_partition_parse_name $1 || return 1
250*4882a593Smuzhiyun	PART=$(sed -n "/^$PART_NAME /p" "$PART_TABLE")
251*4882a593Smuzhiyun
252*4882a593Smuzhiyun	NUM=$(rk_partition_num)
253*4882a593Smuzhiyun	if [ "$2" -eq "$NUM" ] && grep -q "\-$" "$PART_TABLE"; then
254*4882a593Smuzhiyun		echo -e "\e[35mCannot move after unlimited part!\e[0m"
255*4882a593Smuzhiyun		return 1
256*4882a593Smuzhiyun	fi
257*4882a593Smuzhiyun
258*4882a593Smuzhiyun	if echo "$PART" | grep -q "\-$"; then
259*4882a593Smuzhiyun		echo -e "\e[35mCannot move unlimited part ($1)!\e[0m"
260*4882a593Smuzhiyun		return 1
261*4882a593Smuzhiyun	fi
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun	sed -i "/^$PART$/d" "$PART_TABLE"
264*4882a593Smuzhiyun	sed -i "$2 a$PART" "$PART_TABLE"
265*4882a593Smuzhiyun
266*4882a593Smuzhiyun	rk_partition_save
267*4882a593Smuzhiyun}
268*4882a593Smuzhiyun
269*4882a593Smuzhiyunrk_partition_resize()
270*4882a593Smuzhiyun{
271*4882a593Smuzhiyun	[ "$#" -gt 1 ] || return 1
272*4882a593Smuzhiyun
273*4882a593Smuzhiyun	case "$2" in
274*4882a593Smuzhiyun		0x*) SIZE=$2 ;;
275*4882a593Smuzhiyun		*) SIZE="$(rk_partition_size_readable_to_sector $2)" ;;
276*4882a593Smuzhiyun	esac
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun	rk_partition_parse_name $1 || return 1
279*4882a593Smuzhiyun	sed -i "s/^$PART_NAME .*/$PART_NAME $SIZE/" "$PART_TABLE"
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun	rk_partition_save
282*4882a593Smuzhiyun}
283*4882a593Smuzhiyun
284*4882a593Smuzhiyunrk_partition_insert()
285*4882a593Smuzhiyun{
286*4882a593Smuzhiyun	[ "$#" -gt 1 ] || return 1
287*4882a593Smuzhiyun
288*4882a593Smuzhiyun	echo $1 | grep -qE "^[0-9]*$" || return 1
289*4882a593Smuzhiyun
290*4882a593Smuzhiyun	IDX=$1
291*4882a593Smuzhiyun	if [ "$IDX" -lt 1 ]; then
292*4882a593Smuzhiyun		echo -e "\e[35mIndex should not be less than 1!\e[0m"
293*4882a593Smuzhiyun		return 1
294*4882a593Smuzhiyun	fi
295*4882a593Smuzhiyun
296*4882a593Smuzhiyun	NUM=$(rk_partition_num)
297*4882a593Smuzhiyun	if [ "$IDX" -gt "$(($NUM + 1))" ]; then
298*4882a593Smuzhiyun		echo -e "\e[35mIndex should not be greater than $(($NUM + 1))!\e[0m"
299*4882a593Smuzhiyun		return 1
300*4882a593Smuzhiyun	fi
301*4882a593Smuzhiyun
302*4882a593Smuzhiyun	echo $2 | grep -qE "^[a-zA-Z]" || return 1
303*4882a593Smuzhiyun	if rk_partition_parse_name $2 >/dev/null; then
304*4882a593Smuzhiyun		echo -e "\e[35mPart already exists ($2)!\e[0m"
305*4882a593Smuzhiyun		return 1
306*4882a593Smuzhiyun	fi
307*4882a593Smuzhiyun
308*4882a593Smuzhiyun	case "${3:-grow}" in
309*4882a593Smuzhiyun		0x*) SIZE=$3 ;;
310*4882a593Smuzhiyun		*) SIZE="$(rk_partition_size_readable_to_sector $3)" ;;
311*4882a593Smuzhiyun	esac
312*4882a593Smuzhiyun
313*4882a593Smuzhiyun	if [ "$SIZE" = "-" ] && [ "$IDX" -lt "$(( $NUM + 1 ))" ]; then
314*4882a593Smuzhiyun		echo -e "\e[35mOnly latest part can be unlimited!\e[0m"
315*4882a593Smuzhiyun		return 1
316*4882a593Smuzhiyun	fi
317*4882a593Smuzhiyun
318*4882a593Smuzhiyun	if [ "$IDX" -eq "$(( $NUM + 1 ))" ] && grep -q "\-$" "$PART_TABLE"; then
319*4882a593Smuzhiyun		echo -e "\e[35mCannot insert after unlimited part!\e[0m"
320*4882a593Smuzhiyun		return 1
321*4882a593Smuzhiyun	fi
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun	sed -i "$IDX a$2 $SIZE" "$PART_TABLE"
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun	rk_partition_save
326*4882a593Smuzhiyun}
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun# Usage: <offset> <name> <size> <name> <size>...
329*4882a593Smuzhiyunrk_partition_create()
330*4882a593Smuzhiyun{
331*4882a593Smuzhiyun	[ "$#" -gt 1 ] || return 1
332*4882a593Smuzhiyun
333*4882a593Smuzhiyun	{
334*4882a593Smuzhiyun		echo "$HDR_PART $(echo $(( $1 )) | awk '{printf "0x%08x",$1}')"
335*4882a593Smuzhiyun		shift
336*4882a593Smuzhiyun
337*4882a593Smuzhiyun		while [ "$1" ]; do
338*4882a593Smuzhiyun			NAME=$1
339*4882a593Smuzhiyun			shift
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun			SIZE="$(rk_partition_size_readable_to_sector $1)"
342*4882a593Smuzhiyun			[ -z "$1" ] || shift
343*4882a593Smuzhiyun
344*4882a593Smuzhiyun			if [ "$1" -a "$SIZE" = "-" ]; then
345*4882a593Smuzhiyun				echo -e "\e[35mOnly latest part can be unlimited!\e[0m"
346*4882a593Smuzhiyun				break
347*4882a593Smuzhiyun			fi
348*4882a593Smuzhiyun
349*4882a593Smuzhiyun			echo "$NAME $SIZE"
350*4882a593Smuzhiyun		done
351*4882a593Smuzhiyun	} > "$PART_TABLE"
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun	rk_partition_save
354*4882a593Smuzhiyun}
355*4882a593Smuzhiyun
356*4882a593Smuzhiyun# -------- extra partition helpers -------- #
357*4882a593Smuzhiyun
358*4882a593Smuzhiyunrk_extra_part_num()
359*4882a593Smuzhiyun{
360*4882a593Smuzhiyun	echo ${RK_EXTRA_PARTITION_NUM:-0}
361*4882a593Smuzhiyun}
362*4882a593Smuzhiyun
363*4882a593Smuzhiyunrk_extra_part_cfg()
364*4882a593Smuzhiyun{
365*4882a593Smuzhiyun	[ "$RK_EXTRA_PARTITION_STR" ] || return 0
366*4882a593Smuzhiyun
367*4882a593Smuzhiyun	RK_EXTRA_PARTITION_ARRAY=( $(echo ${RK_EXTRA_PARTITION_STR//@/ } | \
368*4882a593Smuzhiyun		xargs -n 1 | sort) )
369*4882a593Smuzhiyun	PART_IDX=$(( ${1:-1} - 1 ))
370*4882a593Smuzhiyun	echo "${RK_EXTRA_PARTITION_ARRAY[$PART_IDX]}"
371*4882a593Smuzhiyun}
372*4882a593Smuzhiyun
373*4882a593Smuzhiyunrk_extra_part_arg()
374*4882a593Smuzhiyun{
375*4882a593Smuzhiyun	PART="$(rk_extra_part_cfg ${1:-1})"
376*4882a593Smuzhiyun	ARG="$(echo "$PART" | cut -d':' -f${2:-1})"
377*4882a593Smuzhiyun	echo "${ARG:-$3}"
378*4882a593Smuzhiyun}
379*4882a593Smuzhiyun
380*4882a593Smuzhiyunrk_extra_part_dev()
381*4882a593Smuzhiyun{
382*4882a593Smuzhiyun	rk_extra_part_arg ${1:-1} 1
383*4882a593Smuzhiyun}
384*4882a593Smuzhiyun
385*4882a593Smuzhiyunrk_extra_part_name()
386*4882a593Smuzhiyun{
387*4882a593Smuzhiyun	rk_extra_part_arg ${1:-1} 2
388*4882a593Smuzhiyun}
389*4882a593Smuzhiyun
390*4882a593Smuzhiyunrk_extra_part_mountpoint()
391*4882a593Smuzhiyun{
392*4882a593Smuzhiyun	rk_extra_part_arg ${1:-1} 3 "/$(rk_extra_part_name $1)"
393*4882a593Smuzhiyun}
394*4882a593Smuzhiyun
395*4882a593Smuzhiyunrk_extra_part_fstype()
396*4882a593Smuzhiyun{
397*4882a593Smuzhiyun	rk_extra_part_arg ${1:-1} 4 ext4
398*4882a593Smuzhiyun}
399*4882a593Smuzhiyun
400*4882a593Smuzhiyunrk_extra_part_options()
401*4882a593Smuzhiyun{
402*4882a593Smuzhiyun	rk_extra_part_arg ${1:-1} 5 defaults
403*4882a593Smuzhiyun}
404*4882a593Smuzhiyun
405*4882a593Smuzhiyunrk_extra_part_src()
406*4882a593Smuzhiyun{
407*4882a593Smuzhiyun	PART_NAME="$(rk_extra_part_name $1)"
408*4882a593Smuzhiyun	for src in $(rk_extra_part_arg ${1:-1} 6 | tr ',' ' '); do
409*4882a593Smuzhiyun		# Src is either relative path to $RK_IMAGE_DIR/<name>/, or \
410*4882a593Smuzhiyun		# absolute path.
411*4882a593Smuzhiyun		if echo "$src" | grep -vq "^/"; then
412*4882a593Smuzhiyun			echo "$RK_IMAGE_DIR/$PART_NAME/${PART_NAME}_${src}"
413*4882a593Smuzhiyun		else
414*4882a593Smuzhiyun			echo "$src"
415*4882a593Smuzhiyun		fi
416*4882a593Smuzhiyun	done
417*4882a593Smuzhiyun}
418*4882a593Smuzhiyun
419*4882a593Smuzhiyunrk_extra_part_size()
420*4882a593Smuzhiyun{
421*4882a593Smuzhiyun	rk_extra_part_arg ${1:-1} 7 auto
422*4882a593Smuzhiyun}
423*4882a593Smuzhiyun
424*4882a593Smuzhiyunrk_extra_part_fixed()
425*4882a593Smuzhiyun{
426*4882a593Smuzhiyun	rk_extra_part_arg ${1:-1} 8 | grep -wq fixed
427*4882a593Smuzhiyun}
428*4882a593Smuzhiyun
429*4882a593Smuzhiyunrk_extra_part_builtin()
430*4882a593Smuzhiyun{
431*4882a593Smuzhiyun	rk_extra_part_arg ${1:-1} 8 | grep -wq builtin
432*4882a593Smuzhiyun}
433*4882a593Smuzhiyun
434*4882a593Smuzhiyun# Symlink to the mountpoint in rootfs dir
435*4882a593Smuzhiyunrk_extra_part_mount_dir()
436*4882a593Smuzhiyun{
437*4882a593Smuzhiyun	echo "$RK_OUTDIR/$(rk_extra_part_name $1)-mount"
438*4882a593Smuzhiyun}
439*4882a593Smuzhiyun
440*4882a593Smuzhiyunrk_extra_part_outdir()
441*4882a593Smuzhiyun{
442*4882a593Smuzhiyun	echo "$RK_OUTDIR/$(rk_extra_part_name $1)"
443*4882a593Smuzhiyun}
444*4882a593Smuzhiyun
445*4882a593Smuzhiyunrk_extra_part_fakeroot_script()
446*4882a593Smuzhiyun{
447*4882a593Smuzhiyun	echo "$(rk_extra_part_outdir $1).fs"
448*4882a593Smuzhiyun}
449*4882a593Smuzhiyun
450*4882a593Smuzhiyunrk_extra_part_img()
451*4882a593Smuzhiyun{
452*4882a593Smuzhiyun	echo "$RK_FIRMWARE_DIR/$(rk_extra_part_name $1).img"
453*4882a593Smuzhiyun}
454*4882a593Smuzhiyun
455*4882a593Smuzhiyun# Prepare extra part's files and fakeroot script
456*4882a593Smuzhiyunrk_extra_part_prepare()
457*4882a593Smuzhiyun{
458*4882a593Smuzhiyun	PART_NAME="$(rk_extra_part_name $1)"
459*4882a593Smuzhiyun	OUTDIR="$(rk_extra_part_outdir $1)"
460*4882a593Smuzhiyun	MOUNT_DIR="$(rk_extra_part_mount_dir $1)"
461*4882a593Smuzhiyun	FAKEROOT_SCRIPT="$(rk_extra_part_fakeroot_script $1)"
462*4882a593Smuzhiyun	SRCS="$(rk_extra_part_src $1)"
463*4882a593Smuzhiyun
464*4882a593Smuzhiyun	echo "Preparing partiton $PART_NAME"
465*4882a593Smuzhiyun
466*4882a593Smuzhiyun	rm -rf "$OUTDIR" "$FAKEROOT_SCRIPT"
467*4882a593Smuzhiyun
468*4882a593Smuzhiyun	if [ ! "$SRCS" ]; then
469*4882a593Smuzhiyun		echo "Ignoring $PART_NAME for no sources"
470*4882a593Smuzhiyun		return 0
471*4882a593Smuzhiyun	fi
472*4882a593Smuzhiyun
473*4882a593Smuzhiyun	mkdir -p "$OUTDIR"
474*4882a593Smuzhiyun
475*4882a593Smuzhiyun	if rk_extra_part_fixed $idx; then
476*4882a593Smuzhiyun		if ! rk_extra_part_builtin $idx; then
477*4882a593Smuzhiyun			# Skip boot-time resizing by adding a tag file
478*4882a593Smuzhiyun			touch "$OUTDIR/.fixed"
479*4882a593Smuzhiyun		fi
480*4882a593Smuzhiyun	fi
481*4882a593Smuzhiyun
482*4882a593Smuzhiyun	echo "#!/bin/sh -e" > "$FAKEROOT_SCRIPT"
483*4882a593Smuzhiyun	chmod a+x "$FAKEROOT_SCRIPT"
484*4882a593Smuzhiyun
485*4882a593Smuzhiyun	for src in $MOUNT_DIR $SRCS; do
486*4882a593Smuzhiyun		[ -d "$src" ] || continue
487*4882a593Smuzhiyun		[ "$(ls "$src/")" ] || continue
488*4882a593Smuzhiyun
489*4882a593Smuzhiyun		echo "Merging $src into $OUTDIR"
490*4882a593Smuzhiyun		rsync -a "$src/" "$OUTDIR"
491*4882a593Smuzhiyun		for f in $(ls "$OUTDIR" | grep "\.fs$" || true); do
492*4882a593Smuzhiyun			echo "Merging $src/$f into $FAKEROOT_SCRIPT"
493*4882a593Smuzhiyun			cat "$OUTDIR/$f" >> "$FAKEROOT_SCRIPT"
494*4882a593Smuzhiyun			rm -f "$OUTDIR/$f"
495*4882a593Smuzhiyun		done
496*4882a593Smuzhiyun	done
497*4882a593Smuzhiyun}
498