]> git.donarmstrong.com Git - qmk_firmware.git/blob - protocol/lufa/LUFA-120730/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c
Change TOP_DIR to TMK_DIR in makefiles
[qmk_firmware.git] / protocol / lufa / LUFA-120730 / LUFA / Drivers / USB / Core / UC3 / USBInterrupt_UC3.c
1 /*\r
2              LUFA Library\r
3      Copyright (C) Dean Camera, 2012.\r
4 \r
5   dean [at] fourwalledcubicle [dot] com\r
6            www.lufa-lib.org\r
7 */\r
8 \r
9 /*\r
10   Copyright 2012  Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
11 \r
12   Permission to use, copy, modify, distribute, and sell this\r
13   software and its documentation for any purpose is hereby granted\r
14   without fee, provided that the above copyright notice appear in\r
15   all copies and that both that the copyright notice and this\r
16   permission notice and warranty disclaimer appear in supporting\r
17   documentation, and that the name of the author not be used in\r
18   advertising or publicity pertaining to distribution of the\r
19   software without specific, written prior permission.\r
20 \r
21   The author disclaim all warranties with regard to this\r
22   software, including all implied warranties of merchantability\r
23   and fitness.  In no event shall the author be liable for any\r
24   special, indirect or consequential damages or any damages\r
25   whatsoever resulting from loss of use, data or profits, whether\r
26   in an action of contract, negligence or other tortious action,\r
27   arising out of or in connection with the use or performance of\r
28   this software.\r
29 */\r
30 \r
31 #include "../../../../Common/Common.h"\r
32 #if (ARCH == ARCH_UC3)\r
33 \r
34 #define  __INCLUDE_FROM_USB_DRIVER\r
35 #include "../USBInterrupt.h"\r
36 \r
37 void USB_INT_DisableAllInterrupts(void)\r
38 {\r
39         AVR32_USBB.USBCON.vbuste     = false;\r
40         AVR32_USBB.USBCON.idte       = false;\r
41 \r
42         AVR32_USBB.uhinteclr         = -1;\r
43         AVR32_USBB.udinteclr         = -1;\r
44 }\r
45 \r
46 void USB_INT_ClearAllInterrupts(void)\r
47 {\r
48         AVR32_USBB.USBSTACLR.vbustic = true;\r
49         AVR32_USBB.USBSTACLR.idtic   = true;\r
50 \r
51         AVR32_USBB.uhintclr          = -1;\r
52         AVR32_USBB.udintclr          = -1;\r
53 }\r
54 \r
55 ISR(USB_GEN_vect)\r
56 {\r
57         #if defined(USB_CAN_BE_DEVICE)\r
58         #if !defined(NO_SOF_EVENTS)\r
59         if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI))\r
60         {\r
61                 USB_INT_Clear(USB_INT_SOFI);\r
62 \r
63                 EVENT_USB_Device_StartOfFrame();\r
64         }\r
65         #endif\r
66 \r
67         if (USB_INT_HasOccurred(USB_INT_VBUSTI) && USB_INT_IsEnabled(USB_INT_VBUSTI))\r
68         {\r
69                 USB_INT_Clear(USB_INT_VBUSTI);\r
70 \r
71                 if (USB_VBUS_GetStatus())\r
72                 {\r
73                         USB_DeviceState = DEVICE_STATE_Powered;\r
74                         EVENT_USB_Device_Connect();\r
75                 }\r
76                 else\r
77                 {\r
78                         USB_DeviceState = DEVICE_STATE_Unattached;\r
79                         EVENT_USB_Device_Disconnect();\r
80                 }\r
81         }\r
82 \r
83         if (USB_INT_HasOccurred(USB_INT_SUSPI) && USB_INT_IsEnabled(USB_INT_SUSPI))\r
84         {\r
85                 USB_INT_Disable(USB_INT_SUSPI);\r
86                 USB_INT_Enable(USB_INT_WAKEUPI);\r
87 \r
88                 USB_CLK_Freeze();\r
89 \r
90                 USB_DeviceState = DEVICE_STATE_Suspended;\r
91                 EVENT_USB_Device_Suspend();\r
92         }\r
93 \r
94         if (USB_INT_HasOccurred(USB_INT_WAKEUPI) && USB_INT_IsEnabled(USB_INT_WAKEUPI))\r
95         {\r
96                 USB_CLK_Unfreeze();\r
97 \r
98                 USB_INT_Clear(USB_INT_WAKEUPI);\r
99 \r
100                 USB_INT_Disable(USB_INT_WAKEUPI);\r
101                 USB_INT_Enable(USB_INT_SUSPI);\r
102 \r
103                 if (USB_Device_ConfigurationNumber)\r
104                   USB_DeviceState = DEVICE_STATE_Configured;\r
105                 else\r
106                   USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered;\r
107 \r
108                 EVENT_USB_Device_WakeUp();\r
109         }\r
110 \r
111         if (USB_INT_HasOccurred(USB_INT_EORSTI) && USB_INT_IsEnabled(USB_INT_EORSTI))\r
112         {\r
113                 USB_INT_Clear(USB_INT_EORSTI);\r
114 \r
115                 USB_DeviceState                = DEVICE_STATE_Default;\r
116                 USB_Device_ConfigurationNumber = 0;\r
117 \r
118                 USB_INT_Clear(USB_INT_SUSPI);\r
119                 USB_INT_Disable(USB_INT_SUSPI);\r
120                 USB_INT_Enable(USB_INT_WAKEUPI);\r
121 \r
122                 USB_Device_SetDeviceAddress(0);\r
123                 Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,\r
124                                            USB_Device_ControlEndpointSize, 1);\r
125 \r
126                 #if defined(INTERRUPT_CONTROL_ENDPOINT)\r
127                 USB_INT_Enable(USB_INT_RXSTPI);\r
128                 #endif\r
129 \r
130                 EVENT_USB_Device_Reset();\r
131         }\r
132         #endif\r
133 \r
134         #if defined(USB_CAN_BE_HOST)\r
135         #if !defined(NO_SOF_EVENTS)\r
136         if (USB_INT_HasOccurred(USB_INT_HSOFI) && USB_INT_IsEnabled(USB_INT_HSOFI))\r
137         {\r
138                 USB_INT_Clear(USB_INT_HSOFI);\r
139 \r
140                 EVENT_USB_Host_StartOfFrame();\r
141         }\r
142         #endif\r
143 \r
144         if (USB_INT_HasOccurred(USB_INT_DDISCI) && USB_INT_IsEnabled(USB_INT_DDISCI))\r
145         {\r
146                 USB_INT_Clear(USB_INT_DDISCI);\r
147                 USB_INT_Clear(USB_INT_DCONNI);\r
148                 USB_INT_Disable(USB_INT_DDISCI);\r
149 \r
150                 EVENT_USB_Host_DeviceUnattached();\r
151 \r
152                 USB_ResetInterface();\r
153         }\r
154 \r
155         if (USB_INT_HasOccurred(USB_INT_VBERRI) && USB_INT_IsEnabled(USB_INT_VBERRI))\r
156         {\r
157                 USB_INT_Clear(USB_INT_VBERRI);\r
158 \r
159                 USB_Host_VBUS_Manual_Off();\r
160                 USB_Host_VBUS_Auto_Off();\r
161 \r
162                 EVENT_USB_Host_HostError(HOST_ERROR_VBusVoltageDip);\r
163                 EVENT_USB_Host_DeviceUnattached();\r
164 \r
165                 USB_HostState = HOST_STATE_Unattached;\r
166         }\r
167 \r
168         if (USB_INT_HasOccurred(USB_INT_DCONNI) && USB_INT_IsEnabled(USB_INT_DCONNI))\r
169         {\r
170                 USB_INT_Clear(USB_INT_DCONNI);\r
171                 USB_INT_Disable(USB_INT_DCONNI);\r
172 \r
173                 EVENT_USB_Host_DeviceAttached();\r
174 \r
175                 USB_INT_Enable(USB_INT_DDISCI);\r
176 \r
177                 USB_HostState = HOST_STATE_Powered;\r
178         }\r
179 \r
180         if (USB_INT_HasOccurred(USB_INT_BCERRI) && USB_INT_IsEnabled(USB_INT_BCERRI))\r
181         {\r
182                 USB_INT_Clear(USB_INT_BCERRI);\r
183 \r
184                 EVENT_USB_Host_DeviceEnumerationFailed(HOST_ENUMERROR_NoDeviceDetected, 0);\r
185                 EVENT_USB_Host_DeviceUnattached();\r
186 \r
187                 USB_ResetInterface();\r
188         }\r
189         #endif\r
190 \r
191         #if defined(USB_CAN_BE_BOTH)\r
192         if (USB_INT_HasOccurred(USB_INT_IDTI) && USB_INT_IsEnabled(USB_INT_IDTI))\r
193         {\r
194                 USB_INT_Clear(USB_INT_IDTI);\r
195 \r
196                 if (USB_DeviceState != DEVICE_STATE_Unattached)\r
197                   EVENT_USB_Device_Disconnect();\r
198 \r
199                 if (USB_HostState != HOST_STATE_Unattached)\r
200                   EVENT_USB_Host_DeviceUnattached();\r
201 \r
202                 USB_CurrentMode = USB_GetUSBModeFromUID();\r
203                 USB_ResetInterface();\r
204 \r
205                 EVENT_USB_UIDChange();\r
206         }\r
207         #endif\r
208 }\r
209 \r
210 #if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE)\r
211 ISR(USB_COM_vect)\r
212 {\r
213         uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint();\r
214 \r
215         Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);\r
216         USB_INT_Disable(USB_INT_RXSTPI);\r
217 \r
218         GlobalInterruptEnable();\r
219 \r
220         USB_Device_ProcessControlRequest();\r
221 \r
222         Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);\r
223         USB_INT_Enable(USB_INT_RXSTPI);\r
224         Endpoint_SelectEndpoint(PrevSelectedEndpoint);\r
225 }\r
226 #endif\r
227 \r
228 #endif\r