mpflash 0.8.1__py3-none-any.whl → 0.8.2__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mpflash/cli_group.py +3 -2
- mpflash/common.py +1 -1
- mpflash/config.py +10 -0
- mpflash/download.py +47 -6
- mpflash/downloaded.py +23 -6
- mpflash/flash_uf2.py +4 -6
- mpflash/flash_uf2_macos.py +13 -54
- mpflash/flash_uf2_windows.py +4 -4
- mpflash/mpboard_id/__init__.py +4 -0
- mpflash/mpboard_id/board_id.py +19 -3
- mpflash/mpboard_id/store.py +2 -1
- {mpflash-0.8.1.dist-info → mpflash-0.8.2.dist-info}/METADATA +2 -1
- {mpflash-0.8.1.dist-info → mpflash-0.8.2.dist-info}/RECORD +16 -16
- {mpflash-0.8.1.dist-info → mpflash-0.8.2.dist-info}/WHEEL +1 -1
- {mpflash-0.8.1.dist-info → mpflash-0.8.2.dist-info}/LICENSE +0 -0
- {mpflash-0.8.1.dist-info → mpflash-0.8.2.dist-info}/entry_points.txt +0 -0
mpflash/cli_group.py
CHANGED
@@ -5,8 +5,8 @@ Additional comands are added in the submodules.
|
|
5
5
|
|
6
6
|
import rich_click as click
|
7
7
|
|
8
|
-
from .config import config
|
9
|
-
from .logger import make_quiet, set_loglevel
|
8
|
+
from .config import __version__, config
|
9
|
+
from .logger import log, make_quiet, set_loglevel
|
10
10
|
|
11
11
|
|
12
12
|
def cb_verbose(ctx, param, value):
|
@@ -17,6 +17,7 @@ def cb_verbose(ctx, param, value):
|
|
17
17
|
set_loglevel("TRACE")
|
18
18
|
else:
|
19
19
|
set_loglevel("DEBUG")
|
20
|
+
log.debug(f"version: {__version__}")
|
20
21
|
else:
|
21
22
|
set_loglevel("INFO")
|
22
23
|
config.verbose = False
|
mpflash/common.py
CHANGED
@@ -47,7 +47,7 @@ class FWInfo:
|
|
47
47
|
firmware: str = field(default="") # url or path to original firmware image
|
48
48
|
variant: str = field(default="") # MicroPython variant
|
49
49
|
preview: bool = field(default=False) # True if the firmware is a preview version
|
50
|
-
version: str = field(default="") # MicroPython version
|
50
|
+
version: str = field(default="") # MicroPython version (NO v prefix)
|
51
51
|
url: str = field(default="") # url to the firmware image download folder
|
52
52
|
build: str = field(default="0") # The build = number of commits since the last release
|
53
53
|
ext: str = field(default="") # the file extension of the firmware
|
mpflash/config.py
CHANGED
@@ -3,9 +3,18 @@
|
|
3
3
|
from pathlib import Path
|
4
4
|
from typing import List
|
5
5
|
|
6
|
+
import pkg_resources
|
6
7
|
import platformdirs
|
7
8
|
|
8
9
|
|
10
|
+
def get_version():
|
11
|
+
name = __package__ or "mpflash"
|
12
|
+
try:
|
13
|
+
return pkg_resources.get_distribution(name).version
|
14
|
+
except pkg_resources.DistributionNotFound:
|
15
|
+
return "Package not found"
|
16
|
+
|
17
|
+
|
9
18
|
class MPtoolConfig:
|
10
19
|
"""Centralized configuration for mpflash"""
|
11
20
|
|
@@ -19,3 +28,4 @@ class MPtoolConfig:
|
|
19
28
|
|
20
29
|
|
21
30
|
config = MPtoolConfig()
|
31
|
+
__version__ = get_version()
|
mpflash/download.py
CHANGED
@@ -19,8 +19,10 @@ from loguru import logger as log
|
|
19
19
|
from rich.progress import track
|
20
20
|
|
21
21
|
from mpflash.common import PORT_FWTYPES, FWInfo
|
22
|
+
from mpflash.downloaded import clean_downloaded_firmwares
|
22
23
|
from mpflash.errors import MPFlashError
|
23
24
|
from mpflash.mpboard_id import get_known_ports
|
25
|
+
from mpflash.vendor.versions import clean_version
|
24
26
|
|
25
27
|
# avoid conflict with the ujson used by MicroPython
|
26
28
|
jsonlines.ujson = None # type: ignore
|
@@ -157,7 +159,7 @@ def get_boards(ports: List[str], boards: List[str], clean: bool) -> List[FWInfo]
|
|
157
159
|
# board["firmware"] = _url
|
158
160
|
# board["preview"] = "preview" in _url # type: ignore
|
159
161
|
if ver_match := re.search(RE_VERSION_PREVIEW, _url):
|
160
|
-
fw_info.version = ver_match.group(1)
|
162
|
+
fw_info.version = clean_version(ver_match.group(1))
|
161
163
|
fw_info.build = ver_match.group(2) or "0"
|
162
164
|
fw_info.preview = fw_info.build != "0"
|
163
165
|
# # else:
|
@@ -193,9 +195,21 @@ def download_firmwares(
|
|
193
195
|
force: bool = False,
|
194
196
|
clean: bool = True,
|
195
197
|
) -> int:
|
198
|
+
"""
|
199
|
+
Downloads firmware files based on the specified firmware folder, ports, boards, versions, force flag, and clean flag.
|
200
|
+
|
201
|
+
Args:
|
202
|
+
firmware_folder : The folder to save the downloaded firmware files.
|
203
|
+
ports : The list of ports to check for firmware.
|
204
|
+
boards : The list of boards to download firmware for.
|
205
|
+
versions : The list of versions to download firmware for.
|
206
|
+
force : A flag indicating whether to force the download even if the firmware file already exists.
|
207
|
+
clean : A flag indicating to clean the date from the firmware filename.
|
208
|
+
"""
|
196
209
|
skipped = downloaded = 0
|
197
|
-
if versions is None
|
198
|
-
|
210
|
+
versions = [] if versions is None else [clean_version(v) for v in versions]
|
211
|
+
# handle renamed boards
|
212
|
+
boards = add_renamed_boards(boards)
|
199
213
|
|
200
214
|
unique_boards = get_firmware_list(ports, boards, versions, clean)
|
201
215
|
|
@@ -232,7 +246,9 @@ def download_firmwares(
|
|
232
246
|
continue
|
233
247
|
writer.write(board.to_dict())
|
234
248
|
downloaded += 1
|
235
|
-
|
249
|
+
if downloaded > 0:
|
250
|
+
clean_downloaded_firmwares(firmware_folder)
|
251
|
+
log.success(f"Downloaded {downloaded} firmwares, skipped {skipped} existing files.")
|
236
252
|
return downloaded + skipped
|
237
253
|
|
238
254
|
|
@@ -293,7 +309,7 @@ def download(
|
|
293
309
|
boards : The list of boards to download firmware for.
|
294
310
|
versions : The list of versions to download firmware for.
|
295
311
|
force : A flag indicating whether to force the download even if the firmware file already exists.
|
296
|
-
clean : A flag indicating whether to
|
312
|
+
clean : A flag indicating whether to clean the date from the firmware filename.
|
297
313
|
|
298
314
|
Returns:
|
299
315
|
int: The number of downloaded firmware files.
|
@@ -305,7 +321,7 @@ def download(
|
|
305
321
|
if not boards:
|
306
322
|
log.critical("No boards found, please connect a board or specify boards to download firmware for.")
|
307
323
|
raise MPFlashError("No boards found")
|
308
|
-
|
324
|
+
|
309
325
|
try:
|
310
326
|
destination.mkdir(exist_ok=True, parents=True)
|
311
327
|
except (PermissionError, FileNotFoundError) as e:
|
@@ -318,3 +334,28 @@ def download(
|
|
318
334
|
raise MPFlashError("Could not connect to micropython.org") from e
|
319
335
|
|
320
336
|
return result
|
337
|
+
|
338
|
+
|
339
|
+
def add_renamed_boards(boards: List[str]) -> List[str]:
|
340
|
+
"""
|
341
|
+
Adds the renamed boards to the list of boards.
|
342
|
+
|
343
|
+
Args:
|
344
|
+
boards : The list of boards to add the renamed boards to.
|
345
|
+
|
346
|
+
Returns:
|
347
|
+
List[str]: The list of boards with the renamed boards added.
|
348
|
+
|
349
|
+
"""
|
350
|
+
renamed = {
|
351
|
+
"PICO": ["RPI_PICO"],
|
352
|
+
"PICO_W": ["RPI_PICO_W"],
|
353
|
+
"GENERIC": ["ESP32_GENERIC", "ESP8266_GENERIC"], # just add both of them
|
354
|
+
}
|
355
|
+
_boards = boards.copy()
|
356
|
+
for board in boards:
|
357
|
+
if board in renamed and renamed[board] not in boards:
|
358
|
+
_boards.extend(renamed[board])
|
359
|
+
if board != board.upper() and board.upper() not in boards:
|
360
|
+
_boards.append(board.upper())
|
361
|
+
return _boards
|
mpflash/downloaded.py
CHANGED
@@ -24,10 +24,25 @@ def downloaded_firmwares(fw_folder: Path) -> List[FWInfo]:
|
|
24
24
|
return firmwares
|
25
25
|
|
26
26
|
|
27
|
+
def clean_downloaded_firmwares(fw_folder: Path) -> None:
|
28
|
+
"""
|
29
|
+
Remove duplicate entries from the firmware.jsonl file, keeping the latest one
|
30
|
+
uniqueness is based on the filename
|
31
|
+
"""
|
32
|
+
firmwares = downloaded_firmwares(fw_folder)
|
33
|
+
if not firmwares:
|
34
|
+
return
|
35
|
+
# keep the latest entry
|
36
|
+
unique_fw = {fw.filename: fw for fw in firmwares}
|
37
|
+
with jsonlines.open(fw_folder / "firmware.jsonl", "w") as writer:
|
38
|
+
for fw in unique_fw.values():
|
39
|
+
writer.write(fw.to_dict())
|
40
|
+
log.info(f"Removed duplicate entries from firmware.jsonl in {fw_folder}")
|
41
|
+
|
27
42
|
def find_downloaded_firmware(
|
28
43
|
*,
|
29
44
|
board_id: str,
|
30
|
-
version: str = "",
|
45
|
+
version: str = "", # v1.2.3
|
31
46
|
port: str = "",
|
32
47
|
variants: bool = False,
|
33
48
|
fw_folder: Optional[Path] = None,
|
@@ -43,16 +58,16 @@ def find_downloaded_firmware(
|
|
43
58
|
log.error("No firmware files found. Please download the firmware first.")
|
44
59
|
return []
|
45
60
|
# filter by version
|
46
|
-
version = clean_version(version
|
61
|
+
version = clean_version(version)
|
47
62
|
fw_list = filter_downloaded_fwlist(fw_list, board_id, version, port, variants, selector)
|
48
63
|
|
49
64
|
if not fw_list and trie < 3:
|
50
65
|
log.info(f"Try ({trie+1}) to find a firmware for the board {board_id}")
|
51
66
|
if trie == 1:
|
52
|
-
# ESP board naming conventions have changed by adding a PORT
|
67
|
+
# ESP board naming conventions have changed by adding a PORT prefix
|
53
68
|
if port.startswith("esp") and not board_id.startswith(port.upper()):
|
54
69
|
board_id = f"{port.upper()}_{board_id}"
|
55
|
-
# RP2 board naming conventions have changed by adding a
|
70
|
+
# RP2 board naming conventions have changed by adding a _RPI prefix
|
56
71
|
if port == "rp2" and not board_id.startswith("RPI_"):
|
57
72
|
board_id = f"RPI_{board_id}"
|
58
73
|
elif trie == 2:
|
@@ -75,7 +90,7 @@ def find_downloaded_firmware(
|
|
75
90
|
def filter_downloaded_fwlist(
|
76
91
|
fw_list: List[FWInfo],
|
77
92
|
board_id: str,
|
78
|
-
version: str,
|
93
|
+
version: str, # v1.2.3
|
79
94
|
port: str,
|
80
95
|
# preview: bool,
|
81
96
|
variants: bool,
|
@@ -86,7 +101,9 @@ def filter_downloaded_fwlist(
|
|
86
101
|
# never get a preview for an older version
|
87
102
|
fw_list = [fw for fw in fw_list if fw.preview]
|
88
103
|
else:
|
89
|
-
|
104
|
+
# FWInfo version has no v1.2.3 prefix
|
105
|
+
_version = clean_version(version, drop_v=True)
|
106
|
+
fw_list = [fw for fw in fw_list if fw.version == _version]
|
90
107
|
|
91
108
|
# filter by port
|
92
109
|
if port:
|
mpflash/flash_uf2.py
CHANGED
@@ -14,7 +14,7 @@ from rich.progress import track
|
|
14
14
|
from mpflash.mpremoteboard import MPRemoteBoard
|
15
15
|
|
16
16
|
from .common import PORT_FWTYPES
|
17
|
-
from .
|
17
|
+
from .flash_uf2_boardid import get_board_id
|
18
18
|
from .flash_uf2_linux import dismount_uf2_linux, wait_for_UF2_linux
|
19
19
|
from .flash_uf2_macos import wait_for_UF2_macos
|
20
20
|
from .flash_uf2_windows import wait_for_UF2_windows
|
@@ -45,11 +45,7 @@ def flash_uf2(mcu: MPRemoteBoard, fw_file: Path, erase: bool) -> Optional[MPRemo
|
|
45
45
|
destination = wait_for_UF2_windows()
|
46
46
|
elif sys.platform == "darwin":
|
47
47
|
log.warning(f"OS {sys.platform} not tested/supported")
|
48
|
-
|
49
|
-
if "macos_uf2" in config.tests:
|
50
|
-
destination = wait_for_UF2_macos()
|
51
|
-
else:
|
52
|
-
destination = wait_for_UF2_linux()
|
48
|
+
destination = wait_for_UF2_macos()
|
53
49
|
else:
|
54
50
|
log.warning(f"OS {sys.platform} not tested/supported")
|
55
51
|
return None
|
@@ -59,6 +55,8 @@ def flash_uf2(mcu: MPRemoteBoard, fw_file: Path, erase: bool) -> Optional[MPRemo
|
|
59
55
|
return None
|
60
56
|
|
61
57
|
log.info("Board is in bootloader mode")
|
58
|
+
board_id = get_board_id(destination) # type: ignore
|
59
|
+
log.info(f"Board ID: {board_id}")
|
62
60
|
log.info(f"Copying {fw_file} to {destination}.")
|
63
61
|
shutil.copy(fw_file, destination)
|
64
62
|
log.success("Done copying, resetting the board and wait for it to restart")
|
mpflash/flash_uf2_macos.py
CHANGED
@@ -6,73 +6,32 @@ from __future__ import annotations
|
|
6
6
|
import sys
|
7
7
|
import time
|
8
8
|
from pathlib import Path
|
9
|
+
from typing import Optional
|
9
10
|
|
10
11
|
from loguru import logger as log
|
11
12
|
from rich.progress import track
|
12
13
|
|
13
14
|
from .flash_uf2_boardid import get_board_id
|
14
|
-
from .uf2disk import UF2Disk
|
15
15
|
|
16
16
|
|
17
|
-
def
|
18
|
-
"""
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
log.error("pumount only works on Linux")
|
23
|
-
return
|
24
|
-
# import blkinfo only on linux
|
25
|
-
from blkinfo import BlkDiskInfo
|
26
|
-
|
27
|
-
myblkd = BlkDiskInfo()
|
28
|
-
filters = {
|
29
|
-
"tran": "usb",
|
30
|
-
}
|
31
|
-
usb_disks = myblkd.get_disks(filters)
|
32
|
-
for disk in usb_disks:
|
33
|
-
if disk["fstype"] == "vfat":
|
34
|
-
uf2_part = disk
|
35
|
-
# unpartioned usb disk or partition (e.g. /dev/sdb )
|
36
|
-
# SEEED WIO Terminal is unpartioned
|
37
|
-
# print( json.dumps(uf2_part, indent=4))
|
38
|
-
uf2 = UF2Disk()
|
39
|
-
uf2.device_path = "/dev/" + uf2_part["name"]
|
40
|
-
uf2.label = uf2_part["label"]
|
41
|
-
uf2.mountpoint = uf2_part["mountpoint"]
|
42
|
-
yield uf2
|
43
|
-
elif disk["type"] == "disk" and disk.get("children") and len(disk.get("children")) > 0:
|
44
|
-
if disk.get("children")[0]["type"] == "part" and disk.get("children")[0]["fstype"] == "vfat":
|
45
|
-
uf2_part = disk.get("children")[0]
|
46
|
-
# print( json.dumps(uf2_part, indent=4))
|
47
|
-
uf2 = UF2Disk()
|
48
|
-
uf2.device_path = "/dev/" + uf2_part["name"]
|
49
|
-
uf2.label = uf2_part["label"]
|
50
|
-
uf2.mountpoint = uf2_part["mountpoint"]
|
51
|
-
yield uf2
|
52
|
-
|
53
|
-
|
54
|
-
def wait_for_UF2_macos(s_max: int = 10):
|
55
|
-
destination = ""
|
56
|
-
wait = 10
|
57
|
-
uf2_drives = []
|
58
|
-
# while not destination and wait > 0:
|
17
|
+
def wait_for_UF2_macos(s_max: int = 10) -> Optional[Path]:
|
18
|
+
"""Wait for the MCU to mount as a drive"""
|
19
|
+
if s_max < 1:
|
20
|
+
s_max = 10
|
21
|
+
destination = None
|
59
22
|
for _ in track(
|
60
23
|
range(s_max), description="Waiting for mcu to mount as a drive", transient=True, refresh_per_second=2
|
61
24
|
):
|
62
|
-
# log.info(f"Waiting for mcu to mount as a drive : {
|
63
|
-
|
64
|
-
for
|
65
|
-
time.sleep(1)
|
25
|
+
# log.info(f"Waiting for mcu to mount as a drive : {n} seconds left")
|
26
|
+
vol_mounts = Path("/Volumes").iterdir()
|
27
|
+
for vol in vol_mounts:
|
66
28
|
try:
|
67
|
-
if Path(
|
68
|
-
|
69
|
-
destination = Path(drive.mountpoint)
|
29
|
+
if Path(vol, "INFO_UF2.TXT").exists():
|
30
|
+
destination = Path(vol)
|
70
31
|
break
|
71
|
-
except
|
72
|
-
|
73
|
-
continue
|
32
|
+
except OSError:
|
33
|
+
pass
|
74
34
|
if destination:
|
75
35
|
break
|
76
36
|
time.sleep(1)
|
77
|
-
wait -= 1
|
78
37
|
return destination
|
mpflash/flash_uf2_windows.py
CHANGED
@@ -5,25 +5,25 @@ from __future__ import annotations
|
|
5
5
|
|
6
6
|
import time
|
7
7
|
from pathlib import Path
|
8
|
+
from typing import Optional
|
8
9
|
|
9
10
|
import psutil
|
10
11
|
from rich.progress import track
|
11
12
|
|
12
|
-
from .flash_uf2_boardid import get_board_id
|
13
13
|
|
14
14
|
|
15
|
-
|
15
|
+
|
16
|
+
def wait_for_UF2_windows(s_max: int = 10) -> Optional[Path]:
|
16
17
|
"""Wait for the MCU to mount as a drive"""
|
17
18
|
if s_max < 1:
|
18
19
|
s_max = 10
|
19
|
-
destination =
|
20
|
+
destination = None
|
20
21
|
for _ in track(range(s_max), description="Waiting for mcu to mount as a drive", transient=True,refresh_per_second=2):
|
21
22
|
# log.info(f"Waiting for mcu to mount as a drive : {n} seconds left")
|
22
23
|
drives = [drive.device for drive in psutil.disk_partitions()]
|
23
24
|
for drive in drives:
|
24
25
|
try:
|
25
26
|
if Path(drive, "INFO_UF2.TXT").exists():
|
26
|
-
board_id = get_board_id(Path(drive)) # type: ignore
|
27
27
|
destination = Path(drive)
|
28
28
|
break
|
29
29
|
except OSError:
|
mpflash/mpboard_id/__init__.py
CHANGED
@@ -77,10 +77,14 @@ def known_stored_boards(port: str, versions: Optional[List[str]] = None) -> List
|
|
77
77
|
@lru_cache(maxsize=20)
|
78
78
|
def find_known_board(board_id: str) -> Board:
|
79
79
|
"""Find the board for the given BOARD_ID or 'board description' and return the board info as a Board object"""
|
80
|
+
# FIXME : functional overlap with:
|
81
|
+
# mpboard_id\board_id.py _find_board_id_by_description
|
80
82
|
info = read_known_boardinfo()
|
81
83
|
for board_info in info:
|
82
84
|
if board_id in (board_info.board_id, board_info.description):
|
83
85
|
if not board_info.cpu:
|
86
|
+
# safeguard for older board_info.json files
|
87
|
+
print(f"Board {board_id} has no CPU info, using port as CPU")
|
84
88
|
if " with " in board_info.description:
|
85
89
|
board_info.cpu = board_info.description.split(" with ")[-1]
|
86
90
|
else:
|
mpflash/mpboard_id/board_id.py
CHANGED
@@ -44,7 +44,23 @@ def _find_board_id_by_description(
|
|
44
44
|
"""
|
45
45
|
Find the MicroPython BOARD_ID based on the description in the firmware
|
46
46
|
using the pre-built board_info.json file
|
47
|
+
|
48
|
+
Parameters:
|
49
|
+
descr: str
|
50
|
+
Description of the board
|
51
|
+
short_descr: str
|
52
|
+
Short description of the board (optional)
|
53
|
+
version: str
|
54
|
+
Version of the MicroPython firmware
|
55
|
+
board_info: Path
|
56
|
+
Path to the board_info.json file (optional)
|
57
|
+
|
47
58
|
"""
|
59
|
+
# FIXME: functional overlap with
|
60
|
+
# src\mpflash\mpflash\mpboard_id\__init__.py find_known_board
|
61
|
+
|
62
|
+
if not short_descr and " with " in descr:
|
63
|
+
short_descr = descr.split(" with ")[0]
|
48
64
|
|
49
65
|
candidate_boards = read_known_boardinfo(board_info)
|
50
66
|
|
@@ -58,10 +74,10 @@ def _find_board_id_by_description(
|
|
58
74
|
# FIXME if latest stable is newer than the last version in the boardlist this will fail
|
59
75
|
log.trace(f"Version {version} not found in board info, using latest known version {known_versions[-1]}")
|
60
76
|
version = known_versions[-1]
|
61
|
-
version_matches
|
62
|
-
|
77
|
+
if version_matches := [b for b in candidate_boards if b.version.startswith(version)]:
|
78
|
+
candidate_boards = version_matches
|
79
|
+
else:
|
63
80
|
raise MPFlashError(f"No board info found for version {version}")
|
64
|
-
candidate_boards = version_matches
|
65
81
|
matches = [b for b in candidate_boards if b.description == descr]
|
66
82
|
if not matches and short_descr:
|
67
83
|
matches = [b for b in candidate_boards if b.description == short_descr]
|
mpflash/mpboard_id/store.py
CHANGED
@@ -13,10 +13,11 @@ HERE = Path(__file__).parent
|
|
13
13
|
|
14
14
|
|
15
15
|
def write_boardinfo_json(board_list: List[Board], *, folder: Path):
|
16
|
-
"""Writes the board information to JSON
|
16
|
+
"""Writes the board information to a JSON file.
|
17
17
|
|
18
18
|
Args:
|
19
19
|
board_list (List[Board]): The list of Board objects.
|
20
|
+
folder (Path): The folder where the compressed JSON file will be saved.
|
20
21
|
"""
|
21
22
|
import zipfile
|
22
23
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: mpflash
|
3
|
-
Version: 0.8.
|
3
|
+
Version: 0.8.2
|
4
4
|
Summary: Flash and download tool for MicroPython firmwares
|
5
5
|
Home-page: https://github.com/Josverl/micropython-stubber/blob/main/src/mpflash/README.md
|
6
6
|
License: MIT
|
@@ -13,6 +13,7 @@ Classifier: Programming Language :: Python :: 3
|
|
13
13
|
Classifier: Programming Language :: Python :: 3.9
|
14
14
|
Classifier: Programming Language :: Python :: 3.10
|
15
15
|
Classifier: Programming Language :: Python :: 3.11
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
16
17
|
Classifier: Programming Language :: Python :: Implementation :: CPython
|
17
18
|
Classifier: Programming Language :: Python :: Implementation :: MicroPython
|
18
19
|
Classifier: Topic :: Software Development :: Build Tools
|
@@ -3,33 +3,33 @@ mpflash/add_firmware.py,sha256=u_g9mID557fptLEJ1Nld9n27V1R1og8uEkadm0O3YTw,3435
|
|
3
3
|
mpflash/ask_input.py,sha256=e54WfgktG7Ff8dBUknXioROq3lPNZ-eacUjfmUvFfS0,8496
|
4
4
|
mpflash/cli_download.py,sha256=6ctC4ga6q2LcpHUHMrz1trbePziQpuIFPbjcJnc3K7E,3645
|
5
5
|
mpflash/cli_flash.py,sha256=QHEb-e2ABjISfuGCWpTxOM7kkcTZSQxBXmVaWh3WVnE,7074
|
6
|
-
mpflash/cli_group.py,sha256
|
6
|
+
mpflash/cli_group.py,sha256=nrihkm74X8pX1jPM72W8ljoc5rYL6ggGOQFRaOldhLo,2038
|
7
7
|
mpflash/cli_list.py,sha256=Mdaf13gKZCoLp8Y2ja0L5rYMzkE_t3d4r62bF7isI3E,1997
|
8
8
|
mpflash/cli_main.py,sha256=yABFFf45TpPMcC1qEVARAWe4EI9zui2pUXjoPms0mq8,1030
|
9
|
-
mpflash/common.py,sha256=
|
10
|
-
mpflash/config.py,sha256=
|
9
|
+
mpflash/common.py,sha256=MmyLadb_z7bhVy6U8jb4f3pnBK8n7x28smFBcA9ZfGg,5608
|
10
|
+
mpflash/config.py,sha256=R7PomStIFHSTnLhpWhw9P2DL_b-8a8Wrja3aY-dPm6A,762
|
11
11
|
mpflash/connected.py,sha256=CBG_DJ33OPWAPbX-ICQpL1LcFOhNYpLUSB0Q5v7gi9s,3029
|
12
|
-
mpflash/download.py,sha256=
|
13
|
-
mpflash/downloaded.py,sha256=
|
12
|
+
mpflash/download.py,sha256=NErA2SJEhXnTElvq6z4BJl-L-5M_ETJpqX6pM0oubsg,14290
|
13
|
+
mpflash/downloaded.py,sha256=lxwRP-7gE9TO23jKG5Ov6TCsRA1kM8rzZEdceA163Uk,4520
|
14
14
|
mpflash/errors.py,sha256=Q5LR12Wo8iUCg5n_qq4GjdBdBflbvCOdKsRJ5InYRfI,96
|
15
15
|
mpflash/flash.py,sha256=JoskuwaHVYqeG4YW8kgbv26vPFnqDmkTz1VRs-pTRiY,2468
|
16
16
|
mpflash/flash_esp.py,sha256=dEc_B7-f1BMUGBMrwIm83ulcCqaS5MlrPAp3FCNgNfk,2311
|
17
17
|
mpflash/flash_stm32.py,sha256=d4BoQl3a9Tchnvn2ZTuq2MpYBB4MTaRukwtEncI95k0,823
|
18
18
|
mpflash/flash_stm32_cube.py,sha256=w7aGWjReeWUKl0Q3ZjXH8BRqNO1Tk9AO7gtRNUg1c9Y,3970
|
19
19
|
mpflash/flash_stm32_dfu.py,sha256=G70EZodWb-aRi507Jxbys-VEwbBGU1oZacow3_nq-d4,2972
|
20
|
-
mpflash/flash_uf2.py,sha256=
|
20
|
+
mpflash/flash_uf2.py,sha256=2IKgEOnlsB9bILJWHILMKbGo9b39NKazBWp1-T_eKKs,2463
|
21
21
|
mpflash/flash_uf2_boardid.py,sha256=WZKucGu_hJ8ymb236uuZbiR6pD6AA_l4LA-7LwtQhq8,414
|
22
22
|
mpflash/flash_uf2_linux.py,sha256=Oy9V4g7JSuks2hHFeO_OHdBKSGktbqZOtsivuxfl-xg,4055
|
23
|
-
mpflash/flash_uf2_macos.py,sha256=
|
24
|
-
mpflash/flash_uf2_windows.py,sha256=
|
23
|
+
mpflash/flash_uf2_macos.py,sha256=HGUg2HSw4qalfSP7npLYgos2WlVRxtOVTDcAnBL7qPY,1078
|
24
|
+
mpflash/flash_uf2_windows.py,sha256=a-iIGPkwIoUXA7atCz0_uZp-kipSL24P-IE5ka1B1Mk,1025
|
25
25
|
mpflash/list.py,sha256=0TawTkwhjKPPj7nTHoDn8nQ54WOkGRurP1BJVeg956g,2963
|
26
26
|
mpflash/logger.py,sha256=dI_H_a7EOdQJyvoeRHQuYeZuTKYVUS3DUPTLhE9rkdM,1098
|
27
|
-
mpflash/mpboard_id/__init__.py,sha256=
|
27
|
+
mpflash/mpboard_id/__init__.py,sha256=9IS8E-4eimd_bclgGgWE1wGEx0IRzKnu5Jzl8pQih_g,3816
|
28
28
|
mpflash/mpboard_id/add_boards.py,sha256=OWclyLWf9L-pCVmZ22b-xQYfvi3yQVsJHmGMgMzWxoU,9684
|
29
29
|
mpflash/mpboard_id/board.py,sha256=CwtBux8y7GDUe7CADVxL8YefGRl9Fg8OAJBUhgaBYCI,1151
|
30
|
-
mpflash/mpboard_id/board_id.py,sha256=
|
30
|
+
mpflash/mpboard_id/board_id.py,sha256=uVBbqksE1S4RPO1kNAVk4-xJWj6vwAX6QeuE0ekkZEc,2964
|
31
31
|
mpflash/mpboard_id/board_info.zip,sha256=F6YowS96DAqjten4ySe4MXgZwPtE-saZOUfY5OQkqKk,19759
|
32
|
-
mpflash/mpboard_id/store.py,sha256=
|
32
|
+
mpflash/mpboard_id/store.py,sha256=4lLEff6a30lIOb4fOYYzanE4G4qfgikfprmpV1eUf2U,1536
|
33
33
|
mpflash/mpremoteboard/__init__.py,sha256=fJ_N1F6R3CfP9F7pmocb5l8yRvzmSmtHi4u_uTQHR1w,7683
|
34
34
|
mpflash/mpremoteboard/mpy_fw_info.py,sha256=6AQbN3jtQgllqWQYl4e-63KeEtV08EXk8_JnM6XBkvo,4554
|
35
35
|
mpflash/mpremoteboard/runner.py,sha256=-PgzAeBGbyXaAUlwyiw4mcINsP2U1XRRjP1_QdBrxpg,4786
|
@@ -40,8 +40,8 @@ mpflash/vendor/pydfu.py,sha256=_MdBRo1EeNeKDqFPSTB5tNL1jGSBJgsVeVjE5e7Pb8s,20542
|
|
40
40
|
mpflash/vendor/readme.md,sha256=iIIZxuLUIGHQ0KODzYVtMezsztvyxCXcNJp_AzwTIPk,86
|
41
41
|
mpflash/vendor/versions.py,sha256=thk1a5wEEhXIQoL0zZ7oooeFyQeSoI00CIUbZF0b3rI,3783
|
42
42
|
mpflash/worklist.py,sha256=MKHDynttVP3lsHSfb7DEqeQ2mRV0da96lD4lIcS_zQY,5962
|
43
|
-
mpflash-0.8.
|
44
|
-
mpflash-0.8.
|
45
|
-
mpflash-0.8.
|
46
|
-
mpflash-0.8.
|
47
|
-
mpflash-0.8.
|
43
|
+
mpflash-0.8.2.dist-info/entry_points.txt,sha256=Jk_visOhYOsZIcSP2Ms9hKqfKy1iorR-6dYltSoWCpY,52
|
44
|
+
mpflash-0.8.2.dist-info/LICENSE,sha256=mWpNhsIxWzetYNnTpr4eb3HtgsxGIC8KcYWxXEcxQvE,1077
|
45
|
+
mpflash-0.8.2.dist-info/METADATA,sha256=N1kDSCr4LilmXiMUdcs190wEJgNm_X8Vshh5D4GCRLo,15275
|
46
|
+
mpflash-0.8.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
47
|
+
mpflash-0.8.2.dist-info/RECORD,,
|
File without changes
|
File without changes
|