Fixed an issue in the MicroPython device base class determining the existence of a directory or file.
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() |