1 #include "bootloader.h"
2 #include "dev/watchdog.h"
3 #include <util/delay.h>
5 #include <avr/interrupt.h>
6 #include <avr/pgmspace.h>
8 #include <avr/pgmspace.h>
9 #include <avr/interrupt.h>
10 #include <avr/eeprom.h>
13 #if !defined (MCUSR) && defined (MCUCSR)
14 #warning *** MCUSR not defined, using MCUCSR instead ***
18 #ifndef EEPROM_MAGIC_BYTE_ADDR
19 #define EEPROM_MAGIC_BYTE_ADDR (uint8_t*)(E2END-3)
22 volatile uint32_t Boot_Key ATTR_NO_INIT;
24 extern void Bootloader_Jump_Check(
void) ATTR_INIT_SECTION(3);
27 bootloader_is_present(
void)
29 #if defined(BOOTLOADER_START_ADDRESS)
30 return pgm_read_word_far(BOOTLOADER_START_ADDRESS) != 0xFFFF;
37 Jump_To_Bootloader(
void)
49 for(i = 0; i < 200; i++) {
56 Boot_Key = MAGIC_BOOT_KEY;
58 eeprom_write_byte(EEPROM_MAGIC_BYTE_ADDR, 0xFF);
67 Bootloader_Jump_Check(
void)
72 if(MCUSR & (1 << WDRF)) {
74 if(Boot_Key == MAGIC_BOOT_KEY) {
81 eeprom_write_byte(EEPROM_MAGIC_BYTE_ADDR, 0xFF);
86 ((void (*)(void))(BOOTLOADER_START_ADDRESS)) ();
95 for(i = 0; i < 200; i++) {
101 Boot_Key = MAGIC_BOOT_KEY - 4;