// 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 ResetBoard ( const bool triggerWatchdogDuringWait ) { __disable_irq(); rstc_start_software_reset( RSTC ); while ( true ) { // If we do not keep the watchdog happy and it times out during this wait, // the reset reason will be wrong when the board starts the next time around. if ( triggerWatchdogDuringWait ) wdt_restart( WDT ); } }
/* * Commands within the debug context * * @param command - pointer to the command string * @param param1 - pointer to parameter 1 * @param param2- pointer to parameter 2 * @param param2 - pointer to parameter 3 */ void tcommand_debug(char *command, char *param1, char *param2, char *param3) { if (strcmp(command, "exit")==0){ TelnetContext = CLI_ROOT; return; } // Display help if (strcmp(command, "help") == 0) { //tprinthelp(); return; } if (strcmp(command, "restart")==0) { rstc_start_software_reset(RSTC); while (1); } }
int mon_restart(int argc, char **argv){ if(argc==2){ //check for [bootloader] flag if(strcmp(argv[1],"bootloader")==0){ //set the gpnvm bit to atmel bootloader efc_perform_command(EFC0, EFC_FCMD_CGPB, 1); rgb_led_set(LED_OFF,0); delay_ms(500); rgb_led_set(LED_GRAY,0); //indicate bootloader mode set } else{ printf("[bootloader] to reboot with Atmel bootloader\n"); return -1; } } //detach USB // udc_detach(); //software reset rstc_start_software_reset(RSTC); return 0; }
/* * Initialize functions for DUE * (Called by AJ_PlatformInit()) */ void _AJ_PlatformInit(void) { /* * Init sequence for the DUE */ const usart_serial_options_t usart_serial_options = { .baudrate = 115200, .charlength = 0, .paritytype = UART_MR_PAR_NO, .stopbits = false }; sysclk_init(); board_init(); //configure_uart(); stdio_serial_init(CONSOLE_UART, &usart_serial_options); AJ_WSL_ModuleInit(); AJ_InitRNG(); } uint16_t AJ_ByteSwap16(uint16_t x) { return swap16(x); } uint32_t AJ_ByteSwap32(uint32_t x) { return swap32(x); } uint64_t AJ_ByteSwap64(uint64_t x) { return swap64(x); } void _AJ_Reboot(void) { rstc_start_software_reset(RSTC); }
void Reset() { rstc_start_software_reset(RSTC); }
/** * \brief Set the trigger for bootloader and perform a software reset to let * the bootloader to perform firmware update process. */ static void jump_to_bootloader(void) { uint32_t ul_test_page_addr = TEST_PAGE_ADDRESS; uint32_t *pul_test_page = (uint32_t *)ul_test_page_addr; uint32_t ul_rc; uint32_t ul_idx; uint32_t temp_data; uint32_t i; for (ul_idx = 0; ul_idx < (IFLASH_PAGE_SIZE / 4); ul_idx++) { temp_data = pul_test_page[ul_idx]; trigger_page[ul_idx * 4] = (uint8_t)(temp_data & 0xFF); trigger_page[ul_idx * 4 + 1] = (uint8_t)((temp_data >> 8) & 0xFF); trigger_page[ul_idx * 4 + 2] = (uint8_t)((temp_data >> 16) & 0xFF); trigger_page[ul_idx * 4 + 3] = (uint8_t)((temp_data >> 24) & 0xFF); } /* Set the trigger */ trigger_page[0x14] = 0x01; trigger_page[0x15] = 0x00; trigger_page[0x16] = 0x00; trigger_page[0x17] = 0x00; for (i = 0; i < LANGUAGE_NUMBER; i++) { app_language++; app_language = app_language % LANGUAGE_NUMBER; /* Fill in firmware type used in bootloader */ if (firmware_type & (0x01 << app_language)) { trigger_page[0x18] = file_name_ascii[app_language][0]; trigger_page[0x19] = file_name_ascii[app_language][1]; trigger_page[0x1A] = file_name_ascii[app_language][2]; trigger_page[0x1B] = file_name_ascii[app_language][3]; trigger_page[0x1C] = file_name_ascii[app_language][4]; trigger_page[0x1D] = file_name_ascii[app_language][5]; trigger_page[0x1E] = file_name_ascii[app_language][6]; trigger_page[0x1F] = file_name_ascii[app_language][7]; trigger_page[0x20] = file_name_ascii[app_language][8]; trigger_page[0x21] = file_name_ascii[app_language][9]; trigger_page[0x22] = file_name_ascii[app_language][10]; trigger_page[0x23] = file_name_ascii[app_language][11]; break; } } ul_rc = flash_unlock(ul_test_page_addr, ul_test_page_addr + IFLASH_PAGE_SIZE, NULL, NULL); ul_rc = flash_erase_page(ul_test_page_addr, IFLASH_ERASE_PAGES_8); if (ul_rc != FLASH_RC_OK) { return; } ul_rc = flash_write(ul_test_page_addr, trigger_page, IFLASH_PAGE_SIZE, 0); if (ul_rc != FLASH_RC_OK) { return; } /* Clear screen. */ ssd1306_clear(); /* End message on the screen. */ multi_language_show_end_info(); /* Perform the software reset. */ rstc_start_software_reset(RSTC); /* Wait for reset. */ delay_ms(100); }