3 Copyright (C) Dean Camera, 2012.
\r
5 dean [at] fourwalledcubicle [dot] com
\r
10 Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
\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
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
32 * \brief USB Controller Interrupt definitions for the AVR32 UC3 microcontrollers.
\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
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
41 #ifndef __USBINTERRUPT_UC3_H__
\r
42 #define __USBINTERRUPT_UC3_H__
\r
45 #include "../../../../Common/Common.h"
\r
47 /* Enable C linkage for C++ Compilers: */
\r
48 #if defined(__cplusplus)
\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
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
63 enum USB_Interrupts_t
\r
66 #if (defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__))
\r
69 #if (defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__))
\r
70 USB_INT_WAKEUPI = 2,
\r
76 #if (defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__))
\r
81 USB_INT_BCERRI = 11,
\r
82 USB_INT_VBERRI = 12,
\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
92 case USB_INT_VBUSTI:
\r
93 AVR32_USBB.USBCON.vbuste = true;
\r
95 #if defined(USB_CAN_BE_BOTH)
\r
97 AVR32_USBB.USBCON.idte = true;
\r
100 #if defined(USB_CAN_BE_DEVICE)
\r
101 case USB_INT_WAKEUPI:
\r
102 AVR32_USBB.UDINTESET.wakeupes = true;
\r
104 case USB_INT_SUSPI:
\r
105 AVR32_USBB.UDINTESET.suspes = true;
\r
107 case USB_INT_EORSTI:
\r
108 AVR32_USBB.UDINTESET.eorstes = true;
\r
111 AVR32_USBB.UDINTESET.sofes = true;
\r
113 case USB_INT_RXSTPI:
\r
114 (&AVR32_USBB.UECON0SET)[USB_Endpoint_SelectedEndpoint].rxstpes = true;
\r
117 #if defined(USB_CAN_BE_HOST)
\r
118 case USB_INT_HSOFI:
\r
119 AVR32_USBB.UHINTESET.hsofies = true;
\r
121 case USB_INT_DCONNI:
\r
122 AVR32_USBB.UHINTESET.dconnies = true;
\r
124 case USB_INT_DDISCI:
\r
125 AVR32_USBB.UHINTESET.ddiscies = true;
\r
128 AVR32_USBB.UHINTESET.rsties = true;
\r
130 case USB_INT_BCERRI:
\r
131 AVR32_USBB.USBCON.bcerre = true;
\r
133 case USB_INT_VBERRI:
\r
134 AVR32_USBB.USBCON.vberre = true;
\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
145 case USB_INT_VBUSTI:
\r
146 AVR32_USBB.USBCON.vbuste = false;
\r
148 #if defined(USB_CAN_BE_BOTH)
\r
150 AVR32_USBB.USBCON.idte = false;
\r
153 #if defined(USB_CAN_BE_DEVICE)
\r
154 case USB_INT_WAKEUPI:
\r
155 AVR32_USBB.UDINTECLR.wakeupec = true;
\r
157 case USB_INT_SUSPI:
\r
158 AVR32_USBB.UDINTECLR.suspec = true;
\r
160 case USB_INT_EORSTI:
\r
161 AVR32_USBB.UDINTECLR.eorstec = true;
\r
164 AVR32_USBB.UDINTECLR.sofec = true;
\r
166 case USB_INT_RXSTPI:
\r
167 (&AVR32_USBB.UECON0CLR)[USB_Endpoint_SelectedEndpoint].rxstpec = true;
\r
170 #if defined(USB_CAN_BE_HOST)
\r
171 case USB_INT_HSOFI:
\r
172 AVR32_USBB.UHINTECLR.hsofiec = true;
\r
174 case USB_INT_DCONNI:
\r
175 AVR32_USBB.UHINTECLR.dconniec = true;
\r
177 case USB_INT_DDISCI:
\r
178 AVR32_USBB.UHINTECLR.ddisciec = true;
\r
181 AVR32_USBB.UHINTECLR.rstiec = true;
\r
183 case USB_INT_BCERRI:
\r
184 AVR32_USBB.USBCON.bcerre = false;
\r
186 case USB_INT_VBERRI:
\r
187 AVR32_USBB.USBCON.vberre = false;
\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
198 case USB_INT_VBUSTI:
\r
199 AVR32_USBB.USBSTACLR.vbustic = true;
\r
200 (void)AVR32_USBB.USBSTACLR;
\r
202 #if defined(USB_CAN_BE_BOTH)
\r
204 AVR32_USBB.USBSTACLR.idtic = true;
\r
205 (void)AVR32_USBB.USBSTACLR;
\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
213 case USB_INT_SUSPI:
\r
214 AVR32_USBB.UDINTCLR.suspc = true;
\r
215 (void)AVR32_USBB.UDINTCLR;
\r
217 case USB_INT_EORSTI:
\r
218 AVR32_USBB.UDINTCLR.eorstc = true;
\r
219 (void)AVR32_USBB.UDINTCLR;
\r
222 AVR32_USBB.UDINTCLR.sofc = true;
\r
223 (void)AVR32_USBB.UDINTCLR;
\r
225 case USB_INT_RXSTPI:
\r
226 (&AVR32_USBB.UESTA0CLR)[USB_Endpoint_SelectedEndpoint].rxstpic = true;
\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
234 case USB_INT_DCONNI:
\r
235 AVR32_USBB.UHINTCLR.dconnic = true;
\r
236 (void)AVR32_USBB.UHINTCLR;
\r
238 case USB_INT_DDISCI:
\r
239 AVR32_USBB.UHINTCLR.ddiscic = true;
\r
240 (void)AVR32_USBB.UHINTCLR;
\r
243 AVR32_USBB.UHINTCLR.rstic = true;
\r
244 (void)AVR32_USBB.UHINTCLR;
\r
246 case USB_INT_BCERRI:
\r
247 AVR32_USBB.USBSTACLR.bcerric = true;
\r
248 (void)AVR32_USBB.USBSTACLR;
\r
250 case USB_INT_VBERRI:
\r
251 AVR32_USBB.USBSTACLR.vberric = true;
\r
252 (void)AVR32_USBB.USBSTACLR;
\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
263 case USB_INT_VBUSTI:
\r
264 return AVR32_USBB.USBCON.vbuste;
\r
265 #if defined(USB_CAN_BE_BOTH)
\r
267 return AVR32_USBB.USBCON.idte;
\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
277 return AVR32_USBB.UDINTE.sofe;
\r
278 case USB_INT_RXSTPI:
\r
279 return (&AVR32_USBB.UECON0)[USB_Endpoint_SelectedEndpoint].rxstpe;
\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
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
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
305 case USB_INT_VBUSTI:
\r
306 return AVR32_USBB.USBSTA.vbusti;
\r
307 #if defined(USB_CAN_BE_BOTH)
\r
309 return AVR32_USBB.USBSTA.idti;
\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
319 return AVR32_USBB.UDINT.sof;
\r
320 case USB_INT_RXSTPI:
\r
321 return (&AVR32_USBB.UESTA0)[USB_Endpoint_SelectedEndpoint].rxstpi;
\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
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
343 #include "../USBMode.h"
\r
344 #include "../Events.h"
\r
345 #include "../USBController.h"
\r
347 /* Function Prototypes: */
\r
348 void USB_INT_ClearAllInterrupts(void);
\r
349 void USB_INT_DisableAllInterrupts(void);
\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
359 void USB_GEN_vect(void);
\r
364 /* Disable C linkage for C++ Compilers: */
\r
365 #if defined(__cplusplus)
\r