mirror of
https://git.codelinaro.org/clo/qsdk/oss/boot/u-boot-2016.git
synced 2025-12-10 07:44:53 +01:00
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>
105 lines
3.1 KiB
Python
Executable file
105 lines
3.1 KiB
Python
Executable file
#
|
|
# 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()
|
|
|