From c5d203be8eea0541520dd0ab97b413974207629d Mon Sep 17 00:00:00 2001 From: Gokul Sriram Palanisamy Date: Thu, 6 Oct 2016 22:55:20 +0530 Subject: [PATCH] ipq806x: Creates u-boot.mbn by adding mbn header Adds support to add mbn header to u-boot.bin as mbn header is needed by sbl of all boards with ipq806x soc. A python script at tools/mkheader.py is included which creates u-boot.mbn from u-boot.bin. Change-Id: I070d82d9af0ed772cd4970b8fde152a8e3068823 Signed-off-by: Gokul Sriram Palanisamy --- Makefile | 7 +++ include/configs/ipq806x.h | 3 ++ tools/mkheader.py | 105 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 115 insertions(+) create mode 100755 tools/mkheader.py diff --git a/Makefile b/Makefile index 2d1ab2f0f0..e2fe97ddc4 100644 --- a/Makefile +++ b/Makefile @@ -771,6 +771,7 @@ ifneq ($(BUILD_ROM),) ALL-$(CONFIG_X86_RESET_VECTOR) += u-boot.rom endif +ALL-$(CONFIG_MBN_HEADER) += u-boot.mbn # enable combined SPL/u-boot/dtb rules for tegra ifneq ($(CONFIG_TEGRA),) ifeq ($(CONFIG_SPL),y) @@ -877,6 +878,12 @@ u-boot.bin: u-boot FORCE $(call DO_STATIC_RELA,$<,$@,$(CONFIG_SYS_TEXT_BASE)) $(BOARD_SIZE_CHECK) +quiet_cmd_mkheader = MKHEADER $@ +cmd_mkheader = $(PYTHON) tools/mkheader.py $(CONFIG_SYS_TEXT_BASE) $(CONFIG_IPQ_APPSBL_IMG_TYPE) $< $@ + +u-boot.mbn: u-boot.bin + $(call if_changed,mkheader) + u-boot.ldr: u-boot $(CREATE_LDR_ENV) $(LDR) -T $(CONFIG_CPU) -c $@ $< $(LDR_FLAGS) diff --git a/include/configs/ipq806x.h b/include/configs/ipq806x.h index e2e011394c..7c385b6944 100644 --- a/include/configs/ipq806x.h +++ b/include/configs/ipq806x.h @@ -43,6 +43,9 @@ #define CONFIG_BOOTARGS "console=ttyMSM0,115200n8" #define CONFIG_SYS_HUSH_PARSER +#define CONFIG_MBN_HEADER +#define CONFIG_IPQ_APPSBL_IMG_TYPE 0x5 + #undef CONFIG_IPQ806X_USB #ifdef CONFIG_IPQ806X_USB #define CONFIG_USB_XHCI diff --git a/tools/mkheader.py b/tools/mkheader.py new file mode 100755 index 0000000000..97f76fcdb0 --- /dev/null +++ b/tools/mkheader.py @@ -0,0 +1,105 @@ +# +# Copyright (c) 2014-2016 The Linux Foundation. All rights reserved. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License version 2 and +# only version 2 as published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# + +import sys +import struct + +def create_header(base, size, img_type): + """Returns a packed MBN header image with the specified base and size. + + @arg base: integer, specifies the image load address in RAM + @arg size: integer, specifies the size of the image + @arg img_type: integer, specifies the image type + @returns: string, the MBN header + """ + + header = [ + img_type, # Type: APPSBL + 0x3, # Version: 3 + 0x0, # Image source pointer + base, # Image destination pointer + size, # Code Size + Cert Size + Signature Size + size, # Code Size + base + size, # Destination + Code Size + 0x0, # Signature Size + base + size, # Destination + Code Size + Signature Size + 0x0, # Cert Size + ] + + header_packed = struct.pack('<10I', *header) + return header_packed + +def mkheader(base_addr, img_type, infname, outfname): + """Prepends the image with the MBN header. + + @arg base_addr: integer, specifies the image load address in RAM + @arg img_type: integer, specifies the image type + @arg infname: string, image filename + @arg outfname: string, output image with header prepended + @raises IOError: if reading/writing input/output file fails + """ + with open(infname, "rb") as infp: + image = infp.read() + insize = len(image) + + if base_addr > 0xFFFFFFFF: + raise ValueError("invalid base address") + + if base_addr + insize > 0xFFFFFFFF: + raise ValueError("invalid destination range") + + header = create_header(base_addr, insize, img_type) + with open(outfname, "wb") as outfp: + outfp.write(header) + outfp.write(image) + +def usage(msg=None): + """Print command usage. + + @arg msg: string, error message if any (default: None) + """ + if msg != None: + sys.stderr.write("mkheader: %s\n" % msg) + + print "Usage: mkheader.py " + + if msg != None: + exit(1) + +def main(): + """Main entry function""" + + if len(sys.argv) != 5: + usage("incorrect no. of arguments") + + try: + base_addr = int(sys.argv[1], 0) + img_type = int(sys.argv[2], 0) + infname = sys.argv[3] + outfname = sys.argv[4] + except ValueError as e: + sys.stderr.write("mkheader: invalid base address '%s'\n" % sys.argv[1]) + exit(1) + + try: + mkheader(base_addr, img_type, infname, outfname) + except IOError as e: + sys.stderr.write("mkheader: %s\n" % e) + exit(1) + except ValueError as e: + sys.stderr.write("mkheader: %s\n" % e) + exit(1) + +if __name__ == "__main__": + main() +