@ -29,10 +29,11 @@
*/
*/
# define __INCLUDE_FROM_USB_DRIVER
# define __INCLUDE_FROM_USB_DRIVER
# define __INCLUDE_FROM_USB_CONTROLLER_C
# include "USBController.h"
# include "USBController.h"
# if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY))
# 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
# endif
# if !defined(USE_STATIC_OPTIONS)
# if !defined(USE_STATIC_OPTIONS)
@ -55,58 +56,35 @@ void USB_Init(
# endif
# endif
)
)
{
{
# if defined(USB_CAN_BE_BOTH)
USB_CurrentMode = Mode ;
# endif
# if !defined(USE_STATIC_OPTIONS)
# if !defined(USE_STATIC_OPTIONS)
USB_Options = Options ;
USB_Options = Options ;
# endif
# endif
# if defined(USB_CAN_BE_HOST)
# if defined(USB_CAN_BE_BOTH)
USB_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE ;
if ( Mode = = USB_MODE_UID )
# 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 )
{
{
UHWCON & = ~ ( 1 < < UIMOD ) ;
UHWCON | = ( 1 < < UIDE ) ;
USB_INT_Enable ( USB_INT_IDTI ) ;
USB_CurrentMode = USB_GetUSBModeFromUID ( ) ;
}
}
else
else
{
{
U HWCON | = ( 1 < < UIDE ) ;
USB_CurrentMode = Mode ;
}
}
# endif
# 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_IsInitialized = true ;
USB_ResetInterface ( ) ;
}
}
void USB_ShutDown ( void )
void USB_ShutDown ( void )
{
{
USB_ResetInterface ( ) ;
USB_Detach ( ) ;
USB_Controller_Disable ( ) ;
USB_INT_DisableAllInterrupts ( ) ;
USB_INT_DisableAllInterrupts ( ) ;
USB_INT_ClearAllInterrupts ( ) ;
USB_INT_ClearAllInterrupts ( ) ;
# if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)
USB_Detach ( ) ;
UHWCON & = ~ ( 1 < < UIMOD ) ;
USB_Controller_Disable ( ) ;
# endif
if ( ! ( USB_Options & USB_OPT_MANUAL_PLL ) )
if ( ! ( USB_Options & USB_OPT_MANUAL_PLL ) )
USB_PLL_Off ( ) ;
USB_PLL_Off ( ) ;
@ -118,37 +96,25 @@ void USB_ShutDown(void)
# endif
# endif
# if defined(USB_CAN_BE_BOTH)
# if defined(USB_CAN_BE_BOTH)
U HWCON & = ~ ( 1 < < UIDE ) ;
U SB_CurrentMode = USB_MODE_NONE ;
# endif
# endif
USB_IsInitialized = false ;
USB_IsInitialized = false ;
# if defined(USB_CAN_BE_BOTH)
USB_CurrentMode = USB_MODE_NONE ;
# endif
}
}
void USB_ResetInterface ( void )
void USB_ResetInterface ( void )
{
{
bool UIDModeSelectEnabled = ( ( UHWCON & ( 1 < < UIDE ) ) ! = 0 ) ;
USB_INT_DisableAllInterrupts ( ) ;
USB_INT_DisableAllInterrupts ( ) ;
USB_INT_ClearAllInterrupts ( ) ;
USB_INT_ClearAllInterrupts ( ) ;
# if defined(USB_CAN_BE_HOST)
USB_Controller_Reset ( ) ;
USB_HostState = HOST_STATE_Unattached ;
# endif
# if defined(USB_CAN_BE_DEVICE)
USB_DeviceState = DEVICE_STATE_Unattached ;
USB_ConfigurationNumber = 0 ;
# if !defined(NO_DEVICE_REMOTE_WAKEUP)
USB_RemoteWakeupEnabled = false ;
# endif
# if !defined(NO_DEVICE_SELF_POWER )
if ( ! ( USB_Options & USB_OPT_REG_DISABLED ) )
USB_CurrentlySelfPowered = false ;
USB_REG_On ( ) ;
# endif
else
# endif
USB_REG_Off ( ) ;
if ( ! ( USB_Options & USB_OPT_MANUAL_PLL ) )
if ( ! ( USB_Options & USB_OPT_MANUAL_PLL ) )
{
{
@ -160,102 +126,96 @@ void USB_ResetInterface(void)
while ( ! ( USB_PLL_IsReady ( ) ) ) ;
while ( ! ( USB_PLL_IsReady ( ) ) ) ;
}
}
USB_C ontroller_Reset ( ) ;
USB_C LK_Unfreeze ( ) ;
# if defined(USB_CAN_BE_BOTH)
# if defined(USB_DEVICE_ONLY) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))
if ( UHWCON & ( 1 < < UIDE ) )
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_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_CurrentMode = = USB_MODE_DEVICE )
{
{
if ( USB_Options & USB_DEVICE_OPT_LOWSPEED )
UHWCON | = ( 1 < < UIMOD ) ;
USB_Device_SetLowSpeed ( ) ;
USB_Init_Device ( ) ;
else
}
USB_Device_SetFullSpeed ( ) ;
else
{
UHWCON & = ~ ( 1 < < UIMOD ) ;
USB_Init_Host ( ) ;
}
}
# endif
# endif
# if (defined(USB_CAN_BE_DEVICE) && !defined(FIXED_CONTROL_ENDPOINT_SIZE))
USB_OTGPAD_On ( ) ;
if ( USB_CurrentMode = = USB_MODE_DEVICE )
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 !defined(FIXED_CONTROL_ENDPOINT_SIZE)
USB_Descriptor_Device_t * DeviceDescriptorPtr ;
if ( CALLBACK_USB_GetDescriptor ( ( DTYPE_Device < < 8 ) , 0 , ( void * ) & DeviceDescriptorPtr ) ! = NO_DESCRIPTOR )
{
{
USB_Descriptor_Device_t * DeviceDescriptorPtr ;
# if defined(USE_RAM_DESCRIPTORS)
USB_ControlEndpointSize = DeviceDescriptorPtr - > Endpoint0Size ;
if ( CALLBACK_USB_GetDescriptor ( ( DTYPE_Device < < 8 ) , 0 , ( void * ) & DeviceDescriptorPtr ) ! = NO_DESCRIPTOR )
# elif defined(USE_EEPROM_DESCRIPTORS)
{
USB_ControlEndpointSize = eeprom_read_byte ( & DeviceDescriptorPtr - > Endpoint0Size ) ;
# if defined(USE_RAM_DESCRIPTORS)
# else
USB_ControlEndpointSize = DeviceDescriptorPtr - > Endpoint0Size ;
USB_ControlEndpointSize = pgm_read_byte ( & DeviceDescriptorPtr - > Endpoint0Size ) ;
# elif defined(USE_EEPROM_DESCRIPTORS)
# endif
USB_ControlEndpointSize = eeprom_read_byte ( & DeviceDescriptorPtr - > Endpoint0Size ) ;
# else
USB_ControlEndpointSize = pgm_read_byte ( & DeviceDescriptorPtr - > Endpoint0Size ) ;
# endif
}
}
}
# endif
# endif
USB_Attach ( ) ;
# 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
# if defined(USB_DEVICE_ONLY)
USB_INT_Clear ( USB_INT_SUSPEND ) ;
USB_INT_Clear ( USB_INT_SUSPEND ) ;
USB_INT_Enable ( USB_INT_SUSPEND ) ;
USB_INT_Enable ( USB_INT_SUSPEND ) ;
USB_INT_Clear ( USB_INT_EORSTI ) ;
USB_INT_Clear ( USB_INT_EORSTI ) ;
USB_INT_Enable ( 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_Host_HostMode_On ( ) ;
USB_CLK_Unfreeze ( ) ;
USB_Host_VBUS_Auto_Off ( ) ;
USB_Host_VBUS_Auto_Off ( ) ;
USB_OTGPAD_Off ( ) ;
USB_Host_VBUS_Manual_Enable ( ) ;
USB_Host_VBUS_Manual_Enable ( ) ;
USB_Host_VBUS_Manual_On ( ) ;
USB_Host_VBUS_Manual_On ( ) ;
USB_INT_Enable ( USB_INT_SRPI ) ;
USB_INT_Enable ( USB_INT_SRPI ) ;
USB_INT_Enable ( USB_INT_BCERRI ) ;
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