Ejemplo n.º 1
0
// 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(;;) {}
}
Ejemplo n.º 2
0
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();
}