From c8b72f955f1fd17dbc90254b56e6596ba70660cd Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Mon, 7 Sep 2009 07:57:00 +0000
Subject: [PATCH] Corrected incorrect signature bytes for the AT90USB82 and
 added support for the ATMEGAXX2 variant AVRs to the DFU bootloader.

Added warning to the EVENT_USB_Device_Connect() and EVENT_USB_Device_Disconnect() events that they may be fired multiple times during device enumeration on the series 2 AVRs.
---
 Bootloaders/DFU/BootloaderDFU.c     |  1 +
 Bootloaders/DFU/Descriptors.h       | 40 ++++++++++++++++++-----------
 LUFA/Drivers/USB/HighLevel/Events.h | 10 ++++++--
 LUFA/ManPages/ChangeLog.txt         |  3 ++-
 4 files changed, 36 insertions(+), 18 deletions(-)

diff --git a/Bootloaders/DFU/BootloaderDFU.c b/Bootloaders/DFU/BootloaderDFU.c
index d7af1e6ca..71b37ea68 100644
--- a/Bootloaders/DFU/BootloaderDFU.c
+++ b/Bootloaders/DFU/BootloaderDFU.c
@@ -92,6 +92,7 @@ uint16_t StartAddr = 0x0000;
  */
 uint16_t EndAddr = 0x0000;
 
+
 /** Main program entry point. This routine configures the hardware required by the bootloader, then continuously 
  *  runs the bootloader processing routine until instructed to soft-exit, or hard-reset via the watchdog to start
  *  the loaded application code.
diff --git a/Bootloaders/DFU/Descriptors.h b/Bootloaders/DFU/Descriptors.h
index 0943ef32b..9eadf9d4e 100644
--- a/Bootloaders/DFU/Descriptors.h
+++ b/Bootloaders/DFU/Descriptors.h
@@ -78,26 +78,16 @@
 			#define AVR_SIGNATURE_1               0x1E
 			#define AVR_SIGNATURE_2               0x96
 			#define AVR_SIGNATURE_3               0x82
-		#elif defined(__AVR_AT90USB647__)
-			#define PRODUCT_ID_CODE               0x2FF9
-			#define AVR_SIGNATURE_1               0x1E
-			#define AVR_SIGNATURE_2               0x96
-			#define AVR_SIGNATURE_3               0x82
-		#elif defined(__AVR_AT90USB162__)
-			#define PRODUCT_ID_CODE               0x2FFA
-			#define AVR_SIGNATURE_1               0x1E
-			#define AVR_SIGNATURE_2               0x94
-			#define AVR_SIGNATURE_3               0x82
-		#elif defined(__AVR_AT90USB82__)
-			#define PRODUCT_ID_CODE               0x2FF7
-			#define AVR_SIGNATURE_1               0x1E
-			#define AVR_SIGNATURE_2               0x94
-			#define AVR_SIGNATURE_3               0x82
 		#elif defined(__AVR_ATmega32U6__)
 			#define PRODUCT_ID_CODE               0x2FFB
 			#define AVR_SIGNATURE_1               0x1E
 			#define AVR_SIGNATURE_2               0x95
 			#define AVR_SIGNATURE_3               0x88
+		#elif defined(__AVR_AT90USB647__)
+			#define PRODUCT_ID_CODE               0x2FF9
+			#define AVR_SIGNATURE_1               0x1E
+			#define AVR_SIGNATURE_2               0x96
+			#define AVR_SIGNATURE_3               0x82
 		#elif defined(__AVR_ATmega32U4__)
 			#define PRODUCT_ID_CODE               0x2FF4
 			#define AVR_SIGNATURE_1               0x1E
@@ -108,6 +98,26 @@
 			#define AVR_SIGNATURE_1               0x1E
 			#define AVR_SIGNATURE_2               0x94
 			#define AVR_SIGNATURE_3               0x88
+		#elif defined(__AVR_AT90USB162__)
+			#define PRODUCT_ID_CODE               0x2FFA
+			#define AVR_SIGNATURE_1               0x1E
+			#define AVR_SIGNATURE_2               0x94
+			#define AVR_SIGNATURE_3               0x82
+		#elif defined(__AVR_ATmega8U2__)
+			#define PRODUCT_ID_CODE               0x2FF7
+			#define AVR_SIGNATURE_1               0x1E
+			#define AVR_SIGNATURE_2               0x93
+			#define AVR_SIGNATURE_3               0x82
+		#elif defined(__AVR_ATmega16U2__)
+			#define PRODUCT_ID_CODE               0x2FEF
+			#define AVR_SIGNATURE_1               0x1E
+			#define AVR_SIGNATURE_2               0x94
+			#define AVR_SIGNATURE_3               0x89
+		#elif defined(__AVR_AT90USB82__)
+			#define PRODUCT_ID_CODE               0x2FEE
+			#define AVR_SIGNATURE_1               0x1E
+			#define AVR_SIGNATURE_2               0x93
+			#define AVR_SIGNATURE_3               0x89
 		#else
 			#error The selected AVR part is not currently supported by this bootloader.
 		#endif
diff --git a/LUFA/Drivers/USB/HighLevel/Events.h b/LUFA/Drivers/USB/HighLevel/Events.h
index 9b60a957b..5a007ff2a 100644
--- a/LUFA/Drivers/USB/HighLevel/Events.h
+++ b/LUFA/Drivers/USB/HighLevel/Events.h
@@ -148,13 +148,16 @@
 			/** Event for USB device connection. This event fires when the AVR in device mode and the device is connected
 			 *  to a host, beginning the enumeration process, measured by a rising level on the AVR's VBUS pin.
 			 *
-			 *  \note For the smaller USB AVRs (AT90USBXX2) with limited USB controllers, VBUS is not available to the USB controller.
+			 *  \note For the smaller series 2 USB AVRs with limited USB controllers, VBUS is not available to the USB controller.
 			 *        this means that the current connection state is derived from the bus suspension and wake up events by default,
 			 *        which is not always accurate (host may suspend the bus while still connected). If the actual connection state
 			 *        needs to be determined, VBUS should be routed to an external pin, and the auto-detect behaviour turned off by
 			 *        passing the NO_LIMITED_CONTROLLER_CONNECT token to the compiler via the -D switch at compile time. The connection
 			 *        and disconnection events may be manually fired, and the \ref USB_DeviceState global changed manually.
 			 *
+			 *  \note This event may fire multiple times during device enumeration on the series 2 USB AVRs with limited USB controllers
+			 *        if NO_LIMITED_CONTROLLER_CONNECT is not defined.
+			 *
 			 *  \see USBTask.h for more information on the USB management task and reducing CPU usage.
 			 */
 			void EVENT_USB_Device_Connect(void);
@@ -162,13 +165,16 @@
 			/** Event for USB device disconnection. This event fires when the AVR in device mode and the device is disconnected
 			 *  from a host, measured by a falling level on the AVR's VBUS pin.
 			 *
-			 *  \note For the smaller USB AVRs (AT90USBXX2) with limited USB controllers, VBUS is not available to the USB controller.
+			 *  \note For the smaller series 2 USB AVRs with limited USB controllers, VBUS is not available to the USB controller.
 			 *        this means that the current connection state is derived from the bus suspension and wake up events by default,
 			 *        which is not always accurate (host may suspend the bus while still connected). If the actual connection state
 			 *        needs to be determined, VBUS should be routed to an external pin, and the auto-detect behaviour turned off by
 			 *        passing the NO_LIMITED_CONTROLLER_CONNECT token to the compiler via the -D switch at compile time. The connection
 			 *        and disconnection events may be manually fired, and the \ref USB_DeviceState global changed manually.
 			 *
+			 *  \note This event may fire multiple times during device enumeration on the series 2 USB AVRs with limited USB controllers
+			 *        if NO_LIMITED_CONTROLLER_CONNECT is not defined.
+			 *
 			 *  \see USBTask.h for more information on the USB management task and reducing CPU usage.
 			 */
 			void EVENT_USB_Device_Disconnect(void);
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 0bdb57ebf..b27b724ed 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -60,7 +60,8 @@
   *  - CDC based demos and project now work under 64 bit versions of Windows (thanks to Ronny Hanson, Thomas Bleeker)
   *  - Re-add in flip, flip-ee, dfu and dfu-ee targets to project makefiles (thanks to Opendous Inc.)
   *  - Fix allowable F_CPU values comment in project makefiles
-  *  - Fixed DFU and CDC class bootloaders on the AT90USBXXX2 series USB AVRs
+  *  - Fixed DFU and CDC class bootloaders on the series 2 USB AVRs, corrected invalid signatures, added support for the new
+  *    ATMEGAxxx2 series 2 variant AVRs to the DFU bootloader
   *
   *
   *  \section Sec_ChangeLog090810 Version 090810
-- 
GitLab