diff --git a/Fred_bootloader/Fred_bootloader.atsuo b/Fred_bootloader/Fred_bootloader.atsuo index 471d4105d291e8faa22abb93728603eb9a53638a..ffb553a450bbae02b9a7df0aba262361f8a0350c 100644 Binary files a/Fred_bootloader/Fred_bootloader.atsuo and b/Fred_bootloader/Fred_bootloader.atsuo differ diff --git a/Fred_bootloader/src/bootloader.c b/Fred_bootloader/src/bootloader.c index 31fd88cd8ac03a7b521e84855044902e4f46aad6..4d5c5715383c3bdce78e8748eef1cc85627d445a 100644 --- a/Fred_bootloader/src/bootloader.c +++ b/Fred_bootloader/src/bootloader.c @@ -8,6 +8,7 @@ #include "timer_lib.h" #include "usart_lib.h" #include <avr/eeprom.h> +#include <util/delay.h> #include <asf.h> #include <ccp.h> @@ -34,7 +35,7 @@ void start_firmware() void start_bootloader() { - uint8_t chr = 0, temp, error_counter = 0; + uint8_t chr = 0, error_counter = 0; bool err = false, escape = false; while(true) { @@ -60,6 +61,7 @@ void start_bootloader() usart_putchar(USART_SERIAL, BOOTLDR_RES_OK); usart_putchar(USART_SERIAL, handshake); timer_reset_counter(); + eeprom_write_upgrade_started(); state = DATA; break; @@ -193,6 +195,7 @@ void eeprom_write_upgrade( void ) void eeprom_write_ready( void ) { eeprom_write_byte(EEPROM_ADDR_FWUPGRADE, EEPROM_FWREADY_VALUE); + _delay_ms(40); } bool eeprom_read_upgrade( void ) @@ -209,3 +212,13 @@ bool read_compare_checksum(void) usart_serial_getchar(USART_SERIAL, &chr); return (chr == checksum); } + +void eeprom_write_upgrade_started( void ) +{ + eeprom_write_byte(EEPROM_ADDR_FWUPGRADE, EEPROM_FWUPGRADE_STARTED); +} + +bool eeprom_is_pending( void ) +{ + return eeprom_read_byte(EEPROM_ADDR_FWUPGRADE) == EEPROM_FWUPGRADE_STARTED; +} diff --git a/Fred_bootloader/src/bootloader.h b/Fred_bootloader/src/bootloader.h index e67b4812b75ae99aef8bd711de9b29b8c56309e8..7216982606a7e3e63db2d93fe67e7649746f3483 100644 --- a/Fred_bootloader/src/bootloader.h +++ b/Fred_bootloader/src/bootloader.h @@ -13,6 +13,7 @@ #include <stdint.h> typedef enum {INIT, HANDSHAKE, DATA, FINISH} BootloaderState; +extern BootloaderState state; #define BOOTLDR_ESCAPE 0x01 #define BOOTLDR_HANDSHAKE 0x02 @@ -29,13 +30,16 @@ typedef enum {INIT, HANDSHAKE, DATA, FINISH} BootloaderState; #define EEPROM_ADDR_FWUPGRADE (uint8_t *) 63 #define EEPROM_FWUPGRADE_VALUE (uint8_t) 0x56 -#define EEPROM_FWREADY_VALUE (uint8_t) 0x55 +#define EEPROM_FWREADY_VALUE (uint8_t) 0x55 +#define EEPROM_FWUPGRADE_STARTED (uint8_t) 0x44 void start_bootloader(void); void start_firmware(void); void eeprom_write_upgrade(void); +void eeprom_write_upgrade_started(void); void eeprom_write_ready(void); bool eeprom_read_upgrade(void); +bool eeprom_is_pending(void); void checksum_add_byte(uint8_t byte); bool read_compare_checksum(void); diff --git a/Fred_bootloader/src/timer_lib.c b/Fred_bootloader/src/timer_lib.c index 6f623ae161321f276a3158e1fdde9eb8ce0c0c2d..7c899a68196125a1520944d52da2a39e528cdcd4 100644 --- a/Fred_bootloader/src/timer_lib.c +++ b/Fred_bootloader/src/timer_lib.c @@ -29,6 +29,7 @@ #include "timer_lib.h" #include "usart_lib.h" +#include "bootloader.h" #define PERIOD_10MS 1250 #define PERIOD_100MS 12500 @@ -54,11 +55,15 @@ static void tc_overflow_callback(void) //100 ms ioport_toggle_pin(MMC_LED); sec_counter = 0; } - //RESET after 20 s of inactivity - if (idle_counter == 200) + //RESET after 10 s of inactivity + if (idle_counter == INACTIVITY_BEFORE_RESET_S*10) { - //printString("Reset"); //reset processor + if (state == INIT || state == HANDSHAKE) + { + if (!eeprom_is_pending()) + eeprom_write_ready(); + } ccp_write_io((void *)&RST.CTRL, RST_SWRST_bm); } } diff --git a/Fred_bootloader/src/timer_lib.h b/Fred_bootloader/src/timer_lib.h index a097601e20c21dac5540f9c6996f01e793d88c7b..876987e52168b830ab70cb1509e76956dc686eae 100644 --- a/Fred_bootloader/src/timer_lib.h +++ b/Fred_bootloader/src/timer_lib.h @@ -28,6 +28,8 @@ #ifndef TIMER_LIB_H_ #define TIMER_LIB_H_ +#define INACTIVITY_BEFORE_RESET_S 10 + extern volatile bool timer_100ms_flag; void timer_init(void);