30
30
from jinja2 .environment import Environment
31
31
from jsonschema import Draft4Validator , RefResolver
32
32
33
- from ..utils import json_file_to_dict , intelhex_offset
33
+ from ..utils import json_file_to_dict , intelhex_offset , integer
34
34
from ..arm_pack_manager import Cache
35
35
from ..targets import (CUMULATIVE_ATTRIBUTES , TARGET_MAP , generate_py_target ,
36
36
get_resolution_order , Target )
41
41
unicode = str
42
42
PATH_OVERRIDES = set (["target.bootloader_img" ])
43
43
BOOTLOADER_OVERRIDES = set (["target.bootloader_img" , "target.restrict_size" ,
44
- "target.header_format" ,
44
+ "target.header_format" , "target.header_offset" ,
45
+ "target.app_offset" ,
45
46
"target.mbed_app_start" , "target.mbed_app_size" ])
46
47
48
+
47
49
# Base class for all configuration exceptions
48
50
class ConfigException (Exception ):
49
51
"""Config system only exception. Makes it easier to distinguish config
@@ -589,13 +591,21 @@ def header_member_size(member):
589
591
def _header_size (format ):
590
592
return sum (Config .header_member_size (m ) for m in format )
591
593
592
- def _make_header_region (self , start , header_format ):
594
+ def _make_header_region (self , start , header_format , offset = None ):
593
595
size = self ._header_size (header_format )
594
596
region = Region ("header" , start , size , False , None )
595
597
start += size
596
598
start = ((start + 7 ) // 8 ) * 8
597
599
return (start , region )
598
600
601
+ @staticmethod
602
+ def _assign_new_offset (rom_start , start , new_offset , region_name ):
603
+ newstart = rom_start + integer (new_offset , 0 )
604
+ if newstart < start :
605
+ raise ConfigException (
606
+ "Can not place % region inside previous region" % region_name )
607
+ return newstart
608
+
599
609
def _generate_bootloader_build (self , rom_start , rom_size ):
600
610
start = rom_start
601
611
rom_end = rom_start + rom_size
@@ -617,6 +627,9 @@ def _generate_bootloader_build(self, rom_start, rom_size):
617
627
filename )
618
628
start = rom_start + part_size
619
629
if self .target .header_format :
630
+ if self .target .header_offset :
631
+ start = self ._assign_new_offset (
632
+ rom_start , start , self .target .header_offset , "header" )
620
633
start , region = self ._make_header_region (
621
634
start , self .target .header_format )
622
635
yield region ._replace (filename = self .target .header_format )
@@ -626,12 +639,21 @@ def _generate_bootloader_build(self, rom_start, rom_size):
626
639
yield Region ("application" , start , new_size , True , None )
627
640
start += new_size
628
641
if self .target .header_format :
642
+ if self .target .header_offset :
643
+ start = self ._assign_new_offset (
644
+ rom_start , start , self .target .header_offset , "header" )
629
645
start , region = self ._make_header_region (
630
646
start , self .target .header_format )
631
647
yield region
648
+ if self .target .app_offset :
649
+ start = self ._assign_new_offset (
650
+ rom_start , start , self .target .app_offset , "application" )
632
651
yield Region ("post_application" , start , rom_end - start ,
633
652
False , None )
634
653
else :
654
+ if self .target .app_offset :
655
+ start = self ._assign_new_offset (
656
+ rom_start , start , self .target .app_offset , "application" )
635
657
yield Region ("application" , start , rom_end - start ,
636
658
True , None )
637
659
if start > rom_start + rom_size :
0 commit comments