Complete USB XMEGA interrupt control subsystem code in the core USB driver.
[pub/USBasp.git] / LUFA / Drivers / USB / Core / XMEGA / USBController_XMEGA.c
index c8839c9..c67575b 100644 (file)
@@ -40,6 +40,8 @@ volatile uint8_t USB_CurrentMode = USB_MODE_None;
 volatile uint8_t USB_Options;\r
 #endif\r
 \r
+USB_EP_TABLE_t USB_EndpointTable ATTR_ALIGNED(2);\r
+\r
 void USB_Init(\r
                #if defined(USB_CAN_BE_BOTH)\r
                const uint8_t Mode\r
@@ -61,6 +63,16 @@ void USB_Init(
        #endif\r
        \r
        USB_IsInitialized = true;\r
+       \r
+       uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();\r
+       GlobalInterruptDisable();\r
+\r
+       NVM.CMD  = NVM_CMD_READ_CALIB_ROW_gc;\r
+       USB.CAL0 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL0));\r
+       NVM.CMD  = NVM_CMD_READ_CALIB_ROW_gc;\r
+       USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1));\r
+       \r
+       SetGlobalInterruptMask(CurrentGlobalInt);\r
 \r
        USB_ResetInterface();   \r
 }\r
@@ -79,13 +91,17 @@ void USB_Disable(void)
 void USB_ResetInterface(void)\r
 {\r
        if (USB_Options & USB_DEVICE_OPT_LOWSPEED)\r
-         CLK.USBCTRL = ((((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp) | CLK_USBSRC_PLL_gc | CLK_USBEN_bm);\r
+         CLK.USBCTRL = ((((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp) | CLK_USBSRC_PLL_gc | CLK_USBSEN_bm);\r
        else\r
-         CLK.USBCTRL = ((((F_USB / 48000000) - 1) << CLK_USBPSDIV_gp) | CLK_USBSRC_PLL_gc | CLK_USBEN_bm);\r
+         CLK.USBCTRL = ((((F_USB / 48000000) - 1) << CLK_USBPSDIV_gp) | CLK_USBSRC_PLL_gc | CLK_USBSEN_bm);\r
        \r
        USB_INT_DisableAllInterrupts();\r
        USB_INT_ClearAllInterrupts();\r
 \r
+       // TODO: Config define for priority\r
+       USB.INTCTRLA = (2 << USB_INTLVL_gp);\r
+       PMIC.CTRL   |= (1 << PMIC_MEDLVLEX_bp);\r
+\r
        USB_Controller_Reset();\r
        USB_Init_Device();\r
 }\r
@@ -143,6 +159,8 @@ static void USB_Init_Device(void)
                                                           ENDPOINT_DIR_OUT, USB_Device_ControlEndpointSize,\r
                                                           ENDPOINT_BANK_SINGLE);\r
 \r
+       USB_INT_Enable(USB_INT_BUSEVENTI);\r
+\r
        USB_Attach();\r
 }\r
 #endif\r