changed auto-reset logic for Leonardo. only do WDT manipulation if the port is opened at 1200 bps. (Dave Mellis)

This commit is contained in:
Zach Eveland 2012-03-01 08:51:16 -05:00
parent f505a3da4c
commit 93a47f884d
1 changed files with 16 additions and 15 deletions

View File

@ -106,21 +106,22 @@ bool WEAK CDC_Setup(Setup& setup)
// 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
// We check DTR state to determine if host port is open (bit 0 of lineState).
// Serial1.print(">"); Serial1.println(_usbLineInfo.lineState, HEX);
if ((_usbLineInfo.lineState & 0x01) == 0 && _usbLineInfo.dwDTERate == 1200) {
*(uint16_t *)0x0A00 = 0x7777;
wdt_enable(WDTO_250MS);
} else {
// Most OSs do some intermediate steps when configuring ports and DTR can
// twiggle more than once before stabilizing.
// To avoid spurious resets we set the watchdog to 250ms and eventually
// cancel if DTR goes back high.
wdt_disable();
wdt_reset();
*(uint16_t *)0x0A00 = 0x0;
if (1200 == _usbLineInfo.dwDTERate) {
// We check DTR state to determine if host port is open (bit 0 of lineState).
// Serial1.print(">"); Serial1.println(_usbLineInfo.lineState, HEX);
if ((_usbLineInfo.lineState & 0x01) == 0) {
*(uint16_t *)0x0A00 = 0x7777;
wdt_enable(WDTO_250MS);
} else {
// Most OSs do some intermediate steps when configuring ports and DTR can
// twiggle more than once before stabilizing.
// To avoid spurious resets we set the watchdog to 250ms and eventually
// cancel if DTR goes back high.
wdt_disable();
wdt_reset();
*(uint16_t *)0x0A00 = 0x0;
}
}
return true;
}