diff options
author | Dean Camera <dean@fourwalledcubicle.com> | 2011-03-15 06:39:34 +0000 |
---|---|---|
committer | Dean Camera <dean@fourwalledcubicle.com> | 2011-03-15 06:39:34 +0000 |
commit | b35f93a372d8c872aebab4e3626bfc58d85b84d7 (patch) | |
tree | e695226ad0d2525042d562f78701522747057265 /LUFA/Drivers/USB | |
parent | 1a130eed6c990701642afc1a1e9738dfd86b0d4b (diff) | |
download | lufa-b35f93a372d8c872aebab4e3626bfc58d85b84d7.tar.gz lufa-b35f93a372d8c872aebab4e3626bfc58d85b84d7.tar.bz2 lufa-b35f93a372d8c872aebab4e3626bfc58d85b84d7.zip |
Implemented on-demand PLL clock generation for the U4, U6 and U7 series USB AVRs when automatic PLL mode is specified.
Diffstat (limited to 'LUFA/Drivers/USB')
-rw-r--r-- | LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c | 40 | ||||
-rw-r--r-- | LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c | 9 |
2 files changed, 35 insertions, 14 deletions
diff --git a/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c b/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c index 18fa48a23..8b4171138 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 e983cde83..856ccd626 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(); } |