mpflash 0.8.5__tar.gz → 0.8.8__tar.gz
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-0.8.5 → mpflash-0.8.8}/LICENSE +20 -20
- {mpflash-0.8.5 → mpflash-0.8.8}/PKG-INFO +1 -1
- {mpflash-0.8.5 → mpflash-0.8.8}/README.md +184 -184
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/add_firmware.py +98 -98
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/ask_input.py +236 -236
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/bootloader/__init__.py +37 -36
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/bootloader/manual.py +102 -102
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/bootloader/micropython.py +10 -10
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/bootloader/touch1200.py +45 -45
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/cli_download.py +129 -129
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/cli_flash.py +219 -219
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/cli_group.py +98 -98
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/cli_list.py +81 -81
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/cli_main.py +41 -41
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/common.py +164 -164
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/config.py +47 -47
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/connected.py +74 -74
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/download.py +360 -360
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/downloaded.py +130 -129
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/errors.py +9 -9
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/flash.py +52 -52
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/flash_esp.py +59 -59
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/flash_stm32.py +23 -24
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/flash_stm32_cube.py +111 -111
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/flash_stm32_dfu.py +104 -101
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/flash_uf2.py +67 -67
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/flash_uf2_boardid.py +15 -15
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/flash_uf2_linux.py +123 -123
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/flash_uf2_macos.py +34 -34
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/flash_uf2_windows.py +34 -34
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/list.py +89 -89
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/logger.py +41 -41
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/mpboard_id/__init__.py +93 -93
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/mpboard_id/add_boards.py +255 -255
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/mpboard_id/board.py +37 -37
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/mpboard_id/board_id.py +86 -86
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/mpboard_id/store.py +43 -43
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/mpremoteboard/__init__.py +221 -221
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/mpremoteboard/mpy_fw_info.py +141 -141
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/mpremoteboard/runner.py +140 -140
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/uf2disk.py +12 -12
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/vendor/basicgit.py +288 -288
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/vendor/click_aliases.py +91 -91
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/vendor/dfu.py +165 -165
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/vendor/pydfu.py +605 -605
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/vendor/readme.md +2 -2
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/vendor/versions.py +119 -117
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/worklist.py +171 -170
- {mpflash-0.8.5 → mpflash-0.8.8}/pyproject.toml +60 -60
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/__init__.py +0 -0
- {mpflash-0.8.5 → mpflash-0.8.8}/mpflash/mpboard_id/board_info.zip +0 -0
@@ -1,20 +1,20 @@
|
|
1
|
-
Copyright (c) 2024 Jos Verlinde
|
2
|
-
|
3
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
-
of this software and associated documentation files (the "Software"), to deal
|
5
|
-
in the Software without restriction, including without limitation the rights
|
6
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
-
copies of the Software, and to permit persons to whom the Software is
|
8
|
-
furnished to do so, subject to the following conditions:
|
9
|
-
|
10
|
-
The above copyright notice and this permission notice shall be included in all
|
11
|
-
copies or substantial portions of the Software.
|
12
|
-
|
13
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
-
SOFTWARE.
|
20
|
-
|
1
|
+
Copyright (c) 2024 Jos Verlinde
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
4
|
+
of this software and associated documentation files (the "Software"), to deal
|
5
|
+
in the Software without restriction, including without limitation the rights
|
6
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
7
|
+
copies of the Software, and to permit persons to whom the Software is
|
8
|
+
furnished to do so, subject to the following conditions:
|
9
|
+
|
10
|
+
The above copyright notice and this permission notice shall be included in all
|
11
|
+
copies or substantial portions of the Software.
|
12
|
+
|
13
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
14
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
15
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
16
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
17
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
18
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
19
|
+
SOFTWARE.
|
20
|
+
|
@@ -1,184 +1,184 @@
|
|
1
|
-
# MPFLASH
|
2
|
-
[](https://pypi.org/project/mpflash/)
|
3
|
-
[](https://badgen.net/pypi/python/mpflash)
|
4
|
-
[](https://pepy.tech/project/mpflash)
|
5
|
-
|
6
|
-
|
7
|
-
`mpflash` is a command-line tool for working with MicroPython firmware. It provides features to help you flash and update Micropython on one or more .
|
8
|
-
|
9
|
-
This tool was initially created to be used in a CI/CD pipeline to automate the process of downloading and flashing MicroPython firmware to multiple boards, but it has been extend with a TUI to be used for manual downloadig, flashing and development.
|
10
|
-
|
11
|
-
`mpflash` has been tested on:
|
12
|
-
- OS: Windows x64, Linux X64, but not (yet) macOS.
|
13
|
-
- Micropython (hardware) ports:
|
14
|
-
- `rp2`, using `.uf2`, using filecopy (macos not tested yet)
|
15
|
-
- `samd`, using ` .uf2`, using filecopy (macos not tested yet)
|
16
|
-
- `esp32`, using `.bin`, using esptool,
|
17
|
-
- `esp8266`, using `.bin`, using esptool
|
18
|
-
- `stm32`, using ` .dfu`, using pydfu
|
19
|
-
|
20
|
-
Not yet implemented: `nrf`, `cc3200`, `mimxrt`
|
21
|
-
|
22
|
-
## Features
|
23
|
-
1. List the connected boards including their firmware details, in a tabular or json format
|
24
|
-
2. Download MicroPython firmware for versions, and matching a specified board or matches your current attached board.
|
25
|
-
3. Flash one or all connected MicroPython boards with a specific firmware or version.
|
26
|
-
|
27
|
-
## Installation
|
28
|
-
To install mpflash, you can use pip: `pip install mpflash`
|
29
|
-
|
30
|
-
## Basic usage
|
31
|
-
You can use mpflash to perform various operations on your MicroPython boards. Here is an example of basic usage:
|
32
|
-
|
33
|
-
| Command | Description |
|
34
|
-
|---------|-------------|
|
35
|
-
| `mpflash list` | List the connected board(s) including their firmware details |
|
36
|
-
| `mpflash download` | Download the MicroPython firmware(s) for the connected board(s) |
|
37
|
-
| `mpflash flash` | Flash the latest stable firmware to the connected board(s) |
|
38
|
-
|
39
|
-
|
40
|
-
## Linux permissions to access usb devices
|
41
|
-
In order to flash the firmware to the board, you need to have the correct permissions to access the USB devices.
|
42
|
-
On Windows this will not be an issue, but on Linux you can use udev rules to give non-root users access to the USB devices.
|
43
|
-
[See the stm32_permissions documentation](./stm32_udev_rules.md) for more information.
|
44
|
-
|
45
|
-
|
46
|
-
## Detailed usage
|
47
|
-
You can list the connected boards using the following command:
|
48
|
-
```bash
|
49
|
-
$> mpflash list
|
50
|
-
Connected boards
|
51
|
-
┏━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━┓
|
52
|
-
┃ Serial ┃Family ┃Port ┃Board ┃CPU ┃Version ┃build ┃
|
53
|
-
┡━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━┩
|
54
|
-
│ COM21 │micropython │rp2 │RPI_PICO │RP2040 │v1.23.0-preview │ 236 │
|
55
|
-
│ │ │ │Raspberry Pi Pico with RP2040 │ │ │ │
|
56
|
-
│ COM23 │micropython │rp2 │RPI_PICO_W │RP2040 │v1.23.0-preview │ 176 │
|
57
|
-
│ │ │ │Raspberry Pi Pico W with RP2040 │ │ │ │
|
58
|
-
│ COM9 │micropython │rp2 │ARDUINO_NANO_RP2040_CONNECT │RP2040 │v1.23.0-preview │ 341 │
|
59
|
-
│ │ │ │Arduino Nano RP2040 Connect with RP2040 │ │ │ │
|
60
|
-
└─────────┴─────────────┴──────┴───────────────────────────────────────────┴────────┴─────────────────┴──────┘
|
61
|
-
```
|
62
|
-
## Download the firmware
|
63
|
-
|
64
|
-
To download the MicroPython firmware for some boards, use the following command:
|
65
|
-
- `mpflash download` download the latest stable firmware for all connected boards
|
66
|
-
- `mpflash download --version preview` download the current preview for all connected boards
|
67
|
-
- `mpflash download --board ESP8266_GENERIC --board SEEED_WIO_TERMINAL` download these specific boards
|
68
|
-
- `mpflash download --version ? --board ?` prompt to select a specific version and board to download
|
69
|
-
|
70
|
-
These will try to download the prebuilt MicroPython firmware for the boards from https://micropython.org/download/ and save it in your downloads folder in the `firmware` directory.
|
71
|
-
The stable version (default) is determined based on the most recent published release,
|
72
|
-
other versions are `--version preview` and `--version x.y.z` to download the latest preview or version x.y.z respectively.
|
73
|
-
|
74
|
-
By default the firmware will be downloaded to your OS's preferred `Downloads/firmware` folder, but you can speciy a different directory using the `--dir` option.
|
75
|
-
|
76
|
-
The directory structure will be something like this:
|
77
|
-
|
78
|
-
``` text
|
79
|
-
Downloads/firmware
|
80
|
-
| firmware.jsonl
|
81
|
-
+---esp8266
|
82
|
-
| ESP8266_GENERIC-FLASH_1M-v1.22.2.bin
|
83
|
-
| ESP8266_GENERIC-FLASH_512K-v1.22.2.bin
|
84
|
-
| ESP8266_GENERIC-OTA-v1.22.2.bin
|
85
|
-
| ESP8266_GENERIC-v1.22.2.bin
|
86
|
-
\---samd
|
87
|
-
SEEED_WIO_TERMINAL-v1.22.2.uf2
|
88
|
-
```
|
89
|
-
|
90
|
-
## Flashing the firmware
|
91
|
-
After you have downloaded a firmware you can flash the firmware to a board using the following command: `mpflash flash`
|
92
|
-
This will (try to) autodetect the connected boards, and determine the correct firmware to flash to each board.
|
93
|
-
|
94
|
-
- `mpflash flash` will flash the latest stable firmware to all connected boards.
|
95
|
-
- `mpflash flash --serial ? --board ?` will prompt to select a specific serial port and board to flash. (the firmware must be dowloaded earlier)
|
96
|
-
|
97
|
-
|
98
|
-
### Flashing all connected boards with the latest stable firmware
|
99
|
-
```bash
|
100
|
-
> mpflash flash
|
101
|
-
22:15:55 | ℹ️ - Using latest stable version: v1.22.2
|
102
|
-
Connected boards
|
103
|
-
┏━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━┓
|
104
|
-
┃ Serial ┃ Family ┃ Port ┃ Board ┃ CPU ┃ Version ┃ build ┃
|
105
|
-
┡━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━┩
|
106
|
-
│ COM11 │ micropython │ rp2 │ RPI_PICO_W │ RP2040 │ 1.20.0 │ │
|
107
|
-
│ COM12 │ micropython │ esp8266 │ ESP8266_GENERIC │ ESP8266 │ 1.22.2 │ │
|
108
|
-
│ COM18 │ micropython │ rp2 │ RPI_PICO_W │ RP2040 │ 1.23.0-preview │ 155 │
|
109
|
-
│ COM3 │ micropython │ samd │ SEEED_WIO_TERMINAL │ SAMD51P19A │ 1.23.0-preview │ 155 │
|
110
|
-
│ COM5 │ micropython │ stm32 │ PYBV11 │ STM32F405RG │ 1.23.0-preview │ 166 │
|
111
|
-
│ COM8 │ micropython │ esp32 │ ESP32_GENERIC_S3 │ ESP32S3 │ 1.23.0-preview │ 155 │
|
112
|
-
└────────┴─────────────┴─────────┴────────────────────┴─────────────┴────────────────┴───────┘
|
113
|
-
22:15:58 | ℹ️ - Found v1.22.2 firmware rp2\RPI_PICO_W-v1.22.2.uf2 for RPI_PICO_W on COM11.
|
114
|
-
22:15:58 | ℹ️ - Found v1.22.2 firmware esp8266\ESP8266_GENERIC-v1.22.2.bin for ESP8266_GENERIC on COM12.
|
115
|
-
22:15:58 | ℹ️ - Found v1.22.2 firmware rp2\RPI_PICO_W-v1.22.2.uf2 for RPI_PICO_W on COM18.
|
116
|
-
22:15:58 | ℹ️ - Found v1.22.2 firmware samd\SEEED_WIO_TERMINAL-v1.22.2.uf2 for SEEED_WIO_TERMINAL on COM3.
|
117
|
-
22:15:58 | ⚠️ - Trying to find a firmware for the board PYBV11
|
118
|
-
22:15:58 | ❌ - No v1.22.2 firmware found for PYBV11 on COM5.
|
119
|
-
22:15:58 | ⚠️ - Trying to find a firmware for the board ESP32-GENERIC-S3
|
120
|
-
22:15:58 | ❌ - No v1.22.2 firmware found for ESP32_GENERIC_S3 on COM8.
|
121
|
-
22:15:58 | ℹ️ - Updating RPI_PICO_W on COM11 to 1.22.2
|
122
|
-
22:15:58 | ℹ️ - Erasing not yet implemented for UF2 flashing.
|
123
|
-
22:15:58 | ℹ️ - Entering UF2 bootloader on RPI_PICO_W on COM11
|
124
|
-
22:15:58 | ℹ️ - Waiting for mcu to mount as a drive : 10 seconds left
|
125
|
-
22:15:59 | ℹ️ - Waiting for mcu to mount as a drive : 9 seconds left
|
126
|
-
22:16:00 | ℹ️ - Board is in bootloader mode
|
127
|
-
22:16:00 | ℹ️ - Copying firmware\rp2\RPI_PICO_W-v1.22.2.uf2 to F:
|
128
|
-
22:16:13 | ✅ - Done copying, resetting the board and wait for it to restart
|
129
|
-
22:16:23 | ℹ️ - Updating ESP8266_GENERIC on COM12 to 1.22.2
|
130
|
-
22:16:23 | ℹ️ - Flashing firmware\esp8266\ESP8266_GENERIC-v1.22.2.bin on ESP8266_GENERIC on COM12
|
131
|
-
22:16:23 | ℹ️ - Running esptool --chip ESP8266 --port COM12 erase_flash
|
132
|
-
esptool.py v4.7.0
|
133
|
-
Serial port COM12
|
134
|
-
Connecting....
|
135
|
-
...
|
136
|
-
Chip erase completed successfully in 6.5s
|
137
|
-
Hard resetting via RTS pin...
|
138
|
-
22:16:31 | ℹ️ - Running esptool --chip ESP8266 --port COM12 -b 460800 write_flash --flash_size=detect 0x0 firmware\esp8266\ESP8266_GENERIC-v1.22.2.bin
|
139
|
-
esptool.py v4.7.0
|
140
|
-
Serial port COM12
|
141
|
-
Connecting....
|
142
|
-
...
|
143
|
-
Leaving...
|
144
|
-
Hard resetting via RTS pin...
|
145
|
-
22:16:43 | ℹ️ - Done flashing, resetting the board and wait for it to restart
|
146
|
-
22:16:49 | ✅ - Flashed 1.22.2 to ESP8266_GENERIC on COM12 done
|
147
|
-
22:16:49 | ℹ️ - Updating RPI_PICO_W on COM18 to 1.22.2
|
148
|
-
22:16:49 | ℹ️ - Erasing not yet implemented for UF2 flashing.
|
149
|
-
22:16:49 | ℹ️ - Entering UF2 bootloader on RPI_PICO_W on COM18
|
150
|
-
22:16:49 | ℹ️ - Waiting for mcu to mount as a drive : 10 seconds left
|
151
|
-
22:16:50 | ℹ️ - Waiting for mcu to mount as a drive : 9 seconds left
|
152
|
-
22:16:51 | ℹ️ - Board is in bootloader mode
|
153
|
-
22:16:51 | ℹ️ - Copying firmware\rp2\RPI_PICO_W-v1.22.2.uf2 to F:[/bold]
|
154
|
-
22:17:02 | ✅ - Done copying, resetting the board and wait for it to restart
|
155
|
-
22:17:12 | ℹ️ - Updating SEEED_WIO_TERMINAL on COM3 to 1.22.2
|
156
|
-
22:17:12 | ℹ️ - Erasing not yet implemented for UF2 flashing.
|
157
|
-
22:17:12 | ℹ️ - Entering UF2 bootloader on SEEED_WIO_TERMINAL on COM3
|
158
|
-
22:17:12 | ℹ️ - Waiting for mcu to mount as a drive : 10 seconds left
|
159
|
-
22:17:13 | ℹ️ - Waiting for mcu to mount as a drive : 9 seconds left
|
160
|
-
22:17:14 | ℹ️ - Board is in bootloader mode
|
161
|
-
22:17:14 | ℹ️ - Copying firmware\samd\SEEED_WIO_TERMINAL-v1.22.2.uf2 to F:[/bold]
|
162
|
-
22:17:17 | ✅ - Done copying, resetting the board and wait for it to restart
|
163
|
-
22:17:27 | ℹ️ - Flashed 4 boards
|
164
|
-
Connected boards after flashing
|
165
|
-
┏━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━┓
|
166
|
-
┃ Serial ┃ Family ┃ Port ┃ Board ┃ CPU ┃ Version ┃ build ┃
|
167
|
-
┡━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━┩
|
168
|
-
│ COM11 │ micropython │ rp2 │ RPI_PICO_W │ RP2040 │ 1.22.2 │ │
|
169
|
-
│ COM12 │ micropython │ esp8266 │ ESP8266_GENERIC │ ESP8266 │ 1.22.2 │ │
|
170
|
-
│ COM18 │ micropython │ rp2 │ RPI_PICO_W │ RP2040 │ 1.22.2 │ │
|
171
|
-
│ COM3 │ micropython │ samd │ SEEED_WIO_TERMINAL │ SAMD51P19A │ 1.22.2 │ │
|
172
|
-
│ COM5 │ micropython │ stm32 │ PYBV11 │ STM32F405RG │ 1.23.0-preview │ 166 │
|
173
|
-
│ COM8 │ micropython │ esp32 │ ESP32_GENERIC_S3 │ ESP32S3 │ 1.23.0-preview │ 155 │
|
174
|
-
└────────┴─────────────┴─────────┴────────────────────┴─────────────┴────────────────┴───────┘
|
175
|
-
```
|
176
|
-
Note that if no matching firmware can be found for a board, it will be skipped.
|
177
|
-
(For example, the PYBV11 and ESP32_GENERIC_S3 boards in the example above.)
|
178
|
-
|
179
|
-
## Issues and bug reports
|
180
|
-
mpflash is currently co-located in the [micropython-stubber](https://github.com/Josverl/micropython-stubber) repository.
|
181
|
-
Please report any issues or bugs in the [issue tracker](https://github.com/Josverl/micropython-stubber/issues) using the MPflash feedback template.
|
182
|
-
|
183
|
-
## License
|
184
|
-
mpflash is licensed under the MIT license. See the LICENSE file for more details.
|
1
|
+
# MPFLASH
|
2
|
+
[](https://pypi.org/project/mpflash/)
|
3
|
+
[](https://badgen.net/pypi/python/mpflash)
|
4
|
+
[](https://pepy.tech/project/mpflash)
|
5
|
+
|
6
|
+
|
7
|
+
`mpflash` is a command-line tool for working with MicroPython firmware. It provides features to help you flash and update Micropython on one or more .
|
8
|
+
|
9
|
+
This tool was initially created to be used in a CI/CD pipeline to automate the process of downloading and flashing MicroPython firmware to multiple boards, but it has been extend with a TUI to be used for manual downloadig, flashing and development.
|
10
|
+
|
11
|
+
`mpflash` has been tested on:
|
12
|
+
- OS: Windows x64, Linux X64, but not (yet) macOS.
|
13
|
+
- Micropython (hardware) ports:
|
14
|
+
- `rp2`, using `.uf2`, using filecopy (macos not tested yet)
|
15
|
+
- `samd`, using ` .uf2`, using filecopy (macos not tested yet)
|
16
|
+
- `esp32`, using `.bin`, using esptool,
|
17
|
+
- `esp8266`, using `.bin`, using esptool
|
18
|
+
- `stm32`, using ` .dfu`, using pydfu
|
19
|
+
|
20
|
+
Not yet implemented: `nrf`, `cc3200`, `mimxrt`
|
21
|
+
|
22
|
+
## Features
|
23
|
+
1. List the connected boards including their firmware details, in a tabular or json format
|
24
|
+
2. Download MicroPython firmware for versions, and matching a specified board or matches your current attached board.
|
25
|
+
3. Flash one or all connected MicroPython boards with a specific firmware or version.
|
26
|
+
|
27
|
+
## Installation
|
28
|
+
To install mpflash, you can use pip: `pip install mpflash`
|
29
|
+
|
30
|
+
## Basic usage
|
31
|
+
You can use mpflash to perform various operations on your MicroPython boards. Here is an example of basic usage:
|
32
|
+
|
33
|
+
| Command | Description |
|
34
|
+
|---------|-------------|
|
35
|
+
| `mpflash list` | List the connected board(s) including their firmware details |
|
36
|
+
| `mpflash download` | Download the MicroPython firmware(s) for the connected board(s) |
|
37
|
+
| `mpflash flash` | Flash the latest stable firmware to the connected board(s) |
|
38
|
+
|
39
|
+
|
40
|
+
## Linux permissions to access usb devices
|
41
|
+
In order to flash the firmware to the board, you need to have the correct permissions to access the USB devices.
|
42
|
+
On Windows this will not be an issue, but on Linux you can use udev rules to give non-root users access to the USB devices.
|
43
|
+
[See the stm32_permissions documentation](./stm32_udev_rules.md) for more information.
|
44
|
+
|
45
|
+
|
46
|
+
## Detailed usage
|
47
|
+
You can list the connected boards using the following command:
|
48
|
+
```bash
|
49
|
+
$> mpflash list
|
50
|
+
Connected boards
|
51
|
+
┏━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━┓
|
52
|
+
┃ Serial ┃Family ┃Port ┃Board ┃CPU ┃Version ┃build ┃
|
53
|
+
┡━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━┩
|
54
|
+
│ COM21 │micropython │rp2 │RPI_PICO │RP2040 │v1.23.0-preview │ 236 │
|
55
|
+
│ │ │ │Raspberry Pi Pico with RP2040 │ │ │ │
|
56
|
+
│ COM23 │micropython │rp2 │RPI_PICO_W │RP2040 │v1.23.0-preview │ 176 │
|
57
|
+
│ │ │ │Raspberry Pi Pico W with RP2040 │ │ │ │
|
58
|
+
│ COM9 │micropython │rp2 │ARDUINO_NANO_RP2040_CONNECT │RP2040 │v1.23.0-preview │ 341 │
|
59
|
+
│ │ │ │Arduino Nano RP2040 Connect with RP2040 │ │ │ │
|
60
|
+
└─────────┴─────────────┴──────┴───────────────────────────────────────────┴────────┴─────────────────┴──────┘
|
61
|
+
```
|
62
|
+
## Download the firmware
|
63
|
+
|
64
|
+
To download the MicroPython firmware for some boards, use the following command:
|
65
|
+
- `mpflash download` download the latest stable firmware for all connected boards
|
66
|
+
- `mpflash download --version preview` download the current preview for all connected boards
|
67
|
+
- `mpflash download --board ESP8266_GENERIC --board SEEED_WIO_TERMINAL` download these specific boards
|
68
|
+
- `mpflash download --version ? --board ?` prompt to select a specific version and board to download
|
69
|
+
|
70
|
+
These will try to download the prebuilt MicroPython firmware for the boards from https://micropython.org/download/ and save it in your downloads folder in the `firmware` directory.
|
71
|
+
The stable version (default) is determined based on the most recent published release,
|
72
|
+
other versions are `--version preview` and `--version x.y.z` to download the latest preview or version x.y.z respectively.
|
73
|
+
|
74
|
+
By default the firmware will be downloaded to your OS's preferred `Downloads/firmware` folder, but you can speciy a different directory using the `--dir` option.
|
75
|
+
|
76
|
+
The directory structure will be something like this:
|
77
|
+
|
78
|
+
``` text
|
79
|
+
Downloads/firmware
|
80
|
+
| firmware.jsonl
|
81
|
+
+---esp8266
|
82
|
+
| ESP8266_GENERIC-FLASH_1M-v1.22.2.bin
|
83
|
+
| ESP8266_GENERIC-FLASH_512K-v1.22.2.bin
|
84
|
+
| ESP8266_GENERIC-OTA-v1.22.2.bin
|
85
|
+
| ESP8266_GENERIC-v1.22.2.bin
|
86
|
+
\---samd
|
87
|
+
SEEED_WIO_TERMINAL-v1.22.2.uf2
|
88
|
+
```
|
89
|
+
|
90
|
+
## Flashing the firmware
|
91
|
+
After you have downloaded a firmware you can flash the firmware to a board using the following command: `mpflash flash`
|
92
|
+
This will (try to) autodetect the connected boards, and determine the correct firmware to flash to each board.
|
93
|
+
|
94
|
+
- `mpflash flash` will flash the latest stable firmware to all connected boards.
|
95
|
+
- `mpflash flash --serial ? --board ?` will prompt to select a specific serial port and board to flash. (the firmware must be dowloaded earlier)
|
96
|
+
|
97
|
+
|
98
|
+
### Flashing all connected boards with the latest stable firmware
|
99
|
+
```bash
|
100
|
+
> mpflash flash
|
101
|
+
22:15:55 | ℹ️ - Using latest stable version: v1.22.2
|
102
|
+
Connected boards
|
103
|
+
┏━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━┓
|
104
|
+
┃ Serial ┃ Family ┃ Port ┃ Board ┃ CPU ┃ Version ┃ build ┃
|
105
|
+
┡━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━┩
|
106
|
+
│ COM11 │ micropython │ rp2 │ RPI_PICO_W │ RP2040 │ 1.20.0 │ │
|
107
|
+
│ COM12 │ micropython │ esp8266 │ ESP8266_GENERIC │ ESP8266 │ 1.22.2 │ │
|
108
|
+
│ COM18 │ micropython │ rp2 │ RPI_PICO_W │ RP2040 │ 1.23.0-preview │ 155 │
|
109
|
+
│ COM3 │ micropython │ samd │ SEEED_WIO_TERMINAL │ SAMD51P19A │ 1.23.0-preview │ 155 │
|
110
|
+
│ COM5 │ micropython │ stm32 │ PYBV11 │ STM32F405RG │ 1.23.0-preview │ 166 │
|
111
|
+
│ COM8 │ micropython │ esp32 │ ESP32_GENERIC_S3 │ ESP32S3 │ 1.23.0-preview │ 155 │
|
112
|
+
└────────┴─────────────┴─────────┴────────────────────┴─────────────┴────────────────┴───────┘
|
113
|
+
22:15:58 | ℹ️ - Found v1.22.2 firmware rp2\RPI_PICO_W-v1.22.2.uf2 for RPI_PICO_W on COM11.
|
114
|
+
22:15:58 | ℹ️ - Found v1.22.2 firmware esp8266\ESP8266_GENERIC-v1.22.2.bin for ESP8266_GENERIC on COM12.
|
115
|
+
22:15:58 | ℹ️ - Found v1.22.2 firmware rp2\RPI_PICO_W-v1.22.2.uf2 for RPI_PICO_W on COM18.
|
116
|
+
22:15:58 | ℹ️ - Found v1.22.2 firmware samd\SEEED_WIO_TERMINAL-v1.22.2.uf2 for SEEED_WIO_TERMINAL on COM3.
|
117
|
+
22:15:58 | ⚠️ - Trying to find a firmware for the board PYBV11
|
118
|
+
22:15:58 | ❌ - No v1.22.2 firmware found for PYBV11 on COM5.
|
119
|
+
22:15:58 | ⚠️ - Trying to find a firmware for the board ESP32-GENERIC-S3
|
120
|
+
22:15:58 | ❌ - No v1.22.2 firmware found for ESP32_GENERIC_S3 on COM8.
|
121
|
+
22:15:58 | ℹ️ - Updating RPI_PICO_W on COM11 to 1.22.2
|
122
|
+
22:15:58 | ℹ️ - Erasing not yet implemented for UF2 flashing.
|
123
|
+
22:15:58 | ℹ️ - Entering UF2 bootloader on RPI_PICO_W on COM11
|
124
|
+
22:15:58 | ℹ️ - Waiting for mcu to mount as a drive : 10 seconds left
|
125
|
+
22:15:59 | ℹ️ - Waiting for mcu to mount as a drive : 9 seconds left
|
126
|
+
22:16:00 | ℹ️ - Board is in bootloader mode
|
127
|
+
22:16:00 | ℹ️ - Copying firmware\rp2\RPI_PICO_W-v1.22.2.uf2 to F:
|
128
|
+
22:16:13 | ✅ - Done copying, resetting the board and wait for it to restart
|
129
|
+
22:16:23 | ℹ️ - Updating ESP8266_GENERIC on COM12 to 1.22.2
|
130
|
+
22:16:23 | ℹ️ - Flashing firmware\esp8266\ESP8266_GENERIC-v1.22.2.bin on ESP8266_GENERIC on COM12
|
131
|
+
22:16:23 | ℹ️ - Running esptool --chip ESP8266 --port COM12 erase_flash
|
132
|
+
esptool.py v4.7.0
|
133
|
+
Serial port COM12
|
134
|
+
Connecting....
|
135
|
+
...
|
136
|
+
Chip erase completed successfully in 6.5s
|
137
|
+
Hard resetting via RTS pin...
|
138
|
+
22:16:31 | ℹ️ - Running esptool --chip ESP8266 --port COM12 -b 460800 write_flash --flash_size=detect 0x0 firmware\esp8266\ESP8266_GENERIC-v1.22.2.bin
|
139
|
+
esptool.py v4.7.0
|
140
|
+
Serial port COM12
|
141
|
+
Connecting....
|
142
|
+
...
|
143
|
+
Leaving...
|
144
|
+
Hard resetting via RTS pin...
|
145
|
+
22:16:43 | ℹ️ - Done flashing, resetting the board and wait for it to restart
|
146
|
+
22:16:49 | ✅ - Flashed 1.22.2 to ESP8266_GENERIC on COM12 done
|
147
|
+
22:16:49 | ℹ️ - Updating RPI_PICO_W on COM18 to 1.22.2
|
148
|
+
22:16:49 | ℹ️ - Erasing not yet implemented for UF2 flashing.
|
149
|
+
22:16:49 | ℹ️ - Entering UF2 bootloader on RPI_PICO_W on COM18
|
150
|
+
22:16:49 | ℹ️ - Waiting for mcu to mount as a drive : 10 seconds left
|
151
|
+
22:16:50 | ℹ️ - Waiting for mcu to mount as a drive : 9 seconds left
|
152
|
+
22:16:51 | ℹ️ - Board is in bootloader mode
|
153
|
+
22:16:51 | ℹ️ - Copying firmware\rp2\RPI_PICO_W-v1.22.2.uf2 to F:[/bold]
|
154
|
+
22:17:02 | ✅ - Done copying, resetting the board and wait for it to restart
|
155
|
+
22:17:12 | ℹ️ - Updating SEEED_WIO_TERMINAL on COM3 to 1.22.2
|
156
|
+
22:17:12 | ℹ️ - Erasing not yet implemented for UF2 flashing.
|
157
|
+
22:17:12 | ℹ️ - Entering UF2 bootloader on SEEED_WIO_TERMINAL on COM3
|
158
|
+
22:17:12 | ℹ️ - Waiting for mcu to mount as a drive : 10 seconds left
|
159
|
+
22:17:13 | ℹ️ - Waiting for mcu to mount as a drive : 9 seconds left
|
160
|
+
22:17:14 | ℹ️ - Board is in bootloader mode
|
161
|
+
22:17:14 | ℹ️ - Copying firmware\samd\SEEED_WIO_TERMINAL-v1.22.2.uf2 to F:[/bold]
|
162
|
+
22:17:17 | ✅ - Done copying, resetting the board and wait for it to restart
|
163
|
+
22:17:27 | ℹ️ - Flashed 4 boards
|
164
|
+
Connected boards after flashing
|
165
|
+
┏━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━┳━━━━━━━┓
|
166
|
+
┃ Serial ┃ Family ┃ Port ┃ Board ┃ CPU ┃ Version ┃ build ┃
|
167
|
+
┡━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━╇━━━━━━━┩
|
168
|
+
│ COM11 │ micropython │ rp2 │ RPI_PICO_W │ RP2040 │ 1.22.2 │ │
|
169
|
+
│ COM12 │ micropython │ esp8266 │ ESP8266_GENERIC │ ESP8266 │ 1.22.2 │ │
|
170
|
+
│ COM18 │ micropython │ rp2 │ RPI_PICO_W │ RP2040 │ 1.22.2 │ │
|
171
|
+
│ COM3 │ micropython │ samd │ SEEED_WIO_TERMINAL │ SAMD51P19A │ 1.22.2 │ │
|
172
|
+
│ COM5 │ micropython │ stm32 │ PYBV11 │ STM32F405RG │ 1.23.0-preview │ 166 │
|
173
|
+
│ COM8 │ micropython │ esp32 │ ESP32_GENERIC_S3 │ ESP32S3 │ 1.23.0-preview │ 155 │
|
174
|
+
└────────┴─────────────┴─────────┴────────────────────┴─────────────┴────────────────┴───────┘
|
175
|
+
```
|
176
|
+
Note that if no matching firmware can be found for a board, it will be skipped.
|
177
|
+
(For example, the PYBV11 and ESP32_GENERIC_S3 boards in the example above.)
|
178
|
+
|
179
|
+
## Issues and bug reports
|
180
|
+
mpflash is currently co-located in the [micropython-stubber](https://github.com/Josverl/micropython-stubber) repository.
|
181
|
+
Please report any issues or bugs in the [issue tracker](https://github.com/Josverl/micropython-stubber/issues) using the MPflash feedback template.
|
182
|
+
|
183
|
+
## License
|
184
|
+
mpflash is licensed under the MIT license. See the LICENSE file for more details.
|
@@ -1,98 +1,98 @@
|
|
1
|
-
import shutil
|
2
|
-
from pathlib import Path
|
3
|
-
from typing import Union
|
4
|
-
|
5
|
-
import jsonlines
|
6
|
-
import requests
|
7
|
-
from loguru import logger as log
|
8
|
-
|
9
|
-
# re-use logic from mpremote
|
10
|
-
from mpremote.mip import _rewrite_url as rewrite_url # type: ignore
|
11
|
-
|
12
|
-
from mpflash.common import FWInfo
|
13
|
-
from mpflash.config import config
|
14
|
-
from mpflash.vendor.versions import get_preview_mp_version, get_stable_mp_version
|
15
|
-
|
16
|
-
|
17
|
-
def add_firmware(
|
18
|
-
source: Union[Path, str],
|
19
|
-
new_fw: FWInfo,
|
20
|
-
*,
|
21
|
-
force: bool = False,
|
22
|
-
custom: bool = False,
|
23
|
-
description: str = "",
|
24
|
-
) -> bool:
|
25
|
-
"""Add a firmware to the firmware folder.
|
26
|
-
|
27
|
-
stored in the port folder, with the same filename as the source.
|
28
|
-
|
29
|
-
"""
|
30
|
-
# Check minimal info needed
|
31
|
-
if not new_fw.port or not new_fw.board:
|
32
|
-
log.error("Port and board are required")
|
33
|
-
return False
|
34
|
-
if not isinstance(source, Path) and not source.startswith("http"):
|
35
|
-
log.error(f"Invalid source {source}")
|
36
|
-
return False
|
37
|
-
|
38
|
-
# use sensible defaults
|
39
|
-
source_2 = Path(source)
|
40
|
-
new_fw.ext = new_fw.ext or source_2.suffix
|
41
|
-
new_fw.variant = new_fw.variant or new_fw.board
|
42
|
-
new_fw.custom = new_fw.custom or custom
|
43
|
-
new_fw.description = new_fw.description or description
|
44
|
-
if not new_fw.version:
|
45
|
-
# TODO: Get version from filename
|
46
|
-
# or use the last preview version
|
47
|
-
new_fw.version = get_preview_mp_version() if new_fw.preview else get_stable_mp_version()
|
48
|
-
|
49
|
-
config.firmware_folder.mkdir(exist_ok=True)
|
50
|
-
|
51
|
-
fw_filename = config.firmware_folder / new_fw.port / source_2.name
|
52
|
-
|
53
|
-
new_fw.filename = str(fw_filename.relative_to(config.firmware_folder))
|
54
|
-
new_fw.firmware = source.as_uri() if isinstance(source, Path) else source
|
55
|
-
|
56
|
-
if not copy_firmware(source, fw_filename, force):
|
57
|
-
log.error(f"Failed to copy {source} to {fw_filename}")
|
58
|
-
return False
|
59
|
-
# add to inventory
|
60
|
-
with jsonlines.open(config.firmware_folder / "firmware.jsonl", "a") as writer:
|
61
|
-
log.info(f"Adding {new_fw.port} {new_fw.board}")
|
62
|
-
log.info(f" to {fw_filename}")
|
63
|
-
|
64
|
-
writer.write(new_fw.to_dict())
|
65
|
-
return True
|
66
|
-
|
67
|
-
|
68
|
-
def copy_firmware(source: Union[Path, str], fw_filename: Path, force: bool = False):
|
69
|
-
"""Add a firmware to the firmware folder.
|
70
|
-
stored in the port folder, with the same filename as the source.
|
71
|
-
"""
|
72
|
-
if fw_filename.exists() and not force:
|
73
|
-
log.error(f" {fw_filename} already exists. Use --force to overwrite")
|
74
|
-
return False
|
75
|
-
fw_filename.parent.mkdir(exist_ok=True)
|
76
|
-
if isinstance(source, Path):
|
77
|
-
if not source.exists():
|
78
|
-
log.error(f"File {source} does not exist")
|
79
|
-
return False
|
80
|
-
# file copy
|
81
|
-
log.debug(f"Copy {source} to {fw_filename}")
|
82
|
-
shutil.copy(source, fw_filename)
|
83
|
-
return True
|
84
|
-
# handle github urls
|
85
|
-
url = rewrite_url(source)
|
86
|
-
if str(source).startswith("http://") or str(source).startswith("https://"):
|
87
|
-
log.debug(f"Download {url} to {fw_filename}")
|
88
|
-
response = requests.get(url)
|
89
|
-
|
90
|
-
if response.status_code == 200:
|
91
|
-
with open(fw_filename, "wb") as file:
|
92
|
-
file.write(response.content)
|
93
|
-
log.info("File downloaded and saved successfully.")
|
94
|
-
return True
|
95
|
-
else:
|
96
|
-
print("Failed to download the file.")
|
97
|
-
return False
|
98
|
-
return False
|
1
|
+
import shutil
|
2
|
+
from pathlib import Path
|
3
|
+
from typing import Union
|
4
|
+
|
5
|
+
import jsonlines
|
6
|
+
import requests
|
7
|
+
from loguru import logger as log
|
8
|
+
|
9
|
+
# re-use logic from mpremote
|
10
|
+
from mpremote.mip import _rewrite_url as rewrite_url # type: ignore
|
11
|
+
|
12
|
+
from mpflash.common import FWInfo
|
13
|
+
from mpflash.config import config
|
14
|
+
from mpflash.vendor.versions import get_preview_mp_version, get_stable_mp_version
|
15
|
+
|
16
|
+
|
17
|
+
def add_firmware(
|
18
|
+
source: Union[Path, str],
|
19
|
+
new_fw: FWInfo,
|
20
|
+
*,
|
21
|
+
force: bool = False,
|
22
|
+
custom: bool = False,
|
23
|
+
description: str = "",
|
24
|
+
) -> bool:
|
25
|
+
"""Add a firmware to the firmware folder.
|
26
|
+
|
27
|
+
stored in the port folder, with the same filename as the source.
|
28
|
+
|
29
|
+
"""
|
30
|
+
# Check minimal info needed
|
31
|
+
if not new_fw.port or not new_fw.board:
|
32
|
+
log.error("Port and board are required")
|
33
|
+
return False
|
34
|
+
if not isinstance(source, Path) and not source.startswith("http"):
|
35
|
+
log.error(f"Invalid source {source}")
|
36
|
+
return False
|
37
|
+
|
38
|
+
# use sensible defaults
|
39
|
+
source_2 = Path(source)
|
40
|
+
new_fw.ext = new_fw.ext or source_2.suffix
|
41
|
+
new_fw.variant = new_fw.variant or new_fw.board
|
42
|
+
new_fw.custom = new_fw.custom or custom
|
43
|
+
new_fw.description = new_fw.description or description
|
44
|
+
if not new_fw.version:
|
45
|
+
# TODO: Get version from filename
|
46
|
+
# or use the last preview version
|
47
|
+
new_fw.version = get_preview_mp_version() if new_fw.preview else get_stable_mp_version()
|
48
|
+
|
49
|
+
config.firmware_folder.mkdir(exist_ok=True)
|
50
|
+
|
51
|
+
fw_filename = config.firmware_folder / new_fw.port / source_2.name
|
52
|
+
|
53
|
+
new_fw.filename = str(fw_filename.relative_to(config.firmware_folder))
|
54
|
+
new_fw.firmware = source.as_uri() if isinstance(source, Path) else source
|
55
|
+
|
56
|
+
if not copy_firmware(source, fw_filename, force):
|
57
|
+
log.error(f"Failed to copy {source} to {fw_filename}")
|
58
|
+
return False
|
59
|
+
# add to inventory
|
60
|
+
with jsonlines.open(config.firmware_folder / "firmware.jsonl", "a") as writer:
|
61
|
+
log.info(f"Adding {new_fw.port} {new_fw.board}")
|
62
|
+
log.info(f" to {fw_filename}")
|
63
|
+
|
64
|
+
writer.write(new_fw.to_dict())
|
65
|
+
return True
|
66
|
+
|
67
|
+
|
68
|
+
def copy_firmware(source: Union[Path, str], fw_filename: Path, force: bool = False):
|
69
|
+
"""Add a firmware to the firmware folder.
|
70
|
+
stored in the port folder, with the same filename as the source.
|
71
|
+
"""
|
72
|
+
if fw_filename.exists() and not force:
|
73
|
+
log.error(f" {fw_filename} already exists. Use --force to overwrite")
|
74
|
+
return False
|
75
|
+
fw_filename.parent.mkdir(exist_ok=True)
|
76
|
+
if isinstance(source, Path):
|
77
|
+
if not source.exists():
|
78
|
+
log.error(f"File {source} does not exist")
|
79
|
+
return False
|
80
|
+
# file copy
|
81
|
+
log.debug(f"Copy {source} to {fw_filename}")
|
82
|
+
shutil.copy(source, fw_filename)
|
83
|
+
return True
|
84
|
+
# handle github urls
|
85
|
+
url = rewrite_url(source)
|
86
|
+
if str(source).startswith("http://") or str(source).startswith("https://"):
|
87
|
+
log.debug(f"Download {url} to {fw_filename}")
|
88
|
+
response = requests.get(url)
|
89
|
+
|
90
|
+
if response.status_code == 200:
|
91
|
+
with open(fw_filename, "wb") as file:
|
92
|
+
file.write(response.content)
|
93
|
+
log.info("File downloaded and saved successfully.")
|
94
|
+
return True
|
95
|
+
else:
|
96
|
+
print("Failed to download the file.")
|
97
|
+
return False
|
98
|
+
return False
|