mpflash 1.25.0rc1__py3-none-any.whl → 1.25.0rc3__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/ask_input.py CHANGED
@@ -11,8 +11,7 @@ from loguru import logger as log
11
11
 
12
12
  from .common import DownloadParams, FlashParams, ParamType
13
13
  from .config import config
14
- from .mpboard_id import (get_known_boards_for_port, known_ports,
15
- known_stored_boards)
14
+ from .mpboard_id import get_known_boards_for_port, known_ports, known_stored_boards
16
15
  from .mpremoteboard import MPRemoteBoard
17
16
  from .versions import micropython_versions
18
17
 
@@ -227,7 +226,7 @@ def ask_serialport(*, multi_select: bool = False, bluetooth: bool = False):
227
226
  # import only when needed to reduce load time
228
227
  import inquirer
229
228
 
230
- comports = MPRemoteBoard.connected_boards(bluetooth=bluetooth, description=True)
229
+ comports = MPRemoteBoard.connected_boards(bluetooth=bluetooth, description=True) + ["auto"]
231
230
  return inquirer.List(
232
231
  "serial",
233
232
  message="Which serial port do you want to {action} ?",
mpflash/cli_flash.py CHANGED
@@ -124,6 +124,14 @@ from mpflash.versions import clean_version
124
124
  show_default=True,
125
125
  help="""How to enter the (MicroPython) bootloader before flashing.""",
126
126
  )
127
+ @click.option(
128
+ "--force",
129
+ "-f",
130
+ default=False,
131
+ is_flag=True,
132
+ show_default=True,
133
+ help="""Force download of firmware even if it already exists.""",
134
+ )
127
135
  @click.option(
128
136
  "--flash_mode",
129
137
  "-fm",
@@ -150,8 +158,12 @@ def cli_flash_board(**kwargs) -> int:
150
158
  params.bootloader = BootloaderMethod(params.bootloader)
151
159
 
152
160
  # make it simple for the user to flash one board by asking for the serial port if not specified
153
- if params.boards == ["?"] and params.serial == "*":
161
+ if params.boards == ["?"] or params.serial == "?":
154
162
  params.serial = ["?"]
163
+ if params.boards == ["*"]:
164
+ # No bard specified
165
+ params.boards = ["?"]
166
+
155
167
  if params.fw_folder:
156
168
  config.firmware_folder = Path(params.fw_folder)
157
169
  # Detect connected boards if not specified,
@@ -214,7 +226,7 @@ def cli_flash_board(**kwargs) -> int:
214
226
  serial=params.serial[0],
215
227
  version=params.versions[0],
216
228
  )
217
- jid.ensure_firmware_downloaded(worklist, version=params.versions[0])
229
+ jid.ensure_firmware_downloaded(worklist, version=params.versions[0], force=params.force)
218
230
  if flashed := flash_list(
219
231
  worklist,
220
232
  params.erase,
mpflash/cli_list.py CHANGED
@@ -1,4 +1,5 @@
1
1
  import json
2
+ import time
2
3
  from typing import List
3
4
 
4
5
  import rich_click as click
@@ -82,5 +83,9 @@ def cli_list_mcus(serial: List[str], ignore: List[str], bluetooth: bool, as_json
82
83
  show_mcus(conn_mcus, refresh=False)
83
84
  for mcu in conn_mcus:
84
85
  # reset the board so it can continue to whatever it was running before
85
- mcu.run_command("reset")
86
+ if mcu.family == "circuitpython":
87
+ # CircuitPython boards need a special reset command
88
+ mcu.run_command(["exec", "--no-follow", "import microcontroller,time;time.sleep(0.01);microcontroller.reset()"], resume=False)
89
+ else:
90
+ mcu.run_command("reset")
86
91
  return 0 if conn_mcus else 1
mpflash/common.py CHANGED
@@ -10,7 +10,6 @@ from typing import List, Optional, Union
10
10
  from serial.tools import list_ports
11
11
  from serial.tools.list_ports_common import ListPortInfo
12
12
 
13
-
14
13
  # from mpflash.flash.esp import FlashMode
15
14
  from .logger import log
16
15
 
@@ -41,6 +40,7 @@ class Params:
41
40
  serial: List[str] = field(default_factory=list)
42
41
  ignore: List[str] = field(default_factory=list)
43
42
  bluetooth: bool = False
43
+ force: bool = False
44
44
 
45
45
 
46
46
  @dataclass
@@ -48,7 +48,6 @@ class DownloadParams(Params):
48
48
  """Parameters for downloading firmware"""
49
49
 
50
50
  clean: bool = False
51
- force: bool = False
52
51
 
53
52
 
54
53
  class BootloaderMethod(Enum):
mpflash/db/core.py CHANGED
@@ -6,6 +6,7 @@ from sqlalchemy import create_engine
6
6
  from sqlalchemy.orm import sessionmaker
7
7
 
8
8
  from mpflash.config import config
9
+ from mpflash.errors import MPFlashError
9
10
 
10
11
  # TODO: lazy import to avoid slowdowns ?
11
12
  from .models import Base
@@ -24,11 +25,15 @@ def migrate_database(boards: bool = True, firmwares: bool = True):
24
25
  # get the location of the database from the session
25
26
  with Session() as session:
26
27
  db_location = session.get_bind().url.database # type: ignore
27
- log.debug(f"Database location: {Path(db_location)}") # type: ignore
28
-
29
- create_database()
28
+ log.debug(f"Database location: {Path(db_location)}") # type: ignore
29
+
30
+ try:
31
+ create_database()
32
+ except (DatabaseError, OperationalError) as e:
33
+ log.error(f"Error creating database: {e}")
34
+ log.error("Database might already exist, trying to migrate.")
35
+ raise MPFlashError("Database migration failed. Please check the logs for more details.") from e
30
36
  if boards:
31
-
32
37
  update_boards()
33
38
  if firmwares:
34
39
  jsonl_file = config.firmware_folder / "firmware.jsonl"
mpflash/db/loader.py CHANGED
@@ -76,6 +76,8 @@ def load_jsonl_to_db(jsonl_path: Path):
76
76
  if "preview" in record:
77
77
  record["version"] = f"{record['version']}-preview" if record["preview"] else record["version"]
78
78
  record.pop("preview", None) # Remove 'preview' column
79
+ if not "custom" in record:
80
+ record["custom"] = False
79
81
  firmware_file = str(Path(record["filename"]).as_posix()) if record["filename"] else ""
80
82
 
81
83
  # Check if Firmware with this firmware_file exists
mpflash/download/jid.py CHANGED
@@ -9,7 +9,7 @@ from mpflash.flash.worklist import WorkList
9
9
  from mpflash.mpboard_id.alternate import alternate_board_names
10
10
 
11
11
 
12
- def ensure_firmware_downloaded(worklist: WorkList, version: str) -> None:
12
+ def ensure_firmware_downloaded(worklist: WorkList, version: str, force: bool) -> None:
13
13
  """
14
14
  Ensure all firmware in the worklist is downloaded for the given version.
15
15
 
@@ -21,16 +21,19 @@ def ensure_firmware_downloaded(worklist: WorkList, version: str) -> None:
21
21
  # iterate over the worklist ann update missing firmware
22
22
  newlist: WorkList = []
23
23
  for mcu, firmware in worklist:
24
- if firmware:
25
- # firmware is already downloaded
26
- newlist.append((mcu, firmware))
27
- continue
28
- # check if the firmware is already downloaded
29
- board_firmwares = find_downloaded_firmware(
30
- board_id=f"{mcu.board}-{mcu.variant}" if mcu.variant else mcu.board,
31
- version=version,
32
- port=mcu.port,
33
- )
24
+ if force:
25
+ board_firmwares = []
26
+ else:
27
+ if firmware:
28
+ # firmware is already downloaded
29
+ newlist.append((mcu, firmware))
30
+ continue
31
+ # check if the firmware is already downloaded
32
+ board_firmwares = find_downloaded_firmware(
33
+ board_id=f"{mcu.board}-{mcu.variant}" if mcu.variant else mcu.board,
34
+ version=version,
35
+ port=mcu.port,
36
+ )
34
37
  if not board_firmwares:
35
38
  # download the firmware
36
39
  log.info(f"Downloading {version} firmware for {mcu.board} on {mcu.serialport}.")
mpflash/downloaded.py CHANGED
@@ -51,7 +51,7 @@ def clean_downloaded_firmwares() -> None:
51
51
 
52
52
  # Warn about files on disk not in DB
53
53
  for fw_file in firmware_files_on_disk - db_firmware_files:
54
- log.warning(f"Found file in firmware folder but not in DB: {fw_file}")
54
+ log.debug(f"Found file in firmware folder but not in DB: {fw_file}")
55
55
 
56
56
 
57
57
  def find_downloaded_firmware(
mpflash/flash/stm32.py CHANGED
@@ -15,5 +15,5 @@ def flash_stm32(mcu: MPRemoteBoard, fw_file: Path, *, erase: bool):
15
15
  dfu_init()
16
16
  if updated := flash_stm32_dfu(mcu, fw_file=fw_file, erase=erase):
17
17
  mcu.wait_for_restart()
18
- log.success(f"Flashed {mcu.version} to {mcu.board}")
18
+ log.success(f"Flashed {mcu.board_id} {mcu.version} to {mcu.serialport}.")
19
19
  return updated
mpflash/logger.py CHANGED
@@ -1,4 +1,11 @@
1
- """Logging."""
1
+ """
2
+ Logger setup for CLI tools with Unicode-safe output.
3
+
4
+ Ensures log messages are compatible with the current console encoding.
5
+ Removes or replaces Unicode icons if the encoding is not UTF-8.
6
+ """
7
+
8
+ import sys
2
9
 
3
10
  from loguru import logger as log
4
11
  from rich.console import Console
@@ -7,9 +14,20 @@ from .config import config
7
14
 
8
15
  console = Console()
9
16
 
17
+ # Detect if the output encoding supports Unicode (UTF-8)
18
+ def _is_utf8_encoding() -> bool:
19
+ encoding = getattr(sys.stdout, "encoding", None)
20
+ if encoding is None:
21
+ return False
22
+ return encoding.lower().replace("-", "") == "utf8"
23
+
10
24
 
11
25
  def _log_formatter(record: dict) -> str:
12
- """Log message formatter to combine loguru and rich formatting."""
26
+ """
27
+ Log message formatter for loguru and rich.
28
+
29
+ Removes Unicode icons if console encoding is not UTF-8.
30
+ """
13
31
  color_map = {
14
32
  "TRACE": "cyan",
15
33
  "DEBUG": "orange",
@@ -20,11 +38,21 @@ def _log_formatter(record: dict) -> str:
20
38
  "CRITICAL": "bold white on red",
21
39
  }
22
40
  lvl_color = color_map.get(record["level"].name, "cyan")
23
- return "[not bold green]{time:HH:mm:ss}[/not bold green] | {level.icon} " + f"[{lvl_color}]{{message}}[/{lvl_color}]"
41
+ # Remove icon if not UTF-8
42
+ if _is_utf8_encoding():
43
+ icon = record["level"].icon
44
+ else:
45
+ icon = record["level"].name # fallback to text
46
+ # Insert color directly using f-string
47
+ return f"[not bold green]{{time:HH:mm:ss}}[/not bold green] | {icon} [{lvl_color}]{record['message']}[/{lvl_color}]"
48
+
24
49
 
50
+ def set_loglevel(loglevel: str) -> None:
51
+ """
52
+ Set the log level for the logger.
25
53
 
26
- def set_loglevel(loglevel: str):
27
- """Set the log level for the logger"""
54
+ Ensures Unicode safety for log output.
55
+ """
28
56
  try:
29
57
  log.remove()
30
58
  except ValueError:
@@ -32,8 +60,10 @@ def set_loglevel(loglevel: str):
32
60
  log.add(console.print, level=loglevel.upper(), colorize=False, format=_log_formatter) # type: ignore
33
61
 
34
62
 
35
- def make_quiet():
36
- """Make the logger quiet"""
63
+ def make_quiet() -> None:
64
+ """
65
+ Make the logger quiet.
66
+ """
37
67
  config.quiet = True
38
68
  console.quiet = True
39
69
  set_loglevel("CRITICAL")
@@ -59,7 +59,7 @@ def known_stored_boards(port: str, versions: List[str] = []) -> List[Tuple[str,
59
59
  """
60
60
  mp_boards = get_known_boards_for_port(port, versions)
61
61
 
62
- boards = set({(f"{board.version} {board.description}", board.board_id) for board in mp_boards})
62
+ boards = set({(f"{board.version} {board.board_id:<30} {board.description}", board.board_id) for board in mp_boards})
63
63
  return sorted(list(boards))
64
64
 
65
65
 
mpflash/vendor/pydfu.py CHANGED
@@ -406,6 +406,20 @@ def read_dfu_file(filename):
406
406
  return elements
407
407
 
408
408
 
409
+ def read_bin_file(filename, address):
410
+ """Reads binary file(.bin) and stores it as single
411
+ element in element array just like read_dfu_file() would.
412
+ """
413
+ element = {}
414
+ print("File: {}".format(filename))
415
+ with open(filename, "rb") as fin:
416
+ element["data"] = fin.read()
417
+ element["size"] = len(element["data"])
418
+ element["num"] = 0
419
+ element["addr"] = address
420
+ return [element]
421
+
422
+
409
423
  class FilterDFU(object):
410
424
  """Class for filtering USB devices to identify devices which are in DFU
411
425
  mode.
@@ -541,6 +555,13 @@ def main():
541
555
  parser.add_argument("--pid", help="USB Product ID", type=lambda x: int(x, 0), default=None)
542
556
  parser.add_argument("-m", "--mass-erase", help="mass erase device", action="store_true", default=False)
543
557
  parser.add_argument("-u", "--upload", help="read file from DFU device", dest="path", default=False)
558
+ parser.add_argument(
559
+ "-a",
560
+ "--address",
561
+ help="specify target memory address(hex or dec) when uploading .bin files",
562
+ type=lambda x: int(x, 0),
563
+ default=None,
564
+ )
544
565
  parser.add_argument("-x", "--exit", help="Exit DFU", action="store_true", default=False)
545
566
  parser.add_argument("-v", "--verbose", help="increase output verbosity", action="store_true", default=False)
546
567
  args = parser.parse_args()
@@ -567,7 +588,14 @@ def main():
567
588
  command_run = True
568
589
 
569
590
  if args.path:
570
- elements = read_dfu_file(args.path)
591
+ if str(args.path).endswith(".bin"):
592
+ if args.address is None:
593
+ raise ValueError("Address must be specified using -a when uploading binary")
594
+
595
+ elements = read_bin_file(args.path, args.addr)
596
+ else:
597
+ elements = read_dfu_file(args.path)
598
+
571
599
  if not elements:
572
600
  print("No data in dfu file")
573
601
  return
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: mpflash
3
- Version: 1.25.0rc1
3
+ Version: 1.25.0rc3
4
4
  Summary: Flash and download tool for MicroPython firmwares
5
5
  License: MIT
6
6
  Keywords: MicroPython,firmware,flash,download,UF2,esptool
@@ -1,6 +1,6 @@
1
1
  mpflash/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  mpflash/add_firmware.py,sha256=P1yaNUdExfzC_qnhE-P5ALZg1Uh7XT6Xf7NYccJP7Rc,4317
3
- mpflash/ask_input.py,sha256=eoaFZf2F85RszyqcLBmuJvKtDe4PdT_T-nwOBFaWehg,8903
3
+ mpflash/ask_input.py,sha256=YUx65Xwj6dNPwWcbQiWG7U4wDW69zEdno2HcT1KwPBg,8886
4
4
  mpflash/basicgit.py,sha256=Aiz6rF6PVhQir-FU-T1NhbjsW803y39Js6xnWs8-yu4,9676
5
5
  mpflash/bootloader/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
6
  mpflash/bootloader/activate.py,sha256=orQOw4XTkXVZI-rMInRb0T5Wp3qA_BlzbJUA2gyBToU,2361
@@ -9,17 +9,17 @@ mpflash/bootloader/manual.py,sha256=WYC4x-dxrSwVUfgnKTlu34pCzckrWJKZnWsARDocycI,
9
9
  mpflash/bootloader/micropython.py,sha256=v_kZkvg0uWZDbMrT78gmiYHbD83QLdnrctvEClI8iRg,529
10
10
  mpflash/bootloader/touch1200.py,sha256=VND7_YniS9Vx6WEaAxjI72RZZ6WBOwmBTsKJkbuaAHk,1105
11
11
  mpflash/cli_download.py,sha256=sMMIVTE4P9O2GpWB9jcbOiKQX-XJ0nu2bBylRbWu0X8,3872
12
- mpflash/cli_flash.py,sha256=K2TEyQndibtKdwSkeeu_esDUsu8H0_4DB_37SF7DR9E,7657
12
+ mpflash/cli_flash.py,sha256=QQ7fml84UBK_dUDb1G7DT5_MBDbZbXcWEhkgOq2P8gA,7962
13
13
  mpflash/cli_group.py,sha256=Uf_1ZmeeSIsaGLuuKn3KPPPVi8fJVbIacJYFZx_oPHc,2684
14
- mpflash/cli_list.py,sha256=XwX0j9JzFzm2o-_oEWLR07QaMMAUrS1a553_-IpCdj0,2352
14
+ mpflash/cli_list.py,sha256=ZuRalXXjDGo6FhgMTv54BQD_PNss7eeopeZQ_uE1J90,2632
15
15
  mpflash/cli_main.py,sha256=NMhEtMtSe7ApE-210Q4p-g7ZgewgO-4z1Q-vNKLQ47Y,1277
16
- mpflash/common.py,sha256=fEFxSy2KVAhBUlJv0GsWnUHdJtRckp2XGlYVPAhS8WE,5924
16
+ mpflash/common.py,sha256=iKDoc6Ut8XbZ8fYLEI2XsoU7GuG_pFG0KGcRWXPl1wE,5922
17
17
  mpflash/config.py,sha256=bmwNSJzk27iHcI-r3C6hm6-TeOat2ymzbbv-Q-xuO2o,3048
18
18
  mpflash/connected.py,sha256=oxZdk1o-AfNPhJsSxr3KrMH_gdYfrjqc_IpT6J8Ng9k,3496
19
19
  mpflash/db/__init__.py,sha256=wnIlO4nOXsPGXMbn2OCqHRsR-hUmtJsko8VdqjH3ZUE,45
20
- mpflash/db/core.py,sha256=2t6pE385d8WgVrG7Kp2jmGdVZ5n0FiK6mHWAWOqZXW4,1949
20
+ mpflash/db/core.py,sha256=hyzurZp8QMl8Q9B00Q-tOkOUp68T8XhM7tj3dm5cDHw,2283
21
21
  mpflash/db/gather_boards.py,sha256=8QS7NIt3n9ROqtgVAnoqU8YMeObLGaN2pvJL7d_kULA,3905
22
- mpflash/db/loader.py,sha256=RUbcnJ51r6bDq61vdglAlvYZzIaoLLGtTtm3FrSFrTQ,4758
22
+ mpflash/db/loader.py,sha256=0L4I3ySaGLFlzy9FlV7_nzbqzA6MHwi0FhgDG5FJ_9U,4848
23
23
  mpflash/db/meta.py,sha256=I7JycEx37MVVYowA0VFfUYFX9IURiTTsWQ1RhFgGqes,2251
24
24
  mpflash/db/micropython_boards.zip,sha256=cc4m7VSskj__rhabw3j5OZCiz1yEi6yCx7JGFn1QB0k,16647
25
25
  mpflash/db/models.py,sha256=Q4yjZPcNRIGWevoACeGDS1i31QX6jq1q5TsyPjmdmz4,3448
@@ -27,12 +27,12 @@ mpflash/db/tools.py,sha256=6SEGfshNob4yRQ4h-Cj_xcWMRY28sbA8CWauNXV_uMI,814
27
27
  mpflash/download/__init__.py,sha256=zidXvsSFCfR-BZCZ6TiB7uEucEuUqXnZhKSfTs60lzU,7930
28
28
  mpflash/download/from_web.py,sha256=PVJDaFfYLJGXlPva5fExh4Yg2H7j3idyJEcfOiVVJBs,7608
29
29
  mpflash/download/fwinfo.py,sha256=gpa92PkysT1B7mxPAFJ-b_6y03QCNgHKm-J6T_RFNMI,1852
30
- mpflash/download/jid.py,sha256=ToRImbHdtvJ7AtZDH3aQURxBDci-0RvRtj5uCt8tHlI,2213
31
- mpflash/downloaded.py,sha256=RLz52l7uSvNW5HGMicTAj8aWLxnXYTsQbfcwCbjb_oo,4042
30
+ mpflash/download/jid.py,sha256=503HW4jIB22fsb9vYphXqqO33LTMtvPdENG81wKDgMs,2334
31
+ mpflash/downloaded.py,sha256=508sqROPf0Ymz7UxMzReXtK6mG1EcoXA-ysGdzV-VM0,4040
32
32
  mpflash/errors.py,sha256=IAidY3qkZsXy6Pm1rdmVFmGyg81ywHhse3itaPctA2w,247
33
33
  mpflash/flash/__init__.py,sha256=jif7-ifsXMabidjNdqUQyl1CwD5_USjCAZFhU5W-Aw8,2992
34
34
  mpflash/flash/esp.py,sha256=4977E1hDqJ4-EIkLzwrUtgZuc0ZTD7NvP1PQZgZ2DoU,3227
35
- mpflash/flash/stm32.py,sha256=dqp9BZ4Vr-6GlQcF12TSmRf-5TXkov9qvCpMgeUJc7Y,574
35
+ mpflash/flash/stm32.py,sha256=jNgMpJaxUwtJ-v6VU1luD1t41AQprCUeNVCVEovxQe0,595
36
36
  mpflash/flash/stm32_dfu.py,sha256=W-3JsRQyf3DduoIRXDmGZ35RogqtjQgcJnk-GOtQoLE,3090
37
37
  mpflash/flash/uf2/__init__.py,sha256=haL84hP2p1ZjKF6dXJJHAB_NTf7jT91MuZvmvg9SpIA,3617
38
38
  mpflash/flash/uf2/boardid.py,sha256=U5wGM8VA3wEpUxQCMtuXpMZZomdVH8J_Zd5_GekUMuU,423
@@ -42,13 +42,13 @@ mpflash/flash/uf2/uf2disk.py,sha256=4_P2l-kedM7VSliA2u706LQLxvu3xWSod1-lj-xjZis,
42
42
  mpflash/flash/uf2/windows.py,sha256=S---sVjVrC00ZcnpOewtJIBfSCj2cr7FGQwEm_ZEDnY,1334
43
43
  mpflash/flash/worklist.py,sha256=ZqbgYChXFGEVLVlGKeS9eJJDToxBYqjrfWE2NIa7Cck,5622
44
44
  mpflash/list.py,sha256=NNhKpRh3ARZMdq56GLJgJ67GeuUf9SxjTzFhQjDsi9A,4008
45
- mpflash/logger.py,sha256=nHeH_Z9M5c1b0ECunNmxz_mCfl9b7v5suaSDDqAdS2E,1078
45
+ mpflash/logger.py,sha256=oMGBhfHv0edPJaUxiqAjkQ5Na2B687f94LqE-IR7C-U,1885
46
46
  mpflash/mpboard_id/__init__.py,sha256=Z6gDDWTCSKPp2fsuaUz80zgrklBR9XDlSLF9y_evR9A,391
47
47
  mpflash/mpboard_id/alternate.py,sha256=ZhqfdA9sLJmyOfJ6WwK9wrzzUn6JQdkAreiL0q5XEQg,1913
48
48
  mpflash/mpboard_id/board_id.py,sha256=dGbYnqaGHm6Z68P6aCq5bv95pyhi9KKhQleQXmlyO8Y,2046
49
49
  mpflash/mpboard_id/board_info.json,sha256=A3ZIt38KvAy2NMB5srHorSBd3Q3wOZIXufWiIs3XLrs,1019745
50
50
  mpflash/mpboard_id/board_info.zip,sha256=-2bnQGRsIQuJUfz-7_-GQ8pMWJ1evhCez6yfjhXocNw,23213
51
- mpflash/mpboard_id/known.py,sha256=IZ3LDYZpQo7TmWa67FzmbUJIqWuxoD_QiZ4JT1A6344,3304
51
+ mpflash/mpboard_id/known.py,sha256=GrNe4FtzVIdi9L9xuJ1gzorzXTvdfrugX1iVc_Nblb8,3325
52
52
  mpflash/mpboard_id/resolve.py,sha256=5KCZ0Tcg3FYZ3HK_zux5EguwoSC2E03kCpW2fh4rN2A,779
53
53
  mpflash/mpremoteboard/__init__.py,sha256=kZ-MziZPwx6UOs_ybLYEYeUDndC1XyylMcpGTiEHpTk,12043
54
54
  mpflash/mpremoteboard/mpy_fw_info.py,sha256=ZDEPJN9XJnoG_oeWcLNiLJAD5bkVX2yI_j4K7msUxWM,5196
@@ -59,11 +59,11 @@ mpflash/vendor/click_aliases.py,sha256=adLhqLxNpJEPjSCIRSTkR-QzSgavGFKT0cwRbjxpz
59
59
  mpflash/vendor/dfu.py,sha256=6rqGCBS8mTxxaLtkdzJ8O6nc74kFk8jrkmKvxw-x-u8,5693
60
60
  mpflash/vendor/pico-universal-flash-nuke/LICENSE.txt,sha256=Zkc2iTNbib2NCMwtLjMEz0vFCPglgvaw6Mj7QiWldpQ,1484
61
61
  mpflash/vendor/pico-universal-flash-nuke/universal_flash_nuke.uf2,sha256=QuPMppqHMVOt3vDVU0bikHRLsTiDRQYNUcGQ_OLRFGI,28160
62
- mpflash/vendor/pydfu.py,sha256=1I8dwbacUH_-u2y6gYZYRKO_Iof8Eb3rZsVyQ1ETluI,20364
62
+ mpflash/vendor/pydfu.py,sha256=KD1RHHuhvhWi-l1UB6GyggkxouDKtZgkG4ivRbIfwC4,21264
63
63
  mpflash/vendor/readme.md,sha256=BQ7Uxf8joeYMjTUuSLLBG49ob6a9MgFPIEwuc72-Mfw,415
64
64
  mpflash/versions.py,sha256=HuujLNdMKY_mQXyEqwXVHcU8nbuXeBiWP2TMA5JQhr4,4884
65
- mpflash-1.25.0rc1.dist-info/entry_points.txt,sha256=Jk_visOhYOsZIcSP2Ms9hKqfKy1iorR-6dYltSoWCpY,52
66
- mpflash-1.25.0rc1.dist-info/LICENSE,sha256=mWpNhsIxWzetYNnTpr4eb3HtgsxGIC8KcYWxXEcxQvE,1077
67
- mpflash-1.25.0rc1.dist-info/METADATA,sha256=L7CGVRIBkloWrj0gm30DxyXLAtFUPE425HzvyjenePU,23938
68
- mpflash-1.25.0rc1.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
69
- mpflash-1.25.0rc1.dist-info/RECORD,,
65
+ mpflash-1.25.0rc3.dist-info/entry_points.txt,sha256=Jk_visOhYOsZIcSP2Ms9hKqfKy1iorR-6dYltSoWCpY,52
66
+ mpflash-1.25.0rc3.dist-info/LICENSE,sha256=mWpNhsIxWzetYNnTpr4eb3HtgsxGIC8KcYWxXEcxQvE,1077
67
+ mpflash-1.25.0rc3.dist-info/METADATA,sha256=mEXilzRfCv3IpCReXC9MiydCTo_XVD81flx9E6zFtnI,23938
68
+ mpflash-1.25.0rc3.dist-info/WHEEL,sha256=XbeZDeTWKc1w7CSIyre5aMDU_-PohRwTQceYnisIYYY,88
69
+ mpflash-1.25.0rc3.dist-info/RECORD,,