85 lines
3.2 KiB
Python
Executable File
85 lines
3.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
#* Copyright (c) 2020 by UNISOC Technology(Shanghai), Inc. ALL RIGHTS RESERVED.
|
|
#*
|
|
#* These coded instructions, statements, and computer programs are the
|
|
#* copyrighted works and confidential proprietary information of
|
|
#* UNISOC Technology(Shanghai), Inc. They may not be modified, copied, reproduced,
|
|
#* distributed, or disclosed to third parties in any manner, medium, or form,
|
|
#* in whole or in part, without the prior written consent of UNISOC Technology(Shanghai), Inc.
|
|
|
|
from __future__ import print_function
|
|
from sys import argv, exit, stderr
|
|
from argparse import ArgumentParser, FileType, Action
|
|
from os import fstat
|
|
from struct import pack
|
|
from hashlib import sha1
|
|
import sys
|
|
|
|
def set_pad_file(f, padding):
|
|
pad = (padding - (f.tell() & (padding - 1))) & (padding - 1)
|
|
f.write(pack(str(pad) + 'x'))
|
|
|
|
def create_header(args):
|
|
magic = 'UNISOCBOOTIMAGE!'.encode()
|
|
args.output.write(pack('16s', magic))
|
|
args.output.write(pack('5I',
|
|
getfilesize(args.kernel), # size in bytes
|
|
args.base + args.kernel_offset, # physical load addr
|
|
getfilesize(args.ramdisk), # size in bytes
|
|
args.base + args.ramdisk_offset, # physical load addr
|
|
args.pagesize)) # flash page size we assume
|
|
args.output.write(pack('I', getfilesize(args.dt))) # device tree
|
|
|
|
set_pad_file(args.output, args.pagesize)
|
|
return 0
|
|
|
|
def getfilesize(f):
|
|
if f is None:
|
|
return 0
|
|
try:
|
|
print('size ', fstat(f.fileno()).st_size)
|
|
return fstat(f.fileno()).st_size
|
|
except OSError:
|
|
return 0
|
|
|
|
def write_padded_file(f_out, f_in, padding):
|
|
if f_in is None:
|
|
return
|
|
f_out.write(f_in.read())
|
|
set_pad_file(f_out, padding)
|
|
|
|
|
|
def parse_int(x):
|
|
return int(x, 0)
|
|
|
|
|
|
def parse_cmdline():
|
|
parser = ArgumentParser()
|
|
parser.add_argument('--kernel', help='path to the kernel', type=FileType('rb'),
|
|
required=True)
|
|
parser.add_argument('--ramdisk', help='path to the ramdisk', type=FileType('rb'))
|
|
parser.add_argument('--base', help='base address', type=parse_int, default=0x10000000)
|
|
parser.add_argument('--kernel_offset', help='kernel offset', type=parse_int, default=0x00008000)
|
|
parser.add_argument('--ramdisk_offset', help='ramdisk offset', type=parse_int, default=0x01000000)
|
|
parser.add_argument('--pagesize', help='page size', type=parse_int,
|
|
choices=[2**i for i in range(11,15)], default=2048)
|
|
parser.add_argument('--dt', help='device tree size', type=FileType('rb'))
|
|
parser.add_argument('-o', '--output', help='output file name', type=FileType('wb'),
|
|
required=True)
|
|
return parser.parse_args()
|
|
|
|
|
|
def create_file(args):
|
|
write_padded_file(args.output, args.kernel, args.pagesize)
|
|
write_padded_file(args.output, args.ramdisk, args.pagesize)
|
|
write_padded_file(args.output, args.dt, args.pagesize)
|
|
|
|
|
|
def main():
|
|
args = parse_cmdline()
|
|
create_header(args)
|
|
create_file(args)
|
|
|
|
if __name__ == '__main__':
|
|
main()
|