u-boot/tools/binman/btool/mkimage.py

81 lines
2.5 KiB
Python
Raw Normal View History

# SPDX-License-Identifier: GPL-2.0+
# Copyright 2022 Google LLC
#
"""Bintool implementation for mkimage"""
import re
from binman import bintool
class Bintoolmkimage(bintool.Bintool):
"""Image generation for U-Boot
This bintool supports running `mkimage` with some basic parameters as
neeed by binman.
Normally binman uses the mkimage built by U-Boot. But when run outside the
U-Boot build system, binman can use the version installed in your system.
Support is provided for fetching this on Debian-like systems, using apt.
"""
def __init__(self, name):
super().__init__(name, 'Generate image for U-Boot')
# pylint: disable=R0913
def run(self, reset_timestamp=False, output_fname=None, external=False,
pad=None, version=False):
"""Run mkimage
Args:
reset_timestamp: True to update the timestamp in the FIT
output_fname: Output filename to write to
external: True to create an 'external' FIT, where the binaries are
located outside the main data structure
pad: Bytes to use for padding the FIT devicetree output. This allows
other things to be easily added later, if required, such as
signatures
version: True to get the mkimage version
"""
args = []
if external:
args.append('-E')
if pad:
args += ['-p', f'{pad:x}']
if reset_timestamp:
args.append('-t')
if output_fname:
args += ['-F', output_fname]
if version:
args.append('-V')
return self.run_cmd(*args)
def fetch(self, method):
"""Fetch handler for mkimage
This installs mkimage using the apt utility.
Args:
method (FETCH_...): Method to use
Returns:
True if the file was fetched and now installed, None if a method
other than FETCH_BIN was requested
Raises:
Valuerror: Fetching could not be completed
"""
if method != bintool.FETCH_BIN:
return None
return self.apt_install('u-boot-tools')
def version(self):
"""Version handler for mkimage
Returns:
str: Version string for mkimage
"""
out = self.run(version=True).strip()
if not out:
return super().version()
m_version = re.match(r'mkimage version (.*)', out)
return m_version.group(1) if m_version else out