Squashed 'lib/lufa/' content from commit 385d40300
git-subtree-dir: lib/lufa git-subtree-split: 385d4030035dbaf41591309dbde47653bd03841b
This commit is contained in:
		
						commit
						60b30c0363
					
				
					 1455 changed files with 394541 additions and 0 deletions
				
			
		
							
								
								
									
										49
									
								
								LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,49 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "../../../../Common/Common.h"
 | 
			
		||||
#if (ARCH == ARCH_XMEGA)
 | 
			
		||||
 | 
			
		||||
#define  __INCLUDE_FROM_USB_DRIVER
 | 
			
		||||
#include "../USBMode.h"
 | 
			
		||||
 | 
			
		||||
#if defined(USB_CAN_BE_DEVICE)
 | 
			
		||||
 | 
			
		||||
#include "../Device.h"
 | 
			
		||||
 | 
			
		||||
void USB_Device_SendRemoteWakeup(void)
 | 
			
		||||
{
 | 
			
		||||
	USB.CTRLB |= USB_RWAKEUP_bm;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										266
									
								
								LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										266
									
								
								LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,266 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *  \brief USB Device definitions for the AVR XMEGA microcontrollers.
 | 
			
		||||
 *  \copydetails Group_Device_XMEGA
 | 
			
		||||
 *
 | 
			
		||||
 *  \note This file should not be included directly. It is automatically included as needed by the USB driver
 | 
			
		||||
 *        dispatch header located in LUFA/Drivers/USB/USB.h.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** \ingroup Group_Device
 | 
			
		||||
 *  \defgroup Group_Device_XMEGA Device Management (XMEGA)
 | 
			
		||||
 *  \brief USB Device definitions for the AVR XMEGA microcontrollers.
 | 
			
		||||
 *
 | 
			
		||||
 *  Architecture specific USB Device definitions for the Atmel AVR XMEGA microcontrollers.
 | 
			
		||||
 *
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __USBDEVICE_XMEGA_H__
 | 
			
		||||
#define __USBDEVICE_XMEGA_H__
 | 
			
		||||
 | 
			
		||||
	/* Includes: */
 | 
			
		||||
		#include "../../../../Common/Common.h"
 | 
			
		||||
		#include "../USBController.h"
 | 
			
		||||
		#include "../StdDescriptors.h"
 | 
			
		||||
		#include "../USBInterrupt.h"
 | 
			
		||||
		#include "../Endpoint.h"
 | 
			
		||||
 | 
			
		||||
	/* Enable C linkage for C++ Compilers: */
 | 
			
		||||
		#if defined(__cplusplus)
 | 
			
		||||
			extern "C" {
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
	/* Preprocessor Checks: */
 | 
			
		||||
		#if !defined(__INCLUDE_FROM_USB_DRIVER)
 | 
			
		||||
			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
		#if (defined(USE_RAM_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS))
 | 
			
		||||
			#error USE_RAM_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
		#if (defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS))
 | 
			
		||||
			#error USE_FLASH_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive.
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
		#if (defined(USE_FLASH_DESCRIPTORS) && defined(USE_RAM_DESCRIPTORS))
 | 
			
		||||
			#error USE_FLASH_DESCRIPTORS and USE_RAM_DESCRIPTORS are mutually exclusive.
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
	/* Public Interface - May be used in end-application: */
 | 
			
		||||
		/* Macros: */
 | 
			
		||||
			/** \name USB Device Mode Option Masks */
 | 
			
		||||
			//@{
 | 
			
		||||
			/** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
 | 
			
		||||
			 *  USB interface should be initialized in low speed (1.5Mb/s) mode.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note Low Speed mode is not available on all USB AVR models.
 | 
			
		||||
			 *        \n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note Restrictions apply on the number, size and type of endpoints which can be used
 | 
			
		||||
			 *        when running in low speed mode - refer to the USB 2.0 specification.
 | 
			
		||||
			 */
 | 
			
		||||
			#define USB_DEVICE_OPT_LOWSPEED        (1 << 0)
 | 
			
		||||
 | 
			
		||||
			#if (F_USB > 6000000)
 | 
			
		||||
				/** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
 | 
			
		||||
				 *  USB interface should be initialized in full speed (12Mb/s) mode.
 | 
			
		||||
				 */
 | 
			
		||||
				#define USB_DEVICE_OPT_FULLSPEED   (0 << 0)
 | 
			
		||||
			#endif
 | 
			
		||||
			//@}
 | 
			
		||||
 | 
			
		||||
			#if (!defined(NO_INTERNAL_SERIAL) || defined(__DOXYGEN__))
 | 
			
		||||
				/** 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 microcontrollers 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            0xDC
 | 
			
		||||
 | 
			
		||||
				/** Length of the device's unique internal serial number, in bits, if present on the selected microcontroller
 | 
			
		||||
				 *  model.
 | 
			
		||||
				 */
 | 
			
		||||
				#define INTERNAL_SERIAL_LENGTH_BITS    (8 * (1 + (offsetof(NVM_PROD_SIGNATURES_t, COORDY1) - offsetof(NVM_PROD_SIGNATURES_t, LOTNUM0))))
 | 
			
		||||
 | 
			
		||||
				/** Start address of the internal serial number, in the appropriate address space, if present on the selected microcontroller
 | 
			
		||||
				 *  model.
 | 
			
		||||
				 */
 | 
			
		||||
				#define INTERNAL_SERIAL_START_ADDRESS  offsetof(NVM_PROD_SIGNATURES_t, LOTNUM0)
 | 
			
		||||
			#else
 | 
			
		||||
				#define USE_INTERNAL_SERIAL            NO_DESCRIPTOR
 | 
			
		||||
 | 
			
		||||
				#define INTERNAL_SERIAL_LENGTH_BITS    0
 | 
			
		||||
				#define INTERNAL_SERIAL_START_ADDRESS  0
 | 
			
		||||
			#endif
 | 
			
		||||
 | 
			
		||||
		/* Function Prototypes: */
 | 
			
		||||
			/** Sends a Remote Wakeup request to the host. This signals to the host that the device should
 | 
			
		||||
			 *  be taken out of suspended mode, and communications should resume.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  Typically, this is implemented so that HID devices (mice, keyboards, etc.) can wake up the
 | 
			
		||||
			 *  host computer when the host has suspended all USB devices to enter a low power state.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This function should only be used if the device has indicated to the host that it
 | 
			
		||||
			 *        supports the Remote Wakeup feature in the device descriptors, and should only be
 | 
			
		||||
			 *        issued if the host is currently allowing remote wakeup events from the device (i.e.,
 | 
			
		||||
			 *        the \ref USB_Device_RemoteWakeupEnabled flag is set). When the \c NO_DEVICE_REMOTE_WAKEUP
 | 
			
		||||
			 *        compile time option is used, this function is unavailable.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note The USB clock must be running for this function to operate. If the stack is initialized with
 | 
			
		||||
			 *        the \ref USB_OPT_MANUAL_PLL option enabled, the user must ensure that the PLL is running
 | 
			
		||||
			 *        before attempting to call this function.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \see \ref Group_StdDescriptors for more information on the RMWAKEUP feature and device descriptors.
 | 
			
		||||
			 */
 | 
			
		||||
			void USB_Device_SendRemoteWakeup(void);
 | 
			
		||||
 | 
			
		||||
		/* Inline Functions: */
 | 
			
		||||
			/** Returns the current USB frame number, when in device mode. Every millisecond the USB bus is active (i.e. enumerated to a host)
 | 
			
		||||
			 *  the frame number is incremented by one.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Current USB frame number from the USB controller.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
 | 
			
		||||
			static inline uint16_t USB_Device_GetFrameNumber(void)
 | 
			
		||||
			{
 | 
			
		||||
				return ((USB_EndpointTable_t*)USB.EPPTR)->FrameNum;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			#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 This function is 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.INTCTRLA |=  USB_SOFIE_bm;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** 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 This function is 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.INTCTRLA &= ~USB_SOFIE_bm;
 | 
			
		||||
			}
 | 
			
		||||
			#endif
 | 
			
		||||
 | 
			
		||||
	/* Private Interface - For use in library only: */
 | 
			
		||||
	#if !defined(__DOXYGEN__)
 | 
			
		||||
		/* Inline Functions: */
 | 
			
		||||
			static inline void USB_Device_SetLowSpeed(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void USB_Device_SetLowSpeed(void)
 | 
			
		||||
			{
 | 
			
		||||
				USB.CTRLA &= ~USB_SPEED_bm;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void USB_Device_SetFullSpeed(void)
 | 
			
		||||
			{
 | 
			
		||||
				USB.CTRLA |=  USB_SPEED_bm;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void USB_Device_SetDeviceAddress(const uint8_t Address)
 | 
			
		||||
			{
 | 
			
		||||
				(void)Address;
 | 
			
		||||
 | 
			
		||||
				/* No implementation for XMEGA architecture */
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void USB_Device_EnableDeviceAddress(const uint8_t Address)
 | 
			
		||||
			{
 | 
			
		||||
				USB.ADDR = Address;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
 | 
			
		||||
			static inline bool USB_Device_IsAddressSet(void)
 | 
			
		||||
			{
 | 
			
		||||
				return ((USB.ADDR != 0) ? true : false);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
			static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString)
 | 
			
		||||
			{
 | 
			
		||||
				uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
 | 
			
		||||
				GlobalInterruptDisable();
 | 
			
		||||
 | 
			
		||||
				uint8_t SigReadAddress = INTERNAL_SERIAL_START_ADDRESS;
 | 
			
		||||
 | 
			
		||||
				for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++)
 | 
			
		||||
				{
 | 
			
		||||
					uint8_t SerialByte;
 | 
			
		||||
 | 
			
		||||
					NVM.CMD    = NVM_CMD_READ_CALIB_ROW_gc;
 | 
			
		||||
					SerialByte = pgm_read_byte(SigReadAddress);
 | 
			
		||||
					NVM.CMD    = 0;
 | 
			
		||||
 | 
			
		||||
					if (SerialCharNum & 0x01)
 | 
			
		||||
					{
 | 
			
		||||
						SerialByte >>= 4;
 | 
			
		||||
						SigReadAddress++;
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
					SerialByte &= 0x0F;
 | 
			
		||||
 | 
			
		||||
					UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ?
 | 
			
		||||
															   (('A' - 10) + SerialByte) : ('0' + SerialByte));
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				SetGlobalInterruptMask(CurrentGlobalInt);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	/* Disable C linkage for C++ Compilers: */
 | 
			
		||||
		#if defined(__cplusplus)
 | 
			
		||||
			}
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										275
									
								
								LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										275
									
								
								LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,275 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "../../../../Common/Common.h"
 | 
			
		||||
#if (ARCH == ARCH_XMEGA)
 | 
			
		||||
 | 
			
		||||
#define  __INCLUDE_FROM_USB_DRIVER
 | 
			
		||||
#include "../USBMode.h"
 | 
			
		||||
 | 
			
		||||
#if defined(USB_CAN_BE_DEVICE)
 | 
			
		||||
 | 
			
		||||
#include "EndpointStream_XMEGA.h"
 | 
			
		||||
 | 
			
		||||
#if !defined(CONTROL_ONLY_DEVICE)
 | 
			
		||||
uint8_t Endpoint_Discard_Stream(uint16_t Length,
 | 
			
		||||
                                uint16_t* const BytesProcessed)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t  ErrorCode;
 | 
			
		||||
	uint16_t BytesInTransfer = 0;
 | 
			
		||||
 | 
			
		||||
	if ((ErrorCode = Endpoint_WaitUntilReady()))
 | 
			
		||||
	  return ErrorCode;
 | 
			
		||||
 | 
			
		||||
	if (BytesProcessed != NULL)
 | 
			
		||||
	  Length -= *BytesProcessed;
 | 
			
		||||
 | 
			
		||||
	while (Length)
 | 
			
		||||
	{
 | 
			
		||||
		if (!(Endpoint_IsReadWriteAllowed()))
 | 
			
		||||
		{
 | 
			
		||||
			Endpoint_ClearOUT();
 | 
			
		||||
 | 
			
		||||
			if (BytesProcessed != NULL)
 | 
			
		||||
			{
 | 
			
		||||
				*BytesProcessed += BytesInTransfer;
 | 
			
		||||
				return ENDPOINT_RWSTREAM_IncompleteTransfer;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if ((ErrorCode = Endpoint_WaitUntilReady()))
 | 
			
		||||
			  return ErrorCode;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			Endpoint_Discard_8();
 | 
			
		||||
 | 
			
		||||
			Length--;
 | 
			
		||||
			BytesInTransfer++;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ENDPOINT_RWSTREAM_NoError;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t Endpoint_Null_Stream(uint16_t Length,
 | 
			
		||||
                             uint16_t* const BytesProcessed)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t  ErrorCode;
 | 
			
		||||
	uint16_t BytesInTransfer = 0;
 | 
			
		||||
 | 
			
		||||
	if ((ErrorCode = Endpoint_WaitUntilReady()))
 | 
			
		||||
	  return ErrorCode;
 | 
			
		||||
 | 
			
		||||
	if (BytesProcessed != NULL)
 | 
			
		||||
	  Length -= *BytesProcessed;
 | 
			
		||||
 | 
			
		||||
	while (Length)
 | 
			
		||||
	{
 | 
			
		||||
		if (!(Endpoint_IsReadWriteAllowed()))
 | 
			
		||||
		{
 | 
			
		||||
			Endpoint_ClearIN();
 | 
			
		||||
 | 
			
		||||
			if (BytesProcessed != NULL)
 | 
			
		||||
			{
 | 
			
		||||
				*BytesProcessed += BytesInTransfer;
 | 
			
		||||
				return ENDPOINT_RWSTREAM_IncompleteTransfer;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if ((ErrorCode = Endpoint_WaitUntilReady()))
 | 
			
		||||
			  return ErrorCode;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			Endpoint_Write_8(0);
 | 
			
		||||
 | 
			
		||||
			Length--;
 | 
			
		||||
			BytesInTransfer++;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ENDPOINT_RWSTREAM_NoError;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* The following abuses the C preprocessor in order to copy-paste common code with slight alterations,
 | 
			
		||||
 * so that the code needs to be written once. It is a crude form of templating to reduce code maintenance. */
 | 
			
		||||
 | 
			
		||||
#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_LE
 | 
			
		||||
#define  TEMPLATE_BUFFER_TYPE                      const void*
 | 
			
		||||
#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
 | 
			
		||||
#define  TEMPLATE_BUFFER_OFFSET(Length)            0
 | 
			
		||||
#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
 | 
			
		||||
#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
 | 
			
		||||
#include "Template/Template_Endpoint_RW.c"
 | 
			
		||||
 | 
			
		||||
#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_BE
 | 
			
		||||
#define  TEMPLATE_BUFFER_TYPE                      const void*
 | 
			
		||||
#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
 | 
			
		||||
#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
 | 
			
		||||
#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
 | 
			
		||||
#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
 | 
			
		||||
#include "Template/Template_Endpoint_RW.c"
 | 
			
		||||
 | 
			
		||||
#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_LE
 | 
			
		||||
#define  TEMPLATE_BUFFER_TYPE                      void*
 | 
			
		||||
#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
 | 
			
		||||
#define  TEMPLATE_BUFFER_OFFSET(Length)            0
 | 
			
		||||
#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
 | 
			
		||||
#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
 | 
			
		||||
#include "Template/Template_Endpoint_RW.c"
 | 
			
		||||
 | 
			
		||||
#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_BE
 | 
			
		||||
#define  TEMPLATE_BUFFER_TYPE                      void*
 | 
			
		||||
#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
 | 
			
		||||
#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
 | 
			
		||||
#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
 | 
			
		||||
#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
 | 
			
		||||
#include "Template/Template_Endpoint_RW.c"
 | 
			
		||||
 | 
			
		||||
#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE)
 | 
			
		||||
	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_LE
 | 
			
		||||
	#define  TEMPLATE_BUFFER_TYPE                      const void*
 | 
			
		||||
	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
 | 
			
		||||
	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
 | 
			
		||||
	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
 | 
			
		||||
	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr))
 | 
			
		||||
	#include "Template/Template_Endpoint_RW.c"
 | 
			
		||||
 | 
			
		||||
	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_BE
 | 
			
		||||
	#define  TEMPLATE_BUFFER_TYPE                      const void*
 | 
			
		||||
	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
 | 
			
		||||
	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
 | 
			
		||||
	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
 | 
			
		||||
	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr))
 | 
			
		||||
	#include "Template/Template_Endpoint_RW.c"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE)
 | 
			
		||||
	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_LE
 | 
			
		||||
	#define  TEMPLATE_BUFFER_TYPE                      const void*
 | 
			
		||||
	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
 | 
			
		||||
	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
 | 
			
		||||
	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
 | 
			
		||||
	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr))
 | 
			
		||||
	#include "Template/Template_Endpoint_RW.c"
 | 
			
		||||
 | 
			
		||||
	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_BE
 | 
			
		||||
	#define  TEMPLATE_BUFFER_TYPE                      const void*
 | 
			
		||||
	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN()
 | 
			
		||||
	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
 | 
			
		||||
	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
 | 
			
		||||
	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr))
 | 
			
		||||
	#include "Template/Template_Endpoint_RW.c"
 | 
			
		||||
 | 
			
		||||
	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_LE
 | 
			
		||||
	#define  TEMPLATE_BUFFER_TYPE                      void*
 | 
			
		||||
	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
 | 
			
		||||
	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
 | 
			
		||||
	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
 | 
			
		||||
	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8())
 | 
			
		||||
	#include "Template/Template_Endpoint_RW.c"
 | 
			
		||||
 | 
			
		||||
	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_BE
 | 
			
		||||
	#define  TEMPLATE_BUFFER_TYPE                      void*
 | 
			
		||||
	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT()
 | 
			
		||||
	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
 | 
			
		||||
	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
 | 
			
		||||
	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8())
 | 
			
		||||
	#include "Template/Template_Endpoint_RW.c"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_LE
 | 
			
		||||
#define  TEMPLATE_BUFFER_OFFSET(Length)            0
 | 
			
		||||
#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
 | 
			
		||||
#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
 | 
			
		||||
#include "Template/Template_Endpoint_Control_W.c"
 | 
			
		||||
 | 
			
		||||
#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_BE
 | 
			
		||||
#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
 | 
			
		||||
#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
 | 
			
		||||
#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr)
 | 
			
		||||
#include "Template/Template_Endpoint_Control_W.c"
 | 
			
		||||
 | 
			
		||||
#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_LE
 | 
			
		||||
#define  TEMPLATE_BUFFER_OFFSET(Length)            0
 | 
			
		||||
#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
 | 
			
		||||
#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
 | 
			
		||||
#include "Template/Template_Endpoint_Control_R.c"
 | 
			
		||||
 | 
			
		||||
#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_BE
 | 
			
		||||
#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
 | 
			
		||||
#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
 | 
			
		||||
#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8()
 | 
			
		||||
#include "Template/Template_Endpoint_Control_R.c"
 | 
			
		||||
 | 
			
		||||
#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE)
 | 
			
		||||
	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_LE
 | 
			
		||||
	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
 | 
			
		||||
	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
 | 
			
		||||
	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr))
 | 
			
		||||
	#include "Template/Template_Endpoint_Control_W.c"
 | 
			
		||||
 | 
			
		||||
	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_BE
 | 
			
		||||
	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
 | 
			
		||||
	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
 | 
			
		||||
	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr))
 | 
			
		||||
	#include "Template/Template_Endpoint_Control_W.c"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE)
 | 
			
		||||
	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_LE
 | 
			
		||||
	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
 | 
			
		||||
	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
 | 
			
		||||
	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr))
 | 
			
		||||
	#include "Template/Template_Endpoint_Control_W.c"
 | 
			
		||||
 | 
			
		||||
	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_BE
 | 
			
		||||
	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
 | 
			
		||||
	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
 | 
			
		||||
	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr))
 | 
			
		||||
	#include "Template/Template_Endpoint_Control_W.c"
 | 
			
		||||
 | 
			
		||||
	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_LE
 | 
			
		||||
	#define  TEMPLATE_BUFFER_OFFSET(Length)            0
 | 
			
		||||
	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount
 | 
			
		||||
	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8())
 | 
			
		||||
	#include "Template/Template_Endpoint_Control_R.c"
 | 
			
		||||
 | 
			
		||||
	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_BE
 | 
			
		||||
	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1)
 | 
			
		||||
	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount
 | 
			
		||||
	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8())
 | 
			
		||||
	#include "Template/Template_Endpoint_Control_R.c"
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										658
									
								
								LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										658
									
								
								LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,658 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *  \brief Endpoint data stream transmission and reception management for the AVR XMEGA microcontrollers.
 | 
			
		||||
 *  \copydetails Group_EndpointStreamRW_XMEGA
 | 
			
		||||
 *
 | 
			
		||||
 *  \note This file should not be included directly. It is automatically included as needed by the USB driver
 | 
			
		||||
 *        dispatch header located in LUFA/Drivers/USB/USB.h.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** \ingroup Group_EndpointStreamRW
 | 
			
		||||
 *  \defgroup Group_EndpointStreamRW_XMEGA Read/Write of Multi-Byte Streams (XMEGA)
 | 
			
		||||
 *  \brief Endpoint data stream transmission and reception management for the Atmel AVR XMEGA architecture.
 | 
			
		||||
 *
 | 
			
		||||
 *  Functions, macros, variables, enums and types related to data reading and writing of data streams from
 | 
			
		||||
 *  and to endpoints.
 | 
			
		||||
 *
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __ENDPOINT_STREAM_XMEGA_H__
 | 
			
		||||
#define __ENDPOINT_STREAM_XMEGA_H__
 | 
			
		||||
 | 
			
		||||
	/* Includes: */
 | 
			
		||||
		#include "../../../../Common/Common.h"
 | 
			
		||||
		#include "../USBMode.h"
 | 
			
		||||
		#include "../USBTask.h"
 | 
			
		||||
 | 
			
		||||
	/* Enable C linkage for C++ Compilers: */
 | 
			
		||||
		#if defined(__cplusplus)
 | 
			
		||||
			extern "C" {
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
	/* Preprocessor Checks: */
 | 
			
		||||
		#if !defined(__INCLUDE_FROM_USB_DRIVER)
 | 
			
		||||
			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
	/* Public Interface - May be used in end-application: */
 | 
			
		||||
		/* Function Prototypes: */
 | 
			
		||||
			/** \name Stream functions for null data */
 | 
			
		||||
			//@{
 | 
			
		||||
 | 
			
		||||
			/** Reads and discards the given number of bytes from the currently selected endpoint's bank,
 | 
			
		||||
			 *  discarding fully read packets from the host as needed. The last packet is not automatically
 | 
			
		||||
			 *  discarded once the remaining bytes has been read; the user is responsible for manually
 | 
			
		||||
			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
 | 
			
		||||
			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
 | 
			
		||||
			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
 | 
			
		||||
			 *  the endpoint bank becomes empty while there is still data to process (and after the current
 | 
			
		||||
			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number
 | 
			
		||||
			 *  of bytes processed in the stream, and the function will exit with an error code of
 | 
			
		||||
			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
 | 
			
		||||
			 *  in the user code - to continue the transfer, call the function again with identical parameters
 | 
			
		||||
			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  <b>Single Stream Transfer Example:</b>
 | 
			
		||||
			 *  \code
 | 
			
		||||
			 *  uint8_t ErrorCode;
 | 
			
		||||
			 *
 | 
			
		||||
			 *  if ((ErrorCode = Endpoint_Discard_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError)
 | 
			
		||||
			 *  {
 | 
			
		||||
			 *       // Stream failed to complete - check ErrorCode here
 | 
			
		||||
			 *  }
 | 
			
		||||
			 *  \endcode
 | 
			
		||||
			 *
 | 
			
		||||
			 *  <b>Partial Stream Transfers Example:</b>
 | 
			
		||||
			 *  \code
 | 
			
		||||
			 *  uint8_t  ErrorCode;
 | 
			
		||||
			 *  uint16_t BytesProcessed;
 | 
			
		||||
			 *
 | 
			
		||||
			 *  BytesProcessed = 0;
 | 
			
		||||
			 *  while ((ErrorCode = Endpoint_Discard_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
 | 
			
		||||
			 *  {
 | 
			
		||||
			 *      // Stream not yet complete - do other actions here, abort if required
 | 
			
		||||
			 *  }
 | 
			
		||||
			 *
 | 
			
		||||
			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
 | 
			
		||||
			 *  {
 | 
			
		||||
			 *      // Stream failed to complete - check ErrorCode here
 | 
			
		||||
			 *  }
 | 
			
		||||
			 *  \endcode
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should not be used on CONTROL type endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Length          Number of bytes to discard via the currently selected endpoint.
 | 
			
		||||
			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
 | 
			
		||||
			 *                             transaction should be updated, \c NULL if the entire stream should be read at once.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Discard_Stream(uint16_t Length,
 | 
			
		||||
			                                uint16_t* const BytesProcessed);
 | 
			
		||||
 | 
			
		||||
			/** Writes a given number of zeroed bytes to the currently selected endpoint's bank, sending
 | 
			
		||||
			 *  full packets to the host as needed. The last packet is not automatically sent once the
 | 
			
		||||
			 *  remaining bytes have been written; the user is responsible for manually sending the last
 | 
			
		||||
			 *  packet to the host via the \ref Endpoint_ClearIN() macro.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
 | 
			
		||||
			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
 | 
			
		||||
			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
 | 
			
		||||
			 *  the endpoint bank becomes full while there is still data to process (and after the current
 | 
			
		||||
			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the
 | 
			
		||||
			 *  total number of bytes processed in the stream, and the function will exit with an error code of
 | 
			
		||||
			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
 | 
			
		||||
			 *  in the user code - to continue the transfer, call the function again with identical parameters
 | 
			
		||||
			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  <b>Single Stream Transfer Example:</b>
 | 
			
		||||
			 *  \code
 | 
			
		||||
			 *  uint8_t ErrorCode;
 | 
			
		||||
			 *
 | 
			
		||||
			 *  if ((ErrorCode = Endpoint_Null_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError)
 | 
			
		||||
			 *  {
 | 
			
		||||
			 *       // Stream failed to complete - check ErrorCode here
 | 
			
		||||
			 *  }
 | 
			
		||||
			 *  \endcode
 | 
			
		||||
			 *
 | 
			
		||||
			 *  <b>Partial Stream Transfers Example:</b>
 | 
			
		||||
			 *  \code
 | 
			
		||||
			 *  uint8_t  ErrorCode;
 | 
			
		||||
			 *  uint16_t BytesProcessed;
 | 
			
		||||
			 *
 | 
			
		||||
			 *  BytesProcessed = 0;
 | 
			
		||||
			 *  while ((ErrorCode = Endpoint_Null_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
 | 
			
		||||
			 *  {
 | 
			
		||||
			 *      // Stream not yet complete - do other actions here, abort if required
 | 
			
		||||
			 *  }
 | 
			
		||||
			 *
 | 
			
		||||
			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
 | 
			
		||||
			 *  {
 | 
			
		||||
			 *      // Stream failed to complete - check ErrorCode here
 | 
			
		||||
			 *  }
 | 
			
		||||
			 *  \endcode
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should not be used on CONTROL type endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Length          Number of zero bytes to send via the currently selected endpoint.
 | 
			
		||||
			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
 | 
			
		||||
			 *                             transaction should be updated, \c NULL if the entire stream should be read at once.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Null_Stream(uint16_t Length,
 | 
			
		||||
			                             uint16_t* const BytesProcessed);
 | 
			
		||||
 | 
			
		||||
			//@}
 | 
			
		||||
 | 
			
		||||
			/** \name Stream functions for RAM source/destination data */
 | 
			
		||||
			//@{
 | 
			
		||||
 | 
			
		||||
			/** Writes the given number of bytes to the endpoint from the given buffer in little endian,
 | 
			
		||||
			 *  sending full packets to the host as needed. The last packet filled is not automatically sent;
 | 
			
		||||
			 *  the user is responsible for manually sending the last written packet to the host via the
 | 
			
		||||
			 *  \ref Endpoint_ClearIN() macro.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
 | 
			
		||||
			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
 | 
			
		||||
			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
 | 
			
		||||
			 *  the endpoint bank becomes full while there is still data to process (and after the current
 | 
			
		||||
			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the
 | 
			
		||||
			 *  total number of bytes processed in the stream, and the function will exit with an error code of
 | 
			
		||||
			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
 | 
			
		||||
			 *  in the user code - to continue the transfer, call the function again with identical parameters
 | 
			
		||||
			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  <b>Single Stream Transfer Example:</b>
 | 
			
		||||
			 *  \code
 | 
			
		||||
			 *  uint8_t DataStream[512];
 | 
			
		||||
			 *  uint8_t ErrorCode;
 | 
			
		||||
			 *
 | 
			
		||||
			 *  if ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream),
 | 
			
		||||
			 *                                            NULL)) != ENDPOINT_RWSTREAM_NoError)
 | 
			
		||||
			 *  {
 | 
			
		||||
			 *       // Stream failed to complete - check ErrorCode here
 | 
			
		||||
			 *  }
 | 
			
		||||
			 *  \endcode
 | 
			
		||||
			 *
 | 
			
		||||
			 *  <b>Partial Stream Transfers Example:</b>
 | 
			
		||||
			 *  \code
 | 
			
		||||
			 *  uint8_t  DataStream[512];
 | 
			
		||||
			 *  uint8_t  ErrorCode;
 | 
			
		||||
			 *  uint16_t BytesProcessed;
 | 
			
		||||
			 *
 | 
			
		||||
			 *  BytesProcessed = 0;
 | 
			
		||||
			 *  while ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream),
 | 
			
		||||
			 *                                               &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
 | 
			
		||||
			 *  {
 | 
			
		||||
			 *      // Stream not yet complete - do other actions here, abort if required
 | 
			
		||||
			 *  }
 | 
			
		||||
			 *
 | 
			
		||||
			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
 | 
			
		||||
			 *  {
 | 
			
		||||
			 *      // Stream failed to complete - check ErrorCode here
 | 
			
		||||
			 *  }
 | 
			
		||||
			 *  \endcode
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should not be used on CONTROL type endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
 | 
			
		||||
			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
 | 
			
		||||
			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
 | 
			
		||||
			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Write_Stream_LE(const void* const Buffer,
 | 
			
		||||
			                                 uint16_t Length,
 | 
			
		||||
			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** Writes the given number of bytes to the endpoint from the given buffer in big endian,
 | 
			
		||||
			 *  sending full packets to the host as needed. The last packet filled is not automatically sent;
 | 
			
		||||
			 *  the user is responsible for manually sending the last written packet to the host via the
 | 
			
		||||
			 *  \ref Endpoint_ClearIN() macro.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should not be used on CONTROL type endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
 | 
			
		||||
			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
 | 
			
		||||
			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
 | 
			
		||||
			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Write_Stream_BE(const void* const Buffer,
 | 
			
		||||
			                                 uint16_t Length,
 | 
			
		||||
			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** Reads the given number of bytes from the endpoint from the given buffer in little endian,
 | 
			
		||||
			 *  discarding fully read packets from the host as needed. The last packet is not automatically
 | 
			
		||||
			 *  discarded once the remaining bytes has been read; the user is responsible for manually
 | 
			
		||||
			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once,
 | 
			
		||||
			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid
 | 
			
		||||
			 *  storage location, the transfer will instead be performed as a series of chunks. Each time
 | 
			
		||||
			 *  the endpoint bank becomes empty while there is still data to process (and after the current
 | 
			
		||||
			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number
 | 
			
		||||
			 *  of bytes processed in the stream, and the function will exit with an error code of
 | 
			
		||||
			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed
 | 
			
		||||
			 *  in the user code - to continue the transfer, call the function again with identical parameters
 | 
			
		||||
			 *  and it will resume until the BytesProcessed value reaches the total transfer length.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  <b>Single Stream Transfer Example:</b>
 | 
			
		||||
			 *  \code
 | 
			
		||||
			 *  uint8_t DataStream[512];
 | 
			
		||||
			 *  uint8_t ErrorCode;
 | 
			
		||||
			 *
 | 
			
		||||
			 *  if ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream),
 | 
			
		||||
			 *                                           NULL)) != ENDPOINT_RWSTREAM_NoError)
 | 
			
		||||
			 *  {
 | 
			
		||||
			 *       // Stream failed to complete - check ErrorCode here
 | 
			
		||||
			 *  }
 | 
			
		||||
			 *  \endcode
 | 
			
		||||
			 *
 | 
			
		||||
			 *  <b>Partial Stream Transfers Example:</b>
 | 
			
		||||
			 *  \code
 | 
			
		||||
			 *  uint8_t  DataStream[512];
 | 
			
		||||
			 *  uint8_t  ErrorCode;
 | 
			
		||||
			 *  uint16_t BytesProcessed;
 | 
			
		||||
			 *
 | 
			
		||||
			 *  BytesProcessed = 0;
 | 
			
		||||
			 *  while ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream),
 | 
			
		||||
			 *                                              &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer)
 | 
			
		||||
			 *  {
 | 
			
		||||
			 *      // Stream not yet complete - do other actions here, abort if required
 | 
			
		||||
			 *  }
 | 
			
		||||
			 *
 | 
			
		||||
			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError)
 | 
			
		||||
			 *  {
 | 
			
		||||
			 *      // Stream failed to complete - check ErrorCode here
 | 
			
		||||
			 *  }
 | 
			
		||||
			 *  \endcode
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should not be used on CONTROL type endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[out] Buffer          Pointer to the destination data buffer to write to.
 | 
			
		||||
			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.
 | 
			
		||||
			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current
 | 
			
		||||
			 *                              transaction should be updated, \c NULL if the entire stream should be read at once.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Read_Stream_LE(void* const Buffer,
 | 
			
		||||
			                                uint16_t Length,
 | 
			
		||||
			                                uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** Reads the given number of bytes from the endpoint from the given buffer in big endian,
 | 
			
		||||
			 *  discarding fully read packets from the host as needed. The last packet is not automatically
 | 
			
		||||
			 *  discarded once the remaining bytes has been read; the user is responsible for manually
 | 
			
		||||
			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should not be used on CONTROL type endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[out] Buffer          Pointer to the destination data buffer to write to.
 | 
			
		||||
			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.
 | 
			
		||||
			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current
 | 
			
		||||
			 *                              transaction should be updated, \c NULL if the entire stream should be read at once.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Read_Stream_BE(void* const Buffer,
 | 
			
		||||
			                                uint16_t Length,
 | 
			
		||||
			                                uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in little endian,
 | 
			
		||||
			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared
 | 
			
		||||
			 *  in both failure and success states; the user is responsible for manually clearing the status OUT packet
 | 
			
		||||
			 *  to finalize the transfer's status stage via the \ref Endpoint_ClearOUT() macro.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
 | 
			
		||||
			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
 | 
			
		||||
			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should only be used on CONTROL type endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
 | 
			
		||||
			 *           together; i.e. the entire stream data must be read or written at the one time.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
 | 
			
		||||
			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Write_Control_Stream_LE(const void* const Buffer,
 | 
			
		||||
			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in big endian,
 | 
			
		||||
			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared
 | 
			
		||||
			 *  in both failure and success states; the user is responsible for manually clearing the status OUT packet
 | 
			
		||||
			 *  to finalize the transfer's status stage via the \ref Endpoint_ClearOUT() macro.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
 | 
			
		||||
			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
 | 
			
		||||
			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should only be used on CONTROL type endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
 | 
			
		||||
			 *           together; i.e. the entire stream data must be read or written at the one time.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
 | 
			
		||||
			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Write_Control_Stream_BE(const void* const Buffer,
 | 
			
		||||
			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in little endian,
 | 
			
		||||
			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not
 | 
			
		||||
			 *  automatically sent after success or failure states; the user is responsible for manually sending the
 | 
			
		||||
			 *  status IN packet to finalize the transfer's status stage via the \ref Endpoint_ClearIN() macro.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
 | 
			
		||||
			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
 | 
			
		||||
			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should only be used on CONTROL type endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
 | 
			
		||||
			 *           together; i.e. the entire stream data must be read or written at the one time.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
 | 
			
		||||
			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Read_Control_Stream_LE(void* const Buffer,
 | 
			
		||||
			                                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in big endian,
 | 
			
		||||
			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not
 | 
			
		||||
			 *  automatically sent after success or failure states; the user is responsible for manually sending the
 | 
			
		||||
			 *  status IN packet to finalize the transfer's status stage via the \ref Endpoint_ClearIN() macro.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
 | 
			
		||||
			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
 | 
			
		||||
			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should only be used on CONTROL type endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
 | 
			
		||||
			 *           together; i.e. the entire stream data must be read or written at the one time.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
 | 
			
		||||
			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Read_Control_Stream_BE(void* const Buffer,
 | 
			
		||||
			                                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
			//@}
 | 
			
		||||
 | 
			
		||||
			/** \name Stream functions for EEPROM source/destination data */
 | 
			
		||||
			//@{
 | 
			
		||||
 | 
			
		||||
			/** EEPROM buffer source version of \ref Endpoint_Write_Stream_LE().
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
 | 
			
		||||
			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
 | 
			
		||||
			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
 | 
			
		||||
			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Write_EStream_LE(const void* const Buffer,
 | 
			
		||||
			                                  uint16_t Length,
 | 
			
		||||
			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** EEPROM buffer source version of \ref Endpoint_Write_Stream_BE().
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
 | 
			
		||||
			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
 | 
			
		||||
			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
 | 
			
		||||
			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Write_EStream_BE(const void* const Buffer,
 | 
			
		||||
			                                  uint16_t Length,
 | 
			
		||||
			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** EEPROM buffer destination version of \ref Endpoint_Read_Stream_LE().
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[out] Buffer          Pointer to the destination data buffer to write to, located in EEPROM memory space.
 | 
			
		||||
			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.
 | 
			
		||||
			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current
 | 
			
		||||
			 *                              transaction should be updated, \c NULL if the entire stream should be read at once.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Read_EStream_LE(void* const Buffer,
 | 
			
		||||
			                                 uint16_t Length,
 | 
			
		||||
			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** EEPROM buffer destination version of \ref Endpoint_Read_Stream_BE().
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[out] Buffer          Pointer to the destination data buffer to write to, located in EEPROM memory space.
 | 
			
		||||
			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint.
 | 
			
		||||
			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current
 | 
			
		||||
			 *                              transaction should be updated, \c NULL if the entire stream should be read at once.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Read_EStream_BE(void* const Buffer,
 | 
			
		||||
			                                 uint16_t Length,
 | 
			
		||||
			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** EEPROM buffer source version of Endpoint_Write_Control_Stream_LE.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
 | 
			
		||||
			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
 | 
			
		||||
			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should only be used on CONTROL type endpoints.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
 | 
			
		||||
			 *           together; i.e. the entire stream data must be read or written at the one time.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
 | 
			
		||||
			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Write_Control_EStream_LE(const void* const Buffer,
 | 
			
		||||
			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** EEPROM buffer source version of \ref Endpoint_Write_Control_Stream_BE().
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
 | 
			
		||||
			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
 | 
			
		||||
			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should only be used on CONTROL type endpoints.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
 | 
			
		||||
			 *           together; i.e. the entire stream data must be read or written at the one time.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
 | 
			
		||||
			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Write_Control_EStream_BE(const void* const Buffer,
 | 
			
		||||
			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_LE().
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
 | 
			
		||||
			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
 | 
			
		||||
			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should only be used on CONTROL type endpoints.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
 | 
			
		||||
			 *           together; i.e. the entire stream data must be read or written at the one time.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
 | 
			
		||||
			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Read_Control_EStream_LE(void* const Buffer,
 | 
			
		||||
			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_BE().
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
 | 
			
		||||
			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
 | 
			
		||||
			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should only be used on CONTROL type endpoints.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
 | 
			
		||||
			 *           together; i.e. the entire stream data must be read or written at the one time.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[out] Buffer  Pointer to the destination data buffer to write to.
 | 
			
		||||
			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Read_Control_EStream_BE(void* const Buffer,
 | 
			
		||||
			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
			//@}
 | 
			
		||||
 | 
			
		||||
			/** \name Stream functions for PROGMEM source/destination data */
 | 
			
		||||
			//@{
 | 
			
		||||
 | 
			
		||||
			/** FLASH buffer source version of \ref Endpoint_Write_Stream_LE().
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
 | 
			
		||||
			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
 | 
			
		||||
			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
 | 
			
		||||
			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Write_PStream_LE(const void* const Buffer,
 | 
			
		||||
			                                  uint16_t Length,
 | 
			
		||||
			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** FLASH buffer source version of \ref Endpoint_Write_Stream_BE().
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Buffer          Pointer to the source data buffer to read from.
 | 
			
		||||
			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer.
 | 
			
		||||
			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current
 | 
			
		||||
			 *                             transaction should be updated, \c NULL if the entire stream should be written at once.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Write_PStream_BE(const void* const Buffer,
 | 
			
		||||
			                                  uint16_t Length,
 | 
			
		||||
			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_LE().
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
 | 
			
		||||
			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
 | 
			
		||||
			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should only be used on CONTROL type endpoints.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
 | 
			
		||||
			 *           together; i.e. the entire stream data must be read or written at the one time.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
 | 
			
		||||
			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Write_Control_PStream_LE(const void* const Buffer,
 | 
			
		||||
			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
 | 
			
		||||
			/** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_BE().
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the
 | 
			
		||||
			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction.
 | 
			
		||||
			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should only be used on CONTROL type endpoints.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained
 | 
			
		||||
			 *           together; i.e. the entire stream data must be read or written at the one time.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Buffer  Pointer to the source data buffer to read from.
 | 
			
		||||
			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Write_Control_PStream_BE(const void* const Buffer,
 | 
			
		||||
			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1);
 | 
			
		||||
			//@}
 | 
			
		||||
 | 
			
		||||
	/* Disable C linkage for C++ Compilers: */
 | 
			
		||||
		#if defined(__cplusplus)
 | 
			
		||||
			}
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										268
									
								
								LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										268
									
								
								LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,268 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "../../../../Common/Common.h"
 | 
			
		||||
#if (ARCH == ARCH_XMEGA)
 | 
			
		||||
 | 
			
		||||
#define  __INCLUDE_FROM_USB_DRIVER
 | 
			
		||||
#include "../USBMode.h"
 | 
			
		||||
 | 
			
		||||
#if defined(USB_CAN_BE_DEVICE)
 | 
			
		||||
 | 
			
		||||
#include "../Endpoint.h"
 | 
			
		||||
 | 
			
		||||
#if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
 | 
			
		||||
uint8_t USB_Device_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
Endpoint_FIFOPair_t       USB_Endpoint_FIFOs[ENDPOINT_TOTAL_ENDPOINTS];
 | 
			
		||||
 | 
			
		||||
volatile uint8_t          USB_Endpoint_SelectedEndpoint;
 | 
			
		||||
volatile USB_EP_t*        USB_Endpoint_SelectedHandle;
 | 
			
		||||
volatile Endpoint_FIFO_t* USB_Endpoint_SelectedFIFO;
 | 
			
		||||
 | 
			
		||||
bool Endpoint_IsINReady(void)
 | 
			
		||||
{
 | 
			
		||||
	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN);
 | 
			
		||||
 | 
			
		||||
	return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_BUSNACK0_bm) ? true : false);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Endpoint_IsOUTReceived(void)
 | 
			
		||||
{
 | 
			
		||||
	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN);
 | 
			
		||||
 | 
			
		||||
	if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_TRNCOMPL0_bm)
 | 
			
		||||
	{
 | 
			
		||||
		USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Endpoint_IsSETUPReceived(void)
 | 
			
		||||
{
 | 
			
		||||
	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN);
 | 
			
		||||
 | 
			
		||||
	if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_SETUP_bm)
 | 
			
		||||
	{
 | 
			
		||||
		USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT;
 | 
			
		||||
		return true;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Endpoint_ClearSETUP(void)
 | 
			
		||||
{
 | 
			
		||||
	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN);
 | 
			
		||||
	USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_SETUP_bm | USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm);
 | 
			
		||||
	USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm;
 | 
			
		||||
	USB_Endpoint_SelectedFIFO->Position  = 0;
 | 
			
		||||
 | 
			
		||||
	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN);
 | 
			
		||||
	USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm;
 | 
			
		||||
	USB_Endpoint_SelectedFIFO->Position  = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Endpoint_ClearIN(void)
 | 
			
		||||
{
 | 
			
		||||
	USB_Endpoint_SelectedHandle->CNT     = USB_Endpoint_SelectedFIFO->Position;
 | 
			
		||||
	USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm);
 | 
			
		||||
	USB_Endpoint_SelectedFIFO->Position  = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Endpoint_ClearOUT(void)
 | 
			
		||||
{
 | 
			
		||||
	USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm);
 | 
			
		||||
	USB_Endpoint_SelectedFIFO->Position  = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Endpoint_StallTransaction(void)
 | 
			
		||||
{
 | 
			
		||||
	USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm;
 | 
			
		||||
 | 
			
		||||
	if ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_TYPE_gm) == USB_EP_TYPE_CONTROL_gc)
 | 
			
		||||
	{
 | 
			
		||||
		Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint ^ ENDPOINT_DIR_IN);
 | 
			
		||||
		USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
uint8_t Endpoint_Read_8(void)
 | 
			
		||||
{
 | 
			
		||||
	return USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Endpoint_Write_8(const uint8_t Data)
 | 
			
		||||
{
 | 
			
		||||
	USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++] = Data;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Endpoint_SelectEndpoint(const uint8_t Address)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK);
 | 
			
		||||
 | 
			
		||||
	USB_Endpoint_SelectedEndpoint = Address;
 | 
			
		||||
 | 
			
		||||
	Endpoint_FIFOPair_t* EndpointFIFOPair = &USB_Endpoint_FIFOs[EndpointNumber];
 | 
			
		||||
	USB_EndpointTable_t* EndpointTable    = (USB_EndpointTable_t*)USB.EPPTR;
 | 
			
		||||
 | 
			
		||||
	if (Address & ENDPOINT_DIR_IN)
 | 
			
		||||
	{
 | 
			
		||||
		USB_Endpoint_SelectedFIFO   = &EndpointFIFOPair->IN;
 | 
			
		||||
		USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN;
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		USB_Endpoint_SelectedFIFO   = &EndpointFIFOPair->OUT;
 | 
			
		||||
		USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].OUT;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table,
 | 
			
		||||
                                     const uint8_t Entries)
 | 
			
		||||
{
 | 
			
		||||
	for (uint8_t i = 0; i < Entries; i++)
 | 
			
		||||
	{
 | 
			
		||||
		if (!(Table[i].Address))
 | 
			
		||||
		  continue;
 | 
			
		||||
 | 
			
		||||
		if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks)))
 | 
			
		||||
		{
 | 
			
		||||
			return false;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Address,
 | 
			
		||||
                                    const uint8_t Config,
 | 
			
		||||
                                    const uint8_t Size)
 | 
			
		||||
{
 | 
			
		||||
	Endpoint_SelectEndpoint(Address);
 | 
			
		||||
 | 
			
		||||
	USB_Endpoint_SelectedHandle->CTRL    = 0;
 | 
			
		||||
	USB_Endpoint_SelectedHandle->STATUS  = (Address & ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0;
 | 
			
		||||
	USB_Endpoint_SelectedHandle->CTRL    = Config;
 | 
			
		||||
	USB_Endpoint_SelectedHandle->CNT     = 0;
 | 
			
		||||
	USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data;
 | 
			
		||||
 | 
			
		||||
	USB_Endpoint_SelectedFIFO->Length    = (Address & ENDPOINT_DIR_IN) ? Size : 0;
 | 
			
		||||
	USB_Endpoint_SelectedFIFO->Position  = 0;
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Endpoint_ClearEndpoints(void)
 | 
			
		||||
{
 | 
			
		||||
	for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
 | 
			
		||||
	{
 | 
			
		||||
		((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL  = 0;
 | 
			
		||||
		((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0;
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Endpoint_ClearStatusStage(void)
 | 
			
		||||
{
 | 
			
		||||
	if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST)
 | 
			
		||||
	{
 | 
			
		||||
		while (!(Endpoint_IsOUTReceived()))
 | 
			
		||||
		{
 | 
			
		||||
			if (USB_DeviceState == DEVICE_STATE_Unattached)
 | 
			
		||||
			  return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		Endpoint_ClearOUT();
 | 
			
		||||
	}
 | 
			
		||||
	else
 | 
			
		||||
	{
 | 
			
		||||
		while (!(Endpoint_IsINReady()))
 | 
			
		||||
		{
 | 
			
		||||
			if (USB_DeviceState == DEVICE_STATE_Unattached)
 | 
			
		||||
			  return;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		Endpoint_ClearIN();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !defined(CONTROL_ONLY_DEVICE)
 | 
			
		||||
uint8_t Endpoint_WaitUntilReady(void)
 | 
			
		||||
{
 | 
			
		||||
	#if (USB_STREAM_TIMEOUT_MS < 0xFF)
 | 
			
		||||
	uint8_t  TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
 | 
			
		||||
	#else
 | 
			
		||||
	uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber();
 | 
			
		||||
 | 
			
		||||
	for (;;)
 | 
			
		||||
	{
 | 
			
		||||
		if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN)
 | 
			
		||||
		{
 | 
			
		||||
			if (Endpoint_IsINReady())
 | 
			
		||||
			  return ENDPOINT_READYWAIT_NoError;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			if (Endpoint_IsOUTReceived())
 | 
			
		||||
			  return ENDPOINT_READYWAIT_NoError;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		uint8_t USB_DeviceState_LCL = USB_DeviceState;
 | 
			
		||||
 | 
			
		||||
		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
 | 
			
		||||
		  return ENDPOINT_READYWAIT_DeviceDisconnected;
 | 
			
		||||
		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
 | 
			
		||||
		  return ENDPOINT_READYWAIT_BusSuspended;
 | 
			
		||||
		else if (Endpoint_IsStalled())
 | 
			
		||||
		  return ENDPOINT_READYWAIT_EndpointStalled;
 | 
			
		||||
 | 
			
		||||
		uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber();
 | 
			
		||||
 | 
			
		||||
		if (CurrentFrameNumber != PreviousFrameNumber)
 | 
			
		||||
		{
 | 
			
		||||
			PreviousFrameNumber = CurrentFrameNumber;
 | 
			
		||||
 | 
			
		||||
			if (!(TimeoutMSRem--))
 | 
			
		||||
			  return ENDPOINT_READYWAIT_Timeout;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										689
									
								
								LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										689
									
								
								LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,689 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *  \brief USB Endpoint definitions for the AVR XMEGA microcontrollers.
 | 
			
		||||
 *  \copydetails Group_EndpointManagement_XMEGA
 | 
			
		||||
 *
 | 
			
		||||
 *  \note This file should not be included directly. It is automatically included as needed by the USB driver
 | 
			
		||||
 *        dispatch header located in LUFA/Drivers/USB/USB.h.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** \ingroup Group_EndpointRW
 | 
			
		||||
 *  \defgroup Group_EndpointRW_XMEGA Endpoint Data Reading and Writing (XMEGA)
 | 
			
		||||
 *  \brief Endpoint data read/write definitions for the Atmel AVR XMEGA architecture.
 | 
			
		||||
 *
 | 
			
		||||
 *  Functions, macros, variables, enums and types related to data reading and writing from and to endpoints.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** \ingroup Group_EndpointPrimitiveRW
 | 
			
		||||
 *  \defgroup Group_EndpointPrimitiveRW_XMEGA Read/Write of Primitive Data Types (XMEGA)
 | 
			
		||||
 *  \brief Endpoint primitive read/write definitions for the Atmel AVR XMEGA architecture.
 | 
			
		||||
 *
 | 
			
		||||
 *  Functions, macros, variables, enums and types related to data reading and writing of primitive data types
 | 
			
		||||
 *  from and to endpoints.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** \ingroup Group_EndpointPacketManagement
 | 
			
		||||
 *  \defgroup Group_EndpointPacketManagement_XMEGA Endpoint Packet Management (XMEGA)
 | 
			
		||||
 *  \brief Endpoint packet management definitions for the Atmel AVR XMEGA architecture.
 | 
			
		||||
 *
 | 
			
		||||
 *  Functions, macros, variables, enums and types related to packet management of endpoints.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** \ingroup Group_EndpointManagement
 | 
			
		||||
 *  \defgroup Group_EndpointManagement_XMEGA Endpoint Management (XMEGA)
 | 
			
		||||
 *  \brief Endpoint management definitions for the Atmel AVR XMEGA architecture.
 | 
			
		||||
 *
 | 
			
		||||
 *  Functions, macros and enums related to endpoint management when in USB Device mode. This
 | 
			
		||||
 *  module contains the endpoint management macros, as well as endpoint interrupt and data
 | 
			
		||||
 *  send/receive functions for various data types.
 | 
			
		||||
 *
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __ENDPOINT_XMEGA_H__
 | 
			
		||||
#define __ENDPOINT_XMEGA_H__
 | 
			
		||||
 | 
			
		||||
	/* Includes: */
 | 
			
		||||
		#include "../../../../Common/Common.h"
 | 
			
		||||
		#include "../USBTask.h"
 | 
			
		||||
		#include "../USBInterrupt.h"
 | 
			
		||||
		#include "../USBController.h"
 | 
			
		||||
 | 
			
		||||
	/* Enable C linkage for C++ Compilers: */
 | 
			
		||||
		#if defined(__cplusplus)
 | 
			
		||||
			extern "C" {
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
	/* Preprocessor Checks: */
 | 
			
		||||
		#if !defined(__INCLUDE_FROM_USB_DRIVER)
 | 
			
		||||
			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
	/* Public Interface - May be used in end-application: */
 | 
			
		||||
		/* Macros: */
 | 
			
		||||
			#if (!defined(MAX_ENDPOINT_INDEX) && !defined(CONTROL_ONLY_DEVICE)) || defined(__DOXYGEN__)
 | 
			
		||||
				/** Total number of endpoints (including the default control endpoint at address 0) which may
 | 
			
		||||
				 *  be used in the device. Different USB AVR models support different amounts of endpoints,
 | 
			
		||||
				 *  this value reflects the maximum number of endpoints for the currently selected AVR model.
 | 
			
		||||
				 */
 | 
			
		||||
				#define ENDPOINT_TOTAL_ENDPOINTS            16
 | 
			
		||||
			#else
 | 
			
		||||
				#if defined(CONTROL_ONLY_DEVICE)
 | 
			
		||||
					#define ENDPOINT_TOTAL_ENDPOINTS        1
 | 
			
		||||
				#else
 | 
			
		||||
					#define ENDPOINT_TOTAL_ENDPOINTS        (MAX_ENDPOINT_INDEX + 1)
 | 
			
		||||
				#endif
 | 
			
		||||
			#endif
 | 
			
		||||
 | 
			
		||||
	/* Private Interface - For use in library only: */
 | 
			
		||||
	#if !defined(__DOXYGEN__)
 | 
			
		||||
		/* Type Defines: */
 | 
			
		||||
			typedef struct
 | 
			
		||||
			{
 | 
			
		||||
				uint8_t Data[64];
 | 
			
		||||
 | 
			
		||||
				uint8_t Length;
 | 
			
		||||
				uint8_t Position;
 | 
			
		||||
			} Endpoint_FIFO_t;
 | 
			
		||||
 | 
			
		||||
			typedef struct
 | 
			
		||||
			{
 | 
			
		||||
				Endpoint_FIFO_t OUT;
 | 
			
		||||
				Endpoint_FIFO_t IN;
 | 
			
		||||
			} Endpoint_FIFOPair_t;
 | 
			
		||||
 | 
			
		||||
		/* External Variables: */
 | 
			
		||||
			extern Endpoint_FIFOPair_t       USB_Endpoint_FIFOs[ENDPOINT_TOTAL_ENDPOINTS];
 | 
			
		||||
			extern volatile uint8_t          USB_Endpoint_SelectedEndpoint;
 | 
			
		||||
			extern volatile USB_EP_t*        USB_Endpoint_SelectedHandle;
 | 
			
		||||
			extern volatile Endpoint_FIFO_t* USB_Endpoint_SelectedFIFO;
 | 
			
		||||
 | 
			
		||||
		/* Inline Functions: */
 | 
			
		||||
			static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST
 | 
			
		||||
			                                                                       ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes)
 | 
			
		||||
			{
 | 
			
		||||
				uint8_t  MaskVal    = 0;
 | 
			
		||||
				uint16_t CheckBytes = 8;
 | 
			
		||||
 | 
			
		||||
				while (CheckBytes < Bytes)
 | 
			
		||||
				{
 | 
			
		||||
					MaskVal++;
 | 
			
		||||
					CheckBytes <<= 1;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				return (MaskVal << USB_EP_BUFSIZE_gp);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		/* Function Prototypes: */
 | 
			
		||||
			bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Address,
 | 
			
		||||
			                                    const uint8_t Config,
 | 
			
		||||
			                                    const uint8_t Size);
 | 
			
		||||
			void Endpoint_ClearEndpoints(void);
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	/* Public Interface - May be used in end-application: */
 | 
			
		||||
		/* Macros: */
 | 
			
		||||
			#if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__))
 | 
			
		||||
				/** Default size of the default control endpoint's bank, until altered by the control endpoint bank size
 | 
			
		||||
				 *  value in the device descriptor. Not available if the \c FIXED_CONTROL_ENDPOINT_SIZE token is defined.
 | 
			
		||||
				 */
 | 
			
		||||
				#define ENDPOINT_CONTROLEP_DEFAULT_SIZE     8
 | 
			
		||||
			#endif
 | 
			
		||||
 | 
			
		||||
		/* Enums: */
 | 
			
		||||
			/** Enum for the possible error return codes of the \ref Endpoint_WaitUntilReady() function.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointRW_XMEGA
 | 
			
		||||
			 */
 | 
			
		||||
			enum Endpoint_WaitUntilReady_ErrorCodes_t
 | 
			
		||||
			{
 | 
			
		||||
				ENDPOINT_READYWAIT_NoError                 = 0, /**< Endpoint is ready for next packet, no error. */
 | 
			
		||||
				ENDPOINT_READYWAIT_EndpointStalled         = 1, /**< The endpoint was stalled during the stream
 | 
			
		||||
				                                                 *   transfer by the host or device.
 | 
			
		||||
				                                                 */
 | 
			
		||||
				ENDPOINT_READYWAIT_DeviceDisconnected      = 2,	/**< Device was disconnected from the host while
 | 
			
		||||
				                                                 *   waiting for the endpoint to become ready.
 | 
			
		||||
				                                                 */
 | 
			
		||||
				ENDPOINT_READYWAIT_BusSuspended            = 3, /**< The USB bus has been suspended by the host and
 | 
			
		||||
				                                                 *   no USB endpoint traffic can occur until the bus
 | 
			
		||||
				                                                 *   has resumed.
 | 
			
		||||
				                                                 */
 | 
			
		||||
				ENDPOINT_READYWAIT_Timeout                 = 4, /**< The host failed to accept or send the next packet
 | 
			
		||||
				                                                 *   within the software timeout period set by the
 | 
			
		||||
				                                                 *   \ref USB_STREAM_TIMEOUT_MS macro.
 | 
			
		||||
				                                                 */
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
		/* Inline Functions: */
 | 
			
		||||
			/** Selects the given endpoint address.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  Any endpoint operations which do not require the endpoint address to be indicated will operate on
 | 
			
		||||
			 *  the currently selected endpoint.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Address  Endpoint address to select.
 | 
			
		||||
			 */
 | 
			
		||||
			void Endpoint_SelectEndpoint(const uint8_t Address);
 | 
			
		||||
 | 
			
		||||
			/** Configures the specified endpoint address with the given endpoint type, bank size and number of hardware
 | 
			
		||||
			 *  banks. Once configured, the endpoint may be read from or written to, depending on its direction.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Address    Endpoint address to configure.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Type       Type of endpoint to configure, a \c EP_TYPE_* mask. Not all endpoint types
 | 
			
		||||
			 *                        are available on Low Speed USB devices - refer to the USB 2.0 specification.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Size       Size of the endpoint's bank, where packets are stored before they are transmitted
 | 
			
		||||
			 *                        to the USB host, or after they have been received from the USB host (depending on
 | 
			
		||||
			 *                        the endpoint's data direction). The bank size must indicate the maximum packet size
 | 
			
		||||
			 *                        that the endpoint can handle.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Banks      Number of hardware banks to use for the endpoint being configured.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note The default control endpoint should not be manually configured by the user application, as
 | 
			
		||||
			 *        it is automatically configured by the library internally.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine will automatically select the specified endpoint.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Boolean \c true if the configuration succeeded, \c false otherwise.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address,
 | 
			
		||||
			                                              const uint8_t Type,
 | 
			
		||||
			                                              const uint16_t Size,
 | 
			
		||||
			                                              const uint8_t Banks) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address,
 | 
			
		||||
			                                              const uint8_t Type,
 | 
			
		||||
			                                              const uint16_t Size,
 | 
			
		||||
			                                              const uint8_t Banks)
 | 
			
		||||
			{
 | 
			
		||||
				uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size));
 | 
			
		||||
 | 
			
		||||
				if ((Address & ENDPOINT_EPNUM_MASK) >= ENDPOINT_TOTAL_ENDPOINTS)
 | 
			
		||||
				  return false;
 | 
			
		||||
 | 
			
		||||
				// TODO - Fix once limitations are lifted
 | 
			
		||||
				EPConfigMask &= ~USB_EP_PINGPONG_bm;
 | 
			
		||||
				if (Size > 64)
 | 
			
		||||
				  return false;
 | 
			
		||||
 | 
			
		||||
				switch (Type)
 | 
			
		||||
				{
 | 
			
		||||
					case EP_TYPE_CONTROL:
 | 
			
		||||
						EPConfigMask |= USB_EP_TYPE_CONTROL_gc;
 | 
			
		||||
						break;
 | 
			
		||||
					case EP_TYPE_ISOCHRONOUS:
 | 
			
		||||
						EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc;
 | 
			
		||||
						break;
 | 
			
		||||
					default:
 | 
			
		||||
						EPConfigMask |= USB_EP_TYPE_BULK_gc;
 | 
			
		||||
						break;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if (Type == EP_TYPE_CONTROL)
 | 
			
		||||
				  Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size);
 | 
			
		||||
 | 
			
		||||
				return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Indicates the number of bytes currently stored in the current endpoint's selected bank.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointRW_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Total number of bytes in the currently selected Endpoint's FIFO buffer.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline uint16_t Endpoint_BytesInEndpoint(void)
 | 
			
		||||
			{
 | 
			
		||||
				if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN)
 | 
			
		||||
				  return USB_Endpoint_SelectedFIFO->Position;
 | 
			
		||||
				else
 | 
			
		||||
				  return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Get the endpoint address of the currently selected endpoint. This is typically used to save
 | 
			
		||||
			 *  the currently selected endpoint so that it can be restored after another endpoint has been
 | 
			
		||||
			 *  manipulated.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Index of the currently selected endpoint.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline uint8_t Endpoint_GetCurrentEndpoint(void)
 | 
			
		||||
			{
 | 
			
		||||
				return USB_Endpoint_SelectedEndpoint;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Resets the endpoint bank FIFO. This clears all the endpoint banks and resets the USB controller's
 | 
			
		||||
			 *  data In and Out pointers to the bank's contents.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Address  Endpoint address whose FIFO buffers are to be reset.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline void Endpoint_ResetEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void Endpoint_ResetEndpoint(const uint8_t Address)
 | 
			
		||||
			{
 | 
			
		||||
				if (Address & ENDPOINT_DIR_IN)
 | 
			
		||||
				  USB_Endpoint_FIFOs[Address & ENDPOINT_EPNUM_MASK].IN.Position  = 0;
 | 
			
		||||
				else
 | 
			
		||||
				  USB_Endpoint_FIFOs[Address & ENDPOINT_EPNUM_MASK].OUT.Position = 0;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Determines if the currently selected endpoint is enabled, but not necessarily configured.
 | 
			
		||||
			 *
 | 
			
		||||
			 * \return Boolean \c true if the currently selected endpoint is enabled, \c false otherwise.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline bool Endpoint_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline bool Endpoint_IsEnabled(void)
 | 
			
		||||
			{
 | 
			
		||||
				return true;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Aborts all pending IN transactions on the currently selected endpoint, once the bank
 | 
			
		||||
			 *  has been queued for transmission to the host via \ref Endpoint_ClearIN(). This function
 | 
			
		||||
			 *  will terminate all queued transactions, resetting the endpoint banks ready for a new
 | 
			
		||||
			 *  packet.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPacketManagement_XMEGA
 | 
			
		||||
			 */
 | 
			
		||||
			static inline void Endpoint_AbortPendingIN(void)
 | 
			
		||||
			{
 | 
			
		||||
				USB_Endpoint_SelectedHandle->STATUS |= USB_EP_BUSNACK0_bm;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Determines if the currently selected endpoint may be read from (if data is waiting in the endpoint
 | 
			
		||||
			 *  bank and the endpoint is an OUT direction, or if the bank is not yet full if the endpoint is an IN
 | 
			
		||||
			 *  direction). This function will return false if an error has occurred in the endpoint, if the endpoint
 | 
			
		||||
			 *  is an OUT direction and no packet (or an empty packet) has been received, or if the endpoint is an IN
 | 
			
		||||
			 *  direction and the endpoint bank is full.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPacketManagement_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Boolean \c true if the currently selected endpoint may be read from or written to, depending
 | 
			
		||||
			 *          on its direction.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline bool Endpoint_IsReadWriteAllowed(void)
 | 
			
		||||
			{
 | 
			
		||||
				return (USB_Endpoint_SelectedFIFO->Position < USB_Endpoint_SelectedFIFO->Length);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Determines if the currently selected endpoint is configured.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Boolean \c true if the currently selected endpoint has been configured, \c false otherwise.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline bool Endpoint_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline bool Endpoint_IsConfigured(void)
 | 
			
		||||
			{
 | 
			
		||||
				return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_TYPE_gm) ? true : false);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Determines if the selected IN endpoint is ready for a new packet to be sent to the host.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPacketManagement_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
 | 
			
		||||
			 */
 | 
			
		||||
			bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT;
 | 
			
		||||
 | 
			
		||||
			/** Determines if the selected OUT endpoint has received new packet from the host.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPacketManagement_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
 | 
			
		||||
			 */
 | 
			
		||||
			bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT;
 | 
			
		||||
 | 
			
		||||
			/** Determines if the current CONTROL type endpoint has received a SETUP packet.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPacketManagement_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise.
 | 
			
		||||
			 */
 | 
			
		||||
			bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT;
 | 
			
		||||
 | 
			
		||||
			/** Clears a received SETUP packet on the currently selected CONTROL type endpoint, freeing up the
 | 
			
		||||
			 *  endpoint for the next packet.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPacketManagement_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This is not applicable for non CONTROL type endpoints.
 | 
			
		||||
			 */
 | 
			
		||||
			void Endpoint_ClearSETUP(void);
 | 
			
		||||
 | 
			
		||||
			/** Sends an IN packet to the host on the currently selected endpoint, freeing up the endpoint for the
 | 
			
		||||
			 *  next packet and switching to the alternative endpoint bank if double banked.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPacketManagement_XMEGA
 | 
			
		||||
			 */
 | 
			
		||||
			void Endpoint_ClearIN(void);
 | 
			
		||||
 | 
			
		||||
			/** Acknowledges an OUT packet to the host on the currently selected endpoint, freeing up the endpoint
 | 
			
		||||
			 *  for the next packet and switching to the alternative endpoint bank if double banked.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPacketManagement_XMEGA
 | 
			
		||||
			 */
 | 
			
		||||
			void Endpoint_ClearOUT(void);
 | 
			
		||||
 | 
			
		||||
			/** Stalls the current endpoint, indicating to the host that a logical problem occurred with the
 | 
			
		||||
			 *  indicated endpoint and that the current transfer sequence should be aborted. This provides a
 | 
			
		||||
			 *  way for devices to indicate invalid commands to the host so that the current transfer can be
 | 
			
		||||
			 *  aborted and the host can begin its own recovery sequence.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  The currently selected endpoint remains stalled until either the \ref Endpoint_ClearStall() macro
 | 
			
		||||
			 *  is called, or the host issues a CLEAR FEATURE request to the device for the currently selected
 | 
			
		||||
			 *  endpoint.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPacketManagement_XMEGA
 | 
			
		||||
			 */
 | 
			
		||||
			void Endpoint_StallTransaction(void);
 | 
			
		||||
 | 
			
		||||
			/** Clears the STALL condition on the currently selected endpoint.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPacketManagement_XMEGA
 | 
			
		||||
			 */
 | 
			
		||||
			static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void Endpoint_ClearStall(void)
 | 
			
		||||
			{
 | 
			
		||||
				USB_Endpoint_SelectedHandle->CTRL &= ~USB_EP_STALL_bm;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Determines if the currently selected endpoint is stalled, \c false otherwise.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPacketManagement_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline bool Endpoint_IsStalled(void)
 | 
			
		||||
			{
 | 
			
		||||
				return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_STALL_bm) ? true : false);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Resets the data toggle of the currently selected endpoint. */
 | 
			
		||||
			static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void Endpoint_ResetDataToggle(void)
 | 
			
		||||
			{
 | 
			
		||||
				USB_Endpoint_SelectedHandle->STATUS &= ~USB_EP_TOGGLE_bm;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Determines the currently selected endpoint's direction.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline uint8_t Endpoint_GetEndpointDirection(void)
 | 
			
		||||
			{
 | 
			
		||||
				return (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Reads one byte from the currently selected endpoint's bank, for OUT direction endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Next byte in the currently selected endpoint's FIFO buffer.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT;
 | 
			
		||||
 | 
			
		||||
			/** Writes one byte to the currently selected endpoint's bank, for IN direction endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Data  Data to write into the the currently selected endpoint's FIFO buffer.
 | 
			
		||||
			 */
 | 
			
		||||
			void Endpoint_Write_8(const uint8_t Data);
 | 
			
		||||
 | 
			
		||||
			/** Discards one byte from the currently selected endpoint's bank, for OUT direction endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
 | 
			
		||||
			 */
 | 
			
		||||
			static inline void Endpoint_Discard_8(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void Endpoint_Discard_8(void)
 | 
			
		||||
			{
 | 
			
		||||
				USB_Endpoint_SelectedFIFO->Position++;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Reads two bytes from the currently selected endpoint's bank in little endian format, for OUT
 | 
			
		||||
			 *  direction endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Next two bytes in the currently selected endpoint's FIFO buffer.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline uint16_t Endpoint_Read_16_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline uint16_t Endpoint_Read_16_LE(void)
 | 
			
		||||
			{
 | 
			
		||||
				uint16_t Byte0 = Endpoint_Read_8();
 | 
			
		||||
				uint16_t Byte1 = Endpoint_Read_8();
 | 
			
		||||
 | 
			
		||||
				return ((Byte1 << 8) | Byte0);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Reads two bytes from the currently selected endpoint's bank in big endian format, for OUT
 | 
			
		||||
			 *  direction endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Next two bytes in the currently selected endpoint's FIFO buffer.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline uint16_t Endpoint_Read_16_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline uint16_t Endpoint_Read_16_BE(void)
 | 
			
		||||
			{
 | 
			
		||||
				uint16_t Byte0 = Endpoint_Read_8();
 | 
			
		||||
				uint16_t Byte1 = Endpoint_Read_8();
 | 
			
		||||
 | 
			
		||||
				return ((Byte0 << 8) | Byte1);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Writes two bytes to the currently selected endpoint's bank in little endian format, for IN
 | 
			
		||||
			 *  direction endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline void Endpoint_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void Endpoint_Write_16_LE(const uint16_t Data)
 | 
			
		||||
			{
 | 
			
		||||
				Endpoint_Write_8(Data & 0xFF);
 | 
			
		||||
				Endpoint_Write_8(Data >> 8);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Writes two bytes to the currently selected endpoint's bank in big endian format, for IN
 | 
			
		||||
			 *  direction endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline void Endpoint_Write_16_BE(const uint16_t Data) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void Endpoint_Write_16_BE(const uint16_t Data)
 | 
			
		||||
			{
 | 
			
		||||
				Endpoint_Write_8(Data >> 8);
 | 
			
		||||
				Endpoint_Write_8(Data & 0xFF);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
 | 
			
		||||
			 */
 | 
			
		||||
			static inline void Endpoint_Discard_16(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void Endpoint_Discard_16(void)
 | 
			
		||||
			{
 | 
			
		||||
				Endpoint_Discard_8();
 | 
			
		||||
				Endpoint_Discard_8();
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Reads four bytes from the currently selected endpoint's bank in little endian format, for OUT
 | 
			
		||||
			 *  direction endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Next four bytes in the currently selected endpoint's FIFO buffer.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline uint32_t Endpoint_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline uint32_t Endpoint_Read_32_LE(void)
 | 
			
		||||
			{
 | 
			
		||||
				uint32_t Byte0 = Endpoint_Read_8();
 | 
			
		||||
				uint32_t Byte1 = Endpoint_Read_8();
 | 
			
		||||
				uint32_t Byte2 = Endpoint_Read_8();
 | 
			
		||||
				uint32_t Byte3 = Endpoint_Read_8();
 | 
			
		||||
 | 
			
		||||
				return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Reads four bytes from the currently selected endpoint's bank in big endian format, for OUT
 | 
			
		||||
			 *  direction endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Next four bytes in the currently selected endpoint's FIFO buffer.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline uint32_t Endpoint_Read_32_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline uint32_t Endpoint_Read_32_BE(void)
 | 
			
		||||
			{
 | 
			
		||||
				uint32_t Byte0 = Endpoint_Read_8();
 | 
			
		||||
				uint32_t Byte1 = Endpoint_Read_8();
 | 
			
		||||
				uint32_t Byte2 = Endpoint_Read_8();
 | 
			
		||||
				uint32_t Byte3 = Endpoint_Read_8();
 | 
			
		||||
 | 
			
		||||
				return ((Byte0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Writes four bytes to the currently selected endpoint's bank in little endian format, for IN
 | 
			
		||||
			 *  direction endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline void Endpoint_Write_32_LE(const uint32_t Data) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void Endpoint_Write_32_LE(const uint32_t Data)
 | 
			
		||||
			{
 | 
			
		||||
				Endpoint_Write_8(Data & 0xFF);
 | 
			
		||||
				Endpoint_Write_8(Data >> 8);
 | 
			
		||||
				Endpoint_Write_8(Data >> 16);
 | 
			
		||||
				Endpoint_Write_8(Data >> 24);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Writes four bytes to the currently selected endpoint's bank in big endian format, for IN
 | 
			
		||||
			 *  direction endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline void Endpoint_Write_32_BE(const uint32_t Data) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void Endpoint_Write_32_BE(const uint32_t Data)
 | 
			
		||||
			{
 | 
			
		||||
				Endpoint_Write_8(Data >> 24);
 | 
			
		||||
				Endpoint_Write_8(Data >> 16);
 | 
			
		||||
				Endpoint_Write_8(Data >> 8);
 | 
			
		||||
				Endpoint_Write_8(Data & 0xFF);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA
 | 
			
		||||
			 */
 | 
			
		||||
			static inline void Endpoint_Discard_32(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void Endpoint_Discard_32(void)
 | 
			
		||||
			{
 | 
			
		||||
				Endpoint_Discard_8();
 | 
			
		||||
				Endpoint_Discard_8();
 | 
			
		||||
				Endpoint_Discard_8();
 | 
			
		||||
				Endpoint_Discard_8();
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		/* External Variables: */
 | 
			
		||||
			/** Global indicating the maximum packet size of the default control endpoint located at address
 | 
			
		||||
			 *  0 in the device. This value is set to the value indicated in the device descriptor in the user
 | 
			
		||||
			 *  project once the USB interface is initialized into device mode.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  If space is an issue, it is possible to fix this to a static value by defining the control
 | 
			
		||||
			 *  endpoint size in the \c FIXED_CONTROL_ENDPOINT_SIZE token passed to the compiler in the makefile
 | 
			
		||||
			 *  via the -D switch. When a fixed control endpoint size is used, the size is no longer dynamically
 | 
			
		||||
			 *  read from the descriptors at runtime and instead fixed to the given value. When used, it is
 | 
			
		||||
			 *  important that the descriptor control endpoint size value matches the size given as the
 | 
			
		||||
			 *  \c FIXED_CONTROL_ENDPOINT_SIZE token - it is recommended that the \c FIXED_CONTROL_ENDPOINT_SIZE token
 | 
			
		||||
			 *  be used in the device descriptors to ensure this.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \attention This variable should be treated as read-only in the user application, and never manually
 | 
			
		||||
			 *             changed in value.
 | 
			
		||||
			 */
 | 
			
		||||
			#if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__))
 | 
			
		||||
				extern uint8_t USB_Device_ControlEndpointSize;
 | 
			
		||||
			#else
 | 
			
		||||
				#define USB_Device_ControlEndpointSize FIXED_CONTROL_ENDPOINT_SIZE
 | 
			
		||||
			#endif
 | 
			
		||||
 | 
			
		||||
		/* Function Prototypes: */
 | 
			
		||||
			/** Configures a table of endpoint descriptions, in sequence. This function can be used to configure multiple
 | 
			
		||||
			 *  endpoints at the same time.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note Endpoints with a zero address will be ignored, thus this function cannot be used to configure the
 | 
			
		||||
			 *        control endpoint.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Table    Pointer to a table of endpoint descriptions.
 | 
			
		||||
			 *  \param[in] Entries  Number of entries in the endpoint table to configure.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return Boolean \c true if all endpoints configured successfully, \c false otherwise.
 | 
			
		||||
			 */
 | 
			
		||||
			bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table,
 | 
			
		||||
			                                     const uint8_t Entries);
 | 
			
		||||
 | 
			
		||||
			/** Completes the status stage of a control transfer on a CONTROL type endpoint automatically,
 | 
			
		||||
			 *  with respect to the data direction. This is a convenience function which can be used to
 | 
			
		||||
			 *  simplify user control request handling.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should not be called on non CONTROL type endpoints.
 | 
			
		||||
			 */
 | 
			
		||||
			void Endpoint_ClearStatusStage(void);
 | 
			
		||||
 | 
			
		||||
			/** Spin-loops until the currently selected non-control endpoint is ready for the next packet of data
 | 
			
		||||
			 *  to be read or written to it.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note This routine should not be called on CONTROL type endpoints.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \ingroup Group_EndpointRW_XMEGA
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum.
 | 
			
		||||
			 */
 | 
			
		||||
			uint8_t Endpoint_WaitUntilReady(void);
 | 
			
		||||
 | 
			
		||||
	/* Disable C linkage for C++ Compilers: */
 | 
			
		||||
		#if defined(__cplusplus)
 | 
			
		||||
			}
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										41
									
								
								LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "../../../../Common/Common.h"
 | 
			
		||||
#if (ARCH == ARCH_XMEGA)
 | 
			
		||||
 | 
			
		||||
#define  __INCLUDE_FROM_USB_DRIVER
 | 
			
		||||
#include "../USBMode.h"
 | 
			
		||||
 | 
			
		||||
#if defined(USB_CAN_BE_HOST)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										41
									
								
								LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "../../../../Common/Common.h"
 | 
			
		||||
#if (ARCH == ARCH_XMEGA)
 | 
			
		||||
 | 
			
		||||
#define  __INCLUDE_FROM_USB_DRIVER
 | 
			
		||||
#include "../USBMode.h"
 | 
			
		||||
 | 
			
		||||
#if defined(USB_CAN_BE_HOST)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										37
									
								
								LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,37 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#define  __INCLUDE_FROM_USB_DRIVER
 | 
			
		||||
#include "../USBMode.h"
 | 
			
		||||
 | 
			
		||||
#if defined(USB_CAN_BE_HOST)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,86 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#if defined(TEMPLATE_FUNC_NAME)
 | 
			
		||||
 | 
			
		||||
uint8_t TEMPLATE_FUNC_NAME (void* const Buffer,
 | 
			
		||||
                            uint16_t Length)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
 | 
			
		||||
 | 
			
		||||
	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN);
 | 
			
		||||
 | 
			
		||||
	if (!(Length))
 | 
			
		||||
	  Endpoint_ClearOUT();
 | 
			
		||||
 | 
			
		||||
	while (Length)
 | 
			
		||||
	{
 | 
			
		||||
		uint8_t USB_DeviceState_LCL = USB_DeviceState;
 | 
			
		||||
 | 
			
		||||
		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
 | 
			
		||||
		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
 | 
			
		||||
		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
 | 
			
		||||
		  return ENDPOINT_RWCSTREAM_BusSuspended;
 | 
			
		||||
		else if (Endpoint_IsSETUPReceived())
 | 
			
		||||
		  return ENDPOINT_RWCSTREAM_HostAborted;
 | 
			
		||||
 | 
			
		||||
		if (Endpoint_IsOUTReceived())
 | 
			
		||||
		{
 | 
			
		||||
			while (Length && Endpoint_BytesInEndpoint())
 | 
			
		||||
			{
 | 
			
		||||
				TEMPLATE_TRANSFER_BYTE(DataStream);
 | 
			
		||||
				TEMPLATE_BUFFER_MOVE(DataStream, 1);
 | 
			
		||||
				Length--;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			Endpoint_ClearOUT();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (!(Endpoint_IsINReady()))
 | 
			
		||||
	{
 | 
			
		||||
		uint8_t USB_DeviceState_LCL = USB_DeviceState;
 | 
			
		||||
 | 
			
		||||
		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
 | 
			
		||||
		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
 | 
			
		||||
		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
 | 
			
		||||
		  return ENDPOINT_RWCSTREAM_BusSuspended;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ENDPOINT_RWCSTREAM_NoError;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef TEMPLATE_BUFFER_OFFSET
 | 
			
		||||
#undef TEMPLATE_BUFFER_MOVE
 | 
			
		||||
#undef TEMPLATE_FUNC_NAME
 | 
			
		||||
#undef TEMPLATE_TRANSFER_BYTE
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -0,0 +1,97 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#if defined(TEMPLATE_FUNC_NAME)
 | 
			
		||||
 | 
			
		||||
uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer,
 | 
			
		||||
                            uint16_t Length)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t* DataStream     = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
 | 
			
		||||
	bool     LastPacketFull = false;
 | 
			
		||||
 | 
			
		||||
	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN);
 | 
			
		||||
 | 
			
		||||
	if (Length > USB_ControlRequest.wLength)
 | 
			
		||||
	  Length = USB_ControlRequest.wLength;
 | 
			
		||||
	else if (!(Length))
 | 
			
		||||
	  Endpoint_ClearIN();
 | 
			
		||||
 | 
			
		||||
	while (Length || LastPacketFull)
 | 
			
		||||
	{
 | 
			
		||||
		uint8_t USB_DeviceState_LCL = USB_DeviceState;
 | 
			
		||||
 | 
			
		||||
		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
 | 
			
		||||
		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
 | 
			
		||||
		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
 | 
			
		||||
		  return ENDPOINT_RWCSTREAM_BusSuspended;
 | 
			
		||||
		else if (Endpoint_IsSETUPReceived())
 | 
			
		||||
		  return ENDPOINT_RWCSTREAM_HostAborted;
 | 
			
		||||
		else if (Endpoint_IsOUTReceived())
 | 
			
		||||
		  break;
 | 
			
		||||
 | 
			
		||||
		if (Endpoint_IsINReady())
 | 
			
		||||
		{
 | 
			
		||||
			uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint();
 | 
			
		||||
 | 
			
		||||
			while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize))
 | 
			
		||||
			{
 | 
			
		||||
				TEMPLATE_TRANSFER_BYTE(DataStream);
 | 
			
		||||
				TEMPLATE_BUFFER_MOVE(DataStream, 1);
 | 
			
		||||
				Length--;
 | 
			
		||||
				BytesInEndpoint++;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize);
 | 
			
		||||
			Endpoint_ClearIN();
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (!(Endpoint_IsOUTReceived()))
 | 
			
		||||
	{
 | 
			
		||||
		uint8_t USB_DeviceState_LCL = USB_DeviceState;
 | 
			
		||||
 | 
			
		||||
		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached)
 | 
			
		||||
		  return ENDPOINT_RWCSTREAM_DeviceDisconnected;
 | 
			
		||||
		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended)
 | 
			
		||||
		  return ENDPOINT_RWCSTREAM_BusSuspended;
 | 
			
		||||
		else if (Endpoint_IsSETUPReceived())
 | 
			
		||||
		  return ENDPOINT_RWCSTREAM_HostAborted;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ENDPOINT_RWCSTREAM_NoError;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef TEMPLATE_BUFFER_OFFSET
 | 
			
		||||
#undef TEMPLATE_BUFFER_MOVE
 | 
			
		||||
#undef TEMPLATE_FUNC_NAME
 | 
			
		||||
#undef TEMPLATE_TRANSFER_BYTE
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										89
									
								
								LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										89
									
								
								LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,89 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#if defined(TEMPLATE_FUNC_NAME)
 | 
			
		||||
 | 
			
		||||
uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer,
 | 
			
		||||
                            uint16_t Length,
 | 
			
		||||
                            uint16_t* const BytesProcessed)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t* DataStream      = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length));
 | 
			
		||||
	uint16_t BytesInTransfer = 0;
 | 
			
		||||
	uint8_t  ErrorCode;
 | 
			
		||||
 | 
			
		||||
	if ((ErrorCode = Endpoint_WaitUntilReady()))
 | 
			
		||||
	  return ErrorCode;
 | 
			
		||||
 | 
			
		||||
	if (BytesProcessed != NULL)
 | 
			
		||||
	{
 | 
			
		||||
		Length -= *BytesProcessed;
 | 
			
		||||
		TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	while (Length)
 | 
			
		||||
	{
 | 
			
		||||
		if (!(Endpoint_IsReadWriteAllowed()))
 | 
			
		||||
		{
 | 
			
		||||
			TEMPLATE_CLEAR_ENDPOINT();
 | 
			
		||||
 | 
			
		||||
			#if !defined(INTERRUPT_CONTROL_ENDPOINT)
 | 
			
		||||
			USB_USBTask();
 | 
			
		||||
			#endif
 | 
			
		||||
 | 
			
		||||
			if (BytesProcessed != NULL)
 | 
			
		||||
			{
 | 
			
		||||
				*BytesProcessed += BytesInTransfer;
 | 
			
		||||
				return ENDPOINT_RWSTREAM_IncompleteTransfer;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if ((ErrorCode = Endpoint_WaitUntilReady()))
 | 
			
		||||
			  return ErrorCode;
 | 
			
		||||
		}
 | 
			
		||||
		else
 | 
			
		||||
		{
 | 
			
		||||
			TEMPLATE_TRANSFER_BYTE(DataStream);
 | 
			
		||||
			TEMPLATE_BUFFER_MOVE(DataStream, 1);
 | 
			
		||||
			Length--;
 | 
			
		||||
			BytesInTransfer++;
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ENDPOINT_RWSTREAM_NoError;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#undef TEMPLATE_FUNC_NAME
 | 
			
		||||
#undef TEMPLATE_BUFFER_TYPE
 | 
			
		||||
#undef TEMPLATE_TRANSFER_BYTE
 | 
			
		||||
#undef TEMPLATE_CLEAR_ENDPOINT
 | 
			
		||||
#undef TEMPLATE_BUFFER_OFFSET
 | 
			
		||||
#undef TEMPLATE_BUFFER_MOVE
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										204
									
								
								LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,204 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "../../../../Common/Common.h"
 | 
			
		||||
#if (ARCH == ARCH_XMEGA)
 | 
			
		||||
 | 
			
		||||
#define  __INCLUDE_FROM_USB_DRIVER
 | 
			
		||||
#define  __INCLUDE_FROM_USB_CONTROLLER_C
 | 
			
		||||
#include "../USBController.h"
 | 
			
		||||
 | 
			
		||||
#if defined(USB_CAN_BE_BOTH)
 | 
			
		||||
volatile uint8_t USB_CurrentMode = USB_MODE_None;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if !defined(USE_STATIC_OPTIONS)
 | 
			
		||||
volatile uint8_t USB_Options;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for the 8-bit AVR-GCC toolchain */
 | 
			
		||||
uint8_t USB_EndpointTable[sizeof(USB_EndpointTable_t) + 1];
 | 
			
		||||
 | 
			
		||||
void USB_Init(
 | 
			
		||||
               #if defined(USB_CAN_BE_BOTH)
 | 
			
		||||
               const uint8_t Mode
 | 
			
		||||
               #endif
 | 
			
		||||
 | 
			
		||||
               #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS))
 | 
			
		||||
               ,
 | 
			
		||||
               #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS))
 | 
			
		||||
               void
 | 
			
		||||
               #endif
 | 
			
		||||
 | 
			
		||||
               #if !defined(USE_STATIC_OPTIONS)
 | 
			
		||||
               const uint8_t Options
 | 
			
		||||
               #endif
 | 
			
		||||
               )
 | 
			
		||||
{
 | 
			
		||||
	#if !defined(USE_STATIC_OPTIONS)
 | 
			
		||||
	USB_Options = Options;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
 | 
			
		||||
	GlobalInterruptDisable();
 | 
			
		||||
 | 
			
		||||
	NVM.CMD  = NVM_CMD_READ_CALIB_ROW_gc;
 | 
			
		||||
	USB.CAL0 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL0));
 | 
			
		||||
	USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1));
 | 
			
		||||
	NVM.CMD  = NVM_CMD_NO_OPERATION_gc;
 | 
			
		||||
 | 
			
		||||
	/* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for the 8-bit AVR-GCC toolchain */
 | 
			
		||||
	USB.EPPTR = ((intptr_t)&USB_EndpointTable[1] & ~(1 << 0));
 | 
			
		||||
	USB.CTRLA = (USB_STFRNUM_bm | ((ENDPOINT_TOTAL_ENDPOINTS - 1) << USB_MAXEP_gp));
 | 
			
		||||
 | 
			
		||||
	if ((USB_Options & USB_OPT_BUSEVENT_PRIHIGH) == USB_OPT_BUSEVENT_PRIHIGH)
 | 
			
		||||
	  USB.INTCTRLA = (3 << USB_INTLVL_gp);
 | 
			
		||||
	else if ((USB_Options & USB_OPT_BUSEVENT_PRIMED) == USB_OPT_BUSEVENT_PRIMED)
 | 
			
		||||
	  USB.INTCTRLA = (2 << USB_INTLVL_gp);
 | 
			
		||||
	else
 | 
			
		||||
	  USB.INTCTRLA = (1 << USB_INTLVL_gp);
 | 
			
		||||
 | 
			
		||||
	SetGlobalInterruptMask(CurrentGlobalInt);
 | 
			
		||||
 | 
			
		||||
	#if defined(USB_CAN_BE_BOTH)
 | 
			
		||||
	USB_CurrentMode = Mode;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	USB_IsInitialized = true;
 | 
			
		||||
 | 
			
		||||
	USB_ResetInterface();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void USB_Disable(void)
 | 
			
		||||
{
 | 
			
		||||
	USB_INT_DisableAllInterrupts();
 | 
			
		||||
	USB_INT_ClearAllInterrupts();
 | 
			
		||||
 | 
			
		||||
	USB_Detach();
 | 
			
		||||
	USB_Controller_Disable();
 | 
			
		||||
 | 
			
		||||
	USB_IsInitialized = false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void USB_ResetInterface(void)
 | 
			
		||||
{
 | 
			
		||||
	uint8_t PrescalerNeeded;
 | 
			
		||||
 | 
			
		||||
	#if defined(USB_DEVICE_OPT_FULLSPEED)
 | 
			
		||||
	if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
 | 
			
		||||
	  PrescalerNeeded = F_USB / 6000000;
 | 
			
		||||
	else
 | 
			
		||||
	  PrescalerNeeded = F_USB / 48000000;
 | 
			
		||||
	#else
 | 
			
		||||
	PrescalerNeeded = F_USB / 6000000;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	uint8_t DividerIndex = 0;
 | 
			
		||||
	while (PrescalerNeeded > 0)
 | 
			
		||||
	{
 | 
			
		||||
		DividerIndex++;
 | 
			
		||||
		PrescalerNeeded >>= 1;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	CLK.USBCTRL = (DividerIndex - 1) << CLK_USBPSDIV_gp;
 | 
			
		||||
 | 
			
		||||
	if (USB_Options & USB_OPT_PLLCLKSRC)
 | 
			
		||||
	  CLK.USBCTRL |= (CLK_USBSRC_PLL_gc   | CLK_USBSEN_bm);
 | 
			
		||||
	else
 | 
			
		||||
	  CLK.USBCTRL |= (CLK_USBSRC_RC32M_gc | CLK_USBSEN_bm);
 | 
			
		||||
 | 
			
		||||
	USB_Device_SetDeviceAddress(0);
 | 
			
		||||
 | 
			
		||||
	USB_INT_DisableAllInterrupts();
 | 
			
		||||
	USB_INT_ClearAllInterrupts();
 | 
			
		||||
 | 
			
		||||
	USB_Controller_Reset();
 | 
			
		||||
	USB_Init_Device();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if defined(USB_CAN_BE_DEVICE)
 | 
			
		||||
static void USB_Init_Device(void)
 | 
			
		||||
{
 | 
			
		||||
	USB_DeviceState                 = DEVICE_STATE_Unattached;
 | 
			
		||||
	USB_Device_ConfigurationNumber  = 0;
 | 
			
		||||
 | 
			
		||||
	#if !defined(NO_DEVICE_REMOTE_WAKEUP)
 | 
			
		||||
	USB_Device_RemoteWakeupEnabled  = false;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	#if !defined(NO_DEVICE_SELF_POWER)
 | 
			
		||||
	USB_Device_CurrentlySelfPowered = false;
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	#if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
 | 
			
		||||
	USB_Descriptor_Device_t* DeviceDescriptorPtr;
 | 
			
		||||
 | 
			
		||||
	#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \
 | 
			
		||||
	    !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))
 | 
			
		||||
	uint8_t DescriptorAddressSpace;
 | 
			
		||||
 | 
			
		||||
	if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr, &DescriptorAddressSpace) != NO_DESCRIPTOR)
 | 
			
		||||
	{
 | 
			
		||||
		if (DescriptorAddressSpace == MEMSPACE_FLASH)
 | 
			
		||||
		  USB_Device_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
 | 
			
		||||
		else if (DescriptorAddressSpace == MEMSPACE_EEPROM)
 | 
			
		||||
		  USB_Device_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
 | 
			
		||||
		else
 | 
			
		||||
		  USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size;
 | 
			
		||||
	}
 | 
			
		||||
	#else
 | 
			
		||||
	if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr) != NO_DESCRIPTOR)
 | 
			
		||||
	{
 | 
			
		||||
		#if defined(USE_RAM_DESCRIPTORS)
 | 
			
		||||
		USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size;
 | 
			
		||||
		#elif defined(USE_EEPROM_DESCRIPTORS)
 | 
			
		||||
		USB_Device_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
 | 
			
		||||
		#else
 | 
			
		||||
		USB_Device_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size);
 | 
			
		||||
		#endif
 | 
			
		||||
	}
 | 
			
		||||
	#endif
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
 | 
			
		||||
	  USB_Device_SetLowSpeed();
 | 
			
		||||
	else
 | 
			
		||||
	  USB_Device_SetFullSpeed();
 | 
			
		||||
 | 
			
		||||
	Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
 | 
			
		||||
							   USB_Device_ControlEndpointSize, 1);
 | 
			
		||||
 | 
			
		||||
	USB_INT_Enable(USB_INT_BUSEVENTI);
 | 
			
		||||
 | 
			
		||||
	USB_Attach();
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										313
									
								
								LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										313
									
								
								LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,313 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *  \brief USB Controller definitions for the AVR XMEGA microcontrollers.
 | 
			
		||||
 *  \copydetails Group_USBManagement_XMEGA
 | 
			
		||||
 *
 | 
			
		||||
 *  \note This file should not be included directly. It is automatically included as needed by the USB driver
 | 
			
		||||
 *        dispatch header located in LUFA/Drivers/USB/USB.h.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/** \ingroup Group_USBManagement
 | 
			
		||||
 *  \defgroup Group_USBManagement_XMEGA USB Interface Management (XMEGA)
 | 
			
		||||
 *  \brief USB Controller definitions for the AVR XMEGA microcontrollers.
 | 
			
		||||
 *
 | 
			
		||||
 *  Functions, macros, variables, enums and types related to the setup and management of the USB interface.
 | 
			
		||||
 *
 | 
			
		||||
 *  @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __USBCONTROLLER_XMEGA_H__
 | 
			
		||||
#define __USBCONTROLLER_XMEGA_H__
 | 
			
		||||
 | 
			
		||||
	/* Includes: */
 | 
			
		||||
		#include "../../../../Common/Common.h"
 | 
			
		||||
		#include "../USBMode.h"
 | 
			
		||||
		#include "../Events.h"
 | 
			
		||||
		#include "../USBTask.h"
 | 
			
		||||
		#include "../USBInterrupt.h"
 | 
			
		||||
 | 
			
		||||
	/* Private Interface - For use in library only: */
 | 
			
		||||
	#if !defined(__DOXYGEN__)
 | 
			
		||||
		/* Macros: */
 | 
			
		||||
			#if defined(MAX_ENDPOINT_INDEX)
 | 
			
		||||
				#define ENDPOINT_TABLE_COUNT  (MAX_ENDPOINT_INDEX + 1)
 | 
			
		||||
			#else
 | 
			
		||||
				#define ENDPOINT_TABLE_COUNT  16
 | 
			
		||||
			#endif
 | 
			
		||||
 | 
			
		||||
		/* Type Defines: */
 | 
			
		||||
			typedef struct
 | 
			
		||||
			{
 | 
			
		||||
				struct
 | 
			
		||||
				{
 | 
			
		||||
					USB_EP_t OUT;
 | 
			
		||||
					USB_EP_t IN;
 | 
			
		||||
				} Endpoints[ENDPOINT_TABLE_COUNT];
 | 
			
		||||
				uint16_t FrameNum;
 | 
			
		||||
			} ATTR_PACKED USB_EndpointTable_t;
 | 
			
		||||
 | 
			
		||||
		/* External Variables: */
 | 
			
		||||
			extern uint8_t USB_EndpointTable[];
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	/* Includes: */
 | 
			
		||||
		#if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__)
 | 
			
		||||
			#include "../Device.h"
 | 
			
		||||
			#include "../Endpoint.h"
 | 
			
		||||
			#include "../DeviceStandardReq.h"
 | 
			
		||||
			#include "../EndpointStream.h"
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
	/* Enable C linkage for C++ Compilers: */
 | 
			
		||||
		#if defined(__cplusplus)
 | 
			
		||||
			extern "C" {
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
	/* Preprocessor Checks and Defines: */
 | 
			
		||||
		#if !defined(__INCLUDE_FROM_USB_DRIVER)
 | 
			
		||||
			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
		#if !defined(F_USB)
 | 
			
		||||
			#error F_USB is not defined. You must define F_USB to the frequency of the unprescaled USB controller clock in your project makefile.
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
		#if ((F_USB % 6000000) || (F_USB < 6000000))
 | 
			
		||||
			#error Invalid F_USB specified. F_USB must be a multiple of 6MHz for USB Low Speed operation, and a multiple of 48MHz for Full Speed operation.
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
	/* Public Interface - May be used in end-application: */
 | 
			
		||||
		/* Macros: */
 | 
			
		||||
			/** \name USB Controller Option Masks */
 | 
			
		||||
			//@{
 | 
			
		||||
			/** Sets the USB bus interrupt priority level to be low priority. The USB bus interrupt is used for Start of Frame events, bus suspend
 | 
			
		||||
			 *  and resume events, bus reset events and other events related to the management of the USB bus.
 | 
			
		||||
			 */
 | 
			
		||||
			#define USB_OPT_BUSEVENT_PRILOW           ((0 << 2) | (0 << 1))
 | 
			
		||||
 | 
			
		||||
			/** Sets the USB bus interrupt priority level to be medium priority. The USB bus interrupt is used for Start of Frame events, bus suspend
 | 
			
		||||
			 *  and resume events, bus reset events and other events related to the management of the USB bus.
 | 
			
		||||
			 */
 | 
			
		||||
			#define USB_OPT_BUSEVENT_PRIMED           ((0 << 2) | (1 << 1))
 | 
			
		||||
 | 
			
		||||
			/** Sets the USB bus interrupt priority level to be high priority. The USB bus interrupt is used for Start of Frame events, bus suspend
 | 
			
		||||
			 *  and resume events, bus reset events and other events related to the management of the USB bus.
 | 
			
		||||
			 */
 | 
			
		||||
			#define USB_OPT_BUSEVENT_PRIHIGH          ((1 << 2) | (0 << 1))
 | 
			
		||||
 | 
			
		||||
			/** Sets the USB controller to source its clock from the internal RC 32MHz clock, once it has been DFLL calibrated to 48MHz. */
 | 
			
		||||
			#define USB_OPT_RC32MCLKSRC               (0 << 3)
 | 
			
		||||
 | 
			
		||||
			/** Sets the USB controller to source its clock from the internal PLL. */
 | 
			
		||||
			#define USB_OPT_PLLCLKSRC                 (1 << 3)
 | 
			
		||||
			//@}
 | 
			
		||||
 | 
			
		||||
			#if !defined(USB_STREAM_TIMEOUT_MS) || defined(__DOXYGEN__)
 | 
			
		||||
				/** Constant for the maximum software timeout period of the USB data stream transfer functions
 | 
			
		||||
				 *  (both control and standard) when in either device or host mode. If the next packet of a stream
 | 
			
		||||
				 *  is not received or acknowledged within this time period, the stream function will fail.
 | 
			
		||||
				 *
 | 
			
		||||
				 *  This value may be overridden in the user project makefile as the value of the
 | 
			
		||||
				 *  \ref USB_STREAM_TIMEOUT_MS token, and passed to the compiler using the -D switch.
 | 
			
		||||
				 */
 | 
			
		||||
				#define USB_STREAM_TIMEOUT_MS       100
 | 
			
		||||
			#endif
 | 
			
		||||
 | 
			
		||||
		/* Inline Functions: */
 | 
			
		||||
			/** 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.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline void USB_Detach(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void USB_Detach(void)
 | 
			
		||||
			{
 | 
			
		||||
				USB.CTRLB &= ~USB_ATTACH_bm;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			/** Attaches the device to the USB bus. This announces the device's presence to any attached
 | 
			
		||||
			 *  USB host, starting the enumeration process. If no host is present, attaching the device
 | 
			
		||||
			 *  will allow for enumeration once a host is connected to the device.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  This is inexplicably also required for proper operation while in host mode, to enable the
 | 
			
		||||
			 *  attachment of a device to the host. This is despite the bit being located in the device-mode
 | 
			
		||||
			 *  register and despite the datasheet making no mention of its requirement in host mode.
 | 
			
		||||
			 */
 | 
			
		||||
			static inline void USB_Attach(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void USB_Attach(void)
 | 
			
		||||
			{
 | 
			
		||||
				USB.CTRLB |= USB_ATTACH_bm;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		/* Function Prototypes: */
 | 
			
		||||
			/** Main function to initialize and start the USB interface. Once active, the USB interface will
 | 
			
		||||
			 *  allow for device connection to a host when in device mode, or for device enumeration while in
 | 
			
		||||
			 *  host mode.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  As the USB library relies on interrupts for the device and host mode enumeration processes,
 | 
			
		||||
			 *  the user must enable global interrupts before or shortly after this function is called. In
 | 
			
		||||
			 *  device mode, interrupts must be enabled within 500ms of this function being called to ensure
 | 
			
		||||
			 *  that the host does not time out whilst enumerating the device. In host mode, interrupts may be
 | 
			
		||||
			 *  enabled at the application's leisure however enumeration will not begin of an attached device
 | 
			
		||||
			 *  until after this has occurred.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  Calling this function when the USB interface is already initialized will cause a complete USB
 | 
			
		||||
			 *  interface reset and re-enumeration.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Mode     Mask indicating what mode the USB interface is to be initialized to, a value
 | 
			
		||||
			 *                      from the \ref USB_Modes_t enum.
 | 
			
		||||
			 *                      \note This parameter does not exist on devices with only one supported USB
 | 
			
		||||
			 *                            mode (device or host).
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \param[in] Options  Mask indicating the options which should be used when initializing the USB
 | 
			
		||||
			 *                      interface to control the USB interface's behavior. This should be comprised of
 | 
			
		||||
			 *                      a \c USB_OPT_REG_* mask to control the regulator, a \c USB_OPT_*_PLL mask to control the
 | 
			
		||||
			 *                      PLL, and a \c USB_DEVICE_OPT_* mask (when the device mode is enabled) to set the device
 | 
			
		||||
			 *                      mode speed.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note To reduce the FLASH requirements of the library if only device or host mode is required,
 | 
			
		||||
			 *        the mode can be statically set in the project makefile by defining the token \c USB_DEVICE_ONLY
 | 
			
		||||
			 *        (for device mode) or \c USB_HOST_ONLY (for host mode), passing the token to the compiler
 | 
			
		||||
			 *        via the -D switch. If the mode is statically set, this parameter does not exist in the
 | 
			
		||||
			 *        function prototype.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note To reduce the FLASH requirements of the library if only fixed settings are required,
 | 
			
		||||
			 *        the options may be set statically in the same manner as the mode (see the Mode parameter of
 | 
			
		||||
			 *        this function). To statically set the USB options, pass in the \c USE_STATIC_OPTIONS token,
 | 
			
		||||
			 *        defined to the appropriate options masks. When the options are statically set, this
 | 
			
		||||
			 *        parameter does not exist in the function prototype.
 | 
			
		||||
			 *        \n\n
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \note The mode parameter does not exist on devices where only one mode is possible, such as USB
 | 
			
		||||
			 *        AVR models which only implement the USB device mode in hardware.
 | 
			
		||||
			 *
 | 
			
		||||
			 *  \see \ref Group_Device for the \c USB_DEVICE_OPT_* masks.
 | 
			
		||||
			 */
 | 
			
		||||
			void USB_Init(
 | 
			
		||||
			               #if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__)
 | 
			
		||||
			               const uint8_t Mode
 | 
			
		||||
			               #endif
 | 
			
		||||
 | 
			
		||||
			               #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS)) || defined(__DOXYGEN__)
 | 
			
		||||
			               ,
 | 
			
		||||
			               #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS))
 | 
			
		||||
			               void
 | 
			
		||||
			               #endif
 | 
			
		||||
 | 
			
		||||
			               #if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__)
 | 
			
		||||
			               const uint8_t Options
 | 
			
		||||
			               #endif
 | 
			
		||||
			               );
 | 
			
		||||
 | 
			
		||||
			/** Shuts down the USB interface. This turns off the USB interface after deallocating all USB FIFO
 | 
			
		||||
			 *  memory, endpoints and pipes. When turned off, no USB functionality can be used until the interface
 | 
			
		||||
			 *  is restarted with the \ref USB_Init() function.
 | 
			
		||||
			 */
 | 
			
		||||
			void USB_Disable(void);
 | 
			
		||||
 | 
			
		||||
			/** Resets the interface, when already initialized. This will re-enumerate the device if already connected
 | 
			
		||||
			 *  to a host, or re-enumerate an already attached device when in host mode.
 | 
			
		||||
			 */
 | 
			
		||||
			void USB_ResetInterface(void);
 | 
			
		||||
 | 
			
		||||
		/* Global Variables: */
 | 
			
		||||
			#if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__)
 | 
			
		||||
				/** Indicates the mode that the USB interface is currently initialized to, a value from the
 | 
			
		||||
				 *  \ref USB_Modes_t enum.
 | 
			
		||||
				 *
 | 
			
		||||
				 *  \attention This variable should be treated as read-only in the user application, and never manually
 | 
			
		||||
				 *             changed in value.
 | 
			
		||||
				 *
 | 
			
		||||
				 *  \note When the controller is initialized into UID auto-detection mode, this variable will hold the
 | 
			
		||||
				 *        currently selected USB mode (i.e. \ref USB_MODE_Device or \ref USB_MODE_Host). If the controller
 | 
			
		||||
				 *        is fixed into a specific mode (either through the \c USB_DEVICE_ONLY or \c USB_HOST_ONLY compile time
 | 
			
		||||
				 *        options, or a limitation of the USB controller in the chosen device model) this will evaluate to
 | 
			
		||||
				 *        a constant of the appropriate value and will never evaluate to \ref USB_MODE_None even when the
 | 
			
		||||
				 *        USB interface is not initialized.
 | 
			
		||||
				 */
 | 
			
		||||
				extern volatile uint8_t USB_CurrentMode;
 | 
			
		||||
			#elif defined(USB_CAN_BE_HOST)
 | 
			
		||||
				#define USB_CurrentMode USB_MODE_Host
 | 
			
		||||
			#elif defined(USB_CAN_BE_DEVICE)
 | 
			
		||||
				#define USB_CurrentMode USB_MODE_Device
 | 
			
		||||
			#endif
 | 
			
		||||
 | 
			
		||||
			#if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__)
 | 
			
		||||
				/** Indicates the current USB options that the USB interface was initialized with when \ref USB_Init()
 | 
			
		||||
				 *  was called. This value will be one of the \c USB_MODE_* masks defined elsewhere in this module.
 | 
			
		||||
				 *
 | 
			
		||||
				 *  \attention This variable should be treated as read-only in the user application, and never manually
 | 
			
		||||
				 *             changed in value.
 | 
			
		||||
				 */
 | 
			
		||||
				extern volatile uint8_t USB_Options;
 | 
			
		||||
			#elif defined(USE_STATIC_OPTIONS)
 | 
			
		||||
				#define USB_Options USE_STATIC_OPTIONS
 | 
			
		||||
			#endif
 | 
			
		||||
 | 
			
		||||
	/* Private Interface - For use in library only: */
 | 
			
		||||
	#if !defined(__DOXYGEN__)
 | 
			
		||||
		/* Function Prototypes: */
 | 
			
		||||
			#if defined(__INCLUDE_FROM_USB_CONTROLLER_C)
 | 
			
		||||
				static void USB_Init_Device(void);
 | 
			
		||||
			#endif
 | 
			
		||||
 | 
			
		||||
		/* Inline Functions: */
 | 
			
		||||
			static inline void USB_Controller_Enable(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void USB_Controller_Enable(void)
 | 
			
		||||
			{
 | 
			
		||||
				USB.CTRLA |=  USB_ENABLE_bm;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void USB_Controller_Disable(void)
 | 
			
		||||
			{
 | 
			
		||||
				USB.CTRLA &= ~USB_ENABLE_bm;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE;
 | 
			
		||||
			static inline void USB_Controller_Reset(void)
 | 
			
		||||
			{
 | 
			
		||||
				USB.CTRLA &= ~USB_ENABLE_bm;
 | 
			
		||||
				USB.CTRLA |=  USB_ENABLE_bm;
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	/* Disable C linkage for C++ Compilers: */
 | 
			
		||||
		#if defined(__cplusplus)
 | 
			
		||||
			}
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										106
									
								
								LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,106 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#include "../../../../Common/Common.h"
 | 
			
		||||
#if (ARCH == ARCH_XMEGA)
 | 
			
		||||
 | 
			
		||||
#define  __INCLUDE_FROM_USB_DRIVER
 | 
			
		||||
#include "../USBInterrupt.h"
 | 
			
		||||
 | 
			
		||||
void USB_INT_DisableAllInterrupts(void)
 | 
			
		||||
{
 | 
			
		||||
	USB.INTCTRLA    &= USB_INTLVL_gm;
 | 
			
		||||
	USB.INTCTRLB     = 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void USB_INT_ClearAllInterrupts(void)
 | 
			
		||||
{
 | 
			
		||||
	USB.INTFLAGSACLR = 0xFF;
 | 
			
		||||
	USB.INTFLAGSBCLR = 0xFF;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ISR(USB_BUSEVENT_vect)
 | 
			
		||||
{
 | 
			
		||||
	#if !defined(NO_SOF_EVENTS)
 | 
			
		||||
	if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI))
 | 
			
		||||
	{
 | 
			
		||||
		USB_INT_Clear(USB_INT_SOFI);
 | 
			
		||||
 | 
			
		||||
		EVENT_USB_Device_StartOfFrame();
 | 
			
		||||
	}
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Suspend))
 | 
			
		||||
	{
 | 
			
		||||
		USB_INT_Clear(USB_INT_BUSEVENTI_Suspend);
 | 
			
		||||
 | 
			
		||||
		#if !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_BUSEVENTI_Resume))
 | 
			
		||||
	{
 | 
			
		||||
		USB_INT_Clear(USB_INT_BUSEVENTI_Resume);
 | 
			
		||||
 | 
			
		||||
		if (USB_Device_ConfigurationNumber)
 | 
			
		||||
		  USB_DeviceState = DEVICE_STATE_Configured;
 | 
			
		||||
		else
 | 
			
		||||
		  USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Addressed : DEVICE_STATE_Powered;
 | 
			
		||||
 | 
			
		||||
		#if !defined(NO_LIMITED_CONTROLLER_CONNECT)
 | 
			
		||||
		EVENT_USB_Device_Connect();
 | 
			
		||||
		#else
 | 
			
		||||
		EVENT_USB_Device_WakeUp();
 | 
			
		||||
		#endif
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Reset))
 | 
			
		||||
	{
 | 
			
		||||
		USB_INT_Clear(USB_INT_BUSEVENTI_Reset);
 | 
			
		||||
 | 
			
		||||
		USB_DeviceState                = DEVICE_STATE_Default;
 | 
			
		||||
		USB_Device_ConfigurationNumber = 0;
 | 
			
		||||
 | 
			
		||||
		USB_Device_EnableDeviceAddress(0);
 | 
			
		||||
 | 
			
		||||
		Endpoint_ClearEndpoints();
 | 
			
		||||
		Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
 | 
			
		||||
		                           USB_Device_ControlEndpointSize, 1);
 | 
			
		||||
 | 
			
		||||
		EVENT_USB_Device_Reset();
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										172
									
								
								LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										172
									
								
								LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,172 @@
 | 
			
		|||
/*
 | 
			
		||||
             LUFA Library
 | 
			
		||||
     Copyright (C) Dean Camera, 2017.
 | 
			
		||||
 | 
			
		||||
  dean [at] fourwalledcubicle [dot] com
 | 
			
		||||
           www.lufa-lib.org
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com)
 | 
			
		||||
 | 
			
		||||
  Permission to use, copy, modify, distribute, and sell this
 | 
			
		||||
  software and its documentation for any purpose is hereby granted
 | 
			
		||||
  without fee, provided that the above copyright notice appear in
 | 
			
		||||
  all copies and that both that the copyright notice and this
 | 
			
		||||
  permission notice and warranty disclaimer appear in supporting
 | 
			
		||||
  documentation, and that the name of the author not be used in
 | 
			
		||||
  advertising or publicity pertaining to distribution of the
 | 
			
		||||
  software without specific, written prior permission.
 | 
			
		||||
 | 
			
		||||
  The author disclaims all warranties with regard to this
 | 
			
		||||
  software, including all implied warranties of merchantability
 | 
			
		||||
  and fitness.  In no event shall the author be liable for any
 | 
			
		||||
  special, indirect or consequential damages or any damages
 | 
			
		||||
  whatsoever resulting from loss of use, data or profits, whether
 | 
			
		||||
  in an action of contract, negligence or other tortious action,
 | 
			
		||||
  arising out of or in connection with the use or performance of
 | 
			
		||||
  this software.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
/** \file
 | 
			
		||||
 *  \brief USB Controller Interrupt definitions for the AVR XMEGA microcontrollers.
 | 
			
		||||
 *
 | 
			
		||||
 *  This file contains definitions required for the correct handling of low level USB service routine interrupts
 | 
			
		||||
 *  from the USB controller.
 | 
			
		||||
 *
 | 
			
		||||
 *  \note This file should not be included directly. It is automatically included as needed by the USB driver
 | 
			
		||||
 *        dispatch header located in LUFA/Drivers/USB/USB.h.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef __USBINTERRUPT_XMEGA_H__
 | 
			
		||||
#define __USBINTERRUPT_XMEGA_H__
 | 
			
		||||
 | 
			
		||||
	/* Includes: */
 | 
			
		||||
		#include "../../../../Common/Common.h"
 | 
			
		||||
 | 
			
		||||
	/* Enable C linkage for C++ Compilers: */
 | 
			
		||||
		#if defined(__cplusplus)
 | 
			
		||||
			extern "C" {
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
	/* Preprocessor Checks: */
 | 
			
		||||
		#if !defined(__INCLUDE_FROM_USB_DRIVER)
 | 
			
		||||
			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead.
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
	/* Private Interface - For use in library only: */
 | 
			
		||||
	#if !defined(__DOXYGEN__)
 | 
			
		||||
		/* Enums: */
 | 
			
		||||
			enum USB_Interrupts_t
 | 
			
		||||
			{
 | 
			
		||||
				USB_INT_BUSEVENTI         = 1,
 | 
			
		||||
				USB_INT_BUSEVENTI_Suspend = 2,
 | 
			
		||||
				USB_INT_BUSEVENTI_Resume  = 3,
 | 
			
		||||
				USB_INT_BUSEVENTI_Reset   = 4,
 | 
			
		||||
				USB_INT_SOFI              = 5,
 | 
			
		||||
			};
 | 
			
		||||
 | 
			
		||||
		/* Inline Functions: */
 | 
			
		||||
			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_BUSEVENTI:
 | 
			
		||||
						USB.INTCTRLA |= USB_BUSEVIE_bm;
 | 
			
		||||
						break;
 | 
			
		||||
					case USB_INT_SOFI:
 | 
			
		||||
						USB.INTCTRLA |= USB_SOFIE_bm;
 | 
			
		||||
						break;
 | 
			
		||||
					default:
 | 
			
		||||
						break;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			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_BUSEVENTI:
 | 
			
		||||
						USB.INTCTRLA &= ~USB_BUSEVIE_bm;
 | 
			
		||||
						break;
 | 
			
		||||
					case USB_INT_SOFI:
 | 
			
		||||
						USB.INTCTRLA &= ~USB_SOFIE_bm;
 | 
			
		||||
						break;
 | 
			
		||||
					default:
 | 
			
		||||
						break;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			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_BUSEVENTI_Suspend:
 | 
			
		||||
						USB.INTFLAGSACLR = USB_SUSPENDIF_bm;
 | 
			
		||||
						break;
 | 
			
		||||
					case USB_INT_BUSEVENTI_Resume:
 | 
			
		||||
						USB.INTFLAGSACLR = USB_RESUMEIF_bm;
 | 
			
		||||
						break;
 | 
			
		||||
					case USB_INT_BUSEVENTI_Reset:
 | 
			
		||||
						USB.INTFLAGSACLR = USB_RSTIF_bm;
 | 
			
		||||
						break;
 | 
			
		||||
					case USB_INT_SOFI:
 | 
			
		||||
						USB.INTFLAGSACLR = USB_SOFIF_bm;
 | 
			
		||||
						break;
 | 
			
		||||
					default:
 | 
			
		||||
						break;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			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_BUSEVENTI:
 | 
			
		||||
						return ((USB.INTCTRLA & USB_BUSEVIE_bm) ? true : false);
 | 
			
		||||
					case USB_INT_SOFI:
 | 
			
		||||
						return ((USB.INTCTRLA & USB_SOFIE_bm) ? true : false);
 | 
			
		||||
					default:
 | 
			
		||||
						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_BUSEVENTI_Suspend:
 | 
			
		||||
						return ((USB.INTFLAGSACLR & USB_SUSPENDIF_bm) ? true : false);
 | 
			
		||||
					case USB_INT_BUSEVENTI_Resume:
 | 
			
		||||
						return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false);
 | 
			
		||||
					case USB_INT_BUSEVENTI_Reset:
 | 
			
		||||
						return ((USB.INTFLAGSACLR & USB_RSTIF_bm) ? true : false);
 | 
			
		||||
					case USB_INT_SOFI:
 | 
			
		||||
						return ((USB.INTFLAGSACLR & USB_SOFIF_bm) ? true : false);
 | 
			
		||||
					default:
 | 
			
		||||
						return false;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
		/* Includes: */
 | 
			
		||||
			#include "../USBMode.h"
 | 
			
		||||
			#include "../Events.h"
 | 
			
		||||
			#include "../USBController.h"
 | 
			
		||||
 | 
			
		||||
		/* Function Prototypes: */
 | 
			
		||||
			void USB_INT_ClearAllInterrupts(void);
 | 
			
		||||
			void USB_INT_DisableAllInterrupts(void);
 | 
			
		||||
	#endif
 | 
			
		||||
 | 
			
		||||
	/* Disable C linkage for C++ Compilers: */
 | 
			
		||||
		#if defined(__cplusplus)
 | 
			
		||||
			}
 | 
			
		||||
		#endif
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue