Skip to content

Commit

Permalink
scripts: imgtool: compression ARM thumb filter
Browse files Browse the repository at this point in the history
Adds ARM thumb filter to imgtool's LZMA2 compression.

Signed-off-by: Mateusz Michalek <mateusz.michalek@nordicsemi.no>
  • Loading branch information
michalek-no authored and de-nordic committed Oct 11, 2024
1 parent a5f28c1 commit d69933c
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 3 deletions.
5 changes: 4 additions & 1 deletion scripts/imgtool/image.py
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@
'ROM_FIXED': 0x0000100,
'COMPRESSED_LZMA1': 0x0000200,
'COMPRESSED_LZMA2': 0x0000400,
'COMPRESSED_ARM_THUMB': 0x0000800,
}

TLV_VALUES = {
Expand Down Expand Up @@ -533,8 +534,10 @@ def create(self, key, public_key_format, enckey, dependencies=None,

compression_flags = 0x0
if compression_tlvs is not None:
if compression_type == "lzma2":
if compression_type in ["lzma2", "lzma2armthumb"]:
compression_flags = IMAGE_F['COMPRESSED_LZMA2']
if compression_type == "lzma2armthumb":
compression_flags |= IMAGE_F['COMPRESSED_ARM_THUMB']
# This adds the header to the payload as well
if encrypt_keylen == 256:
self.add_header(enckey, protected_tlv_size, compression_flags, 256)
Expand Down
6 changes: 4 additions & 2 deletions scripts/imgtool/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,7 @@ def convert(self, value, param, ctx):
help='When encrypting the image using AES, select a 128 bit or '
'256 bit key len.')
@click.option('--compression', default='disabled',
type=click.Choice(['disabled', 'lzma2']),
type=click.Choice(['disabled', 'lzma2', 'lzma2armthumb']),
help='Enable image compression using specified type. '
'Will fall back without image compression automatically '
'if the compression increases the image size.')
Expand Down Expand Up @@ -513,7 +513,7 @@ def sign(key, public_key_format, align, version, pad_sig, header_size,
custom_tlvs, compression_tlvs, int(encrypt_keylen), clear,
baked_signature, pub_key, vector_to_sign, user_sha)

if compression == "lzma2":
if compression in ["lzma2", "lzma2armthumb"]:
compressed_img = image.Image(version=decode_version(version),
header_size=header_size, pad_header=pad_header,
pad=pad, confirm=confirm, align=int(align),
Expand All @@ -527,6 +527,8 @@ def sign(key, public_key_format, align, version, pad_sig, header_size,
"dict_size": comp_default_dictsize, "lp": comp_default_lp,
"lc": comp_default_lc}
]
if compression == "lzma2armthumb":
compression_filters.insert(0, {"id":lzma.FILTER_ARMTHUMB})
compressed_data = lzma.compress(img.get_infile_data(),filters=compression_filters,
format=lzma.FORMAT_RAW)
uncompressed_size = len(img.get_infile_data())
Expand Down

0 comments on commit d69933c

Please sign in to comment.