kopia lustrzana https://github.com/micropython/micropython
stm32/boards/LEGO_HUB_NO6: Move robust logic to mboot.
Signed-off-by: Damien George <damien@micropython.org>pull/14042/head
rodzic
9651046edd
commit
899592ac34
|
@ -7,9 +7,6 @@ import struct, machine, fwupdate, spiflash, pyb
|
||||||
_IOCTL_BLOCK_COUNT = const(4)
|
_IOCTL_BLOCK_COUNT = const(4)
|
||||||
_IOCTL_BLOCK_SIZE = const(5)
|
_IOCTL_BLOCK_SIZE = const(5)
|
||||||
|
|
||||||
_SPIFLASH_UPDATE_KEY_ADDR = const(1020 * 1024)
|
|
||||||
_SPIFLASH_UPDATE_KEY_VALUE = const(0x12345678)
|
|
||||||
|
|
||||||
_FILESYSTEM_ADDR = const(0x8000_0000 + 1024 * 1024)
|
_FILESYSTEM_ADDR = const(0x8000_0000 + 1024 * 1024)
|
||||||
|
|
||||||
# Roundabout way to get actual filesystem size from config.
|
# Roundabout way to get actual filesystem size from config.
|
||||||
|
@ -26,9 +23,6 @@ def update_app(filename):
|
||||||
if not elems:
|
if not elems:
|
||||||
return
|
return
|
||||||
|
|
||||||
# Create the update key.
|
|
||||||
key = struct.pack("<I", _SPIFLASH_UPDATE_KEY_VALUE)
|
|
||||||
|
|
||||||
# Create a SPI flash object.
|
# Create a SPI flash object.
|
||||||
spi = machine.SoftSPI(
|
spi = machine.SoftSPI(
|
||||||
sck=machine.Pin.board.FLASH_SCK,
|
sck=machine.Pin.board.FLASH_SCK,
|
||||||
|
@ -41,11 +35,5 @@ def update_app(filename):
|
||||||
# We can't use pyb.Flash() because we need to write to the "reserved" 1M area.
|
# We can't use pyb.Flash() because we need to write to the "reserved" 1M area.
|
||||||
flash = spiflash.SPIFlash(spi, cs)
|
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.
|
# 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)
|
machine.bootloader(elems)
|
||||||
|
|
|
@ -194,7 +194,14 @@ int board_mboot_get_reset_mode(uint32_t *initial_r0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void board_mboot_state_change(int state, uint32_t arg) {
|
void board_mboot_state_change(int state, uint32_t arg) {
|
||||||
if (state == MBOOT_STATE_FSLOAD_END) {
|
if (state == MBOOT_STATE_FSLOAD_START) {
|
||||||
|
// The FS-load update is about to start. Program the update key and FS-load elements
|
||||||
|
// into the flash so they can be retrieved if there is a power failure during the update.
|
||||||
|
mp_spiflash_erase_block(MBOOT_SPIFLASH_SPIFLASH, SPIFLASH_UPDATE_KEY_ADDR);
|
||||||
|
uint32_t key = SPIFLASH_UPDATE_KEY_VALUE;
|
||||||
|
mp_spiflash_write(MBOOT_SPIFLASH_SPIFLASH, SPIFLASH_UPDATE_KEY_ADDR, 4, (const uint8_t *)&key);
|
||||||
|
mp_spiflash_write(MBOOT_SPIFLASH_SPIFLASH, SPIFLASH_UPDATE_KEY_ADDR + 4, ELEM_DATA_SIZE, ELEM_DATA_START);
|
||||||
|
} else if (state == MBOOT_STATE_FSLOAD_END) {
|
||||||
// The FS-load update completed (either with success or failure), so erase the
|
// The FS-load update completed (either with success or failure), so erase the
|
||||||
// update key and write the result of the FS-load operation into flash.
|
// update key and write the result of the FS-load operation into flash.
|
||||||
mp_spiflash_erase_block(MBOOT_SPIFLASH_SPIFLASH, SPIFLASH_UPDATE_KEY_ADDR);
|
mp_spiflash_erase_block(MBOOT_SPIFLASH_SPIFLASH, SPIFLASH_UPDATE_KEY_ADDR);
|
||||||
|
|
Ładowanie…
Reference in New Issue