blob: a9276733c72d355af045639cfb7ca29545b491cd [file] [log] [blame]
#!/usr/bin/env bash
# Copyright 2017 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
set -eu
get_confirmation() {
echo -n "Press 'y' to confirm: "
read CONFIRM
if [[ "$CONFIRM" != "y" ]]; then
echo "[format_sdcard] Aborted due to invalid confirmation"
exit 1
fi
}
if [[ $OSTYPE != "linux-gnu" ]]; then
echo "[format_sdcard] Script is currently Linux-exclusive"
exit 1
fi
SCRIPT_DIR=$( cd $( dirname "${BASH_SOURCE[0]}" ) && pwd)
lsblk
echo "Enter the name of a block device to format: "
echo " This will probably be of the form 'sd[letter]', like 'sdc'"
echo -n "> "
read DEVICE
# Ensure that device exists
echo -n "[format_sdcard] Checking that device exists: $DEVICE ..."
DEVICE_PATH="/dev/$DEVICE"
if [[ ! -e "$DEVICE_PATH" ]]; then
echo " FAILED"
echo "[format_sdcard] ERROR: This device does not exist: $DEVICE_PATH"
exit 1
fi
echo " SUCCESS"
# Ensure that the device is a real block device
echo -n "[format_sdcard] Checking that device is a known block device..."
if [[ ! -e "/sys/block/$DEVICE" ]]; then
echo " FAILED"
echo "[format_sdcard] ERROR: /sys/block/$DEVICE does not exist."
echo " Does $DEVICE refer to a partition?"
exit 1
fi
echo " SUCCESS"
# Try to check that the device is a USB stick
echo -n "[format_sdcard] Checking if device is USB: $DEVICE ..."
READLINK_USB=$(readlink -f "/sys/class/block/$DEVICE/device" | { grep -i "usb" || true; })
if [[ -z "$READLINK_USB" ]]; then
echo " FAILED"
echo "[format_sdcard] ERROR: Cannot confirm that device is a USB stick"
echo "[format_sdcard] ERROR: Please insert USB stick and retry"
exit 1
fi
echo " SUCCESS"
sudo umount "${DEVICE_PATH}1" || true
# Ensure the device is not mounted
echo -n "[format_sdcard] Checking that device is not mounted: $DEVICE ..."
if [[ -n $(df -Hl | grep "$DEVICE") ]]; then
echo " FAILED"
echo "[format_sdcard] ERROR: Your device appears to be mounted: "
echo "..."
df -Hl | grep "$DEVICE"
echo "..."
echo "[format_sdcard] ERROR: Please unmount your device and retry"
exit 1
fi
echo " SUCCESS"
# Confirm that the user knows what they are doing
sudo -v -p "[sudo] Enter password to confirm information about device: "
sudo sfdisk -l "$DEVICE_PATH"
echo "[format_sdcard] ABOUT TO COMPLETELY WIPE / FORMAT: $DEVICE_PATH"
get_confirmation
echo "[format_sdcard] ARE YOU 100% SURE? This will hurt if you get it wrong."
get_confirmation
# Create three new partitions on the device, 1GB for root and divide the
# remaining space into 2 pieces for data and bootfs
# Determine how many bytes we have available on this disk.
BLK_DEV_SIZE=`sudo blockdev --getsize64 $DEVICE_PATH`
BLK_DEV_SIZE_MB=$((BLK_DEV_SIZE/1048576))
if [ "$BLK_DEV_SIZE_MB" -lt 3000 ]; then
echo " FAILED"
echo "[format_sdcard] ERROR: SD Card must be at least 4GB"
exit 1
fi
sudo dd if=/dev/zero of="$DEVICE_PATH" bs=512 count=1
DATA_PTN_START=4259840
DATA_PTN_END=4521983
DATA_PTN_SIZE=$((DATA_PTN_END-DATA_PTN_START+1))
DATA_PTN_SIZE_B=$(((DATA_PTN_END - DATA_PTN_START + 1)*512))
echo "Using Data Partition Size = ${DATA_PTN_SIZE_B} bytes"
sudo sfdisk -uS "$DEVICE_PATH" << EOF
${DATA_PTN_START} ${DATA_PTN_SIZE} 0x0b -
EOF
DATA_PTN_PATH="${DEVICE_PATH}1"
sudo mkfs.fat ${DEVICE_PATH}1
# Function to attempt unmounting a mount point up to three times, sleeping
# a couple of seconds between attempts.
function umount_retry() {
set +e
TRIES=0
while (! sudo umount $1); do
((TRIES++))
if [[ ${TRIES} > 2 ]]; then
echo "[format_sdcard] Unable to umount $0"
exit 1
fi
sleep 2
done
set -e
}
# Copy the necessary files to the root partition
MOUNT_PATH=`mktemp -d`
sudo mount "$DATA_PTN_PATH" "$MOUNT_PATH"
trap "umount_retry \"${MOUNT_PATH}\" && rm -rf \"${MOUNT_PATH}\" && echo \"Unmounted succesfully\"" INT TERM EXIT
sudo dd if=fip/gxl/u-boot.bin.sd.bin of="$DEVICE_PATH" conv=fsync,notrunc bs=1 count=444
sudo dd if=fip/gxl/u-boot.bin.sd.bin of="$DEVICE_PATH" conv=fsync,notrunc bs=512 skip=1 seek=1
echo " SUCCESS"