// Switch into boot mode and reset void EraseAndReset() { cpu_irq_disable(); #if SAM4S # define IFLASH_ADDR IFLASH0_ADDR # define IFLASH_PAGE_SIZE IFLASH0_PAGE_SIZE # define IFLASH_NB_OF_PAGES (IFLASH0_SIZE / IFLASH_PAGE_SIZE) #endif #if SAM3XA # define IFLASH_ADDR IFLASH0_ADDR # define IFLASH_PAGE_SIZE IFLASH0_PAGE_SIZE # define IFLASH_NB_OF_PAGES ((IFLASH1_ADDR + IFLASH1_SIZE - IFLASH_ADDR) / IFLASH_PAGE_SIZE) #endif for(size_t i = 0; i <= IFLASH_NB_OF_PAGES; i++) { wdt_restart(WDT); size_t pageStartAddr = IFLASH_ADDR + i * IFLASH_PAGE_SIZE; flash_unlock(pageStartAddr, pageStartAddr + IFLASH_PAGE_SIZE - 1, nullptr, nullptr); } flash_clear_gpnvm(1); // tell the system to boot from ROM next time rstc_start_software_reset(RSTC); for(;;) {} }
void DueFlashStorage::setGPNVMBootMode(bool mode) { //SerialUSB.println("About to set how to boot"); __disable_irq(); //flash_clear_gpnvm(1); //boot from ROM for testing flash_set_gpnvm(1); //boot from Flash for production //SerialUSB.print("Set GPNVM Mode to "); //SerialUSB.println(mode); if (mode) flash_set_gpnvm(2); else flash_clear_gpnvm(2); //I think that this becomes active IMMEDIATELY so the sketch will pretty much be guaranteed to crash after this is run. __enable_irq(); }