#!/usr/bin/env bash # Copyright 2018 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 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" BUILD_DIR="${DIR}/../build-arm64" SYSCFG_A_BIN="${DIR}/../prebuilt/images/syscfg_a.bin" SYSCFG_B_BIN="${DIR}/../prebuilt/images/syscfg_b.bin" SYSCFG_R_BIN="${DIR}/../prebuilt/images/syscfg_r.bin" SYSCFG_BIN=${SYSCFG_A_BIN} FLASH_PART=a BOOT_PART=a REBOOT=yes CMDLINE= # To be provided by board-specific flash script ZIRCON_PARTITION= PARTITION_A= PARTITION_B= PARTITION_R= PARTITION_SYSCFG= function HELP { echo "help:" echo "-b : Board to flash" echo "-c : Extra command line options" echo "-m : Add mexec option to command line" echo "-o : Build directory" echo "-B : Partition to boot from (a, b, r) (x to skip)" echo "-P : Partition to flash (a, b, r) (x to skip)(A for all)" echo "-N : Don't reboot" echo "-Z : Zircon partition names (a,b,r,syscfg)" echo "-h for help" exit 1 } while getopts "b:c:d:mo:NP:B:hZ:" FLAG; do case $FLAG in b) BOARD="${OPTARG}";; c) CMDLINE+=" ${OPTARG}";; d) RAMDISK="${OPTARG}";; m) CMDLINE+=" netsvc.netboot=true";; o) BUILD_DIR="${OPTARG}";; B) BOOT_PART="${OPTARG}";; P) FLASH_PART="${OPTARG}";; Z) ZIRCON_PARTITION="${OPTARG}";; N) REBOOT="no";; h) HELP;; \?) echo unrecognized option HELP ;; esac done shift $((OPTIND-1)) if [[ -z "${BOARD}" ]]; then echo must specify a board to flash HELP fi # process partitions names. We are either allowed 1 or 4 partitions IFS=',' read -ra PART_NAMES <<< "${ZIRCON_PARTITION}" #Convert string to array if [[ ${#PART_NAMES[@]} != 4 ]] && [[ ${#PART_NAMES[@]} != 1 ]]; then echo Invalid partition names provided HELP fi # Make sure none of the entries are empty for i in "${PART_NAMES[@]}"; do if [[ -z ${i} ]]; then echo empty partition name provided HELP fi done if [[ ${#PART_NAMES[@]} == 4 ]]; then PARTITION_A=${PART_NAMES[0]} PARTITION_B=${PART_NAMES[1]} PARTITION_R=${PART_NAMES[2]} PARTITION_SYSCFG=${PART_NAMES[3]} else PARTITION_A=${PART_NAMES[0]} fi # At this point we have the partition names if [[ "${BOOT_PART}" != "a" ]] && [[ "${BOOT_PART}" != "b" ]] && [[ "${BOOT_PART}" != "r" ]] && [[ "${BOOT_PART}" != "x" ]]; then echo Invalid Boot Partition selected ${BOOT_PART} HELP else if [[ "${BOOT_PART}" == "a" ]]; then SYSCFG_BIN="${SYSCFG_A_BIN}" elif [[ "${BOOT_PART}" == "b" ]]; then SYSCFG_BIN="${SYSCFG_B_BIN}" elif [[ "${BOOT_PART}" == "r" ]]; then SYSCFG_BIN="${SYSCFG_R_BIN}" else SYSCFG_BIN="" fi fi if [[ "${FLASH_PART}" != "a" ]] && [[ "${FLASH_PART}" != "b" ]] && [[ "${FLASH_PART}" != "r" ]] && [[ "${FLASH_PART}" != "x" ]] && [[ "${FLASH_PART}" != "A" ]]; then echo Invalid Boot Partition selected ${FLASH_PART} HELP else if [[ "${FLASH_PART}" == "a" ]]; then FLASH_PART="${PARTITION_A}" elif [[ "${FLASH_PART}" == "b" ]]; then FLASH_PART="${PARTITION_B}" elif [[ "${FLASH_PART}" == "r" ]]; then FLASH_PART="${PARTITION_R}" # Add netboot option to recovery CMDLINE+=" netsvc.netboot=true" elif [[ "${FLASH_PART}" == "A" ]]; then FLASH_PART="all" else FLASH_PART="" fi fi if [[ ! -z "${SYSCFG_BIN}" ]]; then echo Flashing sysconfig partition fastboot flash tee ${SYSCFG_BIN} fi ZBI="${BUILD_DIR}/tools/zbi" BOOTIMAGE="${BUILD_DIR}/zircon.zbi" CMDLINE_FILE="${BUILD_DIR}/${BOARD}-cmdline.txt" OUT_IMAGE="${BUILD_DIR}/${BOARD}-boot.img" echo ${CMDLINE} > ${CMDLINE_FILE} ${ZBI} -o ${OUT_IMAGE} ${BOOTIMAGE} -T cmdline ${CMDLINE_FILE} # At this point we either flash all or flash one if [[ ! -z "${FLASH_PART}" ]]; then if [[ "${FLASH_PART}" == "all" ]]; then fastboot flash "${PARTITION_A}" "${OUT_IMAGE}" fastboot flash "${PARTITION_B}" "${OUT_IMAGE}" # Add netboot option to recovery CMDLINE+=" netsvc.netboot=true" echo ${CMDLINE} > ${CMDLINE_FILE} ${ZBI} -o ${OUT_IMAGE} ${BOOTIMAGE} -T cmdline ${CMDLINE_FILE} fastboot flash "${PARTITION_R}" "${OUT_IMAGE}" else fastboot flash "${FLASH_PART}" "${OUT_IMAGE}" fi fi if [[ "${REBOOT}" == "yes" ]]; then fastboot reboot fi