#!/usr/bin/env python3 import sys import struct import subprocess import re import os import os.path import argparse 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 " + str(ptr) newaddr = hd[3] if curraddr == None: appstartaddr = newaddr curraddr = newaddr padding = newaddr - curraddr if padding < 0: assert False, "Block out of order at " + str(ptr) if padding > 10*1024*1024: assert False, "More than 10M of padding needed at " + str(ptr) if padding % 4 != 0: assert False, "Non-word padding size at " + str(ptr) while padding > 0: padding -= 4 outp.append(b"\x00\x00\x00\x00") outp.append(block[32:32 + datalen]) curraddr = newaddr + datalen return b"".join(outp) def convert_to_carray(file_content): outp = "const unsigned char 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"= 3: drives.append(words[2] + "/") return drives return parse_linux_mount_output(check_errors(subprocess.run(['mount'], capture_output=True, text=True))) def info_uf2(d): try: with open(d + INFO_FILE, mode='r') as f: return f.read() except: return "UF2 Bootloader" if __name__ == "__main__": main()