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