Toyomasa Watarai / Mbed OS mbed-cloud-example-ESP8266

Dependencies:   LM75B MMA7660

Committer:
MarceloSalazar
Date:
Wed Apr 25 00:16:01 2018 +0100
Revision:
9:9fade4bb2774
Update to MCC v1.3.0 GA

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MarceloSalazar 9:9fade4bb2774 1 #!/usr/bin/env python
MarceloSalazar 9:9fade4bb2774 2
MarceloSalazar 9:9fade4bb2774 3 ## ----------------------------------------------------------------------------
MarceloSalazar 9:9fade4bb2774 4 ## Copyright 2016-2017 ARM Ltd.
MarceloSalazar 9:9fade4bb2774 5 ##
MarceloSalazar 9:9fade4bb2774 6 ## SPDX-License-Identifier: Apache-2.0
MarceloSalazar 9:9fade4bb2774 7 ##
MarceloSalazar 9:9fade4bb2774 8 ## Licensed under the Apache License, Version 2.0 (the "License");
MarceloSalazar 9:9fade4bb2774 9 ## you may not use this file except in compliance with the License.
MarceloSalazar 9:9fade4bb2774 10 ## You may obtain a copy of the License at
MarceloSalazar 9:9fade4bb2774 11 ##
MarceloSalazar 9:9fade4bb2774 12 ## http://www.apache.org/licenses/LICENSE-2.0
MarceloSalazar 9:9fade4bb2774 13 ##
MarceloSalazar 9:9fade4bb2774 14 ## Unless required by applicable law or agreed to in writing, software
MarceloSalazar 9:9fade4bb2774 15 ## distributed under the License is distributed on an "AS IS" BASIS,
MarceloSalazar 9:9fade4bb2774 16 ## WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
MarceloSalazar 9:9fade4bb2774 17 ## See the License for the specific language governing permissions and
MarceloSalazar 9:9fade4bb2774 18 ## limitations under the License.
MarceloSalazar 9:9fade4bb2774 19 ## ----------------------------------------------------------------------------
MarceloSalazar 9:9fade4bb2774 20
MarceloSalazar 9:9fade4bb2774 21 from os import path
MarceloSalazar 9:9fade4bb2774 22 import json
MarceloSalazar 9:9fade4bb2774 23 import hashlib, zlib, struct
MarceloSalazar 9:9fade4bb2774 24 import time
MarceloSalazar 9:9fade4bb2774 25 import sys
MarceloSalazar 9:9fade4bb2774 26 from intelhex import IntelHex
MarceloSalazar 9:9fade4bb2774 27
MarceloSalazar 9:9fade4bb2774 28 '''
MarceloSalazar 9:9fade4bb2774 29 define FIRMWARE_HEADER_MAGIC 0x5a51b3d4UL
MarceloSalazar 9:9fade4bb2774 30 define FIRMWARE_HEADER_VERSION 2
MarceloSalazar 9:9fade4bb2774 31 define ARM_UC_SHA512_SIZE (512/8)
MarceloSalazar 9:9fade4bb2774 32 define ARM_UC_GUID_SIZE (128/8)
MarceloSalazar 9:9fade4bb2774 33 typedef struct _arm_uc_internal_header_t
MarceloSalazar 9:9fade4bb2774 34 {
MarceloSalazar 9:9fade4bb2774 35 /* Metadata-header specific magic code */
MarceloSalazar 9:9fade4bb2774 36 uint32_t headerMagic;
MarceloSalazar 9:9fade4bb2774 37
MarceloSalazar 9:9fade4bb2774 38 /* Revision number for metadata header. */
MarceloSalazar 9:9fade4bb2774 39 uint32_t headerVersion;
MarceloSalazar 9:9fade4bb2774 40
MarceloSalazar 9:9fade4bb2774 41 /* Version number accompanying the firmware. Larger numbers imply more
MarceloSalazar 9:9fade4bb2774 42 recent and preferred versions. This is used for determining the
MarceloSalazar 9:9fade4bb2774 43 selection order when multiple versions are available. For downloaded
MarceloSalazar 9:9fade4bb2774 44 firmware the manifest timestamp is used as the firmware version.
MarceloSalazar 9:9fade4bb2774 45 */
MarceloSalazar 9:9fade4bb2774 46 uint64_t firmwareVersion;
MarceloSalazar 9:9fade4bb2774 47
MarceloSalazar 9:9fade4bb2774 48 /* Total space (in bytes) occupied by the firmware BLOB. */
MarceloSalazar 9:9fade4bb2774 49 uint64_t firmwareSize;
MarceloSalazar 9:9fade4bb2774 50
MarceloSalazar 9:9fade4bb2774 51 /* Firmware hash calculated over the firmware size. Should match the hash
MarceloSalazar 9:9fade4bb2774 52 generated by standard command line tools, e.g., shasum on Linux/Mac.
MarceloSalazar 9:9fade4bb2774 53 */
MarceloSalazar 9:9fade4bb2774 54 uint8_t firmwareHash[ARM_UC_SHA512_SIZE];
MarceloSalazar 9:9fade4bb2774 55
MarceloSalazar 9:9fade4bb2774 56 /* The ID for the update campaign that resulted in the firmware update.
MarceloSalazar 9:9fade4bb2774 57 */
MarceloSalazar 9:9fade4bb2774 58 uint8_t campaign[ARM_UC_GUID_SIZE];
MarceloSalazar 9:9fade4bb2774 59
MarceloSalazar 9:9fade4bb2774 60 /* Size of the firmware signature. Must be 0 if no signature is supplied. */
MarceloSalazar 9:9fade4bb2774 61 uint32_t firmwareSignatureSize;
MarceloSalazar 9:9fade4bb2774 62
MarceloSalazar 9:9fade4bb2774 63 /* Header 32 bit CRC. Calculated over the entire header, including the CRC
MarceloSalazar 9:9fade4bb2774 64 field, but with the CRC set to zero.
MarceloSalazar 9:9fade4bb2774 65 */
MarceloSalazar 9:9fade4bb2774 66 uint32_t headerCRC;
MarceloSalazar 9:9fade4bb2774 67
MarceloSalazar 9:9fade4bb2774 68 /* Optional firmware signature. Hashing algorithm should be the same as the
MarceloSalazar 9:9fade4bb2774 69 one used for the firmware hash. The firmwareSignatureSize must be set.
MarceloSalazar 9:9fade4bb2774 70 */
MarceloSalazar 9:9fade4bb2774 71 uint8_t firmwareSignature[0];
MarceloSalazar 9:9fade4bb2774 72 } arm_uc_internal_header_t;
MarceloSalazar 9:9fade4bb2774 73 '''
MarceloSalazar 9:9fade4bb2774 74
MarceloSalazar 9:9fade4bb2774 75 # define defaults to go into the metadata header
MarceloSalazar 9:9fade4bb2774 76 SIZEOF_SHA512 = int(512/8)
MarceloSalazar 9:9fade4bb2774 77 SIZEOF_GUID = int(128/8)
MarceloSalazar 9:9fade4bb2774 78 FIRMWARE_HEADER_MAGIC = 0x5a51b3d4
MarceloSalazar 9:9fade4bb2774 79 FIRMWARE_HEADER_VERSION = 2
MarceloSalazar 9:9fade4bb2774 80 header_format = ">2I2Q{}s{}s2I".format(SIZEOF_SHA512, SIZEOF_GUID)
MarceloSalazar 9:9fade4bb2774 81
MarceloSalazar 9:9fade4bb2774 82 if sys.version_info < (3,):
MarceloSalazar 9:9fade4bb2774 83 def b(x):
MarceloSalazar 9:9fade4bb2774 84 return bytearray(x)
MarceloSalazar 9:9fade4bb2774 85 else:
MarceloSalazar 9:9fade4bb2774 86 def b(x):
MarceloSalazar 9:9fade4bb2774 87 return x
MarceloSalazar 9:9fade4bb2774 88
MarceloSalazar 9:9fade4bb2774 89 def create_header(app_blob, firmwareVersion):
MarceloSalazar 9:9fade4bb2774 90 # calculate the hash of the application
MarceloSalazar 9:9fade4bb2774 91 firmwareHash = hashlib.sha256(app_blob).digest()
MarceloSalazar 9:9fade4bb2774 92
MarceloSalazar 9:9fade4bb2774 93 # calculate the total size which is defined as the application size + metadata header
MarceloSalazar 9:9fade4bb2774 94 firmwareSize = len(app_blob)
MarceloSalazar 9:9fade4bb2774 95
MarceloSalazar 9:9fade4bb2774 96 # set campaign GUID to 0
MarceloSalazar 9:9fade4bb2774 97 campaign = b'\00'
MarceloSalazar 9:9fade4bb2774 98
MarceloSalazar 9:9fade4bb2774 99 # signature not supported, set size to 0
MarceloSalazar 9:9fade4bb2774 100 signatureSize = 0
MarceloSalazar 9:9fade4bb2774 101
MarceloSalazar 9:9fade4bb2774 102 print ('imageSize: {}'.format(firmwareSize))
MarceloSalazar 9:9fade4bb2774 103 print ('imageHash: {}'.format(''.join(['{:0>2x}'.format(c) for c in b(firmwareHash)])))
MarceloSalazar 9:9fade4bb2774 104 print ('imageversion: {}'.format(firmwareVersion))
MarceloSalazar 9:9fade4bb2774 105
MarceloSalazar 9:9fade4bb2774 106 # construct struct for CRC calculation
MarceloSalazar 9:9fade4bb2774 107 headerCRC = 0
MarceloSalazar 9:9fade4bb2774 108 FirmwareHeader = struct.pack(header_format,
MarceloSalazar 9:9fade4bb2774 109 FIRMWARE_HEADER_MAGIC,
MarceloSalazar 9:9fade4bb2774 110 FIRMWARE_HEADER_VERSION,
MarceloSalazar 9:9fade4bb2774 111 firmwareVersion,
MarceloSalazar 9:9fade4bb2774 112 firmwareSize,
MarceloSalazar 9:9fade4bb2774 113 firmwareHash,
MarceloSalazar 9:9fade4bb2774 114 campaign,
MarceloSalazar 9:9fade4bb2774 115 signatureSize,
MarceloSalazar 9:9fade4bb2774 116 headerCRC)
MarceloSalazar 9:9fade4bb2774 117
MarceloSalazar 9:9fade4bb2774 118 # calculate checksum over header, including signatureSize but without headerCRC
MarceloSalazar 9:9fade4bb2774 119 headerCRC = zlib.crc32(FirmwareHeader[:-4]) & 0xffffffff
MarceloSalazar 9:9fade4bb2774 120
MarceloSalazar 9:9fade4bb2774 121 # Pack the data into a binary blob
MarceloSalazar 9:9fade4bb2774 122 FirmwareHeader = struct.pack(header_format,
MarceloSalazar 9:9fade4bb2774 123 FIRMWARE_HEADER_MAGIC,
MarceloSalazar 9:9fade4bb2774 124 FIRMWARE_HEADER_VERSION,
MarceloSalazar 9:9fade4bb2774 125 firmwareVersion,
MarceloSalazar 9:9fade4bb2774 126 firmwareSize,
MarceloSalazar 9:9fade4bb2774 127 firmwareHash,
MarceloSalazar 9:9fade4bb2774 128 campaign,
MarceloSalazar 9:9fade4bb2774 129 signatureSize,
MarceloSalazar 9:9fade4bb2774 130 headerCRC)
MarceloSalazar 9:9fade4bb2774 131
MarceloSalazar 9:9fade4bb2774 132 return FirmwareHeader
MarceloSalazar 9:9fade4bb2774 133
MarceloSalazar 9:9fade4bb2774 134
MarceloSalazar 9:9fade4bb2774 135 def combine(bootloader_fn, app_fn, app_addr, hdr_addr, bootloader_addr, output_fn, version, no_bootloader):
MarceloSalazar 9:9fade4bb2774 136 ih = IntelHex()
MarceloSalazar 9:9fade4bb2774 137
MarceloSalazar 9:9fade4bb2774 138 bootloader_format = bootloader_fn.split('.')[-1]
MarceloSalazar 9:9fade4bb2774 139
MarceloSalazar 9:9fade4bb2774 140 # write the bootloader
MarceloSalazar 9:9fade4bb2774 141 if not no_bootloader:
MarceloSalazar 9:9fade4bb2774 142 print("Using bootloader %s" % bootloader_fn)
MarceloSalazar 9:9fade4bb2774 143 if bootloader_format == 'hex':
MarceloSalazar 9:9fade4bb2774 144 print("Loading bootloader from hex file.")
MarceloSalazar 9:9fade4bb2774 145 ih.fromfile(bootloader_fn, format=bootloader_format)
MarceloSalazar 9:9fade4bb2774 146 elif bootloader_format == 'bin':
MarceloSalazar 9:9fade4bb2774 147 print("Loading bootloader to address 0x%08x." % bootloader_addr)
MarceloSalazar 9:9fade4bb2774 148 ih.loadbin(bootloader_fn, offset=bootloader_addr)
MarceloSalazar 9:9fade4bb2774 149 else:
MarceloSalazar 9:9fade4bb2774 150 print('Bootloader format can only be .bin or .hex')
MarceloSalazar 9:9fade4bb2774 151 exit(-1)
MarceloSalazar 9:9fade4bb2774 152
MarceloSalazar 9:9fade4bb2774 153 # write firmware header
MarceloSalazar 9:9fade4bb2774 154 app_format=app_fn.split('.')[-1]
MarceloSalazar 9:9fade4bb2774 155 if app_format == 'bin':
MarceloSalazar 9:9fade4bb2774 156 with open(app_fn, 'rb') as fd:
MarceloSalazar 9:9fade4bb2774 157 app_blob = fd.read()
MarceloSalazar 9:9fade4bb2774 158 elif app_format == 'hex':
MarceloSalazar 9:9fade4bb2774 159 application = IntelHex(app_fn)
MarceloSalazar 9:9fade4bb2774 160 app_blob = application.tobinstr()
MarceloSalazar 9:9fade4bb2774 161 FirmwareHeader = create_header(app_blob, version)
MarceloSalazar 9:9fade4bb2774 162 print("Writing header to address 0x%08x." % hdr_addr)
MarceloSalazar 9:9fade4bb2774 163 ih.puts(hdr_addr, FirmwareHeader)
MarceloSalazar 9:9fade4bb2774 164
MarceloSalazar 9:9fade4bb2774 165 # write the application
MarceloSalazar 9:9fade4bb2774 166 if app_format == 'bin':
MarceloSalazar 9:9fade4bb2774 167 print("Loading application to address 0x%08x." % app_addr)
MarceloSalazar 9:9fade4bb2774 168 ih.loadbin(app_fn, offset=app_addr)
MarceloSalazar 9:9fade4bb2774 169 elif app_format == 'hex':
MarceloSalazar 9:9fade4bb2774 170 print("Loading application from hex file")
MarceloSalazar 9:9fade4bb2774 171 ih.fromfile(app_fn, format=app_format)
MarceloSalazar 9:9fade4bb2774 172
MarceloSalazar 9:9fade4bb2774 173 # output to file
MarceloSalazar 9:9fade4bb2774 174 ih.tofile(output_fn, format=output_fn.split('.')[-1])
MarceloSalazar 9:9fade4bb2774 175
MarceloSalazar 9:9fade4bb2774 176
MarceloSalazar 9:9fade4bb2774 177 if __name__ == '__main__':
MarceloSalazar 9:9fade4bb2774 178 from glob import glob
MarceloSalazar 9:9fade4bb2774 179 import argparse
MarceloSalazar 9:9fade4bb2774 180
MarceloSalazar 9:9fade4bb2774 181 parser = argparse.ArgumentParser(
MarceloSalazar 9:9fade4bb2774 182 description='Combine bootloader with application adding metadata header.')
MarceloSalazar 9:9fade4bb2774 183
MarceloSalazar 9:9fade4bb2774 184 def addr_arg(s):
MarceloSalazar 9:9fade4bb2774 185 if not isinstance(s, int):
MarceloSalazar 9:9fade4bb2774 186 s = eval(s)
MarceloSalazar 9:9fade4bb2774 187
MarceloSalazar 9:9fade4bb2774 188 return s
MarceloSalazar 9:9fade4bb2774 189
MarceloSalazar 9:9fade4bb2774 190 bin_map = {
MarceloSalazar 9:9fade4bb2774 191 'k64f': {
MarceloSalazar 9:9fade4bb2774 192 'mem_start': '0x0'
MarceloSalazar 9:9fade4bb2774 193 },
MarceloSalazar 9:9fade4bb2774 194 'ublox_evk_odin_w2': {
MarceloSalazar 9:9fade4bb2774 195 'mem_start': '0x08000000'
MarceloSalazar 9:9fade4bb2774 196 },
MarceloSalazar 9:9fade4bb2774 197 'nucleo_f429zi': {
MarceloSalazar 9:9fade4bb2774 198 'mem_start': '0x08000000'
MarceloSalazar 9:9fade4bb2774 199 }
MarceloSalazar 9:9fade4bb2774 200 }
MarceloSalazar 9:9fade4bb2774 201
MarceloSalazar 9:9fade4bb2774 202 curdir = path.dirname(path.abspath(__file__))
MarceloSalazar 9:9fade4bb2774 203
MarceloSalazar 9:9fade4bb2774 204 def parse_mbed_app_addr(mcu, key):
MarceloSalazar 9:9fade4bb2774 205 mem_start = bin_map[mcu]["mem_start"]
MarceloSalazar 9:9fade4bb2774 206 with open(path.join(curdir, "..", "mbed_app.json")) as fd:
MarceloSalazar 9:9fade4bb2774 207 mbed_json = json.load(fd)
MarceloSalazar 9:9fade4bb2774 208 addr = mbed_json["target_overrides"][mcu.upper()][key]
MarceloSalazar 9:9fade4bb2774 209 return addr_arg(addr)
MarceloSalazar 9:9fade4bb2774 210
MarceloSalazar 9:9fade4bb2774 211 # specify arguments
MarceloSalazar 9:9fade4bb2774 212 parser.add_argument('-m', '--mcu', type=lambda s : s.lower().replace("-","_"), required=False,
MarceloSalazar 9:9fade4bb2774 213 help='mcu', choices=bin_map.keys())
MarceloSalazar 9:9fade4bb2774 214 parser.add_argument('-b', '--bootloader', type=argparse.FileType('rb'), required=False,
MarceloSalazar 9:9fade4bb2774 215 help='path to the bootloader binary')
MarceloSalazar 9:9fade4bb2774 216 parser.add_argument('-a', '--app', type=argparse.FileType('rb'), required=True,
MarceloSalazar 9:9fade4bb2774 217 help='path to application binary')
MarceloSalazar 9:9fade4bb2774 218 parser.add_argument('-c', '--app-addr', type=addr_arg, required=False,
MarceloSalazar 9:9fade4bb2774 219 help='address of the application')
MarceloSalazar 9:9fade4bb2774 220 parser.add_argument('-d', '--header-addr', type=addr_arg, required=False,
MarceloSalazar 9:9fade4bb2774 221 help='address of the firmware metadata header')
MarceloSalazar 9:9fade4bb2774 222 parser.add_argument('-o', '--output', type=argparse.FileType('wb'), required=True,
MarceloSalazar 9:9fade4bb2774 223 help='output combined file path')
MarceloSalazar 9:9fade4bb2774 224 parser.add_argument('-s', '--set-version', type=int, required=False,
MarceloSalazar 9:9fade4bb2774 225 help='set version number', default=int(time.time()))
MarceloSalazar 9:9fade4bb2774 226 parser.add_argument('-nb', '--no-bootloader',action='store_true', required=False,
MarceloSalazar 9:9fade4bb2774 227 help='Produce output without bootloader. The output only '+
MarceloSalazar 9:9fade4bb2774 228 'contains header + app. requires hex output format')
MarceloSalazar 9:9fade4bb2774 229
MarceloSalazar 9:9fade4bb2774 230 # workaround for http://bugs.python.org/issue9694
MarceloSalazar 9:9fade4bb2774 231 parser._optionals.title = "arguments"
MarceloSalazar 9:9fade4bb2774 232
MarceloSalazar 9:9fade4bb2774 233 # get and validate arguments
MarceloSalazar 9:9fade4bb2774 234 args = parser.parse_args()
MarceloSalazar 9:9fade4bb2774 235
MarceloSalazar 9:9fade4bb2774 236 # validate the output format
MarceloSalazar 9:9fade4bb2774 237 f = args.output.name.split('.')[-1]
MarceloSalazar 9:9fade4bb2774 238 if f == 'hex':
MarceloSalazar 9:9fade4bb2774 239 output_format = 'hex'
MarceloSalazar 9:9fade4bb2774 240 elif f == 'bin':
MarceloSalazar 9:9fade4bb2774 241 output_format = 'bin'
MarceloSalazar 9:9fade4bb2774 242 else:
MarceloSalazar 9:9fade4bb2774 243 print('Output format can only be .bin or .hex')
MarceloSalazar 9:9fade4bb2774 244 exit(-1)
MarceloSalazar 9:9fade4bb2774 245
MarceloSalazar 9:9fade4bb2774 246 # validate no-bootloader option
MarceloSalazar 9:9fade4bb2774 247 if args.no_bootloader and output_format == 'bin':
MarceloSalazar 9:9fade4bb2774 248 print('--no-bootloader option requires the output format to be .hex')
MarceloSalazar 9:9fade4bb2774 249 exit(-1)
MarceloSalazar 9:9fade4bb2774 250
MarceloSalazar 9:9fade4bb2774 251 # validate that we can find a bootloader or no_bootloader is specified
MarceloSalazar 9:9fade4bb2774 252 bootloader = None
MarceloSalazar 9:9fade4bb2774 253 if not args.no_bootloader:
MarceloSalazar 9:9fade4bb2774 254 if args.mcu and not args.bootloader:
MarceloSalazar 9:9fade4bb2774 255 bl_list = glob("tools/mbed-bootloader-{}-*".format(args.mcu))
MarceloSalazar 9:9fade4bb2774 256 if len(bl_list) == 0:
MarceloSalazar 9:9fade4bb2774 257 print("Specified MCU does not have a binary in this location " + \
MarceloSalazar 9:9fade4bb2774 258 "Please specify bootloader location with -b")
MarceloSalazar 9:9fade4bb2774 259 exit(-1)
MarceloSalazar 9:9fade4bb2774 260 elif len(bl_list) > 1:
MarceloSalazar 9:9fade4bb2774 261 print("Specified MCU have more than one binary in this location " + \
MarceloSalazar 9:9fade4bb2774 262 "Please specify bootloader location with -b")
MarceloSalazar 9:9fade4bb2774 263 print(bl_list)
MarceloSalazar 9:9fade4bb2774 264 exit(-1)
MarceloSalazar 9:9fade4bb2774 265 else:
MarceloSalazar 9:9fade4bb2774 266 fname = bl_list[0]
MarceloSalazar 9:9fade4bb2774 267 bootloader = open(fname, 'rb')
MarceloSalazar 9:9fade4bb2774 268 elif args.bootloader:
MarceloSalazar 9:9fade4bb2774 269 bootloader = args.bootloader
MarceloSalazar 9:9fade4bb2774 270 elif not (args.mcu or args.bootloader):
MarceloSalazar 9:9fade4bb2774 271 print("Please specify bootloader location -b or MCU -m")
MarceloSalazar 9:9fade4bb2774 272 exit(-1)
MarceloSalazar 9:9fade4bb2774 273
MarceloSalazar 9:9fade4bb2774 274 # get the path of bootloader, application and output
MarceloSalazar 9:9fade4bb2774 275 if bootloader:
MarceloSalazar 9:9fade4bb2774 276 bootloader_fn = path.abspath(bootloader.name)
MarceloSalazar 9:9fade4bb2774 277 bootloader.close()
MarceloSalazar 9:9fade4bb2774 278 else:
MarceloSalazar 9:9fade4bb2774 279 bootloader_fn = ''
MarceloSalazar 9:9fade4bb2774 280
MarceloSalazar 9:9fade4bb2774 281 if bootloader_fn.split('.')[-1] != 'hex' and not args.mcu:
MarceloSalazar 9:9fade4bb2774 282 print("Please provide a bootloader in hex format or specify MCU -m")
MarceloSalazar 9:9fade4bb2774 283 exit(-1)
MarceloSalazar 9:9fade4bb2774 284
MarceloSalazar 9:9fade4bb2774 285 app_fn = path.abspath(args.app.name)
MarceloSalazar 9:9fade4bb2774 286 args.app.close()
MarceloSalazar 9:9fade4bb2774 287 output_fn = path.abspath(args.output.name)
MarceloSalazar 9:9fade4bb2774 288 args.output.close()
MarceloSalazar 9:9fade4bb2774 289
MarceloSalazar 9:9fade4bb2774 290 # Use specified addresses or default if none are provided
MarceloSalazar 9:9fade4bb2774 291 app_format = app_fn.split('.')[-1]
MarceloSalazar 9:9fade4bb2774 292 if(not (args.mcu or args.app_addr or app_format == 'hex')):
MarceloSalazar 9:9fade4bb2774 293 print("Please specify app address or MCU")
MarceloSalazar 9:9fade4bb2774 294 exit(-1)
MarceloSalazar 9:9fade4bb2774 295 if app_format != 'hex':
MarceloSalazar 9:9fade4bb2774 296 app_addr = args.app_addr or parse_mbed_app_addr(args.mcu, "target.mbed_app_start")
MarceloSalazar 9:9fade4bb2774 297 else:
MarceloSalazar 9:9fade4bb2774 298 app_addr = None
MarceloSalazar 9:9fade4bb2774 299
MarceloSalazar 9:9fade4bb2774 300 if args.mcu:
MarceloSalazar 9:9fade4bb2774 301 mem_start = addr_arg(bin_map[args.mcu]["mem_start"])
MarceloSalazar 9:9fade4bb2774 302 else:
MarceloSalazar 9:9fade4bb2774 303 mem_start = 0
MarceloSalazar 9:9fade4bb2774 304
MarceloSalazar 9:9fade4bb2774 305 if(not (args.mcu or args.header_addr)):
MarceloSalazar 9:9fade4bb2774 306 print("Please specify header address or MCU")
MarceloSalazar 9:9fade4bb2774 307 exit(-1)
MarceloSalazar 9:9fade4bb2774 308 header_addr = args.header_addr or parse_mbed_app_addr(args.mcu, "update-client.application-details")
MarceloSalazar 9:9fade4bb2774 309
MarceloSalazar 9:9fade4bb2774 310 # combine application and bootloader adding metadata info
MarceloSalazar 9:9fade4bb2774 311 combine(bootloader_fn, app_fn, app_addr, header_addr, mem_start,
MarceloSalazar 9:9fade4bb2774 312 output_fn, args.set_version, args.no_bootloader)
MarceloSalazar 9:9fade4bb2774 313
MarceloSalazar 9:9fade4bb2774 314 # print the output file path
MarceloSalazar 9:9fade4bb2774 315 print('Combined binary:' + output_fn)