From a36012fc4b057dc1fe96f75a005cd8ba017a6a71 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Fri, 15 Jul 2011 08:29:25 +0000
Subject: [PATCH] Add option to the USB XMEGAs to set the USB bus interrupt
 priority level.

---
 .../USB/Core/XMEGA/USBController_XMEGA.c      | 11 ++++++----
 .../USB/Core/XMEGA/USBController_XMEGA.h      | 20 ++++++++++++++++++-
 2 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c b/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c
index c67575b6f..dcb506b2b 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c
+++ b/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c
@@ -72,6 +72,13 @@ void USB_Init(
 	NVM.CMD  = NVM_CMD_READ_CALIB_ROW_gc;
 	USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1));
 	
+	if ((USB_Options & USB_OPT_BUSEVENT_PRIHIGH) == USB_OPT_BUSEVENT_PRIHIGH)
+	  USB.INTCTRLA = (3 << USB_INTLVL_gp);
+	else if ((USB_Options & USB_OPT_BUSEVENT_PRIMED) == USB_OPT_BUSEVENT_PRIMED)
+	  USB.INTCTRLA = (2 << USB_INTLVL_gp);
+	else
+	  USB.INTCTRLA = (1 << USB_INTLVL_gp);
+
 	SetGlobalInterruptMask(CurrentGlobalInt);
 
 	USB_ResetInterface();	
@@ -98,10 +105,6 @@ void USB_ResetInterface(void)
 	USB_INT_DisableAllInterrupts();
 	USB_INT_ClearAllInterrupts();
 
-	// TODO: Config define for priority
-	USB.INTCTRLA = (2 << USB_INTLVL_gp);
-	PMIC.CTRL   |= (1 << PMIC_MEDLVLEX_bp);
-
 	USB_Controller_Reset();
 	USB_Init_Device();
 }
diff --git a/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h b/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h
index 45cfe5977..f6c4a7aa8 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h
+++ b/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h
@@ -84,7 +84,25 @@
 		#endif
 
 	/* Public Interface - May be used in end-application: */
-		/* Macros: */			
+		/* Macros: */
+			/** \name USB Controller Option Masks */
+			//@{
+			/** Sets the USB bus interrupt priority level to be low priority. The USB bus interrupt is used for Start of Frame events, bus suspend
+			 *  and resume events, bus reset events and other events related to the management of the USB bus.
+			 */
+			#define USB_OPT_BUSEVENT_PRILOW           ((0 << 1) | (0 << 1))
+
+			/** Sets the USB bus interrupt priority level to be medium priority. The USB bus interrupt is used for Start of Frame events, bus suspend
+			 *  and resume events, bus reset events and other events related to the management of the USB bus.
+			 */
+			#define USB_OPT_BUSEVENT_PRIMED           ((0 << 1) | (1 << 1))
+
+			/** Sets the USB bus interrupt priority level to be high priority. The USB bus interrupt is used for Start of Frame events, bus suspend
+			 *  and resume events, bus reset events and other events related to the management of the USB bus.
+			 */
+			#define USB_OPT_BUSEVENT_PRIHIGH          ((1 << 1) | (0 << 1))
+			//@}
+
 			/** \name Endpoint/Pipe Type Masks */
 			//@{
 			/** Mask for a CONTROL type endpoint or pipe.
-- 
GitLab