Don't run user application in the bootloader unless a valid app is present (thanks...
authorDean Camera <dean@fourwalledcubicle.com>
Sat, 11 Oct 2014 04:15:02 +0000 (15:15 +1100)
committerDean Camera <dean@fourwalledcubicle.com>
Sat, 11 Oct 2014 04:15:02 +0000 (15:15 +1100)
Bootloaders/CDC/BootloaderCDC.c
Bootloaders/DFU/BootloaderDFU.c
Bootloaders/MassStorage/BootloaderMassStorage.c
Bootloaders/Printer/BootloaderPrinter.c
LUFA/DoxygenPages/ChangeLog.txt

index f66a483..c7eeb92 100644 (file)
@@ -91,6 +91,10 @@ void Application_Jump_Check(void)
        if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
          JumpToApplication |= true;
 
+       /* Don't run the user application if the reset vector is blank (no app loaded) */
+       if (pgm_read_word_near(0) == 0xFFFF)
+         JumpToApplication = false;
+
        /* If a request has been made to jump to the user application, honor it */
        if (JumpToApplication)
        {
index 0385bfc..160b9f6 100644 (file)
@@ -127,6 +127,10 @@ void Application_Jump_Check(void)
        if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
          JumpToApplication |= true;
 
+       /* Don't run the user application if the reset vector is blank (no app loaded) */
+
+         JumpToApplication = false;
+
        /* If a request has been made to jump to the user application, honor it */
        if (JumpToApplication)
        {
@@ -751,8 +755,9 @@ static void ProcessWriteCommand(void)
                        }
                        else                                                               // Start via jump
                        {
-                               /* Set the flag to terminate the bootloader at next opportunity */
-                               RunBootloader = false;
+                               /* Set the flag to terminate the bootloader at next opportunity if a valid application has been loaded */
+                               if (pgm_read_word_near(0) == 0xFFFF)
+                                 RunBootloader = false;
                        }
                }
        }
index cfe0cdb..191d49e 100644 (file)
@@ -116,13 +116,22 @@ void Application_Jump_Check(void)
 
        /* If the reset source was the bootloader and the key is correct, clear it and jump to the application */
        if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
-       {
-               MagicBootKey      = 0;
-               JumpToApplication = true;
-       }
+         JumpToApplication |= true;
+
+       /* Don't run the user application if the reset vector is blank (no app loaded) */
+       if (pgm_read_word_near(0) == 0xFFFF)
+         JumpToApplication = false;
 
+       /* If a request has been made to jump to the user application, honor it */
        if (JumpToApplication)
        {
+               /* Turn off the watchdog */
+               MCUSR &= ~(1<<WDRF);
+               wdt_disable();
+
+               /* Clear the boot key and jump to the user application */
+               MagicBootKey = 0;
+
                // cppcheck-suppress constStatement
                ((void (*)(void))0x0000)();
        }
index a19cb06..716a23a 100644 (file)
@@ -119,9 +119,49 @@ uint16_t MagicBootKey ATTR_NO_INIT;
  */
 void Application_Jump_Check(void)
 {
+       bool JumpToApplication = false;
+
+       #if (BOARD == BOARD_LEONARDO)
+               /* Enable pull-up on the IO13 pin so we can use it to select the mode */
+               PORTC |=  (1 << 7);
+               Delay_MS(10);
+
+               /* If IO13 is not jumpered to ground, start the user application instead */
+               JumpToApplication |= ((PINC & (1 << 7)) != 0);
+
+               /* Disable pull-up after the check has completed */
+               PORTC &= ~(1 << 7);
+       #elif ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1))
+               /* Disable JTAG debugging */
+               JTAG_DISABLE();
+
+               /* Enable pull-up on the JTAG TCK pin so we can use it to select the mode */
+               PORTF |= (1 << 4);
+               Delay_MS(10);
+
+               /* If the TCK pin is not jumpered to ground, start the user application instead */
+               JumpToApplication |= ((PINF & (1 << 4)) != 0);
+
+               /* Re-enable JTAG debugging */
+               JTAG_ENABLE();
+       #endif
+
        /* If the reset source was the bootloader and the key is correct, clear it and jump to the application */
        if ((MCUSR & (1 << WDRF)) && (MagicBootKey == MAGIC_BOOT_KEY))
+         JumpToApplication |= true;
+
+       /* Don't run the user application if the reset vector is blank (no app loaded) */
+       if (pgm_read_word_near(0) == 0xFFFF)
+         JumpToApplication = false;
+
+       /* If a request has been made to jump to the user application, honor it */
+       if (JumpToApplication)
        {
+               /* Turn off the watchdog */
+               MCUSR &= ~(1<<WDRF);
+               wdt_disable();
+
+               /* Clear the boot key and jump to the user application */
                MagicBootKey = 0;
 
                // cppcheck-suppress constStatement
index 738ee68..57277eb 100644 (file)
   *   - None.
   *
   *  <b>Changed:</b>
-  *   - None.
+  *  - Library Applications:
+  *   - The CDC, DFU, Mass Storage and Printer class bootloaders will no longer run the user application if the application reset
+  *     vector is blank (thanks to Alex Kazik)
+  *   - The Printer class bootloader is now compatible with the original Atmel XPLAIN and Arduino Leonardo boards.
   *
   *  <b>Fixed:</b>
   *   - None.