1#!/usr/bin/env bash 2 3# Copyright 2018 The Fuchsia Authors 4# 5# Use of this source code is governed by a MIT-style 6# license that can be found in the LICENSE file or at 7# https://opensource.org/licenses/MIT 8 9set -eo pipefail 10 11DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 12BUILD_DIR="${DIR}/../build-arm64" 13SYSCFG_A_BIN="${DIR}/../prebuilt/images/syscfg_a.bin" 14SYSCFG_B_BIN="${DIR}/../prebuilt/images/syscfg_b.bin" 15SYSCFG_R_BIN="${DIR}/../prebuilt/images/syscfg_r.bin" 16SYSCFG_BIN=${SYSCFG_A_BIN} 17FLASH_PART=a 18BOOT_PART=a 19REBOOT=yes 20CMDLINE= 21 22# To be provided by board-specific flash script 23ZIRCON_PARTITION= 24PARTITION_A= 25PARTITION_B= 26PARTITION_R= 27PARTITION_SYSCFG= 28 29 30function HELP { 31 echo "help:" 32 echo "-b <board> : Board to flash" 33 echo "-c <cmd line> : Extra command line options" 34 echo "-m : Add mexec option to command line" 35 echo "-o <dir> : Build directory" 36 echo "-B <partition> : Partition to boot from (a, b, r) (x to skip)" 37 echo "-P <partition> : Partition to flash (a, b, r) (x to skip)(A for all)" 38 echo "-N : Don't reboot" 39 echo "-Z <partition name> : Zircon partition names <comma separated> (a,b,r,syscfg)" 40 echo "-h for help" 41 exit 1 42} 43 44while getopts "b:c:d:mo:NP:B:hZ:" FLAG; do 45 case $FLAG in 46 b) BOARD="${OPTARG}";; 47 c) CMDLINE+=" ${OPTARG}";; 48 d) RAMDISK="${OPTARG}";; 49 m) CMDLINE+=" netsvc.netboot=true";; 50 o) BUILD_DIR="${OPTARG}";; 51 B) BOOT_PART="${OPTARG}";; 52 P) FLASH_PART="${OPTARG}";; 53 Z) ZIRCON_PARTITION="${OPTARG}";; 54 N) REBOOT="no";; 55 h) HELP;; 56 \?) 57 echo unrecognized option 58 HELP 59 ;; 60 esac 61done 62shift $((OPTIND-1)) 63 64if [[ -z "${BOARD}" ]]; then 65 echo must specify a board to flash 66 HELP 67fi 68 69# process partitions names. We are either allowed 1 or 4 partitions 70IFS=',' read -ra PART_NAMES <<< "${ZIRCON_PARTITION}" #Convert string to array 71 72if [[ ${#PART_NAMES[@]} != 4 ]] && [[ ${#PART_NAMES[@]} != 1 ]]; then 73 echo Invalid partition names provided 74 HELP 75fi 76 77# Make sure none of the entries are empty 78for i in "${PART_NAMES[@]}"; do 79 if [[ -z ${i} ]]; then 80 echo empty partition name provided 81 HELP 82 fi 83done 84 85if [[ ${#PART_NAMES[@]} == 4 ]]; then 86 PARTITION_A=${PART_NAMES[0]} 87 PARTITION_B=${PART_NAMES[1]} 88 PARTITION_R=${PART_NAMES[2]} 89 PARTITION_SYSCFG=${PART_NAMES[3]} 90else 91 PARTITION_A=${PART_NAMES[0]} 92fi 93 94# At this point we have the partition names 95 96if [[ "${BOOT_PART}" != "a" ]] && 97 [[ "${BOOT_PART}" != "b" ]] && 98 [[ "${BOOT_PART}" != "r" ]] && 99 [[ "${BOOT_PART}" != "x" ]]; then 100 echo Invalid Boot Partition selected ${BOOT_PART} 101 HELP 102else 103 if [[ "${BOOT_PART}" == "a" ]]; then 104 SYSCFG_BIN="${SYSCFG_A_BIN}" 105 elif [[ "${BOOT_PART}" == "b" ]]; then 106 SYSCFG_BIN="${SYSCFG_B_BIN}" 107 elif [[ "${BOOT_PART}" == "r" ]]; then 108 SYSCFG_BIN="${SYSCFG_R_BIN}" 109 else 110 SYSCFG_BIN="" 111 fi 112fi 113 114if [[ "${FLASH_PART}" != "a" ]] && 115 [[ "${FLASH_PART}" != "b" ]] && 116 [[ "${FLASH_PART}" != "r" ]] && 117 [[ "${FLASH_PART}" != "x" ]] && 118 [[ "${FLASH_PART}" != "A" ]]; then 119 echo Invalid Boot Partition selected ${FLASH_PART} 120 HELP 121else 122 if [[ "${FLASH_PART}" == "a" ]]; then 123 FLASH_PART="${PARTITION_A}" 124 elif [[ "${FLASH_PART}" == "b" ]]; then 125 FLASH_PART="${PARTITION_B}" 126 elif [[ "${FLASH_PART}" == "r" ]]; then 127 FLASH_PART="${PARTITION_R}" 128 # Add netboot option to recovery 129 CMDLINE+=" netsvc.netboot=true" 130 elif [[ "${FLASH_PART}" == "A" ]]; then 131 FLASH_PART="all" 132 else 133 FLASH_PART="" 134 fi 135fi 136 137if [[ ! -z "${SYSCFG_BIN}" ]]; then 138 echo Flashing sysconfig partition 139 fastboot flash tee ${SYSCFG_BIN} 140fi 141 142 143ZBI="${BUILD_DIR}/tools/zbi" 144BOOTIMAGE="${BUILD_DIR}/zircon.zbi" 145CMDLINE_FILE="${BUILD_DIR}/${BOARD}-cmdline.txt" 146OUT_IMAGE="${BUILD_DIR}/${BOARD}-boot.img" 147 148echo ${CMDLINE} > ${CMDLINE_FILE} 149${ZBI} -o ${OUT_IMAGE} ${BOOTIMAGE} -T cmdline ${CMDLINE_FILE} 150 151# At this point we either flash all or flash one 152 153if [[ ! -z "${FLASH_PART}" ]]; then 154 if [[ "${FLASH_PART}" == "all" ]]; then 155 fastboot flash "${PARTITION_A}" "${OUT_IMAGE}" 156 fastboot flash "${PARTITION_B}" "${OUT_IMAGE}" 157 # Add netboot option to recovery 158 CMDLINE+=" netsvc.netboot=true" 159 echo ${CMDLINE} > ${CMDLINE_FILE} 160 ${ZBI} -o ${OUT_IMAGE} ${BOOTIMAGE} -T cmdline ${CMDLINE_FILE} 161 fastboot flash "${PARTITION_R}" "${OUT_IMAGE}" 162 else 163 fastboot flash "${FLASH_PART}" "${OUT_IMAGE}" 164 fi 165fi 166 167if [[ "${REBOOT}" == "yes" ]]; then 168 fastboot reboot 169fi 170