|
@@ -30,6 +30,7 @@
|
|
|
#include <hardware/spi.h>
|
|
#include <hardware/spi.h>
|
|
|
#include <hardware/flash.h>
|
|
#include <hardware/flash.h>
|
|
|
#include <hardware/structs/xip_ctrl.h>
|
|
#include <hardware/structs/xip_ctrl.h>
|
|
|
|
|
+#include <hardware/structs/usb.h>
|
|
|
#include <platform/mbed_error.h>
|
|
#include <platform/mbed_error.h>
|
|
|
#include <multicore.h>
|
|
#include <multicore.h>
|
|
|
#include <USB/PluggableUSBSerial.h>
|
|
#include <USB/PluggableUSBSerial.h>
|
|
@@ -383,6 +384,7 @@ extern uint32_t __real_vectors_start;
|
|
|
extern uint32_t __StackTop;
|
|
extern uint32_t __StackTop;
|
|
|
static volatile void *g_bootloader_exit_req;
|
|
static volatile void *g_bootloader_exit_req;
|
|
|
|
|
|
|
|
|
|
+__attribute__((section(".time_critical.platform_rewrite_flash_page")))
|
|
|
bool platform_rewrite_flash_page(uint32_t offset, uint8_t buffer[PLATFORM_FLASH_PAGE_SIZE])
|
|
bool platform_rewrite_flash_page(uint32_t offset, uint8_t buffer[PLATFORM_FLASH_PAGE_SIZE])
|
|
|
{
|
|
{
|
|
|
if (offset == PLATFORM_BOOTLOADER_SIZE)
|
|
if (offset == PLATFORM_BOOTLOADER_SIZE)
|
|
@@ -394,6 +396,13 @@ bool platform_rewrite_flash_page(uint32_t offset, uint8_t buffer[PLATFORM_FLASH_
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ if (NVIC_GetEnableIRQ(USBCTRL_IRQn))
|
|
|
|
|
+ {
|
|
|
|
|
+ logmsg("Disabling USB during firmware flashing");
|
|
|
|
|
+ NVIC_DisableIRQ(USBCTRL_IRQn);
|
|
|
|
|
+ usb_hw->main_ctrl = 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
dbgmsg("Writing flash at offset ", offset, " data ", bytearray(buffer, 4));
|
|
dbgmsg("Writing flash at offset ", offset, " data ", bytearray(buffer, 4));
|
|
|
assert(offset % PLATFORM_FLASH_PAGE_SIZE == 0);
|
|
assert(offset % PLATFORM_FLASH_PAGE_SIZE == 0);
|
|
|
assert(offset >= PLATFORM_BOOTLOADER_SIZE);
|
|
assert(offset >= PLATFORM_BOOTLOADER_SIZE);
|
|
@@ -422,6 +431,7 @@ bool platform_rewrite_flash_page(uint32_t offset, uint8_t buffer[PLATFORM_FLASH_
|
|
|
if (actual != expected)
|
|
if (actual != expected)
|
|
|
{
|
|
{
|
|
|
logmsg("Flash verify failed at offset ", offset + i * 4, " got ", actual, " expected ", expected);
|
|
logmsg("Flash verify failed at offset ", offset + i * 4, " got ", actual, " expected ", expected);
|
|
|
|
|
+ __enable_irq();
|
|
|
return false;
|
|
return false;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|