72
72
"ETHERNET_HOST" ,
73
73
]
74
74
75
+ # List of all possible ram memories that can be available for a target
76
+ RAM_ALL_MEMORIES = ['IRAM1' , 'IRAM2' , 'IRAM3' , 'IRAM4' , 'SRAM_OC' , \
77
+ 'SRAM_ITC' , 'SRAM_DTC' , 'SRAM_UPPER' , 'SRAM_LOWER' , \
78
+ 'SRAM' ]
79
+
80
+ # List of all possible rom memories that can be available for a target
81
+ ROM_ALL_MEMORIES = ['IROM1' , 'PROGRAM_FLASH' , 'IROM2' ]
82
+
75
83
# Base class for all configuration exceptions
76
84
class ConfigException (Exception ):
77
85
"""Config system only exception. Makes it easier to distinguish config
@@ -593,8 +601,6 @@ def sectors(self):
593
601
raise ConfigException ("No sector info available" )
594
602
595
603
def _get_cmsis_part (self ):
596
- if not getattr (self .target , "bootloader_supported" , False ):
597
- raise ConfigException ("Bootloader not supported on this target." )
598
604
if not hasattr (self .target , "device_name" ):
599
605
raise ConfigException ("Bootloader not supported on this target: "
600
606
"targets.json `device_name` not specified." )
@@ -615,24 +621,68 @@ def _get_mem_specs(self, memories, cmsis_part, exception_text):
615
621
continue
616
622
raise ConfigException (exception_text )
617
623
618
- @property
619
- def rom (self ):
620
- """Get rom information as a pair of start_addr, size"""
624
+ def get_all_active_memories (self , memory_list ):
625
+ """Get information of all available rom/ram memories in the form of dictionary
626
+ {Memory: [start_addr, size]}. Takes in the argument, a list of all available
627
+ regions within the ram/rom memory"""
621
628
# Override rom_start/rom_size
622
629
#
623
630
# This is usually done for a target which:
624
631
# 1. Doesn't support CMSIS pack, or
625
632
# 2. Supports TrustZone and user needs to change its flash partition
626
- cmsis_part = self ._get_cmsis_part ()
627
- rom_start , rom_size = self ._get_mem_specs (
628
- ["IROM1" , "PROGRAM_FLASH" ],
629
- cmsis_part ,
630
- "Not enough information in CMSIS packs to build a bootloader "
631
- "project"
632
- )
633
- rom_start = int (getattr (self .target , "mbed_rom_start" , False ) or rom_start , 0 )
634
- rom_size = int (getattr (self .target , "mbed_rom_size" , False ) or rom_size , 0 )
635
- return (rom_start , rom_size )
633
+
634
+ available_memories = {}
635
+ # Counter to keep track of ROM/RAM memories supported by target
636
+ active_memory_counter = 0
637
+ # Find which memory we are dealing with, RAM/ROM
638
+ active_memory = 'ROM' if any ('ROM' in mem_list for mem_list in memory_list ) else 'RAM'
639
+
640
+ try :
641
+ cmsis_part = self ._get_cmsis_part ()
642
+ except ConfigException :
643
+ """ If the target doesn't exits in cmsis, but present in targets.json
644
+ with ram and rom start/size defined"""
645
+ if getattr (self .target , "mbed_ram_start" ) and \
646
+ getattr (self .target , "mbed_rom_start" ):
647
+ mem_start = int (getattr (self .target , "mbed_" + active_memory .lower () + "_start" ), 0 )
648
+ mem_size = int (getattr (self .target , "mbed_" + active_memory .lower () + "_size" ), 0 )
649
+ available_memories [active_memory ] = [mem_start , mem_size ]
650
+ return available_memories
651
+ else :
652
+ raise ConfigException ("Bootloader not supported on this target. "
653
+ "ram/rom start/size not found in "
654
+ "targets.json." )
655
+
656
+ present_memories = set (cmsis_part ['memory' ].keys ())
657
+ valid_memories = set (memory_list ).intersection (present_memories )
658
+
659
+ for memory in valid_memories :
660
+ mem_start , mem_size = self ._get_mem_specs (
661
+ [memory ],
662
+ cmsis_part ,
663
+ "Not enough information in CMSIS packs to build a bootloader "
664
+ "project"
665
+ )
666
+ if memory == 'IROM1' or memory == 'PROGRAM_FLASH' :
667
+ mem_start = getattr (self .target , "mbed_rom_start" , False ) or mem_start
668
+ mem_size = getattr (self .target , "mbed_rom_size" , False ) or mem_size
669
+ memory = 'ROM'
670
+ elif memory == 'IRAM1' or memory == 'SRAM_OC' or \
671
+ memory == 'SRAM_UPPER' or memory == 'SRAM' :
672
+ if (self .has_ram_regions ):
673
+ continue
674
+ mem_start = getattr (self .target , "mbed_ram_start" , False ) or mem_start
675
+ mem_size = getattr (self .target , "mbed_ram_size" , False ) or mem_size
676
+ memory = 'RAM'
677
+ else :
678
+ active_memory_counter += 1
679
+ memory = active_memory + str (active_memory_counter )
680
+
681
+ mem_start = int (mem_start , 0 )
682
+ mem_size = int (mem_size , 0 )
683
+ available_memories [memory ] = [mem_start , mem_size ]
684
+
685
+ return available_memories
636
686
637
687
@property
638
688
def ram_regions (self ):
@@ -654,17 +704,19 @@ def ram_regions(self):
654
704
655
705
@property
656
706
def regions (self ):
707
+ if not getattr (self .target , "bootloader_supported" , False ):
708
+ raise ConfigException ("Bootloader not supported on this target." )
657
709
"""Generate a list of regions from the config"""
658
710
if ((self .target .bootloader_img or self .target .restrict_size ) and
659
711
(self .target .mbed_app_start or self .target .mbed_app_size )):
660
712
raise ConfigException (
661
- "target.bootloader_img and target.restirct_size are "
713
+ "target.bootloader_img and target.restrict_size are "
662
714
"incompatible with target.mbed_app_start and "
663
715
"target.mbed_app_size" )
664
716
if self .target .bootloader_img or self .target .restrict_size :
665
- return self ._generate_bootloader_build (* self .rom )
717
+ return self ._generate_bootloader_build (self .get_all_active_memories ( ROM_ALL_MEMORIES ) )
666
718
else :
667
- return self ._generate_linker_overrides (* self .rom )
719
+ return self ._generate_linker_overrides (self .get_all_active_memories ( ROM_ALL_MEMORIES ) )
668
720
669
721
@staticmethod
670
722
def header_member_size (member ):
@@ -701,7 +753,8 @@ def _assign_new_offset(rom_start, start, new_offset, region_name):
701
753
"Can not place % region inside previous region" % region_name )
702
754
return newstart
703
755
704
- def _generate_bootloader_build (self , rom_start , rom_size ):
756
+ def _generate_bootloader_build (self , rom_memories ):
757
+ rom_start , rom_size = rom_memories .get ('ROM' )
705
758
start = rom_start
706
759
rom_end = rom_start + rom_size
707
760
if self .target .bootloader_img :
@@ -785,7 +838,8 @@ def report(self):
785
838
return {'app_config' : self .app_config_location ,
786
839
'library_configs' : list (map (relpath , self .processed_configs .keys ()))}
787
840
788
- def _generate_linker_overrides (self , rom_start , rom_size ):
841
+ def _generate_linker_overrides (self , rom_memories ):
842
+ rom_start , rom_size = rom_memories .get ('ROM' )
789
843
if self .target .mbed_app_start is not None :
790
844
start = int (self .target .mbed_app_start , 0 )
791
845
else :
0 commit comments