Skip to content

Commit c10d80f

Browse files
michalek-nonvlsianpu
authored andcommitted
[nrf noup] scripts: imgtool: add pad-value
adds parameter that allows to set either 0x00 or 0xff for header padding. Signed-off-by: Mateusz Michalek <mateusz.michalek@nordicsemi.no>
1 parent 8414450 commit c10d80f

2 files changed

Lines changed: 43 additions & 28 deletions

File tree

scripts/imgtool/image.py

Lines changed: 33 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -352,8 +352,8 @@ def __init__(self, version=None, header_size=IMAGE_HEADER_SIZE,
352352
pad_header=False, pad=False, confirm=False, align=1,
353353
slot_size=0, max_sectors=DEFAULT_MAX_SECTORS,
354354
overwrite_only=False, endian="little", load_addr=0,
355-
rom_fixed=None, erased_val=None, save_enctlv=False,
356-
security_counter=None, max_align=None,
355+
rom_fixed=None, erased_val=None, pad_value=None,
356+
save_enctlv=False, security_counter=None, max_align=None,
357357
non_bootable=False, vid=None, cid=None,
358358
edt_config=None, manifest=None):
359359

@@ -376,7 +376,11 @@ def __init__(self, version=None, header_size=IMAGE_HEADER_SIZE,
376376
self.base_addr = None
377377
self.load_addr = 0 if load_addr is None else load_addr
378378
self.rom_fixed = rom_fixed
379-
self.erased_val = 0xff if erased_val is None else int(erased_val, 0)
379+
self.pad_value = pad_value
380+
if pad_value is not None:
381+
self.erased_val = int(pad_value, 0)
382+
else:
383+
self.erased_val = 0xff if erased_val is None else int(erased_val, 0)
380384
self.payload = []
381385
self.infile_data = []
382386
self.enckey = None
@@ -455,13 +459,7 @@ def load(self, path):
455459
except FileNotFoundError:
456460
raise click.UsageError("Input file not found")
457461

458-
# Add the image header if needed.
459-
if self.pad_header and self.header_size > 0:
460-
if self.base_addr:
461-
# Adjust base_addr for new header
462-
self.base_addr -= self.header_size
463-
self.payload = bytes([self.erased_val] * self.header_size) + \
464-
self.payload
462+
self._apply_header_padding()
465463

466464
self.image_size = len(self.payload) - self.header_size
467465

@@ -472,20 +470,7 @@ def load_compressed(self, data, compression_header):
472470
self.payload = compression_header + data
473471
self.image_size = len(self.payload)
474472

475-
# Add the image header if needed.
476-
if self.header_size > 0:
477-
if self.pad_header:
478-
if self.base_addr:
479-
# Adjust base_addr for new header
480-
self.base_addr -= self.header_size
481-
self.payload = bytes([self.erased_val] * self.header_size) + \
482-
self.payload
483-
else:
484-
# Fill header padding with zeros to align with what is expected
485-
# for uncompressed images when no pad_header is requested
486-
# (see self.check_header())
487-
self.payload = bytes([0] * self.header_size) + \
488-
self.payload
473+
self._apply_header_padding(default_zero_fill=True)
489474

490475
def save(self, path, hex_addr=None):
491476
"""Save an image from a given file"""
@@ -523,8 +508,31 @@ def save(self, path, hex_addr=None):
523508
with open(path, 'wb') as f:
524509
f.write(self.payload)
525510

511+
def _apply_header_padding(self, default_zero_fill=False):
512+
"""Apply header padding using the configured pad value."""
513+
if self.header_size <= 0:
514+
return
515+
516+
padding = bytes([self.erased_val] * self.header_size)
517+
518+
if self.pad_header:
519+
if self.base_addr:
520+
# Adjust base_addr for new header
521+
self.base_addr -= self.header_size
522+
self.payload = padding + self.payload
523+
elif self.pad_value is not None:
524+
if len(self.payload) >= self.header_size:
525+
self.payload = padding + bytes(self.payload[self.header_size:])
526+
else:
527+
self.payload = padding + self.payload
528+
elif default_zero_fill:
529+
# Fill header padding with zeros to align with what is expected
530+
# for uncompressed images when no pad_header is requested
531+
# (see self.check_header())
532+
self.payload = bytes([0] * self.header_size) + self.payload
533+
526534
def check_header(self):
527-
if self.header_size > 0 and not self.pad_header:
535+
if self.header_size > 0 and not self.pad_header and self.pad_value is None:
528536
if any(v != 0 for v in self.payload[0:self.header_size]):
529537
raise click.UsageError("Header padding was not requested and "
530538
"image does not start with zeros")

scripts/imgtool/main.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,11 @@ def convert(self, value, param, ctx):
348348
@click.option('-R', '--erased-val', type=click.Choice(['0', '0xff']),
349349
required=False,
350350
help='The value that is read back from erased flash.')
351+
@click.option('--pad-value', type=click.Choice(['0', '0xff']),
352+
required=False,
353+
help='Byte value used for header and slot padding. When set, '
354+
'header padding is applied with this value regardless of '
355+
'whether --pad-header is used.')
351356
@click.option('-x', '--hex-addr', type=BasedIntParamType(), required=False,
352357
help='Adjust address in hex output file.')
353358
@click.option('-L', '--load-addr', type=BasedIntParamType(), required=False,
@@ -466,7 +471,7 @@ def convert(self, value, param, ctx):
466471
def sign(key, public_key_format, align, version, pad_sig, header_size,
467472
pad_header, slot_size, pad, confirm, max_sectors, overwrite_only,
468473
endian, encrypt_keylen, encrypt, compression, infile, outfile,
469-
dependencies, load_addr, hex_addr, erased_val, save_enctlv,
474+
dependencies, load_addr, hex_addr, erased_val, pad_value, save_enctlv,
470475
security_counter, boot_record, custom_tlv, custom_tlv_file, rom_fixed, max_align,
471476
clear, fix_sig, fix_sig_pubkey, sig_out, user_sha, hmac_sha, is_pure,
472477
vector_to_sign, non_bootable, vid, cid, edt_config, manifest,
@@ -481,7 +486,8 @@ def sign(key, public_key_format, align, version, pad_sig, header_size,
481486
align=int(align), slot_size=slot_size,
482487
max_sectors=max_sectors, overwrite_only=overwrite_only,
483488
endian=endian, load_addr=load_addr, rom_fixed=rom_fixed,
484-
erased_val=erased_val, save_enctlv=save_enctlv,
489+
erased_val=erased_val, pad_value=pad_value,
490+
save_enctlv=save_enctlv,
485491
security_counter=security_counter, max_align=max_align,
486492
non_bootable=non_bootable, vid=vid, cid=cid,
487493
edt_config=edt_config, manifest=manifest)
@@ -557,7 +563,8 @@ def sign(key, public_key_format, align, version, pad_sig, header_size,
557563
slot_size=slot_size, max_sectors=max_sectors,
558564
overwrite_only=overwrite_only, endian=endian,
559565
load_addr=load_addr, rom_fixed=rom_fixed,
560-
erased_val=erased_val, save_enctlv=save_enctlv,
566+
erased_val=erased_val, pad_value=pad_value,
567+
save_enctlv=save_enctlv,
561568
security_counter=security_counter, max_align=max_align,
562569
vid=vid, cid=cid, edt_config=edt_config, manifest=manifest)
563570
compression_filters = [

0 commit comments

Comments
 (0)