Sfoglia il codice sorgente

RP2040: Improve bootloader robustness

The SD-card bootloader occassionally crashed due to either:
- USB packets during flash writing (arduino/ArduinoCore-mbed#409)
- Some flash XIP issues when function is not in RAM.
Petteri Aimonen 2 anni fa
parent
commit
1ce7ee2dfd
1 ha cambiato i file con 10 aggiunte e 0 eliminazioni
  1. 10 0
      lib/BlueSCSI_platform_RP2040/BlueSCSI_platform.cpp

+ 10 - 0
lib/BlueSCSI_platform_RP2040/BlueSCSI_platform.cpp

@@ -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;
         }
     }