From b35f93a372d8c872aebab4e3626bfc58d85b84d7 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Tue, 15 Mar 2011 06:39:34 +0000 Subject: [PATCH] Implemented on-demand PLL clock generation for the U4, U6 and U7 series USB AVRs when automatic PLL mode is specified. --- .../USB/Core/AVR8/USBController_AVR8.c | 40 ++++++++++++------- .../Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c | 9 +++++ LUFA/ManPages/ChangeLog.txt | 1 + 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c b/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c index 18fa48a236..8b41711388 100644 --- a/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c +++ b/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c @@ -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 } diff --git a/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c b/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c index e983cde83e..856ccd6267 100644 --- a/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c +++ b/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c @@ -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(); } diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt index 231920e8f1..ea3efcdb2e 100644 --- a/LUFA/ManPages/ChangeLog.txt +++ b/LUFA/ManPages/ChangeLog.txt @@ -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