Fix bootloaders not starting user application if the HWB is grounded during watchdog...
authorDean Camera <dean@fourwalledcubicle.com>
Sun, 12 Oct 2014 05:43:30 +0000 (16:43 +1100)
committerDean Camera <dean@fourwalledcubicle.com>
Sun, 12 Oct 2014 05:43:30 +0000 (16:43 +1100)
Bootloaders/CDC/BootloaderCDC.c
Bootloaders/CDC/BootloaderCDC.txt
Bootloaders/DFU/BootloaderDFU.c
Bootloaders/DFU/BootloaderDFU.txt
Bootloaders/HID/BootloaderHID.txt
Bootloaders/MassStorage/BootloaderMassStorage.c
Bootloaders/MassStorage/BootloaderMassStorage.txt
Bootloaders/Printer/BootloaderPrinter.c
Bootloaders/Printer/BootloaderPrinter.txt

index 1f07653..63991de 100644 (file)
@@ -103,8 +103,19 @@ void Application_Jump_Check(void)
                        if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
                          JumpToApplication = true;
 
                        if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
                          JumpToApplication = true;
 
+                       /* Clear reset source */
                        MCUSR &= ~(1 << EXTRF);
                }
                        MCUSR &= ~(1 << EXTRF);
                }
+               else
+               {
+                       /* If the reset source was the bootloader and the key is correct, clear it and jump to the application;
+                        * this can happen in the HWBE fuse is set, and the HBE pin is low during the watchdog reset */
+                       if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
+                               JumpToApplication = true;
+
+                       /* Clear reset source */
+                       MCUSR &= ~(1 << WDRF);
+               }
        #endif
 
        /* Don't run the user application if the reset vector is blank (no app loaded) */
        #endif
 
        /* Don't run the user application if the reset vector is blank (no app loaded) */
index 5f24a16..f8c349c 100644 (file)
@@ -64,9 +64,9 @@
  *
  *  The are two behaviours of this bootloader, depending on the device's fuses:
  *
  *
  *  The are two behaviours of this bootloader, depending on the device's fuses:
  *
- *  <b>If the device's BOOTRST fuse is set</b>, the bootloader will run any time the system is not reset from
+ *  <b>If the device's BOOTRST fuse is set</b>, the bootloader will run any time the system is reset from
  *  the external reset pin, unless no valid user application has been loaded. To initiate the bootloader, the
  *  the external reset pin, unless no valid user application has been loaded. To initiate the bootloader, the
- *  device's external reset pin should be grounded.
+ *  device's external reset pin should be grounded momentarily.
  *
  *  <b>If the device's BOOTRST fuse is not set</b>, the bootloader will run only if initiated via a software
  *  jump, or if the \c HWB pin was low during the last device reset (if the \c HWBE fuse is set).
  *
  *  <b>If the device's BOOTRST fuse is not set</b>, the bootloader will run only if initiated via a software
  *  jump, or if the \c HWB pin was low during the last device reset (if the \c HWBE fuse is set).
  *  Ground \c IO13 when powering the board to start the bootloader. This assumes the \c HWBE fuse is cleared and the
  *  \c BOOTRST fuse is set as the HWBE pin is not user accessible on this board.
  *
  *  Ground \c IO13 when powering the board to start the bootloader. This assumes the \c HWBE fuse is cleared and the
  *  \c BOOTRST fuse is set as the HWBE pin is not user accessible on this board.
  *
- *  For board specific exceptions to the above, see below.
- *
- *  \subsection SSec_XPLAIN Atmel Xplain Board
- *  Ground the USB AVR JTAG's \c TCK pin to ground when powering on the board to start the bootloader. This assumes the
- *  \c HWBE fuse is cleared and the \c BOOTRST fuse is set as the HWBE pin is not user accessible on this board.
- *
- *  \subsection SSec_Leonardo Arduino Leonardo Board
- *  Ground \c IO13 when powering the board to start the bootloader. This assumes the \c HWBE fuse is cleared and the
- *  \c BOOTRST fuse is set as the HWBE pin is not user accessible on this board.
- *
  *  \section Sec_Installation Driver Installation
  *
  *  After running this bootloader for the first time on a new computer, you will need to supply the .INF
  *  \section Sec_Installation Driver Installation
  *
  *  After running this bootloader for the first time on a new computer, you will need to supply the .INF
  *  access.
  *  See <a href=https://groups.google.com/d/msg/lufa-support/CP9cy2bc8yo/kBqsOu-RBeMJ>here</a> for resolution steps.
  *
  *  access.
  *  See <a href=https://groups.google.com/d/msg/lufa-support/CP9cy2bc8yo/kBqsOu-RBeMJ>here</a> for resolution steps.
  *
- *  \par After loading an application, it is not run automatically on startup.
- *  Some USB AVR boards ship with the BOOTRST fuse set, causing the bootloader
- *  to run automatically when the device is reset. In most cases, the BOOTRST
- *  fuse should be disabled and the HWBE fuse used instead to run the bootloader
- *  when needed.
- *
  *  \section Sec_Options Project Options
  *
  *  The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
  *  \section Sec_Options Project Options
  *
  *  The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
index cebc0f4..c735fda 100644 (file)
@@ -139,8 +139,19 @@ void Application_Jump_Check(void)
                        if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
                          JumpToApplication = true;
 
                        if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
                          JumpToApplication = true;
 
+                       /* Clear reset source */
                        MCUSR &= ~(1 << EXTRF);
                }
                        MCUSR &= ~(1 << EXTRF);
                }
+               else
+               {
+                       /* If the reset source was the bootloader and the key is correct, clear it and jump to the application;
+                        * this can happen in the HWBE fuse is set, and the HBE pin is low during the watchdog reset */
+                       if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
+                               JumpToApplication = true;
+
+                       /* Clear reset source */
+                       MCUSR &= ~(1 << WDRF);
+               }
        #endif
 
        /* Don't run the user application if the reset vector is blank (no app loaded) */
        #endif
 
        /* Don't run the user application if the reset vector is blank (no app loaded) */
index d0bb6e1..b2540a5 100644 (file)
@@ -62,9 +62,9 @@
  *
  *  The are two behaviours of this bootloader, depending on the device's fuses:
  *
  *
  *  The are two behaviours of this bootloader, depending on the device's fuses:
  *
- *  <b>If the device's BOOTRST fuse is set</b>, the bootloader will run any time the system is not reset from
+ *  <b>If the device's BOOTRST fuse is set</b>, the bootloader will run any time the system is reset from
  *  the external reset pin, unless no valid user application has been loaded. To initiate the bootloader, the
  *  the external reset pin, unless no valid user application has been loaded. To initiate the bootloader, the
- *  device's external reset pin should be grounded.
+ *  device's external reset pin should be grounded momentarily.
  *
  *  <b>If the device's BOOTRST fuse is not set</b>, the bootloader will run only if initiated via a software
  *  jump, or if the \c HWB pin was low during the last device reset (if the \c HWBE fuse is set).
  *
  *  <b>If the device's BOOTRST fuse is not set</b>, the bootloader will run only if initiated via a software
  *  jump, or if the \c HWB pin was low during the last device reset (if the \c HWBE fuse is set).
  *  access.
  *  See <a href=https://groups.google.com/d/msg/lufa-support/CP9cy2bc8yo/kBqsOu-RBeMJ>here</a> for resolution steps.
  *
  *  access.
  *  See <a href=https://groups.google.com/d/msg/lufa-support/CP9cy2bc8yo/kBqsOu-RBeMJ>here</a> for resolution steps.
  *
- *  \par After loading an application, it is not run automatically on startup.
- *  Some USB AVR boards ship with the BOOTRST fuse set, causing the bootloader
- *  to run automatically when the device is reset. In most cases, the BOOTRST
- *  fuse should be disabled and the HWBE fuse used instead to run the bootloader
- *  when needed.
- *
  *  \section Sec_Options Project Options
  *
  *  The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
  *  \section Sec_Options Project Options
  *
  *  The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
index 63c1505..e340703 100644 (file)
@@ -61,9 +61,9 @@
  *
  *  \section Sec_Running Running the Bootloader
  *
  *
  *  \section Sec_Running Running the Bootloader
  *
- *  This bootloader is designed to be started via the HWB mechanism of the USB AVRs; ground the HWB pin (see device
- *  datasheet) then momentarily ground /RESET to start the bootloader. This assumes the HWBE fuse is set and the BOOTRST
- *  fuse is cleared.
+ *  This bootloader is designed to be started via the \c HWB mechanism of the USB AVRs; ground the \c HWB pin (see device
+ *  datasheet) then momentarily ground \c /RESET to start the bootloader. This assumes the \c HWBE fuse is set and the
+ *  \c BOOTRST fuse is cleared.
  *
  *  \section Sec_Installation Driver Installation
  *
  *
  *  \section Sec_Installation Driver Installation
  *
@@ -73,7 +73,7 @@
  *  \section Sec_HostApp Host Controller Application
  *
  *  Due to licensing issues, the supplied bootloader is compatible with the HalfKay bootloader protocol designed
  *  \section Sec_HostApp Host Controller Application
  *
  *  Due to licensing issues, the supplied bootloader is compatible with the HalfKay bootloader protocol designed
- *  by PJRC, but is non-compatible with the cross-platform loader GUI. A modified version of the open source
+ *  by PJRC, but is <b>not compatible with the cross-platform loader GUI</b>. A modified version of the open source
  *  cross-platform TeensyLoader application is supplied, which can be compiled under most operating systems. The
  *  command-line loader application should remain compatible with genuine Teensy boards in addition to boards using
  *  this custom bootloader.
  *  cross-platform TeensyLoader application is supplied, which can be compiled under most operating systems. The
  *  command-line loader application should remain compatible with genuine Teensy boards in addition to boards using
  *  this custom bootloader.
@@ -86,9 +86,9 @@
  *  \section Sec_KnownIssues Known Issues:
  *
  *  \par After loading an application, it is not run automatically on startup.
  *  \section Sec_KnownIssues Known Issues:
  *
  *  \par After loading an application, it is not run automatically on startup.
- *  Some USB AVR boards ship with the BOOTRST fuse set, causing the bootloader
- *  to run automatically when the device is reset. In most cases, the BOOTRST
- *  fuse should be disabled and the HWBE fuse used instead to run the bootloader
+ *  Some USB AVR boards ship with the \c BOOTRST fuse set, causing the bootloader
+ *  to run automatically when the device is reset. This booloader requires the
+ *  \c BOOTRST be disabled and the HWBE fuse used instead to run the bootloader
  *  when needed.
  *
  *  \section SSec_Options Project Options
  *  when needed.
  *
  *  \section SSec_Options Project Options
index afbc250..2765e2c 100644 (file)
@@ -120,8 +120,19 @@ void Application_Jump_Check(void)
                        if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
                          JumpToApplication = true;
 
                        if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
                          JumpToApplication = true;
 
+                       /* Clear reset source */
                        MCUSR &= ~(1 << EXTRF);
                }
                        MCUSR &= ~(1 << EXTRF);
                }
+               else
+               {
+                       /* If the reset source was the bootloader and the key is correct, clear it and jump to the application;
+                        * this can happen in the HWBE fuse is set, and the HBE pin is low during the watchdog reset */
+                       if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
+                               JumpToApplication = true;
+
+                       /* Clear reset source */
+                       MCUSR &= ~(1 << WDRF);
+               }
        #endif
 
        /* Don't run the user application if the reset vector is blank (no app loaded) */
        #endif
 
        /* Don't run the user application if the reset vector is blank (no app loaded) */
index 467972c..190ff4a 100644 (file)
@@ -67,9 +67,9 @@
  *
  *  The are two behaviours of this bootloader, depending on the device's fuses:
  *
  *
  *  The are two behaviours of this bootloader, depending on the device's fuses:
  *
- *  <b>If the device's BOOTRST fuse is set</b>, the bootloader will run any time the system is not reset from
+ *  <b>If the device's BOOTRST fuse is set</b>, the bootloader will run any time the system is reset from
  *  the external reset pin, unless no valid user application has been loaded. To initiate the bootloader, the
  *  the external reset pin, unless no valid user application has been loaded. To initiate the bootloader, the
- *  device's external reset pin should be grounded.
+ *  device's external reset pin should be grounded momentarily.
  *
  *  <b>If the device's BOOTRST fuse is not set</b>, the bootloader will run only if initiated via a software
  *  jump, or if the \c HWB pin was low during the last device reset (if the \c HWBE fuse is set).
  *
  *  <b>If the device's BOOTRST fuse is not set</b>, the bootloader will run only if initiated via a software
  *  jump, or if the \c HWB pin was low during the last device reset (if the \c HWBE fuse is set).
  *  Mass Storage bootloader, or the file system synced via an appropriate command
  *  (such as the OS's normal disk ejection command) before disconnecting the device.
  *
  *  Mass Storage bootloader, or the file system synced via an appropriate command
  *  (such as the OS's normal disk ejection command) before disconnecting the device.
  *
- *  \par After loading an application, it is not run automatically on startup.
- *  Some USB AVR boards ship with the BOOTRST fuse set, causing the bootloader
- *  to run automatically when the device is reset. In most cases, the BOOTRST
- *  fuse should be disabled and the HWBE fuse used instead to run the bootloader
- *  when needed.
- *
  *  \section Sec_Options Project Options
  *
  *  The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
  *  \section Sec_Options Project Options
  *
  *  The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
index 151d16f..0add1b7 100644 (file)
@@ -152,8 +152,19 @@ void Application_Jump_Check(void)
                        if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
                          JumpToApplication = true;
 
                        if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
                          JumpToApplication = true;
 
+                       /* Clear reset source */
                        MCUSR &= ~(1 << EXTRF);
                }
                        MCUSR &= ~(1 << EXTRF);
                }
+               else
+               {
+                       /* If the reset source was the bootloader and the key is correct, clear it and jump to the application;
+                        * this can happen in the HWBE fuse is set, and the HBE pin is low during the watchdog reset */
+                       if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
+                               JumpToApplication = true;
+
+                       /* Clear reset source */
+                       MCUSR &= ~(1 << WDRF);
+               }
        #endif
 
        /* Don't run the user application if the reset vector is blank (no app loaded) */
        #endif
 
        /* Don't run the user application if the reset vector is blank (no app loaded) */
index 99dc7d5..d9aa796 100644 (file)
@@ -61,9 +61,9 @@
  *
  *  The are two behaviours of this bootloader, depending on the device's fuses:
  *
  *
  *  The are two behaviours of this bootloader, depending on the device's fuses:
  *
- *  <b>If the device's BOOTRST fuse is set</b>, the bootloader will run any time the system is not reset from
+ *  <b>If the device's BOOTRST fuse is set</b>, the bootloader will run any time the system is reset from
  *  the external reset pin, unless no valid user application has been loaded. To initiate the bootloader, the
  *  the external reset pin, unless no valid user application has been loaded. To initiate the bootloader, the
- *  device's external reset pin should be grounded.
+ *  device's external reset pin should be grounded momentarily.
  *
  *  <b>If the device's BOOTRST fuse is not set</b>, the bootloader will run only if initiated via a software
  *  jump, or if the \c HWB pin was low during the last device reset (if the \c HWBE fuse is set).
  *
  *  <b>If the device's BOOTRST fuse is not set</b>, the bootloader will run only if initiated via a software
  *  jump, or if the \c HWB pin was low during the last device reset (if the \c HWBE fuse is set).
  *  are unable to handle true plain-text printing. For best results, the low
  *  level \c lpr command should be used to print new firmware to the bootloader.
  *
  *  are unable to handle true plain-text printing. For best results, the low
  *  level \c lpr command should be used to print new firmware to the bootloader.
  *
- *  \par After loading an application, it is not run automatically on startup.
- *  Some USB AVR boards ship with the BOOTRST fuse set, causing the bootloader
- *  to run automatically when the device is reset. In most cases, the BOOTRST
- *  fuse should be disabled and the HWBE fuse used instead to run the bootloader
- *  when needed.
- *
  *  \section Sec_Options Project Options
  *
  *  The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.
  *  \section Sec_Options Project Options
  *
  *  The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value.