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
#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
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
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