#!/usr/bin/env bash

# Copyright 2017 The Fuchsia Authors
#
# Use of this source code is governed by a MIT-style
# license that can be found in the LICENSE file or at
# https://opensource.org/licenses/MIT

set -eo pipefail

CMDLINE=
EXTRA_ARGS=()

SCRIPTS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
ZIRCON_DIR="${SCRIPTS_DIR}/.."

FIRMWARE_DIR=/tmp/hikey/hikey-firmware
FIRMWARE_GIT=https://android.googlesource.com/device/linaro/hikey
FIRMWARE_TAG=android-o-iot-preview-5

help() {
    echo "usage: ${0} [options]"
    echo "  -b [build-dir]  Use specified build directory."
    echo "                  Defaults to build-hikey960/."
    echo "  -d [ramdisk]    Use specified ramdisk file."
    echo "                  Defaults to BUILD_DIR/bootdata.bin."
    echo "  -f              Download and flash firmware."
    echo "  -m              Add mexec option to kernel command line to enable netboot."
    echo "  -h              Show this help message."
    echo
    echo "See docs/targets/hikey960.md for more details."
    exit 1
}

help_fastboot() {
    echo
    echo "Check that the device is in fastboot mode:"
    echo "  Auto Power up(Switch 1)   closed/ON"
    echo "  Recovery(Switch 2)        open/OFF"
    echo "  Fastboot(Switch 3)        closed/ON"

    read -p "Proceed (y|n)? " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        exit 1
    fi
}

git_clone() {
    git clone --depth 1 $@
}

flash_firmware() {
    if [[ ! -d $FIRMWARE_DIR ]]; then
        git_clone -b $FIRMWARE_TAG $FIRMWARE_GIT $FIRMWARE_DIR
    fi

    help_fastboot
    fastboot flash ptable ${FIRMWARE_DIR}/installer/hikey960/ptable.img
    fastboot flash xloader ${FIRMWARE_DIR}/installer/hikey960/sec_xloader.img
    fastboot flash fastboot ${FIRMWARE_DIR}/installer/hikey960/fastboot.img
    fastboot flash nvme ${FIRMWARE_DIR}/installer/hikey960/nvme.img
    fastboot flash fw_lpm3 ${FIRMWARE_DIR}/installer/hikey960/lpm3.img
    fastboot flash trustfirmware ${FIRMWARE_DIR}/installer/hikey960/bl31.bin
}

flash_kernel() {
    "${ZIRCON_DIR}/kernel/target/arm64/board/hikey960/package-image.sh" -B "${BUILD_DIR}" "${EXTRA_ARGS[@]}"

    fastboot flash boot $OUT_IMAGE
    # Can't guarantee that the target has written image to flash before the
    # fastboot command completes, so short delay here before reboot.
    sleep 1
    fastboot reboot
}

while getopts "b:d:fmnp:ruh" FLAG; do
    case $FLAG in
    b) BUILD_DIR="${OPTARG}";;
    d) RAMDISK="${OPTARG}";;
    f) FLAG_FIRMWARE=true;;
    m) CMDLINE+=" netsvc.netboot=true";;
    *) help;;
    esac
done
shift $((OPTIND-1))

BUILD_DIR="${BUILD_DIR:-build-gcc}"
OUT_IMAGE="${BUILD_DIR}/hikey960-boot.img"

if [[ $FLAG_FIRMWARE ]]; then
    flash_firmware
    exit 0
fi

if [[ -n "${CMDLINE}" ]]; then
    EXTRA_ARGS+=(-c "${CMDLINE}")
fi

flash_kernel
