Files
android_device_brcm_rpi4/wrimg.sh
Konsta 583d56ec4b wrimg: add script to write partition images
* Can be used to write partition images to a storage device that has the
  correct partition structure after flashing an image created by mkimg.sh.
* Poor man's alternative to
  fastboot flash boot boot.img
  fastboot flash system system.img
  fastboot flash vendor vendor.img
  fastboot erase userdata
2025-04-04 10:34:11 +03:00

137 lines
3.1 KiB
Bash
Executable File

#!/bin/bash
#
# Copyright (C) 2025 KonstaKANG
#
# SPDX-License-Identifier: Apache-2.0
#
exit_with_error() {
echo $@
exit 1
}
check_device() {
for PARTITION in "1" "2" "3" "4"; do
if [ ! -b /dev/${1}${PARTITION} ]; then
return 1
fi
done
PARTITION1=$(lsblk -o LABEL,SIZE -b /dev/${1}1 | tail -n 1)
PARTITION2=$(lsblk -o LABEL,SIZE -b /dev/${1}2 | tail -n 1)
PARTITION3=$(lsblk -o LABEL,SIZE -b /dev/${1}3 | tail -n 1)
PARTITION4=$(lsblk -o LABEL,SIZE -b /dev/${1}4 | tail -n 1)
if [ $(echo ${PARTITION1} | awk {'print $1'}) != "boot" ] || [ $(echo ${PARTITION1} | awk {'print $2'}) != "134217728" ]; then
return 1
fi
if [ $(echo ${PARTITION2} | awk {'print $1'}) != "/" ] || [ $(echo ${PARTITION2} | awk {'print $2'}) != "2147483648" ]; then
return 1
fi
if [ $(echo ${PARTITION3} | awk {'print $1'}) != "vendor" ] || [ $(echo ${PARTITION3} | awk {'print $2'}) != "268435456" ]; then
return 1
fi
if [ $(echo ${PARTITION4} | awk {'print $1'}) != "userdata" ]; then
return 1
fi
DEVICE=${1}
return 0
}
find_device() {
for SDX in "sda" "sdb" "sdc" "sdd"; do
check_device ${SDX}
if [ $? == "0" ]; then
break
fi
done
if [ -z ${DEVICE} ]; then
exit_with_error "Unable to find suitable block device!"
fi
}
confirm() {
echo "Build target ${1}..."
if [ "${2}" == "wipe" ]; then
echo "Wiping userdata partition..."
else
echo "Writing ${2} image..."
fi
echo "Writing to device /dev/${DEVICE}..."
lsblk -o NAME,LABEL,SIZE /dev/${DEVICE}
read -p "Continue (y/n)? " -n 1 -r RESPONSE
echo ""
if [[ ! ${RESPONSE} =~ ^[Yy]$ ]]; then
exit_with_error "Exiting!"
fi
}
write_partition() {
if [ ! -f ${ANDROID_PRODUCT_OUT}/${1}.img ]; then
exit_with_error "Partition image not found. Run 'make ${1}image' first."
fi
echo "Copying ${1}..."
sudo umount /dev/${DEVICE}${2}
sudo dd if=${ANDROID_PRODUCT_OUT}/${1}.img of=/dev/${DEVICE}${2} bs=1M
}
wipe_userdata() {
echo "Creating userdata..."
sudo umount /dev/${DEVICE}4
sudo wipefs -a /dev/${DEVICE}4
sudo mkfs.ext4 /dev/${DEVICE}4 -I 512 -L userdata
}
finish() {
sync
echo "Done!"
exit 0
}
if [ -z ${TARGET_PRODUCT} ]; then
exit_with_error "TARGET_PRODUCT environment variable is not set. Run lunch first."
fi
if [ -z ${ANDROID_PRODUCT_OUT} ]; then
exit_with_error "ANDROID_PRODUCT_OUT environment variable is not set. Run lunch first."
fi
TARGET=$(echo ${TARGET_PRODUCT} | sed 's/^aosp_//')
DEVICE=
if [ -z $1 ]; then
find_device
confirm ${TARGET} "boot, system, and vendor"
write_partition boot 1
write_partition system 2
write_partition vendor 3
finish
elif [ ! -z $1 ] && [ $1 == "boot" ]; then
find_device
confirm ${TARGET} "boot"
write_partition boot 1
finish
elif [ ! -z $1 ] && [ $1 == "system" ]; then
find_device
confirm ${TARGET} "system"
write_partition system 2
finish
elif [ ! -z $1 ] && [ $1 == "vendor" ]; then
find_device
confirm ${TARGET} "vendor"
write_partition vendor 3
finish
elif [ ! -z $1 ] && [ $1 == "wipe" ]; then
find_device
confirm ${TARGET} "wipe"
wipe_userdata
finish
else
exit_with_error "Usage: $0 [boot|system|vendor|wipe]"
fi