Skip to content

Commit 09cdc06

Browse files
committed
Move from tc constructor to config vars
1 parent ae16aa2 commit 09cdc06

File tree

2 files changed

+107
-73
lines changed

2 files changed

+107
-73
lines changed

tools/config/__init__.py

Lines changed: 73 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,25 @@
4141
except NameError:
4242
unicode = str
4343
PATH_OVERRIDES = set(["target.bootloader_img"])
44-
BOOTLOADER_OVERRIDES = set(["target.bootloader_img", "target.restrict_size",
45-
"target.header_format", "target.header_offset",
46-
"target.app_offset",
47-
"target.mbed_app_start", "target.mbed_app_size"])
44+
ROM_OVERRIDES = set([
45+
# managed BL
46+
"target.bootloader_img", "target.restrict_size",
47+
"target.header_format", "target.header_offset",
48+
"target.app_offset",
49+
50+
# unmanaged BL
51+
"target.mbed_app_start", "target.mbed_app_size",
52+
53+
# both
54+
"target.mbed_rom_start", "target.mbed_rom_size",
55+
])
56+
RAM_OVERRIDES = set([
57+
# both
58+
"target.mbed_ram_start", "target.mbed_ram_size",
59+
])
60+
61+
BOOTLOADER_OVERRIDES = ROM_OVERRIDES | RAM_OVERRIDES
62+
4863

4964

5065
# Base class for all configuration exceptions
@@ -355,6 +370,7 @@ def _process_macros(mlist, macros, unit_name, unit_kind):
355370

356371

357372
Region = namedtuple("Region", "name start size active filename")
373+
RamRegion = namedtuple("RamRegion", "name start size active")
358374

359375
class Config(object):
360376
"""'Config' implements the mbed configuration mechanism"""
@@ -525,7 +541,16 @@ def add_config_files(self, flist):
525541
@property
526542
def has_regions(self):
527543
"""Does this config have regions defined?"""
528-
for override in BOOTLOADER_OVERRIDES:
544+
for override in ROM_OVERRIDES:
545+
_, attr = override.split(".")
546+
if getattr(self.target, attr, None):
547+
return True
548+
return False
549+
550+
@property
551+
def has_ram_regions(self):
552+
"""Does this config have regions defined?"""
553+
for override in RAM_OVERRIDES:
529554
_, attr = override.split(".")
530555
if getattr(self.target, attr, None):
531556
return True
@@ -545,9 +570,7 @@ def sectors(self):
545570
return sectors
546571
raise ConfigException("No sector info available")
547572

548-
@property
549-
def regions(self):
550-
"""Generate a list of regions from the config"""
573+
def _get_cmsis_part(self):
551574
if not self.target.bootloader_supported:
552575
raise ConfigException("Bootloader not supported on this target.")
553576
if not hasattr(self.target, "device_name"):
@@ -558,43 +581,63 @@ def regions(self):
558581
raise ConfigException("Bootloader not supported on this target: "
559582
"targets.json `device_name` not found in "
560583
"arm_pack_manager index.")
561-
cmsis_part = cache.index[self.target.device_name]
584+
return cache.index[self.target.device_name]
585+
586+
def _get_mem_specs(self, memories, cmsis_part, exception_text):
587+
for memory in memories:
588+
try:
589+
size = cmsis_part['memory']['IRAM1']['size']
590+
start = cmsis_part['memory']['IRAM1']['start']
591+
return (start, size)
592+
except KeyError:
593+
continue
594+
raise ConfigException(exception_text)
595+
596+
@property
597+
def ram_regions(self):
598+
"""Generate a list of ram regions from the config"""
599+
cmsis_part = self._get_cmsis_part()
600+
ram_start, ram_size = self._get_mem_specs(
601+
["IRAM1", "SRAM0"],
602+
cmsis_part,
603+
"Not enough information in CMSIS packs to build a ram sharing project"
604+
)
605+
# Override ram_start/ram_size
606+
#
607+
# This is usually done for a target which:
608+
# 1. Doesn't support CMSIS pack, or
609+
# 2. Supports TrustZone and user needs to change its flash partition
610+
ram_start = getattr(self.target, "mbed_ram_start", False) or ram_start
611+
ram_size = getattr(self.target, "mbed_ram_size", False) or ram_size
612+
return [RamRegion("application_ram", int(ram_start, 0), int(ram_size, 0), True)]
613+
614+
@property
615+
def regions(self):
616+
"""Generate a list of regions from the config"""
617+
cmsis_part = self._get_cmsis_part()
562618
if ((self.target.bootloader_img or self.target.restrict_size) and
563619
(self.target.mbed_app_start or self.target.mbed_app_size)):
564620
raise ConfigException(
565621
"target.bootloader_img and target.restirct_size are "
566622
"incompatible with target.mbed_app_start and "
567623
"target.mbed_app_size")
568-
try:
569-
rom_size = int(cmsis_part['memory']['IROM1']['size'], 0)
570-
rom_start = int(cmsis_part['memory']['IROM1']['start'], 0)
571-
except KeyError:
572-
try:
573-
rom_size = int(cmsis_part['memory']['PROGRAM_FLASH']['size'], 0)
574-
rom_start = int(cmsis_part['memory']['PROGRAM_FLASH']['start'], 0)
575-
except KeyError:
576-
raise ConfigException("Not enough information in CMSIS packs to "
577-
"build a bootloader project")
578-
624+
rom_start, rom_size = self._get_mem_specs(
625+
["IROM1", "PROMGRAM_FLASH"],
626+
cmsis_part,
627+
"Not enough information in CMSIS packs to build a bootloader project"
628+
)
579629
# Override rom_start/rom_size
580630
#
581631
# This is usually done for a target which:
582632
# 1. Doesn't support CMSIS pack, or
583633
# 2. Supports TrustZone and user needs to change its flash partition
584-
rom_start_override = getattr(self.target, "mbed_rom_start", False)
585-
if rom_start_override:
586-
rom_start = int(rom_start_override, 0)
587-
rom_size_override = getattr(self.target, "mbed_rom_size", False)
588-
if rom_size_override:
589-
rom_size = int(rom_size_override, 0)
634+
rom_start = int(getattr(self.target, "mbed_rom_start", False) or rom_start, 0)
635+
rom_size = int(getattr(self.target, "mbed_rom_size", False) or rom_size, 0)
590636

591637
if self.target.bootloader_img or self.target.restrict_size:
592638
return self._generate_bootloader_build(rom_start, rom_size)
593-
elif self.target.mbed_app_start or self.target.mbed_app_size:
594-
return self._generate_linker_overrides(rom_start, rom_size)
595639
else:
596-
raise ConfigException(
597-
"Bootloader build requested but no bootlader configuration")
640+
return self._generate_linker_overrides(rom_start, rom_size)
598641

599642
@staticmethod
600643
def header_member_size(member):

tools/toolchains/__init__.py

Lines changed: 34 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -462,32 +462,6 @@ def __init__(self, target, notify=None, macros=None, build_profile=None,
462462
if 'UVISOR' in self.target.features and 'UVISOR_SUPPORTED' in self.target.extra_labels:
463463
self.target.core = re.sub(r"F$", '', self.target.core)
464464

465-
# Pass flash information (MBED_ROM_START/MBED_ROM_SIZE) to compiler/linker
466-
# if target configuration options (mbed_rom_start/mbed_rom_size) are defined.
467-
rom_start_override = getattr(self.target, "mbed_rom_start", False)
468-
if rom_start_override:
469-
self.macros.append("MBED_ROM_START=0x%x" % int(rom_start_override, 0))
470-
_ = self.make_ld_define("MBED_ROM_START", int(rom_start_override, 0))
471-
self.flags["ld"].append(_)
472-
rom_size_override = getattr(self.target, "mbed_rom_size", False)
473-
if rom_size_override:
474-
self.macros.append("MBED_ROM_SIZE=0x%x" % int(rom_size_override, 0))
475-
_ = self.make_ld_define("MBED_ROM_SIZE", int(rom_size_override, 0))
476-
self.flags["ld"].append(_)
477-
478-
# Pass SRAM information (MBED_RAM_START/MBED_RAM_SIZE) to compiler/linker
479-
# if target configuration options (mbed_ram_start/mbed_ram_size) are defined.
480-
ram_start_override = getattr(self.target, "mbed_ram_start", False)
481-
if ram_start_override:
482-
self.macros.append("MBED_RAM_START=0x%x" % int(ram_start_override, 0))
483-
_ = self.make_ld_define("MBED_RAM_START", int(ram_start_override, 0))
484-
self.flags["ld"].append(_)
485-
ram_size_override = getattr(self.target, "mbed_ram_size", False)
486-
if ram_size_override:
487-
self.macros.append("MBED_RAM_SIZE=0x%x" % int(ram_size_override, 0))
488-
_ = self.make_ld_define("MBED_RAM_SIZE", int(ram_size_override, 0))
489-
self.flags["ld"].append(_)
490-
491465
# Stats cache is used to reduce the amount of IO requests to stat
492466
# header files during dependency change. See need_update()
493467
self.stat_cache = {}
@@ -1210,33 +1184,50 @@ def mem_stats(self, map):
12101184

12111185
return None
12121186

1213-
def add_regions(self):
1214-
"""Add regions to the build profile, if there are any.
1215-
"""
1216-
regions = list(self.config.regions)
1217-
self.notify.info("Using regions %s in this build."
1218-
% ", ".join(region.name for region in regions))
1219-
for region in regions:
1220-
for define in [(region.name.upper() + "_ADDR", region.start),
1221-
(region.name.upper() + "_SIZE", region.size)]:
1222-
define_string = "-D%s=0x%x" % define
1223-
self.cc.append(define_string)
1224-
self.cppc.append(define_string)
1225-
self.flags["common"].append(define_string)
1187+
def _add_defines_from_region(self, region):
1188+
for define in [(region.name.upper() + "_ADDR", region.start),
1189+
(region.name.upper() + "_SIZE", region.size)]:
1190+
define_string = "-D%s=0x%x" % define
1191+
self.cc.append(define_string)
1192+
self.cppc.append(define_string)
1193+
self.flags["common"].append(define_string)
1194+
1195+
def _add_all_regions(self, region_list, active_region_name):
1196+
for region in region_list:
1197+
self._add_defines_from_region(region)
12261198
if region.active:
1227-
for define in [("MBED_APP_START", region.start),
1228-
("MBED_APP_SIZE", region.size)]:
1199+
for define in [
1200+
("%s_START" % active_region_name, region.start),
1201+
("%s_SIZE" % active_region_name, region.size)
1202+
]:
12291203
define_string = self.make_ld_define(*define)
12301204
self.ld.append(define_string)
12311205
self.flags["ld"].append(define_string)
12321206
self.notify.info(" Region %s: size 0x%x, offset 0x%x"
12331207
% (region.name, region.size, region.start))
12341208

1209+
def add_regions(self):
1210+
"""Add regions to the build profile, if there are any.
1211+
"""
1212+
if self.config.has_regions:
1213+
regions = list(self.config.regions)
1214+
self.notify.info("Using ROM region%s %s in this build." % (
1215+
"s" if len(regions) > 1 else "",
1216+
", ".join(r.name for r in regions)
1217+
))
1218+
self._add_all_regions(regions, "MBED_APP")
1219+
if self.config.has_ram_regions:
1220+
regions = list(self.config.ram_regions)
1221+
self.notify.info("Using RAM region%s %s in this build." % (
1222+
"s" if len(regions) > 1 else "",
1223+
", ".join(r.name for r in regions)
1224+
))
1225+
self._add_all_regions(regions, "MBED_RAM")
1226+
12351227
# Set the configuration data
12361228
def set_config_data(self, config_data):
12371229
self.config_data = config_data
1238-
if self.config.has_regions:
1239-
self.add_regions()
1230+
self.add_regions()
12401231

12411232
# Creates the configuration header if needed:
12421233
# - if there is no configuration data, "mbed_config.h" is not create (or deleted if it exists).

0 commit comments

Comments
 (0)