From f670bdeff83ee519b67c661cbe794d787c2a5403 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Mon, 25 Apr 2011 07:28:36 +0000
Subject: [PATCH] Add __VA_ARGS__ support to the LUFA supplied ISR macro. Add
 proper result typecasting to the SWAPENDIAN_* macros.

Switch to using -1 on the UC3 target to obtain a register mask with all bits set (for clearing interrupts and status flags).

Fix incorrect USB controller mode on the UC3 when a fixed mode is specified as a compile time option due to AVR32_USBB.USBCON.uide being set by default.

Make USB_Descriptor_String_t use a uint16_t for Unicode strings on all targets except the AVR8 (retained for backwards compatibility).
---
 LUFA/CodeTemplates/makefile_template.uc3      |  4 +--
 LUFA/Common/Common.h                          |  2 +-
 LUFA/Common/Endianness.h                      |  6 ++---
 LUFA/Drivers/USB/Core/StdDescriptors.h        | 26 +++++++++++--------
 LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c      |  2 +-
 LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c          |  2 +-
 LUFA/Drivers/USB/Core/UC3/USBController_UC3.c |  2 ++
 LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c  |  8 +++---
 8 files changed, 28 insertions(+), 24 deletions(-)

diff --git a/LUFA/CodeTemplates/makefile_template.uc3 b/LUFA/CodeTemplates/makefile_template.uc3
index 843d775af..e56cb324a 100644
--- a/LUFA/CodeTemplates/makefile_template.uc3
+++ b/LUFA/CodeTemplates/makefile_template.uc3
@@ -236,9 +236,7 @@ ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-l
 #    -Map:      create map file
 #    --cref:    add cross reference to  map file
 LDFLAGS  = -Wl,-Map=$(TARGET).map,--cref
-LDFLAGS += -Wl,--relax 
-LDFLAGS += -Wl,--gc-sections
-LDFLAGS += -Wl,--rodata-writable
+LDFLAGS += -Wl,--gc-sections --rodata-writable
 LDFLAGS += -Wl,--direct-data
 #LDFLAGS += -T linker_script.x
 
diff --git a/LUFA/Common/Common.h b/LUFA/Common/Common.h
index e349063da..1fc47e0eb 100644
--- a/LUFA/Common/Common.h
+++ b/LUFA/Common/Common.h
@@ -257,7 +257,7 @@
 				 *
 				 *  \param Name  Unique name of the interrupt service routine.
 				 */
-				#define ISR(Name, ...)                  void Name (void) __attribute__((__interrupt__)); void Name (void)
+				#define ISR(Name, ...)                  void Name (void) __attribute__((__interrupt__)) __VA_ARGS__; void Name (void)
 			#endif
 
 		/* Inline Functions: */
diff --git a/LUFA/Common/Endianness.h b/LUFA/Common/Endianness.h
index ef8c1a788..115d054f2 100644
--- a/LUFA/Common/Endianness.h
+++ b/LUFA/Common/Endianness.h
@@ -78,7 +78,7 @@
 			 *
 			 *  \return Input value with the byte ordering reversed.
 			 */
-			#define SWAPENDIAN_16(x)          ((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8))
+			#define SWAPENDIAN_16(x)            (uint16_t)((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8))
 
 			/** Swaps the byte ordering of a 32-bit value at compile-time. Do not use this macro for swapping byte orderings
 			 *  of dynamic values computed at runtime- use \ref SwapEndian_32() instead. The result of this macro can be used
@@ -91,8 +91,8 @@
 			 *
 			 *  \return Input value with the byte ordering reversed.
 			 */
-			#define SWAPENDIAN_32(x)          ((((x) & 0xFF000000UL) >> 24UL) | (((x) & 0x00FF0000UL) >> 8UL) | \
-			                                   (((x) & 0x0000FF00UL) << 8UL)  | (((x) & 0x000000FFUL) << 24UL))
+			#define SWAPENDIAN_32(x)            (uint32_t)((((x) & 0xFF000000UL) >> 24UL) | (((x) & 0x00FF0000UL) >> 8UL) | \
+			                                               (((x) & 0x0000FF00UL) << 8UL)  | (((x) & 0x000000FFUL) << 24UL))
 
 			#if defined(ARCH_BIG_ENDIAN) && !defined(le16_to_cpu)
 				#define le16_to_cpu(x)           SwapEndian_16(x)
diff --git a/LUFA/Drivers/USB/Core/StdDescriptors.h b/LUFA/Drivers/USB/Core/StdDescriptors.h
index 32777cc0f..7840bcb8e 100644
--- a/LUFA/Drivers/USB/Core/StdDescriptors.h
+++ b/LUFA/Drivers/USB/Core/StdDescriptors.h
@@ -612,17 +612,21 @@
 			{
 				USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */
 
-				wchar_t UnicodeString[]; /**< String data, as unicode characters (alternatively,
-				                          *   string language IDs). If normal ASCII characters are
-				                          *   to be used, they must be added as an array of characters
-				                          *   rather than a normal C string so that they are widened to
-				                          *   Unicode size.
-				                          *
-				                          *   Under GCC, strings prefixed with the "L" character (before
-				                          *   the opening string quotation mark) are considered to be
-				                          *   Unicode strings, and may be used instead of an explicit
-				                          *   array of ASCII characters.
-				                          */
+				#if (ARCH == ARCH_AVR8)
+				wchar_t  UnicodeString[];
+				#else
+				uint16_t UnicodeString[]; /**< String data, as unicode characters (alternatively,
+				                           *   string language IDs). If normal ASCII characters are
+				                           *   to be used, they must be added as an array of characters
+				                           *   rather than a normal C string so that they are widened to
+				                           *   Unicode size.
+				                           *
+				                           *   Under GCC, strings prefixed with the "L" character (before
+				                           *   the opening string quotation mark) are considered to be
+				                           *   Unicode strings, and may be used instead of an explicit
+				                           *   array of ASCII characters.
+				                           */
+				#endif
 			} ATTR_PACKED USB_Descriptor_String_t;
 
 			/** \brief Standard USB String Descriptor (USB-IF naming conventions).
diff --git a/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c b/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c
index b978ec7f1..9c7d6b62d 100644
--- a/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c
+++ b/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c
@@ -61,7 +61,7 @@ void Endpoint_ClearEndpoints(void)
 	{
 		Endpoint_SelectEndpoint(EPNum);
 		(&AVR32_USBB.uecfg0)[EPNum]    = 0;
-		(&AVR32_USBB.uecon0clr)[EPNum] = 0xFFFFFFFF;
+		(&AVR32_USBB.uecon0clr)[EPNum] = -1;
 		USB_EndpointFIFOPos[EPNum]     = &AVR32_USBB_SLAVE[EPNum * 0x10000];
 		Endpoint_DisableEndpoint();
 	}
diff --git a/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c b/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c
index 86bed0388..92589a870 100644
--- a/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c
+++ b/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c
@@ -69,7 +69,7 @@ void Pipe_ClearPipes(void)
 	{
 		Pipe_SelectPipe(PNum);
 		(&AVR32_USBB.upcfg0)[PNum]    = 0;
-		(&AVR32_USBB.upcon0clr)[PNum] = 0xFFFFFFFF;
+		(&AVR32_USBB.upcon0clr)[PNum] = -1;
 		USB_PipeFIFOPos[PNum]         = &AVR32_USBB_SLAVE[PNum * 0x10000];
 		Pipe_DisablePipe();
 	}
diff --git a/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c b/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c
index e3d97d684..0b0d04d63 100644
--- a/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c
+++ b/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c
@@ -72,6 +72,8 @@ void USB_Init(
 		AVR32_USBB.USBCON.uide = false;
 		USB_CurrentMode = Mode;
 	}
+	#else
+	AVR32_USBB.USBCON.uide = false;	
 	#endif
 
 	USB_IsInitialized = true;
diff --git a/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c b/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c
index 76f4ef022..5191ee67f 100644
--- a/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c
+++ b/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c
@@ -36,8 +36,8 @@ void USB_INT_DisableAllInterrupts(void)
 	AVR32_USBB.USBCON.vbuste = false;
 	AVR32_USBB.USBCON.idte   = false;
 
-	AVR32_USBB.uhinteclr = 0xFFFFFFFF;
-	AVR32_USBB.udinteclr = 0xFFFFFFFF;
+	AVR32_USBB.uhinteclr     = -1;
+	AVR32_USBB.udinteclr     = -1;
 }
 
 void USB_INT_ClearAllInterrupts(void)
@@ -45,8 +45,8 @@ void USB_INT_ClearAllInterrupts(void)
 	AVR32_USBB.USBSTACLR.vbustic = true;
 	AVR32_USBB.USBSTACLR.idtic   = true;
 
-	AVR32_USBB.uhintclr = 0xFFFFFFFF;
-	AVR32_USBB.udintclr = 0xFFFFFFFF;
+	AVR32_USBB.uhintclr      = -1;
+	AVR32_USBB.udintclr      = -1;
 }
 
 ISR(USB_GEN_vect)
-- 
GitLab