aboutsummaryrefslogtreecommitdiffstats
path: root/Bootloaders
diff options
context:
space:
mode:
authorDean Camera <dean@fourwalledcubicle.com>2014-10-12 16:43:30 +1100
committerDean Camera <dean@fourwalledcubicle.com>2014-10-12 16:43:30 +1100
commita09cb7e3d8d6256f5610459ee8dd80e0efd741f7 (patch)
treefd87b7ee781ca797d3ce26085c5e05ad4f7c38da /Bootloaders
parent4c637c93ba69e33c77034eef9bd4433252e139fc (diff)
downloadlufa-a09cb7e3d8d6256f5610459ee8dd80e0efd741f7.tar.gz
lufa-a09cb7e3d8d6256f5610459ee8dd80e0efd741f7.tar.bz2
lufa-a09cb7e3d8d6256f5610459ee8dd80e0efd741f7.zip
Fix bootloaders not starting user application if the HWB is grounded during watchdog reset.
Diffstat (limited to 'Bootloaders')
-rw-r--r--Bootloaders/CDC/BootloaderCDC.c11
-rw-r--r--Bootloaders/CDC/BootloaderCDC.txt20
-rw-r--r--Bootloaders/DFU/BootloaderDFU.c11
-rw-r--r--Bootloaders/DFU/BootloaderDFU.txt10
-rw-r--r--Bootloaders/HID/BootloaderHID.txt14
-rw-r--r--Bootloaders/MassStorage/BootloaderMassStorage.c11
-rw-r--r--Bootloaders/MassStorage/BootloaderMassStorage.txt10
-rw-r--r--Bootloaders/Printer/BootloaderPrinter.c11
-rw-r--r--Bootloaders/Printer/BootloaderPrinter.txt10
9 files changed, 59 insertions, 49 deletions
diff --git a/Bootloaders/CDC/BootloaderCDC.c b/Bootloaders/CDC/BootloaderCDC.c
index 1f076530d..63991de75 100644
--- a/Bootloaders/CDC/BootloaderCDC.c
+++ b/Bootloaders/CDC/BootloaderCDC.c
@@ -103,8 +103,19 @@ void Application_Jump_Check(void)
if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
JumpToApplication = true;
+ /* Clear reset source */
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) */
diff --git a/Bootloaders/CDC/BootloaderCDC.txt b/Bootloaders/CDC/BootloaderCDC.txt
index 5f24a16e5..f8c349cde 100644
--- a/Bootloaders/CDC/BootloaderCDC.txt
+++ b/Bootloaders/CDC/BootloaderCDC.txt
@@ -64,9 +64,9 @@
*
* 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
- * 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).
@@ -81,16 +81,6 @@
* 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
@@ -214,12 +204,6 @@
* 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.
diff --git a/Bootloaders/DFU/BootloaderDFU.c b/Bootloaders/DFU/BootloaderDFU.c
index cebc0f433..c735fdaf8 100644
--- a/Bootloaders/DFU/BootloaderDFU.c
+++ b/Bootloaders/DFU/BootloaderDFU.c
@@ -139,8 +139,19 @@ void Application_Jump_Check(void)
if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
JumpToApplication = true;
+ /* Clear reset source */
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) */
diff --git a/Bootloaders/DFU/BootloaderDFU.txt b/Bootloaders/DFU/BootloaderDFU.txt
index d0bb6e120..b2540a5b6 100644
--- a/Bootloaders/DFU/BootloaderDFU.txt
+++ b/Bootloaders/DFU/BootloaderDFU.txt
@@ -62,9 +62,9 @@
*
* 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
- * 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).
@@ -213,12 +213,6 @@
* 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.
diff --git a/Bootloaders/HID/BootloaderHID.txt b/Bootloaders/HID/BootloaderHID.txt
index 63c1505cc..e340703c4 100644
--- a/Bootloaders/HID/BootloaderHID.txt
+++ b/Bootloaders/HID/BootloaderHID.txt
@@ -61,9 +61,9 @@
*
* \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
*
@@ -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
- * 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.
@@ -86,9 +86,9 @@
* \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
diff --git a/Bootloaders/MassStorage/BootloaderMassStorage.c b/Bootloaders/MassStorage/BootloaderMassStorage.c
index afbc25014..2765e2c20 100644
--- a/Bootloaders/MassStorage/BootloaderMassStorage.c
+++ b/Bootloaders/MassStorage/BootloaderMassStorage.c
@@ -120,8 +120,19 @@ void Application_Jump_Check(void)
if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
JumpToApplication = true;
+ /* Clear reset source */
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) */
diff --git a/Bootloaders/MassStorage/BootloaderMassStorage.txt b/Bootloaders/MassStorage/BootloaderMassStorage.txt
index 467972cc4..190ff4a3e 100644
--- a/Bootloaders/MassStorage/BootloaderMassStorage.txt
+++ b/Bootloaders/MassStorage/BootloaderMassStorage.txt
@@ -67,9 +67,9 @@
*
* 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
- * 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).
@@ -206,12 +206,6 @@
* 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.
diff --git a/Bootloaders/Printer/BootloaderPrinter.c b/Bootloaders/Printer/BootloaderPrinter.c
index 151d16f92..0add1b724 100644
--- a/Bootloaders/Printer/BootloaderPrinter.c
+++ b/Bootloaders/Printer/BootloaderPrinter.c
@@ -152,8 +152,19 @@ void Application_Jump_Check(void)
if (!(MCUSR & (1 << EXTRF)) || (MagicBootKey == MAGIC_BOOT_KEY))
JumpToApplication = true;
+ /* Clear reset source */
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) */
diff --git a/Bootloaders/Printer/BootloaderPrinter.txt b/Bootloaders/Printer/BootloaderPrinter.txt
index 99dc7d528..d9aa79686 100644
--- a/Bootloaders/Printer/BootloaderPrinter.txt
+++ b/Bootloaders/Printer/BootloaderPrinter.txt
@@ -61,9 +61,9 @@
*
* 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
- * 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).
@@ -187,12 +187,6 @@
* 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.