Håkon Øye Amundsen | 81c6662 | 2018-10-30 07:39:13 +0000 | [diff] [blame] | 1 | #!/usr/bin/env python3 |
| 2 | # |
| 3 | # Copyright (c) 2018 Nordic Semiconductor ASA |
| 4 | # |
| 5 | # SPDX-License-Identifier: Apache-2.0 |
| 6 | |
| 7 | # This merges a set of input hex files into a single output hex file. |
| 8 | # Any conflicts will result in an error being reported. |
| 9 | |
| 10 | from intelhex import IntelHex |
Sebastian Bøe | 6d8d444 | 2019-01-16 14:23:40 +0100 | [diff] [blame] | 11 | from intelhex import AddressOverlapError |
Håkon Øye Amundsen | 81c6662 | 2018-10-30 07:39:13 +0000 | [diff] [blame] | 12 | |
| 13 | import argparse |
| 14 | |
| 15 | |
Øyvind Rønningstad | 79d2e31 | 2019-05-15 10:33:09 +0200 | [diff] [blame] | 16 | def merge_hex_files(output, input_hex_files, overlap): |
Håkon Øye Amundsen | 81c6662 | 2018-10-30 07:39:13 +0000 | [diff] [blame] | 17 | ih = IntelHex() |
| 18 | |
| 19 | for hex_file_path in input_hex_files: |
| 20 | to_merge = IntelHex(hex_file_path) |
| 21 | |
Sebastian Bøe | 6d8d444 | 2019-01-16 14:23:40 +0100 | [diff] [blame] | 22 | # Since 'arm-none-eabi-objcopy' incorrectly inserts record |
| 23 | # type '03 - Start Segment Address', we need to remove the |
| 24 | # start_addr to avoid conflicts when merging. |
Håkon Øye Amundsen | 81c6662 | 2018-10-30 07:39:13 +0000 | [diff] [blame] | 25 | to_merge.start_addr = None |
| 26 | |
Sebastian Bøe | 6d8d444 | 2019-01-16 14:23:40 +0100 | [diff] [blame] | 27 | try: |
Øyvind Rønningstad | 79d2e31 | 2019-05-15 10:33:09 +0200 | [diff] [blame] | 28 | ih.merge(to_merge, overlap=overlap) |
Ulf Magnusson | 12ba9df | 2019-03-19 19:28:24 +0100 | [diff] [blame] | 29 | except AddressOverlapError: |
Sebastian Bøe | 6d8d444 | 2019-01-16 14:23:40 +0100 | [diff] [blame] | 30 | raise AddressOverlapError("{} has merge issues".format(hex_file_path)) |
| 31 | |
Håkon Øye Amundsen | 81c6662 | 2018-10-30 07:39:13 +0000 | [diff] [blame] | 32 | ih.write_hex_file(output) |
| 33 | |
| 34 | |
| 35 | def parse_args(): |
| 36 | parser = argparse.ArgumentParser( |
| 37 | description="Merge hex files.", |
| 38 | formatter_class=argparse.RawDescriptionHelpFormatter) |
| 39 | parser.add_argument("-o", "--output", required=False, default="merged.hex", |
| 40 | type=argparse.FileType('w', encoding='UTF-8'), |
| 41 | help="Output file name.") |
Øyvind Rønningstad | 79d2e31 | 2019-05-15 10:33:09 +0200 | [diff] [blame] | 42 | parser.add_argument("--overlap", default="error", |
| 43 | help="What to do when files overlap (error, ignore, replace). " |
| 44 | "See IntelHex.merge() for more info.") |
Håkon Øye Amundsen | 81c6662 | 2018-10-30 07:39:13 +0000 | [diff] [blame] | 45 | parser.add_argument("input_files", nargs='*') |
| 46 | return parser.parse_args() |
| 47 | |
| 48 | |
| 49 | def main(): |
| 50 | args = parse_args() |
| 51 | |
Øyvind Rønningstad | 79d2e31 | 2019-05-15 10:33:09 +0200 | [diff] [blame] | 52 | merge_hex_files(args.output, args.input_files, args.overlap) |
Håkon Øye Amundsen | 81c6662 | 2018-10-30 07:39:13 +0000 | [diff] [blame] | 53 | |
| 54 | |
| 55 | if __name__ == "__main__": |
| 56 | main() |