aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--boards.txt3
-rw-r--r--cores/arduino/CDC.cpp23
2 files changed, 9 insertions, 17 deletions
diff --git a/boards.txt b/boards.txt
index 89035e6..7d25ab8 100644
--- a/boards.txt
+++ b/boards.txt
@@ -149,7 +149,8 @@ mega.build.variant=mega
leonardo.name=Arduino Leonardo
leonardo.upload.protocol=avr109
leonardo.upload.maximum_size=28672
-leonardo.upload.speed=1200
+leonardo.upload.speed=57600
+leonardo.upload.disable_flushing=true
leonardo.bootloader.low_fuses=0xde
leonardo.bootloader.high_fuses=0xd8
leonardo.bootloader.extended_fuses=0xcb
diff --git a/cores/arduino/CDC.cpp b/cores/arduino/CDC.cpp
index 6dd1cbe..deda5c0 100644
--- a/cores/arduino/CDC.cpp
+++ b/cores/arduino/CDC.cpp
@@ -23,20 +23,6 @@
#if defined(USBCON)
#ifdef CDC_ENABLED
-void Reboot()
-{
- USB.detach();
- cli();
-
- // Reset the microcontroller to run the bootloader
- wdt_enable(WDTO_15MS);
- for (;;);
-}
-
-// Define constants and variables for buffering incoming serial data. We're
-// using a ring buffer (I think), in which head is the index of the location
-// to which to write the next incoming character and tail is the index of the
-// location from which to read.
#if (RAMEND < 1000)
#define SERIAL_BUFFER_SIZE 16
#else
@@ -114,9 +100,14 @@ bool WEAK CDC_Setup(Setup& setup)
if (CDC_SET_CONTROL_LINE_STATE == r)
{
- if (0 != _usbLineInfo.lineState && 1200 == _usbLineInfo.dwDTERate) // auto-reset is triggered when the port, already open at 1200 bps, is closed
- Reboot();
_usbLineInfo.lineState = setup.wValueL;
+ // auto-reset into the bootloader is triggered when the port, already
+ // open at 1200 bps, is closed. this is the signal to start the watchdog
+ // with a relatively long period so it can finish housekeeping tasks
+ // like servicing endpoints before the sketch ends
+ if (0 != _usbLineInfo.lineState && 1200 == _usbLineInfo.dwDTERate) {
+ wdt_enable(WDTO_2S);
+ }
return true;
}
}