| #!/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])) |