Skip to content

Commit a162589

Browse files
author
Cruz Monrreal
authored
Merge pull request #8097 from JammuKekkonen/fix_bootloader_build_for_nrf52
Add support for nrf52_dk bootloader
2 parents 53c03f9 + 38ce7b1 commit a162589

File tree

2 files changed

+32
-21
lines changed

2 files changed

+32
-21
lines changed

tools/build_api.py

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -400,6 +400,7 @@ def _fill_header(region_list, current_region):
400400
start += Config.header_member_size(member)
401401
return header
402402

403+
403404
def merge_region_list(region_list, destination, notify, padding=b'\xFF'):
404405
"""Merge the region_list into a single image
405406
@@ -410,7 +411,6 @@ def merge_region_list(region_list, destination, notify, padding=b'\xFF'):
410411
"""
411412
merged = IntelHex()
412413
_, format = splitext(destination)
413-
414414
notify.info("Merging Regions")
415415

416416
for region in region_list:
@@ -425,20 +425,17 @@ def merge_region_list(region_list, destination, notify, padding=b'\xFF'):
425425
notify.info(" Filling region %s with %s" % (region.name, region.filename))
426426
part = intelhex_offset(region.filename, offset=region.start)
427427
part.start_addr = None
428-
part_size = (part.maxaddr() - part.minaddr()) + 1
429-
if part_size > region.size:
430-
raise ToolException("Contents of region %s does not fit"
431-
% region.name)
432428
merged.merge(part)
433-
pad_size = region.size - part_size
434-
if pad_size > 0 and region != region_list[-1]:
435-
notify.info(" Padding region %s with 0x%x bytes" %
436-
(region.name, pad_size))
437-
if format is ".hex":
438-
"""The offset will be in the hex file generated when we're done,
439-
so we can skip padding here"""
440-
else:
441-
merged.puts(merged.maxaddr() + 1, padding * pad_size)
429+
430+
# Hex file can have gaps, so no padding needed. While other formats may
431+
# need padding. Iterate through segments and pad the gaps.
432+
if format != ".hex":
433+
# begin patching from the end of the first segment
434+
_, begin = merged.segments()[0]
435+
for start, stop in merged.segments()[1:]:
436+
pad_size = start - begin
437+
merged.puts(begin, padding * pad_size)
438+
begin = stop + 1
442439

443440
if not exists(dirname(destination)):
444441
makedirs(dirname(destination))

tools/config/__init__.py

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -778,7 +778,7 @@ def _assign_new_offset(rom_start, start, new_offset, region_name):
778778
newstart = rom_start + integer(new_offset, 0)
779779
if newstart < start:
780780
raise ConfigException(
781-
"Can not place % region inside previous region" % region_name)
781+
"Can not place %r region inside previous region" % region_name)
782782
return newstart
783783

784784
def _generate_bootloader_build(self, rom_memories):
@@ -797,8 +797,19 @@ def _generate_bootloader_build(self, rom_memories):
797797
if part.minaddr() != rom_start:
798798
raise ConfigException("bootloader executable does not "
799799
"start at 0x%x" % rom_start)
800-
part_size = (part.maxaddr() - part.minaddr()) + 1
801-
part_size = Config._align_ceiling(rom_start + part_size, self.sectors) - rom_start
800+
801+
# find the last valid address that's within rom_end and use that
802+
# to compute the bootloader size
803+
end_address = None
804+
for start, stop in part.segments():
805+
if (stop < rom_end):
806+
end_address = stop
807+
else:
808+
break
809+
if end_address == None:
810+
raise ConfigException("bootloader segments don't fit within rom region")
811+
part_size = Config._align_ceiling(end_address, self.sectors) - rom_start
812+
802813
yield Region("bootloader", rom_start, part_size, False,
803814
filename)
804815
start = rom_start + part_size
@@ -809,9 +820,14 @@ def _generate_bootloader_build(self, rom_memories):
809820
start, region = self._make_header_region(
810821
start, self.target.header_format)
811822
yield region._replace(filename=self.target.header_format)
823+
812824
if self.target.restrict_size is not None:
813825
new_size = int(self.target.restrict_size, 0)
814826
new_size = Config._align_floor(start + new_size, self.sectors) - start
827+
828+
if self.target.app_offset:
829+
start = self._assign_new_offset(rom_start, start, self.target.app_offset, "application")
830+
815831
yield Region("application", start, new_size, True, None)
816832
start += new_size
817833
if self.target.header_format and not self.target.bootloader_img:
@@ -821,9 +837,7 @@ def _generate_bootloader_build(self, rom_memories):
821837
start, region = self._make_header_region(
822838
start, self.target.header_format)
823839
yield region
824-
if self.target.app_offset:
825-
start = self._assign_new_offset(
826-
rom_start, start, self.target.app_offset, "application")
840+
827841
yield Region("post_application", start, rom_end - start,
828842
False, None)
829843
else:
@@ -832,7 +846,7 @@ def _generate_bootloader_build(self, rom_memories):
832846
rom_start, start, self.target.app_offset, "application")
833847
yield Region("application", start, rom_end - start,
834848
True, None)
835-
if start > rom_start + rom_size:
849+
if start > rom_end:
836850
raise ConfigException("Not enough memory on device to fit all "
837851
"application regions")
838852

0 commit comments

Comments
 (0)