From 4c3aa5225876d360a013952f60523a52cc035077 Mon Sep 17 00:00:00 2001 From: Zach Eveland Date: Tue, 14 Feb 2012 12:17:30 -0500 Subject: [PATCH] Leonardo now checks whether bootloader should be run after a WDT event. Before the sketch initiates an auto-reset for upload it pokes a magic word into a specific RAM address. On starting the bootloader checks this address. If it finds the magic word it knows the bootloader code should run. If not it jumps straight back to sketch. Test in a sketch by adding to setup(): wdt_enable(WDTO_2S); Sketch should upload, start, run for two seconds, WDT, and sketch should restart (not bootloader). Had to cut out unused descriptor code to make the bootloader still fit in 4k. --- .../bootloaders/caterina_LUFA/Caterina.c | 8 + .../bootloaders/caterina_LUFA/Caterina.h | 2 +- .../bootloaders/caterina_LUFA/Caterina.hex | 364 +++++++++--------- .../bootloaders/caterina_LUFA/Descriptors.c | 12 +- hardware/arduino/cores/arduino/CDC.cpp | 3 +- 5 files changed, 200 insertions(+), 189 deletions(-) diff --git a/hardware/arduino/bootloaders/caterina_LUFA/Caterina.c b/hardware/arduino/bootloaders/caterina_LUFA/Caterina.c index b6fbd9b14..d4dbb7b33 100755 --- a/hardware/arduino/bootloaders/caterina_LUFA/Caterina.c +++ b/hardware/arduino/bootloaders/caterina_LUFA/Caterina.c @@ -64,6 +64,9 @@ uint16_t RxLEDPulse = 0; // time remaining for Rx LED pulse /* Bootloader timeout timer */ uint16_t Timeout = 0; +uint16_t bootKey = 0x7777; +volatile uint16_t *const bootKeyPtr = (volatile uint16_t *)0x0A00; + void StartSketch(void) { cli(); @@ -118,6 +121,11 @@ int main(void) if (mcusr_state & (1<