Add in temporary global interrupts enable/disable macros.
// TODO
#define EEMEM
#define PROGMEM const
// TODO
#define EEMEM
#define PROGMEM const
- #define ISR(Name) void Name (void)
+ #define ISR(Name) void Name (void) __attribute__((__interrupt__)); void Name (void)
#define ATOMIC_BLOCK(x) if (1)
#define ATOMIC_RESTORESTATE
#define pgm_read_byte(x) *x
#define ATOMIC_BLOCK(x) if (1)
#define ATOMIC_RESTORESTATE
#define pgm_read_byte(x) *x
#define _delay_ms(x)
#define memcmp_P(...) memcmp(__VA_ARGS__)
#define memcpy_P(...) memcpy(__VA_ARGS__)
#define _delay_ms(x)
#define memcmp_P(...) memcmp(__VA_ARGS__)
#define memcpy_P(...) memcpy(__VA_ARGS__)
+ #define cpu_irq_enable() do { asm volatile("" ::: "memory"); __builtin_csrf(AVR32_SR_GM_OFFSET); } while (0)
+ #define cpu_irq_disable() do { __builtin_ssrf(AVR32_SR_GM_OFFSET); asm volatile("" ::: "memory"); } while (0)
#warning The UC3B architecture support is currently experimental and incomplete!
#endif
#warning The UC3B architecture support is currently experimental and incomplete!
#endif
#if !defined(USE_STATIC_OPTIONS)
USB_Options = Options;
#endif
#if !defined(USE_STATIC_OPTIONS)
USB_Options = Options;
#endif
+
+ USB_INT_RegisterHandlers();
if (!(USB_Options & USB_OPT_REG_DISABLED))
USB_REG_On();
if (!(USB_Options & USB_OPT_REG_DISABLED))
USB_REG_On();
};
/* Inline Functions: */
};
/* Inline Functions: */
+ static inline void USB_INT_RegisterHandlers(void)
+ {
+ // Not required for AVR8
+ }
+
static inline void USB_INT_Enable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;
static inline void USB_INT_Enable(const uint8_t Interrupt)
{
static inline void USB_INT_Enable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;
static inline void USB_INT_Enable(const uint8_t Interrupt)
{
#if !defined(USE_STATIC_OPTIONS)\r
USB_Options = Options;\r
#endif\r
#if !defined(USE_STATIC_OPTIONS)\r
USB_Options = Options;\r
#endif\r
+ \r
+ USB_INT_RegisterHandlers();\r
\r
#if defined(USB_CAN_BE_BOTH)\r
if (Mode == USB_MODE_UID)\r
\r
#if defined(USB_CAN_BE_BOTH)\r
if (Mode == USB_MODE_UID)\r
bool UIDModeSelectEnabled = AVR32_USBB.USBCON.uide;\r
#endif\r
\r
bool UIDModeSelectEnabled = AVR32_USBB.USBCON.uide;\r
#endif\r
\r
- USB_INT_DisableAllInterrupts();\r
- USB_INT_ClearAllInterrupts();\r
-\r
- USB_Controller_Reset();\r
- \r
AVR32_PM.GCCTRL[USB_GCLK_USBB_INDEX].pllsel = !(USB_Options & USB_OPT_GCLK_SRC_OSC);\r
AVR32_PM.GCCTRL[USB_GCLK_USBB_INDEX].oscsel = !(USB_Options & USB_OPT_GCLK_CHANNEL_0);\r
AVR32_PM.GCCTRL[USB_GCLK_USBB_INDEX].diven = (F_CLOCK != 48000000UL);\r
AVR32_PM.GCCTRL[USB_GCLK_USBB_INDEX].div = ((F_CLOCK / 2) / 48000000UL);\r
AVR32_PM.GCCTRL[USB_GCLK_USBB_INDEX].cen = true;\r
\r
AVR32_PM.GCCTRL[USB_GCLK_USBB_INDEX].pllsel = !(USB_Options & USB_OPT_GCLK_SRC_OSC);\r
AVR32_PM.GCCTRL[USB_GCLK_USBB_INDEX].oscsel = !(USB_Options & USB_OPT_GCLK_CHANNEL_0);\r
AVR32_PM.GCCTRL[USB_GCLK_USBB_INDEX].diven = (F_CLOCK != 48000000UL);\r
AVR32_PM.GCCTRL[USB_GCLK_USBB_INDEX].div = ((F_CLOCK / 2) / 48000000UL);\r
AVR32_PM.GCCTRL[USB_GCLK_USBB_INDEX].cen = true;\r
\r
+ USB_INT_DisableAllInterrupts();\r
+ USB_INT_ClearAllInterrupts();\r
+\r
+ USB_Controller_Reset();\r
+\r
#if defined(USB_CAN_BE_BOTH)\r
if (UIDModeSelectEnabled)\r
{\r
#if defined(USB_CAN_BE_BOTH)\r
if (UIDModeSelectEnabled)\r
{\r
USB_INT_SUSPI = 3,\r
USB_INT_EORSTI = 4,\r
USB_INT_SOFI = 5,\r
USB_INT_SUSPI = 3,\r
USB_INT_EORSTI = 4,\r
USB_INT_SOFI = 5,\r
#endif\r
#if (defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)) \r
#endif\r
#if (defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)) \r
- USB_INT_HSOFI = 7,\r
- USB_INT_DCONNI = 8,\r
- USB_INT_DDISCI = 9,\r
- USB_INT_RSTI = 10,\r
- USB_INT_BCERRI = 11,\r
- USB_INT_VBERRI = 12,\r
+ USB_INT_HSOFI = 6,\r
+ USB_INT_DCONNI = 7,\r
+ USB_INT_DDISCI = 8,\r
+ USB_INT_RSTI = 9,\r
+ USB_INT_BCERRI = 10,\r
+ USB_INT_VBERRI = 11,\r
+ \r
+ /* ISR Prototypes: */\r
+ ISR(USB_GEN_vect);\r
+ \r
/* Inline Functions: */\r
/* Inline Functions: */\r
+ static inline void USB_INT_RegisterHandlers(void)\r
+ {\r
+ AVR32_INTC.IPR[AVR32_USBB_IRQ % 32].autovector = (uintptr_t)&USB_GEN_vect; \r
+ }\r
+ \r
static inline void USB_INT_Enable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;\r
static inline void USB_INT_Enable(const uint8_t Interrupt)\r
static inline void USB_INT_Enable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;\r
static inline void USB_INT_Enable(const uint8_t Interrupt)\r
switch (Interrupt)\r
{\r
case USB_INT_VBUSTI:\r
switch (Interrupt)\r
{\r
case USB_INT_VBUSTI:\r
case USB_INT_SOFI:\r
AVR32_USBB.UDINTESET.sofes = true;\r
break;\r
case USB_INT_SOFI:\r
AVR32_USBB.UDINTESET.sofes = true;\r
break;\r
- case USB_INT_RXSTPI:\r
- // TODO\r
- return;\r
#endif\r
#if defined(USB_CAN_BE_HOST)\r
case USB_INT_HSOFI:\r
#endif\r
#if defined(USB_CAN_BE_HOST)\r
case USB_INT_HSOFI:\r
case USB_INT_SOFI:\r
AVR32_USBB.UDINTECLR.sofec = true;\r
break;\r
case USB_INT_SOFI:\r
AVR32_USBB.UDINTECLR.sofec = true;\r
break;\r
- case USB_INT_RXSTPI:\r
- // TODO\r
- return;\r
#endif\r
#if defined(USB_CAN_BE_HOST)\r
case USB_INT_HSOFI:\r
#endif\r
#if defined(USB_CAN_BE_HOST)\r
case USB_INT_HSOFI:\r
{\r
case USB_INT_VBUSTI:\r
AVR32_USBB.USBSTACLR.vbustic = true;\r
{\r
case USB_INT_VBUSTI:\r
AVR32_USBB.USBSTACLR.vbustic = true;\r
+ (void)AVR32_USBB.USBSTACLR;\r
break;\r
#if defined(USB_CAN_BE_BOTH)\r
case USB_INT_IDTI:\r
AVR32_USBB.USBSTACLR.idtic = true;\r
break;\r
#if defined(USB_CAN_BE_BOTH)\r
case USB_INT_IDTI:\r
AVR32_USBB.USBSTACLR.idtic = true;\r
+ (void)AVR32_USBB.USBSTACLR;\r
break;\r
#endif\r
#if defined(USB_CAN_BE_DEVICE)\r
case USB_INT_WAKEUPI:\r
AVR32_USBB.UDINTCLR.wakeupc = true;\r
break;\r
#endif\r
#if defined(USB_CAN_BE_DEVICE)\r
case USB_INT_WAKEUPI:\r
AVR32_USBB.UDINTCLR.wakeupc = true;\r
+ (void)AVR32_USBB.UDINTCLR;\r
break;\r
case USB_INT_SUSPI:\r
AVR32_USBB.UDINTCLR.suspc = true;\r
break;\r
case USB_INT_SUSPI:\r
AVR32_USBB.UDINTCLR.suspc = true;\r
+ (void)AVR32_USBB.UDINTCLR;\r
break;\r
case USB_INT_EORSTI:\r
AVR32_USBB.UDINTCLR.eorstc = true;\r
break;\r
case USB_INT_EORSTI:\r
AVR32_USBB.UDINTCLR.eorstc = true;\r
+ (void)AVR32_USBB.UDINTCLR;\r
break;\r
case USB_INT_SOFI:\r
AVR32_USBB.UDINTCLR.sofc = true;\r
break;\r
case USB_INT_SOFI:\r
AVR32_USBB.UDINTCLR.sofc = true;\r
+ (void)AVR32_USBB.UDINTCLR;\r
- case USB_INT_RXSTPI:\r
- // TODO\r
- return;\r
#endif\r
#if defined(USB_CAN_BE_HOST)\r
case USB_INT_HSOFI:\r
AVR32_USBB.UHINTCLR.hsofic = true;\r
#endif\r
#if defined(USB_CAN_BE_HOST)\r
case USB_INT_HSOFI:\r
AVR32_USBB.UHINTCLR.hsofic = true;\r
+ (void)AVR32_USBB.UHINTCLR;\r
break;\r
case USB_INT_DCONNI:\r
AVR32_USBB.UHINTCLR.dconnic = true;\r
break;\r
case USB_INT_DCONNI:\r
AVR32_USBB.UHINTCLR.dconnic = true;\r
+ (void)AVR32_USBB.UHINTCLR;\r
break;\r
case USB_INT_DDISCI:\r
AVR32_USBB.UHINTCLR.ddiscic = true;\r
break;\r
case USB_INT_DDISCI:\r
AVR32_USBB.UHINTCLR.ddiscic = true;\r
+ (void)AVR32_USBB.UHINTCLR;\r
break;\r
case USB_INT_RSTI:\r
AVR32_USBB.UHINTCLR.rstic = true;\r
break;\r
case USB_INT_RSTI:\r
AVR32_USBB.UHINTCLR.rstic = true;\r
+ (void)AVR32_USBB.UHINTCLR;\r
break;\r
case USB_INT_BCERRI:\r
AVR32_USBB.USBSTACLR.bcerric = true;\r
break;\r
case USB_INT_BCERRI:\r
AVR32_USBB.USBSTACLR.bcerric = true;\r
+ (void)AVR32_USBB.USBSTACLR;\r
break;\r
case USB_INT_VBERRI:\r
AVR32_USBB.USBSTACLR.vberric = true;\r
break;\r
case USB_INT_VBERRI:\r
AVR32_USBB.USBSTACLR.vberric = true;\r
+ (void)AVR32_USBB.USBSTACLR;\r
return AVR32_USBB.UDINTE.eorste;\r
case USB_INT_SOFI:\r
return AVR32_USBB.UDINTE.sofe;\r
return AVR32_USBB.UDINTE.eorste;\r
case USB_INT_SOFI:\r
return AVR32_USBB.UDINTE.sofe;\r
- case USB_INT_RXSTPI:\r
- // TODO\r
- return false;\r
#endif\r
#if defined(USB_CAN_BE_HOST) \r
case USB_INT_HSOFI:\r
#endif\r
#if defined(USB_CAN_BE_HOST) \r
case USB_INT_HSOFI:\r
return AVR32_USBB.UDINT.eorst;\r
case USB_INT_SOFI:\r
return AVR32_USBB.UDINT.sof;\r
return AVR32_USBB.UDINT.eorst;\r
case USB_INT_SOFI:\r
return AVR32_USBB.UDINT.sof;\r
- case USB_INT_RXSTPI:\r
- // TODO\r
- return false;\r
#endif\r
#if defined(USB_CAN_BE_HOST)\r
case USB_INT_HSOFI:\r
#endif\r
#if defined(USB_CAN_BE_HOST)\r
case USB_INT_HSOFI:\r
* - Ghetto Drum, a MIDI drum controller: http://noisybox.net/art/gdrum/
* - IR Remote to Keyboard decoder: http://netzhansa.blogspot.com/2010/04/our-living-room-hi-fi-setup-needs-mp3.html
* - LED Panel controller: http://projects.peterpolidoro.net/caltech/panelscontroller/panelscontroller.htm
* - Ghetto Drum, a MIDI drum controller: http://noisybox.net/art/gdrum/
* - IR Remote to Keyboard decoder: http://netzhansa.blogspot.com/2010/04/our-living-room-hi-fi-setup-needs-mp3.html
* - LED Panel controller: http://projects.peterpolidoro.net/caltech/panelscontroller/panelscontroller.htm
+ * - Motherboard BIOS flasher: http://www.coreboot.org/InSystemFlasher
* - PSGroove, a Playstation 3 Homebrew dongle: http://github.com/psgroove
* - Single LED Matrix Display: http://guysoft.wordpress.com/2009/10/08/bumble-b/
* - Linux Secure Storage Dongle: http://github.com/TomMD/teensy
* - PSGroove, a Playstation 3 Homebrew dongle: http://github.com/psgroove
* - Single LED Matrix Display: http://guysoft.wordpress.com/2009/10/08/bumble-b/
* - Linux Secure Storage Dongle: http://github.com/TomMD/teensy