blob: 97f76fcdb0da6fdc01988746299b3cd00eb93549 [file] [log] [blame]
#
# 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()