3      Copyright (C) Dean Camera, 2013. 
   5   dean [at] fourwalledcubicle [dot] com 
  10   Copyright 2013  Dean Camera (dean [at] fourwalledcubicle [dot] com) 
  12   Permission to use, copy, modify, distribute, and sell this 
  13   software and its documentation for any purpose is hereby granted 
  14   without fee, provided that the above copyright notice appear in 
  15   all 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 disclaims 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 
  31 #include "../../../../Common/Common.h" 
  32 #if (ARCH == ARCH_AVR8) 
  34 #define  __INCLUDE_FROM_USB_DRIVER 
  35 #define  __INCLUDE_FROM_USB_CONTROLLER_C 
  36 #include "../USBController.h" 
  38 #if defined(USB_CAN_BE_BOTH) 
  39 volatile uint8_t USB_CurrentMode 
= USB_MODE_None
; 
  42 #if !defined(USE_STATIC_OPTIONS) 
  43 volatile uint8_t USB_Options
; 
  47                #if defined(USB_CAN_BE_BOTH) 
  51                #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS)) 
  53                #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS)) 
  57                #if !defined(USE_STATIC_OPTIONS) 
  62         #if !defined(USE_STATIC_OPTIONS) 
  63         USB_Options 
= Options
; 
  66         #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) 
  67         /* Workaround for AVR8 bootloaders that fail to turn off the OTG pad before running 
  68          * the loaded application. This causes VBUS detection to fail unless we first force 
  69          * it off to reset it. */ 
  73         if (!(USB_Options 
& USB_OPT_REG_DISABLED
)) 
  78         if (!(USB_Options 
& USB_OPT_MANUAL_PLL
)) 
  80                 #if defined(USB_SERIES_4_AVR) 
  81                 PLLFRQ 
= (1 << PDIV2
); 
  85         #if defined(USB_CAN_BE_BOTH) 
  86         if (Mode 
== USB_MODE_UID
) 
  88                 UHWCON 
|=  (1 << UIDE
); 
  89                 USB_INT_Enable(USB_INT_IDTI
); 
  90                 USB_CurrentMode 
= USB_GetUSBModeFromUID(); 
  94                 UHWCON 
&= ~(1 << UIDE
); 
  95                 USB_CurrentMode 
= Mode
; 
  99         USB_IsInitialized 
= true; 
 101         USB_ResetInterface(); 
 104 void USB_Disable(void) 
 106         USB_INT_DisableAllInterrupts(); 
 107         USB_INT_ClearAllInterrupts(); 
 110         USB_Controller_Disable(); 
 112         if (!(USB_Options 
& USB_OPT_MANUAL_PLL
)) 
 117         #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) 
 121         #if defined(USB_CAN_BE_BOTH) 
 122         USB_CurrentMode 
= USB_MODE_None
; 
 125         USB_IsInitialized 
= false; 
 128 void USB_ResetInterface(void) 
 130         #if defined(USB_CAN_BE_BOTH) 
 131         bool UIDModeSelectEnabled 
= ((UHWCON 
& (1 << UIDE
)) != 0); 
 134         USB_INT_DisableAllInterrupts(); 
 135         USB_INT_ClearAllInterrupts(); 
 137         USB_Controller_Reset(); 
 139         #if defined(USB_CAN_BE_BOTH) 
 140         if (UIDModeSelectEnabled
) 
 141           USB_INT_Enable(USB_INT_IDTI
); 
 146         if (USB_CurrentMode 
== USB_MODE_Device
) 
 148                 #if defined(USB_CAN_BE_DEVICE) 
 149                 #if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) 
 150                 UHWCON 
|=  (1 << UIMOD
); 
 153                 if (!(USB_Options 
& USB_OPT_MANUAL_PLL
)) 
 155                         #if defined(USB_SERIES_2_AVR) 
 157                         while (!(USB_PLL_IsReady())); 
 166         else if (USB_CurrentMode 
== USB_MODE_Host
) 
 168                 #if defined(USB_CAN_BE_HOST) 
 169                 UHWCON 
&= ~(1 << UIMOD
); 
 171                 if (!(USB_Options 
& USB_OPT_MANUAL_PLL
)) 
 173                         #if defined(USB_CAN_BE_HOST) 
 175                         while (!(USB_PLL_IsReady())); 
 183         #if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) 
 188 #if defined(USB_CAN_BE_DEVICE) 
 189 static void USB_Init_Device(void) 
 191         USB_DeviceState                 
= DEVICE_STATE_Unattached
; 
 192         USB_Device_ConfigurationNumber  
= 0; 
 194         #if !defined(NO_DEVICE_REMOTE_WAKEUP) 
 195         USB_Device_RemoteWakeupEnabled  
= false; 
 198         #if !defined(NO_DEVICE_SELF_POWER) 
 199         USB_Device_CurrentlySelfPowered 
= false; 
 202         #if !defined(FIXED_CONTROL_ENDPOINT_SIZE) 
 203         USB_Descriptor_Device_t
* DeviceDescriptorPtr
; 
 205         #if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \ 
 206             !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS)) 
 207         uint8_t DescriptorAddressSpace
; 
 209         if (CALLBACK_USB_GetDescriptor((DTYPE_Device 
<< 8), 0, (void*)&DeviceDescriptorPtr
, &DescriptorAddressSpace
) != NO_DESCRIPTOR
) 
 211                 if (DescriptorAddressSpace 
== MEMSPACE_FLASH
) 
 212                   USB_Device_ControlEndpointSize 
= pgm_read_byte(&DeviceDescriptorPtr
->Endpoint0Size
); 
 213                 else if (DescriptorAddressSpace 
== MEMSPACE_EEPROM
) 
 214                   USB_Device_ControlEndpointSize 
= eeprom_read_byte(&DeviceDescriptorPtr
->Endpoint0Size
); 
 216                   USB_Device_ControlEndpointSize 
= DeviceDescriptorPtr
->Endpoint0Size
; 
 219         if (CALLBACK_USB_GetDescriptor((DTYPE_Device 
<< 8), 0, (void*)&DeviceDescriptorPtr
) != NO_DESCRIPTOR
) 
 221                 #if defined(USE_RAM_DESCRIPTORS) 
 222                 USB_Device_ControlEndpointSize 
= DeviceDescriptorPtr
->Endpoint0Size
; 
 223                 #elif defined(USE_EEPROM_DESCRIPTORS) 
 224                 USB_Device_ControlEndpointSize 
= eeprom_read_byte(&DeviceDescriptorPtr
->Endpoint0Size
); 
 226                 USB_Device_ControlEndpointSize 
= pgm_read_byte(&DeviceDescriptorPtr
->Endpoint0Size
); 
 232         #if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) 
 233         if (USB_Options 
& USB_DEVICE_OPT_LOWSPEED
) 
 234           USB_Device_SetLowSpeed(); 
 236           USB_Device_SetFullSpeed(); 
 238         USB_INT_Enable(USB_INT_VBUSTI
); 
 241         Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP
, EP_TYPE_CONTROL
, 
 242                                                            USB_Device_ControlEndpointSize
, 1); 
 244         USB_INT_Clear(USB_INT_SUSPI
); 
 245         USB_INT_Enable(USB_INT_SUSPI
); 
 246         USB_INT_Enable(USB_INT_EORSTI
); 
 252 #if defined(USB_CAN_BE_HOST) 
 253 static void USB_Init_Host(void) 
 255         USB_HostState                
= HOST_STATE_Unattached
; 
 256         USB_Host_ConfigurationNumber 
= 0; 
 257         USB_Host_ControlPipeSize     
= PIPE_CONTROLPIPE_DEFAULT_SIZE
; 
 259         USB_Host_HostMode_On(); 
 261         USB_Host_VBUS_Auto_Off(); 
 262         USB_Host_VBUS_Manual_Enable(); 
 263         USB_Host_VBUS_Manual_On(); 
 265         USB_INT_Enable(USB_INT_SRPI
); 
 266         USB_INT_Enable(USB_INT_BCERRI
);