2018-04-14 05:29:46 -03:00
|
|
|
#!/usr/bin/env python
|
|
|
|
|
|
|
|
'''
|
2018-07-01 20:34:44 -03:00
|
|
|
script to create ap_romfs_embedded.h from a set of static files
|
2018-04-14 05:29:46 -03:00
|
|
|
|
|
|
|
Andrew Tridgell
|
|
|
|
May 2017
|
|
|
|
'''
|
|
|
|
|
2018-07-09 03:30:49 -03:00
|
|
|
import os, sys, tempfile, gzip
|
2018-04-14 05:29:46 -03:00
|
|
|
|
2018-04-14 21:34:46 -03:00
|
|
|
def write_encode(out, s):
|
|
|
|
out.write(s.encode())
|
|
|
|
|
2019-10-23 06:52:51 -03:00
|
|
|
def embed_file(out, f, idx, embedded_name, uncompressed):
|
2018-04-14 05:29:46 -03:00
|
|
|
'''embed one file'''
|
2018-07-01 20:34:44 -03:00
|
|
|
try:
|
|
|
|
contents = open(f,'rb').read()
|
|
|
|
except Exception:
|
2021-02-25 13:26:59 -04:00
|
|
|
raise Exception("Failed to embed %s" % f)
|
2019-02-16 21:29:14 -04:00
|
|
|
|
|
|
|
pad = 0
|
|
|
|
if embedded_name.endswith("bootloader.bin"):
|
|
|
|
# round size to a multiple of 32 bytes for bootloader, this ensures
|
|
|
|
# it can be flashed on a STM32H7 chip
|
|
|
|
blen = len(contents)
|
|
|
|
pad = (32 - (blen % 32)) % 32
|
|
|
|
if pad != 0:
|
2019-12-23 02:29:18 -04:00
|
|
|
if sys.version_info[0] >= 3:
|
|
|
|
contents += bytes([0xff]*pad)
|
|
|
|
else:
|
|
|
|
for i in range(pad):
|
|
|
|
contents += bytes(chr(0xff))
|
|
|
|
print("Padded %u bytes for %s to %u" % (pad, embedded_name, len(contents)))
|
2019-02-16 21:29:14 -04:00
|
|
|
|
2021-02-25 18:04:56 -04:00
|
|
|
crc = crc32(bytearray(contents))
|
2023-01-18 00:36:52 -04:00
|
|
|
write_encode(out, '__EXTFLASHFUNC__ static const uint8_t ap_romfs_%u[] = {' % idx)
|
2018-04-14 05:29:46 -03:00
|
|
|
|
2018-07-09 03:30:49 -03:00
|
|
|
compressed = tempfile.NamedTemporaryFile()
|
2019-10-23 06:52:51 -03:00
|
|
|
if uncompressed:
|
|
|
|
# ensure nul termination
|
|
|
|
if sys.version_info[0] >= 3:
|
2019-10-25 06:10:51 -03:00
|
|
|
nul = bytearray(0)
|
2019-10-23 06:52:51 -03:00
|
|
|
else:
|
2019-10-25 06:10:51 -03:00
|
|
|
nul = chr(0)
|
|
|
|
if contents[-1] != nul:
|
|
|
|
contents += nul
|
|
|
|
compressed.write(contents)
|
2019-10-23 06:52:51 -03:00
|
|
|
else:
|
|
|
|
# compress it
|
|
|
|
f = open(compressed.name, "wb")
|
|
|
|
with gzip.GzipFile(fileobj=f, mode='wb', filename='', compresslevel=9, mtime=0) as g:
|
|
|
|
g.write(contents)
|
|
|
|
f.close()
|
2018-07-09 03:30:49 -03:00
|
|
|
|
|
|
|
compressed.seek(0)
|
|
|
|
b = bytearray(compressed.read())
|
|
|
|
compressed.close()
|
|
|
|
|
|
|
|
for c in b:
|
2018-04-14 21:34:46 -03:00
|
|
|
write_encode(out, '%u,' % c)
|
|
|
|
write_encode(out, '};\n\n');
|
2021-02-25 13:26:59 -04:00
|
|
|
return crc
|
2018-04-14 05:29:46 -03:00
|
|
|
|
2021-02-22 22:56:09 -04:00
|
|
|
def crc32(bytes, crc=0):
|
|
|
|
'''crc32 equivalent to crc32_small() from AP_Math/crc.cpp'''
|
|
|
|
for byte in bytes:
|
|
|
|
crc ^= byte
|
|
|
|
for i in range(8):
|
|
|
|
mask = (-(crc & 1)) & 0xFFFFFFFF
|
|
|
|
crc >>= 1
|
|
|
|
crc ^= (0xEDB88320 & mask)
|
|
|
|
return crc
|
|
|
|
|
2019-10-23 06:52:51 -03:00
|
|
|
def create_embedded_h(filename, files, uncompressed=False):
|
2018-04-14 05:29:46 -03:00
|
|
|
'''create a ap_romfs_embedded.h file'''
|
|
|
|
|
2018-04-14 21:34:46 -03:00
|
|
|
out = open(filename, "wb")
|
|
|
|
write_encode(out, '''// generated embedded files for AP_ROMFS\n\n''')
|
2018-04-14 05:29:46 -03:00
|
|
|
|
2020-03-12 20:25:10 -03:00
|
|
|
# remove duplicates and sort
|
|
|
|
files = sorted(list(set(files)))
|
2021-02-25 13:26:59 -04:00
|
|
|
crc = {}
|
2018-04-14 05:29:46 -03:00
|
|
|
for i in range(len(files)):
|
|
|
|
(name, filename) = files[i]
|
2021-02-25 13:26:59 -04:00
|
|
|
try:
|
|
|
|
crc[filename] = embed_file(out, filename, i, name, uncompressed)
|
|
|
|
except Exception as e:
|
|
|
|
print(e)
|
2018-07-01 20:34:44 -03:00
|
|
|
return False
|
2018-04-14 05:29:46 -03:00
|
|
|
|
2018-04-14 21:34:46 -03:00
|
|
|
write_encode(out, '''const AP_ROMFS::embedded_file AP_ROMFS::files[] = {\n''')
|
2018-04-14 05:29:46 -03:00
|
|
|
|
|
|
|
for i in range(len(files)):
|
|
|
|
(name, filename) = files[i]
|
2019-10-23 06:52:51 -03:00
|
|
|
if uncompressed:
|
|
|
|
ustr = ' (uncompressed)'
|
|
|
|
else:
|
|
|
|
ustr = ''
|
|
|
|
print("Embedding file %s:%s%s" % (name, filename, ustr))
|
2021-02-25 13:26:59 -04:00
|
|
|
write_encode(out, '{ "%s", sizeof(ap_romfs_%u), 0x%08x, ap_romfs_%u },\n' % (name, i, crc[filename], i))
|
2018-04-14 21:34:46 -03:00
|
|
|
write_encode(out, '};\n')
|
2018-04-14 05:29:46 -03:00
|
|
|
out.close()
|
2018-07-01 20:34:44 -03:00
|
|
|
return True
|
2018-04-14 05:29:46 -03:00
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
|
import sys
|
|
|
|
flist = []
|
|
|
|
for i in range(1, len(sys.argv)):
|
|
|
|
f = sys.argv[i]
|
|
|
|
flist.append((f, f))
|
|
|
|
create_embedded_h("/tmp/ap_romfs_embedded.h", flist)
|