From dc09ccab8bc1b8980eae10153c0a57eca02ce794 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Mon, 14 Nov 2011 07:31:40 +0000
Subject: [PATCH] Minor corrections for the XMEGA USB controller. Add compile
 time warning if the USB clock frequency is provably incorrect.

---
 LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h      | 12 ++++++++----
 LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h |  4 ++++
 2 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h b/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h
index 49bc1f2f6..f587feca9 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h
+++ b/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h
@@ -290,6 +290,10 @@
 			                                              const uint8_t Banks)
 			{
 				uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | Banks | Endpoint_BytesToEPSizeMask(Size));
+				
+				// TODO - Fix once limitations are lifted
+				if ((Banks != ENDPOINT_BANK_SINGLE) || (Size > 64))
+				  return false;
 
 				switch (Type)
 				{
@@ -473,7 +477,7 @@
 				if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_SETUP_bm)
 				{
 					USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT;
-					return true;				
+					return true;
 				}
 			
 				return false;
@@ -489,8 +493,8 @@
 			static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
 			static inline void Endpoint_ClearSETUP(void)
 			{
+				Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN);
 				USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_SETUP_bm | USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm);
-
 				USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm;
 				USB_Endpoint_SelectedFIFO->Position  = 0;
 
@@ -543,7 +547,7 @@
 				if ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_TYPE_gm) == USB_EP_TYPE_CONTROL_gc)
 				{
 					Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint |  ENDPOINT_DIR_IN);
-					USB_Endpoint_SelectedHandle->STATUS |= USB_EP_STALL_bm;
+					USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm;
 					Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN);
 				}
 			}
@@ -567,7 +571,7 @@
 			static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 			static inline bool Endpoint_IsStalled(void)
 			{
-				return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_STALLF_bm) ? true : false);
+				return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_STALL_bm) ? true : false);
 			}
 
 			/** Resets the data toggle of the currently selected endpoint. */
diff --git a/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h b/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h
index 0d39258af..2c3169758 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h
+++ b/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h
@@ -94,6 +94,10 @@
 		#if !defined(F_USB)
 			#error F_USB is not defined. You must define F_USB to the frequency of the unprescaled USB controller clock in your project makefile.
 		#endif
+		
+		#if (F_USB % 6000000)
+			#error Invalid F_USB specified. F_USB must be a multiple of 6MHz for USB Low Speed operation, and a multiple of 48MHz for Full Speed operation.
+		#endif
 
 	/* Public Interface - May be used in end-application: */
 		/* Macros: */
-- 
GitLab