summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDamien George <damien@micropython.org>2021-01-29 11:16:00 +1100
committerDamien George <damien@micropython.org>2021-01-29 15:02:55 +1100
commit8f211df360f324c6f8e0fee3fe00bc0b4a9ac390 (patch)
treef78a5dd86b064337187dd0e900402c2915853f67
parentbd7110a3d50d2bcfaa5527fdb5d7305badba1b82 (diff)
stm32/mboot/fwupdate.py: Refactor update_mpy with support for STATUS.
Changes are: - refactor to use new _create_element function - support extended version of MOUNT element with block size - support STATUS element Signed-off-by: Damien George <damien@micropython.org>
-rw-r--r--ports/stm32/mboot/fwupdate.py36
1 files changed, 27 insertions, 9 deletions
diff --git a/ports/stm32/mboot/fwupdate.py b/ports/stm32/mboot/fwupdate.py
index 65284a6ac..d7c8f46db 100644
--- a/ports/stm32/mboot/fwupdate.py
+++ b/ports/stm32/mboot/fwupdate.py
@@ -1,6 +1,7 @@
# Update Mboot or MicroPython from a .dfu.gz file on the board's filesystem
# MIT license; Copyright (c) 2019-2020 Damien P. George
+from micropython import const
import struct, time
import uzlib, machine, stm
@@ -9,6 +10,12 @@ VFS_FAT = 1
VFS_LFS1 = 2
VFS_LFS2 = 3
+# Constants for creating mboot elements.
+_ELEM_TYPE_END = const(1)
+_ELEM_TYPE_MOUNT = const(2)
+_ELEM_TYPE_FSLOAD = const(3)
+_ELEM_TYPE_STATUS = const(4)
+
FLASH_KEY1 = 0x45670123
FLASH_KEY2 = 0xCDEF89AB
@@ -156,7 +163,11 @@ def update_mboot(filename):
print("Programming finished, can now reset or turn off.")
-def update_mpy(filename, fs_base, fs_len, fs_type=VFS_FAT):
+def _create_element(kind, body):
+ return bytes([kind, len(body)]) + body
+
+
+def update_mpy(filename, fs_base, fs_len, fs_type=VFS_FAT, fs_blocksize=0, status_addr=None):
# Check firmware is of .dfu or .dfu.gz type
try:
with open(filename, "rb") as f:
@@ -168,13 +179,20 @@ def update_mpy(filename, fs_base, fs_len, fs_type=VFS_FAT):
print("Firmware must be a .dfu(.gz) file.")
return
- ELEM_TYPE_END = 1
- ELEM_TYPE_MOUNT = 2
- ELEM_TYPE_FSLOAD = 3
+ if fs_type in (VFS_LFS1, VFS_LFS2) and not fs_blocksize:
+ raise Exception("littlefs requires fs_blocksize parameter")
+
mount_point = 1
- mount = struct.pack("<BBBBLL", ELEM_TYPE_MOUNT, 10, mount_point, fs_type, fs_base, fs_len)
- fsup = struct.pack("<BBB", ELEM_TYPE_FSLOAD, 1 + len(filename), mount_point) + bytes(
- filename, "ascii"
+ elems = _create_element(
+ _ELEM_TYPE_MOUNT,
+ struct.pack("<BBLLL", mount_point, fs_type, fs_base, fs_len, fs_blocksize),
+ )
+ elems += _create_element(
+ _ELEM_TYPE_FSLOAD, struct.pack("<B", mount_point) + bytes(filename, "ascii")
)
- end = struct.pack("<BB", ELEM_TYPE_END, 0)
- machine.bootloader(mount + fsup + end)
+ if status_addr is not None:
+ # mboot will write 0 to status_addr on succes, or a negative number on failure
+ machine.mem32[status_addr] = 1
+ elems += _create_element(_ELEM_TYPE_STATUS, struct.pack("<L", status_addr))
+ elems += _create_element(_ELEM_TYPE_END, b"")
+ machine.bootloader(elems)