|  | @@ -9,6 +9,7 @@
 | 
	
		
			
				|  |  |  #include <hardware/spi.h>
 | 
	
		
			
				|  |  |  #include <hardware/flash.h>
 | 
	
		
			
				|  |  |  #include <hardware/structs/xip_ctrl.h>
 | 
	
		
			
				|  |  | +#include <hardware/structs/usb.h>
 | 
	
		
			
				|  |  |  #include <platform/mbed_error.h>
 | 
	
		
			
				|  |  |  #include <multicore.h>
 | 
	
		
			
				|  |  |  #include <USB/PluggableUSBSerial.h>
 | 
	
	
		
			
				|  | @@ -442,6 +443,7 @@ extern uint32_t __real_vectors_start;
 | 
	
		
			
				|  |  |  extern uint32_t __StackTop;
 | 
	
		
			
				|  |  |  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])
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      if (offset == PLATFORM_BOOTLOADER_SIZE)
 | 
	
	
		
			
				|  | @@ -453,6 +455,13 @@ bool platform_rewrite_flash_page(uint32_t offset, uint8_t buffer[PLATFORM_FLASH_
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    if (NVIC_GetEnableIRQ(USBCTRL_IRQn))
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +        log("Disabling USB during firmware flashing");
 | 
	
		
			
				|  |  | +        NVIC_DisableIRQ(USBCTRL_IRQn);
 | 
	
		
			
				|  |  | +        usb_hw->main_ctrl = 0;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      debuglog("Writing flash at offset ", offset, " data ", bytearray(buffer, 4));
 | 
	
		
			
				|  |  |      assert(offset % PLATFORM_FLASH_PAGE_SIZE == 0);
 | 
	
		
			
				|  |  |      assert(offset >= PLATFORM_BOOTLOADER_SIZE);
 | 
	
	
		
			
				|  | @@ -481,6 +490,7 @@ bool platform_rewrite_flash_page(uint32_t offset, uint8_t buffer[PLATFORM_FLASH_
 | 
	
		
			
				|  |  |          if (actual != expected)
 | 
	
		
			
				|  |  |          {
 | 
	
		
			
				|  |  |              log("Flash verify failed at offset ", offset + i * 4, " got ", actual, " expected ", expected);
 | 
	
		
			
				|  |  | +            __enable_irq();
 | 
	
		
			
				|  |  |              return false;
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |      }
 |