#!/usr/bin/env python3 import sys import struct import subprocess import re import os import os.path import argparse import json from time import sleep UF2_MAGIC_START0 = 0x0A324655 # "UF2\n" UF2_MAGIC_START1 = 0x9E5D5157 # Randomly selected UF2_MAGIC_END = 0x0AB16F30 # Ditto INFO_FILE = "/INFO_UF2.TXT" appstartaddr = 0x2000 familyid = 0x0 def is_uf2(buf): w = struct.unpack(" 476: assert False, "Invalid UF2 data size at " + ptr newaddr = hd[3] if (hd[2] & 0x2000) and (currfamilyid == None): currfamilyid = hd[7] if curraddr == None or ((hd[2] & 0x2000) and hd[7] != currfamilyid): currfamilyid = hd[7] curraddr = newaddr if familyid == 0x0 or familyid == hd[7]: appstartaddr = newaddr padding = newaddr - curraddr if padding < 0: assert False, "Block out of order at " + ptr if padding > 10*1024*1024: assert False, "More than 10M of padding needed at " + ptr if padding % 4 != 0: assert False, "Non-word padding size at " + ptr while padding > 0: padding -= 4 outp.append(b"\x00\x00\x00\x00") if familyid == 0x0 or ((hd[2] & 0x2000) and familyid == hd[7]): outp.append(block[32 : 32 + datalen]) curraddr = newaddr + datalen if hd[2] & 0x2000: if hd[7] in families_found.keys(): if families_found[hd[7]] > newaddr: families_found[hd[7]] = newaddr else: families_found[hd[7]] = newaddr if prev_flag == None: prev_flag = hd[2] if prev_flag != hd[2]: all_flags_same = False if blockno == (numblocks - 1): print("--- UF2 File Header Info ---") families = load_families() for family_hex in families_found.keys(): family_short_name = "" for name, value in families.items(): if value == family_hex: family_short_name = name print("Family ID is {:s}, hex value is 0x{:08x}".format(family_short_name,family_hex)) print("Target Address is 0x{:08x}".format(families_found[family_hex])) if all_flags_same: print("All block flag values consistent, 0x{:04x}".format(hd[2])) else: print("Flags were not all the same") print("----------------------------") if len(families_found) > 1 and familyid == 0x0: outp = [] appstartaddr = 0x0 return b"".join(outp) def convert_to_carray(file_content): outp = "const unsigned long bindata_len = %d;\n" % len(file_content) outp += "const unsigned char bindata[] __attribute__((aligned(16))) = {" for i in range(len(file_content)): if i % 16 == 0: outp += "\n" outp += "0x%02x, " % file_content[i] outp += "\n};\n" return bytes(outp, "utf-8") def convert_to_uf2(file_content): global familyid datapadding = b"" while len(datapadding) < 512 - 256 - 32 - 4: datapadding += b"\x00\x00\x00\x00" numblocks = (len(file_content) + 255) // 256 outp = [] for blockno in range(numblocks): ptr = 256 * blockno chunk = file_content[ptr:ptr + 256] flags = 0x0 if familyid: flags |= 0x2000 hd = struct.pack(b"