Implemented on-demand PLL clock generation for the U4, U6 and U7 series USB AVRs...
authorDean Camera <dean@fourwalledcubicle.com>
Tue, 15 Mar 2011 06:39:34 +0000 (06:39 +0000)
committerDean Camera <dean@fourwalledcubicle.com>
Tue, 15 Mar 2011 06:39:34 +0000 (06:39 +0000)
LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c
LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c
LUFA/ManPages/ChangeLog.txt

index 18fa48a..8b41711 100644 (file)
@@ -65,6 +65,13 @@ void USB_Init(
        else
          USB_REG_Off();
 
+       if (!(USB_Options & USB_OPT_MANUAL_PLL))
+       {
+               #if defined(USB_SERIES_4_AVR)
+               PLLFRQ = ((1 << PLLUSB) | (1 << PDIV3) | (1 << PDIV1));
+               #endif
+       }
+
        #if defined(USB_CAN_BE_BOTH)
        if (Mode == USB_MODE_UID)
        {
@@ -118,22 +125,9 @@ void USB_ResetInterface(void)
 
        USB_Controller_Reset();
 
-       if (!(USB_Options & USB_OPT_MANUAL_PLL))
-       {
-               #if defined(USB_SERIES_4_AVR)
-               PLLFRQ = ((1 << PLLUSB) | (1 << PDIV3) | (1 << PDIV1));
-               #endif
-
-               USB_PLL_On();
-               while (!(USB_PLL_IsReady()));
-       }
-
        #if defined(USB_CAN_BE_BOTH)
        if (UIDModeSelectEnabled)
-       {
-               UHWCON |= (1 << UIDE);
-               USB_INT_Enable(USB_INT_IDTI);
-       }
+         USB_INT_Enable(USB_INT_IDTI);
        #endif
 
        USB_CLK_Unfreeze();
@@ -145,6 +139,16 @@ void USB_ResetInterface(void)
                UHWCON |=  (1 << UIMOD);
                #endif
 
+               if (!(USB_Options & USB_OPT_MANUAL_PLL))
+               {
+                       #if defined(USB_SERIES_2_AVR)
+                       USB_PLL_On();
+                       while (!(USB_PLL_IsReady()));
+                       #else
+                       USB_PLL_Off();
+                       #endif
+               }
+
                USB_Init_Device();
                #endif
        }
@@ -153,6 +157,14 @@ void USB_ResetInterface(void)
                #if defined(USB_CAN_BE_HOST)
                UHWCON &= ~(1 << UIMOD);
 
+               if (!(USB_Options & USB_OPT_MANUAL_PLL))
+               {
+                       #if defined(USB_CAN_BE_HOST)
+                       USB_PLL_On();
+                       while (!(USB_PLL_IsReady()));           
+                       #endif
+               }
+
                USB_Init_Host();
                #endif
        }
index e983cde..856ccd6 100644 (file)
@@ -90,11 +90,20 @@ ISR(USB_GEN_vect, ISR_BLOCK)
 
                if (USB_VBUS_GetStatus())
                {
+                       if (!(USB_Options & USB_OPT_MANUAL_PLL))
+                       {
+                               USB_PLL_On();
+                               while (!(USB_PLL_IsReady()));
+                       }
+
                        USB_DeviceState = DEVICE_STATE_Powered;
                        EVENT_USB_Device_Connect();
                }
                else
                {
+                       if (!(USB_Options & USB_OPT_MANUAL_PLL))
+                         USB_PLL_Off();
+
                        USB_DeviceState = DEVICE_STATE_Unattached;
                        EVENT_USB_Device_Disconnect();
                }
index 231920e..ea3efcd 100644 (file)
@@ -58,6 +58,7 @@
   *   - Reduced latency for executing the Start-Of-Frame events (if enabled in the user application)
   *   - Removed Pipe_ClearErrorFlags(), pipe error flags are now automatically cleared when Pipe_ClearError() is called
   *   - Endpoint_ResetFIFO() renamed to Endpoint_ResetEndpoint(), to be consistent with the Pipe_ResetPipe() function name
+  *   - Implemented on-demand PLL clock generation for the U4, U6 and U7 series USB AVRs when automatic PLL mode is specified
   *  - Library Applications:
   *   - Changed the XPLAINBridge software UART to use the regular timer CTC mode instead of the alternative CTC mode
   *     via the Input Capture register, to reduce user confusion