#!/usr/bin/env python3 import sys import struct def align(num, alignment): if num % alignment != 0: num += (alignment - num % alignment) return num def process_file(input, output): with open(input, 'rb') as fin: content = bytearray(fin.read()) align_value = 512 padded_length = align(len(content), align_value) # pad file to actual length content += b'\x00' * (padded_length - len(content)) struct_format = '<L8sLL' (instruction, magic, checksum, length) = struct.unpack_from(struct_format, content) if magic != b'eGON.BT0': print("Magic is invalid:", magic) return 2 checksum = 0x5F0A6C39 length = align(length, align_value) struct.pack_into(struct_format, content, 0, instruction, magic, checksum, length) checksum = 0 for i in range(0, length, 4): (n, ) = struct.unpack_from('<L', content, i) checksum += n checksum %= 4294967296 struct.pack_into(struct_format, content, 0, instruction, magic, checksum, length) with open(output, 'wb') as fout: fout.write(content) return 0 if __name__ == "__main__": if len(sys.argv) != 3: print("Usage: mksunxi.py input.bin output.bin") exit(1) exit(process_file(sys.argv[1], sys.argv[2]))