72 lines
2.1 KiB
Python
Executable File
72 lines
2.1 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import os
|
|
import binascii
|
|
|
|
FPGA_BITSTREAM = "FPGA/VNA/top.bin"
|
|
MCU_FW = ["Software/VNA_embedded/Debug/VNA_embedded.bin", "Software/VNA_embedded/Release/VNA_embedded.bin", "Software/VNA_embedded/build/VNA_embedded.bin"]
|
|
|
|
HEADER_SIZE = 24
|
|
|
|
f = open("combined.vnafw", "wb")
|
|
f.write(bytes("VNA!", 'utf-8'))
|
|
|
|
bitstream = open(FPGA_BITSTREAM, "rb")
|
|
latest_modification = 0
|
|
newest_mcu = ""
|
|
for path in MCU_FW:
|
|
try:
|
|
modified_time = os.path.getmtime(path)
|
|
if modified_time >= latest_modification:
|
|
latest_modification = modified_time
|
|
newest_mcu = path
|
|
except:
|
|
pass
|
|
if latest_modification == 0:
|
|
print("Couldn't find MCU firmware file")
|
|
exit(-1)
|
|
print("Using "+newest_mcu+" as MCU firmware")
|
|
firmware = open(newest_mcu, "rb")
|
|
|
|
size_FPGA = os.path.getsize(FPGA_BITSTREAM)
|
|
size_MCU = os.path.getsize(newest_mcu)
|
|
print("Got FPGA bitstream of size "+str(size_FPGA))
|
|
print("Got MCU firmware of size "+str(size_MCU))
|
|
|
|
#Create header
|
|
# Start address of FPGA bitstream
|
|
f.write((HEADER_SIZE).to_bytes(4, byteorder='little'))
|
|
# Size of FPGA bitstream
|
|
f.write(size_FPGA.to_bytes(4, byteorder='little'))
|
|
# Start address of MCU firmware
|
|
f.write((HEADER_SIZE + size_FPGA).to_bytes(4, byteorder='little'))
|
|
# Size of MCU firmware
|
|
f.write(size_MCU.to_bytes(4, byteorder='little'))
|
|
|
|
# Calculate CRC
|
|
def CRC32_from_file(filename, initial_CRC):
|
|
buf = open(filename,'rb').read()
|
|
buf = (binascii.crc32(buf, initial_CRC) & 0xFFFFFFFF)
|
|
return buf
|
|
|
|
print("Calculating CRC...", end="")
|
|
CRC = CRC32_from_file(FPGA_BITSTREAM, 0xFFFFFFFF)
|
|
CRC = CRC32_from_file(newest_mcu, CRC)
|
|
print(":"+hex(CRC))
|
|
f.write(CRC.to_bytes(4, byteorder='little'))
|
|
|
|
# Check that we used the correct header size
|
|
if f.tell() != HEADER_SIZE:
|
|
print("Incorrect header size (defined as "+str(HEADER_SIZE)+" but actual header is of size "+str(f.tell())+")")
|
|
exit(-1)
|
|
|
|
f.write(bitstream.read())
|
|
f.write(firmware.read())
|
|
|
|
if f.tell() % 256 != 0:
|
|
padding = 256 - f.tell() % 256
|
|
f.write(bytearray(padding))
|
|
|
|
print("Created combined firmware file of size "+str(f.tell()))
|
|
|