Skip to content

Commit 9f99330

Browse files
committed
Allow overriding offsets with "app_offset" and "header_offset"
1 parent deca33f commit 9f99330

File tree

3 files changed

+36
-5
lines changed

3 files changed

+36
-5
lines changed

tools/build_api.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
from .arm_pack_manager import Cache
3737
from .utils import (mkdir, run_cmd, run_cmd_ext, NotSupportedException,
3838
ToolException, InvalidReleaseTargetException,
39-
intelhex_offset)
39+
intelhex_offset, integer)
4040
from .paths import (MBED_CMSIS_PATH, MBED_TARGETS_PATH, MBED_LIBRARIES,
4141
MBED_HEADER, MBED_DRIVERS, MBED_PLATFORM, MBED_HAL,
4242
MBED_CONFIG_FILE, MBED_LIBRARIES_DRIVERS,
@@ -353,6 +353,7 @@ def _real_region_size(region):
353353
except AttributeError:
354354
return region.size
355355

356+
356357
def _fill_header(region_list, current_region):
357358
"""Fill an application header region
358359
@@ -373,7 +374,7 @@ def _fill_header(region_list, current_region):
373374
"8le": ">B", "16le": "<H", "32le": "<L", "64le": "<Q",
374375
"8be": "<B", "16be": ">H", "32be": ">L", "64be": ">Q"
375376
}[subtype]
376-
header.puts(start, struct.pack(fmt, int(data, 0)))
377+
header.puts(start, struct.pack(fmt, integer(data, 0)))
377378
elif type == "timestamp":
378379
fmt = {"32le": "<L", "64le": "<Q",
379380
"32be": ">L", "64be": ">Q"}[subtype]

tools/config/__init__.py

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
from jinja2.environment import Environment
3131
from jsonschema import Draft4Validator, RefResolver
3232

33-
from ..utils import json_file_to_dict, intelhex_offset
33+
from ..utils import json_file_to_dict, intelhex_offset, integer
3434
from ..arm_pack_manager import Cache
3535
from ..targets import (CUMULATIVE_ATTRIBUTES, TARGET_MAP, generate_py_target,
3636
get_resolution_order, Target)
@@ -41,9 +41,11 @@
4141
unicode = str
4242
PATH_OVERRIDES = set(["target.bootloader_img"])
4343
BOOTLOADER_OVERRIDES = set(["target.bootloader_img", "target.restrict_size",
44-
"target.header_format",
44+
"target.header_format", "target.header_offset",
45+
"target.app_offset",
4546
"target.mbed_app_start", "target.mbed_app_size"])
4647

48+
4749
# Base class for all configuration exceptions
4850
class ConfigException(Exception):
4951
"""Config system only exception. Makes it easier to distinguish config
@@ -589,13 +591,21 @@ def header_member_size(member):
589591
def _header_size(format):
590592
return sum(Config.header_member_size(m) for m in format)
591593

592-
def _make_header_region(self, start, header_format):
594+
def _make_header_region(self, start, header_format, offset=None):
593595
size = self._header_size(header_format)
594596
region = Region("header", start, size, False, None)
595597
start += size
596598
start = ((start + 7) // 8) * 8
597599
return (start, region)
598600

601+
@staticmethod
602+
def _assign_new_offset(rom_start, start, new_offset, region_name):
603+
newstart = rom_start + integer(new_offset, 0)
604+
if newstart < start:
605+
raise ConfigException(
606+
"Can not place % region inside previous region" % region_name)
607+
return newstart
608+
599609
def _generate_bootloader_build(self, rom_start, rom_size):
600610
start = rom_start
601611
rom_end = rom_start + rom_size
@@ -617,6 +627,9 @@ def _generate_bootloader_build(self, rom_start, rom_size):
617627
filename)
618628
start = rom_start + part_size
619629
if self.target.header_format:
630+
if self.target.header_offset:
631+
start = self._assign_new_offset(
632+
rom_start, start, self.target.header_offset, "header")
620633
start, region = self._make_header_region(
621634
start, self.target.header_format)
622635
yield region._replace(filename=self.target.header_format)
@@ -626,12 +639,21 @@ def _generate_bootloader_build(self, rom_start, rom_size):
626639
yield Region("application", start, new_size, True, None)
627640
start += new_size
628641
if self.target.header_format:
642+
if self.target.header_offset:
643+
start = self._assign_new_offset(
644+
rom_start, start, self.target.header_offset, "header")
629645
start, region = self._make_header_region(
630646
start, self.target.header_format)
631647
yield region
648+
if self.target.app_offset:
649+
start = self._assign_new_offset(
650+
rom_start, start, self.target.app_offset, "application")
632651
yield Region("post_application", start, rom_end - start,
633652
False, None)
634653
else:
654+
if self.target.app_offset:
655+
start = self._assign_new_offset(
656+
rom_start, start, self.target.app_offset, "application")
635657
yield Region("application", start, rom_end - start,
636658
True, None)
637659
if start > rom_start + rom_size:

tools/utils.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -539,3 +539,11 @@ def intelhex_offset(filename, offset):
539539
raise ToolException("File %s does not have a known binary file type"
540540
% filename)
541541
return ih
542+
543+
544+
def integer(maybe_string, base):
545+
"""Make an integer of a number or a string"""
546+
if isinstance(maybe_string, int):
547+
return maybe_string
548+
else:
549+
return int(maybe_string, base)

0 commit comments

Comments
 (0)