1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2024-12-02 10:24:11 +01:00
LibrePilot/flight/targets/EntireFlash/entire-flash.py
2013-03-24 14:12:08 +02:00

122 lines
4.3 KiB
Python

#!/usr/bin/env python
#
# Helper function to generate an entire flash image.
#
# (c) 2013, The OpenPilot Team, http://www.openpilot.org
# See also: The GNU Public License (GPL) Version 3
#
import optparse
import sys
def append(verbose, text, data):
"""Appends data to global image, updates global offset, prints details if verbose is set"""
global image, offset
if verbose:
print text, "0x%08x" % len(data), "@ 0x%08x" % offset, "%8d bytes" % len(data)
image += data
offset += len(data)
def create_entire_flash(args):
"""Generates entire flash image, prints image info and writes image to a file"""
global image, offset
assert args.bl_bank_base is not None
assert args.bl_bank_size is not None
assert args.fw_bank_base is not None
assert args.fw_bank_size is not None
assert args.fw_desc_size is not None
assert args.bl_bin_path is not None
assert args.fw_bin_path is not None
assert args.fwinfo_bin_path is not None
image = ""
offset = 0
pad = chr(0xff)
try:
bl_bin_file = open(args.bl_bin_path, "rb")
bl_bin = bl_bin_file.read()
bl_bin_file.close()
fw_bin_file = open(args.fw_bin_path, "rb")
fw_bin = fw_bin_file.read()
fw_bin_file.close()
fwinfo_bin_file = open(args.fwinfo_bin_path, "rb")
fwinfo_bin = fwinfo_bin_file.read()
fwinfo_bin_file.close()
pre_pad_size = args.fw_bank_base - args.bl_bank_base - args.bl_bank_size
post_pad_size = args.fw_bank_size - args.fw_desc_size - len(fw_bin)
append(args.verbose, "Bootloader image: ", bl_bin)
append(args.verbose, "Padding: ", pad * pre_pad_size)
append(args.verbose, "Firmware image: ", fw_bin)
append(args.verbose, "Padding: ", pad * post_pad_size)
append(args.verbose, "Firmware info blob: ", fwinfo_bin)
if args.verbose:
print "Entire flash image size:", offset, "bytes"
if args.outfile:
of = open(args.outfile, "wb")
of.write(image)
of.close()
except:
import traceback
traceback.print_exc()
return -2
return 0
def main():
"""Entire image data will be written to OUTFILE (if given) as concatenation of:
- bootloader + padding + firmware + padding + firmware info
"""
# Parse command line.
class RawDescriptionHelpFormatter(optparse.IndentedHelpFormatter):
"""optparse formatter function to pretty print raw epilog"""
def format_epilog(self, epilog):
if epilog:
return "\n" + epilog + "\n"
else:
return ""
parser = optparse.OptionParser(
formatter=RawDescriptionHelpFormatter(),
description = "Helper function to generate an entire flash image.",
epilog = main.__doc__);
parser.add_option('--bl-bank-base', type='long', action='store',
help='start of bootloader flash');
parser.add_option('--bl-bank-size', type='long', action='store',
help='should include BD_INFO region');
parser.add_option('--fw-bank-base', type='long', action='store',
help='start of firmware flash');
parser.add_option('--fw-bank-size', type='long', action='store',
help='should include FW_DESC_SIZE');
parser.add_option('--fw-desc-size', type='long', action='store',
help='firmware description area size');
parser.add_option('--bl-bin-path', action='store',
help='path to bootloader image');
parser.add_option('--fw-bin-path', action='store',
help='path to firmware image');
parser.add_option('--fwinfo-bin-path', action='store',
help='path to firmware info blob');
parser.add_option('--outfile', action='store',
help='name of entire flash output file');
parser.add_option('--verbose', action='store_true',
help='print addresses and sizes');
(args, positional_args) = parser.parse_args()
if (len(positional_args) != 0) or (len(sys.argv) == 1):
parser.error("incorrect number of arguments, try --help for help")
return create_entire_flash(args)
if __name__ == "__main__":
sys.exit(main())