Skip to content

Commit 95d2b3d

Browse files
author
Cruz Monrreal
authored
Merge pull request #7133 from OpenNuvoton/nuvoton_support_tz_partition
Override ROM/RAM start/size for TrustZone targets
2 parents aa25b1d + 52e640f commit 95d2b3d

File tree

2 files changed

+130
-41
lines changed

2 files changed

+130
-41
lines changed

tools/config/__init__.py

Lines changed: 85 additions & 24 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,30 +581,68 @@ 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'][memory]['size']
590+
start = cmsis_part['memory'][memory]['start']
591+
return (start, size)
592+
except KeyError:
593+
continue
594+
raise ConfigException(exception_text)
595+
596+
@property
597+
def rom(self):
598+
"""Get rom information as a pair of start_addr, size"""
599+
# Override rom_start/rom_size
600+
#
601+
# This is usually done for a target which:
602+
# 1. Doesn't support CMSIS pack, or
603+
# 2. Supports TrustZone and user needs to change its flash partition
604+
cmsis_part = self._get_cmsis_part()
605+
rom_start, rom_size = self._get_mem_specs(
606+
["IROM1", "PROGRAM_FLASH"],
607+
cmsis_part,
608+
"Not enough information in CMSIS packs to build a bootloader "
609+
"project"
610+
)
611+
rom_start = int(getattr(self.target, "mbed_rom_start", False) or rom_start, 0)
612+
rom_size = int(getattr(self.target, "mbed_rom_size", False) or rom_size, 0)
613+
return (rom_start, rom_size)
614+
615+
@property
616+
def ram_regions(self):
617+
"""Generate a list of ram regions from the config"""
618+
cmsis_part = self._get_cmsis_part()
619+
ram_start, ram_size = self._get_mem_specs(
620+
["IRAM1", "SRAM0"],
621+
cmsis_part,
622+
"Not enough information in CMSIS packs to build a ram sharing project"
623+
)
624+
# Override ram_start/ram_size
625+
#
626+
# This is usually done for a target which:
627+
# 1. Doesn't support CMSIS pack, or
628+
# 2. Supports TrustZone and user needs to change its flash partition
629+
ram_start = getattr(self.target, "mbed_ram_start", False) or ram_start
630+
ram_size = getattr(self.target, "mbed_ram_size", False) or ram_size
631+
return [RamRegion("application_ram", int(ram_start, 0), int(ram_size, 0), True)]
632+
633+
@property
634+
def regions(self):
635+
"""Generate a list of regions from the config"""
562636
if ((self.target.bootloader_img or self.target.restrict_size) and
563637
(self.target.mbed_app_start or self.target.mbed_app_size)):
564638
raise ConfigException(
565639
"target.bootloader_img and target.restirct_size are "
566640
"incompatible with target.mbed_app_start and "
567641
"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")
578642
if self.target.bootloader_img or self.target.restrict_size:
579-
return self._generate_bootloader_build(rom_start, rom_size)
580-
elif self.target.mbed_app_start or self.target.mbed_app_size:
581-
return self._generate_linker_overrides(rom_start, rom_size)
643+
return self._generate_bootloader_build(*self.rom)
582644
else:
583-
raise ConfigException(
584-
"Bootloader build requested but no bootlader configuration")
645+
return self._generate_linker_overrides(*self.rom)
585646

586647
@staticmethod
587648
def header_member_size(member):

tools/toolchains/__init__.py

Lines changed: 45 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
from itertools import chain
2828
from inspect import getmro
2929
from copy import deepcopy
30+
from collections import namedtuple
3031
from abc import ABCMeta, abstractmethod
3132
from distutils.spawn import find_executable
3233
from multiprocessing import Pool, cpu_count
@@ -39,6 +40,7 @@
3940
from .. import hooks
4041
from ..notifier.term import TerminalNotifier
4142
from ..memap import MemapParser
43+
from ..config import ConfigException
4244

4345

4446
#Disables multiprocessing if set to higher number than the host machine CPUs
@@ -1191,33 +1193,59 @@ def mem_stats(self, map):
11911193

11921194
return None
11931195

1194-
def add_regions(self):
1195-
"""Add regions to the build profile, if there are any.
1196-
"""
1197-
regions = list(self.config.regions)
1198-
self.notify.info("Using regions %s in this build."
1199-
% ", ".join(region.name for region in regions))
1200-
for region in regions:
1201-
for define in [(region.name.upper() + "_ADDR", region.start),
1202-
(region.name.upper() + "_SIZE", region.size)]:
1203-
define_string = "-D%s=0x%x" % define
1204-
self.cc.append(define_string)
1205-
self.cppc.append(define_string)
1206-
self.flags["common"].append(define_string)
1196+
def _add_defines_from_region(self, region, suffixes=['_ADDR', '_SIZE']):
1197+
for define in [(region.name.upper() + suffixes[0], region.start),
1198+
(region.name.upper() + suffixes[1], region.size)]:
1199+
define_string = "-D%s=0x%x" % define
1200+
self.cc.append(define_string)
1201+
self.cppc.append(define_string)
1202+
self.flags["common"].append(define_string)
1203+
1204+
def _add_all_regions(self, region_list, active_region_name):
1205+
for region in region_list:
1206+
self._add_defines_from_region(region)
12071207
if region.active:
1208-
for define in [("MBED_APP_START", region.start),
1209-
("MBED_APP_SIZE", region.size)]:
1208+
for define in [
1209+
("%s_START" % active_region_name, region.start),
1210+
("%s_SIZE" % active_region_name, region.size)
1211+
]:
12101212
define_string = self.make_ld_define(*define)
12111213
self.ld.append(define_string)
12121214
self.flags["ld"].append(define_string)
12131215
self.notify.info(" Region %s: size 0x%x, offset 0x%x"
12141216
% (region.name, region.size, region.start))
12151217

1218+
def add_regions(self):
1219+
"""Add regions to the build profile, if there are any.
1220+
"""
1221+
if self.config.has_regions:
1222+
regions = list(self.config.regions)
1223+
self.notify.info("Using ROM region%s %s in this build." % (
1224+
"s" if len(regions) > 1 else "",
1225+
", ".join(r.name for r in regions)
1226+
))
1227+
self._add_all_regions(regions, "MBED_APP")
1228+
if self.config.has_ram_regions:
1229+
regions = list(self.config.ram_regions)
1230+
self.notify.info("Using RAM region%s %s in this build." % (
1231+
"s" if len(regions) > 1 else "",
1232+
", ".join(r.name for r in regions)
1233+
))
1234+
self._add_all_regions(regions, "MBED_RAM")
1235+
try:
1236+
rom_start, rom_size = self.config.rom
1237+
Region = namedtuple("Region", "name start size")
1238+
self._add_defines_from_region(
1239+
Region("MBED_ROM", rom_start, rom_size),
1240+
suffixes=["_START", "_SIZE"]
1241+
)
1242+
except ConfigException:
1243+
pass
1244+
12161245
# Set the configuration data
12171246
def set_config_data(self, config_data):
12181247
self.config_data = config_data
1219-
if self.config.has_regions:
1220-
self.add_regions()
1248+
self.add_regions()
12211249

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

0 commit comments

Comments
 (0)