aboutsummaryrefslogtreecommitdiff
path: root/circuitpython/lib/tinyusb/tools/mksunxi.py
blob: 04786f429cba13e5feb7576059b38cc2f36b930e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!/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]))