41
41
except NameError :
42
42
unicode = str
43
43
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
+
48
63
49
64
50
65
# Base class for all configuration exceptions
@@ -355,6 +370,7 @@ def _process_macros(mlist, macros, unit_name, unit_kind):
355
370
356
371
357
372
Region = namedtuple ("Region" , "name start size active filename" )
373
+ RamRegion = namedtuple ("RamRegion" , "name start size active" )
358
374
359
375
class Config (object ):
360
376
"""'Config' implements the mbed configuration mechanism"""
@@ -525,7 +541,16 @@ def add_config_files(self, flist):
525
541
@property
526
542
def has_regions (self ):
527
543
"""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 :
529
554
_ , attr = override .split ("." )
530
555
if getattr (self .target , attr , None ):
531
556
return True
@@ -545,9 +570,7 @@ def sectors(self):
545
570
return sectors
546
571
raise ConfigException ("No sector info available" )
547
572
548
- @property
549
- def regions (self ):
550
- """Generate a list of regions from the config"""
573
+ def _get_cmsis_part (self ):
551
574
if not self .target .bootloader_supported :
552
575
raise ConfigException ("Bootloader not supported on this target." )
553
576
if not hasattr (self .target , "device_name" ):
@@ -558,43 +581,63 @@ def regions(self):
558
581
raise ConfigException ("Bootloader not supported on this target: "
559
582
"targets.json `device_name` not found in "
560
583
"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 ()
562
618
if ((self .target .bootloader_img or self .target .restrict_size ) and
563
619
(self .target .mbed_app_start or self .target .mbed_app_size )):
564
620
raise ConfigException (
565
621
"target.bootloader_img and target.restirct_size are "
566
622
"incompatible with target.mbed_app_start and "
567
623
"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
+ )
579
629
# Override rom_start/rom_size
580
630
#
581
631
# This is usually done for a target which:
582
632
# 1. Doesn't support CMSIS pack, or
583
633
# 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 )
590
636
591
637
if self .target .bootloader_img or self .target .restrict_size :
592
638
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 )
595
639
else :
596
- raise ConfigException (
597
- "Bootloader build requested but no bootlader configuration" )
640
+ return self ._generate_linker_overrides (rom_start , rom_size )
598
641
599
642
@staticmethod
600
643
def header_member_size (member ):
0 commit comments