Commit 61e49804 authored by Dominik Ermel's avatar Dominik Ermel Committed by David Brown
Browse files

mgtool: Add support for setting fixed ROM address into image header



The commit adds support for IMAGE_F_ROM_FIXED flag that allows setting
information on image base address into image_header.

Signed-off-by: default avatarDominik Ermel <dominik.ermel@nordicsemi.no>
Signed-off-by: default avatarDavid Brown <david.brown@linaro.org>
parent a8e12dae
Loading
Loading
Loading
Loading
+12 −3
Original line number Diff line number Diff line
@@ -49,9 +49,10 @@ MAX_SW_TYPE_LENGTH = 12 # Bytes
# Image header flags.
IMAGE_F = {
        'PIC':                   0x0000001,
        'ENCRYPTED':             0x0000004,
        'NON_BOOTABLE':          0x0000010,
        'RAM_LOAD':              0x0000020,
        'ENCRYPTED':             0x0000004,
        'ROM_FIXED':             0x0000100,
}

TLV_VALUES = {
@@ -130,7 +131,12 @@ class Image():
                 pad_header=False, pad=False, confirm=False, align=1,
                 slot_size=0, max_sectors=DEFAULT_MAX_SECTORS,
                 overwrite_only=False, endian="little", load_addr=0,
                 erased_val=None, save_enctlv=False, security_counter=None):
                 rom_fixed=None, erased_val=None, save_enctlv=False,
                 security_counter=None):

        if load_addr and rom_fixed:
            raise click.UsageError("Can not set rom_fixed and load_addr at the same time")

        self.version = version or versmod.decode_version("0")
        self.header_size = header_size
        self.pad_header = pad_header
@@ -143,6 +149,7 @@ class Image():
        self.endian = endian
        self.base_addr = None
        self.load_addr = 0 if load_addr is None else load_addr
        self.rom_fixed = rom_fixed
        self.erased_val = 0xff if erased_val is None else int(erased_val, 0)
        self.payload = []
        self.enckey = None
@@ -459,6 +466,8 @@ class Image():
            # Indicates that this image should be loaded into RAM
            # instead of run directly from flash.
            flags |= IMAGE_F['RAM_LOAD']
        if self.rom_fixed:
            flags |= IMAGE_F['ROM_FIXED']

        e = STRUCT_ENDIAN_DICT[self.endian]
        fmt = (e +
@@ -475,7 +484,7 @@ class Image():
        assert struct.calcsize(fmt) == IMAGE_HEADER_SIZE
        header = struct.pack(fmt,
                IMAGE_MAGIC,
                self.load_addr,
                self.rom_fixed or self.load_addr,
                self.header_size,
                protected_tlv_size,  # TLV Info header + Protected TLVs
                len(self.payload) - self.header_size,  # ImageSz
+6 −3
Original line number Diff line number Diff line
@@ -239,6 +239,8 @@ class BasedIntParamType(click.ParamType):
              help='Adjust address in hex output file.')
@click.option('-L', '--load-addr', type=BasedIntParamType(), required=False,
              help='Load address for image when it should run from RAM.')
@click.option('-F', '--rom-fixed', type=BasedIntParamType(), required=False,
              help='Set flash address the image is built for.')
@click.option('--save-enctlv', default=False, is_flag=True,
              help='When upgrading, save encrypted key TLVs instead of plain '
                   'keys. Enable when BOOT_SWAP_SAVE_ENCTLV config option '
@@ -292,7 +294,8 @@ class BasedIntParamType(click.ParamType):
def sign(key, public_key_format, align, version, pad_sig, header_size,
         pad_header, slot_size, pad, confirm, max_sectors, overwrite_only,
         endian, encrypt, infile, outfile, dependencies, load_addr, hex_addr,
         erased_val, save_enctlv, security_counter, boot_record, custom_tlv):
         erased_val, save_enctlv, security_counter, boot_record, custom_tlv,
         rom_fixed):

    if confirm:
        # Confirmed but non-padded images don't make much sense, because
@@ -302,8 +305,8 @@ def sign(key, public_key_format, align, version, pad_sig, header_size,
                      pad_header=pad_header, pad=pad, confirm=confirm,
                      align=int(align), slot_size=slot_size,
                      max_sectors=max_sectors, overwrite_only=overwrite_only,
                      endian=endian, load_addr=load_addr, erased_val=erased_val,
                      save_enctlv=save_enctlv,
                      endian=endian, load_addr=load_addr, rom_fixed=rom_fixed,
                      erased_val=erased_val, save_enctlv=save_enctlv,
                      security_counter=security_counter)
    img.load(infile)
    key = load_key(key) if key else None