]> git.donarmstrong.com Git - qmk_firmware.git/blob - protocol/lufa/LUFA-120730/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h
Squashed 'tmk_core/' content from commit 05caacc
[qmk_firmware.git] / protocol / lufa / LUFA-120730 / LUFA / Drivers / USB / Core / UC3 / USBInterrupt_UC3.h
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 /** \file\r
32  *  \brief USB Controller Interrupt definitions for the AVR32 UC3 microcontrollers.\r
33  *\r
34  *  This file contains definitions required for the correct handling of low level USB service routine interrupts\r
35  *  from the USB controller.\r
36  *\r
37  *  \note This file should not be included directly. It is automatically included as needed by the USB driver\r
38  *        dispatch header located in LUFA/Drivers/USB/USB.h.\r
39  */\r
40 \r
41 #ifndef __USBINTERRUPT_UC3_H__\r
42 #define __USBINTERRUPT_UC3_H__\r
43 \r
44         /* Includes: */\r
45                 #include "../../../../Common/Common.h"\r
46 \r
47         /* Enable C linkage for C++ Compilers: */\r
48                 #if defined(__cplusplus)\r
49                         extern "C" {\r
50                 #endif\r
51 \r
52         /* Preprocessor Checks: */\r
53                 #if !defined(__INCLUDE_FROM_USB_DRIVER)\r
54                         #error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.\r
55                 #endif\r
56 \r
57         /* Private Interface - For use in library only: */\r
58         #if !defined(__DOXYGEN__)\r
59                 /* External Variables: */\r
60                         extern volatile uint32_t USB_Endpoint_SelectedEndpoint;\r
61 \r
62                 /* Enums: */\r
63                         enum USB_Interrupts_t\r
64                         {\r
65                                 USB_INT_VBUSTI  = 0,\r
66                                 #if (defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__))\r
67                                 USB_INT_IDTI    = 1,\r
68                                 #endif\r
69                                 #if (defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__))\r
70                                 USB_INT_WAKEUPI = 2,\r
71                                 USB_INT_SUSPI   = 3,\r
72                                 USB_INT_EORSTI  = 4,\r
73                                 USB_INT_SOFI    = 5,\r
74                                 USB_INT_RXSTPI  = 6,\r
75                                 #endif\r
76                                 #if (defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__))\r
77                                 USB_INT_HSOFI   = 7,\r
78                                 USB_INT_DCONNI  = 8,\r
79                                 USB_INT_DDISCI  = 9,\r
80                                 USB_INT_RSTI    = 10,\r
81                                 USB_INT_BCERRI  = 11,\r
82                                 USB_INT_VBERRI  = 12,\r
83                                 #endif\r
84                         };\r
85 \r
86                 /* Inline Functions: */\r
87                         static inline void USB_INT_Enable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;\r
88                         static inline void USB_INT_Enable(const uint8_t Interrupt)\r
89                         {\r
90                                 switch (Interrupt)\r
91                                 {\r
92                                         case USB_INT_VBUSTI:\r
93                                                 AVR32_USBB.USBCON.vbuste      = true;\r
94                                                 break;\r
95                                         #if defined(USB_CAN_BE_BOTH)\r
96                                         case USB_INT_IDTI:\r
97                                                 AVR32_USBB.USBCON.idte        = true;\r
98                                                 break;\r
99                                         #endif\r
100                                         #if defined(USB_CAN_BE_DEVICE)\r
101                                         case USB_INT_WAKEUPI:\r
102                                                 AVR32_USBB.UDINTESET.wakeupes = true;\r
103                                                 break;\r
104                                         case USB_INT_SUSPI:\r
105                                                 AVR32_USBB.UDINTESET.suspes   = true;\r
106                                                 break;\r
107                                         case USB_INT_EORSTI:\r
108                                                 AVR32_USBB.UDINTESET.eorstes  = true;\r
109                                                 break;\r
110                                         case USB_INT_SOFI:\r
111                                                 AVR32_USBB.UDINTESET.sofes    = true;\r
112                                                 break;\r
113                                         case USB_INT_RXSTPI:\r
114                                                 (&AVR32_USBB.UECON0SET)[USB_Endpoint_SelectedEndpoint].rxstpes = true;\r
115                                                 break;\r
116                                         #endif\r
117                                         #if defined(USB_CAN_BE_HOST)\r
118                                         case USB_INT_HSOFI:\r
119                                                 AVR32_USBB.UHINTESET.hsofies  = true;\r
120                                                 break;\r
121                                         case USB_INT_DCONNI:\r
122                                                 AVR32_USBB.UHINTESET.dconnies = true;\r
123                                                 break;\r
124                                         case USB_INT_DDISCI:\r
125                                                 AVR32_USBB.UHINTESET.ddiscies = true;\r
126                                                 break;\r
127                                         case USB_INT_RSTI:\r
128                                                 AVR32_USBB.UHINTESET.rsties   = true;\r
129                                                 break;\r
130                                         case USB_INT_BCERRI:\r
131                                                 AVR32_USBB.USBCON.bcerre      = true;\r
132                                                 break;\r
133                                         case USB_INT_VBERRI:\r
134                                                 AVR32_USBB.USBCON.vberre      = true;\r
135                                                 break;\r
136                                         #endif\r
137                                 }\r
138                         }\r
139 \r
140                         static inline void USB_INT_Disable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;\r
141                         static inline void USB_INT_Disable(const uint8_t Interrupt)\r
142                         {\r
143                                 switch (Interrupt)\r
144                                 {\r
145                                         case USB_INT_VBUSTI:\r
146                                                 AVR32_USBB.USBCON.vbuste      = false;\r
147                                                 break;\r
148                                         #if defined(USB_CAN_BE_BOTH)\r
149                                         case USB_INT_IDTI:\r
150                                                 AVR32_USBB.USBCON.idte        = false;\r
151                                                 break;\r
152                                         #endif\r
153                                         #if defined(USB_CAN_BE_DEVICE)\r
154                                         case USB_INT_WAKEUPI:\r
155                                                 AVR32_USBB.UDINTECLR.wakeupec = true;\r
156                                                 break;\r
157                                         case USB_INT_SUSPI:\r
158                                                 AVR32_USBB.UDINTECLR.suspec   = true;\r
159                                                 break;\r
160                                         case USB_INT_EORSTI:\r
161                                                 AVR32_USBB.UDINTECLR.eorstec  = true;\r
162                                                 break;\r
163                                         case USB_INT_SOFI:\r
164                                                 AVR32_USBB.UDINTECLR.sofec    = true;\r
165                                                 break;\r
166                                         case USB_INT_RXSTPI:\r
167                                                 (&AVR32_USBB.UECON0CLR)[USB_Endpoint_SelectedEndpoint].rxstpec = true;\r
168                                                 break;\r
169                                         #endif\r
170                                         #if defined(USB_CAN_BE_HOST)\r
171                                         case USB_INT_HSOFI:\r
172                                                 AVR32_USBB.UHINTECLR.hsofiec  = true;\r
173                                                 break;\r
174                                         case USB_INT_DCONNI:\r
175                                                 AVR32_USBB.UHINTECLR.dconniec = true;\r
176                                                 break;\r
177                                         case USB_INT_DDISCI:\r
178                                                 AVR32_USBB.UHINTECLR.ddisciec = true;\r
179                                                 break;\r
180                                         case USB_INT_RSTI:\r
181                                                 AVR32_USBB.UHINTECLR.rstiec   = true;\r
182                                                 break;\r
183                                         case USB_INT_BCERRI:\r
184                                                 AVR32_USBB.USBCON.bcerre      = false;\r
185                                                 break;\r
186                                         case USB_INT_VBERRI:\r
187                                                 AVR32_USBB.USBCON.vberre      = false;\r
188                                                 break;\r
189                                         #endif\r
190                                 }\r
191                         }\r
192 \r
193                         static inline void USB_INT_Clear(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;\r
194                         static inline void USB_INT_Clear(const uint8_t Interrupt)\r
195                         {\r
196                                 switch (Interrupt)\r
197                                 {\r
198                                         case USB_INT_VBUSTI:\r
199                                                 AVR32_USBB.USBSTACLR.vbustic = true;\r
200                                                 (void)AVR32_USBB.USBSTACLR;\r
201                                                 break;\r
202                                         #if defined(USB_CAN_BE_BOTH)\r
203                                         case USB_INT_IDTI:\r
204                                                 AVR32_USBB.USBSTACLR.idtic   = true;\r
205                                                 (void)AVR32_USBB.USBSTACLR;\r
206                                                 break;\r
207                                         #endif\r
208                                         #if defined(USB_CAN_BE_DEVICE)\r
209                                         case USB_INT_WAKEUPI:\r
210                                                 AVR32_USBB.UDINTCLR.wakeupc  = true;\r
211                                                 (void)AVR32_USBB.UDINTCLR;\r
212                                                 break;\r
213                                         case USB_INT_SUSPI:\r
214                                                 AVR32_USBB.UDINTCLR.suspc    = true;\r
215                                                 (void)AVR32_USBB.UDINTCLR;\r
216                                                 break;\r
217                                         case USB_INT_EORSTI:\r
218                                                 AVR32_USBB.UDINTCLR.eorstc   = true;\r
219                                                 (void)AVR32_USBB.UDINTCLR;\r
220                                                 break;\r
221                                         case USB_INT_SOFI:\r
222                                                 AVR32_USBB.UDINTCLR.sofc     = true;\r
223                                                 (void)AVR32_USBB.UDINTCLR;\r
224                                                 break;\r
225                                         case USB_INT_RXSTPI:\r
226                                                 (&AVR32_USBB.UESTA0CLR)[USB_Endpoint_SelectedEndpoint].rxstpic = true;\r
227                                                 break;\r
228                                         #endif\r
229                                         #if defined(USB_CAN_BE_HOST)\r
230                                         case USB_INT_HSOFI:\r
231                                                 AVR32_USBB.UHINTCLR.hsofic   = true;\r
232                                                 (void)AVR32_USBB.UHINTCLR;\r
233                                                 break;\r
234                                         case USB_INT_DCONNI:\r
235                                                 AVR32_USBB.UHINTCLR.dconnic  = true;\r
236                                                 (void)AVR32_USBB.UHINTCLR;\r
237                                                 break;\r
238                                         case USB_INT_DDISCI:\r
239                                                 AVR32_USBB.UHINTCLR.ddiscic  = true;\r
240                                                 (void)AVR32_USBB.UHINTCLR;\r
241                                                 break;\r
242                                         case USB_INT_RSTI:\r
243                                                 AVR32_USBB.UHINTCLR.rstic    = true;\r
244                                                 (void)AVR32_USBB.UHINTCLR;\r
245                                                 break;\r
246                                         case USB_INT_BCERRI:\r
247                                                 AVR32_USBB.USBSTACLR.bcerric = true;\r
248                                                 (void)AVR32_USBB.USBSTACLR;\r
249                                                 break;\r
250                                         case USB_INT_VBERRI:\r
251                                                 AVR32_USBB.USBSTACLR.vberric = true;\r
252                                                 (void)AVR32_USBB.USBSTACLR;\r
253                                                 break;\r
254                                         #endif\r
255                                 }\r
256                         }\r
257 \r
258                         static inline bool USB_INT_IsEnabled(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;\r
259                         static inline bool USB_INT_IsEnabled(const uint8_t Interrupt)\r
260                         {\r
261                                 switch (Interrupt)\r
262                                 {\r
263                                         case USB_INT_VBUSTI:\r
264                                                 return AVR32_USBB.USBCON.vbuste;\r
265                                         #if defined(USB_CAN_BE_BOTH)\r
266                                         case USB_INT_IDTI:\r
267                                                 return AVR32_USBB.USBCON.idte;\r
268                                         #endif\r
269                                         #if defined(USB_CAN_BE_DEVICE)\r
270                                         case USB_INT_WAKEUPI:\r
271                                                 return AVR32_USBB.UDINTE.wakeupe;\r
272                                         case USB_INT_SUSPI:\r
273                                                 return AVR32_USBB.UDINTE.suspe;\r
274                                         case USB_INT_EORSTI:\r
275                                                 return AVR32_USBB.UDINTE.eorste;\r
276                                         case USB_INT_SOFI:\r
277                                                 return AVR32_USBB.UDINTE.sofe;\r
278                                         case USB_INT_RXSTPI:\r
279                                                 return (&AVR32_USBB.UECON0)[USB_Endpoint_SelectedEndpoint].rxstpe;\r
280                                         #endif\r
281                                         #if defined(USB_CAN_BE_HOST)\r
282                                         case USB_INT_HSOFI:\r
283                                                 return AVR32_USBB.UHINTE.hsofie;\r
284                                         case USB_INT_DCONNI:\r
285                                                 return AVR32_USBB.UHINTE.dconnie;\r
286                                         case USB_INT_DDISCI:\r
287                                                 return AVR32_USBB.UHINTE.ddiscie;\r
288                                         case USB_INT_RSTI:\r
289                                                 return AVR32_USBB.UHINTE.rstie;\r
290                                         case USB_INT_BCERRI:\r
291                                                 return AVR32_USBB.USBCON.bcerre;\r
292                                         case USB_INT_VBERRI:\r
293                                                 return AVR32_USBB.USBCON.vberre;\r
294                                         #endif\r
295                                 }\r
296 \r
297                                 return false;\r
298                         }\r
299 \r
300                         static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;\r
301                         static inline bool USB_INT_HasOccurred(const uint8_t Interrupt)\r
302                         {\r
303                                 switch (Interrupt)\r
304                                 {\r
305                                         case USB_INT_VBUSTI:\r
306                                                 return AVR32_USBB.USBSTA.vbusti;\r
307                                         #if defined(USB_CAN_BE_BOTH)\r
308                                         case USB_INT_IDTI:\r
309                                                 return AVR32_USBB.USBSTA.idti;\r
310                                         #endif\r
311                                         #if defined(USB_CAN_BE_DEVICE)\r
312                                         case USB_INT_WAKEUPI:\r
313                                                 return AVR32_USBB.UDINT.wakeup;\r
314                                         case USB_INT_SUSPI:\r
315                                                 return AVR32_USBB.UDINT.susp;\r
316                                         case USB_INT_EORSTI:\r
317                                                 return AVR32_USBB.UDINT.eorst;\r
318                                         case USB_INT_SOFI:\r
319                                                 return AVR32_USBB.UDINT.sof;\r
320                                         case USB_INT_RXSTPI:\r
321                                                 return (&AVR32_USBB.UESTA0)[USB_Endpoint_SelectedEndpoint].rxstpi;\r
322                                         #endif\r
323                                         #if defined(USB_CAN_BE_HOST)\r
324                                         case USB_INT_HSOFI:\r
325                                                 return AVR32_USBB.UHINT.hsofi;\r
326                                         case USB_INT_DCONNI:\r
327                                                 return AVR32_USBB.UHINT.dconni;\r
328                                         case USB_INT_DDISCI:\r
329                                                 return AVR32_USBB.UHINT.ddisci;\r
330                                         case USB_INT_RSTI:\r
331                                                 return AVR32_USBB.UHINT.rsti;\r
332                                         case USB_INT_BCERRI:\r
333                                                 return AVR32_USBB.USBSTA.bcerri;\r
334                                         case USB_INT_VBERRI:\r
335                                                 return AVR32_USBB.USBSTA.vberri;\r
336                                         #endif\r
337                                 }\r
338 \r
339                                 return false;\r
340                         }\r
341 \r
342                 /* Includes: */\r
343                         #include "../USBMode.h"\r
344                         #include "../Events.h"\r
345                         #include "../USBController.h"\r
346 \r
347                 /* Function Prototypes: */\r
348                         void USB_INT_ClearAllInterrupts(void);\r
349                         void USB_INT_DisableAllInterrupts(void);\r
350         #endif\r
351 \r
352         /* Public Interface - May be used in end-application: */\r
353                 /* Function Prototypes: */\r
354                         #if defined(__DOXYGEN__)\r
355                                 /** Interrupt service routine handler for the USB controller ISR group. This interrupt routine <b>must</b> be\r
356                                  *  linked to the entire USB controller ISR vector group inside the AVR32's interrupt controller peripheral,\r
357                                  *  using the user application's preferred USB controller driver.\r
358                                  */\r
359                                 void USB_GEN_vect(void);\r
360                         #else\r
361                                 ISR(USB_GEN_vect);\r
362                         #endif\r
363 \r
364         /* Disable C linkage for C++ Compilers: */\r
365                 #if defined(__cplusplus)\r
366                         }\r
367                 #endif\r
368 \r
369 #endif\r
370 \r