Add high speed USB support for the UC3 devices containing a high speed USB controller.

Add device support preprocessor checks and use symbolic bit names in the UC3 platform clock management driver.
Dean Camera 14 years ago
parent 13951ab043
commit f4528c4aef
  1. 45
      LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h
  2. 66
      LUFA/Drivers/USB/Core/UC3/Device_UC3.h
  3. 15
      LUFA/Drivers/USB/Core/UC3/USBController_UC3.c
  4. 8
      LUFA/Drivers/USB/Core/UC3/USBController_UC3.h
  5. 20
      LUFA/Platform/UC3/ClockManagement.h

@ -50,6 +50,7 @@
/* Includes: */ /* Includes: */
#include "../../../../Common/Common.h" #include "../../../../Common/Common.h"
#include "../USBController.h"
#include "../StdDescriptors.h" #include "../StdDescriptors.h"
#include "../USBInterrupt.h" #include "../USBInterrupt.h"
#include "../Endpoint.h" #include "../Endpoint.h"
@ -155,34 +156,34 @@
} }
#if !defined(NO_SOF_EVENTS) #if !defined(NO_SOF_EVENTS)
/** Enables the device mode Start Of Frame events. When enabled, this causes the /** Enables the device mode Start Of Frame events. When enabled, this causes the
* \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus, * \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
* at the start of each USB frame when enumerated in device mode. * at the start of each USB frame when enumerated in device mode.
* *
* \note Not available when the \c NO_SOF_EVENTS compile time token is defined. * \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
*/ */
static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE; static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
static inline void USB_Device_EnableSOFEvents(void) static inline void USB_Device_EnableSOFEvents(void)
{ {
USB_INT_Enable(USB_INT_SOFI); USB_INT_Enable(USB_INT_SOFI);
} }
/** Disables the device mode Start Of Frame events. When disabled, this stops the firing of the /** Disables the device mode Start Of Frame events. When disabled, this stops the firing of the
* \ref EVENT_USB_Device_StartOfFrame() event when enumerated in device mode. * \ref EVENT_USB_Device_StartOfFrame() event when enumerated in device mode.
* *
* \note Not available when the \c NO_SOF_EVENTS compile time token is defined. * \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
*/ */
static inline void USB_Device_DisableSOFEvents(void) ATTR_ALWAYS_INLINE; static inline void USB_Device_DisableSOFEvents(void) ATTR_ALWAYS_INLINE;
static inline void USB_Device_DisableSOFEvents(void) static inline void USB_Device_DisableSOFEvents(void)
{ {
USB_INT_Disable(USB_INT_SOFI); USB_INT_Disable(USB_INT_SOFI);
} }
#endif #endif
/* Private Interface - For use in library only: */ /* Private Interface - For use in library only: */
#if !defined(__DOXYGEN__) #if !defined(__DOXYGEN__)
/* Inline Functions: */ /* Inline Functions: */
#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) #if defined(USB_DEVICE_OPT_LOWSPEED)
static inline void USB_Device_SetLowSpeed(void) ATTR_ALWAYS_INLINE; static inline void USB_Device_SetLowSpeed(void) ATTR_ALWAYS_INLINE;
static inline void USB_Device_SetLowSpeed(void) static inline void USB_Device_SetLowSpeed(void)
{ {

@ -50,6 +50,7 @@
/* Includes: */ /* Includes: */
#include "../../../../Common/Common.h" #include "../../../../Common/Common.h"
#include "../USBController.h"
#include "../StdDescriptors.h" #include "../StdDescriptors.h"
#include "../USBInterrupt.h" #include "../USBInterrupt.h"
#include "../Endpoint.h" #include "../Endpoint.h"
@ -80,6 +81,13 @@
* USB interface should be initialized in full speed (12Mb/s) mode. * USB interface should be initialized in full speed (12Mb/s) mode.
*/ */
#define USB_DEVICE_OPT_FULLSPEED (0 << 0) #define USB_DEVICE_OPT_FULLSPEED (0 << 0)
#if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32) || defined(__DOXYGEN__)
/** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
* USB interface should be initialized in high speed (480Mb/s) mode.
*/
#define USB_DEVICE_OPT_HIGHSPEED (1 << 1)
#endif
//@} //@}
#if (!defined(NO_INTERNAL_SERIAL) && \ #if (!defined(NO_INTERNAL_SERIAL) && \
@ -145,28 +153,28 @@
} }
#if !defined(NO_SOF_EVENTS) #if !defined(NO_SOF_EVENTS)
/** Enables the device mode Start Of Frame events. When enabled, this causes the /** Enables the device mode Start Of Frame events. When enabled, this causes the
* \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus, * \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
* at the start of each USB frame when enumerated in device mode. * at the start of each USB frame when enumerated in device mode.
* *
* \note Not available when the \c NO_SOF_EVENTS compile time token is defined. * \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
*/ */
static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE; static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
static inline void USB_Device_EnableSOFEvents(void) static inline void USB_Device_EnableSOFEvents(void)
{ {
USB_INT_Enable(USB_INT_SOFI); USB_INT_Enable(USB_INT_SOFI);
} }
/** Disables the device mode Start Of Frame events. When disabled, this stops the firing of the /** Disables the device mode Start Of Frame events. When disabled, this stops the firing of the
* \ref EVENT_USB_Device_StartOfFrame() event when enumerated in device mode. * \ref EVENT_USB_Device_StartOfFrame() event when enumerated in device mode.
* *
* \note Not available when the \c NO_SOF_EVENTS compile time token is defined. * \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
*/ */
static inline void USB_Device_DisableSOFEvents(void) ATTR_ALWAYS_INLINE; static inline void USB_Device_DisableSOFEvents(void) ATTR_ALWAYS_INLINE;
static inline void USB_Device_DisableSOFEvents(void) static inline void USB_Device_DisableSOFEvents(void)
{ {
USB_INT_Disable(USB_INT_SOFI); USB_INT_Disable(USB_INT_SOFI);
} }
#endif #endif
/* Private Interface - For use in library only: */ /* Private Interface - For use in library only: */
@ -175,15 +183,27 @@
static inline void USB_Device_SetLowSpeed(void) ATTR_ALWAYS_INLINE; static inline void USB_Device_SetLowSpeed(void) ATTR_ALWAYS_INLINE;
static inline void USB_Device_SetLowSpeed(void) static inline void USB_Device_SetLowSpeed(void)
{ {
AVR32_USBB.UDCON.ls = true; AVR32_USBB.UDCON.ls = true;
} }
static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE; static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE;
static inline void USB_Device_SetFullSpeed(void) static inline void USB_Device_SetFullSpeed(void)
{ {
AVR32_USBB.UDCON.ls = false; AVR32_USBB.UDCON.ls = false;
#if defined(USB_DEVICE_OPT_HIGHSPEED)
AVR32_USBB.UDCON.spdconf = 3;
#endif
} }
#if defined(USB_DEVICE_OPT_HIGHSPEED)
static inline void USB_Device_SetHighSpeed(void) ATTR_ALWAYS_INLINE;
static inline void USB_Device_SetHighSpeed(void)
{
AVR32_USBB.UDCON.ls = false;
AVR32_USBB.UDCON.spdconf = 0;
}
#endif
static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
static inline void USB_Device_SetDeviceAddress(const uint8_t Address) static inline void USB_Device_SetDeviceAddress(const uint8_t Address)
{ {

@ -166,9 +166,20 @@ static void USB_Init_Device(void)
#endif #endif
if (USB_Options & USB_DEVICE_OPT_LOWSPEED) if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
USB_Device_SetLowSpeed(); {
USB_Device_SetLowSpeed();
}
else else
USB_Device_SetFullSpeed(); {
#if defined(USB_DEVICE_OPT_HIGHSPEED)
if (USB_Options & USB_DEVICE_OPT_HIGHSPEED)
USB_Device_SetHighSpeed();
else
USB_Device_SetFullSpeed();
#else
USB_Device_SetFullSpeed();
#endif
}
USB_INT_Enable(USB_INT_VBUSTI); USB_INT_Enable(USB_INT_VBUSTI);

@ -92,19 +92,19 @@
* generation module. This indicates that an external oscillator should be used directly instead of an * generation module. This indicates that an external oscillator should be used directly instead of an
* internal PLL clock source. * internal PLL clock source.
*/ */
#define USB_OPT_GCLK_SRC_OSC (1 << 1) #define USB_OPT_GCLK_SRC_OSC (1 << 2)
/** Selects one of the system's PLL oscillators as the input clock to the USB Generic Clock source /** Selects one of the system's PLL oscillators as the input clock to the USB Generic Clock source
* generation module. This indicates that one of the device's PLL outputs should be used instead of an * generation module. This indicates that one of the device's PLL outputs should be used instead of an
* external oscillator source. * external oscillator source.
*/ */
#define USB_OPT_GCLK_SRC_PLL (0 << 1) #define USB_OPT_GCLK_SRC_PLL (0 << 2)
/** Selects PLL or External Oscillator 0 as the USB Generic Clock source module input clock. */ /** Selects PLL or External Oscillator 0 as the USB Generic Clock source module input clock. */
#define USB_OPT_GCLK_CHANNEL_0 (1 << 2) #define USB_OPT_GCLK_CHANNEL_0 (1 << 3)
/** Selects PLL or External Oscillator 1 as the USB Generic Clock source module input clock. */ /** Selects PLL or External Oscillator 1 as the USB Generic Clock source module input clock. */
#define USB_OPT_GCLK_CHANNEL_1 (0 << 2) #define USB_OPT_GCLK_CHANNEL_1 (0 << 3)
//@} //@}
/** \name Endpoint/Pipe Type Masks */ /** \name Endpoint/Pipe Type Masks */

@ -233,19 +233,19 @@
switch (Source) switch (Source)
{ {
case CLOCK_SRC_OSC0: case CLOCK_SRC_OSC0:
AVR32_PM.GCCTRL[Channel].pllsel = 0; AVR32_PM.GCCTRL[Channel].pllsel = false;
AVR32_PM.GCCTRL[Channel].oscsel = 0; AVR32_PM.GCCTRL[Channel].oscsel = 0;
break; break;
case CLOCK_SRC_OSC1: case CLOCK_SRC_OSC1:
AVR32_PM.GCCTRL[Channel].pllsel = 0; AVR32_PM.GCCTRL[Channel].pllsel = false;
AVR32_PM.GCCTRL[Channel].oscsel = 1; AVR32_PM.GCCTRL[Channel].oscsel = 1;
break; break;
case CLOCK_SRC_PLL0: case CLOCK_SRC_PLL0:
AVR32_PM.GCCTRL[Channel].pllsel = 1; AVR32_PM.GCCTRL[Channel].pllsel = true;
AVR32_PM.GCCTRL[Channel].oscsel = 0; AVR32_PM.GCCTRL[Channel].oscsel = 0;
break; break;
case CLOCK_SRC_PLL1: case CLOCK_SRC_PLL1:
AVR32_PM.GCCTRL[Channel].pllsel = 1; AVR32_PM.GCCTRL[Channel].pllsel = true;
AVR32_PM.GCCTRL[Channel].oscsel = 1; AVR32_PM.GCCTRL[Channel].oscsel = 1;
break; break;
default: default:
@ -291,15 +291,21 @@
switch (Source) switch (Source)
{ {
#if defined(AVR32_PM_MCCTRL_MCSEL_SLOW)
case CLOCK_SRC_SLOW_CLK: case CLOCK_SRC_SLOW_CLK:
AVR32_PM.MCCTRL.mcsel = 0; AVR32_PM.MCCTRL.mcsel = AVR32_PM_MCCTRL_MCSEL_SLOW;
break; break;
#endif
#if defined(AVR32_PM_MCCTRL_MCSEL_OSC0)
case CLOCK_SRC_OSC0: case CLOCK_SRC_OSC0:
AVR32_PM.MCCTRL.mcsel = 1; AVR32_PM.MCCTRL.mcsel = AVR32_PM_MCCTRL_MCSEL_OSC0;
break; break;
#endif
#if defined(AVR32_PM_MCCTRL_MCSEL_PLL0)
case CLOCK_SRC_PLL0: case CLOCK_SRC_PLL0:
AVR32_PM.MCCTRL.mcsel = 2; AVR32_PM.MCCTRL.mcsel = AVR32_PM_MCCTRL_MCSEL_PLL0;
break; break;
#endif
default: default:
return false; return false;
} }

Loading…
Cancel
Save