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 
  31 #include "USBInterrupt.h" 
  33 void USB_INT_DisableAllInterrupts(void) 
  35         #if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) 
  36         USBCON 
&= ~((1 << VBUSTE
) | (1 << IDTE
));                                
  37         #elif defined(USB_SERIES_4_AVR) 
  38         USBCON 
&= ~(1 << VBUSTE
);                                        
  41         #if defined(USB_CAN_BE_HOST) 
  46         #if defined(USB_CAN_BE_DEVICE) 
  51 void USB_INT_ClearAllInterrupts(void) 
  53         #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) 
  57         #if defined(USB_CAN_BE_HOST) 
  62         #if defined(USB_CAN_BE_DEVICE) 
  67 ISR(USB_GEN_vect
, ISR_BLOCK
) 
  69         #if defined(USB_CAN_BE_DEVICE) 
  70         #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) 
  71         if (USB_INT_HasOccurred(USB_INT_VBUS
) && USB_INT_IsEnabled(USB_INT_VBUS
)) 
  73                 USB_INT_Clear(USB_INT_VBUS
); 
  75                 if (USB_VBUS_GetStatus()) 
  77                         USB_DeviceState 
= DEVICE_STATE_Powered
; 
  78                         EVENT_USB_Device_Connect(); 
  82                         USB_DeviceState 
= DEVICE_STATE_Unattached
;               
  83                         EVENT_USB_Device_Disconnect(); 
  88         if (USB_INT_HasOccurred(USB_INT_SUSPEND
) && USB_INT_IsEnabled(USB_INT_SUSPEND
)) 
  90                 USB_INT_Clear(USB_INT_SUSPEND
); 
  92                 USB_INT_Disable(USB_INT_SUSPEND
); 
  93                 USB_INT_Enable(USB_INT_WAKEUP
); 
  97                 if (!(USB_Options 
& USB_OPT_MANUAL_PLL
)) 
 100                 #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT) 
 101                 USB_DeviceState 
= DEVICE_STATE_Unattached
; 
 102                 EVENT_USB_Device_Disconnect(); 
 104                 USB_DeviceState 
= DEVICE_STATE_Suspended
; 
 105                 EVENT_USB_Device_Suspend(); 
 109         if (USB_INT_HasOccurred(USB_INT_WAKEUP
) && USB_INT_IsEnabled(USB_INT_WAKEUP
)) 
 111                 if (!(USB_Options 
& USB_OPT_MANUAL_PLL
)) 
 114                         while (!(USB_PLL_IsReady())); 
 119                 USB_INT_Clear(USB_INT_WAKEUP
); 
 121                 USB_INT_Disable(USB_INT_WAKEUP
); 
 122                 USB_INT_Enable(USB_INT_SUSPEND
); 
 124                 #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT) 
 125                 USB_DeviceState 
= (USB_ConfigurationNumber
) ? DEVICE_STATE_Configured 
: DEVICE_STATE_Powered
; 
 126                 EVENT_USB_Device_Connect(); 
 128                 USB_DeviceState 
= (USB_ConfigurationNumber
) ? DEVICE_STATE_Configured 
: DEVICE_STATE_Addressed
; 
 129                 EVENT_USB_Device_WakeUp();               
 133         if (USB_INT_HasOccurred(USB_INT_EORSTI
) && USB_INT_IsEnabled(USB_INT_EORSTI
)) 
 135                 USB_INT_Clear(USB_INT_EORSTI
); 
 137                 USB_DeviceState         
= DEVICE_STATE_Default
; 
 138                 USB_ConfigurationNumber 
= 0; 
 140                 USB_INT_Clear(USB_INT_SUSPEND
); 
 141                 USB_INT_Disable(USB_INT_SUSPEND
); 
 142                 USB_INT_Enable(USB_INT_WAKEUP
); 
 144                 Endpoint_ClearEndpoints(); 
 146                 Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP
, EP_TYPE_CONTROL
, 
 147                                            ENDPOINT_DIR_OUT
, USB_ControlEndpointSize
, 
 148                                            ENDPOINT_BANK_SINGLE
); 
 150                 #if defined(INTERRUPT_CONTROL_ENDPOINT) 
 151                 USB_INT_Enable(USB_INT_RXSTPI
); 
 154                 EVENT_USB_Device_Reset(); 
 157         if (USB_INT_HasOccurred(USB_INT_SOFI
) && USB_INT_IsEnabled(USB_INT_SOFI
)) 
 159                 USB_INT_Clear(USB_INT_SOFI
); 
 161                 EVENT_USB_Device_StartOfFrame(); 
 165         #if defined(USB_CAN_BE_HOST) 
 166         if (USB_INT_HasOccurred(USB_INT_DDISCI
) && USB_INT_IsEnabled(USB_INT_DDISCI
)) 
 168                 USB_INT_Clear(USB_INT_DDISCI
); 
 169                 USB_INT_Clear(USB_INT_DCONNI
); 
 170                 USB_INT_Disable(USB_INT_DDISCI
); 
 172                 EVENT_USB_Host_DeviceUnattached(); 
 174                 USB_ResetInterface(); 
 177         if (USB_INT_HasOccurred(USB_INT_VBERRI
) && USB_INT_IsEnabled(USB_INT_VBERRI
)) 
 179                 USB_INT_Clear(USB_INT_VBERRI
); 
 181                 USB_Host_VBUS_Manual_Off(); 
 182                 USB_Host_VBUS_Auto_Off(); 
 184                 EVENT_USB_Host_HostError(HOST_ERROR_VBusVoltageDip
); 
 185                 EVENT_USB_Host_DeviceUnattached(); 
 187                 USB_HostState 
= HOST_STATE_Unattached
; 
 190         if (USB_INT_HasOccurred(USB_INT_SRPI
) && USB_INT_IsEnabled(USB_INT_SRPI
)) 
 192                 USB_INT_Clear(USB_INT_SRPI
); 
 193                 USB_INT_Disable(USB_INT_SRPI
); 
 195                 EVENT_USB_Host_DeviceAttached(); 
 197                 USB_INT_Enable(USB_INT_DDISCI
); 
 199                 USB_HostState 
= HOST_STATE_Powered
; 
 202         if (USB_INT_HasOccurred(USB_INT_BCERRI
) && USB_INT_IsEnabled(USB_INT_BCERRI
)) 
 204                 USB_INT_Clear(USB_INT_BCERRI
); 
 206                 EVENT_USB_Host_DeviceEnumerationFailed(HOST_ENUMERROR_NoDeviceDetected
, 0); 
 207                 EVENT_USB_Host_DeviceUnattached(); 
 209                 USB_ResetInterface(); 
 213         #if defined(USB_CAN_BE_BOTH) 
 214         if (USB_INT_HasOccurred(USB_INT_IDTI
) && USB_INT_IsEnabled(USB_INT_IDTI
)) 
 216                 USB_INT_Clear(USB_INT_IDTI
); 
 218                 if (USB_DeviceState 
!= DEVICE_STATE_Unattached
) 
 219                   EVENT_USB_Device_Disconnect(); 
 221                 if (USB_HostState 
!= HOST_STATE_Unattached
) 
 222                   EVENT_USB_Host_DeviceUnattached(); 
 224                 USB_CurrentMode 
= USB_GetUSBModeFromUID(); 
 225                 EVENT_USB_UIDChange(); 
 227                 USB_ResetInterface(); 
 232 #if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE) 
 233 ISR(USB_COM_vect
, ISR_BLOCK
) 
 235         uint8_t PrevSelectedEndpoint 
= Endpoint_GetCurrentEndpoint(); 
 239         USB_INT_Clear(USB_INT_RXSTPI
); 
 241         Endpoint_SelectEndpoint(PrevSelectedEndpoint
);