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