diff --git a/DSTAT/src/settings.c b/DSTAT/src/settings.c index b6cf2cda75d370522f7894eb6a29e5a04762bb01..ecbfdad41b003435d58315a0664b70f033ec70bb 100644 --- a/DSTAT/src/settings.c +++ b/DSTAT/src/settings.c @@ -9,16 +9,23 @@ #include "settings.h" #include "config/conf_board.h" +#include #define SETTINGS_EEPROM_PARAM_PAGE 0 #define SETTINGS_EEPROM_OFFSET_ADDR SETTINGS_EEPROM_PARAM_PAGE * EEPROM_PAGE_SIZE +void update_firmware(void); + void settings_handler(char command){ switch (command){ case 'D': //Reset defaults settings_restore_defaults(); break; + case 'F': //Update Firmware + update_firmware(); + break; + case 'R': //Read settings from EEPROM settings_read_eeprom(); break; @@ -43,6 +50,19 @@ void settings_handler(char command){ } } +void(* start_bootloader)(void) = (void (*)(void))(BOOT_SECTION_START/2+0x1FC/2); + +void update_firmware(void){ + /** + * Jumps to bootloader to do firmware upgrade + */ + udc_stop(); // Disable USB Stack + cli(); // Disable Interrupts + + EIND = BOOT_SECTION_START>>17; + start_bootloader(); +} + void settings_read_eeprom(void){ printf("#INFO: SETTINGS\n\r"); nvm_eeprom_read_buffer(SETTINGS_EEPROM_OFFSET_ADDR, &settings, EEPROM_PAGE_SIZE);