9dd793ff19
Large segments will be chunked into 32K blocks to they can be handled seperate. Creating a maximum chunk size allows us to perform a few tricks in the reloader by allowing us to overwrite parts of the reloader whilst it is running! Signed-off-by: Daniel Thompson <daniel@redfelineninja.org.uk>
50 lines
1.4 KiB
Python
Executable file
50 lines
1.4 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
|
|
# SPDX-License-Identifier: LGPL-3.0-or-later
|
|
# Copyright (C) 2020 Daniel Thompson
|
|
|
|
import binascii
|
|
import intelhex
|
|
import sys
|
|
|
|
def generate_c(ihex):
|
|
print('/* this file is auto-generated - DO NOT EDIT */')
|
|
print()
|
|
print('#include <stdint.h>')
|
|
print()
|
|
print('struct segment {')
|
|
print(' uint32_t start;');
|
|
print(' uint32_t end;');
|
|
print(' uint32_t crc32;')
|
|
print(' const uint8_t *data;')
|
|
print('};')
|
|
print()
|
|
|
|
segments = []
|
|
chunk = 32 * 1024
|
|
for (start, end) in ihex.segments():
|
|
while start + chunk < end:
|
|
segments.append((start, start + chunk))
|
|
start += chunk
|
|
if start < end:
|
|
segments.append((start, end))
|
|
|
|
for i, segment in enumerate(segments):
|
|
print(f'static const uint8_t segment{i}[] = {{', end='')
|
|
|
|
for j in range(segment[0], segment[1]):
|
|
if 0 == j % 12:
|
|
print('\n ', end='')
|
|
print(f' 0x{ihex[j]:02x},', end='')
|
|
|
|
print('\n};\n')
|
|
print(f'const struct segment segments[] = {{')
|
|
for i, segment in enumerate(segments):
|
|
sg = ihex.tobinarray(start=segment[0], end=segment[1]-1)
|
|
crc = binascii.crc32(sg)
|
|
print(f' 0x{segment[0]:08x}, 0x{segment[1]:08x}, 0x{crc:08x}, segment{i},')
|
|
print('};')
|
|
|
|
ihex = intelhex.IntelHex()
|
|
ihex.loadhex(sys.argv[1])
|
|
generate_c(ihex)
|