From 3c72896e84f54dab6d604518a355b37ea318df21 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Thu, 5 Aug 2010 09:31:51 +0000
Subject: [PATCH] Fixed software application start command broken in the DFU
 class bootloader when dfu-programmer is used due to application start address
 corruption.

---
 Bootloaders/CDC/makefile        |  1 +
 Bootloaders/DFU/BootloaderDFU.c | 26 +++++++++++++++-----------
 Bootloaders/DFU/makefile        |  1 +
 LUFA/ManPages/ChangeLog.txt     |  2 ++
 4 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/Bootloaders/CDC/makefile b/Bootloaders/CDC/makefile
index 2df18289e..346912c64 100644
--- a/Bootloaders/CDC/makefile
+++ b/Bootloaders/CDC/makefile
@@ -121,6 +121,7 @@ LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENAB
 LUFA_OPTS += -D NO_INTERNAL_SERIAL
 LUFA_OPTS += -D NO_DEVICE_SELF_POWER
 LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP
+LUFA_OPTS += -D NO_STREAM_CALLBACKS
 
 
 # Create the LUFA source path variables by including the LUFA root makefile
diff --git a/Bootloaders/DFU/BootloaderDFU.c b/Bootloaders/DFU/BootloaderDFU.c
index 752c32009..7136b972b 100644
--- a/Bootloaders/DFU/BootloaderDFU.c
+++ b/Bootloaders/DFU/BootloaderDFU.c
@@ -634,26 +634,30 @@ static void ProcessWriteCommand(void)
 		/* Indicate that the bootloader is terminating */
 		WaitForExit = true;
 
-		/* Check if empty request data array - an empty request after a filled request retains the
-		   previous valid request data, but initializes the reset */
-		if (!(SentCommand.DataSize))
+		/* Check if data supplied for the Start Program command - no data executes the program */
+		if (SentCommand.DataSize)
 		{
-			if (SentCommand.Data[1] == 0x00)                                   // Start via watchdog
-			{
-				/* Start the watchdog to reset the AVR once the communications are finalized */
-				wdt_enable(WDTO_250MS);
-			}
-			else                                                               // Start via jump
+			if (SentCommand.Data[1] == 0x01)                                   // Start via jump
 			{
-				/* Load in the jump address into the application start address pointer */
 				union
 				{
 					uint8_t  Bytes[2];
 					AppPtr_t FuncPtr;
 				} Address = {.Bytes = {SentCommand.Data[4], SentCommand.Data[3]}};
 
+				/* Load in the jump address into the application start address pointer */
 				AppStartPtr = Address.FuncPtr;
-				
+			}
+		}
+		else
+		{
+			if (SentCommand.Data[1] == 0x00)                                   // Start via watchdog
+			{
+				/* Start the watchdog to reset the AVR once the communications are finalized */
+				wdt_enable(WDTO_250MS);
+			}
+			else                                                               // Start via jump
+			{
 				/* Set the flag to terminate the bootloader at next opportunity */
 				RunBootloader = false;
 			}
diff --git a/Bootloaders/DFU/makefile b/Bootloaders/DFU/makefile
index 2cfff0fbe..deb53125f 100644
--- a/Bootloaders/DFU/makefile
+++ b/Bootloaders/DFU/makefile
@@ -122,6 +122,7 @@ LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENAB
 LUFA_OPTS += -D NO_INTERNAL_SERIAL
 LUFA_OPTS += -D NO_DEVICE_SELF_POWER
 LUFA_OPTS += -D NO_DEVICE_REMOTE_WAKEUP
+LUFA_OPTS += -D NO_STREAM_CALLBACKS
 
 
 # Create the LUFA source path variables by including the LUFA root makefile
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 5a21f5140..02d4200d7 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -67,6 +67,8 @@
   *    operation to occur (thanks to Bob Paddock)
   *  - Fixed Serial peripheral driver not turning off the USART before reconfiguring it, which would cause incorrect operation
   *    to occur (thanks to Bob Paddock)
+  *  - Fixed software application start command broken in the DFU class bootloader when dfu-programmer is used due to application
+  *    start address corruption
   *
   *  \section Sec_ChangeLog100513 Version 100513
   *  <b>New:</b>
-- 
GitLab