diff options
| author | Daniel Thompson <daniel.thompson@linaro.org> | 2020-01-14 21:32:59 (GMT) |
|---|---|---|
| committer | Daniel Thompson <daniel.thompson@linaro.org> | 2020-01-14 21:32:59 (GMT) |
| commit | 88e736c9e91d02178a11a15ff572cab99c910ad1 (patch) | |
| tree | f7af8f634d41768f9750b5054bd8c10af57e9478 /tools | |
Initial revision
This is a just a rather hacky combined build environment.
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/hexmerge.py | 178 | ||||
| m--------- | tools/intelhex | 0 | ||||
| m--------- | tools/nrfutil | 0 |
3 files changed, 178 insertions, 0 deletions
diff --git a/tools/hexmerge.py b/tools/hexmerge.py new file mode 100644 index 0000000..fc6877e --- /dev/null +++ b/tools/hexmerge.py @@ -0,0 +1,178 @@ +#!/usr/bin/python + +# Copyright (c) 2008-2018 Alexander Belchenko +# All rights reserved. +# +# Redistribution and use in source and binary forms, +# with or without modification, are permitted provided +# that the following conditions are met: +# +# * Redistributions of source code must retain +# the above copyright notice, this list of conditions +# and the following disclaimer. +# * Redistributions in binary form must reproduce +# the above copyright notice, this list of conditions +# and the following disclaimer in the documentation +# and/or other materials provided with the distribution. +# * Neither the name of the author nor the names +# of its contributors may be used to endorse +# or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, +# BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY +# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +# IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, +# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, +# OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED +# AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, +# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, +# EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +"""Merge content of several hex files into one file.""" + +VERSION = '2.2' + +USAGE = '''hexmerge: merge content of hex files. +Usage: + python hexmerge.py [options] FILES... + +Options: + -h, --help this help message. + -v, --version version info. + -o, --output=FILENAME output file name (emit output to stdout + if option is not specified) + -r, --range=START:END specify address range for output + (ascii hex value). Both values are inclusive. + Range can be in form 'START:' or ':END'. + --no-start-addr Don't write start addr to output file. + --overlap=METHOD What to do when data in files overlapped. + Supported variants: + * error -- stop and show error message (default) + * ignore -- keep data from first file that + contains data at overlapped address + * replace -- use data from last file that + contains data at overlapped address + +Arguments: + FILES list of hex files for merging + (use '-' to read content from stdin) + +You can specify address range for each file in the form: + + filename:START:END + +See description of range option above. + +You can omit START or END, so supported variants are: + + filename:START: read filename and use data starting from START addr + filename::END read filename and use data till END addr + +Use entire file content: + + filename +or + filename:: +''' + +import sys + + +def main(args=None): + import getopt + + output = None + start = None + end = None + write_start_addr = True + overlap = 'error' + + if args is None: + args = sys.argv[1:] + try: + opts, args = getopt.gnu_getopt(args, 'hvo:r:', + ['help', 'version', + 'output=', 'range=', + 'no-start-addr', 'overlap=', + ]) + + for o,a in opts: + if o in ('-h', '--help'): + print(USAGE) + return 0 + elif o in ('-v', '--version'): + print(VERSION) + return 0 + elif o in ('-o', '--output'): + output = a + elif o in ("-r", "--range"): + try: + l = a.split(":") + if l[0] != '': + start = int(l[0], 16) + if l[1] != '': + end = int(l[1], 16) + except (ValueError, IndexError): + raise getopt.GetoptError('Bad range value(s)') + elif o == '--no-start-addr': + write_start_addr = False + elif o == '--overlap': + if a in ('error', 'ignore', 'replace'): + overlap = a + else: + raise getopt.GetoptError('Bad overlap value') + + if len(args) == 0: + raise getopt.GetoptError('You should specify file list') + + except getopt.GetoptError: + e = sys.exc_info()[1] # current exception + sys.stderr.write(str(e)+"\n") + sys.stderr.write(USAGE+"\n") + return 1 + + import intelhex + # TODO: move actual merge code into intelhex package as helper function + # and write couple of tests for it. + res = intelhex.IntelHex() + + def end_addr_inclusive(addr): + if addr is not None: + return addr + 1 + return addr + + for f in args: + try: + fname, fstart, fend = intelhex._get_file_and_addr_range(f) + except intelhex._BadFileNotation: + sys.stderr.write('Bad argument: "%s"\n' % f) + sys.stderr.write(USAGE+"\n") + return 1 + if fname == '-': + fname = sys.stdin + ih = intelhex.IntelHex(fname) + if (fstart, fend) != (None, None): + ih = ih[fstart:end_addr_inclusive(fend)] + try: + res.merge(ih, overlap) + except intelhex.AddressOverlapError: + e = sys.exc_info()[1] # current exception + sys.stderr.write('Merging: '+fname+"\n") + sys.stderr.write(str(e)+"\n") + return 1 + + if (start, end) != (None, None): + res = res[start:end_addr_inclusive(end)] + if output is None: + output = sys.stdout + res.write_hex_file(output, write_start_addr) + return 0 + + +if __name__ == '__main__': + sys.exit(main()) diff --git a/tools/intelhex b/tools/intelhex new file mode 160000 +Subproject 5c15003d08bf53512d5eaa54c7d2825a8b5c37c diff --git a/tools/nrfutil b/tools/nrfutil new file mode 160000 +Subproject 7a327fdeac63343d8aa4c778b015d735cdba50b |
