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,30 +581,68 @@ 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' ][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"""
562
636
if ((self .target .bootloader_img or self .target .restrict_size ) and
563
637
(self .target .mbed_app_start or self .target .mbed_app_size )):
564
638
raise ConfigException (
565
639
"target.bootloader_img and target.restirct_size are "
566
640
"incompatible with target.mbed_app_start and "
567
641
"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
642
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 )
582
644
else :
583
- raise ConfigException (
584
- "Bootloader build requested but no bootlader configuration" )
645
+ return self ._generate_linker_overrides (* self .rom )
585
646
586
647
@staticmethod
587
648
def header_member_size (member ):
0 commit comments