scripts: tizen: sd_fusing_rpi4: support A/B partition 41/276241/1
authorJaehoon Chung <jh80.chung@samsung.com>
Thu, 9 Jun 2022 04:28:36 +0000 (13:28 +0900)
committerJaehoon Chung <jh80.chung@samsung.com>
Mon, 13 Jun 2022 09:32:48 +0000 (18:32 +0900)
Support A/B partition layout.

Change-Id: I06e5999be208b75d049e93c6544e8769a6fc3265
Signed-off-by: Jaehoon Chung <jh80.chung@samsung.com>
scripts/tizen/sd_fusing_rpi4.sh

index d5f1b42..5bfb31e 100755 (executable)
@@ -14,17 +14,28 @@ declare -i FUS_ENTRY_NUM=0
 # binary name | part number | bs | label | fs type
 declare -a PART_TABLE=(
        "boot.img"                      1       4M      boot                    vfat
-       "rootfs.img"                    2       4M      rootfs                  ext4
+       "rootfs.img"                    2       4M      rootfs_a                ext4
        "system-data.img"               3       4M      system-data             ext4
        "user.img"                      5       4M      user                    ext4
-       "modules.img"                   6       4M      modules                 ext4
-       "ramdisk.img"                   7       4M      ramdisk                 ext4
-       "ramdisk-recovery.img"          8       4M      ramdisk-recovery        ext4
+       "modules.img"                   6       4M      modules_a               ext4
+       "ramdisk.img"                   7       4M      ramdisk_a               ext4
+       "ramdisk-recovery.img"          8       4M      recovery_a              ext4
        "hal.img"                       10      4M      hal                     ext4
+       "rootfs.img"                    11      4M      rootfs_b                ext4
+       "modules.img"                   12      4M      modules_b               ext4
+       "ramdisk.img"                   13      4M      ramdisk_b               ext4
+       "ramdisk-recovery.img"          14      4M      recovery_b              ext4
+       )
+declare -a PART_TABLE_B=(
+       "rootfs.img"                    11      4M      rootfs_b                ext4
+       "modules.img"                   12      4M      modules_b               ext4
+       "ramdisk.img"                   13      4M      ramdisk_b               ext4
+       "ramdisk-recovery.img"          14      4M      recovery_b              ext4
        )
 
 declare -r -i PART_TABLE_COL=5
 declare -r -i PART_TABLE_ROW=${#PART_TABLE[*]}/${PART_TABLE_COL}
+declare -r -i PART_TABLE_ROW_B=${#PART_TABLE_B[*]}/${PART_TABLE_COL}
 
 # partition table support
 function get_index_use_name () {
@@ -40,6 +51,20 @@ function get_index_use_name () {
        return $idx
 }
 
+# partition table support
+function get_index_use_name_to_b () {
+       local -r binary_name=$1
+
+       for ((idx=0;idx<$PART_TABLE_ROW_B;idx++)); do
+               if [ ${PART_TABLE_B[idx * ${PART_TABLE_COL} + 0]} == "$binary_name" ]; then
+                       return $idx
+               fi
+       done
+
+       # return out of bound index
+       return $idx
+}
+
 function print_message () {
        local color=$1
        local message=$2
@@ -88,9 +113,48 @@ function fusing_image () {
                return
        fi
 
-       if ! [ -b "$device" ]; then
-               print_message 1 "$device is not a block device."
-               exit 1
+       local -r input_size=`du -b $fusing_img | awk '{print $1}'`
+       local -r input_size_mb=`expr $input_size / 1024 / 1024`
+
+       print_message 2 "[Fusing $1 ($input_size_mb MiB)]"
+       if [ "$blktype" == "part" ]; then
+               local MOUNT_PART=`mount | grep $device`
+               if [ "$MOUNT_PART" != "" ]; then
+                       umount $device
+               fi
+       fi
+       if [ $OLD_DD == 1 ]; then
+               dd if=$fusing_img | pv -s $input_size | dd of=$device bs=$bs
+       else
+               dd if=$fusing_img of=$device bs=$bs status=progress oflag=direct
+       fi
+
+       local -r fstype=`blkid -o value -s TYPE $device`
+       if [[ "$fstype" =~ "ext" ]]; then
+               resize2fs -f $device
+       fi
+}
+
+function fusing_image_to_b () {
+       local -r fusing_img=$1
+
+       # get binary info using basename
+       get_index_use_name_to_b $(basename "$fusing_img")
+
+       local -r -i part_idx=$?
+
+       if [ $part_idx -ne $PART_TABLE_ROW_B ];then
+               local -r num=${PART_TABLE_B[${part_idx} * ${PART_TABLE_COL} + 1]}
+               if [ "${num}" == "" ]; then
+                       local -r blktype=disk
+               else
+                       local -r blktype=part
+               fi
+               local -r device=/dev/`lsblk ${DEVICE} -o TYPE,KNAME | awk "/^${blktype}.*[a-z]${num}\$/ { print \\\$2 }"`
+               local -r bs=${PART_TABLE_B[${part_idx} * ${PART_TABLE_COL} + 2]}
+       else
+               echo "Not supported binary: $fusing_img"
+               return
        fi
 
        local -r input_size=`du -b $fusing_img | awk '{print $1}'`
@@ -126,6 +190,7 @@ function fuse_image_tarball () {
        for file in *
        do
                fusing_image $file
+               fusing_image_to_b $file
        done
 
        cd ..
@@ -149,6 +214,7 @@ function fuse_image () {
                        ;;
                    *)
                        fusing_image $filename
+                       fusing_image_to_b $filename
                        ;;
                esac
        done
@@ -170,12 +236,12 @@ function mkpart_3 () {
 
        if [ $major -gt 2 ];  then
                sfdisk_new=1
+               if [ $major -eq 2 -a $minor -ge 28 ]; then
+                       support_delete=1
+               fi
        else
                if [ $major -eq 2 -a $minor -ge 26 ];  then
                        sfdisk_new=1
-                       if [ $major -eq 2 -a $minor -ge 28 ]; then
-                               support_delete=1
-                       fi
                fi
        fi
 
@@ -199,19 +265,23 @@ function mkpart_3 () {
        local -r INFORM_SZ=8
        local -r HAL_SZ=256
        local -r RESERVED2_SZ=125
-       local -r EXTEND_SZ=12
+       local -r EXTEND_SZ=36
 
-       let "USER_SZ = $SIZE_MB - $BOOT_SZ - $ROOTFS_SZ - $DATA_SZ - $MODULE_SZ - $RAMDISK_SZ - $RAMDISK_RECOVERY_SZ - $INFORM_SZ - $EXTEND_SZ - $HAL_SZ - $RESERVED2_SZ"
+       let "USER_SZ = $SIZE_MB - $BOOT_SZ - $ROOTFS_SZ * 2 - $DATA_SZ - $MODULE_SZ * 2 - $RAMDISK_SZ * 2 - $RAMDISK_RECOVERY_SZ * 2 - $INFORM_SZ - $EXTEND_SZ - $HAL_SZ - $RESERVED2_SZ"
 
        local -r BOOT=${PART_TABLE[0 * ${PART_TABLE_COL} + 3]}
-       local -r ROOTFS=${PART_TABLE[1 * ${PART_TABLE_COL} + 3]}
+       local -r ROOTFS_A=${PART_TABLE[1 * ${PART_TABLE_COL} + 3]}
        local -r SYSTEMDATA=${PART_TABLE[2 * ${PART_TABLE_COL} + 3]}
        local -r USER=${PART_TABLE[3 * ${PART_TABLE_COL} + 3]}
-       local -r MODULE=${PART_TABLE[4 * ${PART_TABLE_COL} + 3]}
-       local -r RAMDISK=${PART_TABLE[5 * ${PART_TABLE_COL} + 3]}
-       local -r RAMDISK_RECOVERY=${PART_TABLE[6 * ${PART_TABLE_COL} + 3]}
+       local -r MODULE_A=${PART_TABLE[4 * ${PART_TABLE_COL} + 3]}
+       local -r RAMDISK_A=${PART_TABLE[5 * ${PART_TABLE_COL} + 3]}
+       local -r RAMDISK_RECOVERY_A=${PART_TABLE[6 * ${PART_TABLE_COL} + 3]}
        local -r INFORM=inform
        local -r HAL=${PART_TABLE[7 * ${PART_TABLE_COL} + 3]}
+       local -r ROOTFS_B=${PART_TABLE[8 * ${PART_TABLE_COL} + 3]}
+       local -r MODULE_B=${PART_TABLE[9 * ${PART_TABLE_COL} + 3]}
+       local -r RAMDISK_B=${PART_TABLE[10 * ${PART_TABLE_COL} + 3]}
+       local -r RAMDISK_RECOVERY_B=${PART_TABLE[10 * ${PART_TABLE_COL} + 3]}
        local -r RESERVED2=reserved2
 
        if [[ $USER_SZ -le 100 ]]
@@ -224,16 +294,20 @@ function mkpart_3 () {
        echo "Label                     dev             size"
        echo "================================================"
        echo $BOOT"                     " $DISK"1       " $BOOT_SZ "MB"
-       echo $ROOTFS"                   " $DISK"2       " $ROOTFS_SZ "MB"
+       echo $ROOTFS_A"                 " $DISK"2       " $ROOTFS_SZ "MB"
        echo $SYSTEMDATA"               " $DISK"3       " $DATA_SZ "MB"
        echo "[Extend]""                " $DISK"4"
        echo " "$USER"                  " $DISK"5       " $USER_SZ "MB"
-       echo " "$MODULE"                " $DISK"6       " $MODULE_SZ "MB"
-       echo " "$RAMDISK"               " $DISK"7       " $RAMDISK_SZ "MB"
-       echo " "$RAMDISK_RECOVERY"      " $DISK"8       " $RAMDISK_RECOVERY_SZ "MB"
-       echo " "$INFORM"                        " $DISK"9       " $INFORM_SZ "MB"
+       echo " "$MODULE_A"              " $DISK"6       " $MODULE_SZ "MB"
+       echo " "$RAMDISK_A"             " $DISK"7       " $RAMDISK_SZ "MB"
+       echo " "$RAMDISK_RECOVERY_A"    " $DISK"8       " $RAMDISK_RECOVERY_SZ "MB"
+       echo " "$INFORM"                " $DISK"9       " $INFORM_SZ "MB"
        echo " "$HAL"                   " $DISK"10      " $HAL_SZ "MB"
-       echo " "$RESERVED2"             " $DISK"11      " $RESERVED2_SZ "MB"
+       echo " "$ROOTFS_B"              " $DISK"11      " $ROOTFS_SZ "MB"
+       echo " "$MODULE_B"              " $DISK"12      " $MODULE_SZ "MB"
+       echo " "$RAMDISK_B"             " $DISK"13      " $RAMDISK_SZ "MB"
+       echo " "$RAMDISK_RECOVERY_B"    " $DISK"14      " $RAMDISK_RECOVERY_SZ "MB"
+       echo " "$RESERVED2"             " $DISK"15      " $RESERVED2_SZ "MB"
 
        local MOUNT_LIST=`mount | grep $DISK | awk '{print $1}'`
        for mnt in $MOUNT_LIST
@@ -260,17 +334,25 @@ function mkpart_3 () {
                ,${RAMDISK_RECOVERY_SZ}MiB,,-
                ,${INFORM_SZ}MiB,,-
                ,${HAL_SZ}MiB,,-
+               ,${ROOTFS_SZ}MiB,,-
+               ,${MODULE_SZ}MiB,,-
+               ,${RAMDISK_SZ}MiB,,-
+               ,${RAMDISK_RECOVERY_SZ}MiB,,-
                ,${RESERVED2_SZ}MiB,,-
                __EOF__
        else
                # calculate start positions for alignment for extended partitions
                let "USER_START = 4 + $BOOT_SZ + $ROOTFS_SZ + $DATA_SZ + 1"
-               let "MODULE_START = $USER_START + $USER_SZ + 1"
-               let "RAMDISK_START = $MODULE_START + $MODULE_SZ + 1"
-               let "RAMDISK_RECOVERY_START = $RAMDISK_START + $RAMDISK_SZ + 1"
-               let "INFORM_START = $RAMDISK_RECOVERY_START + $RAMDISK_RECOVERY_SZ + 1"
+               let "MODULE_A_START = $USER_START + $USER_SZ + 1"
+               let "RAMDISK_A_START = $MODULE_A_START + $MODULE_SZ + 1"
+               let "RAMDISK_RECOVERY_A_START = $RAMDISK_A_START + $RAMDISK_SZ + 1"
+               let "INFORM_START = $RAMDISK_RECOVERY_A_START + $RAMDISK_RECOVERY_SZ + 1"
                let "HAL_START = $INFORM_START + $INFORM_SZ + 1"
-               let "RESERVED2_START = $HAL_START + $HAL_SZ + 1"
+               let "ROOTFS_B_START = $HAL_START + $HAL_SZ + 1"
+               let "MODULE_B_START = $ROOTFS_B_START + $ROOTFS_SZ + 1"
+               let "RAMDISK_B_START = $MODULE_B_START + $MODULE_SZ + 1"
+               let "RAMDISK_RECOVERY_B_START = $RAMDISK_B_START + $RAMDISK_SZ + 1"
+               let "RESERVED2_START = $RAMDISK_RECOVERY_B_START + $RAMDISK_RECOVERY_SZ + 1"
 
                sfdisk --in-order --Linux --unit M $DISK <<-__EOF__
                4,$BOOT_SZ,0xE,*
@@ -278,11 +360,15 @@ function mkpart_3 () {
                ,$DATA_SZ,,-
                ,,E,-
                $USER_START,$USER_SZ,,-
-               $MODULE_START,$MODULE_SZ,,-
-               $RAMDISK_START,$RAMDISK_SZ,,-
-               $RAMDISK_RECOVERY_START,$RAMDISK_RECOVERY_SZ,,-
+               $MODULE_A_START,$MODULE_SZ,,-
+               $RAMDISK_A_START,$RAMDISK_SZ,,-
+               $RAMDISK_RECOVERY_A_START,$RAMDISK_RECOVERY_SZ,,-
                $INFORM_START,$INFORM_SZ,,-
                $HAL_START,$HAL_SZ,,-
+               $ROOTFS_B_START,$ROOTFS_SZ,,-
+               $MODULE_B_START,$MODULE_SZ,,-
+               $RAMDISK_B_START,$RAMDISK_SZ,,-
+               $RAMDISK_RECOVERY_B_START,$RAMDISK_RECOVERY_SZ,,-
                $RESERVED2_START,$RESERVED2_SZ,,-
                __EOF__
        fi
@@ -318,8 +404,8 @@ function mkpart_3 () {
        umount ./mnt_tmp
        rmdir mnt_tmp
 
-       local -r PART11=/dev/`lsblk ${DISK} -o TYPE,KNAME | grep part | awk '{ print $2 }' | grep -G "[a-z]11\$"`
-       mkfs.ext4 -q ${PART11} -L $RESERVED2 -F
+       local -r PART15=/dev/`lsblk ${DISK} -o TYPE,KNAME | grep part | awk '{ print $2 }' | grep -G "[a-z]15\$"`
+       mkfs.ext4 -q ${PART15} -L $RESERVED2 -F
 }
 
 function show_usage () {
@@ -346,7 +432,7 @@ function check_partition_format () {
 
 function check_args () {
        if [ "$DEVICE" == "" ]; then
-               echo "$(tput setaf 1)$(tput bold)- Device node is empty!"
+               echo -n "$(tput setaf 3)$(tput bold)$DEVICE will be formatted, Is it OK? [y/<n>] "
                show_usage
                tput sgr 0
                exit 0
@@ -367,7 +453,7 @@ function check_args () {
 
        if [ "$FORMAT" == "1" ]; then
                echo ""
-               echo -n "$(tput setaf 3)$(tput bold)$DEVICE will be formatted, Is it OK? [y/<n>] "
+               echo "$(tput setaf 3)$(tput bold)$DEVICE will be formatted, Is it OK? [y/<n>]"
                tput sgr 0
                read input
                if [ "$input" == "y" ] || [ "$input" == "Y" ]; then