From c395e0078a0f51dbc9b3c2a34e0e5769ee54257f Mon Sep 17 00:00:00 2001 From: Jaehoon Chung Date: Thu, 9 Jun 2022 13:28:36 +0900 Subject: [PATCH] scripts: tizen: sd_fusing_rpi4: support A/B partition Support A/B partition layout. Change-Id: I06e5999be208b75d049e93c6544e8769a6fc3265 Signed-off-by: Jaehoon Chung --- scripts/tizen/sd_fusing_rpi4.sh | 154 +++++++++++++++++++++++++++++++--------- 1 file changed, 120 insertions(+), 34 deletions(-) diff --git a/scripts/tizen/sd_fusing_rpi4.sh b/scripts/tizen/sd_fusing_rpi4.sh index d5f1b42..5bfb31e 100755 --- a/scripts/tizen/sd_fusing_rpi4.sh +++ b/scripts/tizen/sd_fusing_rpi4.sh @@ -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/] " 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/] " + echo "$(tput setaf 3)$(tput bold)$DEVICE will be formatted, Is it OK? [y/]" tput sgr 0 read input if [ "$input" == "y" ] || [ "$input" == "Y" ]; then -- 2.7.4