1# SPDX-License-Identifier: GPL-2.0+ 2# Copyright 2022 Google LLC 3# 4"""Bintool implementation for mkimage""" 5 6import re 7 8from binman import bintool 9 10class Bintoolmkimage(bintool.Bintool): 11 """Image generation for U-Boot 12 13 This bintool supports running `mkimage` with some basic parameters as 14 needed by binman. 15 16 Normally binman uses the mkimage built by U-Boot. But when run outside the 17 U-Boot build system, binman can use the version installed in your system. 18 Support is provided for fetching this on Debian-like systems, using apt. 19 """ 20 def __init__(self, name): 21 super().__init__(name, 'Generate image for U-Boot', r'mkimage version (.*)') 22 23 # pylint: disable=R0913 24 def run(self, reset_timestamp=False, output_fname=None, external=False, 25 pad=None, align=None, keys_dir=None): 26 """Run mkimage 27 28 Args: 29 reset_timestamp: True to update the timestamp in the FIT 30 output_fname: Output filename to write to 31 external: True to create an 'external' FIT, where the binaries are 32 located outside the main data structure 33 pad: Bytes to use for padding the FIT devicetree output. This allows 34 other things to be easily added later, if required, such as 35 signatures 36 align: Bytes to use for alignment of the FIT and its external data 37 keys_dir: Path to directory containing private and encryption keys 38 version: True to get the mkimage version 39 """ 40 args = [] 41 if external: 42 args.append('-E') 43 if pad: 44 args += ['-p', f'{pad:x}'] 45 if align: 46 args += ['-B', f'{align:x}'] 47 if reset_timestamp: 48 args.append('-t') 49 if keys_dir: 50 args += ['-k', f'{keys_dir}'] 51 if output_fname: 52 args += ['-F', output_fname] 53 return self.run_cmd(*args) 54 55 def fetch(self, method): 56 """Fetch handler for mkimage 57 58 This installs mkimage using the apt utility. 59 60 Args: 61 method (FETCH_...): Method to use 62 63 Returns: 64 True if the file was fetched and now installed, None if a method 65 other than FETCH_BIN was requested 66 67 Raises: 68 Valuerror: Fetching could not be completed 69 """ 70 if method != bintool.FETCH_BIN: 71 return None 72 return self.apt_install('u-boot-tools') 73