diff --git a/tools/build_api.py b/tools/build_api.py index 5c606ff356..70af5ee94b 100644 --- a/tools/build_api.py +++ b/tools/build_api.py @@ -425,11 +425,11 @@ def merge_region_list(region_list, destination, notify, padding=b'\xFF'): notify.info(" Filling region %s with %s" % (region.name, region.filename)) part = intelhex_offset(region.filename, offset=region.start) part.start_addr = None - if len(part.segments()) == 1: - part_size = (part.maxaddr() - part.minaddr()) + 1 - else: - # make same assumption as in region builder; first segments must fit. - part_size = part.segments()[0][1] - part.segments()[0][0] + + # make same assumption as in region builder; first segment must fit. + # this is only to get a neat ToolException anyway, since IntelHex.merge will + # throw intelhex.AddressOverlapError if there's overlapping + part_size = part.segments()[0][1] - part.segments()[0][0] if part_size > region.size: raise ToolException("Contents of region %s does not fit" diff --git a/tools/config/__init__.py b/tools/config/__init__.py index 87c0b31773..b60eeda2fa 100644 --- a/tools/config/__init__.py +++ b/tools/config/__init__.py @@ -798,19 +798,16 @@ class Config(object): if part.minaddr() != rom_start: raise ConfigException("bootloader executable does not " "start at 0x%x" % rom_start) - if len(part.segments()) == 1: - part_size = (part.maxaddr() - part.minaddr()) + 1 - part_size = Config._align_ceiling(rom_start + part_size, self.sectors) - rom_start - else: - # assume first segment is at start + + # segments returns start address and 'next after end' address + part_size = part.segments()[0][1] - part.segments()[0][0] + part_size = Config._align_ceiling(rom_start + part_size, self.sectors) - rom_start + + if len(part.segments()) > 1 and part.segments()[1][0] < rom_end: + # assume first segment is at start (already checked earlier as segments are returned in order) # second at the end or outside ROM # rest outside regular ROM - if part.segments()[0][0] != rom_start: - raise ConfigException("bootloader segments not in order") - part_size = part.segments()[0][1] - part.segments()[0][0] - part_size = Config._align_ceiling(rom_start + part_size, self.sectors) - rom_start - if part.segments()[1][0] < rom_end: - max_app_addr = part.segments()[1][0] + max_app_addr = part.segments()[1][0] yield Region("bootloader", rom_start, part_size, False, filename)