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.
tools/combine_bootloader_with_app.py@7:f3c46cdb5ccf, 2018-12-14 (annotated)
- 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?
User | Revision | Line number | New 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) |