summaryrefslogtreecommitdiffstats
path: root/tmk_core/common/avr/bootloader.c
diff options
context:
space:
mode:
authorNathan Sharfi <me@ngalt.com>2016-07-31 14:02:25 -0700
committerNathan Sharfi <me@ngalt.com>2016-07-31 14:02:25 -0700
commitd889648d5373b7ff77dc7bc4b369c628e8336b45 (patch)
tree35c6eb194417242958baf54b36f0ff3a56e378f1 /tmk_core/common/avr/bootloader.c
parent6428069eb70f5cc47ac1f3f9acf3daea14fb9097 (diff)
parentb25dbc484d639210c53d8e13f79cf5a77f2faaaa (diff)
Merge branch 'master' of github.com:jackhumbert/qmk_firmware
# Conflicts: # keyboard/ergodox_ez/keymaps/zweihander-osx/keymap.c # keyboard/ergodox_ez/keymaps/zweihander-osx/zweihander-osx.hex
Diffstat (limited to 'tmk_core/common/avr/bootloader.c')
-rw-r--r--tmk_core/common/avr/bootloader.c54
1 files changed, 37 insertions, 17 deletions
diff --git a/tmk_core/common/avr/bootloader.c b/tmk_core/common/avr/bootloader.c
index 7c744e8c79..fb9bf2d1c3 100644
--- a/tmk_core/common/avr/bootloader.c
+++ b/tmk_core/common/avr/bootloader.c
@@ -73,26 +73,46 @@ uint32_t reset_key __attribute__ ((section (".noinit")));
/* initialize MCU status by watchdog reset */
void bootloader_jump(void) {
-#ifdef PROTOCOL_LUFA
- USB_Disable();
- cli();
- _delay_ms(2000);
-#endif
+ #ifndef CATERINA_BOOTLOADER
-#ifdef PROTOCOL_PJRC
- cli();
- UDCON = 1;
- USBCON = (1<<FRZCLK);
- UCSR1B = 0;
- _delay_ms(5);
-#endif
+ #ifdef PROTOCOL_LUFA
+ USB_Disable();
+ cli();
+ _delay_ms(2000);
+ #endif
- // watchdog reset
- reset_key = BOOTLOADER_RESET_KEY;
- wdt_enable(WDTO_250MS);
- for (;;);
-}
+ #ifdef PROTOCOL_PJRC
+ cli();
+ UDCON = 1;
+ USBCON = (1<<FRZCLK);
+ UCSR1B = 0;
+ _delay_ms(5);
+ #endif
+
+ // watchdog reset
+ reset_key = BOOTLOADER_RESET_KEY;
+ wdt_enable(WDTO_250MS);
+ for (;;);
+
+ #else
+ // this block may be optional
+ // TODO: figure it out
+
+ uint16_t *const bootKeyPtr = (uint16_t *)0x0800;
+ // Value used by Caterina bootloader use to determine whether to run the
+ // sketch or the bootloader programmer.
+ uint16_t bootKey = 0x7777;
+
+ *bootKeyPtr = bootKey;
+
+ // setup watchdog timeout
+ wdt_enable(WDTO_60MS);
+
+ while(1) {} // wait for watchdog timer to trigger
+
+ #endif
+}
/* this runs before main() */
void bootloader_jump_after_watchdog_reset(void) __attribute__ ((used, naked, section (".init3")));