]> git.donarmstrong.com Git - qmk_firmware.git/blob - protocol/lufa/LUFA-120730/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c
Change TOP_DIR to TMK_DIR in makefiles
[qmk_firmware.git] / protocol / lufa / LUFA-120730 / LUFA / Drivers / USB / Core / AVR8 / USBInterrupt_AVR8.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_AVR8)\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         #if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)\r
40         USBCON &= ~((1 << VBUSTE) | (1 << IDTE));\r
41         #elif defined(USB_SERIES_4_AVR)\r
42         USBCON &= ~(1 << VBUSTE);\r
43         #endif\r
44 \r
45         #if defined(USB_CAN_BE_BOTH)\r
46         OTGIEN  = 0;\r
47         #endif\r
48 \r
49         #if defined(USB_CAN_BE_HOST)\r
50         UHIEN   = 0;\r
51         #endif\r
52 \r
53         #if defined(USB_CAN_BE_DEVICE)\r
54         UDIEN   = 0;\r
55         #endif\r
56 }\r
57 \r
58 void USB_INT_ClearAllInterrupts(void)\r
59 {\r
60         #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)\r
61         USBINT = 0;\r
62         #endif\r
63 \r
64         #if defined(USB_CAN_BE_BOTH)\r
65         OTGINT = 0;\r
66         #endif\r
67 \r
68         #if defined(USB_CAN_BE_HOST)\r
69         UHINT  = 0;\r
70         #endif\r
71 \r
72         #if defined(USB_CAN_BE_DEVICE)\r
73         UDINT  = 0;\r
74         #endif\r
75 }\r
76 \r
77 ISR(USB_GEN_vect, ISR_BLOCK)\r
78 {\r
79         #if defined(USB_CAN_BE_DEVICE)\r
80         #if !defined(NO_SOF_EVENTS)\r
81         if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI))\r
82         {\r
83                 USB_INT_Clear(USB_INT_SOFI);\r
84 \r
85                 EVENT_USB_Device_StartOfFrame();\r
86         }\r
87         #endif\r
88 \r
89         #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)\r
90         if (USB_INT_HasOccurred(USB_INT_VBUSTI) && USB_INT_IsEnabled(USB_INT_VBUSTI))\r
91         {\r
92                 USB_INT_Clear(USB_INT_VBUSTI);\r
93 \r
94                 if (USB_VBUS_GetStatus())\r
95                 {\r
96                         if (!(USB_Options & USB_OPT_MANUAL_PLL))\r
97                         {\r
98                                 USB_PLL_On();\r
99                                 while (!(USB_PLL_IsReady()));\r
100                         }\r
101 \r
102                         USB_DeviceState = DEVICE_STATE_Powered;\r
103                         EVENT_USB_Device_Connect();\r
104                 }\r
105                 else\r
106                 {\r
107                         if (!(USB_Options & USB_OPT_MANUAL_PLL))\r
108                           USB_PLL_Off();\r
109 \r
110                         USB_DeviceState = DEVICE_STATE_Unattached;\r
111                         EVENT_USB_Device_Disconnect();\r
112                 }\r
113         }\r
114         #endif\r
115 \r
116         if (USB_INT_HasOccurred(USB_INT_SUSPI) && USB_INT_IsEnabled(USB_INT_SUSPI))\r
117         {\r
118                 USB_INT_Disable(USB_INT_SUSPI);\r
119                 USB_INT_Enable(USB_INT_WAKEUPI);\r
120 \r
121                 USB_CLK_Freeze();\r
122 \r
123                 if (!(USB_Options & USB_OPT_MANUAL_PLL))\r
124                   USB_PLL_Off();\r
125 \r
126                 #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT)\r
127                 USB_DeviceState = DEVICE_STATE_Unattached;\r
128                 EVENT_USB_Device_Disconnect();\r
129                 #else\r
130                 USB_DeviceState = DEVICE_STATE_Suspended;\r
131                 EVENT_USB_Device_Suspend();\r
132                 #endif\r
133         }\r
134 \r
135         if (USB_INT_HasOccurred(USB_INT_WAKEUPI) && USB_INT_IsEnabled(USB_INT_WAKEUPI))\r
136         {\r
137                 if (!(USB_Options & USB_OPT_MANUAL_PLL))\r
138                 {\r
139                         USB_PLL_On();\r
140                         while (!(USB_PLL_IsReady()));\r
141                 }\r
142 \r
143                 USB_CLK_Unfreeze();\r
144 \r
145                 USB_INT_Clear(USB_INT_WAKEUPI);\r
146 \r
147                 USB_INT_Disable(USB_INT_WAKEUPI);\r
148                 USB_INT_Enable(USB_INT_SUSPI);\r
149 \r
150                 if (USB_Device_ConfigurationNumber)\r
151                   USB_DeviceState = DEVICE_STATE_Configured;\r
152                 else\r
153                   USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered;\r
154 \r
155                 #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT)\r
156                 EVENT_USB_Device_Connect();\r
157                 #else\r
158                 EVENT_USB_Device_WakeUp();\r
159                 #endif\r
160         }\r
161 \r
162         if (USB_INT_HasOccurred(USB_INT_EORSTI) && USB_INT_IsEnabled(USB_INT_EORSTI))\r
163         {\r
164                 USB_INT_Clear(USB_INT_EORSTI);\r
165 \r
166                 USB_DeviceState                = DEVICE_STATE_Default;\r
167                 USB_Device_ConfigurationNumber = 0;\r
168 \r
169                 USB_INT_Clear(USB_INT_SUSPI);\r
170                 USB_INT_Disable(USB_INT_SUSPI);\r
171                 USB_INT_Enable(USB_INT_WAKEUPI);\r
172 \r
173                 Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,\r
174                                            USB_Device_ControlEndpointSize, 1);\r
175 \r
176                 #if defined(INTERRUPT_CONTROL_ENDPOINT)\r
177                 USB_INT_Enable(USB_INT_RXSTPI);\r
178                 #endif\r
179 \r
180                 EVENT_USB_Device_Reset();\r
181         }\r
182         #endif\r
183 \r
184         #if defined(USB_CAN_BE_HOST)\r
185         #if !defined(NO_SOF_EVENTS)\r
186         if (USB_INT_HasOccurred(USB_INT_HSOFI) && USB_INT_IsEnabled(USB_INT_HSOFI))\r
187         {\r
188                 USB_INT_Clear(USB_INT_HSOFI);\r
189 \r
190                 EVENT_USB_Host_StartOfFrame();\r
191         }\r
192         #endif\r
193 \r
194         if (USB_INT_HasOccurred(USB_INT_DDISCI) && USB_INT_IsEnabled(USB_INT_DDISCI))\r
195         {\r
196                 USB_INT_Clear(USB_INT_DDISCI);\r
197                 USB_INT_Clear(USB_INT_DCONNI);\r
198                 USB_INT_Disable(USB_INT_DDISCI);\r
199 \r
200                 EVENT_USB_Host_DeviceUnattached();\r
201 \r
202                 USB_ResetInterface();\r
203         }\r
204 \r
205         if (USB_INT_HasOccurred(USB_INT_VBERRI) && USB_INT_IsEnabled(USB_INT_VBERRI))\r
206         {\r
207                 USB_INT_Clear(USB_INT_VBERRI);\r
208 \r
209                 USB_Host_VBUS_Manual_Off();\r
210                 USB_Host_VBUS_Auto_Off();\r
211 \r
212                 EVENT_USB_Host_HostError(HOST_ERROR_VBusVoltageDip);\r
213                 EVENT_USB_Host_DeviceUnattached();\r
214 \r
215                 USB_HostState = HOST_STATE_Unattached;\r
216         }\r
217 \r
218         if (USB_INT_HasOccurred(USB_INT_SRPI) && USB_INT_IsEnabled(USB_INT_SRPI))\r
219         {\r
220                 USB_INT_Clear(USB_INT_SRPI);\r
221                 USB_INT_Disable(USB_INT_SRPI);\r
222 \r
223                 EVENT_USB_Host_DeviceAttached();\r
224 \r
225                 USB_INT_Enable(USB_INT_DDISCI);\r
226 \r
227                 USB_HostState = HOST_STATE_Powered;\r
228         }\r
229 \r
230         if (USB_INT_HasOccurred(USB_INT_BCERRI) && USB_INT_IsEnabled(USB_INT_BCERRI))\r
231         {\r
232                 USB_INT_Clear(USB_INT_BCERRI);\r
233 \r
234                 EVENT_USB_Host_DeviceEnumerationFailed(HOST_ENUMERROR_NoDeviceDetected, 0);\r
235                 EVENT_USB_Host_DeviceUnattached();\r
236 \r
237                 USB_ResetInterface();\r
238         }\r
239         #endif\r
240 \r
241         #if defined(USB_CAN_BE_BOTH)\r
242         if (USB_INT_HasOccurred(USB_INT_IDTI) && USB_INT_IsEnabled(USB_INT_IDTI))\r
243         {\r
244                 USB_INT_Clear(USB_INT_IDTI);\r
245 \r
246                 if (USB_DeviceState != DEVICE_STATE_Unattached)\r
247                   EVENT_USB_Device_Disconnect();\r
248 \r
249                 if (USB_HostState != HOST_STATE_Unattached)\r
250                   EVENT_USB_Host_DeviceUnattached();\r
251 \r
252                 USB_CurrentMode = USB_GetUSBModeFromUID();\r
253                 USB_ResetInterface();\r
254 \r
255                 EVENT_USB_UIDChange();\r
256         }\r
257         #endif\r
258 }\r
259 \r
260 #if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE)\r
261 ISR(USB_COM_vect, ISR_BLOCK)\r
262 {\r
263         uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint();\r
264 \r
265         Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);\r
266         USB_INT_Disable(USB_INT_RXSTPI);\r
267 \r
268         GlobalInterruptEnable();\r
269 \r
270         USB_Device_ProcessControlRequest();\r
271 \r
272         Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP);\r
273         USB_INT_Enable(USB_INT_RXSTPI);\r
274         Endpoint_SelectEndpoint(PrevSelectedEndpoint);\r
275 }\r
276 #endif\r
277 \r
278 #endif\r
279 \r