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 <gpalan@codeaurora.org>
This commit is contained in:
Gokul Sriram Palanisamy 2016-10-06 22:55:20 +05:30 committed by Gerrit - the friendly Code Review server
parent f338b8128a
commit c5d203be8e
3 changed files with 115 additions and 0 deletions

View file

@ -771,6 +771,7 @@ ifneq ($(BUILD_ROM),)
ALL-$(CONFIG_X86_RESET_VECTOR) += u-boot.rom ALL-$(CONFIG_X86_RESET_VECTOR) += u-boot.rom
endif endif
ALL-$(CONFIG_MBN_HEADER) += u-boot.mbn
# enable combined SPL/u-boot/dtb rules for tegra # enable combined SPL/u-boot/dtb rules for tegra
ifneq ($(CONFIG_TEGRA),) ifneq ($(CONFIG_TEGRA),)
ifeq ($(CONFIG_SPL),y) ifeq ($(CONFIG_SPL),y)
@ -877,6 +878,12 @@ u-boot.bin: u-boot FORCE
$(call DO_STATIC_RELA,$<,$@,$(CONFIG_SYS_TEXT_BASE)) $(call DO_STATIC_RELA,$<,$@,$(CONFIG_SYS_TEXT_BASE))
$(BOARD_SIZE_CHECK) $(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 u-boot.ldr: u-boot
$(CREATE_LDR_ENV) $(CREATE_LDR_ENV)
$(LDR) -T $(CONFIG_CPU) -c $@ $< $(LDR_FLAGS) $(LDR) -T $(CONFIG_CPU) -c $@ $< $(LDR_FLAGS)

View file

@ -43,6 +43,9 @@
#define CONFIG_BOOTARGS "console=ttyMSM0,115200n8" #define CONFIG_BOOTARGS "console=ttyMSM0,115200n8"
#define CONFIG_SYS_HUSH_PARSER #define CONFIG_SYS_HUSH_PARSER
#define CONFIG_MBN_HEADER
#define CONFIG_IPQ_APPSBL_IMG_TYPE 0x5
#undef CONFIG_IPQ806X_USB #undef CONFIG_IPQ806X_USB
#ifdef CONFIG_IPQ806X_USB #ifdef CONFIG_IPQ806X_USB
#define CONFIG_USB_XHCI #define CONFIG_USB_XHCI

105
tools/mkheader.py Executable file
View file

@ -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 <base-addr> <img_type> <input-file> <output-file>"
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()