src/eric7/MicroPython/Tools/uf2conv.py

Fri, 21 Mar 2025 18:01:35 +0100

author
Detlev Offenbach <detlev@die-offenbachs.de>
date
Fri, 21 Mar 2025 18:01:35 +0100
branch
eric7
changeset 11183
553b50b72f5b
parent 10162
e7040c88b39e
permissions
-rw-r--r--

Fixed an issue in the MicroPython device base class determining the existence of a directory or file.

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