Skip to content

Commit 61e4980

Browse files
de-nordicd3zd3z
authored andcommitted
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: Dominik Ermel <dominik.ermel@nordicsemi.no> Signed-off-by: David Brown <david.brown@linaro.org>
1 parent a8e12da commit 61e4980

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

scripts/imgtool/image.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,9 +49,10 @@
4949
# Image header flags.
5050
IMAGE_F = {
5151
'PIC': 0x0000001,
52+
'ENCRYPTED': 0x0000004,
5253
'NON_BOOTABLE': 0x0000010,
5354
'RAM_LOAD': 0x0000020,
54-
'ENCRYPTED': 0x0000004,
55+
'ROM_FIXED': 0x0000100,
5556
}
5657

5758
TLV_VALUES = {
@@ -130,7 +131,12 @@ def __init__(self, version=None, header_size=IMAGE_HEADER_SIZE,
130131
pad_header=False, pad=False, confirm=False, align=1,
131132
slot_size=0, max_sectors=DEFAULT_MAX_SECTORS,
132133
overwrite_only=False, endian="little", load_addr=0,
133-
erased_val=None, save_enctlv=False, security_counter=None):
134+
rom_fixed=None, erased_val=None, save_enctlv=False,
135+
security_counter=None):
136+
137+
if load_addr and rom_fixed:
138+
raise click.UsageError("Can not set rom_fixed and load_addr at the same time")
139+
134140
self.version = version or versmod.decode_version("0")
135141
self.header_size = header_size
136142
self.pad_header = pad_header
@@ -143,6 +149,7 @@ def __init__(self, version=None, header_size=IMAGE_HEADER_SIZE,
143149
self.endian = endian
144150
self.base_addr = None
145151
self.load_addr = 0 if load_addr is None else load_addr
152+
self.rom_fixed = rom_fixed
146153
self.erased_val = 0xff if erased_val is None else int(erased_val, 0)
147154
self.payload = []
148155
self.enckey = None
@@ -459,6 +466,8 @@ def add_header(self, enckey, protected_tlv_size):
459466
# Indicates that this image should be loaded into RAM
460467
# instead of run directly from flash.
461468
flags |= IMAGE_F['RAM_LOAD']
469+
if self.rom_fixed:
470+
flags |= IMAGE_F['ROM_FIXED']
462471

463472
e = STRUCT_ENDIAN_DICT[self.endian]
464473
fmt = (e +
@@ -475,7 +484,7 @@ def add_header(self, enckey, protected_tlv_size):
475484
assert struct.calcsize(fmt) == IMAGE_HEADER_SIZE
476485
header = struct.pack(fmt,
477486
IMAGE_MAGIC,
478-
self.load_addr,
487+
self.rom_fixed or self.load_addr,
479488
self.header_size,
480489
protected_tlv_size, # TLV Info header + Protected TLVs
481490
len(self.payload) - self.header_size, # ImageSz

scripts/imgtool/main.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,8 @@ def convert(self, value, param, ctx):
239239
help='Adjust address in hex output file.')
240240
@click.option('-L', '--load-addr', type=BasedIntParamType(), required=False,
241241
help='Load address for image when it should run from RAM.')
242+
@click.option('-F', '--rom-fixed', type=BasedIntParamType(), required=False,
243+
help='Set flash address the image is built for.')
242244
@click.option('--save-enctlv', default=False, is_flag=True,
243245
help='When upgrading, save encrypted key TLVs instead of plain '
244246
'keys. Enable when BOOT_SWAP_SAVE_ENCTLV config option '
@@ -292,7 +294,8 @@ def convert(self, value, param, ctx):
292294
def sign(key, public_key_format, align, version, pad_sig, header_size,
293295
pad_header, slot_size, pad, confirm, max_sectors, overwrite_only,
294296
endian, encrypt, infile, outfile, dependencies, load_addr, hex_addr,
295-
erased_val, save_enctlv, security_counter, boot_record, custom_tlv):
297+
erased_val, save_enctlv, security_counter, boot_record, custom_tlv,
298+
rom_fixed):
296299

297300
if confirm:
298301
# 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,
302305
pad_header=pad_header, pad=pad, confirm=confirm,
303306
align=int(align), slot_size=slot_size,
304307
max_sectors=max_sectors, overwrite_only=overwrite_only,
305-
endian=endian, load_addr=load_addr, erased_val=erased_val,
306-
save_enctlv=save_enctlv,
308+
endian=endian, load_addr=load_addr, rom_fixed=rom_fixed,
309+
erased_val=erased_val, save_enctlv=save_enctlv,
307310
security_counter=security_counter)
308311
img.load(infile)
309312
key = load_key(key) if key else None

0 commit comments

Comments
 (0)