Skip to content

Commit bf3693f

Browse files
authored
Merge pull request #5909 from theotherjimmy/bl-as-config
Let libraries, targets configure bootloader
2 parents f907012 + 6eebc71 commit bf3693f

File tree

7 files changed

+81
-71
lines changed

7 files changed

+81
-71
lines changed

tools/build_api.py

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -284,31 +284,6 @@ def get_mbed_official_release(version):
284284

285285
return mbed_official_release
286286

287-
def add_regions_to_profile(profile, config, toolchain_class):
288-
"""Add regions to the build profile, if there are any.
289-
290-
Positional Arguments:
291-
profile - the profile to update
292-
config - the configuration object that owns the region
293-
toolchain_class - the class of the toolchain being used
294-
"""
295-
if not profile:
296-
return
297-
regions = list(config.regions)
298-
for region in regions:
299-
for define in [(region.name.upper() + "_ADDR", region.start),
300-
(region.name.upper() + "_SIZE", region.size)]:
301-
profile["common"].append("-D%s=0x%x" % define)
302-
active_region = [r for r in regions if r.active][0]
303-
for define in [("MBED_APP_START", active_region.start),
304-
("MBED_APP_SIZE", active_region.size)]:
305-
profile["ld"].append(toolchain_class.make_ld_define(*define))
306-
307-
print("Using regions in this build:")
308-
for region in regions:
309-
print(" Region %s size 0x%x, offset 0x%x"
310-
% (region.name, region.size, region.start))
311-
312287

313288
def prepare_toolchain(src_paths, build_dir, target, toolchain_name,
314289
macros=None, clean=False, jobs=1,
@@ -352,9 +327,6 @@ def prepare_toolchain(src_paths, build_dir, target, toolchain_name,
352327
for key in profile:
353328
profile[key].extend(contents[toolchain_name][key])
354329

355-
if config.has_regions:
356-
add_regions_to_profile(profile, config, cur_tc)
357-
358330
toolchain = cur_tc(target, notify, macros, silent, build_dir=build_dir,
359331
extra_verbose=extra_verbose, build_profile=profile)
360332

tools/config/__init__.py

Lines changed: 43 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
from copy import deepcopy
1919
import os
20-
from os.path import dirname, abspath, exists, join
20+
from os.path import dirname, abspath, exists, join, isabs
2121
import sys
2222
from collections import namedtuple
2323
from os.path import splitext, relpath
@@ -30,6 +30,10 @@
3030
from tools.targets import CUMULATIVE_ATTRIBUTES, TARGET_MAP, \
3131
generate_py_target, get_resolution_order
3232

33+
PATH_OVERRIDES = set(["target.bootloader_img"])
34+
BOOTLOADER_OVERRIDES = set(["target.bootloader_img", "target.restrict_size",
35+
"target.mbed_app_start", "target.mbed_app_size"])
36+
3337
# Base class for all configuration exceptions
3438
class ConfigException(Exception):
3539
"""Config system only exception. Makes it easier to distinguish config
@@ -84,6 +88,8 @@ def get_full_name(name, unit_name, unit_kind, label=None,
8488
else:
8589
prefix = unit_name + '.'
8690
return prefix + name
91+
if name in BOOTLOADER_OVERRIDES:
92+
return name
8793
# The name has a prefix, so check if it is valid
8894
if not allow_prefix:
8995
raise ConfigException("Invalid parameter name '%s' in '%s'" %
@@ -362,8 +368,6 @@ class Config(object):
362368
"artifact_name": str}
363369
}
364370

365-
__unused_overrides = set(["target.bootloader_img", "target.restrict_size",
366-
"target.mbed_app_start", "target.mbed_app_size"])
367371

368372
# Allowed features in configurations
369373
__allowed_features = [
@@ -441,6 +445,9 @@ def __init__(self, tgt, top_level_dirs=None, app_config=None):
441445
self.target = tgt
442446
self.target = deepcopy(self.target)
443447
self.target_labels = self.target.labels
448+
for override in BOOTLOADER_OVERRIDES:
449+
_, attr = override.split(".")
450+
setattr(self.target, attr, None)
444451

445452
self.cumulative_overrides = {key: ConfigCumulativeOverride(key)
446453
for key in CUMULATIVE_ATTRIBUTES}
@@ -488,15 +495,11 @@ def add_config_files(self, flist):
488495
@property
489496
def has_regions(self):
490497
"""Does this config have regions defined?"""
491-
if 'target_overrides' in self.app_config_data:
492-
target_overrides = self.app_config_data['target_overrides'].get(
493-
self.target.name, {})
494-
return ('target.bootloader_img' in target_overrides or
495-
'target.restrict_size' in target_overrides or
496-
'target.mbed_app_start' in target_overrides or
497-
'target.mbed_app_size' in target_overrides)
498-
else:
499-
return False
498+
for override in BOOTLOADER_OVERRIDES:
499+
_, attr = override.split(".")
500+
if getattr(self.target, attr, None):
501+
return True
502+
return False
500503

501504
@property
502505
def sectors(self):
@@ -526,12 +529,8 @@ def regions(self):
526529
"targets.json `device_name` not found in "
527530
"arm_pack_manager index.")
528531
cmsis_part = cache.index[self.target.device_name]
529-
target_overrides = self.app_config_data['target_overrides'].get(
530-
self.target.name, {})
531-
if (('target.bootloader_img' in target_overrides or
532-
'target.restrict_size' in target_overrides) and
533-
('target.mbed_app_start' in target_overrides or
534-
'target.mbed_app_size' in target_overrides)):
532+
if ((self.target.bootloader_img or self.target.restrict_size) and
533+
(self.target.mbed_app_start or self.target.mbed_app_size)):
535534
raise ConfigException(
536535
"target.bootloader_img and target.restirct_size are "
537536
"incompatible with target.mbed_app_start and "
@@ -546,23 +545,22 @@ def regions(self):
546545
except KeyError:
547546
raise ConfigException("Not enough information in CMSIS packs to "
548547
"build a bootloader project")
549-
if ('target.bootloader_img' in target_overrides or
550-
'target.restrict_size' in target_overrides):
551-
return self._generate_bootloader_build(target_overrides,
552-
rom_start, rom_size)
553-
elif ('target.mbed_app_start' in target_overrides or
554-
'target.mbed_app_size' in target_overrides):
555-
return self._generate_linker_overrides(target_overrides,
556-
rom_start, rom_size)
548+
if self.target.bootloader_img or self.target.restrict_size:
549+
return self._generate_bootloader_build(rom_start, rom_size)
550+
elif self.target.mbed_app_start or self.target.mbed_app_size:
551+
return self._generate_linker_overrides(rom_start, rom_size)
557552
else:
558553
raise ConfigException(
559554
"Bootloader build requested but no bootlader configuration")
560555

561-
def _generate_bootloader_build(self, target_overrides, rom_start, rom_size):
556+
def _generate_bootloader_build(self, rom_start, rom_size):
562557
start = rom_start
563-
if 'target.bootloader_img' in target_overrides:
564-
basedir = abspath(dirname(self.app_config_location))
565-
filename = join(basedir, target_overrides['target.bootloader_img'])
558+
if self.target.bootloader_img:
559+
if isabs(self.target.bootloader_img):
560+
filename = self.target.bootloader_img
561+
else:
562+
basedir = abspath(dirname(self.app_config_location))
563+
filename = join(basedir, self.target.bootloader_img)
566564
if not exists(filename):
567565
raise ConfigException("Bootloader %s not found" % filename)
568566
part = intelhex_offset(filename, offset=rom_start)
@@ -574,8 +572,8 @@ def _generate_bootloader_build(self, target_overrides, rom_start, rom_size):
574572
yield Region("bootloader", rom_start, part_size, False,
575573
filename)
576574
start = rom_start + part_size
577-
if 'target.restrict_size' in target_overrides:
578-
new_size = int(target_overrides['target.restrict_size'], 0)
575+
if self.target.restrict_size is not None:
576+
new_size = int(self.target.restrict_size, 0)
579577
new_size = Config._align_floor(start + new_size, self.sectors) - start
580578
yield Region("application", start, new_size, True, None)
581579
start += new_size
@@ -618,14 +616,13 @@ def report(self):
618616
return {'app_config': self.app_config_location,
619617
'library_configs': map(relpath, self.processed_configs.keys())}
620618

621-
@staticmethod
622-
def _generate_linker_overrides(target_overrides, rom_start, rom_size):
623-
if 'target.mbed_app_start' in target_overrides:
624-
start = int(target_overrides['target.mbed_app_start'], 0)
619+
def _generate_linker_overrides(self, rom_start, rom_size):
620+
if self.target.mbed_app_start is not None:
621+
start = int(self.target.mbed_app_start, 0)
625622
else:
626623
start = rom_start
627-
if 'target.mbed_app_size' in target_overrides:
628-
size = int(target_overrides['target.mbed_app_size'], 0)
624+
if self.target.mbed_app_size is not None:
625+
size = int(self.target.mbed_app_size, 0)
629626
else:
630627
size = (rom_size + rom_start) - start
631628
if start < rom_start:
@@ -695,18 +692,22 @@ def _process_config_and_overrides(self, data, params, unit_name, unit_kind):
695692

696693
# Consider the others as overrides
697694
for name, val in overrides.items():
695+
if (name in PATH_OVERRIDES and "__config_path" in data):
696+
val = os.path.join(
697+
os.path.dirname(data["__config_path"]), val)
698+
698699
# Get the full name of the parameter
699700
full_name = ConfigParameter.get_full_name(name, unit_name,
700701
unit_kind, label)
701702
if full_name in params:
702703
params[full_name].set_value(val, unit_name, unit_kind,
703704
label)
704-
elif name in self.__unused_overrides:
705-
pass
706705
elif (name.startswith("target.") and
707-
unit_kind is "application"):
706+
(unit_kind is "application" or
707+
name in BOOTLOADER_OVERRIDES)):
708708
_, attribute = name.split(".")
709709
setattr(self.target, attribute, val)
710+
continue
710711
else:
711712
self.config_errors.append(
712713
ConfigException(
@@ -759,7 +760,7 @@ def get_target_config_data(self):
759760
rel_names = [tgt for tgt, _ in
760761
get_resolution_order(self.target.json_data, tname,
761762
[])]
762-
if full_name in self.__unused_overrides:
763+
if full_name in BOOTLOADER_OVERRIDES:
763764
continue
764765
if (full_name not in params) or \
765766
(params[full_name].defined_by[7:] not in rel_names):

tools/export/gnuarmeclipse/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,8 @@ def create_jinja_ctx(self):
210210

211211
# Hack to fill in build_dir
212212
toolchain.build_dir = self.toolchain.build_dir
213+
toolchain.config = self.toolchain.config
214+
toolchain.set_config_data(self.toolchain.config.get_config_data())
213215

214216
flags = self.toolchain_flags(toolchain)
215217

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"name": "bl",
3+
"target_overrides": {
4+
"LPC1768": {
5+
"target.bootloader_img": "does_not_exists.bin",
6+
"target.restrict_size": "0xFFFFF"
7+
}
8+
}
9+
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
{
22
"target_overrides": {
33
"K64F": {
4-
"target.bootloader_img": "does_not_exists.bin"
4+
"target.bootloader_img": "does_not_exists.bin",
5+
"target.restrict_size": "0xFFFFF"
56
}
67
}
78
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
{
22
"K64F": {
33
"exception_msg": "not found"
4+
},
5+
"LPC1768": {
6+
"exception_msg": "not found"
47
}
58
}

tools/toolchains/__init__.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1231,9 +1231,31 @@ def mem_stats(self, map):
12311231

12321232
return None
12331233

1234+
def add_regions(self):
1235+
"""Add regions to the build profile, if there are any.
1236+
"""
1237+
print("Using regions in this build:")
1238+
for region in self.config.regions:
1239+
for define in [(region.name.upper() + "_ADDR", region.start),
1240+
(region.name.upper() + "_SIZE", region.size)]:
1241+
define_string = "-D%s=0x%x" % define
1242+
self.cc.append(define_string)
1243+
self.cppc.append(define_string)
1244+
self.flags["common"].append(define_string)
1245+
if region.active:
1246+
for define in [("MBED_APP_START", region.start),
1247+
("MBED_APP_SIZE", region.size)]:
1248+
define_string = self.make_ld_define(*define)
1249+
self.ld.append(define_string)
1250+
self.flags["ld"].append(define_string)
1251+
print(" Region %s size 0x%x, offset 0x%x"
1252+
% (region.name, region.size, region.start))
1253+
12341254
# Set the configuration data
12351255
def set_config_data(self, config_data):
12361256
self.config_data = config_data
1257+
if self.config.has_regions:
1258+
self.add_regions()
12371259

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

0 commit comments

Comments
 (0)