src/eric7/MicroPython/Tools/uf2conv.py

Sun, 16 Mar 2025 12:53:12 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Sun, 16 Mar 2025 12:53:12 +0100
branch
eric7
changeset 11170
6d6199d668fb
parent 10162
e7040c88b39e
permissions
-rw-r--r--

Added the Adafruit Feather nRF52840 to the list of known NRF52 boards and changed the list of known CircuitPython boards to be more explicit with respect to Adafruit boards (i.e. VID 0x239A).

9915
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
1 #!/usr/bin/env python3
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
2
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
3 # Microsoft UF2
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
4 #
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
5 # The MIT License (MIT)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
6 #
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
7 # Copyright (c) Microsoft Corporation
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
8 #
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
9 # All rights reserved.
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
10 #
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
11 # Permission is hereby granted, free of charge, to any person obtaining a copy
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
12 # of this software and associated documentation files (the "Software"), to deal
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
13 # in the Software without restriction, including without limitation the rights
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
14 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
15 # copies of the Software, and to permit persons to whom the Software is
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
16 # furnished to do so, subject to the following conditions:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
17 #
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
18 # The above copyright notice and this permission notice shall be included in all
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
19 # copies or substantial portions of the Software.
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
20 #
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
21 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
22 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
23 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
24 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
25 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
26 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
27 # SOFTWARE.
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
28
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
29 import sys
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
30 import struct
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
31 import subprocess
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
32 import re
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
33 import os
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
34 import os.path
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
35 import argparse
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
36 import json
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
37
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
38
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
39 UF2_MAGIC_START0 = 0x0A324655 # "UF2\n"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
40 UF2_MAGIC_START1 = 0x9E5D5157 # Randomly selected
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
41 UF2_MAGIC_END = 0x0AB16F30 # Ditto
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
42
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
43 INFO_FILE = "/INFO_UF2.TXT"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
44
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
45 appstartaddr = 0x2000
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
46 familyid = 0x0
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
47
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
48
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
49 def is_uf2(buf):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
50 w = struct.unpack("<II", buf[0:8])
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
51 return w[0] == UF2_MAGIC_START0 and w[1] == UF2_MAGIC_START1
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
52
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
53
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
54 def is_hex(buf):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
55 try:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
56 w = buf[0:30].decode("utf-8")
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
57 except UnicodeDecodeError:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
58 return False
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
59 if w[0] == ":" and re.match(b"^[:0-9a-fA-F\r\n]+$", buf):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
60 return True
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
61 return False
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
62
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
63
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
64 def convert_from_uf2(buf):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
65 global appstartaddr
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
66 global familyid
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
67 numblocks = len(buf) // 512
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
68 curraddr = None
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
69 currfamilyid = None
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
70 families_found = {}
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
71 prev_flag = None
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
72 all_flags_same = True
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
73 outp = []
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
74 for blockno in range(numblocks):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
75 ptr = blockno * 512
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
76 block = buf[ptr : ptr + 512]
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
77 hd = struct.unpack(b"<IIIIIIII", block[0:32])
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
78 if hd[0] != UF2_MAGIC_START0 or hd[1] != UF2_MAGIC_START1:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
79 print("Skipping block at " + ptr + "; bad magic")
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
80 continue
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
81 if hd[2] & 1:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
82 # NO-flash flag set; skip block
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
83 continue
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
84 datalen = hd[4]
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
85 if datalen > 476:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
86 assert False, "Invalid UF2 data size at " + ptr
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
87 newaddr = hd[3]
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
88 if (hd[2] & 0x2000) and (currfamilyid == None):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
89 currfamilyid = hd[7]
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
90 if curraddr == None or ((hd[2] & 0x2000) and hd[7] != currfamilyid):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
91 currfamilyid = hd[7]
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
92 curraddr = newaddr
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
93 if familyid == 0x0 or familyid == hd[7]:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
94 appstartaddr = newaddr
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
95 padding = newaddr - curraddr
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
96 if padding < 0:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
97 assert False, "Block out of order at " + ptr
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
98 if padding > 10 * 1024 * 1024:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
99 assert False, "More than 10M of padding needed at " + ptr
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
100 if padding % 4 != 0:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
101 assert False, "Non-word padding size at " + ptr
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
102 while padding > 0:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
103 padding -= 4
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
104 outp += b"\x00\x00\x00\x00"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
105 if familyid == 0x0 or ((hd[2] & 0x2000) and familyid == hd[7]):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
106 outp.append(block[32 : 32 + datalen])
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
107 curraddr = newaddr + datalen
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
108 if hd[2] & 0x2000:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
109 if hd[7] in families_found.keys():
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
110 if families_found[hd[7]] > newaddr:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
111 families_found[hd[7]] = newaddr
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
112 else:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
113 families_found[hd[7]] = newaddr
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
114 if prev_flag == None:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
115 prev_flag = hd[2]
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
116 if prev_flag != hd[2]:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
117 all_flags_same = False
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
118 if blockno == (numblocks - 1):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
119 print("--- UF2 File Header Info ---")
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
120 families = load_families()
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
121 for family_hex in families_found.keys():
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
122 family_short_name = ""
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
123 for name, value in families.items():
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
124 if value == family_hex:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
125 family_short_name = name
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
126 print(
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
127 "Family ID is {:s}, hex value is 0x{:08x}".format(
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
128 family_short_name, family_hex
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
129 )
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
130 )
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
131 print("Target Address is 0x{:08x}".format(families_found[family_hex]))
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
132 if all_flags_same:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
133 print("All block flag values consistent, 0x{:04x}".format(hd[2]))
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
134 else:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
135 print("Flags were not all the same")
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
136 print("----------------------------")
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
137 if len(families_found) > 1 and familyid == 0x0:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
138 outp = []
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
139 appstartaddr = 0x0
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
140 return b"".join(outp)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
141
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
142
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
143 def convert_to_carray(file_content):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
144 outp = "const unsigned long bindata_len = %d;\n" % len(file_content)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
145 outp += "const unsigned char bindata[] __attribute__((aligned(16))) = {"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
146 for i in range(len(file_content)):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
147 if i % 16 == 0:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
148 outp += "\n"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
149 outp += "0x%02x, " % file_content[i]
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
150 outp += "\n};\n"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
151 return bytes(outp, "utf-8")
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
152
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
153
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
154 def convert_to_uf2(file_content):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
155 global familyid
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
156 datapadding = b""
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
157 while len(datapadding) < 512 - 256 - 32 - 4:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
158 datapadding += b"\x00\x00\x00\x00"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
159 numblocks = (len(file_content) + 255) // 256
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
160 outp = []
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
161 for blockno in range(numblocks):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
162 ptr = 256 * blockno
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
163 chunk = file_content[ptr : ptr + 256]
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
164 flags = 0x0
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
165 if familyid:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
166 flags |= 0x2000
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
167 hd = struct.pack(
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
168 b"<IIIIIIII",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
169 UF2_MAGIC_START0,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
170 UF2_MAGIC_START1,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
171 flags,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
172 ptr + appstartaddr,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
173 256,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
174 blockno,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
175 numblocks,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
176 familyid,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
177 )
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
178 while len(chunk) < 256:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
179 chunk += b"\x00"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
180 block = hd + chunk + datapadding + struct.pack(b"<I", UF2_MAGIC_END)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
181 assert len(block) == 512
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
182 outp.append(block)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
183 return b"".join(outp)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
184
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
185
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
186 class Block:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
187 def __init__(self, addr):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
188 self.addr = addr
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
189 self.bytes = bytearray(256)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
190
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
191 def encode(self, blockno, numblocks):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
192 global familyid
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
193 flags = 0x0
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
194 if familyid:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
195 flags |= 0x2000
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
196 hd = struct.pack(
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
197 "<IIIIIIII",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
198 UF2_MAGIC_START0,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
199 UF2_MAGIC_START1,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
200 flags,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
201 self.addr,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
202 256,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
203 blockno,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
204 numblocks,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
205 familyid,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
206 )
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
207 hd += self.bytes[0:256]
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
208 while len(hd) < 512 - 4:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
209 hd += b"\x00"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
210 hd += struct.pack("<I", UF2_MAGIC_END)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
211 return hd
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
212
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
213
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
214 def convert_from_hex_to_uf2(buf):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
215 global appstartaddr
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
216 appstartaddr = None
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
217 upper = 0
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
218 currblock = None
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
219 blocks = []
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
220 for line in buf.split("\n"):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
221 if line[0] != ":":
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
222 continue
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
223 i = 1
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
224 rec = []
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
225 while i < len(line) - 1:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
226 rec.append(int(line[i : i + 2], 16))
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
227 i += 2
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
228 tp = rec[3]
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
229 if tp == 4:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
230 upper = ((rec[4] << 8) | rec[5]) << 16
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
231 elif tp == 2:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
232 upper = ((rec[4] << 8) | rec[5]) << 4
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
233 elif tp == 1:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
234 break
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
235 elif tp == 0:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
236 addr = upper + ((rec[1] << 8) | rec[2])
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
237 if appstartaddr == None:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
238 appstartaddr = addr
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
239 i = 4
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
240 while i < len(rec) - 1:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
241 if not currblock or currblock.addr & ~0xFF != addr & ~0xFF:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
242 currblock = Block(addr & ~0xFF)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
243 blocks.append(currblock)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
244 currblock.bytes[addr & 0xFF] = rec[i]
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
245 addr += 1
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
246 i += 1
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
247 numblocks = len(blocks)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
248 resfile = b""
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
249 for i in range(0, numblocks):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
250 resfile += blocks[i].encode(i, numblocks)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
251 return resfile
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
252
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
253
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
254 def to_str(b):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
255 return b.decode("utf-8")
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
256
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
257
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
258 def get_drives():
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
259 drives = []
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
260 if sys.platform == "win32":
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
261 r = subprocess.check_output(
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
262 [
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
263 "wmic",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
264 "PATH",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
265 "Win32_LogicalDisk",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
266 "get",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
267 "DeviceID,",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
268 "VolumeName,",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
269 "FileSystem,",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
270 "DriveType",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
271 ]
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
272 )
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
273 for line in to_str(r).split("\n"):
10162
e7040c88b39e Made some modification in preparation for Python 3.12.
Detlev Offenbach <detlev@die-offenbachs.de>
parents: 9915
diff changeset
274 words = re.split(r"\s+", line)
9915
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
275 if len(words) >= 3 and words[1] == "2" and words[2] == "FAT":
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
276 drives.append(words[0])
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
277 else:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
278 rootpath = "/media"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
279 if sys.platform == "darwin":
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
280 rootpath = "/Volumes"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
281 elif sys.platform == "linux":
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
282 tmp = rootpath + "/" + os.environ["USER"]
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
283 if os.path.isdir(tmp):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
284 rootpath = tmp
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
285 for d in os.listdir(rootpath):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
286 drives.append(os.path.join(rootpath, d))
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
287
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
288 def has_info(d):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
289 try:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
290 return os.path.isfile(d + INFO_FILE)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
291 except:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
292 return False
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
293
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
294 return list(filter(has_info, drives))
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
295
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
296
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
297 def board_id(path):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
298 with open(path + INFO_FILE, mode="r") as file:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
299 file_content = file.read()
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
300 return re.search("Board-ID: ([^\r\n]*)", file_content).group(1)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
301
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
302
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
303 def list_drives():
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
304 for d in get_drives():
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
305 print(d, board_id(d))
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
306
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
307
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
308 def write_file(name, buf):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
309 with open(name, "wb") as f:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
310 f.write(buf)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
311 print("Wrote %d bytes to %s" % (len(buf), name))
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
312
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
313
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
314 def load_families():
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
315 # The expectation is that the `uf2families.json` file is in the same
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
316 # directory as this script. Make a path that works using `__file__`
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
317 # which contains the full path to this script.
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
318 filename = "uf2families.json"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
319 pathname = os.path.join(os.path.dirname(os.path.abspath(__file__)), filename)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
320 with open(pathname) as f:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
321 raw_families = json.load(f)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
322
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
323 families = {}
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
324 for family in raw_families:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
325 families[family["short_name"]] = int(family["id"], 0)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
326
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
327 return families
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
328
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
329
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
330 def main():
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
331 global appstartaddr, familyid
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
332
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
333 def error(msg):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
334 print(msg)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
335 sys.exit(1)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
336
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
337 parser = argparse.ArgumentParser(description="Convert to UF2 or flash directly.")
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
338 parser.add_argument(
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
339 "input", metavar="INPUT", type=str, nargs="?", help="input file (HEX, BIN or UF2)"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
340 )
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
341 parser.add_argument(
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
342 "-b",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
343 "--base",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
344 dest="base",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
345 type=str,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
346 default="0x2000",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
347 help="set base address of application for BIN format (default: 0x2000)",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
348 )
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
349 parser.add_argument(
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
350 "-o",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
351 "--output",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
352 metavar="FILE",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
353 dest="output",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
354 type=str,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
355 help='write output to named file; defaults to "flash.uf2" or "flash.bin" where sensible',
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
356 )
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
357 parser.add_argument("-d", "--device", dest="device_path", help="select a device path to flash")
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
358 parser.add_argument("-l", "--list", action="store_true", help="list connected devices")
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
359 parser.add_argument("-c", "--convert", action="store_true", help="do not flash, just convert")
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
360 parser.add_argument("-D", "--deploy", action="store_true", help="just flash, do not convert")
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
361 parser.add_argument(
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
362 "-f",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
363 "--family",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
364 dest="family",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
365 type=str,
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
366 default="0x0",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
367 help="specify familyID - number or name (default: 0x0)",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
368 )
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
369 parser.add_argument(
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
370 "-C", "--carray", action="store_true", help="convert binary file to a C array, not UF2"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
371 )
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
372 parser.add_argument(
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
373 "-i",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
374 "--info",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
375 action="store_true",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
376 help="display header information from UF2, do not convert",
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
377 )
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
378 args = parser.parse_args()
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
379 appstartaddr = int(args.base, 0)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
380
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
381 families = load_families()
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
382
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
383 if args.family.upper() in families:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
384 familyid = families[args.family.upper()]
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
385 else:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
386 try:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
387 familyid = int(args.family, 0)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
388 except ValueError:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
389 error("Family ID needs to be a number or one of: " + ", ".join(families.keys()))
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
390
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
391 if args.list:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
392 list_drives()
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
393 else:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
394 if not args.input:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
395 error("Need input file")
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
396 with open(args.input, mode="rb") as f:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
397 inpbuf = f.read()
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
398 from_uf2 = is_uf2(inpbuf)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
399 ext = "uf2"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
400 if args.deploy:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
401 outbuf = inpbuf
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
402 elif from_uf2 and not args.info:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
403 outbuf = convert_from_uf2(inpbuf)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
404 ext = "bin"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
405 elif from_uf2 and args.info:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
406 outbuf = ""
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
407 convert_from_uf2(inpbuf)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
408 elif is_hex(inpbuf):
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
409 outbuf = convert_from_hex_to_uf2(inpbuf.decode("utf-8"))
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
410 elif args.carray:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
411 outbuf = convert_to_carray(inpbuf)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
412 ext = "h"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
413 else:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
414 outbuf = convert_to_uf2(inpbuf)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
415 if not args.deploy and not args.info:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
416 print(
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
417 "Converted to %s, output size: %d, start address: 0x%x"
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
418 % (ext, len(outbuf), appstartaddr)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
419 )
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
420 if args.convert or ext != "uf2":
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
421 drives = []
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
422 if args.output == None:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
423 args.output = "flash." + ext
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
424 else:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
425 drives = get_drives()
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
426
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
427 if args.output:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
428 write_file(args.output, outbuf)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
429 else:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
430 if len(drives) == 0:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
431 error("No drive to deploy.")
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
432 for d in drives:
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
433 print("Flashing %s (%s)" % (d, board_id(d)))
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
434 write_file(d + "/NEW.UF2", outbuf)
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
435
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
436
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
437 if __name__ == "__main__":
fd5ff16632cb MicroPython
Detlev Offenbach <detlev@die-offenbachs.de>
parents:
diff changeset
438 main()

eric ide

mercurial