Skip to content

Commit 4af70dc

Browse files
committed
Use updated CPM info in config system
1 parent aa07e12 commit 4af70dc

File tree

1 file changed

+40
-27
lines changed

1 file changed

+40
-27
lines changed

tools/config/__init__.py

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -645,15 +645,23 @@ def _get_cmsis_part(self):
645645
"arm_pack_manager index.")
646646
return cache.index[self.target.device_name]
647647

648-
def _get_mem_specs(self, memories, cmsis_part, exception_text):
649-
for memory in memories:
650-
try:
651-
size = cmsis_part['memory'][memory]['size']
652-
start = cmsis_part['memory'][memory]['start']
653-
return (start, size)
654-
except KeyError:
655-
continue
656-
raise ConfigException(exception_text)
648+
@staticmethod
649+
def _memory_ordering(memory):
650+
return (memory['default'], memory['size'], memory['start'])
651+
652+
def _get_mem_specs(self, permissions, cmsis_part):
653+
all_matching_memories = {
654+
name: memory for name, memory in cmsis_part['memories'].items()
655+
if all(memory['access'][perm] for perm in permissions)
656+
}
657+
if all_matching_memories:
658+
return all_matching_memories
659+
else:
660+
raise ConfigException(
661+
"Missing a memory that is {} in CMSIS Pack data".format(
662+
", ".join(permissions)
663+
)
664+
)
657665

658666
def get_all_active_memories(self, memory_list):
659667
"""Get information of all available rom/ram memories in the form of dictionary
@@ -664,7 +672,6 @@ def get_all_active_memories(self, memory_list):
664672
# This is usually done for a target which:
665673
# 1. Doesn't support CMSIS pack, or
666674
# 2. Supports TrustZone and user needs to change its flash partition
667-
668675
available_memories = {}
669676
# Counter to keep track of ROM/RAM memories supported by target
670677
active_memory_counter = 0
@@ -687,16 +694,16 @@ def get_all_active_memories(self, memory_list):
687694
"ram/rom start/size not found in "
688695
"targets.json.")
689696

690-
present_memories = set(cmsis_part['memory'].keys())
697+
present_memories = set(cmsis_part['memories'].keys())
691698
valid_memories = set(memory_list).intersection(present_memories)
692699

700+
memories = self._get_mem_specs(
701+
["read", "write" if active_memory == "RAM" else "execute"],
702+
cmsis_part
703+
)
693704
for memory in valid_memories:
694-
mem_start, mem_size = self._get_mem_specs(
695-
[memory],
696-
cmsis_part,
697-
"Not enough information in CMSIS packs to build a bootloader "
698-
"project"
699-
)
705+
mem_start = memories[memory]["start"]
706+
mem_size = memories[memory]["size"]
700707
if memory=='IROM1' or memory=='PROGRAM_FLASH':
701708
mem_start = getattr(self.target, "mbed_rom_start", False) or mem_start
702709
mem_size = getattr(self.target, "mbed_rom_size", False) or mem_size
@@ -712,8 +719,10 @@ def get_all_active_memories(self, memory_list):
712719
active_memory_counter += 1
713720
memory = active_memory + str(active_memory_counter)
714721

715-
mem_start = int(mem_start, 0)
716-
mem_size = int(mem_size, 0)
722+
if not isinstance(mem_start, int):
723+
mem_start = int(mem_start, 0)
724+
if not isinstance(mem_size, int):
725+
mem_size = int(mem_size, 0)
717726
available_memories[memory] = [mem_start, mem_size]
718727

719728
return available_memories
@@ -722,19 +731,23 @@ def get_all_active_memories(self, memory_list):
722731
def ram_regions(self):
723732
"""Generate a list of ram regions from the config"""
724733
cmsis_part = self._get_cmsis_part()
725-
ram_start, ram_size = self._get_mem_specs(
726-
["IRAM1", "SRAM0"],
727-
cmsis_part,
728-
"Not enough information in CMSIS packs to build a ram sharing project"
729-
)
734+
rams = self._get_mem_specs(("read", "write"), cmsis_part)
735+
best_ram = sorted(
736+
rams.values(),
737+
key=self._memory_ordering,
738+
reverse=True
739+
)[0]
740+
ram_start, ram_size = best_ram["start"], best_ram["size"]
730741
# Override ram_start/ram_size
731742
#
732743
# This is usually done for a target which:
733744
# 1. Doesn't support CMSIS pack, or
734745
# 2. Supports TrustZone and user needs to change its flash partition
735-
ram_start = getattr(self.target, "mbed_ram_start", False) or ram_start
736-
ram_size = getattr(self.target, "mbed_ram_size", False) or ram_size
737-
return [RamRegion("application_ram", int(ram_start, 0), int(ram_size, 0), True)]
746+
if getattr(self.target, "mbed_ram_start"):
747+
ram_start = int(getattr(self.target, "mbed_ram_start"), 0)
748+
if getattr(self.target, "mbed_ram_size"):
749+
ram_size = int(getattr(self.target, "mbed_ram_size"), 0)
750+
return [RamRegion("application_ram", ram_start, ram_size, True)]
738751

739752
@property
740753
def regions(self):

0 commit comments

Comments
 (0)