Esempio n. 1
0
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:
            hdr = uzlib.DecompIO(f, 16 + 15).read(6)
    except Exception:
        with open(filename, "rb") as f:
            hdr = f.read(6)
    if hdr != b"DfuSe\x01":
        print("Firmware must be a .dfu(.gz) file.")
        return

    if fs_type in (VFS_LFS1, VFS_LFS2) and not fs_blocksize:
        raise Exception("littlefs requires fs_blocksize parameter")

    mount_point = 1
    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")
    )
    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)
Esempio n. 2
0
def update_app(filename):
    print(f"Updating application firmware from {filename}")

    # Create the elements for the mboot filesystem-load operation.
    elems = fwupdate.update_app_elements(filename, _FILESYSTEM_ADDR,
                                         _FILESYSTEM_LEN)
    if not elems:
        return

    # Create the update key.
    key = struct.pack("<I", _SPIFLASH_UPDATE_KEY_VALUE)

    # Create a SPI flash object.
    spi = machine.SoftSPI(sck="B13", mosi="C3", miso="C2", baudrate=50_000_000)
    cs = machine.Pin("B12", machine.Pin.OUT, value=1)
    flash = spiflash.SPIFlash(spi, cs)

    # Write the update key and elements to the SPI flash.
    flash.erase_block(_SPIFLASH_UPDATE_KEY_ADDR)
    flash.write(_SPIFLASH_UPDATE_KEY_ADDR, key + elems)

    # Enter mboot with a request to do a filesystem-load update.
    # If there is a power failure during the update (eg battery removed) then
    # mboot will read the SPI flash update key and elements and retry.
    machine.bootloader(elems)
Esempio n. 3
0
def reset_bootloader():
    try:
        import machine
        machine.bootloader()

    except ImportError:
        import microcontroller
        microcontroller.on_next_reset(microcontroller.RunMode.BOOTLOADER)
        microcontroller.reset()
Esempio n. 4
0
def update_mpy(filename, fs_base, fs_len):
    # Check firmware is of .dfu.gz type
    try:
        with open(filename, 'rb') as f:
            hdr = uzlib.DecompIO(f, 16 + 15).read(6)
    except Exception:
        hdr = None
    if hdr != b'DfuSe\x01':
        print('Firmware must be a .dfu.gz file.')
        return

    ELEM_TYPE_END = 1
    ELEM_TYPE_MOUNT = 2
    ELEM_TYPE_FSLOAD = 3
    ELEM_MOUNT_FAT = 1
    mount_point = 1
    mount = struct.pack('<BBBBLL', ELEM_TYPE_MOUNT, 10, mount_point, ELEM_MOUNT_FAT, fs_base, fs_len)
    fsup = struct.pack('<BBB', ELEM_TYPE_FSLOAD, 1 + len(filename), mount_point) + bytes(filename, 'ascii')
    end = struct.pack('<BB', ELEM_TYPE_END, 0)
    machine.bootloader(mount + fsup + end)
Esempio n. 5
0
def update_mpy(filename, fs_base, fs_len, fs_type=VFS_FAT):
    # Check firmware is of .dfu.gz type
    try:
        with open(filename, "rb") as f:
            hdr = uzlib.DecompIO(f, 16 + 15).read(6)
    except Exception:
        hdr = None
    if hdr != b"DfuSe\x01":
        print("Firmware must be a .dfu.gz file.")
        return

    ELEM_TYPE_END = 1
    ELEM_TYPE_MOUNT = 2
    ELEM_TYPE_FSLOAD = 3
    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")
    end = struct.pack("<BB", ELEM_TYPE_END, 0)
    machine.bootloader(mount + fsup + end)
Esempio n. 6
0
try:
    import machine
    machine.bootloader()

except ImportError:
    import microcontroller
    microcontroller.on_next_reset(microcontroller.RunMode.BOOTLOADER)
    microcontroller.reset()
Esempio n. 7
0
def update_mpy(*args, **kwargs):
    elems = update_app_elements(*args, **kwargs)
    if elems:
        machine.bootloader(elems)