mirror of
				https://github.com/mfulz/qmk_firmware.git
				synced 2025-11-03 23:02:34 +01:00 
			
		
		
		
	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.
This commit is contained in:
		
							parent
							
								
									13951ab043
								
							
						
					
					
						commit
						f4528c4aef
					
				@ -50,6 +50,7 @@
 | 
			
		||||
 | 
			
		||||
	/* Includes: */
 | 
			
		||||
		#include "../../../../Common/Common.h"
 | 
			
		||||
		#include "../USBController.h"
 | 
			
		||||
		#include "../StdDescriptors.h"
 | 
			
		||||
		#include "../USBInterrupt.h"
 | 
			
		||||
		#include "../Endpoint.h"
 | 
			
		||||
@ -155,34 +156,34 @@
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			#if !defined(NO_SOF_EVENTS)
 | 
			
		||||
			/** 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,
 | 
			
		||||
			 *  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.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void USB_Device_EnableSOFEvents(void)
 | 
			
		||||
			{
 | 
			
		||||
				USB_INT_Enable(USB_INT_SOFI);
 | 
			
		||||
			}
 | 
			
		||||
				/** 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,
 | 
			
		||||
				 *  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.
 | 
			
		||||
				 */
 | 
			
		||||
				static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
				static inline void USB_Device_EnableSOFEvents(void)
 | 
			
		||||
				{
 | 
			
		||||
					USB_INT_Enable(USB_INT_SOFI);
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			/** 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.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \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)
 | 
			
		||||
			{
 | 
			
		||||
				USB_INT_Disable(USB_INT_SOFI);
 | 
			
		||||
			}
 | 
			
		||||
				/** 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.
 | 
			
		||||
				 *
 | 
			
		||||
				 *  \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)
 | 
			
		||||
				{
 | 
			
		||||
					USB_INT_Disable(USB_INT_SOFI);
 | 
			
		||||
				}
 | 
			
		||||
			#endif
 | 
			
		||||
 | 
			
		||||
	/* Private Interface - For use in library only: */
 | 
			
		||||
	#if !defined(__DOXYGEN__)
 | 
			
		||||
		/* 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)
 | 
			
		||||
			{
 | 
			
		||||
 | 
			
		||||
@ -50,6 +50,7 @@
 | 
			
		||||
 | 
			
		||||
	/* Includes: */
 | 
			
		||||
		#include "../../../../Common/Common.h"
 | 
			
		||||
		#include "../USBController.h"
 | 
			
		||||
		#include "../StdDescriptors.h"
 | 
			
		||||
		#include "../USBInterrupt.h"
 | 
			
		||||
		#include "../Endpoint.h"
 | 
			
		||||
@ -80,6 +81,13 @@
 | 
			
		||||
			 *  USB interface should be initialized in full speed (12Mb/s) mode.
 | 
			
		||||
			 */
 | 
			
		||||
			#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) && \
 | 
			
		||||
@ -145,28 +153,28 @@
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			#if !defined(NO_SOF_EVENTS)
 | 
			
		||||
			/** 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,
 | 
			
		||||
			 *  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.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void USB_Device_EnableSOFEvents(void)
 | 
			
		||||
			{
 | 
			
		||||
				USB_INT_Enable(USB_INT_SOFI);
 | 
			
		||||
			}
 | 
			
		||||
				/** 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,
 | 
			
		||||
				 *  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.
 | 
			
		||||
				 */
 | 
			
		||||
				static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
				static inline void USB_Device_EnableSOFEvents(void)
 | 
			
		||||
				{
 | 
			
		||||
					USB_INT_Enable(USB_INT_SOFI);
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
			/** 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.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \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)
 | 
			
		||||
			{
 | 
			
		||||
				USB_INT_Disable(USB_INT_SOFI);
 | 
			
		||||
			}
 | 
			
		||||
				/** 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.
 | 
			
		||||
				 *
 | 
			
		||||
				 *  \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)
 | 
			
		||||
				{
 | 
			
		||||
					USB_INT_Disable(USB_INT_SOFI);
 | 
			
		||||
				}
 | 
			
		||||
			#endif
 | 
			
		||||
 | 
			
		||||
	/* 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)
 | 
			
		||||
			{
 | 
			
		||||
				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)
 | 
			
		||||
			{
 | 
			
		||||
				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)
 | 
			
		||||
			{
 | 
			
		||||
 | 
			
		||||
@ -166,9 +166,20 @@ static void USB_Init_Device(void)
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
 | 
			
		||||
	  USB_Device_SetLowSpeed();
 | 
			
		||||
	{
 | 
			
		||||
		USB_Device_SetLowSpeed();
 | 
			
		||||
	}
 | 
			
		||||
	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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -92,19 +92,19 @@
 | 
			
		||||
			 *  generation module. This indicates that an external oscillator should be used directly instead of an
 | 
			
		||||
			 *  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
 | 
			
		||||
			 *  generation module. This indicates that one of the device's PLL outputs should be used instead of an
 | 
			
		||||
			 *  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. */
 | 
			
		||||
			#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. */
 | 
			
		||||
			#define USB_OPT_GCLK_CHANNEL_1             (0 << 2)
 | 
			
		||||
			#define USB_OPT_GCLK_CHANNEL_1             (0 << 3)
 | 
			
		||||
			//@}
 | 
			
		||||
 | 
			
		||||
			/** \name Endpoint/Pipe Type Masks */
 | 
			
		||||
 | 
			
		||||
@ -233,19 +233,19 @@
 | 
			
		||||
				switch (Source)
 | 
			
		||||
				{
 | 
			
		||||
					case CLOCK_SRC_OSC0:
 | 
			
		||||
						AVR32_PM.GCCTRL[Channel].pllsel = 0;
 | 
			
		||||
						AVR32_PM.GCCTRL[Channel].pllsel = false;
 | 
			
		||||
						AVR32_PM.GCCTRL[Channel].oscsel = 0;
 | 
			
		||||
						break;
 | 
			
		||||
					case CLOCK_SRC_OSC1:
 | 
			
		||||
						AVR32_PM.GCCTRL[Channel].pllsel = 0;
 | 
			
		||||
						AVR32_PM.GCCTRL[Channel].pllsel = false;
 | 
			
		||||
						AVR32_PM.GCCTRL[Channel].oscsel = 1;
 | 
			
		||||
						break;
 | 
			
		||||
					case CLOCK_SRC_PLL0:
 | 
			
		||||
						AVR32_PM.GCCTRL[Channel].pllsel = 1;
 | 
			
		||||
						AVR32_PM.GCCTRL[Channel].pllsel = true;
 | 
			
		||||
						AVR32_PM.GCCTRL[Channel].oscsel = 0;
 | 
			
		||||
						break;
 | 
			
		||||
					case CLOCK_SRC_PLL1:
 | 
			
		||||
						AVR32_PM.GCCTRL[Channel].pllsel = 1;
 | 
			
		||||
						AVR32_PM.GCCTRL[Channel].pllsel = true;
 | 
			
		||||
						AVR32_PM.GCCTRL[Channel].oscsel = 1;
 | 
			
		||||
						break;
 | 
			
		||||
					default:
 | 
			
		||||
@ -291,15 +291,21 @@
 | 
			
		||||
 | 
			
		||||
				switch (Source)
 | 
			
		||||
				{
 | 
			
		||||
					#if defined(AVR32_PM_MCCTRL_MCSEL_SLOW)
 | 
			
		||||
					case CLOCK_SRC_SLOW_CLK:
 | 
			
		||||
						AVR32_PM.MCCTRL.mcsel = 0;
 | 
			
		||||
						AVR32_PM.MCCTRL.mcsel = AVR32_PM_MCCTRL_MCSEL_SLOW;
 | 
			
		||||
						break;
 | 
			
		||||
					#endif
 | 
			
		||||
					#if defined(AVR32_PM_MCCTRL_MCSEL_OSC0)
 | 
			
		||||
					case CLOCK_SRC_OSC0:
 | 
			
		||||
						AVR32_PM.MCCTRL.mcsel = 1;
 | 
			
		||||
						AVR32_PM.MCCTRL.mcsel = AVR32_PM_MCCTRL_MCSEL_OSC0;
 | 
			
		||||
						break;
 | 
			
		||||
					#endif
 | 
			
		||||
					#if defined(AVR32_PM_MCCTRL_MCSEL_PLL0)
 | 
			
		||||
					case CLOCK_SRC_PLL0:
 | 
			
		||||
						AVR32_PM.MCCTRL.mcsel = 2;
 | 
			
		||||
						AVR32_PM.MCCTRL.mcsel = AVR32_PM_MCCTRL_MCSEL_PLL0;
 | 
			
		||||
						break;
 | 
			
		||||
					#endif
 | 
			
		||||
					default:
 | 
			
		||||
						return false;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user