diff --git a/LUFA/Drivers/USB/LowLevel/USBController.c b/LUFA/Drivers/USB/LowLevel/USBController.c index fe62482169..7adfcdc354 100644 --- a/LUFA/Drivers/USB/LowLevel/USBController.c +++ b/LUFA/Drivers/USB/LowLevel/USBController.c @@ -29,10 +29,11 @@ */ #define __INCLUDE_FROM_USB_DRIVER +#define __INCLUDE_FROM_USB_CONTROLLER_C #include "USBController.h" #if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY)) -volatile uint8_t USB_CurrentMode = USB_MODE_NONE; +volatile uint8_t USB_CurrentMode = USB_MODE_NONE; #endif #if !defined(USE_STATIC_OPTIONS) @@ -55,58 +56,35 @@ void USB_Init( #endif ) { - #if defined(USB_CAN_BE_BOTH) - USB_CurrentMode = Mode; - #endif - #if !defined(USE_STATIC_OPTIONS) USB_Options = Options; #endif - - #if defined(USB_CAN_BE_HOST) - USB_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE; - #endif - #if defined(USB_DEVICE_ONLY) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) - UHWCON |= (1 << UIMOD); - #elif defined(USB_HOST_ONLY) - UHWCON &= ~(1 << UIMOD); - #elif defined(USB_CAN_BE_BOTH) - if (Mode == USB_MODE_DEVICE) - { - UHWCON |= (1 << UIMOD); - } - else if (Mode == USB_MODE_HOST) + #if defined(USB_CAN_BE_BOTH) + if (Mode == USB_MODE_UID) { - UHWCON &= ~(1 << UIMOD); + UHWCON |= (1 << UIDE); + USB_INT_Enable(USB_INT_IDTI); + USB_CurrentMode = USB_GetUSBModeFromUID(); } else { - UHWCON |= (1 << UIDE); + USB_CurrentMode = Mode; } #endif - - USB_ResetInterface(); - - #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) - USB_OTGPAD_On(); - #endif USB_IsInitialized = true; + + USB_ResetInterface(); } void USB_ShutDown(void) { - USB_ResetInterface(); - USB_Detach(); - USB_Controller_Disable(); - USB_INT_DisableAllInterrupts(); USB_INT_ClearAllInterrupts(); - #if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) - UHWCON &= ~(1 << UIMOD); - #endif + USB_Detach(); + USB_Controller_Disable(); if (!(USB_Options & USB_OPT_MANUAL_PLL)) USB_PLL_Off(); @@ -118,38 +96,26 @@ void USB_ShutDown(void) #endif #if defined(USB_CAN_BE_BOTH) - UHWCON &= ~(1 << UIDE); + USB_CurrentMode = USB_MODE_NONE; #endif USB_IsInitialized = false; - - #if defined(USB_CAN_BE_BOTH) - USB_CurrentMode = USB_MODE_NONE; - #endif } void USB_ResetInterface(void) { + bool UIDModeSelectEnabled = ((UHWCON & (1 << UIDE)) != 0); + USB_INT_DisableAllInterrupts(); USB_INT_ClearAllInterrupts(); - #if defined(USB_CAN_BE_HOST) - USB_HostState = HOST_STATE_Unattached; - #endif - - #if defined(USB_CAN_BE_DEVICE) - USB_DeviceState = DEVICE_STATE_Unattached; - USB_ConfigurationNumber = 0; + USB_Controller_Reset(); - #if !defined(NO_DEVICE_REMOTE_WAKEUP) - USB_RemoteWakeupEnabled = false; - #endif - - #if !defined(NO_DEVICE_SELF_POWER) - USB_CurrentlySelfPowered = false; - #endif - #endif - + if (!(USB_Options & USB_OPT_REG_DISABLED)) + USB_REG_On(); + else + USB_REG_Off(); + if (!(USB_Options & USB_OPT_MANUAL_PLL)) { #if defined(USB_SERIES_4_AVR) @@ -158,104 +124,98 @@ void USB_ResetInterface(void) USB_PLL_On(); while (!(USB_PLL_IsReady())); - } - - USB_Controller_Reset(); - - #if defined(USB_CAN_BE_BOTH) - if (UHWCON & (1 << UIDE)) + } + + USB_CLK_Unfreeze(); + + #if defined(USB_DEVICE_ONLY) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) + UHWCON |= (1 << UIMOD); + USB_Init_Device(); + #elif defined(USB_HOST_ONLY) + UHWCON &= ~(1 << UIMOD); + USB_Init_Host(); + #elif defined(USB_CAN_BE_BOTH) + if (UIDModeSelectEnabled) { - USB_INT_Clear(USB_INT_IDTI); + UHWCON |= (1 << UIDE); USB_INT_Enable(USB_INT_IDTI); - USB_CurrentMode = USB_GetUSBModeFromUID(); } - #endif - - if (!(USB_Options & USB_OPT_REG_DISABLED)) - USB_REG_On(); - else - USB_REG_Off(); - USB_CLK_Unfreeze(); - - #if (defined(USB_CAN_BE_DEVICE) && (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))) if (USB_CurrentMode == USB_MODE_DEVICE) { - if (USB_Options & USB_DEVICE_OPT_LOWSPEED) - USB_Device_SetLowSpeed(); - else - USB_Device_SetFullSpeed(); + UHWCON |= (1 << UIMOD); + USB_Init_Device(); + } + else + { + UHWCON &= ~(1 << UIMOD); + USB_Init_Host(); } #endif - #if (defined(USB_CAN_BE_DEVICE) && !defined(FIXED_CONTROL_ENDPOINT_SIZE)) - if (USB_CurrentMode == USB_MODE_DEVICE) - { - USB_Descriptor_Device_t* DeviceDescriptorPtr; + USB_OTGPAD_On(); + USB_Attach(); +} + +#if defined(USB_CAN_BE_DEVICE) +static void USB_Init_Device(void) +{ + USB_DeviceState = DEVICE_STATE_Unattached; + USB_ConfigurationNumber = 0; + + #if !defined(NO_DEVICE_REMOTE_WAKEUP) + USB_RemoteWakeupEnabled = false; + #endif + + #if !defined(NO_DEVICE_SELF_POWER) + USB_CurrentlySelfPowered = false; + #endif - if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr) != NO_DESCRIPTOR) - { - #if defined(USE_RAM_DESCRIPTORS) - USB_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size; - #elif defined(USE_EEPROM_DESCRIPTORS) - USB_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size); - #else - USB_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size); - #endif - } + #if !defined(FIXED_CONTROL_ENDPOINT_SIZE) + USB_Descriptor_Device_t* DeviceDescriptorPtr; + + if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr) != NO_DESCRIPTOR) + { + #if defined(USE_RAM_DESCRIPTORS) + USB_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size; + #elif defined(USE_EEPROM_DESCRIPTORS) + USB_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size); + #else + USB_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size); + #endif } #endif - USB_Attach(); - - #if defined(USB_DEVICE_ONLY) + #if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) + if (USB_Options & USB_DEVICE_OPT_LOWSPEED) + USB_Device_SetLowSpeed(); + else + USB_Device_SetFullSpeed(); + + USB_INT_Enable(USB_INT_VBUS); + #endif + USB_INT_Clear(USB_INT_SUSPEND); USB_INT_Enable(USB_INT_SUSPEND); USB_INT_Clear(USB_INT_EORSTI); USB_INT_Enable(USB_INT_EORSTI); +} +#endif + +#if defined(USB_CAN_BE_HOST) +static void USB_Init_Host(void) +{ + USB_HostState = HOST_STATE_Unattached; + USB_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE; - #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) - USB_INT_Enable(USB_INT_VBUS); - #endif - #elif defined(USB_HOST_ONLY) USB_Host_HostMode_On(); + USB_CLK_Unfreeze(); USB_Host_VBUS_Auto_Off(); - USB_OTGPAD_Off(); - USB_Host_VBUS_Manual_Enable(); USB_Host_VBUS_Manual_On(); - + USB_INT_Enable(USB_INT_SRPI); USB_INT_Enable(USB_INT_BCERRI); - #else - if (USB_CurrentMode == USB_MODE_DEVICE) - { - USB_INT_Clear(USB_INT_SUSPEND); - USB_INT_Enable(USB_INT_SUSPEND); - USB_INT_Clear(USB_INT_EORSTI); - USB_INT_Enable(USB_INT_EORSTI); - - #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) - USB_INT_Enable(USB_INT_VBUS); - #endif - - Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL, - ENDPOINT_DIR_OUT, USB_ControlEndpointSize, - ENDPOINT_BANK_SINGLE); - } - else if (USB_CurrentMode == USB_MODE_HOST) - { - USB_Host_HostMode_On(); - - USB_Host_VBUS_Auto_Off(); - USB_OTGPAD_Off(); - - USB_Host_VBUS_Manual_Enable(); - USB_Host_VBUS_Manual_On(); - - USB_INT_Enable(USB_INT_SRPI); - USB_INT_Enable(USB_INT_BCERRI); - } - #endif } +#endif diff --git a/LUFA/Drivers/USB/LowLevel/USBController.h b/LUFA/Drivers/USB/LowLevel/USBController.h index 8fdb24cba4..298141eef5 100644 --- a/LUFA/Drivers/USB/LowLevel/USBController.h +++ b/LUFA/Drivers/USB/LowLevel/USBController.h @@ -346,6 +346,17 @@ /* Private Interface - For use in library only: */ #if !defined(__DOXYGEN__) + /* Function Prototypes: */ + #if defined(__INCLUDE_FROM_USB_CONTROLLER_C) + #if defined(USB_CAN_BE_DEVICE) + static void USB_Init_Device(void); + #endif + + #if defined(USB_CAN_BE_HOST) + static void USB_Init_Host(void); + #endif + #endif + /* Inline Functions: */ static inline void USB_PLL_On(void) ATTR_ALWAYS_INLINE; static inline void USB_PLL_On(void) @@ -443,7 +454,7 @@ return USB_MODE_HOST; } #endif - + #endif /* Disable C linkage for C++ Compilers: */ diff --git a/LUFA/Drivers/USB/LowLevel/USBInterrupt.c b/LUFA/Drivers/USB/LowLevel/USBInterrupt.c index 52951fc39f..311a7be4e3 100644 --- a/LUFA/Drivers/USB/LowLevel/USBInterrupt.c +++ b/LUFA/Drivers/USB/LowLevel/USBInterrupt.c @@ -168,6 +168,8 @@ ISR(USB_GEN_vect, ISR_BLOCK) #endif #if defined(USB_CAN_BE_HOST) + bool MustResetInterface = false; + if (USB_INT_HasOccurred(USB_INT_DDISCI) && USB_INT_IsEnabled(USB_INT_DDISCI)) { USB_INT_Clear(USB_INT_DDISCI); @@ -175,8 +177,8 @@ ISR(USB_GEN_vect, ISR_BLOCK) USB_INT_Disable(USB_INT_DDISCI); EVENT_USB_Host_DeviceUnattached(); - - USB_ResetInterface(); + + MustResetInterface = true; } if (USB_INT_HasOccurred(USB_INT_VBERRI) && USB_INT_IsEnabled(USB_INT_VBERRI)) @@ -211,7 +213,7 @@ ISR(USB_GEN_vect, ISR_BLOCK) EVENT_USB_Host_DeviceEnumerationFailed(HOST_ENUMERROR_NoDeviceDetected, 0); EVENT_USB_Host_DeviceUnattached(); - USB_ResetInterface(); + MustResetInterface = true; } if (USB_INT_HasOccurred(USB_INT_HSOFI) && USB_INT_IsEnabled(USB_INT_HSOFI)) @@ -236,8 +238,11 @@ ISR(USB_GEN_vect, ISR_BLOCK) USB_CurrentMode = USB_GetUSBModeFromUID(); EVENT_USB_UIDChange(); - USB_ResetInterface(); + MustResetInterface = true; } + + if (MustResetInterface) + USB_ResetInterface(); #endif }