3      Copyright (C) Dean Camera, 2009. 
   5   dean [at] fourwalledcubicle [dot] com 
   6       www.fourwalledcubicle.com 
  10   Copyright 2009  Dean Camera (dean [at] fourwalledcubicle [dot] com) 
  12   Permission to use, copy, modify, and distribute this software 
  13   and its documentation for any purpose and without fee is hereby 
  14   granted, provided that the above copyright notice appear in all 
  15   copies and that both that the copyright notice and this 
  16   permission notice and warranty disclaimer appear in supporting 
  17   documentation, and that the name of the author not be used in 
  18   advertising or publicity pertaining to distribution of the 
  19   software without specific, written prior permission. 
  21   The author disclaim all warranties with regard to this 
  22   software, including all implied warranties of merchantability 
  23   and fitness.  In no event shall the author be liable for any 
  24   special, indirect or consequential damages or any damages 
  25   whatsoever resulting from loss of use, data or profits, whether 
  26   in an action of contract, negligence or other tortious action, 
  27   arising out of or in connection with the use or performance of 
  33 #if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY)) 
  34 volatile uint8_t USB_CurrentMode 
= USB_MODE_NONE
; 
  37 #if !defined(USE_STATIC_OPTIONS) 
  38 volatile uint8_t USB_Options
; 
  42                #if defined(USB_CAN_BE_BOTH) 
  46                #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS)) 
  48                #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS)) 
  52                #if !defined(USE_STATIC_OPTIONS) 
  59         #if defined(USB_CAN_BE_BOTH) 
  60         USB_CurrentMode 
= Mode
; 
  63         #if !defined(USE_STATIC_OPTIONS) 
  64         USB_Options 
= Options
; 
  67         #if defined(USB_CAN_BE_HOST) 
  68         USB_ControlPipeSize 
= PIPE_CONTROLPIPE_DEFAULT_SIZE
; 
  71         #if defined(USB_DEVICE_ONLY) && (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) 
  72         UHWCON 
|= (1 << UIMOD
); 
  73         #elif defined(USB_HOST_ONLY) 
  74         UHWCON 
&= ~(1 << UIMOD
); 
  75         #elif defined(USB_CAN_BE_BOTH) 
  76         if (Mode 
== USB_MODE_UID
) 
  78                 UHWCON 
|=  (1 << UIDE
); 
  80                 USB_INT_Clear(USB_INT_IDTI
); 
  81                 USB_INT_Enable(USB_INT_IDTI
); 
  83                 USB_CurrentMode 
= USB_GetUSBModeFromUID(); 
  85         else if (Mode 
== USB_MODE_DEVICE
) 
  87                 UHWCON 
|=  (1 << UIMOD
); 
  89         else if (Mode 
== USB_MODE_HOST
)                  
  91                 UHWCON 
&= ~(1 << UIMOD
); 
  95                 EVENT_USB_InitFailure(USB_INITERROR_NoUSBModeSpecified
); 
 100         USB_ResetInterface(); 
 102         #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) 
 106         USB_IsInitialized 
= true; 
 111 void USB_ShutDown(void) 
 114           EVENT_USB_Disconnect(); 
 118         USB_INT_DisableAllInterrupts(); 
 119         USB_INT_ClearAllInterrupts(); 
 121         USB_IsConnected   
= false; 
 122         USB_IsInitialized 
= false; 
 124         #if defined(USB_CAN_BE_HOST) 
 125         USB_HostState 
= HOST_STATE_Unattached
; 
 128         #if defined(USB_CAN_BE_DEVICE) 
 129         USB_ConfigurationNumber 
= 0; 
 132         #if defined(CAN_BE_BOTH) 
 133         USB_CurrentMode 
= USB_MODE_NONE
; 
 136         USB_Interface_Disable(); 
 139         #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) 
 143         #if defined(USB_CAN_BE_BOTH) 
 144         UHWCON 
&= ~(1 << UIDE
); 
 148 void USB_ResetInterface(void) 
 150         USB_INT_DisableAllInterrupts(); 
 151         USB_INT_ClearAllInterrupts(); 
 153         USB_IsConnected 
= false; 
 155         #if defined(USB_CAN_BE_HOST) 
 156         USB_HostState 
= HOST_STATE_Unattached
; 
 159         #if defined(USB_CAN_BE_DEVICE) 
 160         USB_ConfigurationNumber  
= 0; 
 161         USB_IsSuspended          
= false; 
 162         USB_RemoteWakeupEnabled  
= false; 
 163         USB_CurrentlySelfPowered 
= false; 
 166         if (!(USB_Options 
& USB_OPT_MANUAL_PLL
)) 
 168                 #if defined(USB_SERIES_4_AVR) 
 169                 PLLFRQ 
= ((1 << PLLUSB
) | (1 << PDIV3
) | (1 << PDIV1
)); 
 173                 while (!(USB_PLL_IsReady())); 
 176         USB_Interface_Reset(); 
 178         #if defined(USB_CAN_BE_BOTH) 
 179         if (UHWCON 
& (1 << UIDE
)) 
 181                 USB_INT_Clear(USB_INT_IDTI
); 
 182                 USB_INT_Enable(USB_INT_IDTI
); 
 183                 USB_CurrentMode 
= USB_GetUSBModeFromUID(); 
 187         if (!(USB_Options 
& USB_OPT_REG_DISABLED
)) 
 192         #if (defined(USB_CAN_BE_DEVICE) && (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR))) 
 193         if (USB_CurrentMode 
== USB_MODE_DEVICE
) 
 195                 if (USB_Options 
& USB_DEVICE_OPT_LOWSPEED
) 
 196                   USB_Device_SetLowSpeed(); 
 198                   USB_Device_SetHighSpeed(); 
 200                 USB_INT_Enable(USB_INT_VBUS
); 
 204         #if (defined(USB_CAN_BE_DEVICE) && !defined(FIXED_CONTROL_ENDPOINT_SIZE)) 
 205         if (USB_CurrentMode 
== USB_MODE_DEVICE
) 
 207                 USB_Descriptor_Device_t
* DeviceDescriptorPtr
; 
 209                 if (CALLBACK_USB_GetDescriptor((DTYPE_Device 
<< 8), 0, (void*)&DeviceDescriptorPtr
) != NO_DESCRIPTOR
) 
 211                         #if defined(USE_RAM_DESCRIPTORS) 
 212                                 USB_ControlEndpointSize 
= DeviceDescriptorPtr
->Endpoint0Size
; 
 213                         #elif defined(USE_EEPROM_DESCRIPTORS) 
 214                                 USB_ControlEndpointSize 
= eeprom_read_byte(&DeviceDescriptorPtr
->Endpoint0Size
); 
 216                                 USB_ControlEndpointSize 
= pgm_read_byte(&DeviceDescriptorPtr
->Endpoint0Size
); 
 224         #if defined(USB_DEVICE_ONLY)     
 225         USB_INT_Enable(USB_INT_SUSPEND
); 
 226         USB_INT_Enable(USB_INT_EORSTI
); 
 227         #if defined(CONTROL_ONLY_DEVICE) 
 228         UENUM 
= ENDPOINT_CONTROLEP
; 
 231         #elif defined(USB_HOST_ONLY) 
 232         USB_Host_HostMode_On(); 
 234         USB_Host_VBUS_Auto_Off(); 
 237         USB_Host_VBUS_Manual_Enable(); 
 238         USB_Host_VBUS_Manual_On(); 
 240         USB_INT_Enable(USB_INT_SRPI
); 
 241         USB_INT_Enable(USB_INT_BCERRI
); 
 243         if (USB_CurrentMode 
== USB_MODE_DEVICE
) 
 245                 USB_INT_Enable(USB_INT_SUSPEND
); 
 246                 USB_INT_Enable(USB_INT_EORSTI
); 
 248                 #if defined(CONTROL_ONLY_DEVICE) 
 249                 UENUM 
= ENDPOINT_CONTROLEP
; 
 252         else if (USB_CurrentMode 
== USB_MODE_HOST
) 
 254                 USB_Host_HostMode_On(); 
 256                 USB_Host_VBUS_Auto_Off(); 
 259                 USB_Host_VBUS_Manual_Enable(); 
 260                 USB_Host_VBUS_Manual_On(); 
 262                 USB_INT_Enable(USB_INT_SRPI
); 
 263                 USB_INT_Enable(USB_INT_BCERRI
);