@@ -362,7 +362,8 @@ class Config(object):
362
362
"artifact_name" : str }
363
363
}
364
364
365
- __unused_overrides = set (["target.bootloader_img" , "target.restrict_size" ])
365
+ __unused_overrides = set (["target.bootloader_img" , "target.restrict_size" ,
366
+ "target.mbed_app_start" , "target.mbed_app_size" ])
366
367
367
368
# Allowed features in configurations
368
369
__allowed_features = [
@@ -485,7 +486,9 @@ def has_regions(self):
485
486
target_overrides = self .app_config_data ['target_overrides' ].get (
486
487
self .target .name , {})
487
488
return ('target.bootloader_img' in target_overrides or
488
- 'target.restrict_size' in target_overrides )
489
+ 'target.restrict_size' in target_overrides or
490
+ 'target.mbed_app_start' in target_overrides or
491
+ 'target.mbed_app_size' in target_overrides )
489
492
else :
490
493
return False
491
494
@@ -495,15 +498,37 @@ def regions(self):
495
498
if not self .target .bootloader_supported :
496
499
raise ConfigException ("Bootloader not supported on this target." )
497
500
cmsis_part = Cache (False , False ).index [self .target .device_name ]
498
- start = 0
499
501
target_overrides = self .app_config_data ['target_overrides' ].get (
500
502
self .target .name , {})
503
+ if (('target.bootloader_img' in target_overrides or
504
+ 'target.restrict_size' in target_overrides ) and
505
+ ('target.mbed_app_start' in target_overrides or
506
+ 'target.mbed_app_size' in target_overrides )):
507
+ raise ConfigException (
508
+ "target.bootloader_img and target.restirct_size are "
509
+ "incompatible with target.mbed_app_start and "
510
+ "target.mbed_app_size" )
501
511
try :
502
512
rom_size = int (cmsis_part ['memory' ]['IROM1' ]['size' ], 0 )
503
513
rom_start = int (cmsis_part ['memory' ]['IROM1' ]['start' ], 0 )
504
514
except KeyError :
505
515
raise ConfigException ("Not enough information in CMSIS packs to "
506
516
"build a bootloader project" )
517
+ if ('target.bootloader_img' in target_overrides or
518
+ 'target.restrict_size' in target_overrides ):
519
+ return self ._generate_booloader_build (target_overrides ,
520
+ rom_size , rom_size )
521
+ elif ('target.mbed_app_start' in target_overrides or
522
+ 'target.mbed_app_size' in target_overrides ):
523
+ return self ._generate_linker_overrides (target_overrides ,
524
+ rom_start , rom_size )
525
+ else :
526
+ raise ConfigException (
527
+ "Bootloader build requested but no bootlader configuration" )
528
+
529
+ @staticmethod
530
+ def _generate_booloader_build (target_overrides , rom_start , rom_size ):
531
+ start = 0
507
532
if 'target.bootloader_img' in target_overrides :
508
533
filename = target_overrides ['target.bootloader_img' ]
509
534
if not exists (filename ):
@@ -534,6 +559,22 @@ def report(self):
534
559
return {'app_config' : self .app_config_location ,
535
560
'library_configs' : map (relpath , self .processed_configs .keys ())}
536
561
562
+ @staticmethod
563
+ def _generate_linker_overrides (target_overrides , rom_start , rom_size ):
564
+ if 'target.mbed_app_start' in target_overrides :
565
+ start = int (target_overrides ['target.mbed_app_start' ], 0 )
566
+ else :
567
+ start = rom_start
568
+ if 'target.mbed_app_size' in target_overrides :
569
+ size = int (target_overrides ['target.mbed_app_size' ], 0 )
570
+ else :
571
+ size = (rom_size + rom_start ) - start
572
+ if start < rom_start :
573
+ raise ConfigException ("Application starts before ROM" )
574
+ if size + start > rom_size + rom_start :
575
+ raise ConfigException ("Application ends after ROM" )
576
+ yield Region ("application" , start , size , True , None )
577
+
537
578
def _process_config_and_overrides (self , data , params , unit_name , unit_kind ):
538
579
"""Process "config_parameters" and "target_config_overrides" into a
539
580
given dictionary
0 commit comments