summaryrefslogtreecommitdiffstats
path: root/external/meta-updater-raspberrypi/scripts/flash-image.sh
diff options
context:
space:
mode:
Diffstat (limited to 'external/meta-updater-raspberrypi/scripts/flash-image.sh')
-rwxr-xr-xexternal/meta-updater-raspberrypi/scripts/flash-image.sh140
1 files changed, 140 insertions, 0 deletions
diff --git a/external/meta-updater-raspberrypi/scripts/flash-image.sh b/external/meta-updater-raspberrypi/scripts/flash-image.sh
new file mode 100755
index 00000000..ef59eb37
--- /dev/null
+++ b/external/meta-updater-raspberrypi/scripts/flash-image.sh
@@ -0,0 +1,140 @@
+#!/bin/bash
+
+ask() {
+ # http://djm.me/ask
+ local prompt default REPLY
+
+ while true; do
+
+ if [ "${2:-}" = "Y" ]; then
+ prompt="Y/n"
+ default=Y
+ elif [ "${2:-}" = "N" ]; then
+ prompt="y/N"
+ default=N
+ else
+ prompt="y/n"
+ default=
+ fi
+
+ # Ask the question (not using "read -p" as it uses stderr not stdout)
+ echo -n "$1 [$prompt] "
+
+ # Read the answer (use /dev/tty in case stdin is redirected from somewhere else)
+ read -r REPLY </dev/tty
+
+ # Default?
+ if [ -z "$REPLY" ]; then
+ REPLY=$default
+ fi
+
+ # Check if the reply is valid
+ case "$REPLY" in
+ Y*|y*) return 0 ;;
+ N*|n*) return 1 ;;
+ esac
+
+ done
+}
+
+if [[ $EUID -ne 0 ]]; then
+ echo ""
+ echo " This script must be run as root" 1>&2
+ echo ""
+ exit 1
+fi
+
+if [ -z "$1" ]; then
+ echo ""
+ echo " Flash a built image with a HERE OTA Connect device config file baked in."
+ echo ""
+ echo " Usage: ./flash-configured-image.sh device [imagefile [force]]"
+ echo ""
+ echo ""
+ echo " device : The device name to flash. Must be a removable device."
+ echo " Example: sdb"
+ echo ""
+ echo " imagefile : An image file generated by bitbake (optional)."
+ echo " Default: ./tmp/deploy/images/raspberrypi3/core-image-minimal-raspberrypi3.wic"
+ echo ""
+ echo " force : 1 to skip the check if device is removeable."
+ echo " Default: 0"
+ echo ""
+ echo " The following utilities are prerequisites:"
+ echo ""
+ echo " dd"
+ echo " parted"
+ echo " e2fsck"
+ echo " fdisk"
+ echo " resize2fs"
+ echo ""
+ exit 1
+fi
+
+set -euo pipefail
+
+DEVICE_TO_FLASH=$1
+IMAGE_TO_FLASH="${2-./tmp/deploy/images/raspberrypi3/core-image-minimal-raspberrypi3.wic}"
+FORCE_WRITE=${3-0}
+DEVICE_IS_REMOVABLE=$(cat "/sys/block/$DEVICE_TO_FLASH/removable")
+
+if [[ $FORCE_WRITE != "1" && $DEVICE_IS_REMOVABLE != "1" ]]; then
+ echo ""
+ echo " For safety, this script will only flash removable block devices."
+ echo ""
+ echo " This check is implemented by reading /sys/block/$DEVICE_TO_FLASH/removable."
+ echo ""
+ exit 1
+fi
+
+echo " "
+echo " Writing image file: $IMAGE_TO_FLASH "
+echo " to device : $DEVICE_TO_FLASH "
+echo " "
+if ask "Do you want to continue?" N; then
+ echo " "
+else
+ exit 1
+fi
+
+if [ ! -f "$IMAGE_TO_FLASH" ]; then
+ echo " "
+ echo " Error: $IMAGE_TO_FLASH doesn't exist"
+ echo ""
+ exit 1
+fi
+
+echo "Unmounting all partitions on $DEVICE_TO_FLASH"
+umount "/dev/$DEVICE_TO_FLASH"* || true
+sleep 2
+
+echo "Writing image to $DEVICE_TO_FLASH..."
+dd if="$IMAGE_TO_FLASH" of="/dev/$DEVICE_TO_FLASH" bs=32M && sync
+sleep 2
+
+# It turns out there are card readers that give their partitions funny names, like
+# "/dev/mmcblk0" will be the device, but the partitions are called "/dev/mmcblk0p1"
+# for example. Better to just get the name of the partition after we flash it.
+SECOND_PARTITION=$(fdisk -l "/dev/$DEVICE_TO_FLASH" | tail -n 1 | awk '{print $1}')
+
+# Check if there is a problem with the boot partition, and fix it if there is.
+# parted can identify the problem but apparently can't fix it without user
+# interaction.
+MISMATCH=$(fdisk -l "/dev/$DEVICE_TO_FLASH" 2>&1 >/dev/null | grep "GPT PMBR size mismatch" || true)
+if [ -n "$MISMATCH" ]; then
+ echo "Fixing GPT PMBR size mismatch."
+ sgdisk -e "/dev/$DEVICE_TO_FLASH"
+fi
+
+echo "Resizing rootfs partition to fill all of $DEVICE_TO_FLASH..."
+parted -s "/dev/$DEVICE_TO_FLASH" resizepart 2 '100%'
+sleep 2
+e2fsck -f "$SECOND_PARTITION" || true
+sleep 2
+
+echo "Resizing filesystem on $SECOND_PARTITION to match partition size..."
+resize2fs -p "$SECOND_PARTITION"
+sleep 2
+
+echo "Done!"
+