This repository contains the example code to: 1) Connect RTL8195AM board to Pelion 2) Enable and run firmware update on RTL8195AM

RTL8195AM SMCC application demonstrates how to create a Simple Mbed Cloud Client application that can connect to Pelion, register resources and get FW updates.

Committer:
Lu Zhang
Date:
Fri Dec 14 18:59:27 2018 +0800
Revision:
7:f3c46cdb5ccf
Parent:
2:84cd7fec6fda
Update mbed-os.lib link to the master repository (14 Dec 2018)

Who changed what in which revision?

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