From f3f481183aa201739a84f847769dcba50166eb98 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Sun, 27 Feb 2011 14:04:29 +0000 Subject: More AVR32 UC3B architecture ports - USB device mode applications can now be sucessfully compiled, although they will be currently non-functional. --- LUFA.pnproj | 2 +- LUFA/Common/Common.h | 12 ++ LUFA/Drivers/USB/Class/Device/CDC.c | 12 +- LUFA/Drivers/USB/Class/Device/CDC.h | 7 + LUFA/Drivers/USB/Class/Host/CDC.c | 2 + LUFA/Drivers/USB/Class/Host/CDC.h | 7 + LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h | 2 +- LUFA/Drivers/USB/Core/UC3B/Device_UC3B.c | 10 +- LUFA/Drivers/USB/Core/UC3B/Device_UC3B.h | 29 +-- LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.c | 9 +- LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.h | 6 +- LUFA/Drivers/USB/Core/UC3B/Pipe_UC3B.c | 17 +- LUFA/Drivers/USB/Core/UC3B/USBController_UC3B.h | 14 +- LUFA/Drivers/USB/Core/UC3B/USBInterrupt_UC3B.c | 60 +----- LUFA/Drivers/USB/Core/UC3B/USBInterrupt_UC3B.h | 260 +++++++++++++++++++++--- 15 files changed, 322 insertions(+), 127 deletions(-) diff --git a/LUFA.pnproj b/LUFA.pnproj index a71e9121b..9cd530b75 100644 --- a/LUFA.pnproj +++ b/LUFA.pnproj @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/LUFA/Common/Common.h b/LUFA/Common/Common.h index a62cc7e7e..cf6c28307 100644 --- a/LUFA/Common/Common.h +++ b/LUFA/Common/Common.h @@ -92,6 +92,18 @@ typedef uint32_t uint_reg_t; + #define EEMEM + #define PROGMEM const + #define ISR(Name) void Name (void) + #define ATOMIC_BLOCK(x) if (1) + #define ATOMIC_RESTORESTATE + #define pgm_read_byte(x) *x + #define eeprom_read_byte(x) *x + #define eeprom_update_byte(x, y) *x = y + #define eeprom_write_byte(x, y) *x = y + #define memcmp_P(...) memcmp(__VA_ARGS__) + #define memcpy_P(...) memcpy(__VA_ARGS__) + #warning The UC3B architecture support is currently experimental and incomplete! #endif diff --git a/LUFA/Drivers/USB/Class/Device/CDC.c b/LUFA/Drivers/USB/Class/Device/CDC.c index a196f53dd..9204f1bf0 100644 --- a/LUFA/Drivers/USB/Class/Device/CDC.c +++ b/LUFA/Drivers/USB/Class/Device/CDC.c @@ -37,11 +37,6 @@ #define __INCLUDE_FROM_CDC_DEVICE_C #include "CDC.h" -void CDC_Device_Event_Stub(void) -{ - -} - void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) { if (!(Endpoint_IsSETUPReceived())) @@ -293,6 +288,7 @@ void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDC Endpoint_ClearIN(); } +#if defined(FDEV_SETUP_STREAM) void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, FILE* const Stream) { @@ -338,6 +334,12 @@ static int CDC_Device_getchar_Blocking(FILE* Stream) return ReceivedByte; } +#endif + +void CDC_Device_Event_Stub(void) +{ + +} #endif diff --git a/LUFA/Drivers/USB/Class/Device/CDC.h b/LUFA/Drivers/USB/Class/Device/CDC.h index 8b4e2da8e..b2d148da3 100644 --- a/LUFA/Drivers/USB/Class/Device/CDC.h +++ b/LUFA/Drivers/USB/Class/Device/CDC.h @@ -305,6 +305,9 @@ * * \note The created stream can be given as stdout if desired to direct the standard output from all functions * to the given CDC interface. + * \n\n + * + * \note This function is not available on all microcontroller architectures. * * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. * \param[in,out] Stream Pointer to a FILE structure where the created stream should be placed. @@ -315,6 +318,8 @@ /** Identical to \ref CDC_Device_CreateStream(), except that reads are blocking until the calling stream function terminates * the transfer. While blocking, the USB and CDC service tasks are called repeatedly to maintain USB communications. * + * \note This function is not available on all microcontroller architectures. + * * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. * \param[in,out] Stream Pointer to a FILE structure where the created stream should be placed. */ @@ -325,10 +330,12 @@ #if !defined(__DOXYGEN__) /* Function Prototypes: */ #if defined(__INCLUDE_FROM_CDC_DEVICE_C) + #if defined(FDEV_SETUP_STREAM) static int CDC_Device_putchar(char c, FILE* Stream) ATTR_NON_NULL_PTR_ARG(2); static int CDC_Device_getchar(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); static int CDC_Device_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); + #endif void CDC_Device_Event_Stub(void) ATTR_CONST; void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) diff --git a/LUFA/Drivers/USB/Class/Host/CDC.c b/LUFA/Drivers/USB/Class/Host/CDC.c index d99e42e75..2a260b6fc 100644 --- a/LUFA/Drivers/USB/Class/Host/CDC.c +++ b/LUFA/Drivers/USB/Class/Host/CDC.c @@ -456,6 +456,7 @@ uint8_t CDC_Host_Flush(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) return PIPE_READYWAIT_NoError; } +#if defined(FDEV_SETUP_STREAM) void CDC_Host_CreateStream(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, FILE* const Stream) { @@ -501,6 +502,7 @@ static int CDC_Host_getchar_Blocking(FILE* Stream) return ReceivedByte; } +#endif void CDC_Host_Event_Stub(void) { diff --git a/LUFA/Drivers/USB/Class/Host/CDC.h b/LUFA/Drivers/USB/Class/Host/CDC.h index b679d1023..4bb98630f 100644 --- a/LUFA/Drivers/USB/Class/Host/CDC.h +++ b/LUFA/Drivers/USB/Class/Host/CDC.h @@ -295,6 +295,9 @@ * * \note The created stream can be given as stdout if desired to direct the standard output from all \c functions * to the given CDC interface. + * \n\n + * + * \note This function is not available on all microcontroller architectures. * * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. * \param[in,out] Stream Pointer to a FILE structure where the created stream should be placed. @@ -305,6 +308,8 @@ /** Identical to \ref CDC_Host_CreateStream(), except that reads are blocking until the calling stream function terminates * the transfer. While blocking, the USB and CDC service tasks are called repeatedly to maintain USB communications. * + * \note This function is not available on all microcontroller architectures. + * * \param[in,out] CDCInterfaceInfo Pointer to a structure containing a CDC Class configuration and state. * \param[in,out] Stream Pointer to a FILE structure where the created stream should be placed. */ @@ -325,10 +330,12 @@ #if !defined(__DOXYGEN__) /* Function Prototypes: */ #if defined(__INCLUDE_FROM_CDC_HOST_C) + #if defined(FDEV_SETUP_STREAM) static int CDC_Host_putchar(char c, FILE* Stream) ATTR_NON_NULL_PTR_ARG(2); static int CDC_Host_getchar(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); static int CDC_Host_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); + #endif void CDC_Host_Event_Stub(void) ATTR_CONST; void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) diff --git a/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h b/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h index d1ced57d4..927104755 100644 --- a/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h +++ b/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h @@ -96,7 +96,7 @@ * a unique serial number internally, and setting the device descriptors serial number string index to this value * will cause it to use the internal serial number. * - * On unsupported devices, this will evaluate to NO_DESCRIPTOR and so will force the host to create a pseudo-serial + * On unsupported devices, this will evaluate to \ref NO_DESCRIPTOR and so will force the host to create a pseudo-serial * number for the device. */ #define USE_INTERNAL_SERIAL 0xDC diff --git a/LUFA/Drivers/USB/Core/UC3B/Device_UC3B.c b/LUFA/Drivers/USB/Core/UC3B/Device_UC3B.c index 8ea9bd7aa..c6b41a81c 100644 --- a/LUFA/Drivers/USB/Core/UC3B/Device_UC3B.c +++ b/LUFA/Drivers/USB/Core/UC3B/Device_UC3B.c @@ -37,16 +37,10 @@ void USB_Device_SendRemoteWakeup(void) { - if (!(USB_Options & USB_OPT_MANUAL_PLL)) - { - USB_PLL_On(); - while (!(USB_PLL_IsReady())); - } - USB_CLK_Unfreeze(); - AVR32_USBB.UDCON.rmwakeup = true; - while (AVR32_USBB.UDCON.rmwakeup); + AVR32_USBB.UDCON.rmwkup = true; + while (AVR32_USBB.UDCON.rmwkup); } #endif diff --git a/LUFA/Drivers/USB/Core/UC3B/Device_UC3B.h b/LUFA/Drivers/USB/Core/UC3B/Device_UC3B.h index 7d4802722..73abc107e 100644 --- a/LUFA/Drivers/USB/Core/UC3B/Device_UC3B.h +++ b/LUFA/Drivers/USB/Core/UC3B/Device_UC3B.h @@ -82,23 +82,16 @@ #define USB_DEVICE_OPT_FULLSPEED (0 << 0) //@} - #if (!defined(NO_INTERNAL_SERIAL) && \ - (defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1287__) || \ - defined(__AVR_ATmega32U6__) || defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__) || \ - defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega8U2__))) - /** String descriptor index for the device's unique serial number string descriptor within the device. - * This unique serial number is used by the host to associate resources to the device (such as drivers or COM port - * number allocations) to a device regardless of the port it is plugged in to on the host. Some USB AVRs contain - * a unique serial number internally, and setting the device descriptors serial number string index to this value - * will cause it to use the internal serial number. - * - * On unsupported devices, this will evaluate to NO_DESCRIPTOR and so will force the host to create a pseudo-serial - * number for the device. - */ - #define USE_INTERNAL_SERIAL 0xDC - #else - #define USE_INTERNAL_SERIAL NO_DESCRIPTOR - #endif + /** String descriptor index for the device's unique serial number string descriptor within the device. + * This unique serial number is used by the host to associate resources to the device (such as drivers or COM port + * number allocations) to a device regardless of the port it is plugged in to on the host. Some USB AVRs contain + * a unique serial number internally, and setting the device descriptors serial number string index to this value + * will cause it to use the internal serial number. + * + * On unsupported devices, this will evaluate to \ref NO_DESCRIPTOR and so will force the host to create a pseudo-serial + * number for the device. + */ + #define USE_INTERNAL_SERIAL NO_DESCRIPTOR /* Function Prototypes: */ /** Sends a Remote Wakeup request to the host. This signals to the host that the device should @@ -205,7 +198,7 @@ static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void USB_Device_SetDeviceAddress(const uint8_t Address) { - AVR32_USBB.udcon = (AVR32_USBB.udcon & ~AVR32_USBB_UADD_MASK) | Address; + AVR32_USBB.UDCON.uadd = Address; AVR32_USBB.UDCON.adden = true; } diff --git a/LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.c b/LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.c index 05a81f273..1f5004d7e 100644 --- a/LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.c +++ b/LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.c @@ -48,20 +48,19 @@ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number, Endpoint_SelectEndpoint(Number); Endpoint_EnableEndpoint(); - *((uint32_t*)AVR32_USBB_UECFG0)[USB_SelectedEndpoint] = 0; - *((uint32_t*)AVR32_USBB_UECFG0)[USB_SelectedEndpoint] = UECFGXData; + ((uint32_t*)AVR32_USBB_UECFG0)[USB_SelectedEndpoint] = 0; + ((uint32_t*)AVR32_USBB_UECFG0)[USB_SelectedEndpoint] = UECFGXData; return Endpoint_IsConfigured(); } void Endpoint_ClearEndpoints(void) { - UEINT = 0; - for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) { Endpoint_SelectEndpoint(EPNum); - *((uint32_t*)AVR32_USBB_UECFG0)[USB_SelectedEndpoint] = 0; + ((uint32_t*)AVR32_USBB_UECFG0)[USB_SelectedEndpoint] = 0; + ((uint32_t*)AVR32_USBB_UECON0CLR)[USB_SelectedEndpoint] = 0xFFFFFFFF; Endpoint_DisableEndpoint(); } } diff --git a/LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.h b/LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.h index b95415c84..7f743750a 100644 --- a/LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.h +++ b/LUFA/Drivers/USB/Core/UC3B/Endpoint_UC3B.h @@ -166,21 +166,21 @@ * in slower transfers as only one USB device (the AVR or the host) can access the endpoint's * bank at the one time. */ - #define ENDPOINT_BANK_SINGLE AVR32_USBB_UECFG0_EPBK0_SINGLE + #define ENDPOINT_BANK_SINGLE AVR32_USBB_UECFG0_EPBK_SINGLE /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates * that the endpoint should have two banks, which requires more USB FIFO memory but results * in faster transfers as one USB device (the AVR or the host) can access one bank while the other * accesses the second bank. */ - #define ENDPOINT_BANK_DOUBLE AVR32_USBB_UECFG0_EPBK0_DOUBLE + #define ENDPOINT_BANK_DOUBLE AVR32_USBB_UECFG0_EPBK_DOUBLE /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates * that the endpoint should have three banks, which requires more USB FIFO memory but results * in faster transfers as one USB device (the AVR or the host) can access one bank while the other * accesses the remaining banks. */ - #define ENDPOINT_BANK_TRIPLE AVR32_USBB_UECFG0_TRIPLE + #define ENDPOINT_BANK_TRIPLE AVR32_USBB_UECFG0_EPBK_TRIPLE //@} /** Endpoint address for the default control endpoint, which always resides in address 0. This is diff --git a/LUFA/Drivers/USB/Core/UC3B/Pipe_UC3B.c b/LUFA/Drivers/USB/Core/UC3B/Pipe_UC3B.c index 8a054da61..9d9c60094 100644 --- a/LUFA/Drivers/USB/Core/UC3B/Pipe_UC3B.c +++ b/LUFA/Drivers/USB/Core/UC3B/Pipe_UC3B.c @@ -48,12 +48,12 @@ bool Pipe_ConfigurePipe(const uint8_t Number, Pipe_SelectPipe(Number); Pipe_EnablePipe(); - *((uint32_t*)AVR32_USBB_UPCFG0)[USB_SelectedPipe] = 0; - *((uint32_t*)AVR32_USBB_UPCFG0)[USB_SelectedPipe] = (AVR32_USBB_ALLOC_MASK | - ((uint32_t)Type << AVR32_USBB_PTYPE_OFFSET) | - ((uint32_t)Token << AVR32_USBB_PTOKEN_OFFSET) | - ((uint32_t)Banks << AVR32_USBB_PBK_OFFSET) | - ((EndpointNumber & PIPE_EPNUM_MASK) << AVR32_USBB_PEPNUM_OFFSET)); + ((uint32_t*)AVR32_USBB_UPCFG0)[USB_SelectedPipe] = 0; + ((uint32_t*)AVR32_USBB_UPCFG0)[USB_SelectedPipe] = (AVR32_USBB_ALLOC_MASK | + ((uint32_t)Type << AVR32_USBB_PTYPE_OFFSET) | + ((uint32_t)Token << AVR32_USBB_PTOKEN_OFFSET) | + ((uint32_t)Banks << AVR32_USBB_PBK_OFFSET) | + ((EndpointNumber & PIPE_EPNUM_MASK) << AVR32_USBB_PEPNUM_OFFSET)); Pipe_SetInfiniteINRequests(); @@ -62,12 +62,11 @@ bool Pipe_ConfigurePipe(const uint8_t Number, void Pipe_ClearPipes(void) { - UPINT = 0; - for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++) { Pipe_SelectPipe(PNum); - *((uint32_t*)AVR32_USBB_UPCFG0)[USB_SelectedPipe] = 0; + ((uint32_t*)AVR32_USBB_UPCFG0)[USB_SelectedPipe] = 0; + ((uint32_t*)AVR32_USBB_UPCON0CLR)[USB_SelectedPipe] = 0xFFFFFFFF; Pipe_DisablePipe(); } } diff --git a/LUFA/Drivers/USB/Core/UC3B/USBController_UC3B.h b/LUFA/Drivers/USB/Core/UC3B/USBController_UC3B.h index f528c6b1c..7eb69cd4d 100644 --- a/LUFA/Drivers/USB/Core/UC3B/USBController_UC3B.h +++ b/LUFA/Drivers/USB/Core/UC3B/USBController_UC3B.h @@ -121,6 +121,18 @@ #endif /* Inline Functions: */ + /** Determines if the VBUS line is currently high (i.e. the USB host is supplying power). + * + * \note This function is not available on some AVR models which do not support hardware VBUS monitoring. + * + * \return Boolean \c true if the VBUS line is currently detecting power from a host, \c false otherwise. + */ + static inline bool USB_VBUS_GetStatus(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; + static inline bool USB_VBUS_GetStatus(void) + { + return AVR32_USBB.USBSTA.vbus; + } + /** Detaches the device from the USB bus. This has the effect of removing the device from any * attached host, ceasing USB communications. If no host is present, this prevents any host from * enumerating the device once attached until \ref USB_Attach() is called. @@ -278,7 +290,6 @@ #endif /* Inline Functions: */ - #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) static inline void USB_OTGPAD_On(void) ATTR_ALWAYS_INLINE; static inline void USB_OTGPAD_On(void) { @@ -290,7 +301,6 @@ { AVR32_USBB.USBCON.otgpade = false; } - #endif static inline void USB_CLK_Freeze(void) ATTR_ALWAYS_INLINE; static inline void USB_CLK_Freeze(void) diff --git a/LUFA/Drivers/USB/Core/UC3B/USBInterrupt_UC3B.c b/LUFA/Drivers/USB/Core/UC3B/USBInterrupt_UC3B.c index 9324acfe9..beab9f0da 100644 --- a/LUFA/Drivers/USB/Core/UC3B/USBInterrupt_UC3B.c +++ b/LUFA/Drivers/USB/Core/UC3B/USBInterrupt_UC3B.c @@ -33,45 +33,23 @@ void USB_INT_DisableAllInterrupts(void) { - #if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) - USBCON &= ~((1 << VBUSTE) | (1 << IDTE)); - #elif defined(USB_SERIES_4_AVR) - USBCON &= ~(1 << VBUSTE); - #endif - - #if defined(USB_CAN_BE_BOTH) - OTGIEN = 0; - #endif - - #if defined(USB_CAN_BE_HOST) - UHIEN = 0; - #endif + AVR32_USBB.USBCON.vbuste = false; + AVR32_USBB.USBCON.idte = false; - #if defined(USB_CAN_BE_DEVICE) - UDIEN = 0; - #endif + AVR32_USBB.uhinteclr = 0xFFFFFFFF; + AVR32_USBB.udinteclr = 0xFFFFFFFF; } void USB_INT_ClearAllInterrupts(void) { - #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) - USBINT = 0; - #endif + AVR32_USBB.USBSTACLR.vbustic = true; + AVR32_USBB.USBSTACLR.idtic = true; - #if defined(USB_CAN_BE_BOTH) - OTGINT = 0; - #endif - - #if defined(USB_CAN_BE_HOST) - UHINT = 0; - #endif - - #if defined(USB_CAN_BE_DEVICE) - UDINT = 0; - #endif + AVR32_USBB.uhintclr = 0xFFFFFFFF; + AVR32_USBB.udintclr = 0xFFFFFFFF; } -ISR(USB_GEN_vect, ISR_BLOCK) +ISR(USB_GEN_vect) { #if defined(USB_CAN_BE_DEVICE) #if !defined(NO_SOF_EVENTS) @@ -83,7 +61,6 @@ ISR(USB_GEN_vect, ISR_BLOCK) } #endif - #if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) if (USB_INT_HasOccurred(USB_INT_VBUS) && USB_INT_IsEnabled(USB_INT_VBUS)) { USB_INT_Clear(USB_INT_VBUS); @@ -99,7 +76,6 @@ ISR(USB_GEN_vect, ISR_BLOCK) EVENT_USB_Device_Disconnect(); } } - #endif if (USB_INT_HasOccurred(USB_INT_SUSPI) && USB_INT_IsEnabled(USB_INT_SUSPI)) { @@ -110,26 +86,12 @@ ISR(USB_GEN_vect, ISR_BLOCK) USB_CLK_Freeze(); - if (!(USB_Options & USB_OPT_MANUAL_PLL)) - USB_PLL_Off(); - - #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT) - USB_DeviceState = DEVICE_STATE_Unattached; - EVENT_USB_Device_Disconnect(); - #else USB_DeviceState = DEVICE_STATE_Suspended; EVENT_USB_Device_Suspend(); - #endif } if (USB_INT_HasOccurred(USB_INT_WAKEUPI) && USB_INT_IsEnabled(USB_INT_WAKEUPI)) { - if (!(USB_Options & USB_OPT_MANUAL_PLL)) - { - USB_PLL_On(); - while (!(USB_PLL_IsReady())); - } - USB_CLK_Unfreeze(); USB_INT_Clear(USB_INT_WAKEUPI); @@ -142,11 +104,7 @@ ISR(USB_GEN_vect, ISR_BLOCK) else USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; - #if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT) - EVENT_USB_Device_Connect(); - #else EVENT_USB_Device_WakeUp(); - #endif } if (USB_INT_HasOccurred(USB_INT_EORSTI) && USB_INT_IsEnabled(USB_INT_EORSTI)) diff --git a/LUFA/Drivers/USB/Core/UC3B/USBInterrupt_UC3B.h b/LUFA/Drivers/USB/Core/UC3B/USBInterrupt_UC3B.h index 5de68ed3e..e7ad1e82d 100644 --- a/LUFA/Drivers/USB/Core/UC3B/USBInterrupt_UC3B.h +++ b/LUFA/Drivers/USB/Core/UC3B/USBInterrupt_UC3B.h @@ -57,31 +57,243 @@ /* Private Interface - For use in library only: */ #if !defined(__DOXYGEN__) /* Macros: */ - #define USB_INT_Enable(int) MACROS{ USB_INT_GET_EN_REG(int) |= USB_INT_GET_EN_MASK(int); }MACROE - #define USB_INT_Disable(int) MACROS{ USB_INT_GET_EN_REG(int) &= ~(USB_INT_GET_EN_MASK(int)); }MACROE - #define USB_INT_Clear(int) MACROS{ USB_INT_GET_INT_REG(int) &= ~(USB_INT_GET_INT_MASK(int)); }MACROE - #define USB_INT_IsEnabled(int) ((USB_INT_GET_EN_REG(int) & USB_INT_GET_EN_MASK(int)) ? true : false) - #define USB_INT_HasOccurred(int) ((USB_INT_GET_INT_REG(int) & USB_INT_GET_INT_MASK(int)) ? true : false) - - #define USB_INT_GET_EN_REG(EnableReg, EnableMask, FlagReg, FlagMask) EnableReg - #define USB_INT_GET_EN_MASK(EnableReg, EnableMask, FlagReg, FlagMask) EnableMask - #define USB_INT_GET_INT_REG(EnableReg, EnableMask, FlagReg, FlagMask) FlagReg - #define USB_INT_GET_INT_MASK(EnableReg, EnableMask, FlagReg, FlagMask) FlagMask + enum USB_Interrupts_t + { + USB_INT_VBUS = 0, + USB_INT_IDTI = 1, + USB_INT_WAKEUPI = 2, + USB_INT_SUSPI = 3, + USB_INT_EORSTI = 4, + USB_INT_DCONNI = 5, + USB_INT_DDISCI = 6, + USB_INT_BCERRI = 7, + USB_INT_VBERRI = 8, + USB_INT_SOFI = 9, + USB_INT_HSOFI = 10, + USB_INT_RSTI = 11, + USB_INT_SRPI = 12, + USB_INT_RXSTPI = 13, + }; - #define USB_INT_VBUS USBCON, (1 << VBUSTE) , USBINT, (1 << VBUSTI) - #define USB_INT_IDTI USBCON, (1 << IDTE) , USBINT, (1 << IDTI) - #define USB_INT_WAKEUPI UDIEN , (1 << WAKEUPE), UDINT , (1 << WAKEUPI) - #define USB_INT_SUSPI UDIEN , (1 << SUSPE) , UDINT , (1 << SUSPI) - #define USB_INT_EORSTI UDIEN , (1 << EORSTE) , UDINT , (1 << EORSTI) - #define USB_INT_DCONNI UHIEN , (1 << DCONNE) , UHINT , (1 << DCONNI) - #define USB_INT_DDISCI UHIEN , (1 << DDISCE) , UHINT , (1 << DDISCI) - #define USB_INT_BCERRI OTGIEN, (1 << BCERRE) , OTGINT, (1 << BCERRI) - #define USB_INT_VBERRI OTGIEN, (1 << VBERRE) , OTGINT, (1 << VBERRI) - #define USB_INT_SOFI UDIEN, (1 << SOFE) , UDINT , (1 << SOFI) - #define USB_INT_HSOFI UHIEN, (1 << HSOFE) , UHINT , (1 << HSOFI) - #define USB_INT_RSTI UHIEN , (1 << RSTE) , UHINT , (1 << RSTI) - #define USB_INT_SRPI OTGIEN, (1 << SRPE) , OTGINT, (1 << SRPI) - #define USB_INT_RXSTPI UEIENX, (1 << RXSTPE) , UEINTX, (1 << RXSTPI) + static inline void USB_INT_Enable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE; + static inline void USB_INT_Enable(const uint8_t Interrupt) + { + switch (Interrupt) + { + case USB_INT_VBUS: + AVR32_USBB.USBCON.vbuste = true; + break; + case USB_INT_IDTI: + AVR32_USBB.USBCON.idte = true; + break; + case USB_INT_WAKEUPI: + AVR32_USBB.UDINTESET.wakeupes = true; + break; + case USB_INT_SUSPI: + AVR32_USBB.UDINTESET.suspes = true; + break; + case USB_INT_EORSTI: + AVR32_USBB.UDINTESET.eorstes = true; + break; + case USB_INT_DCONNI: + AVR32_USBB.UHINTESET.dconnies = true; + break; + case USB_INT_DDISCI: + AVR32_USBB.UHINTESET.ddiscies = true; + break; + case USB_INT_BCERRI: + AVR32_USBB.USBCON.bcerre = true; + break; + case USB_INT_VBERRI: + AVR32_USBB.USBCON.vberre = true; + break; + case USB_INT_SOFI: + AVR32_USBB.UDINTESET.sofes = true; + break; + case USB_INT_HSOFI: + AVR32_USBB.UHINTESET.hsofies = true; + break; + case USB_INT_RSTI: + AVR32_USBB.UHINTESET.rsties = true; + break; + case USB_INT_SRPI: + case USB_INT_RXSTPI: + // TODO + return; + } + } + + static inline void USB_INT_Disable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE; + static inline void USB_INT_Disable(const uint8_t Interrupt) + { + switch (Interrupt) + { + case USB_INT_VBUS: + AVR32_USBB.USBCON.vbuste = false; + break; + case USB_INT_IDTI: + AVR32_USBB.USBCON.idte = false; + break; + case USB_INT_WAKEUPI: + AVR32_USBB.UDINTECLR.wakeupec = true; + break; + case USB_INT_SUSPI: + AVR32_USBB.UDINTECLR.suspec = true; + break; + case USB_INT_EORSTI: + AVR32_USBB.UDINTECLR.eorstec = true; + break; + case USB_INT_DCONNI: + AVR32_USBB.UHINTECLR.dconniec = true; + break; + case USB_INT_DDISCI: + AVR32_USBB.UHINTECLR.ddisciec = true; + break; + case USB_INT_BCERRI: + AVR32_USBB.USBCON.bcerre = false; + break; + case USB_INT_VBERRI: + AVR32_USBB.USBCON.vberre = false; + break; + case USB_INT_SOFI: + AVR32_USBB.UDINTECLR.sofec = true; + break; + case USB_INT_HSOFI: + AVR32_USBB.UHINTECLR.hsofiec = true; + break; + case USB_INT_RSTI: + AVR32_USBB.UHINTECLR.rstiec = true; + break; + case USB_INT_SRPI: + case USB_INT_RXSTPI: + // TODO + return; + } + } + + static inline void USB_INT_Clear(const uint8_t Interrupt) ATTR_ALWAYS_INLINE; + static inline void USB_INT_Clear(const uint8_t Interrupt) + { + switch (Interrupt) + { + case USB_INT_VBUS: + AVR32_USBB.USBSTACLR.vbustic = true; + break; + case USB_INT_IDTI: + AVR32_USBB.USBSTACLR.idtic = true; + break; + case USB_INT_WAKEUPI: + AVR32_USBB.UDINTCLR.wakeupc = true; + break; + case USB_INT_SUSPI: + AVR32_USBB.UDINTCLR.suspc = true; + break; + case USB_INT_EORSTI: + AVR32_USBB.UDINTCLR.eorstc = true; + break; + case USB_INT_DCONNI: + AVR32_USBB.UHINTCLR.dconnic = true; + break; + case USB_INT_DDISCI: + AVR32_USBB.UHINTCLR.ddiscic = true; + break; + case USB_INT_BCERRI: + AVR32_USBB.USBSTACLR.bcerric = true; + break; + case USB_INT_VBERRI: + AVR32_USBB.USBSTACLR.vberric = true; + break; + case USB_INT_SOFI: + AVR32_USBB.UDINTCLR.sofc = true; + break; + case USB_INT_HSOFI: + AVR32_USBB.UHINTCLR.hsofic = true; + break; + case USB_INT_RSTI: + AVR32_USBB.UHINTCLR.rstic = true; + break; + case USB_INT_SRPI: + case USB_INT_RXSTPI: + // TODO + return; + } + } + + static inline bool USB_INT_IsEnabled(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; + static inline bool USB_INT_IsEnabled(const uint8_t Interrupt) + { + switch (Interrupt) + { + case USB_INT_VBUS: + return AVR32_USBB.USBCON.vbuste; + case USB_INT_IDTI: + return AVR32_USBB.USBCON.idte; + case USB_INT_WAKEUPI: + return AVR32_USBB.UDINTE.wakeupe; + case USB_INT_SUSPI: + return AVR32_USBB.UDINTE.suspe; + case USB_INT_EORSTI: + return AVR32_USBB.UDINTE.eorste; + case USB_INT_DCONNI: + return AVR32_USBB.UHINTE.dconnie; + case USB_INT_DDISCI: + return AVR32_USBB.UHINTE.ddiscie; + case USB_INT_BCERRI: + return AVR32_USBB.USBCON.bcerre; + case USB_INT_VBERRI: + return AVR32_USBB.USBCON.vberre; + case USB_INT_SOFI: + return AVR32_USBB.UDINTE.sofe; + case USB_INT_HSOFI: + return AVR32_USBB.UHINTE.hsofie; + case USB_INT_RSTI: + return AVR32_USBB.UHINTE.rstie; + case USB_INT_SRPI: + case USB_INT_RXSTPI: + // TODO + return false; + } + + return false; + } + + static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; + static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) + { + switch (Interrupt) + { + case USB_INT_VBUS: + return AVR32_USBB.USBSTA.vbusti; + case USB_INT_IDTI: + return AVR32_USBB.USBSTA.idti; + case USB_INT_WAKEUPI: + return AVR32_USBB.UDINT.wakeup; + case USB_INT_SUSPI: + return AVR32_USBB.UDINT.susp; + case USB_INT_EORSTI: + return AVR32_USBB.UDINT.eorst; + case USB_INT_DCONNI: + return AVR32_USBB.UHINT.dconni; + case USB_INT_DDISCI: + return AVR32_USBB.UHINT.ddisci; + case USB_INT_BCERRI: + return AVR32_USBB.USBSTA.bcerri; + case USB_INT_VBERRI: + return AVR32_USBB.USBSTA.vberri; + case USB_INT_SOFI: + return AVR32_USBB.UDINT.sof; + case USB_INT_HSOFI: + return AVR32_USBB.UHINT.hsofi; + case USB_INT_RSTI: + return AVR32_USBB.UHINT.rsti; + case USB_INT_SRPI: + case USB_INT_RXSTPI: + // TODO + return false; + } + + return false; + } /* Includes: */ #include "../USBMode.h" -- cgit v1.2.3