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