aboutsummaryrefslogtreecommitdiffstats
path: root/LUFA
diff options
context:
space:
mode:
Diffstat (limited to 'LUFA')
-rw-r--r--LUFA/CodeTemplates/LUFAConfig.h244
-rw-r--r--LUFA/CodeTemplates/makefile_template.avr81426
-rw-r--r--LUFA/CodeTemplates/makefile_template.uc3972
-rw-r--r--LUFA/CodeTemplates/makefile_template.xmega1410
-rw-r--r--LUFA/Common/Architectures.h168
-rw-r--r--LUFA/Common/CompilerSpecific.h196
-rw-r--r--LUFA/Common/Endianness.h952
-rw-r--r--LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h248
-rw-r--r--LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h252
-rw-r--r--LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h252
-rw-r--r--LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h184
-rw-r--r--LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h248
-rw-r--r--LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h182
-rw-r--r--LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h252
-rw-r--r--LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h248
-rw-r--r--LUFA/Drivers/Board/AVR8/TUL/Buttons.h184
-rw-r--r--LUFA/Drivers/Board/AVR8/TUL/LEDs.h248
-rw-r--r--LUFA/Drivers/Board/UC3/EVK1100/Buttons.h206
-rw-r--r--LUFA/Drivers/Board/UC3/EVK1100/Joystick.h220
-rw-r--r--LUFA/Drivers/Board/UC3/EVK1100/LEDs.h306
-rw-r--r--LUFA/Drivers/Board/UC3/EVK1101/Buttons.h200
-rw-r--r--LUFA/Drivers/Board/UC3/EVK1101/Joystick.h232
-rw-r--r--LUFA/Drivers/Board/UC3/EVK1101/LEDs.h280
-rw-r--r--LUFA/Drivers/Board/UC3/EVK1104/Buttons.h194
-rw-r--r--LUFA/Drivers/Board/UC3/EVK1104/LEDs.h308
-rw-r--r--LUFA/Drivers/Misc/AT45DB321C.h198
-rw-r--r--LUFA/Drivers/Misc/AT45DB642D.h218
-rw-r--r--LUFA/Drivers/Misc/RingBuffer.h606
-rw-r--r--LUFA/Drivers/USB/Core/Device.h318
-rw-r--r--LUFA/Drivers/USB/Core/Endpoint.h246
-rw-r--r--LUFA/Drivers/USB/Core/EndpointStream.h248
-rw-r--r--LUFA/Drivers/USB/Core/Host.h278
-rw-r--r--LUFA/Drivers/USB/Core/OTG.h160
-rw-r--r--LUFA/Drivers/USB/Core/Pipe.h272
-rw-r--r--LUFA/Drivers/USB/Core/PipeStream.h200
-rw-r--r--LUFA/Drivers/USB/Core/UC3/Device_UC3.c94
-rw-r--r--LUFA/Drivers/USB/Core/UC3/Device_UC3.h518
-rw-r--r--LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c282
-rw-r--r--LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h1752
-rw-r--r--LUFA/Drivers/USB/Core/UC3/Host_UC3.c584
-rw-r--r--LUFA/Drivers/USB/Core/UC3/Host_UC3.h744
-rw-r--r--LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c276
-rw-r--r--LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h1856
-rw-r--r--LUFA/Drivers/USB/Core/UC3/USBController_UC3.c430
-rw-r--r--LUFA/Drivers/USB/Core/UC3/USBController_UC3.h766
-rw-r--r--LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c404
-rw-r--r--LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h706
-rw-r--r--LUFA/Drivers/USB/Core/USBController.h164
-rw-r--r--LUFA/Drivers/USB/Core/USBInterrupt.h146
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c88
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h476
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c134
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h1546
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c74
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c74
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c74
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c166
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c184
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c176
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c338
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h638
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c200
-rw-r--r--LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h332
-rw-r--r--LUFA/Platform/UC3/ClockManagement.h648
-rw-r--r--LUFA/Platform/UC3/Exception.S250
-rw-r--r--LUFA/Platform/UC3/InterruptManagement.c124
-rw-r--r--LUFA/Platform/UC3/InterruptManagement.h324
-rw-r--r--LUFA/Platform/XMEGA/ClockManagement.h596
68 files changed, 13760 insertions, 13760 deletions
diff --git a/LUFA/CodeTemplates/LUFAConfig.h b/LUFA/CodeTemplates/LUFAConfig.h
index 5d808a307..f6ec104e9 100644
--- a/LUFA/CodeTemplates/LUFAConfig.h
+++ b/LUFA/CodeTemplates/LUFAConfig.h
@@ -1,122 +1,122 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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.
-*/
-
-/*
- This is a header file which can be used to configure LUFA's
- compile time options, as an alternative to the compile time
- constants supplied through a makefile. To use this configuration
- header, copy this into your project's root directory and supply
- the USE_LUFA_CONFIG_HEADER token to the compiler so that it is
- defined in all compiled source files.
-
- For information on what each token does, refer to the LUFA
- manual section "Summary of Compile Tokens".
-*/
-
-#ifndef __LUFA_CONFIG_H__
-#define __LUFA_CONFIG_H__
-
- #if (ARCH == ARCH_AVR8)
-
- /* Non-USB Related Configuration Tokens: */
-// #define DISABLE_TERMINAL_CODES
-
- /* USB Class Driver Related Tokens: */
-// #define HID_HOST_BOOT_PROTOCOL_ONLY
-// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
-// #define HID_USAGE_STACK_DEPTH {Insert Value Here}
-// #define HID_MAX_COLLECTIONS {Insert Value Here}
-// #define HID_MAX_REPORTITEMS {Insert Value Here}
-// #define HID_MAX_REPORT_IDS {Insert Value Here}
-// #define NO_CLASS_DRIVER_AUTOFLUSH
-
- /* General USB Driver Related Tokens: */
-// #define ORDERED_EP_CONFIG
-// #define USE_STATIC_OPTIONS {Insert Value Here}
-// #define USB_DEVICE_ONLY
-// #define USB_HOST_ONLY
-// #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
-// #define NO_LIMITED_CONTROLLER_CONNECT
-// #define NO_SOF_EVENTS
-
- /* USB Device Mode Driver Related Tokens: */
-// #define USE_RAM_DESCRIPTORS
-// #define USE_FLASH_DESCRIPTORS
-// #define USE_EEPROM_DESCRIPTORS
-// #define NO_INTERNAL_SERIAL
-// #define FIXED_CONTROL_ENDPOINT_SIZE {Insert Value Here}
-// #define DEVICE_STATE_AS_GPIOR {Insert Value Here}
-// #define FIXED_NUM_CONFIGURATION {Insert Value Here}
-// #define CONTROL_ONLY_DEVICE
-// #define INTERRUPT_CONTROL_ENDPOINT
-// #define NO_DEVICE_REMOTE_WAKEUP
-// #define NO_DEVICE_SELF_POWER
-
- /* USB Host Mode Driver Related Tokens: */
-// #define HOST_STATE_AS_GPIOR {Insert Value Here}
-// #define USB_HOST_TIMEOUT_MS {Insert Value Here}
-// #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here}
-
- #elif (ARCH == ARCH_UC3)
-
- /* Non-USB Related Configuration Tokens: */
-// #define DISABLE_TERMINAL_CODES
-
- /* USB Class Driver Related Tokens: */
-// #define HID_HOST_BOOT_PROTOCOL_ONLY
-// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
-// #define HID_USAGE_STACK_DEPTH {Insert Value Here}
-// #define HID_MAX_COLLECTIONS {Insert Value Here}
-// #define HID_MAX_REPORTITEMS {Insert Value Here}
-// #define HID_MAX_REPORT_IDS {Insert Value Here}
-// #define NO_CLASS_DRIVER_AUTOFLUSH
-
- /* General USB Driver Related Tokens: */
-// #define USE_STATIC_OPTIONS {Insert Value Here}
-// #define USB_DEVICE_ONLY
-// #define USB_HOST_ONLY
-// #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
-// #define NO_SOF_EVENTS
-
- /* USB Device Mode Driver Related Tokens: */
-// #define NO_INTERNAL_SERIAL
-// #define FIXED_CONTROL_ENDPOINT_SIZE {Insert Value Here}
-// #define FIXED_NUM_CONFIGURATION {Insert Value Here}
-// #define CONTROL_ONLY_DEVICE
-// #define NO_DEVICE_REMOTE_WAKEUP
-// #define NO_DEVICE_SELF_POWER
-
- /* USB Host Mode Driver Related Tokens: */
-// #define USB_HOST_TIMEOUT_MS {Insert Value Here}
-// #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here}
-
- #endif
-#endif
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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.
+*/
+
+/*
+ This is a header file which can be used to configure LUFA's
+ compile time options, as an alternative to the compile time
+ constants supplied through a makefile. To use this configuration
+ header, copy this into your project's root directory and supply
+ the USE_LUFA_CONFIG_HEADER token to the compiler so that it is
+ defined in all compiled source files.
+
+ For information on what each token does, refer to the LUFA
+ manual section "Summary of Compile Tokens".
+*/
+
+#ifndef __LUFA_CONFIG_H__
+#define __LUFA_CONFIG_H__
+
+ #if (ARCH == ARCH_AVR8)
+
+ /* Non-USB Related Configuration Tokens: */
+// #define DISABLE_TERMINAL_CODES
+
+ /* USB Class Driver Related Tokens: */
+// #define HID_HOST_BOOT_PROTOCOL_ONLY
+// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
+// #define HID_USAGE_STACK_DEPTH {Insert Value Here}
+// #define HID_MAX_COLLECTIONS {Insert Value Here}
+// #define HID_MAX_REPORTITEMS {Insert Value Here}
+// #define HID_MAX_REPORT_IDS {Insert Value Here}
+// #define NO_CLASS_DRIVER_AUTOFLUSH
+
+ /* General USB Driver Related Tokens: */
+// #define ORDERED_EP_CONFIG
+// #define USE_STATIC_OPTIONS {Insert Value Here}
+// #define USB_DEVICE_ONLY
+// #define USB_HOST_ONLY
+// #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
+// #define NO_LIMITED_CONTROLLER_CONNECT
+// #define NO_SOF_EVENTS
+
+ /* USB Device Mode Driver Related Tokens: */
+// #define USE_RAM_DESCRIPTORS
+// #define USE_FLASH_DESCRIPTORS
+// #define USE_EEPROM_DESCRIPTORS
+// #define NO_INTERNAL_SERIAL
+// #define FIXED_CONTROL_ENDPOINT_SIZE {Insert Value Here}
+// #define DEVICE_STATE_AS_GPIOR {Insert Value Here}
+// #define FIXED_NUM_CONFIGURATION {Insert Value Here}
+// #define CONTROL_ONLY_DEVICE
+// #define INTERRUPT_CONTROL_ENDPOINT
+// #define NO_DEVICE_REMOTE_WAKEUP
+// #define NO_DEVICE_SELF_POWER
+
+ /* USB Host Mode Driver Related Tokens: */
+// #define HOST_STATE_AS_GPIOR {Insert Value Here}
+// #define USB_HOST_TIMEOUT_MS {Insert Value Here}
+// #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here}
+
+ #elif (ARCH == ARCH_UC3)
+
+ /* Non-USB Related Configuration Tokens: */
+// #define DISABLE_TERMINAL_CODES
+
+ /* USB Class Driver Related Tokens: */
+// #define HID_HOST_BOOT_PROTOCOL_ONLY
+// #define HID_STATETABLE_STACK_DEPTH {Insert Value Here}
+// #define HID_USAGE_STACK_DEPTH {Insert Value Here}
+// #define HID_MAX_COLLECTIONS {Insert Value Here}
+// #define HID_MAX_REPORTITEMS {Insert Value Here}
+// #define HID_MAX_REPORT_IDS {Insert Value Here}
+// #define NO_CLASS_DRIVER_AUTOFLUSH
+
+ /* General USB Driver Related Tokens: */
+// #define USE_STATIC_OPTIONS {Insert Value Here}
+// #define USB_DEVICE_ONLY
+// #define USB_HOST_ONLY
+// #define USB_STREAM_TIMEOUT_MS {Insert Value Here}
+// #define NO_SOF_EVENTS
+
+ /* USB Device Mode Driver Related Tokens: */
+// #define NO_INTERNAL_SERIAL
+// #define FIXED_CONTROL_ENDPOINT_SIZE {Insert Value Here}
+// #define FIXED_NUM_CONFIGURATION {Insert Value Here}
+// #define CONTROL_ONLY_DEVICE
+// #define NO_DEVICE_REMOTE_WAKEUP
+// #define NO_DEVICE_SELF_POWER
+
+ /* USB Host Mode Driver Related Tokens: */
+// #define USB_HOST_TIMEOUT_MS {Insert Value Here}
+// #define HOST_DEVICE_SETTLE_DELAY_MS {Insert Value Here}
+
+ #endif
+#endif
+
diff --git a/LUFA/CodeTemplates/makefile_template.avr8 b/LUFA/CodeTemplates/makefile_template.avr8
index 26a3b1445..412c8a985 100644
--- a/LUFA/CodeTemplates/makefile_template.avr8
+++ b/LUFA/CodeTemplates/makefile_template.avr8
@@ -1,713 +1,713 @@
-# Hey Emacs, this is a -*- makefile -*-
-#----------------------------------------------------------------------------
-# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
-# >> Modified for use with the LUFA project. <<
-#
-# Released to the Public Domain
-#
-# Additional material for this makefile was written by:
-# Peter Fleury
-# Tim Henigan
-# Colin O'Flynn
-# Reiner Patommel
-# Markus Pfaff
-# Sander Pool
-# Frederik Rouleau
-# Carlos Lamas
-# Dean Camera
-# Opendous Inc.
-# Denver Gingerich
-#
-#----------------------------------------------------------------------------
-# On command line:
-#
-# make all = Make software.
-#
-# make clean = Clean out built project files.
-#
-# make coff = Convert ELF to AVR COFF.
-#
-# make extcoff = Convert ELF to AVR Extended COFF.
-#
-# make program = Download the hex file to the device, using avrdude.
-# Please customize the avrdude settings below first!
-#
-# make dfu = Download the hex file to the device, using dfu-programmer (must
-# have dfu-programmer installed).
-#
-# make flip = Download the hex file to the device, using Atmel FLIP (must
-# have Atmel FLIP installed).
-#
-# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
-# (must have dfu-programmer installed).
-#
-# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
-# (must have Atmel FLIP installed).
-#
-# make doxygen = Generate DoxyGen documentation for the project (must have
-# DoxyGen installed)
-#
-# make debug = Start either simulavr or avarice as specified for debugging,
-# with avr-gdb or avr-insight as the front end for debugging.
-#
-# make filename.s = Just compile filename.c into the assembler code only.
-#
-# make filename.i = Create a preprocessed source file for use in submitting
-# bug reports to the GCC project.
-#
-# To rebuild project do "make clean" then "make all".
-#----------------------------------------------------------------------------
-
-
-# MCU name
-MCU = ### INSERT NAME OF MICROCONTROLLER MODEL HERE ###
-
-
-# Targeted chip architecture (see library "Architectures" documentation)
-ARCH = AVR8
-
-
-# Target board (see library "Board Types" documentation, NONE for projects not requiring
-# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
-# "Board" inside the application directory.
-BOARD = ### INSERT NAME OF BOARD HERE, OR NONE IF NO BOARD DRIVERS USED ###
-
-
-# Processor frequency.
-# This will define a symbol, F_CPU, in all source code files equal to the
-# processor frequency in Hz. You can then use this symbol in your source code to
-# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-# automatically to create a 32-bit value in your source code.
-#
-# This will be an integer division of F_CLOCK below, as it is sourced by
-# F_CLOCK after it has run through any CPU prescalers. Note that this value
-# does not *change* the processor frequency - it should merely be updated to
-# reflect the processor speed set externally so that the code can use accurate
-# software delays.
-F_CPU = ### INSERT PRESCALED SYSTEM CLOCK SPEED HERE, IN HZ ###
-
-
-# Input clock frequency.
-# This will define a symbol, F_USB, in all source code files equal to the
-# input clock frequency (before any prescaling is performed) in Hz. This value may
-# differ from F_CPU if prescaling is used on the latter, and is required as the
-# raw input clock is fed directly to the PLL sections of the AVR for high speed
-# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
-# at the end, this will be done automatically to create a 32-bit value in your
-# source code.
-#
-# If no clock division is performed on the input clock inside the AVR (via the
-# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
-F_USB = ### INSERT CLOCK TO USB MODULE HERE, IN HZ ###
-
-
-# Output format. (can be srec, ihex, binary)
-FORMAT = ihex
-
-
-# Target file name (without extension).
-TARGET = ### INSERT NAME OF MAIN FILENAME HERE, WITHOUT EXTENSION ###
-
-
-# Object files directory
-# To put object files in current directory, use a dot (.), do NOT make
-# this an empty or blank macro!
-OBJDIR = .
-
-
-# Path to the LUFA library
-LUFA_PATH = ### INSERT PATH TO LUFA LIBRARY RELATIVE TO PROJECT DIRECTORY HERE ###
-
-
-# LUFA library compile-time options and predefined tokens (add '-D' before each token)
-LUFA_OPTS = ### INSERT LUFA COMPILE TIME TOKES HERE ###
-
-
-# Create the LUFA source path variables by including the LUFA root makefile
-include $(LUFA_PATH)/LUFA/makefile
-
-
-# List C source files here. (C dependencies are automatically generated.)
-SRC = $(TARGET).c \
- $(LUFA_SRC_USB) \
- $(LUFA_SRC_USBCLASS)
- ### INSERT ADDITIONAL PROJECT SOURCE FILENAMES OR LUFA MODULE NAMES HERE ###
-
-
-# List C++ source files here. (C dependencies are automatically generated.)
-CPPSRC =
-
-
-# List Assembler source files here.
-# Make them always end in a capital .S. Files ending in a lowercase .s
-# will not be considered source files but generated files (assembler
-# output from the compiler), and will be deleted upon "make clean"!
-# Even though the DOS/Win* filesystem matches both .s and .S the same,
-# it will preserve the spelling of the filenames, and gcc itself does
-# care about how the name is spelled on its command-line.
-ASRC =
-
-
-# Optimization level, can be [0, 1, 2, 3, s].
-# 0 = turn off optimization. s = optimize for size.
-# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
-OPT = s
-
-
-# List any extra directories to look for include files here.
-# Each directory must be seperated by a space.
-# Use forward slashes for directory separators.
-# For a directory that has spaces, enclose it in quotes.
-EXTRAINCDIRS = $(LUFA_PATH)/
-
-
-# Compiler flag to set the C Standard level.
-# c89 = "ANSI" C
-# gnu89 = c89 plus GCC extensions
-# c99 = ISO C99 standard (not yet fully implemented)
-# gnu99 = c99 plus GCC extensions
-CSTANDARD = -std=gnu99
-
-
-# Place -D or -U options here for C sources
-CDEFS = -DF_CPU=$(F_CPU)UL
-CDEFS += -DF_USB=$(F_USB)UL
-CDEFS += -DBOARD=BOARD_$(BOARD)
-CDEFS += -DARCH=ARCH_$(ARCH)
-CDEFS += $(LUFA_OPTS)
-
-
-# Place -D or -U options here for ASM sources
-ADEFS = -DF_CPU=$(F_CPU)
-ADEFS += -DF_USB=$(F_USB)UL
-ADEFS += -DBOARD=BOARD_$(BOARD)
-ADEFS += -DARCH=ARCH_$(ARCH)
-ADEFS += $(LUFA_OPTS)
-
-# Place -D or -U options here for C++ sources
-CPPDEFS = -DF_CPU=$(F_CPU)UL
-CPPDEFS += -DF_USB=$(F_USB)UL
-CPPDEFS += -DBOARD=BOARD_$(BOARD)
-CPPDEFS += -DARCH=ARCH_$(ARCH)
-CPPDEFS += $(LUFA_OPTS)
-
-
-# Debugging format.
-# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
-# AVR Studio 4.10 requires dwarf-2.
-# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
-DEBUG = dwarf-2
-
-
-#---------------- Compiler Options C ----------------
-# -g*: generate debugging information
-# -O*: optimization level
-# -f...: tuning, see GCC manual and avr-libc documentation
-# -Wall...: warning level
-# -Wa,...: tell GCC to pass this to the assembler.
-# -adhlns...: create assembler listing
-CFLAGS = -g$(DEBUG)
-CFLAGS += $(CDEFS)
-CFLAGS += -O$(OPT)
-CFLAGS += -funsigned-char
-CFLAGS += -funsigned-bitfields
-CFLAGS += -ffunction-sections
-CFLAGS += -fno-inline-small-functions
-CFLAGS += -fpack-struct
-CFLAGS += -fshort-enums
-CFLAGS += -fno-strict-aliasing
-CFLAGS += -Wall
-CFLAGS += -Wstrict-prototypes
-CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
-CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
-CFLAGS += $(CSTANDARD)
-
-
-#---------------- Compiler Options C++ ----------------
-# -g*: generate debugging information
-# -O*: optimization level
-# -f...: tuning, see GCC manual and avr-libc documentation
-# -Wall...: warning level
-# -Wa,...: tell GCC to pass this to the assembler.
-# -adhlns...: create assembler listing
-CPPFLAGS = -g$(DEBUG)
-CPPFLAGS += $(CPPDEFS)
-CPPFLAGS += -O$(OPT)
-CPPFLAGS += -funsigned-char
-CPPFLAGS += -funsigned-bitfields
-CPPFLAGS += -fpack-struct
-CPPFLAGS += -fshort-enums
-CPPFLAGS += -ffunction-sections
-CPPFLAGS += -fno-strict-aliasing
-CPPFLAGS += -fno-exceptions
-CPPFLAGS += -Wall
-CPPFLAGS += -Wundef
-CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
-CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
-#CPPFLAGS += $(CSTANDARD)
-
-
-#---------------- Assembler Options ----------------
-# -Wa,...: tell GCC to pass this to the assembler.
-# -adhlns: create listing
-# -gstabs: have the assembler create line number information; note that
-# for use in COFF files, additional information about filenames
-# and function names needs to be present in the assembler source
-# files -- see avr-libc docs [FIXME: not yet described there]
-# -listing-cont-lines: Sets the maximum number of continuation lines of hex
-# dump that will be displayed for a given single line of source input.
-ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
-
-
-#---------------- Library Options ----------------
-# Minimalistic printf version
-PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
-
-# Floating point printf version (requires MATH_LIB = -lm below)
-PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
-
-# If this is left blank, then it will use the Standard printf version.
-PRINTF_LIB =
-#PRINTF_LIB = $(PRINTF_LIB_MIN)
-#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
-
-
-# Minimalistic scanf version
-SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
-
-# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
-SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
-
-# If this is left blank, then it will use the Standard scanf version.
-SCANF_LIB =
-#SCANF_LIB = $(SCANF_LIB_MIN)
-#SCANF_LIB = $(SCANF_LIB_FLOAT)
-
-
-MATH_LIB = -lm
-
-
-# List any extra directories to look for libraries here.
-# Each directory must be seperated by a space.
-# Use forward slashes for directory separators.
-# For a directory that has spaces, enclose it in quotes.
-EXTRALIBDIRS =
-
-
-
-#---------------- External Memory Options ----------------
-
-# 64 KB of external RAM, starting after internal RAM (ATmega128!),
-# used for variables (.data/.bss) and heap (malloc()).
-#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
-
-# 64 KB of external RAM, starting after internal RAM (ATmega128!),
-# only used for heap (malloc()).
-#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
-
-EXTMEMOPTS =
-
-
-
-#---------------- Linker Options ----------------
-# -Wl,...: tell GCC to pass this to linker.
-# -Map: create map file
-# --cref: add cross reference to map file
-LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
-LDFLAGS += -Wl,--relax
-LDFLAGS += -Wl,--gc-sections
-LDFLAGS += $(EXTMEMOPTS)
-LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
-LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
-#LDFLAGS += -T linker_script.x
-
-
-
-#---------------- Programming Options (avrdude) ----------------
-
-# Programming hardware
-# Type: avrdude -c ?
-# to get a full listing.
-#
-AVRDUDE_PROGRAMMER = jtagmkII
-
-# com1 = serial port. Use lpt1 to connect to parallel port.
-AVRDUDE_PORT = usb
-
-AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
-#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
-
-
-# Uncomment the following if you want avrdude's erase cycle counter.
-# Note that this counter needs to be initialized first using -Yn,
-# see avrdude manual.
-#AVRDUDE_ERASE_COUNTER = -y
-
-# Uncomment the following if you do /not/ wish a verification to be
-# performed after programming the device.
-#AVRDUDE_NO_VERIFY = -V
-
-# Increase verbosity level. Please use this when submitting bug
-# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
-# to submit bug reports.
-#AVRDUDE_VERBOSE = -v -v
-
-AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
-AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
-AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
-AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
-
-
-
-#---------------- Debugging Options ----------------
-
-# For simulavr only - target MCU frequency.
-DEBUG_MFREQ = $(F_CPU)
-
-# Set the DEBUG_UI to either gdb or insight.
-# DEBUG_UI = gdb
-DEBUG_UI = insight
-
-# Set the debugging back-end to either avarice, simulavr.
-DEBUG_BACKEND = avarice
-#DEBUG_BACKEND = simulavr
-
-# GDB Init Filename.
-GDBINIT_FILE = __avr_gdbinit
-
-# When using avarice settings for the JTAG
-JTAG_DEV = /dev/com1
-
-# Debugging port used to communicate between GDB / avarice / simulavr.
-DEBUG_PORT = 4242
-
-# Debugging host used to communicate between GDB / avarice / simulavr, normally
-# just set to localhost unless doing some sort of crazy debugging when
-# avarice is running on a different computer.
-DEBUG_HOST = localhost
-
-
-
-#============================================================================
-
-
-# Define programs and commands.
-SHELL = sh
-CC = avr-gcc
-OBJCOPY = avr-objcopy
-OBJDUMP = avr-objdump
-SIZE = avr-size
-AR = avr-ar rcs
-NM = avr-nm
-AVRDUDE = avrdude
-REMOVE = rm -f
-REMOVEDIR = rm -rf
-COPY = cp
-WINSHELL = cmd
-
-
-# Define Messages
-# English
-MSG_ERRORS_NONE = Errors: none
-MSG_BEGIN = -------- begin --------
-MSG_END = -------- end --------
-MSG_SIZE_BEFORE = Size before:
-MSG_SIZE_AFTER = Size after:
-MSG_COFF = Converting to AVR COFF:
-MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
-MSG_FLASH = Creating load file for Flash:
-MSG_EEPROM = Creating load file for EEPROM:
-MSG_EXTENDED_LISTING = Creating Extended Listing:
-MSG_SYMBOL_TABLE = Creating Symbol Table:
-MSG_LINKING = Linking:
-MSG_COMPILING = Compiling C:
-MSG_COMPILING_CPP = Compiling C++:
-MSG_ASSEMBLING = Assembling:
-MSG_CLEANING = Cleaning project:
-MSG_CREATING_LIBRARY = Creating library:
-
-
-
-
-# Define all object files.
-OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
-
-# Define all listing files.
-LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
-
-
-# Compiler flags to generate dependency files.
-GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
-
-
-# Combine all necessary flags and optional flags.
-# Add target processor to flags.
-ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
-ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
-ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
-
-
-
-
-
-# Default target.
-all: begin gccversion sizebefore build sizeafter end
-
-# Change the build target to build a HEX file or a library.
-build: elf hex eep lss sym
-#build: lib
-
-
-elf: $(TARGET).elf
-hex: $(TARGET).hex
-eep: $(TARGET).eep
-lss: $(TARGET).lss
-sym: $(TARGET).sym
-LIBNAME=lib$(TARGET).a
-lib: $(LIBNAME)
-
-
-
-# Eye candy.
-# AVR Studio 3.x does not check make's exit code but relies on
-# the following magic strings to be generated by the compile job.
-begin:
- @echo
- @echo $(MSG_BEGIN)
-
-end:
- @echo $(MSG_END)
- @echo
-
-
-# Display size of file.
-HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
-ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
-MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
-FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
-
-
-sizebefore:
- @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
- 2>/dev/null; echo; fi
-
-sizeafter:
- @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
- 2>/dev/null; echo; fi
-
-
-
-# Display compiler version information.
-gccversion :
- @$(CC) --version
-
-
-# Program the device.
-program: $(TARGET).hex $(TARGET).eep
- $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
-
-flip: $(TARGET).hex
- batchisp -hardware usb -device $(MCU) -operation erase f
- batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
- batchisp -hardware usb -device $(MCU) -operation start reset 0
-
-dfu: $(TARGET).hex
- dfu-programmer $(MCU) erase
- dfu-programmer $(MCU) flash $(TARGET).hex
- dfu-programmer $(MCU) reset
-
-flip-ee: $(TARGET).hex $(TARGET).eep
- $(COPY) $(TARGET).eep $(TARGET)eep.hex
- batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase
- batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program
- batchisp -hardware usb -device $(MCU) -operation start reset 0
- $(REMOVE) $(TARGET)eep.hex
-
-dfu-ee: $(TARGET).hex $(TARGET).eep
- dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
- dfu-programmer $(MCU) reset
-
-
-# Generate avr-gdb config/init file which does the following:
-# define the reset signal, load the target file, connect to target, and set
-# a breakpoint at main().
-gdb-config:
- @$(REMOVE) $(GDBINIT_FILE)
- @echo define reset >> $(GDBINIT_FILE)
- @echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
- @echo end >> $(GDBINIT_FILE)
- @echo file $(TARGET).elf >> $(GDBINIT_FILE)
- @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
-ifeq ($(DEBUG_BACKEND),simulavr)
- @echo load >> $(GDBINIT_FILE)
-endif
- @echo break main >> $(GDBINIT_FILE)
-
-debug: gdb-config $(TARGET).elf
-ifeq ($(DEBUG_BACKEND), avarice)
- @echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
- @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
- $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
- @$(WINSHELL) /c pause
-
-else
- @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
- $(DEBUG_MFREQ) --port $(DEBUG_PORT)
-endif
- @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
-
-
-
-
-# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
-COFFCONVERT = $(OBJCOPY) --debugging
-COFFCONVERT += --change-section-address .data-0x800000
-COFFCONVERT += --change-section-address .bss-0x800000
-COFFCONVERT += --change-section-address .noinit-0x800000
-COFFCONVERT += --change-section-address .eeprom-0x810000
-
-
-
-coff: $(TARGET).elf
- @echo
- @echo $(MSG_COFF) $(TARGET).cof
- $(COFFCONVERT) -O coff-avr $< $(TARGET).cof
-
-
-extcoff: $(TARGET).elf
- @echo
- @echo $(MSG_EXTENDED_COFF) $(TARGET).cof
- $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
-
-
-
-# Create final output files (.hex, .eep) from ELF output file.
-%.hex: %.elf
- @echo
- @echo $(MSG_FLASH) $@
- $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature $< $@
-
-%.eep: %.elf
- @echo
- @echo $(MSG_EEPROM) $@
- -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
- --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
-
-# Create extended listing file from ELF output file.
-%.lss: %.elf
- @echo
- @echo $(MSG_EXTENDED_LISTING) $@
- $(OBJDUMP) -h -S -z $< > $@
-
-# Create a symbol table from ELF output file.
-%.sym: %.elf
- @echo
- @echo $(MSG_SYMBOL_TABLE) $@
- $(NM) -n $< > $@
-
-
-
-# Create library from object files.
-.SECONDARY : $(TARGET).a
-.PRECIOUS : $(OBJ)
-%.a: $(OBJ)
- @echo
- @echo $(MSG_CREATING_LIBRARY) $@
- $(AR) $@ $(OBJ)
-
-
-# Link: create ELF output file from object files.
-.SECONDARY : $(TARGET).elf
-.PRECIOUS : $(OBJ)
-%.elf: $(OBJ)
- @echo
- @echo $(MSG_LINKING) $@
- $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
-
-
-# Compile: create object files from C source files.
-$(OBJDIR)/%.o : %.c
- @echo
- @echo $(MSG_COMPILING) $<
- $(CC) -c $(ALL_CFLAGS) $< -o $@
-
-
-# Compile: create object files from C++ source files.
-$(OBJDIR)/%.o : %.cpp
- @echo
- @echo $(MSG_COMPILING_CPP) $<
- $(CC) -c $(ALL_CPPFLAGS) $< -o $@
-
-
-# Compile: create assembler files from C source files.
-%.s : %.c
- $(CC) -S $(ALL_CFLAGS) $< -o $@
-
-
-# Compile: create assembler files from C++ source files.
-%.s : %.cpp
- $(CC) -S $(ALL_CPPFLAGS) $< -o $@
-
-
-# Assemble: create object files from assembler source files.
-$(OBJDIR)/%.o : %.S
- @echo
- @echo $(MSG_ASSEMBLING) $<
- $(CC) -c $(ALL_ASFLAGS) $< -o $@
-
-
-# Create preprocessed source for use in sending a bug report.
-%.i : %.c
- $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
-
-
-# Target: clean project.
-clean: begin clean_list end
-
-clean_list :
- @echo
- @echo $(MSG_CLEANING)
- $(REMOVE) $(TARGET).hex
- $(REMOVE) $(TARGET).eep
- $(REMOVE) $(TARGET).cof
- $(REMOVE) $(TARGET).elf
- $(REMOVE) $(TARGET).map
- $(REMOVE) $(TARGET).sym
- $(REMOVE) $(TARGET).lss
- $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
- $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
- $(REMOVE) $(SRC:.c=.s)
- $(REMOVE) $(SRC:.c=.d)
- $(REMOVE) $(SRC:.c=.i)
- $(REMOVEDIR) .dep
-
-doxygen:
- @echo Generating Project Documentation...
- @doxygen Doxygen.conf
- @echo Documentation Generation Complete.
-
-clean_doxygen:
- rm -rf Documentation
-
-checksource:
- @for f in $(SRC) $(CPPSRC) $(ASRC); do \
- if [ -f $$f ]; then \
- echo "Found Source File: $$f" ; \
- else \
- echo "Source File Not Found: $$f" ; \
- fi; done
-
-
-# Create object files directory
-$(shell mkdir $(OBJDIR) 2>/dev/null)
-
-
-# Include the dependency files.
--include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
-
-
-# Listing of phony targets.
-.PHONY : all begin finish end sizebefore sizeafter gccversion \
-build elf hex eep lss sym coff extcoff doxygen clean \
-clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
-debug gdb-config checksource
+# Hey Emacs, this is a -*- makefile -*-
+#----------------------------------------------------------------------------
+# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
+# >> Modified for use with the LUFA project. <<
+#
+# Released to the Public Domain
+#
+# Additional material for this makefile was written by:
+# Peter Fleury
+# Tim Henigan
+# Colin O'Flynn
+# Reiner Patommel
+# Markus Pfaff
+# Sander Pool
+# Frederik Rouleau
+# Carlos Lamas
+# Dean Camera
+# Opendous Inc.
+# Denver Gingerich
+#
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device, using avrdude.
+# Please customize the avrdude settings below first!
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+# have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+# have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+# (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+# (must have Atmel FLIP installed).
+#
+# make doxygen = Generate DoxyGen documentation for the project (must have
+# DoxyGen installed)
+#
+# make debug = Start either simulavr or avarice as specified for debugging,
+# with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+# bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+
+# MCU name
+MCU = ### INSERT NAME OF MICROCONTROLLER MODEL HERE ###
+
+
+# Targeted chip architecture (see library "Architectures" documentation)
+ARCH = AVR8
+
+
+# Target board (see library "Board Types" documentation, NONE for projects not requiring
+# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
+# "Board" inside the application directory.
+BOARD = ### INSERT NAME OF BOARD HERE, OR NONE IF NO BOARD DRIVERS USED ###
+
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_CLOCK below, as it is sourced by
+# F_CLOCK after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = ### INSERT PRESCALED SYSTEM CLOCK SPEED HERE, IN HZ ###
+
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = ### INSERT CLOCK TO USB MODULE HERE, IN HZ ###
+
+
+# Output format. (can be srec, ihex, binary)
+FORMAT = ihex
+
+
+# Target file name (without extension).
+TARGET = ### INSERT NAME OF MAIN FILENAME HERE, WITHOUT EXTENSION ###
+
+
+# Object files directory
+# To put object files in current directory, use a dot (.), do NOT make
+# this an empty or blank macro!
+OBJDIR = .
+
+
+# Path to the LUFA library
+LUFA_PATH = ### INSERT PATH TO LUFA LIBRARY RELATIVE TO PROJECT DIRECTORY HERE ###
+
+
+# LUFA library compile-time options and predefined tokens (add '-D' before each token)
+LUFA_OPTS = ### INSERT LUFA COMPILE TIME TOKES HERE ###
+
+
+# Create the LUFA source path variables by including the LUFA root makefile
+include $(LUFA_PATH)/LUFA/makefile
+
+
+# List C source files here. (C dependencies are automatically generated.)
+SRC = $(TARGET).c \
+ $(LUFA_SRC_USB) \
+ $(LUFA_SRC_USBCLASS)
+ ### INSERT ADDITIONAL PROJECT SOURCE FILENAMES OR LUFA MODULE NAMES HERE ###
+
+
+# List C++ source files here. (C dependencies are automatically generated.)
+CPPSRC =
+
+
+# List Assembler source files here.
+# Make them always end in a capital .S. Files ending in a lowercase .s
+# will not be considered source files but generated files (assembler
+# output from the compiler), and will be deleted upon "make clean"!
+# Even though the DOS/Win* filesystem matches both .s and .S the same,
+# it will preserve the spelling of the filenames, and gcc itself does
+# care about how the name is spelled on its command-line.
+ASRC =
+
+
+# Optimization level, can be [0, 1, 2, 3, s].
+# 0 = turn off optimization. s = optimize for size.
+# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
+OPT = s
+
+
+# List any extra directories to look for include files here.
+# Each directory must be seperated by a space.
+# Use forward slashes for directory separators.
+# For a directory that has spaces, enclose it in quotes.
+EXTRAINCDIRS = $(LUFA_PATH)/
+
+
+# Compiler flag to set the C Standard level.
+# c89 = "ANSI" C
+# gnu89 = c89 plus GCC extensions
+# c99 = ISO C99 standard (not yet fully implemented)
+# gnu99 = c99 plus GCC extensions
+CSTANDARD = -std=gnu99
+
+
+# Place -D or -U options here for C sources
+CDEFS = -DF_CPU=$(F_CPU)UL
+CDEFS += -DF_USB=$(F_USB)UL
+CDEFS += -DBOARD=BOARD_$(BOARD)
+CDEFS += -DARCH=ARCH_$(ARCH)
+CDEFS += $(LUFA_OPTS)
+
+
+# Place -D or -U options here for ASM sources
+ADEFS = -DF_CPU=$(F_CPU)
+ADEFS += -DF_USB=$(F_USB)UL
+ADEFS += -DBOARD=BOARD_$(BOARD)
+ADEFS += -DARCH=ARCH_$(ARCH)
+ADEFS += $(LUFA_OPTS)
+
+# Place -D or -U options here for C++ sources
+CPPDEFS = -DF_CPU=$(F_CPU)UL
+CPPDEFS += -DF_USB=$(F_USB)UL
+CPPDEFS += -DBOARD=BOARD_$(BOARD)
+CPPDEFS += -DARCH=ARCH_$(ARCH)
+CPPDEFS += $(LUFA_OPTS)
+
+
+# Debugging format.
+# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
+# AVR Studio 4.10 requires dwarf-2.
+# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
+DEBUG = dwarf-2
+
+
+#---------------- Compiler Options C ----------------
+# -g*: generate debugging information
+# -O*: optimization level
+# -f...: tuning, see GCC manual and avr-libc documentation
+# -Wall...: warning level
+# -Wa,...: tell GCC to pass this to the assembler.
+# -adhlns...: create assembler listing
+CFLAGS = -g$(DEBUG)
+CFLAGS += $(CDEFS)
+CFLAGS += -O$(OPT)
+CFLAGS += -funsigned-char
+CFLAGS += -funsigned-bitfields
+CFLAGS += -ffunction-sections
+CFLAGS += -fno-inline-small-functions
+CFLAGS += -fpack-struct
+CFLAGS += -fshort-enums
+CFLAGS += -fno-strict-aliasing
+CFLAGS += -Wall
+CFLAGS += -Wstrict-prototypes
+CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
+CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
+CFLAGS += $(CSTANDARD)
+
+
+#---------------- Compiler Options C++ ----------------
+# -g*: generate debugging information
+# -O*: optimization level
+# -f...: tuning, see GCC manual and avr-libc documentation
+# -Wall...: warning level
+# -Wa,...: tell GCC to pass this to the assembler.
+# -adhlns...: create assembler listing
+CPPFLAGS = -g$(DEBUG)
+CPPFLAGS += $(CPPDEFS)
+CPPFLAGS += -O$(OPT)
+CPPFLAGS += -funsigned-char
+CPPFLAGS += -funsigned-bitfields
+CPPFLAGS += -fpack-struct
+CPPFLAGS += -fshort-enums
+CPPFLAGS += -ffunction-sections
+CPPFLAGS += -fno-strict-aliasing
+CPPFLAGS += -fno-exceptions
+CPPFLAGS += -Wall
+CPPFLAGS += -Wundef
+CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
+CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
+#CPPFLAGS += $(CSTANDARD)
+
+
+#---------------- Assembler Options ----------------
+# -Wa,...: tell GCC to pass this to the assembler.
+# -adhlns: create listing
+# -gstabs: have the assembler create line number information; note that
+# for use in COFF files, additional information about filenames
+# and function names needs to be present in the assembler source
+# files -- see avr-libc docs [FIXME: not yet described there]
+# -listing-cont-lines: Sets the maximum number of continuation lines of hex
+# dump that will be displayed for a given single line of source input.
+ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
+
+
+#---------------- Library Options ----------------
+# Minimalistic printf version
+PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
+
+# Floating point printf version (requires MATH_LIB = -lm below)
+PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
+
+# If this is left blank, then it will use the Standard printf version.
+PRINTF_LIB =
+#PRINTF_LIB = $(PRINTF_LIB_MIN)
+#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
+
+
+# Minimalistic scanf version
+SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
+
+# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
+SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
+
+# If this is left blank, then it will use the Standard scanf version.
+SCANF_LIB =
+#SCANF_LIB = $(SCANF_LIB_MIN)
+#SCANF_LIB = $(SCANF_LIB_FLOAT)
+
+
+MATH_LIB = -lm
+
+
+# List any extra directories to look for libraries here.
+# Each directory must be seperated by a space.
+# Use forward slashes for directory separators.
+# For a directory that has spaces, enclose it in quotes.
+EXTRALIBDIRS =
+
+
+
+#---------------- External Memory Options ----------------
+
+# 64 KB of external RAM, starting after internal RAM (ATmega128!),
+# used for variables (.data/.bss) and heap (malloc()).
+#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
+
+# 64 KB of external RAM, starting after internal RAM (ATmega128!),
+# only used for heap (malloc()).
+#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
+
+EXTMEMOPTS =
+
+
+
+#---------------- Linker Options ----------------
+# -Wl,...: tell GCC to pass this to linker.
+# -Map: create map file
+# --cref: add cross reference to map file
+LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
+LDFLAGS += -Wl,--relax
+LDFLAGS += -Wl,--gc-sections
+LDFLAGS += $(EXTMEMOPTS)
+LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
+LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
+#LDFLAGS += -T linker_script.x
+
+
+
+#---------------- Programming Options (avrdude) ----------------
+
+# Programming hardware
+# Type: avrdude -c ?
+# to get a full listing.
+#
+AVRDUDE_PROGRAMMER = jtagmkII
+
+# com1 = serial port. Use lpt1 to connect to parallel port.
+AVRDUDE_PORT = usb
+
+AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
+#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
+
+
+# Uncomment the following if you want avrdude's erase cycle counter.
+# Note that this counter needs to be initialized first using -Yn,
+# see avrdude manual.
+#AVRDUDE_ERASE_COUNTER = -y
+
+# Uncomment the following if you do /not/ wish a verification to be
+# performed after programming the device.
+#AVRDUDE_NO_VERIFY = -V
+
+# Increase verbosity level. Please use this when submitting bug
+# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
+# to submit bug reports.
+#AVRDUDE_VERBOSE = -v -v
+
+AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
+AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
+AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
+AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
+
+
+
+#---------------- Debugging Options ----------------
+
+# For simulavr only - target MCU frequency.
+DEBUG_MFREQ = $(F_CPU)
+
+# Set the DEBUG_UI to either gdb or insight.
+# DEBUG_UI = gdb
+DEBUG_UI = insight
+
+# Set the debugging back-end to either avarice, simulavr.
+DEBUG_BACKEND = avarice
+#DEBUG_BACKEND = simulavr
+
+# GDB Init Filename.
+GDBINIT_FILE = __avr_gdbinit
+
+# When using avarice settings for the JTAG
+JTAG_DEV = /dev/com1
+
+# Debugging port used to communicate between GDB / avarice / simulavr.
+DEBUG_PORT = 4242
+
+# Debugging host used to communicate between GDB / avarice / simulavr, normally
+# just set to localhost unless doing some sort of crazy debugging when
+# avarice is running on a different computer.
+DEBUG_HOST = localhost
+
+
+
+#============================================================================
+
+
+# Define programs and commands.
+SHELL = sh
+CC = avr-gcc
+OBJCOPY = avr-objcopy
+OBJDUMP = avr-objdump
+SIZE = avr-size
+AR = avr-ar rcs
+NM = avr-nm
+AVRDUDE = avrdude
+REMOVE = rm -f
+REMOVEDIR = rm -rf
+COPY = cp
+WINSHELL = cmd
+
+
+# Define Messages
+# English
+MSG_ERRORS_NONE = Errors: none
+MSG_BEGIN = -------- begin --------
+MSG_END = -------- end --------
+MSG_SIZE_BEFORE = Size before:
+MSG_SIZE_AFTER = Size after:
+MSG_COFF = Converting to AVR COFF:
+MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
+MSG_FLASH = Creating load file for Flash:
+MSG_EEPROM = Creating load file for EEPROM:
+MSG_EXTENDED_LISTING = Creating Extended Listing:
+MSG_SYMBOL_TABLE = Creating Symbol Table:
+MSG_LINKING = Linking:
+MSG_COMPILING = Compiling C:
+MSG_COMPILING_CPP = Compiling C++:
+MSG_ASSEMBLING = Assembling:
+MSG_CLEANING = Cleaning project:
+MSG_CREATING_LIBRARY = Creating library:
+
+
+
+
+# Define all object files.
+OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
+
+# Define all listing files.
+LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
+
+
+# Compiler flags to generate dependency files.
+GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
+
+
+# Combine all necessary flags and optional flags.
+# Add target processor to flags.
+ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
+ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
+ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
+
+
+
+
+
+# Default target.
+all: begin gccversion sizebefore build sizeafter end
+
+# Change the build target to build a HEX file or a library.
+build: elf hex eep lss sym
+#build: lib
+
+
+elf: $(TARGET).elf
+hex: $(TARGET).hex
+eep: $(TARGET).eep
+lss: $(TARGET).lss
+sym: $(TARGET).sym
+LIBNAME=lib$(TARGET).a
+lib: $(LIBNAME)
+
+
+
+# Eye candy.
+# AVR Studio 3.x does not check make's exit code but relies on
+# the following magic strings to be generated by the compile job.
+begin:
+ @echo
+ @echo $(MSG_BEGIN)
+
+end:
+ @echo $(MSG_END)
+ @echo
+
+
+# Display size of file.
+HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
+ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
+MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
+FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
+
+
+sizebefore:
+ @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
+ 2>/dev/null; echo; fi
+
+sizeafter:
+ @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
+ 2>/dev/null; echo; fi
+
+
+
+# Display compiler version information.
+gccversion :
+ @$(CC) --version
+
+
+# Program the device.
+program: $(TARGET).hex $(TARGET).eep
+ $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
+
+flip: $(TARGET).hex
+ batchisp -hardware usb -device $(MCU) -operation erase f
+ batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
+ batchisp -hardware usb -device $(MCU) -operation start reset 0
+
+dfu: $(TARGET).hex
+ dfu-programmer $(MCU) erase
+ dfu-programmer $(MCU) flash $(TARGET).hex
+ dfu-programmer $(MCU) reset
+
+flip-ee: $(TARGET).hex $(TARGET).eep
+ $(COPY) $(TARGET).eep $(TARGET)eep.hex
+ batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase
+ batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program
+ batchisp -hardware usb -device $(MCU) -operation start reset 0
+ $(REMOVE) $(TARGET)eep.hex
+
+dfu-ee: $(TARGET).hex $(TARGET).eep
+ dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
+ dfu-programmer $(MCU) reset
+
+
+# Generate avr-gdb config/init file which does the following:
+# define the reset signal, load the target file, connect to target, and set
+# a breakpoint at main().
+gdb-config:
+ @$(REMOVE) $(GDBINIT_FILE)
+ @echo define reset >> $(GDBINIT_FILE)
+ @echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
+ @echo end >> $(GDBINIT_FILE)
+ @echo file $(TARGET).elf >> $(GDBINIT_FILE)
+ @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
+ifeq ($(DEBUG_BACKEND),simulavr)
+ @echo load >> $(GDBINIT_FILE)
+endif
+ @echo break main >> $(GDBINIT_FILE)
+
+debug: gdb-config $(TARGET).elf
+ifeq ($(DEBUG_BACKEND), avarice)
+ @echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
+ @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
+ $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
+ @$(WINSHELL) /c pause
+
+else
+ @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
+ $(DEBUG_MFREQ) --port $(DEBUG_PORT)
+endif
+ @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
+
+
+
+
+# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
+COFFCONVERT = $(OBJCOPY) --debugging
+COFFCONVERT += --change-section-address .data-0x800000
+COFFCONVERT += --change-section-address .bss-0x800000
+COFFCONVERT += --change-section-address .noinit-0x800000
+COFFCONVERT += --change-section-address .eeprom-0x810000
+
+
+
+coff: $(TARGET).elf
+ @echo
+ @echo $(MSG_COFF) $(TARGET).cof
+ $(COFFCONVERT) -O coff-avr $< $(TARGET).cof
+
+
+extcoff: $(TARGET).elf
+ @echo
+ @echo $(MSG_EXTENDED_COFF) $(TARGET).cof
+ $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
+
+
+
+# Create final output files (.hex, .eep) from ELF output file.
+%.hex: %.elf
+ @echo
+ @echo $(MSG_FLASH) $@
+ $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature $< $@
+
+%.eep: %.elf
+ @echo
+ @echo $(MSG_EEPROM) $@
+ -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
+ --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
+
+# Create extended listing file from ELF output file.
+%.lss: %.elf
+ @echo
+ @echo $(MSG_EXTENDED_LISTING) $@
+ $(OBJDUMP) -h -S -z $< > $@
+
+# Create a symbol table from ELF output file.
+%.sym: %.elf
+ @echo
+ @echo $(MSG_SYMBOL_TABLE) $@
+ $(NM) -n $< > $@
+
+
+
+# Create library from object files.
+.SECONDARY : $(TARGET).a
+.PRECIOUS : $(OBJ)
+%.a: $(OBJ)
+ @echo
+ @echo $(MSG_CREATING_LIBRARY) $@
+ $(AR) $@ $(OBJ)
+
+
+# Link: create ELF output file from object files.
+.SECONDARY : $(TARGET).elf
+.PRECIOUS : $(OBJ)
+%.elf: $(OBJ)
+ @echo
+ @echo $(MSG_LINKING) $@
+ $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
+
+
+# Compile: create object files from C source files.
+$(OBJDIR)/%.o : %.c
+ @echo
+ @echo $(MSG_COMPILING) $<
+ $(CC) -c $(ALL_CFLAGS) $< -o $@
+
+
+# Compile: create object files from C++ source files.
+$(OBJDIR)/%.o : %.cpp
+ @echo
+ @echo $(MSG_COMPILING_CPP) $<
+ $(CC) -c $(ALL_CPPFLAGS) $< -o $@
+
+
+# Compile: create assembler files from C source files.
+%.s : %.c
+ $(CC) -S $(ALL_CFLAGS) $< -o $@
+
+
+# Compile: create assembler files from C++ source files.
+%.s : %.cpp
+ $(CC) -S $(ALL_CPPFLAGS) $< -o $@
+
+
+# Assemble: create object files from assembler source files.
+$(OBJDIR)/%.o : %.S
+ @echo
+ @echo $(MSG_ASSEMBLING) $<
+ $(CC) -c $(ALL_ASFLAGS) $< -o $@
+
+
+# Create preprocessed source for use in sending a bug report.
+%.i : %.c
+ $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
+
+
+# Target: clean project.
+clean: begin clean_list end
+
+clean_list :
+ @echo
+ @echo $(MSG_CLEANING)
+ $(REMOVE) $(TARGET).hex
+ $(REMOVE) $(TARGET).eep
+ $(REMOVE) $(TARGET).cof
+ $(REMOVE) $(TARGET).elf
+ $(REMOVE) $(TARGET).map
+ $(REMOVE) $(TARGET).sym
+ $(REMOVE) $(TARGET).lss
+ $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
+ $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
+ $(REMOVE) $(SRC:.c=.s)
+ $(REMOVE) $(SRC:.c=.d)
+ $(REMOVE) $(SRC:.c=.i)
+ $(REMOVEDIR) .dep
+
+doxygen:
+ @echo Generating Project Documentation...
+ @doxygen Doxygen.conf
+ @echo Documentation Generation Complete.
+
+clean_doxygen:
+ rm -rf Documentation
+
+checksource:
+ @for f in $(SRC) $(CPPSRC) $(ASRC); do \
+ if [ -f $$f ]; then \
+ echo "Found Source File: $$f" ; \
+ else \
+ echo "Source File Not Found: $$f" ; \
+ fi; done
+
+
+# Create object files directory
+$(shell mkdir $(OBJDIR) 2>/dev/null)
+
+
+# Include the dependency files.
+-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
+
+
+# Listing of phony targets.
+.PHONY : all begin finish end sizebefore sizeafter gccversion \
+build elf hex eep lss sym coff extcoff doxygen clean \
+clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
+debug gdb-config checksource
diff --git a/LUFA/CodeTemplates/makefile_template.uc3 b/LUFA/CodeTemplates/makefile_template.uc3
index 645f6c288..0e8f1a3d7 100644
--- a/LUFA/CodeTemplates/makefile_template.uc3
+++ b/LUFA/CodeTemplates/makefile_template.uc3
@@ -1,486 +1,486 @@
-# Hey Emacs, this is a -*- makefile -*-
-#----------------------------------------------------------------------------
-# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
-# >> Modified for use with the LUFA project. <<
-#
-# Released to the Public Domain
-#
-# Additional material for this makefile was written by:
-# Peter Fleury
-# Tim Henigan
-# Colin O'Flynn
-# Reiner Patommel
-# Markus Pfaff
-# Sander Pool
-# Frederik Rouleau
-# Carlos Lamas
-# Dean Camera
-# Opendous Inc.
-# Denver Gingerich
-#
-#----------------------------------------------------------------------------
-# On command line:
-#
-# make all = Make software.
-#
-# make clean = Clean out built project files.
-#
-# make dfu = Download the hex file to the device, using dfu-programmer (must
-# have dfu-programmer installed).
-#
-# make flip = Download the hex file to the device, using Atmel FLIP (must
-# have Atmel FLIP installed).
-#
-# make doxygen = Generate DoxyGen documentation for the project (must have
-# DoxyGen installed)
-#
-# make filename.s = Just compile filename.c into the assembler code only.
-#
-# make filename.i = Create a preprocessed source file for use in submitting
-# bug reports to the GCC project.
-#
-# To rebuild project do "make clean" then "make all".
-#----------------------------------------------------------------------------
-
-
-# MCU name
-MCU = ### INSERT NAME OF MICROCONTROLLER MODEL HERE ###
-
-
-# Targeted chip architecture (see library "Architectures" documentation)
-ARCH = UC3
-
-
-# Target board (see library "Board Types" documentation, NONE for projects not requiring
-# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
-# "Board" inside the application directory.
-BOARD = ### INSERT NAME OF BOARD HERE, OR NONE IF NO BOARD DRIVERS USED ###
-
-
-# Processor frequency.
-# This will define a symbol, F_CPU, in all source code files equal to the
-# processor frequency in Hz. You can then use this symbol in your source code to
-# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-# automatically to create a 32-bit value in your source code.
-#
-# This should be the frequency the system core runs at, after the system clock
-# has been set up correctly and started.
-F_CPU = ### INSERT PRESCALED SYSTEM CLOCK SPEED HERE, IN HZ ###
-
-
-# USB controller master clock frequency.
-# This will define a symbol, F_USB, in all source code files equal to the
-# input clock frequency of the USB controller's clock generator in Hz.
-#
-# For the UC3 chips, this should be equal to 48MHz or 96MHz.
-F_USB = ### INSERT CLOCK TO USB MODULE HERE, IN HZ ###
-
-
-# Output format. (can be srec, ihex, binary)
-FORMAT = ihex
-
-
-# Target file name (without extension).
-TARGET = ### INSERT NAME OF MAIN FILENAME HERE, WITHOUT EXTENSION ###
-
-
-# Object files directory
-# To put object files in current directory, use a dot (.), do NOT make
-# this an empty or blank macro!
-OBJDIR = .
-
-
-# Path to the LUFA library
-LUFA_PATH = ### INSERT PATH TO LUFA LIBRARY RELATIVE TO PROJECT DIRECTORY HERE ###
-
-
-# LUFA library compile-time options and predefined tokens (add '-D' before each token)
-LUFA_OPTS = ### INSERT LUFA COMPILE TIME TOKES HERE ###
-
-
-# Create the LUFA source path variables by including the LUFA root makefile
-include $(LUFA_PATH)/LUFA/makefile
-
-
-# List C source files here. (C dependencies are automatically generated.)
-SRC = $(TARGET).c \
- $(LUFA_SRC_USB) \
- $(LUFA_SRC_USBCLASS)
- ### INSERT ADDITIONAL PROJECT SOURCE FILENAMES OR LUFA MODULE NAMES HERE ###
-
-
-# List C++ source files here. (C dependencies are automatically generated.)
-CPPSRC =
-
-
-# List Assembler source files here.
-# Make them always end in a capital .S. Files ending in a lowercase .s
-# will not be considered source files but generated files (assembler
-# output from the compiler), and will be deleted upon "make clean"!
-# Even though the DOS/Win* filesystem matches both .s and .S the same,
-# it will preserve the spelling of the filenames, and gcc itself does
-# care about how the name is spelled on its command-line.
-ASRC =
-
-
-# Optimization level, can be [0, 1, 2, 3, s].
-# 0 = turn off optimization. s = optimize for size.
-# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
-OPT = s
-
-
-# List any extra directories to look for include files here.
-# Each directory must be seperated by a space.
-# Use forward slashes for directory separators.
-# For a directory that has spaces, enclose it in quotes.
-EXTRAINCDIRS = $(LUFA_PATH)/
-
-
-# Compiler flag to set the C Standard level.
-# c89 = "ANSI" C
-# gnu89 = c89 plus GCC extensions
-# c99 = ISO C99 standard (not yet fully implemented)
-# gnu99 = c99 plus GCC extensions
-CSTANDARD = -std=gnu99
-
-
-# Place -D or -U options here for C sources
-CDEFS = -DF_CPU=$(F_CPU)UL
-CDEFS += -DF_USB=$(F_USB)UL
-CDEFS += -DBOARD=BOARD_$(BOARD)
-CDEFS += -DARCH=ARCH_$(ARCH)
-CDEFS += $(LUFA_OPTS)
-
-
-# Place -D or -U options here for ASM sources
-ADEFS = -DF_CPU=$(F_CPU)
-ADEFS += -DF_USB=$(F_USB)UL
-ADEFS += -DBOARD=BOARD_$(BOARD)
-ADEFS += -DARCH=ARCH_$(ARCH)
-ADEFS += $(LUFA_OPTS)
-
-# Place -D or -U options here for C++ sources
-CPPDEFS = -DF_CPU=$(F_CPU)UL
-CPPDEFS += -DF_USB=$(F_USB)UL
-CPPDEFS += -DBOARD=BOARD_$(BOARD)
-CPPDEFS += -DARCH=ARCH_$(ARCH)
-CPPDEFS += $(LUFA_OPTS)
-
-
-# Debugging level.
-DEBUG = 3
-
-
-#---------------- Compiler Options C ----------------
-# -g*: generate debugging information
-# -O*: optimization level
-# -f...: tuning, see GCC manual and avr-libc documentation
-# -Wall...: warning level
-# -Wa,...: tell GCC to pass this to the assembler.
-# -adhlns...: create assembler listing
-CFLAGS = -g$(DEBUG)
-CFLAGS += $(CDEFS)
-CFLAGS += -O$(OPT)
-CFLAGS += -funsigned-char
-CFLAGS += -funsigned-bitfields
-CFLAGS += -ffunction-sections
-CFLAGS += -fno-strict-aliasing
-CFLAGS += -Wall
-CFLAGS += -Wstrict-prototypes
-CFLAGS += -masm-addr-pseudos
-CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
-CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
-CFLAGS += $(CSTANDARD)
-
-
-#---------------- Compiler Options C++ ----------------
-# -g*: generate debugging information
-# -O*: optimization level
-# -f...: tuning, see GCC manual and avr-libc documentation
-# -Wall...: warning level
-# -Wa,...: tell GCC to pass this to the assembler.
-# -adhlns...: create assembler listing
-CPPFLAGS = -g$(DEBUG)
-CPPFLAGS += $(CPPDEFS)
-CPPFLAGS += -O$(OPT)
-CPPFLAGS += -funsigned-char
-CPPFLAGS += -funsigned-bitfields
-CPPFLAGS += -ffunction-sections
-CPPFLAGS += -fno-strict-aliasing
-CPPFLAGS += -fno-exceptions
-CPPFLAGS += -masm-addr-pseudos
-CPPFLAGS += -Wall
-CPPFLAGS += -Wundef
-CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
-CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
-#CPPFLAGS += $(CSTANDARD)
-
-
-#---------------- Assembler Options ----------------
-# -Wa,...: tell GCC to pass this to the assembler.
-# -adhlns: create listing
-# -gstabs: have the assembler create line number information; note that
-# for use in COFF files, additional information about filenames
-# and function names needs to be present in the assembler source
-# files -- see avr-libc docs [FIXME: not yet described there]
-# -listing-cont-lines: Sets the maximum number of continuation lines of hex
-# dump that will be displayed for a given single line of source input.
-ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
-
-
-#---------------- Linker Options ----------------
-# -Wl,...: tell GCC to pass this to linker.
-# -Map: create map file
-# --cref: add cross reference to map file
-LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
-LDFLAGS += -Wl,--gc-sections --rodata-writable
-LDFLAGS += -Wl,--direct-data
-#LDFLAGS += -T linker_script.x
-
-
-#============================================================================
-
-
-# Define programs and commands.
-SHELL = sh
-CC = avr32-gcc
-OBJCOPY = avr32-objcopy
-OBJDUMP = avr32-objdump
-SIZE = avr32-size
-AR = avr32-ar rcs
-NM = avr32-nm
-REMOVE = rm -f
-REMOVEDIR = rm -rf
-COPY = cp
-WINSHELL = cmd
-
-
-# Define Messages
-# English
-MSG_ERRORS_NONE = Errors: none
-MSG_BEGIN = -------- begin --------
-MSG_END = -------- end --------
-MSG_SIZE_BEFORE = Size before:
-MSG_SIZE_AFTER = Size after:
-MSG_COFF = Converting to AVR COFF:
-MSG_FLASH = Creating load file for Flash:
-MSG_EEPROM = Creating load file for EEPROM:
-MSG_EXTENDED_LISTING = Creating Extended Listing:
-MSG_SYMBOL_TABLE = Creating Symbol Table:
-MSG_LINKING = Linking:
-MSG_COMPILING = Compiling C:
-MSG_COMPILING_CPP = Compiling C++:
-MSG_ASSEMBLING = Assembling:
-MSG_CLEANING = Cleaning project:
-MSG_CREATING_LIBRARY = Creating library:
-
-
-
-
-# Define all object files.
-OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
-
-# Define all listing files.
-LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
-
-
-# Compiler flags to generate dependency files.
-GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
-
-
-# Combine all necessary flags and optional flags.
-# Add target processor to flags.
-ALL_CFLAGS = -mpart=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
-ALL_CPPFLAGS = -mpart=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
-ALL_ASFLAGS = -mpart=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
-
-
-
-
-
-# Default target.
-all: begin gccversion sizebefore build sizeafter end
-
-# Change the build target to build a HEX file or a library.
-build: elf hex lss sym
-#build: lib
-
-
-elf: $(TARGET).elf
-hex: $(TARGET).hex
-lss: $(TARGET).lss
-sym: $(TARGET).sym
-LIBNAME=lib$(TARGET).a
-lib: $(LIBNAME)
-
-
-
-# Eye candy.
-# AVR Studio 3.x does not check make's exit code but relies on
-# the following magic strings to be generated by the compile job.
-begin:
- @echo
- @echo $(MSG_BEGIN)
-
-end:
- @echo $(MSG_END)
- @echo
-
-
-# Display size of file.
-HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
-ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
-MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
-FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
-
-
-sizebefore:
- @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
- 2>/dev/null; echo; fi
-
-sizeafter:
- @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
- 2>/dev/null; echo; fi
-
-
-
-# Display compiler version information.
-gccversion :
- @$(CC) --version
-
-
-# Program the device.
-flip: $(TARGET).hex
- batchisp -hardware usb -device $(MCU) -operation erase f
- batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
- batchisp -hardware usb -device $(MCU) -operation start reset 0
-
-dfu: $(TARGET).hex
- dfu-programmer $(MCU) erase
- dfu-programmer $(MCU) flash $(TARGET).hex
- dfu-programmer $(MCU) reset
-
-
-# Create final output files (.hex, .eep) from ELF output file.
-%.hex: %.elf
- @echo
- @echo $(MSG_FLASH) $@
- $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature $< $@
-
-# Create extended listing file from ELF output file.
-%.lss: %.elf
- @echo
- @echo $(MSG_EXTENDED_LISTING) $@
- $(OBJDUMP) -h -S -z $< > $@
-
-# Create a symbol table from ELF output file.
-%.sym: %.elf
- @echo
- @echo $(MSG_SYMBOL_TABLE) $@
- $(NM) -n $< > $@
-
-
-
-# Create library from object files.
-.SECONDARY : $(TARGET).a
-.PRECIOUS : $(OBJ)
-%.a: $(OBJ)
- @echo
- @echo $(MSG_CREATING_LIBRARY) $@
- $(AR) $@ $(OBJ)
-
-
-# Link: create ELF output file from object files.
-.SECONDARY : $(TARGET).elf
-.PRECIOUS : $(OBJ)
-%.elf: $(OBJ)
- @echo
- @echo $(MSG_LINKING) $@
- $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
-
-
-# Compile: create object files from C source files.
-$(OBJDIR)/%.o : %.c
- @echo
- @echo $(MSG_COMPILING) $<
- $(CC) -c $(ALL_CFLAGS) $< -o $@
-
-
-# Compile: create object files from C++ source files.
-$(OBJDIR)/%.o : %.cpp
- @echo
- @echo $(MSG_COMPILING_CPP) $<
- $(CC) -c $(ALL_CPPFLAGS) $< -o $@
-
-
-# Compile: create assembler files from C source files.
-%.s : %.c
- $(CC) -S $(ALL_CFLAGS) $< -o $@
-
-
-# Compile: create assembler files from C++ source files.
-%.s : %.cpp
- $(CC) -S $(ALL_CPPFLAGS) $< -o $@
-
-
-# Assemble: create object files from assembler source files.
-$(OBJDIR)/%.o : %.S
- @echo
- @echo $(MSG_ASSEMBLING) $<
- $(CC) -c $(ALL_ASFLAGS) $< -o $@
-
-
-# Create preprocessed source for use in sending a bug report.
-%.i : %.c
- $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
-
-
-# Target: clean project.
-clean: begin clean_list end
-
-clean_list :
- @echo
- @echo $(MSG_CLEANING)
- $(REMOVE) $(TARGET).hex
- $(REMOVE) $(TARGET).cof
- $(REMOVE) $(TARGET).elf
- $(REMOVE) $(TARGET).map
- $(REMOVE) $(TARGET).sym
- $(REMOVE) $(TARGET).lss
- $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
- $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
- $(REMOVE) $(SRC:.c=.s)
- $(REMOVE) $(SRC:.c=.d)
- $(REMOVE) $(SRC:.c=.i)
- $(REMOVEDIR) .dep
-
-doxygen:
- @echo Generating Project Documentation...
- @doxygen Doxygen.conf
- @echo Documentation Generation Complete.
-
-clean_doxygen:
- rm -rf Documentation
-
-checksource:
- @for f in $(SRC) $(CPPSRC) $(ASRC); do \
- if [ -f $$f ]; then \
- echo "Found Source File: $$f" ; \
- else \
- echo "Source File Not Found: $$f" ; \
- fi; done
-
-
-# Create object files directory
-$(shell mkdir $(OBJDIR) 2>/dev/null)
-
-
-# Include the dependency files.
--include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
-
-
-# Listing of phony targets.
-.PHONY : all begin finish end sizebefore sizeafter gccversion \
-build elf hex lss sym doxygen clean clean_list clean_doxygen \
-dfu flip checksource
-
+# Hey Emacs, this is a -*- makefile -*-
+#----------------------------------------------------------------------------
+# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
+# >> Modified for use with the LUFA project. <<
+#
+# Released to the Public Domain
+#
+# Additional material for this makefile was written by:
+# Peter Fleury
+# Tim Henigan
+# Colin O'Flynn
+# Reiner Patommel
+# Markus Pfaff
+# Sander Pool
+# Frederik Rouleau
+# Carlos Lamas
+# Dean Camera
+# Opendous Inc.
+# Denver Gingerich
+#
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+# have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+# have Atmel FLIP installed).
+#
+# make doxygen = Generate DoxyGen documentation for the project (must have
+# DoxyGen installed)
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+# bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+
+# MCU name
+MCU = ### INSERT NAME OF MICROCONTROLLER MODEL HERE ###
+
+
+# Targeted chip architecture (see library "Architectures" documentation)
+ARCH = UC3
+
+
+# Target board (see library "Board Types" documentation, NONE for projects not requiring
+# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
+# "Board" inside the application directory.
+BOARD = ### INSERT NAME OF BOARD HERE, OR NONE IF NO BOARD DRIVERS USED ###
+
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This should be the frequency the system core runs at, after the system clock
+# has been set up correctly and started.
+F_CPU = ### INSERT PRESCALED SYSTEM CLOCK SPEED HERE, IN HZ ###
+
+
+# USB controller master clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency of the USB controller's clock generator in Hz.
+#
+# For the UC3 chips, this should be equal to 48MHz or 96MHz.
+F_USB = ### INSERT CLOCK TO USB MODULE HERE, IN HZ ###
+
+
+# Output format. (can be srec, ihex, binary)
+FORMAT = ihex
+
+
+# Target file name (without extension).
+TARGET = ### INSERT NAME OF MAIN FILENAME HERE, WITHOUT EXTENSION ###
+
+
+# Object files directory
+# To put object files in current directory, use a dot (.), do NOT make
+# this an empty or blank macro!
+OBJDIR = .
+
+
+# Path to the LUFA library
+LUFA_PATH = ### INSERT PATH TO LUFA LIBRARY RELATIVE TO PROJECT DIRECTORY HERE ###
+
+
+# LUFA library compile-time options and predefined tokens (add '-D' before each token)
+LUFA_OPTS = ### INSERT LUFA COMPILE TIME TOKES HERE ###
+
+
+# Create the LUFA source path variables by including the LUFA root makefile
+include $(LUFA_PATH)/LUFA/makefile
+
+
+# List C source files here. (C dependencies are automatically generated.)
+SRC = $(TARGET).c \
+ $(LUFA_SRC_USB) \
+ $(LUFA_SRC_USBCLASS)
+ ### INSERT ADDITIONAL PROJECT SOURCE FILENAMES OR LUFA MODULE NAMES HERE ###
+
+
+# List C++ source files here. (C dependencies are automatically generated.)
+CPPSRC =
+
+
+# List Assembler source files here.
+# Make them always end in a capital .S. Files ending in a lowercase .s
+# will not be considered source files but generated files (assembler
+# output from the compiler), and will be deleted upon "make clean"!
+# Even though the DOS/Win* filesystem matches both .s and .S the same,
+# it will preserve the spelling of the filenames, and gcc itself does
+# care about how the name is spelled on its command-line.
+ASRC =
+
+
+# Optimization level, can be [0, 1, 2, 3, s].
+# 0 = turn off optimization. s = optimize for size.
+# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
+OPT = s
+
+
+# List any extra directories to look for include files here.
+# Each directory must be seperated by a space.
+# Use forward slashes for directory separators.
+# For a directory that has spaces, enclose it in quotes.
+EXTRAINCDIRS = $(LUFA_PATH)/
+
+
+# Compiler flag to set the C Standard level.
+# c89 = "ANSI" C
+# gnu89 = c89 plus GCC extensions
+# c99 = ISO C99 standard (not yet fully implemented)
+# gnu99 = c99 plus GCC extensions
+CSTANDARD = -std=gnu99
+
+
+# Place -D or -U options here for C sources
+CDEFS = -DF_CPU=$(F_CPU)UL
+CDEFS += -DF_USB=$(F_USB)UL
+CDEFS += -DBOARD=BOARD_$(BOARD)
+CDEFS += -DARCH=ARCH_$(ARCH)
+CDEFS += $(LUFA_OPTS)
+
+
+# Place -D or -U options here for ASM sources
+ADEFS = -DF_CPU=$(F_CPU)
+ADEFS += -DF_USB=$(F_USB)UL
+ADEFS += -DBOARD=BOARD_$(BOARD)
+ADEFS += -DARCH=ARCH_$(ARCH)
+ADEFS += $(LUFA_OPTS)
+
+# Place -D or -U options here for C++ sources
+CPPDEFS = -DF_CPU=$(F_CPU)UL
+CPPDEFS += -DF_USB=$(F_USB)UL
+CPPDEFS += -DBOARD=BOARD_$(BOARD)
+CPPDEFS += -DARCH=ARCH_$(ARCH)
+CPPDEFS += $(LUFA_OPTS)
+
+
+# Debugging level.
+DEBUG = 3
+
+
+#---------------- Compiler Options C ----------------
+# -g*: generate debugging information
+# -O*: optimization level
+# -f...: tuning, see GCC manual and avr-libc documentation
+# -Wall...: warning level
+# -Wa,...: tell GCC to pass this to the assembler.
+# -adhlns...: create assembler listing
+CFLAGS = -g$(DEBUG)
+CFLAGS += $(CDEFS)
+CFLAGS += -O$(OPT)
+CFLAGS += -funsigned-char
+CFLAGS += -funsigned-bitfields
+CFLAGS += -ffunction-sections
+CFLAGS += -fno-strict-aliasing
+CFLAGS += -Wall
+CFLAGS += -Wstrict-prototypes
+CFLAGS += -masm-addr-pseudos
+CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
+CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
+CFLAGS += $(CSTANDARD)
+
+
+#---------------- Compiler Options C++ ----------------
+# -g*: generate debugging information
+# -O*: optimization level
+# -f...: tuning, see GCC manual and avr-libc documentation
+# -Wall...: warning level
+# -Wa,...: tell GCC to pass this to the assembler.
+# -adhlns...: create assembler listing
+CPPFLAGS = -g$(DEBUG)
+CPPFLAGS += $(CPPDEFS)
+CPPFLAGS += -O$(OPT)
+CPPFLAGS += -funsigned-char
+CPPFLAGS += -funsigned-bitfields
+CPPFLAGS += -ffunction-sections
+CPPFLAGS += -fno-strict-aliasing
+CPPFLAGS += -fno-exceptions
+CPPFLAGS += -masm-addr-pseudos
+CPPFLAGS += -Wall
+CPPFLAGS += -Wundef
+CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
+CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
+#CPPFLAGS += $(CSTANDARD)
+
+
+#---------------- Assembler Options ----------------
+# -Wa,...: tell GCC to pass this to the assembler.
+# -adhlns: create listing
+# -gstabs: have the assembler create line number information; note that
+# for use in COFF files, additional information about filenames
+# and function names needs to be present in the assembler source
+# files -- see avr-libc docs [FIXME: not yet described there]
+# -listing-cont-lines: Sets the maximum number of continuation lines of hex
+# dump that will be displayed for a given single line of source input.
+ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
+
+
+#---------------- Linker Options ----------------
+# -Wl,...: tell GCC to pass this to linker.
+# -Map: create map file
+# --cref: add cross reference to map file
+LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
+LDFLAGS += -Wl,--gc-sections --rodata-writable
+LDFLAGS += -Wl,--direct-data
+#LDFLAGS += -T linker_script.x
+
+
+#============================================================================
+
+
+# Define programs and commands.
+SHELL = sh
+CC = avr32-gcc
+OBJCOPY = avr32-objcopy
+OBJDUMP = avr32-objdump
+SIZE = avr32-size
+AR = avr32-ar rcs
+NM = avr32-nm
+REMOVE = rm -f
+REMOVEDIR = rm -rf
+COPY = cp
+WINSHELL = cmd
+
+
+# Define Messages
+# English
+MSG_ERRORS_NONE = Errors: none
+MSG_BEGIN = -------- begin --------
+MSG_END = -------- end --------
+MSG_SIZE_BEFORE = Size before:
+MSG_SIZE_AFTER = Size after:
+MSG_COFF = Converting to AVR COFF:
+MSG_FLASH = Creating load file for Flash:
+MSG_EEPROM = Creating load file for EEPROM:
+MSG_EXTENDED_LISTING = Creating Extended Listing:
+MSG_SYMBOL_TABLE = Creating Symbol Table:
+MSG_LINKING = Linking:
+MSG_COMPILING = Compiling C:
+MSG_COMPILING_CPP = Compiling C++:
+MSG_ASSEMBLING = Assembling:
+MSG_CLEANING = Cleaning project:
+MSG_CREATING_LIBRARY = Creating library:
+
+
+
+
+# Define all object files.
+OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
+
+# Define all listing files.
+LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
+
+
+# Compiler flags to generate dependency files.
+GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
+
+
+# Combine all necessary flags and optional flags.
+# Add target processor to flags.
+ALL_CFLAGS = -mpart=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
+ALL_CPPFLAGS = -mpart=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
+ALL_ASFLAGS = -mpart=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
+
+
+
+
+
+# Default target.
+all: begin gccversion sizebefore build sizeafter end
+
+# Change the build target to build a HEX file or a library.
+build: elf hex lss sym
+#build: lib
+
+
+elf: $(TARGET).elf
+hex: $(TARGET).hex
+lss: $(TARGET).lss
+sym: $(TARGET).sym
+LIBNAME=lib$(TARGET).a
+lib: $(LIBNAME)
+
+
+
+# Eye candy.
+# AVR Studio 3.x does not check make's exit code but relies on
+# the following magic strings to be generated by the compile job.
+begin:
+ @echo
+ @echo $(MSG_BEGIN)
+
+end:
+ @echo $(MSG_END)
+ @echo
+
+
+# Display size of file.
+HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
+ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
+MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
+FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
+
+
+sizebefore:
+ @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
+ 2>/dev/null; echo; fi
+
+sizeafter:
+ @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
+ 2>/dev/null; echo; fi
+
+
+
+# Display compiler version information.
+gccversion :
+ @$(CC) --version
+
+
+# Program the device.
+flip: $(TARGET).hex
+ batchisp -hardware usb -device $(MCU) -operation erase f
+ batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
+ batchisp -hardware usb -device $(MCU) -operation start reset 0
+
+dfu: $(TARGET).hex
+ dfu-programmer $(MCU) erase
+ dfu-programmer $(MCU) flash $(TARGET).hex
+ dfu-programmer $(MCU) reset
+
+
+# Create final output files (.hex, .eep) from ELF output file.
+%.hex: %.elf
+ @echo
+ @echo $(MSG_FLASH) $@
+ $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature $< $@
+
+# Create extended listing file from ELF output file.
+%.lss: %.elf
+ @echo
+ @echo $(MSG_EXTENDED_LISTING) $@
+ $(OBJDUMP) -h -S -z $< > $@
+
+# Create a symbol table from ELF output file.
+%.sym: %.elf
+ @echo
+ @echo $(MSG_SYMBOL_TABLE) $@
+ $(NM) -n $< > $@
+
+
+
+# Create library from object files.
+.SECONDARY : $(TARGET).a
+.PRECIOUS : $(OBJ)
+%.a: $(OBJ)
+ @echo
+ @echo $(MSG_CREATING_LIBRARY) $@
+ $(AR) $@ $(OBJ)
+
+
+# Link: create ELF output file from object files.
+.SECONDARY : $(TARGET).elf
+.PRECIOUS : $(OBJ)
+%.elf: $(OBJ)
+ @echo
+ @echo $(MSG_LINKING) $@
+ $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
+
+
+# Compile: create object files from C source files.
+$(OBJDIR)/%.o : %.c
+ @echo
+ @echo $(MSG_COMPILING) $<
+ $(CC) -c $(ALL_CFLAGS) $< -o $@
+
+
+# Compile: create object files from C++ source files.
+$(OBJDIR)/%.o : %.cpp
+ @echo
+ @echo $(MSG_COMPILING_CPP) $<
+ $(CC) -c $(ALL_CPPFLAGS) $< -o $@
+
+
+# Compile: create assembler files from C source files.
+%.s : %.c
+ $(CC) -S $(ALL_CFLAGS) $< -o $@
+
+
+# Compile: create assembler files from C++ source files.
+%.s : %.cpp
+ $(CC) -S $(ALL_CPPFLAGS) $< -o $@
+
+
+# Assemble: create object files from assembler source files.
+$(OBJDIR)/%.o : %.S
+ @echo
+ @echo $(MSG_ASSEMBLING) $<
+ $(CC) -c $(ALL_ASFLAGS) $< -o $@
+
+
+# Create preprocessed source for use in sending a bug report.
+%.i : %.c
+ $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
+
+
+# Target: clean project.
+clean: begin clean_list end
+
+clean_list :
+ @echo
+ @echo $(MSG_CLEANING)
+ $(REMOVE) $(TARGET).hex
+ $(REMOVE) $(TARGET).cof
+ $(REMOVE) $(TARGET).elf
+ $(REMOVE) $(TARGET).map
+ $(REMOVE) $(TARGET).sym
+ $(REMOVE) $(TARGET).lss
+ $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
+ $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
+ $(REMOVE) $(SRC:.c=.s)
+ $(REMOVE) $(SRC:.c=.d)
+ $(REMOVE) $(SRC:.c=.i)
+ $(REMOVEDIR) .dep
+
+doxygen:
+ @echo Generating Project Documentation...
+ @doxygen Doxygen.conf
+ @echo Documentation Generation Complete.
+
+clean_doxygen:
+ rm -rf Documentation
+
+checksource:
+ @for f in $(SRC) $(CPPSRC) $(ASRC); do \
+ if [ -f $$f ]; then \
+ echo "Found Source File: $$f" ; \
+ else \
+ echo "Source File Not Found: $$f" ; \
+ fi; done
+
+
+# Create object files directory
+$(shell mkdir $(OBJDIR) 2>/dev/null)
+
+
+# Include the dependency files.
+-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
+
+
+# Listing of phony targets.
+.PHONY : all begin finish end sizebefore sizeafter gccversion \
+build elf hex lss sym doxygen clean clean_list clean_doxygen \
+dfu flip checksource
+
diff --git a/LUFA/CodeTemplates/makefile_template.xmega b/LUFA/CodeTemplates/makefile_template.xmega
index 719a107fd..77c99d380 100644
--- a/LUFA/CodeTemplates/makefile_template.xmega
+++ b/LUFA/CodeTemplates/makefile_template.xmega
@@ -1,705 +1,705 @@
-# Hey Emacs, this is a -*- makefile -*-
-#----------------------------------------------------------------------------
-# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
-# >> Modified for use with the LUFA project. <<
-#
-# Released to the Public Domain
-#
-# Additional material for this makefile was written by:
-# Peter Fleury
-# Tim Henigan
-# Colin O'Flynn
-# Reiner Patommel
-# Markus Pfaff
-# Sander Pool
-# Frederik Rouleau
-# Carlos Lamas
-# Dean Camera
-# Opendous Inc.
-# Denver Gingerich
-#
-#----------------------------------------------------------------------------
-# On command line:
-#
-# make all = Make software.
-#
-# make clean = Clean out built project files.
-#
-# make coff = Convert ELF to AVR COFF.
-#
-# make extcoff = Convert ELF to AVR Extended COFF.
-#
-# make program = Download the hex file to the device, using avrdude.
-# Please customize the avrdude settings below first!
-#
-# make dfu = Download the hex file to the device, using dfu-programmer (must
-# have dfu-programmer installed).
-#
-# make flip = Download the hex file to the device, using Atmel FLIP (must
-# have Atmel FLIP installed).
-#
-# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
-# (must have dfu-programmer installed).
-#
-# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
-# (must have Atmel FLIP installed).
-#
-# make doxygen = Generate DoxyGen documentation for the project (must have
-# DoxyGen installed)
-#
-# make debug = Start either simulavr or avarice as specified for debugging,
-# with avr-gdb or avr-insight as the front end for debugging.
-#
-# make filename.s = Just compile filename.c into the assembler code only.
-#
-# make filename.i = Create a preprocessed source file for use in submitting
-# bug reports to the GCC project.
-#
-# To rebuild project do "make clean" then "make all".
-#----------------------------------------------------------------------------
-
-
-# MCU name
-MCU = ### INSERT NAME OF MICROCONTROLLER MODEL HERE ###
-
-
-# Targeted chip architecture (see library "Architectures" documentation)
-ARCH = XMEGA
-
-
-# Target board (see library "Board Types" documentation, NONE for projects not requiring
-# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
-# "Board" inside the application directory.
-BOARD = ### INSERT NAME OF BOARD HERE, OR NONE IF NO BOARD DRIVERS USED ###
-
-
-# Processor frequency.
-# This will define a symbol, F_CPU, in all source code files equal to the
-# processor frequency in Hz. You can then use this symbol in your source code to
-# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
-# automatically to create a 32-bit value in your source code.
-#
-# This should be the frequency the system core runs at, after the system clock
-# has been set up correctly and started.
-F_CPU = ### INSERT PRESCALED SYSTEM CLOCK SPEED HERE, IN HZ ###
-
-
-# USB controller master clock frequency.
-# This will define a symbol, F_USB, in all source code files equal to the
-# input clock frequency of the USB controller's clock generator in Hz.
-#
-# For the XMEGA chips, this should be equal to a multiple of 6MHz for Low
-# Speed USB mode, or a multiple of 48MHz for Full Speed USB mode.
-F_USB = ### INSERT CLOCK TO USB MODULE HERE, IN HZ ###
-
-
-# Output format. (can be srec, ihex, binary)
-FORMAT = ihex
-
-
-# Target file name (without extension).
-TARGET = ### INSERT NAME OF MAIN FILENAME HERE, WITHOUT EXTENSION ###
-
-
-# Object files directory
-# To put object files in current directory, use a dot (.), do NOT make
-# this an empty or blank macro!
-OBJDIR = .
-
-
-# Path to the LUFA library
-LUFA_PATH = ### INSERT PATH TO LUFA LIBRARY RELATIVE TO PROJECT DIRECTORY HERE ###
-
-
-# LUFA library compile-time options and predefined tokens (add '-D' before each token)
-LUFA_OPTS = ### INSERT LUFA COMPILE TIME TOKES HERE ###
-
-
-# Create the LUFA source path variables by including the LUFA root makefile
-include $(LUFA_PATH)/LUFA/makefile
-
-
-# List C source files here. (C dependencies are automatically generated.)
-SRC = $(TARGET).c \
- $(LUFA_SRC_USB) \
- $(LUFA_SRC_USBCLASS)
- ### INSERT ADDITIONAL PROJECT SOURCE FILENAMES OR LUFA MODULE NAMES HERE ###
-
-
-# List C++ source files here. (C dependencies are automatically generated.)
-CPPSRC =
-
-
-# List Assembler source files here.
-# Make them always end in a capital .S. Files ending in a lowercase .s
-# will not be considered source files but generated files (assembler
-# output from the compiler), and will be deleted upon "make clean"!
-# Even though the DOS/Win* filesystem matches both .s and .S the same,
-# it will preserve the spelling of the filenames, and gcc itself does
-# care about how the name is spelled on its command-line.
-ASRC =
-
-
-# Optimization level, can be [0, 1, 2, 3, s].
-# 0 = turn off optimization. s = optimize for size.
-# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
-OPT = s
-
-
-# List any extra directories to look for include files here.
-# Each directory must be seperated by a space.
-# Use forward slashes for directory separators.
-# For a directory that has spaces, enclose it in quotes.
-EXTRAINCDIRS = $(LUFA_PATH)/
-
-
-# Compiler flag to set the C Standard level.
-# c89 = "ANSI" C
-# gnu89 = c89 plus GCC extensions
-# c99 = ISO C99 standard (not yet fully implemented)
-# gnu99 = c99 plus GCC extensions
-CSTANDARD = -std=gnu99
-
-
-# Place -D or -U options here for C sources
-CDEFS = -DF_CPU=$(F_CPU)UL
-CDEFS += -DF_USB=$(F_USB)UL
-CDEFS += -DBOARD=BOARD_$(BOARD)
-CDEFS += -DARCH=ARCH_$(ARCH)
-CDEFS += $(LUFA_OPTS)
-
-
-# Place -D or -U options here for ASM sources
-ADEFS = -DF_CPU=$(F_CPU)
-ADEFS += -DF_USB=$(F_USB)UL
-ADEFS += -DBOARD=BOARD_$(BOARD)
-ADEFS += -DARCH=ARCH_$(ARCH)
-ADEFS += $(LUFA_OPTS)
-
-# Place -D or -U options here for C++ sources
-CPPDEFS = -DF_CPU=$(F_CPU)UL
-CPPDEFS += -DF_USB=$(F_USB)UL
-CPPDEFS += -DBOARD=BOARD_$(BOARD)
-CPPDEFS += -DARCH=ARCH_$(ARCH)
-CPPDEFS += $(LUFA_OPTS)
-
-
-# Debugging format.
-# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
-# AVR Studio 4.10 requires dwarf-2.
-# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
-DEBUG = dwarf-2
-
-
-#---------------- Compiler Options C ----------------
-# -g*: generate debugging information
-# -O*: optimization level
-# -f...: tuning, see GCC manual and avr-libc documentation
-# -Wall...: warning level
-# -Wa,...: tell GCC to pass this to the assembler.
-# -adhlns...: create assembler listing
-CFLAGS = -g$(DEBUG)
-CFLAGS += $(CDEFS)
-CFLAGS += -O$(OPT)
-CFLAGS += -funsigned-char
-CFLAGS += -funsigned-bitfields
-CFLAGS += -ffunction-sections
-CFLAGS += -fno-inline-small-functions
-CFLAGS += -fpack-struct
-CFLAGS += -fshort-enums
-CFLAGS += -fno-strict-aliasing
-CFLAGS += -Wall
-CFLAGS += -Wstrict-prototypes
-CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
-CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
-CFLAGS += $(CSTANDARD)
-
-
-#---------------- Compiler Options C++ ----------------
-# -g*: generate debugging information
-# -O*: optimization level
-# -f...: tuning, see GCC manual and avr-libc documentation
-# -Wall...: warning level
-# -Wa,...: tell GCC to pass this to the assembler.
-# -adhlns...: create assembler listing
-CPPFLAGS = -g$(DEBUG)
-CPPFLAGS += $(CPPDEFS)
-CPPFLAGS += -O$(OPT)
-CPPFLAGS += -funsigned-char
-CPPFLAGS += -funsigned-bitfields
-CPPFLAGS += -fpack-struct
-CPPFLAGS += -fshort-enums
-CPPFLAGS += -ffunction-sections
-CPPFLAGS += -fno-strict-aliasing
-CPPFLAGS += -fno-exceptions
-CPPFLAGS += -Wall
-CPPFLAGS += -Wundef
-CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
-CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
-#CPPFLAGS += $(CSTANDARD)
-
-
-#---------------- Assembler Options ----------------
-# -Wa,...: tell GCC to pass this to the assembler.
-# -adhlns: create listing
-# -gstabs: have the assembler create line number information; note that
-# for use in COFF files, additional information about filenames
-# and function names needs to be present in the assembler source
-# files -- see avr-libc docs [FIXME: not yet described there]
-# -listing-cont-lines: Sets the maximum number of continuation lines of hex
-# dump that will be displayed for a given single line of source input.
-ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
-
-
-#---------------- Library Options ----------------
-# Minimalistic printf version
-PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
-
-# Floating point printf version (requires MATH_LIB = -lm below)
-PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
-
-# If this is left blank, then it will use the Standard printf version.
-PRINTF_LIB =
-#PRINTF_LIB = $(PRINTF_LIB_MIN)
-#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
-
-
-# Minimalistic scanf version
-SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
-
-# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
-SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
-
-# If this is left blank, then it will use the Standard scanf version.
-SCANF_LIB =
-#SCANF_LIB = $(SCANF_LIB_MIN)
-#SCANF_LIB = $(SCANF_LIB_FLOAT)
-
-
-MATH_LIB = -lm
-
-
-# List any extra directories to look for libraries here.
-# Each directory must be seperated by a space.
-# Use forward slashes for directory separators.
-# For a directory that has spaces, enclose it in quotes.
-EXTRALIBDIRS =
-
-
-
-#---------------- External Memory Options ----------------
-
-# 64 KB of external RAM, starting after internal RAM (ATmega128!),
-# used for variables (.data/.bss) and heap (malloc()).
-#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
-
-# 64 KB of external RAM, starting after internal RAM (ATmega128!),
-# only used for heap (malloc()).
-#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
-
-EXTMEMOPTS =
-
-
-
-#---------------- Linker Options ----------------
-# -Wl,...: tell GCC to pass this to linker.
-# -Map: create map file
-# --cref: add cross reference to map file
-LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
-LDFLAGS += -Wl,--relax
-LDFLAGS += -Wl,--gc-sections
-LDFLAGS += $(EXTMEMOPTS)
-LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
-LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
-#LDFLAGS += -T linker_script.x
-
-
-
-#---------------- Programming Options (avrdude) ----------------
-
-# Programming hardware
-# Type: avrdude -c ?
-# to get a full listing.
-#
-AVRDUDE_PROGRAMMER = jtagmkII
-
-# com1 = serial port. Use lpt1 to connect to parallel port.
-AVRDUDE_PORT = usb
-
-AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
-#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
-
-
-# Uncomment the following if you want avrdude's erase cycle counter.
-# Note that this counter needs to be initialized first using -Yn,
-# see avrdude manual.
-#AVRDUDE_ERASE_COUNTER = -y
-
-# Uncomment the following if you do /not/ wish a verification to be
-# performed after programming the device.
-#AVRDUDE_NO_VERIFY = -V
-
-# Increase verbosity level. Please use this when submitting bug
-# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
-# to submit bug reports.
-#AVRDUDE_VERBOSE = -v -v
-
-AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
-AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
-AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
-AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
-
-
-
-#---------------- Debugging Options ----------------
-
-# For simulavr only - target MCU frequency.
-DEBUG_MFREQ = $(F_CPU)
-
-# Set the DEBUG_UI to either gdb or insight.
-# DEBUG_UI = gdb
-DEBUG_UI = insight
-
-# Set the debugging back-end to either avarice, simulavr.
-DEBUG_BACKEND = avarice
-#DEBUG_BACKEND = simulavr
-
-# GDB Init Filename.
-GDBINIT_FILE = __avr_gdbinit
-
-# When using avarice settings for the JTAG
-JTAG_DEV = /dev/com1
-
-# Debugging port used to communicate between GDB / avarice / simulavr.
-DEBUG_PORT = 4242
-
-# Debugging host used to communicate between GDB / avarice / simulavr, normally
-# just set to localhost unless doing some sort of crazy debugging when
-# avarice is running on a different computer.
-DEBUG_HOST = localhost
-
-
-
-#============================================================================
-
-
-# Define programs and commands.
-SHELL = sh
-CC = avr-gcc
-OBJCOPY = avr-objcopy
-OBJDUMP = avr-objdump
-SIZE = avr-size
-AR = avr-ar rcs
-NM = avr-nm
-AVRDUDE = avrdude
-REMOVE = rm -f
-REMOVEDIR = rm -rf
-COPY = cp
-WINSHELL = cmd
-
-
-# Define Messages
-# English
-MSG_ERRORS_NONE = Errors: none
-MSG_BEGIN = -------- begin --------
-MSG_END = -------- end --------
-MSG_SIZE_BEFORE = Size before:
-MSG_SIZE_AFTER = Size after:
-MSG_COFF = Converting to AVR COFF:
-MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
-MSG_FLASH = Creating load file for Flash:
-MSG_EEPROM = Creating load file for EEPROM:
-MSG_EXTENDED_LISTING = Creating Extended Listing:
-MSG_SYMBOL_TABLE = Creating Symbol Table:
-MSG_LINKING = Linking:
-MSG_COMPILING = Compiling C:
-MSG_COMPILING_CPP = Compiling C++:
-MSG_ASSEMBLING = Assembling:
-MSG_CLEANING = Cleaning project:
-MSG_CREATING_LIBRARY = Creating library:
-
-
-
-
-# Define all object files.
-OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
-
-# Define all listing files.
-LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
-
-
-# Compiler flags to generate dependency files.
-GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
-
-
-# Combine all necessary flags and optional flags.
-# Add target processor to flags.
-ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
-ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
-ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
-
-
-
-
-
-# Default target.
-all: begin gccversion sizebefore build sizeafter end
-
-# Change the build target to build a HEX file or a library.
-build: elf hex eep lss sym
-#build: lib
-
-
-elf: $(TARGET).elf
-hex: $(TARGET).hex
-eep: $(TARGET).eep
-lss: $(TARGET).lss
-sym: $(TARGET).sym
-LIBNAME=lib$(TARGET).a
-lib: $(LIBNAME)
-
-
-
-# Eye candy.
-# AVR Studio 3.x does not check make's exit code but relies on
-# the following magic strings to be generated by the compile job.
-begin:
- @echo
- @echo $(MSG_BEGIN)
-
-end:
- @echo $(MSG_END)
- @echo
-
-
-# Display size of file.
-HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
-ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
-MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
-FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
-
-
-sizebefore:
- @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
- 2>/dev/null; echo; fi
-
-sizeafter:
- @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
- 2>/dev/null; echo; fi
-
-
-
-# Display compiler version information.
-gccversion :
- @$(CC) --version
-
-
-# Program the device.
-program: $(TARGET).hex $(TARGET).eep
- $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
-
-flip: $(TARGET).hex
- batchisp -hardware usb -device $(MCU) -operation erase f
- batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
- batchisp -hardware usb -device $(MCU) -operation start reset 0
-
-dfu: $(TARGET).hex
- dfu-programmer $(MCU) erase
- dfu-programmer $(MCU) flash $(TARGET).hex
- dfu-programmer $(MCU) reset
-
-flip-ee: $(TARGET).hex $(TARGET).eep
- $(COPY) $(TARGET).eep $(TARGET)eep.hex
- batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase
- batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program
- batchisp -hardware usb -device $(MCU) -operation start reset 0
- $(REMOVE) $(TARGET)eep.hex
-
-dfu-ee: $(TARGET).hex $(TARGET).eep
- dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
- dfu-programmer $(MCU) reset
-
-
-# Generate avr-gdb config/init file which does the following:
-# define the reset signal, load the target file, connect to target, and set
-# a breakpoint at main().
-gdb-config:
- @$(REMOVE) $(GDBINIT_FILE)
- @echo define reset >> $(GDBINIT_FILE)
- @echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
- @echo end >> $(GDBINIT_FILE)
- @echo file $(TARGET).elf >> $(GDBINIT_FILE)
- @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
-ifeq ($(DEBUG_BACKEND),simulavr)
- @echo load >> $(GDBINIT_FILE)
-endif
- @echo break main >> $(GDBINIT_FILE)
-
-debug: gdb-config $(TARGET).elf
-ifeq ($(DEBUG_BACKEND), avarice)
- @echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
- @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
- $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
- @$(WINSHELL) /c pause
-
-else
- @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
- $(DEBUG_MFREQ) --port $(DEBUG_PORT)
-endif
- @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
-
-
-
-
-# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
-COFFCONVERT = $(OBJCOPY) --debugging
-COFFCONVERT += --change-section-address .data-0x800000
-COFFCONVERT += --change-section-address .bss-0x800000
-COFFCONVERT += --change-section-address .noinit-0x800000
-COFFCONVERT += --change-section-address .eeprom-0x810000
-
-
-
-coff: $(TARGET).elf
- @echo
- @echo $(MSG_COFF) $(TARGET).cof
- $(COFFCONVERT) -O coff-avr $< $(TARGET).cof
-
-
-extcoff: $(TARGET).elf
- @echo
- @echo $(MSG_EXTENDED_COFF) $(TARGET).cof
- $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
-
-
-
-# Create final output files (.hex, .eep) from ELF output file.
-%.hex: %.elf
- @echo
- @echo $(MSG_FLASH) $@
- $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature $< $@
-
-%.eep: %.elf
- @echo
- @echo $(MSG_EEPROM) $@
- -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
- --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
-
-# Create extended listing file from ELF output file.
-%.lss: %.elf
- @echo
- @echo $(MSG_EXTENDED_LISTING) $@
- $(OBJDUMP) -h -S -z $< > $@
-
-# Create a symbol table from ELF output file.
-%.sym: %.elf
- @echo
- @echo $(MSG_SYMBOL_TABLE) $@
- $(NM) -n $< > $@
-
-
-
-# Create library from object files.
-.SECONDARY : $(TARGET).a
-.PRECIOUS : $(OBJ)
-%.a: $(OBJ)
- @echo
- @echo $(MSG_CREATING_LIBRARY) $@
- $(AR) $@ $(OBJ)
-
-
-# Link: create ELF output file from object files.
-.SECONDARY : $(TARGET).elf
-.PRECIOUS : $(OBJ)
-%.elf: $(OBJ)
- @echo
- @echo $(MSG_LINKING) $@
- $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
-
-
-# Compile: create object files from C source files.
-$(OBJDIR)/%.o : %.c
- @echo
- @echo $(MSG_COMPILING) $<
- $(CC) -c $(ALL_CFLAGS) $< -o $@
-
-
-# Compile: create object files from C++ source files.
-$(OBJDIR)/%.o : %.cpp
- @echo
- @echo $(MSG_COMPILING_CPP) $<
- $(CC) -c $(ALL_CPPFLAGS) $< -o $@
-
-
-# Compile: create assembler files from C source files.
-%.s : %.c
- $(CC) -S $(ALL_CFLAGS) $< -o $@
-
-
-# Compile: create assembler files from C++ source files.
-%.s : %.cpp
- $(CC) -S $(ALL_CPPFLAGS) $< -o $@
-
-
-# Assemble: create object files from assembler source files.
-$(OBJDIR)/%.o : %.S
- @echo
- @echo $(MSG_ASSEMBLING) $<
- $(CC) -c $(ALL_ASFLAGS) $< -o $@
-
-
-# Create preprocessed source for use in sending a bug report.
-%.i : %.c
- $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
-
-
-# Target: clean project.
-clean: begin clean_list end
-
-clean_list :
- @echo
- @echo $(MSG_CLEANING)
- $(REMOVE) $(TARGET).hex
- $(REMOVE) $(TARGET).eep
- $(REMOVE) $(TARGET).cof
- $(REMOVE) $(TARGET).elf
- $(REMOVE) $(TARGET).map
- $(REMOVE) $(TARGET).sym
- $(REMOVE) $(TARGET).lss
- $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
- $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
- $(REMOVE) $(SRC:.c=.s)
- $(REMOVE) $(SRC:.c=.d)
- $(REMOVE) $(SRC:.c=.i)
- $(REMOVEDIR) .dep
-
-doxygen:
- @echo Generating Project Documentation...
- @doxygen Doxygen.conf
- @echo Documentation Generation Complete.
-
-clean_doxygen:
- rm -rf Documentation
-
-checksource:
- @for f in $(SRC) $(CPPSRC) $(ASRC); do \
- if [ -f $$f ]; then \
- echo "Found Source File: $$f" ; \
- else \
- echo "Source File Not Found: $$f" ; \
- fi; done
-
-
-# Create object files directory
-$(shell mkdir $(OBJDIR) 2>/dev/null)
-
-
-# Include the dependency files.
--include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
-
-
-# Listing of phony targets.
-.PHONY : all begin finish end sizebefore sizeafter gccversion \
-build elf hex eep lss sym coff extcoff doxygen clean \
-clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
-debug gdb-config checksource
+# Hey Emacs, this is a -*- makefile -*-
+#----------------------------------------------------------------------------
+# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
+# >> Modified for use with the LUFA project. <<
+#
+# Released to the Public Domain
+#
+# Additional material for this makefile was written by:
+# Peter Fleury
+# Tim Henigan
+# Colin O'Flynn
+# Reiner Patommel
+# Markus Pfaff
+# Sander Pool
+# Frederik Rouleau
+# Carlos Lamas
+# Dean Camera
+# Opendous Inc.
+# Denver Gingerich
+#
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device, using avrdude.
+# Please customize the avrdude settings below first!
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+# have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+# have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+# (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+# (must have Atmel FLIP installed).
+#
+# make doxygen = Generate DoxyGen documentation for the project (must have
+# DoxyGen installed)
+#
+# make debug = Start either simulavr or avarice as specified for debugging,
+# with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+# bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+
+# MCU name
+MCU = ### INSERT NAME OF MICROCONTROLLER MODEL HERE ###
+
+
+# Targeted chip architecture (see library "Architectures" documentation)
+ARCH = XMEGA
+
+
+# Target board (see library "Board Types" documentation, NONE for projects not requiring
+# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
+# "Board" inside the application directory.
+BOARD = ### INSERT NAME OF BOARD HERE, OR NONE IF NO BOARD DRIVERS USED ###
+
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This should be the frequency the system core runs at, after the system clock
+# has been set up correctly and started.
+F_CPU = ### INSERT PRESCALED SYSTEM CLOCK SPEED HERE, IN HZ ###
+
+
+# USB controller master clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency of the USB controller's clock generator in Hz.
+#
+# For the XMEGA chips, this should be equal to a multiple of 6MHz for Low
+# Speed USB mode, or a multiple of 48MHz for Full Speed USB mode.
+F_USB = ### INSERT CLOCK TO USB MODULE HERE, IN HZ ###
+
+
+# Output format. (can be srec, ihex, binary)
+FORMAT = ihex
+
+
+# Target file name (without extension).
+TARGET = ### INSERT NAME OF MAIN FILENAME HERE, WITHOUT EXTENSION ###
+
+
+# Object files directory
+# To put object files in current directory, use a dot (.), do NOT make
+# this an empty or blank macro!
+OBJDIR = .
+
+
+# Path to the LUFA library
+LUFA_PATH = ### INSERT PATH TO LUFA LIBRARY RELATIVE TO PROJECT DIRECTORY HERE ###
+
+
+# LUFA library compile-time options and predefined tokens (add '-D' before each token)
+LUFA_OPTS = ### INSERT LUFA COMPILE TIME TOKES HERE ###
+
+
+# Create the LUFA source path variables by including the LUFA root makefile
+include $(LUFA_PATH)/LUFA/makefile
+
+
+# List C source files here. (C dependencies are automatically generated.)
+SRC = $(TARGET).c \
+ $(LUFA_SRC_USB) \
+ $(LUFA_SRC_USBCLASS)
+ ### INSERT ADDITIONAL PROJECT SOURCE FILENAMES OR LUFA MODULE NAMES HERE ###
+
+
+# List C++ source files here. (C dependencies are automatically generated.)
+CPPSRC =
+
+
+# List Assembler source files here.
+# Make them always end in a capital .S. Files ending in a lowercase .s
+# will not be considered source files but generated files (assembler
+# output from the compiler), and will be deleted upon "make clean"!
+# Even though the DOS/Win* filesystem matches both .s and .S the same,
+# it will preserve the spelling of the filenames, and gcc itself does
+# care about how the name is spelled on its command-line.
+ASRC =
+
+
+# Optimization level, can be [0, 1, 2, 3, s].
+# 0 = turn off optimization. s = optimize for size.
+# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
+OPT = s
+
+
+# List any extra directories to look for include files here.
+# Each directory must be seperated by a space.
+# Use forward slashes for directory separators.
+# For a directory that has spaces, enclose it in quotes.
+EXTRAINCDIRS = $(LUFA_PATH)/
+
+
+# Compiler flag to set the C Standard level.
+# c89 = "ANSI" C
+# gnu89 = c89 plus GCC extensions
+# c99 = ISO C99 standard (not yet fully implemented)
+# gnu99 = c99 plus GCC extensions
+CSTANDARD = -std=gnu99
+
+
+# Place -D or -U options here for C sources
+CDEFS = -DF_CPU=$(F_CPU)UL
+CDEFS += -DF_USB=$(F_USB)UL
+CDEFS += -DBOARD=BOARD_$(BOARD)
+CDEFS += -DARCH=ARCH_$(ARCH)
+CDEFS += $(LUFA_OPTS)
+
+
+# Place -D or -U options here for ASM sources
+ADEFS = -DF_CPU=$(F_CPU)
+ADEFS += -DF_USB=$(F_USB)UL
+ADEFS += -DBOARD=BOARD_$(BOARD)
+ADEFS += -DARCH=ARCH_$(ARCH)
+ADEFS += $(LUFA_OPTS)
+
+# Place -D or -U options here for C++ sources
+CPPDEFS = -DF_CPU=$(F_CPU)UL
+CPPDEFS += -DF_USB=$(F_USB)UL
+CPPDEFS += -DBOARD=BOARD_$(BOARD)
+CPPDEFS += -DARCH=ARCH_$(ARCH)
+CPPDEFS += $(LUFA_OPTS)
+
+
+# Debugging format.
+# Native formats for AVR-GCC's -g are dwarf-2 [default] or stabs.
+# AVR Studio 4.10 requires dwarf-2.
+# AVR [Extended] COFF format requires stabs, plus an avr-objcopy run.
+DEBUG = dwarf-2
+
+
+#---------------- Compiler Options C ----------------
+# -g*: generate debugging information
+# -O*: optimization level
+# -f...: tuning, see GCC manual and avr-libc documentation
+# -Wall...: warning level
+# -Wa,...: tell GCC to pass this to the assembler.
+# -adhlns...: create assembler listing
+CFLAGS = -g$(DEBUG)
+CFLAGS += $(CDEFS)
+CFLAGS += -O$(OPT)
+CFLAGS += -funsigned-char
+CFLAGS += -funsigned-bitfields
+CFLAGS += -ffunction-sections
+CFLAGS += -fno-inline-small-functions
+CFLAGS += -fpack-struct
+CFLAGS += -fshort-enums
+CFLAGS += -fno-strict-aliasing
+CFLAGS += -Wall
+CFLAGS += -Wstrict-prototypes
+CFLAGS += -Wa,-adhlns=$(<:%.c=$(OBJDIR)/%.lst)
+CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
+CFLAGS += $(CSTANDARD)
+
+
+#---------------- Compiler Options C++ ----------------
+# -g*: generate debugging information
+# -O*: optimization level
+# -f...: tuning, see GCC manual and avr-libc documentation
+# -Wall...: warning level
+# -Wa,...: tell GCC to pass this to the assembler.
+# -adhlns...: create assembler listing
+CPPFLAGS = -g$(DEBUG)
+CPPFLAGS += $(CPPDEFS)
+CPPFLAGS += -O$(OPT)
+CPPFLAGS += -funsigned-char
+CPPFLAGS += -funsigned-bitfields
+CPPFLAGS += -fpack-struct
+CPPFLAGS += -fshort-enums
+CPPFLAGS += -ffunction-sections
+CPPFLAGS += -fno-strict-aliasing
+CPPFLAGS += -fno-exceptions
+CPPFLAGS += -Wall
+CPPFLAGS += -Wundef
+CPPFLAGS += -Wa,-adhlns=$(<:%.cpp=$(OBJDIR)/%.lst)
+CPPFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS))
+#CPPFLAGS += $(CSTANDARD)
+
+
+#---------------- Assembler Options ----------------
+# -Wa,...: tell GCC to pass this to the assembler.
+# -adhlns: create listing
+# -gstabs: have the assembler create line number information; note that
+# for use in COFF files, additional information about filenames
+# and function names needs to be present in the assembler source
+# files -- see avr-libc docs [FIXME: not yet described there]
+# -listing-cont-lines: Sets the maximum number of continuation lines of hex
+# dump that will be displayed for a given single line of source input.
+ASFLAGS = $(ADEFS) -Wa,-adhlns=$(<:%.S=$(OBJDIR)/%.lst),-gstabs,--listing-cont-lines=100
+
+
+#---------------- Library Options ----------------
+# Minimalistic printf version
+PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
+
+# Floating point printf version (requires MATH_LIB = -lm below)
+PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
+
+# If this is left blank, then it will use the Standard printf version.
+PRINTF_LIB =
+#PRINTF_LIB = $(PRINTF_LIB_MIN)
+#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
+
+
+# Minimalistic scanf version
+SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
+
+# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
+SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
+
+# If this is left blank, then it will use the Standard scanf version.
+SCANF_LIB =
+#SCANF_LIB = $(SCANF_LIB_MIN)
+#SCANF_LIB = $(SCANF_LIB_FLOAT)
+
+
+MATH_LIB = -lm
+
+
+# List any extra directories to look for libraries here.
+# Each directory must be seperated by a space.
+# Use forward slashes for directory separators.
+# For a directory that has spaces, enclose it in quotes.
+EXTRALIBDIRS =
+
+
+
+#---------------- External Memory Options ----------------
+
+# 64 KB of external RAM, starting after internal RAM (ATmega128!),
+# used for variables (.data/.bss) and heap (malloc()).
+#EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff
+
+# 64 KB of external RAM, starting after internal RAM (ATmega128!),
+# only used for heap (malloc()).
+#EXTMEMOPTS = -Wl,--section-start,.data=0x801100,--defsym=__heap_end=0x80ffff
+
+EXTMEMOPTS =
+
+
+
+#---------------- Linker Options ----------------
+# -Wl,...: tell GCC to pass this to linker.
+# -Map: create map file
+# --cref: add cross reference to map file
+LDFLAGS = -Wl,-Map=$(TARGET).map,--cref
+LDFLAGS += -Wl,--relax
+LDFLAGS += -Wl,--gc-sections
+LDFLAGS += $(EXTMEMOPTS)
+LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
+LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
+#LDFLAGS += -T linker_script.x
+
+
+
+#---------------- Programming Options (avrdude) ----------------
+
+# Programming hardware
+# Type: avrdude -c ?
+# to get a full listing.
+#
+AVRDUDE_PROGRAMMER = jtagmkII
+
+# com1 = serial port. Use lpt1 to connect to parallel port.
+AVRDUDE_PORT = usb
+
+AVRDUDE_WRITE_FLASH = -U flash:w:$(TARGET).hex
+#AVRDUDE_WRITE_EEPROM = -U eeprom:w:$(TARGET).eep
+
+
+# Uncomment the following if you want avrdude's erase cycle counter.
+# Note that this counter needs to be initialized first using -Yn,
+# see avrdude manual.
+#AVRDUDE_ERASE_COUNTER = -y
+
+# Uncomment the following if you do /not/ wish a verification to be
+# performed after programming the device.
+#AVRDUDE_NO_VERIFY = -V
+
+# Increase verbosity level. Please use this when submitting bug
+# reports about avrdude. See <http://savannah.nongnu.org/projects/avrdude>
+# to submit bug reports.
+#AVRDUDE_VERBOSE = -v -v
+
+AVRDUDE_FLAGS = -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER)
+AVRDUDE_FLAGS += $(AVRDUDE_NO_VERIFY)
+AVRDUDE_FLAGS += $(AVRDUDE_VERBOSE)
+AVRDUDE_FLAGS += $(AVRDUDE_ERASE_COUNTER)
+
+
+
+#---------------- Debugging Options ----------------
+
+# For simulavr only - target MCU frequency.
+DEBUG_MFREQ = $(F_CPU)
+
+# Set the DEBUG_UI to either gdb or insight.
+# DEBUG_UI = gdb
+DEBUG_UI = insight
+
+# Set the debugging back-end to either avarice, simulavr.
+DEBUG_BACKEND = avarice
+#DEBUG_BACKEND = simulavr
+
+# GDB Init Filename.
+GDBINIT_FILE = __avr_gdbinit
+
+# When using avarice settings for the JTAG
+JTAG_DEV = /dev/com1
+
+# Debugging port used to communicate between GDB / avarice / simulavr.
+DEBUG_PORT = 4242
+
+# Debugging host used to communicate between GDB / avarice / simulavr, normally
+# just set to localhost unless doing some sort of crazy debugging when
+# avarice is running on a different computer.
+DEBUG_HOST = localhost
+
+
+
+#============================================================================
+
+
+# Define programs and commands.
+SHELL = sh
+CC = avr-gcc
+OBJCOPY = avr-objcopy
+OBJDUMP = avr-objdump
+SIZE = avr-size
+AR = avr-ar rcs
+NM = avr-nm
+AVRDUDE = avrdude
+REMOVE = rm -f
+REMOVEDIR = rm -rf
+COPY = cp
+WINSHELL = cmd
+
+
+# Define Messages
+# English
+MSG_ERRORS_NONE = Errors: none
+MSG_BEGIN = -------- begin --------
+MSG_END = -------- end --------
+MSG_SIZE_BEFORE = Size before:
+MSG_SIZE_AFTER = Size after:
+MSG_COFF = Converting to AVR COFF:
+MSG_EXTENDED_COFF = Converting to AVR Extended COFF:
+MSG_FLASH = Creating load file for Flash:
+MSG_EEPROM = Creating load file for EEPROM:
+MSG_EXTENDED_LISTING = Creating Extended Listing:
+MSG_SYMBOL_TABLE = Creating Symbol Table:
+MSG_LINKING = Linking:
+MSG_COMPILING = Compiling C:
+MSG_COMPILING_CPP = Compiling C++:
+MSG_ASSEMBLING = Assembling:
+MSG_CLEANING = Cleaning project:
+MSG_CREATING_LIBRARY = Creating library:
+
+
+
+
+# Define all object files.
+OBJ = $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
+
+# Define all listing files.
+LST = $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
+
+
+# Compiler flags to generate dependency files.
+GENDEPFLAGS = -MMD -MP -MF .dep/$(@F).d
+
+
+# Combine all necessary flags and optional flags.
+# Add target processor to flags.
+ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS) $(GENDEPFLAGS)
+ALL_CPPFLAGS = -mmcu=$(MCU) -I. -x c++ $(CPPFLAGS) $(GENDEPFLAGS)
+ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)
+
+
+
+
+
+# Default target.
+all: begin gccversion sizebefore build sizeafter end
+
+# Change the build target to build a HEX file or a library.
+build: elf hex eep lss sym
+#build: lib
+
+
+elf: $(TARGET).elf
+hex: $(TARGET).hex
+eep: $(TARGET).eep
+lss: $(TARGET).lss
+sym: $(TARGET).sym
+LIBNAME=lib$(TARGET).a
+lib: $(LIBNAME)
+
+
+
+# Eye candy.
+# AVR Studio 3.x does not check make's exit code but relies on
+# the following magic strings to be generated by the compile job.
+begin:
+ @echo
+ @echo $(MSG_BEGIN)
+
+end:
+ @echo $(MSG_END)
+ @echo
+
+
+# Display size of file.
+HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
+ELFSIZE = $(SIZE) $(MCU_FLAG) $(FORMAT_FLAG) $(TARGET).elf
+MCU_FLAG = $(shell $(SIZE) --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) )
+FORMAT_FLAG = $(shell $(SIZE) --help | grep -- --format=.*avr > /dev/null && echo --format=avr )
+
+
+sizebefore:
+ @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_BEFORE); $(ELFSIZE); \
+ 2>/dev/null; echo; fi
+
+sizeafter:
+ @if test -f $(TARGET).elf; then echo; echo $(MSG_SIZE_AFTER); $(ELFSIZE); \
+ 2>/dev/null; echo; fi
+
+
+
+# Display compiler version information.
+gccversion :
+ @$(CC) --version
+
+
+# Program the device.
+program: $(TARGET).hex $(TARGET).eep
+ $(AVRDUDE) $(AVRDUDE_FLAGS) $(AVRDUDE_WRITE_FLASH) $(AVRDUDE_WRITE_EEPROM)
+
+flip: $(TARGET).hex
+ batchisp -hardware usb -device $(MCU) -operation erase f
+ batchisp -hardware usb -device $(MCU) -operation loadbuffer $(TARGET).hex program
+ batchisp -hardware usb -device $(MCU) -operation start reset 0
+
+dfu: $(TARGET).hex
+ dfu-programmer $(MCU) erase
+ dfu-programmer $(MCU) flash $(TARGET).hex
+ dfu-programmer $(MCU) reset
+
+flip-ee: $(TARGET).hex $(TARGET).eep
+ $(COPY) $(TARGET).eep $(TARGET)eep.hex
+ batchisp -hardware usb -device $(MCU) -operation memory EEPROM erase
+ batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $(TARGET)eep.hex program
+ batchisp -hardware usb -device $(MCU) -operation start reset 0
+ $(REMOVE) $(TARGET)eep.hex
+
+dfu-ee: $(TARGET).hex $(TARGET).eep
+ dfu-programmer $(MCU) eeprom-flash $(TARGET).eep
+ dfu-programmer $(MCU) reset
+
+
+# Generate avr-gdb config/init file which does the following:
+# define the reset signal, load the target file, connect to target, and set
+# a breakpoint at main().
+gdb-config:
+ @$(REMOVE) $(GDBINIT_FILE)
+ @echo define reset >> $(GDBINIT_FILE)
+ @echo SIGNAL SIGHUP >> $(GDBINIT_FILE)
+ @echo end >> $(GDBINIT_FILE)
+ @echo file $(TARGET).elf >> $(GDBINIT_FILE)
+ @echo target remote $(DEBUG_HOST):$(DEBUG_PORT) >> $(GDBINIT_FILE)
+ifeq ($(DEBUG_BACKEND),simulavr)
+ @echo load >> $(GDBINIT_FILE)
+endif
+ @echo break main >> $(GDBINIT_FILE)
+
+debug: gdb-config $(TARGET).elf
+ifeq ($(DEBUG_BACKEND), avarice)
+ @echo Starting AVaRICE - Press enter when "waiting to connect" message displays.
+ @$(WINSHELL) /c start avarice --jtag $(JTAG_DEV) --erase --program --file \
+ $(TARGET).elf $(DEBUG_HOST):$(DEBUG_PORT)
+ @$(WINSHELL) /c pause
+
+else
+ @$(WINSHELL) /c start simulavr --gdbserver --device $(MCU) --clock-freq \
+ $(DEBUG_MFREQ) --port $(DEBUG_PORT)
+endif
+ @$(WINSHELL) /c start avr-$(DEBUG_UI) --command=$(GDBINIT_FILE)
+
+
+
+
+# Convert ELF to COFF for use in debugging / simulating in AVR Studio or VMLAB.
+COFFCONVERT = $(OBJCOPY) --debugging
+COFFCONVERT += --change-section-address .data-0x800000
+COFFCONVERT += --change-section-address .bss-0x800000
+COFFCONVERT += --change-section-address .noinit-0x800000
+COFFCONVERT += --change-section-address .eeprom-0x810000
+
+
+
+coff: $(TARGET).elf
+ @echo
+ @echo $(MSG_COFF) $(TARGET).cof
+ $(COFFCONVERT) -O coff-avr $< $(TARGET).cof
+
+
+extcoff: $(TARGET).elf
+ @echo
+ @echo $(MSG_EXTENDED_COFF) $(TARGET).cof
+ $(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof
+
+
+
+# Create final output files (.hex, .eep) from ELF output file.
+%.hex: %.elf
+ @echo
+ @echo $(MSG_FLASH) $@
+ $(OBJCOPY) -O $(FORMAT) -R .eeprom -R .fuse -R .lock -R .signature $< $@
+
+%.eep: %.elf
+ @echo
+ @echo $(MSG_EEPROM) $@
+ -$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
+ --change-section-lma .eeprom=0 --no-change-warnings -O $(FORMAT) $< $@ || exit 0
+
+# Create extended listing file from ELF output file.
+%.lss: %.elf
+ @echo
+ @echo $(MSG_EXTENDED_LISTING) $@
+ $(OBJDUMP) -h -S -z $< > $@
+
+# Create a symbol table from ELF output file.
+%.sym: %.elf
+ @echo
+ @echo $(MSG_SYMBOL_TABLE) $@
+ $(NM) -n $< > $@
+
+
+
+# Create library from object files.
+.SECONDARY : $(TARGET).a
+.PRECIOUS : $(OBJ)
+%.a: $(OBJ)
+ @echo
+ @echo $(MSG_CREATING_LIBRARY) $@
+ $(AR) $@ $(OBJ)
+
+
+# Link: create ELF output file from object files.
+.SECONDARY : $(TARGET).elf
+.PRECIOUS : $(OBJ)
+%.elf: $(OBJ)
+ @echo
+ @echo $(MSG_LINKING) $@
+ $(CC) $(ALL_CFLAGS) $^ --output $@ $(LDFLAGS)
+
+
+# Compile: create object files from C source files.
+$(OBJDIR)/%.o : %.c
+ @echo
+ @echo $(MSG_COMPILING) $<
+ $(CC) -c $(ALL_CFLAGS) $< -o $@
+
+
+# Compile: create object files from C++ source files.
+$(OBJDIR)/%.o : %.cpp
+ @echo
+ @echo $(MSG_COMPILING_CPP) $<
+ $(CC) -c $(ALL_CPPFLAGS) $< -o $@
+
+
+# Compile: create assembler files from C source files.
+%.s : %.c
+ $(CC) -S $(ALL_CFLAGS) $< -o $@
+
+
+# Compile: create assembler files from C++ source files.
+%.s : %.cpp
+ $(CC) -S $(ALL_CPPFLAGS) $< -o $@
+
+
+# Assemble: create object files from assembler source files.
+$(OBJDIR)/%.o : %.S
+ @echo
+ @echo $(MSG_ASSEMBLING) $<
+ $(CC) -c $(ALL_ASFLAGS) $< -o $@
+
+
+# Create preprocessed source for use in sending a bug report.
+%.i : %.c
+ $(CC) -E -mmcu=$(MCU) -I. $(CFLAGS) $< -o $@
+
+
+# Target: clean project.
+clean: begin clean_list end
+
+clean_list :
+ @echo
+ @echo $(MSG_CLEANING)
+ $(REMOVE) $(TARGET).hex
+ $(REMOVE) $(TARGET).eep
+ $(REMOVE) $(TARGET).cof
+ $(REMOVE) $(TARGET).elf
+ $(REMOVE) $(TARGET).map
+ $(REMOVE) $(TARGET).sym
+ $(REMOVE) $(TARGET).lss
+ $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.o) $(CPPSRC:%.cpp=$(OBJDIR)/%.o) $(ASRC:%.S=$(OBJDIR)/%.o)
+ $(REMOVE) $(SRC:%.c=$(OBJDIR)/%.lst) $(CPPSRC:%.cpp=$(OBJDIR)/%.lst) $(ASRC:%.S=$(OBJDIR)/%.lst)
+ $(REMOVE) $(SRC:.c=.s)
+ $(REMOVE) $(SRC:.c=.d)
+ $(REMOVE) $(SRC:.c=.i)
+ $(REMOVEDIR) .dep
+
+doxygen:
+ @echo Generating Project Documentation...
+ @doxygen Doxygen.conf
+ @echo Documentation Generation Complete.
+
+clean_doxygen:
+ rm -rf Documentation
+
+checksource:
+ @for f in $(SRC) $(CPPSRC) $(ASRC); do \
+ if [ -f $$f ]; then \
+ echo "Found Source File: $$f" ; \
+ else \
+ echo "Source File Not Found: $$f" ; \
+ fi; done
+
+
+# Create object files directory
+$(shell mkdir $(OBJDIR) 2>/dev/null)
+
+
+# Include the dependency files.
+-include $(shell mkdir .dep 2>/dev/null) $(wildcard .dep/*)
+
+
+# Listing of phony targets.
+.PHONY : all begin finish end sizebefore sizeafter gccversion \
+build elf hex eep lss sym coff extcoff doxygen clean \
+clean_list clean_doxygen program dfu flip flip-ee dfu-ee \
+debug gdb-config checksource
diff --git a/LUFA/Common/Architectures.h b/LUFA/Common/Architectures.h
index 8dab72ae0..dad3ba7d7 100644
--- a/LUFA/Common/Architectures.h
+++ b/LUFA/Common/Architectures.h
@@ -1,84 +1,84 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Supported library architecture defines.
- *
- * \copydetails Group_Architectures
- *
- * \note Do not include this file directly, rather include the Common.h header file instead to gain this file's
- * functionality.
- */
-
-/** \ingroup Group_Common
- * \defgroup Group_Architectures Hardware Architectures
- * \brief Supported library architecture defines.
- *
- * Architecture macros for selecting the desired target microcontroller architecture. One of these values should be
- * defined as the value of \c ARCH in the user project makefile via the \c -D compiler switch to GCC, to select the
- * target architecture.
- *
- * The selected architecture should remain consistent with the makefile \c ARCH value, which is used to select the
- * underlying driver source files for each architecture.
- *
- * @{
- */
-
-#ifndef __LUFA_ARCHITECTURES_H__
-#define __LUFA_ARCHITECTURES_H__
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_COMMON_H)
- #error Do not include this file directly. Include LUFA/Common/Common.h instead to gain this functionality.
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** Selects the Atmel 8-bit AVR (AT90USB* and ATMEGA*U* chips) architecture. */
- #define ARCH_AVR8 0
-
- /** Selects the Atmel 32-bit UC3 AVR (AT32UC3* chips) architecture. */
- #define ARCH_UC3 1
-
- /** Selects the Atmel XMEGA AVR (ATXMEGA*U chips) architecture. */
- #define ARCH_XMEGA 2
-
- #if !defined(__DOXYGEN__)
- #define ARCH_ ARCH_AVR8
-
- #if !defined(ARCH)
- #define ARCH ARCH_AVR8
- #endif
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Supported library architecture defines.
+ *
+ * \copydetails Group_Architectures
+ *
+ * \note Do not include this file directly, rather include the Common.h header file instead to gain this file's
+ * functionality.
+ */
+
+/** \ingroup Group_Common
+ * \defgroup Group_Architectures Hardware Architectures
+ * \brief Supported library architecture defines.
+ *
+ * Architecture macros for selecting the desired target microcontroller architecture. One of these values should be
+ * defined as the value of \c ARCH in the user project makefile via the \c -D compiler switch to GCC, to select the
+ * target architecture.
+ *
+ * The selected architecture should remain consistent with the makefile \c ARCH value, which is used to select the
+ * underlying driver source files for each architecture.
+ *
+ * @{
+ */
+
+#ifndef __LUFA_ARCHITECTURES_H__
+#define __LUFA_ARCHITECTURES_H__
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_COMMON_H)
+ #error Do not include this file directly. Include LUFA/Common/Common.h instead to gain this functionality.
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** Selects the Atmel 8-bit AVR (AT90USB* and ATMEGA*U* chips) architecture. */
+ #define ARCH_AVR8 0
+
+ /** Selects the Atmel 32-bit UC3 AVR (AT32UC3* chips) architecture. */
+ #define ARCH_UC3 1
+
+ /** Selects the Atmel XMEGA AVR (ATXMEGA*U chips) architecture. */
+ #define ARCH_XMEGA 2
+
+ #if !defined(__DOXYGEN__)
+ #define ARCH_ ARCH_AVR8
+
+ #if !defined(ARCH)
+ #define ARCH ARCH_AVR8
+ #endif
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Common/CompilerSpecific.h b/LUFA/Common/CompilerSpecific.h
index 9dcd7637c..6b4826aa5 100644
--- a/LUFA/Common/CompilerSpecific.h
+++ b/LUFA/Common/CompilerSpecific.h
@@ -1,98 +1,98 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Compiler specific macros for code optimization and correctness.
- *
- * \copydetails Group_CompilerSpecific
- *
- * \note Do not include this file directly, rather include the Common.h header file instead to gain this file's
- * functionality.
- */
-
-/** \ingroup Group_Common
- * \defgroup Group_CompilerSpecific Compiler Specific Macros
- * \brief Compiler specific macros for code optimization and correctness.
- *
- * Compiler specific macros to expose certain compiler features which may increase the level of code optimization
- * for a specific compiler, or correct certain issues that may be present such as memory barriers for use in conjunction
- * with atomic variable access.
- *
- * Where possible, on alternative compilers, these macros will either have no effect, or default to returning a sane value
- * so that they can be used in existing code without the need for extra compiler checks in the user application code.
- *
- * @{
- */
-
-#ifndef __LUFA_COMPILERSPEC_H__
-#define __LUFA_COMPILERSPEC_H__
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_COMMON_H)
- #error Do not include this file directly. Include LUFA/Common/Common.h instead to gain this functionality.
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- #if defined(__GNUC__) || defined(__DOXYGEN__)
- /** Forces GCC to use pointer indirection (via the device's pointer register pairs) when accessing the given
- * struct pointer. In some cases GCC will emit non-optimal assembly code when accessing a structure through
- * a pointer, resulting in a larger binary. When this macro is used on a (non \c const) structure pointer before
- * use, it will force GCC to use pointer indirection on the elements rather than direct store and load
- * instructions.
- *
- * \param[in, out] StructPtr Pointer to a structure which is to be forced into indirect access mode.
- */
- #define GCC_FORCE_POINTER_ACCESS(StructPtr) __asm__ __volatile__("" : "=b" (StructPtr) : "0" (StructPtr))
-
- /** Forces GCC to create a memory barrier, ensuring that memory accesses are not reordered past the barrier point.
- * This can be used before ordering-critical operations, to ensure that the compiler does not re-order the resulting
- * assembly output in an unexpected manner on sections of code that are ordering-specific.
- */
- #define GCC_MEMORY_BARRIER() __asm__ __volatile__("" ::: "memory");
-
- /** Evaluates to boolean true if the specified value can be determined at compile time to be a constant value
- * when compiling under GCC.
- *
- * \param[in] x Value to check compile time constantness of.
- *
- * \return Boolean true if the given value is known to be a compile time constant.
- */
- #define GCC_IS_COMPILE_CONST(x) __builtin_constant_p(x)
- #else
- #define GCC_FORCE_POINTER_ACCESS(StructPtr)
- #define GCC_MEMORY_BARRIER()
- #define GCC_IS_COMPILE_CONST(x) 0
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Compiler specific macros for code optimization and correctness.
+ *
+ * \copydetails Group_CompilerSpecific
+ *
+ * \note Do not include this file directly, rather include the Common.h header file instead to gain this file's
+ * functionality.
+ */
+
+/** \ingroup Group_Common
+ * \defgroup Group_CompilerSpecific Compiler Specific Macros
+ * \brief Compiler specific macros for code optimization and correctness.
+ *
+ * Compiler specific macros to expose certain compiler features which may increase the level of code optimization
+ * for a specific compiler, or correct certain issues that may be present such as memory barriers for use in conjunction
+ * with atomic variable access.
+ *
+ * Where possible, on alternative compilers, these macros will either have no effect, or default to returning a sane value
+ * so that they can be used in existing code without the need for extra compiler checks in the user application code.
+ *
+ * @{
+ */
+
+#ifndef __LUFA_COMPILERSPEC_H__
+#define __LUFA_COMPILERSPEC_H__
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_COMMON_H)
+ #error Do not include this file directly. Include LUFA/Common/Common.h instead to gain this functionality.
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ #if defined(__GNUC__) || defined(__DOXYGEN__)
+ /** Forces GCC to use pointer indirection (via the device's pointer register pairs) when accessing the given
+ * struct pointer. In some cases GCC will emit non-optimal assembly code when accessing a structure through
+ * a pointer, resulting in a larger binary. When this macro is used on a (non \c const) structure pointer before
+ * use, it will force GCC to use pointer indirection on the elements rather than direct store and load
+ * instructions.
+ *
+ * \param[in, out] StructPtr Pointer to a structure which is to be forced into indirect access mode.
+ */
+ #define GCC_FORCE_POINTER_ACCESS(StructPtr) __asm__ __volatile__("" : "=b" (StructPtr) : "0" (StructPtr))
+
+ /** Forces GCC to create a memory barrier, ensuring that memory accesses are not reordered past the barrier point.
+ * This can be used before ordering-critical operations, to ensure that the compiler does not re-order the resulting
+ * assembly output in an unexpected manner on sections of code that are ordering-specific.
+ */
+ #define GCC_MEMORY_BARRIER() __asm__ __volatile__("" ::: "memory");
+
+ /** Evaluates to boolean true if the specified value can be determined at compile time to be a constant value
+ * when compiling under GCC.
+ *
+ * \param[in] x Value to check compile time constantness of.
+ *
+ * \return Boolean true if the given value is known to be a compile time constant.
+ */
+ #define GCC_IS_COMPILE_CONST(x) __builtin_constant_p(x)
+ #else
+ #define GCC_FORCE_POINTER_ACCESS(StructPtr)
+ #define GCC_MEMORY_BARRIER()
+ #define GCC_IS_COMPILE_CONST(x) 0
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Common/Endianness.h b/LUFA/Common/Endianness.h
index 58f8012c1..123ad425f 100644
--- a/LUFA/Common/Endianness.h
+++ b/LUFA/Common/Endianness.h
@@ -1,476 +1,476 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Endianness and Byte Ordering macros and functions.
- *
- * \copydetails Group_Endianness
- */
-
-/** \ingroup Group_Endianness
- * \defgroup Group_ByteSwapping Byte Reordering
- * \brief Macros and functions for forced byte reordering.
- */
-
-/** \ingroup Group_Endianness
- * \defgroup Group_EndianConversion Endianness Conversion
- * \brief Macros and functions for automatic endianness conversion.
- */
-
-/** \ingroup Group_Common
- * \defgroup Group_Endianness Endianness and Byte Ordering
- * \brief Convenience macros and functions relating to byte (re-)ordering
- *
- * Common library convenience macros and functions relating to byte (re-)ordering.
- *
- * @{
- */
-
-#ifndef __LUFA_ENDIANNESS_H__
-#define __LUFA_ENDIANNESS_H__
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_COMMON_H)
- #error Do not include this file directly. Include LUFA/Common/Common.h instead to gain this functionality.
- #endif
-
- #if !(defined(ARCH_BIG_ENDIAN) || defined(ARCH_LITTLE_ENDIAN))
- #error ARCH_BIG_ENDIAN or ARCH_LITTLE_ENDIAN not set for the specified architecture.
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** Swaps the byte ordering of a 16-bit value at compile-time. Do not use this macro for swapping byte orderings
- * of dynamic values computed at runtime, use \ref SwapEndian_16() instead. The result of this macro can be used
- * inside struct or other variable initializers outside of a function, something that is not possible with the
- * inline function variant.
- *
- * \ingroup Group_ByteSwapping
- *
- * \param[in] x 16-bit value whose byte ordering is to be swapped.
- *
- * \return Input value with the byte ordering reversed.
- */
- #define SWAPENDIAN_16(x) (uint16_t)((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8))
-
- /** Swaps the byte ordering of a 32-bit value at compile-time. Do not use this macro for swapping byte orderings
- * of dynamic values computed at runtime- use \ref SwapEndian_32() instead. The result of this macro can be used
- * inside struct or other variable initializers outside of a function, something that is not possible with the
- * inline function variant.
- *
- * \ingroup Group_ByteSwapping
- *
- * \param[in] x 32-bit value whose byte ordering is to be swapped.
- *
- * \return Input value with the byte ordering reversed.
- */
- #define SWAPENDIAN_32(x) (uint32_t)((((x) & 0xFF000000UL) >> 24UL) | (((x) & 0x00FF0000UL) >> 8UL) | \
- (((x) & 0x0000FF00UL) << 8UL) | (((x) & 0x000000FFUL) << 24UL))
-
- #if defined(ARCH_BIG_ENDIAN) && !defined(le16_to_cpu)
- #define le16_to_cpu(x) SwapEndian_16(x)
- #define le32_to_cpu(x) SwapEndian_32(x)
- #define be16_to_cpu(x) x
- #define be32_to_cpu(x) x
- #define cpu_to_le16(x) SwapEndian_16(x)
- #define cpu_to_le32(x) SwapEndian_32(x)
- #define cpu_to_be16(x) x
- #define cpu_to_be32(x) x
- #define LE16_TO_CPU(x) SWAPENDIAN_16(x)
- #define LE32_TO_CPU(x) SWAPENDIAN_32(x)
- #define BE16_TO_CPU(x) x
- #define BE32_TO_CPU(x) x
- #define CPU_TO_LE16(x) SWAPENDIAN_16(x)
- #define CPU_TO_LE32(x) SWAPENDIAN_32(x)
- #define CPU_TO_BE16(x) x
- #define CPU_TO_BE32(x) x
- #elif !defined(le16_to_cpu)
- /** \name Run-time endianness conversion */
- //@{
-
- /** Performs a conversion between a Little Endian encoded 16-bit piece of data and the
- * Endianness of the currently selected CPU architecture.
- *
- * On little endian architectures, this macro does nothing.
- *
- * \note This macro is designed for run-time conversion of data - for compile-time endianness
- * conversion, use \ref LE16_TO_CPU instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define le16_to_cpu(x) x
-
- /** Performs a conversion between a Little Endian encoded 32-bit piece of data and the
- * Endianness of the currently selected CPU architecture.
- *
- * On little endian architectures, this macro does nothing.
- *
- * \note This macro is designed for run-time conversion of data - for compile-time endianness
- * conversion, use \ref LE32_TO_CPU instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define le32_to_cpu(x) x
-
- /** Performs a conversion between a Big Endian encoded 16-bit piece of data and the
- * Endianness of the currently selected CPU architecture.
- *
- * On big endian architectures, this macro does nothing.
- *
- * \note This macro is designed for run-time conversion of data - for compile-time endianness
- * conversion, use \ref BE16_TO_CPU instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define be16_to_cpu(x) SwapEndian_16(x)
-
- /** Performs a conversion between a Big Endian encoded 32-bit piece of data and the
- * Endianness of the currently selected CPU architecture.
- *
- * On big endian architectures, this macro does nothing.
- *
- * \note This macro is designed for run-time conversion of data - for compile-time endianness
- * conversion, use \ref BE32_TO_CPU instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define be32_to_cpu(x) SwapEndian_32(x)
-
- /** Performs a conversion on a natively encoded 16-bit piece of data to ensure that it
- * is in Little Endian format regardless of the currently selected CPU architecture.
- *
- * On little endian architectures, this macro does nothing.
- *
- * \note This macro is designed for run-time conversion of data - for compile-time endianness
- * conversion, use \ref CPU_TO_LE16 instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define cpu_to_le16(x) x
-
- /** Performs a conversion on a natively encoded 32-bit piece of data to ensure that it
- * is in Little Endian format regardless of the currently selected CPU architecture.
- *
- * On little endian architectures, this macro does nothing.
- *
- * \note This macro is designed for run-time conversion of data - for compile-time endianness
- * conversion, use \ref CPU_TO_LE32 instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define cpu_to_le32(x) x
-
- /** Performs a conversion on a natively encoded 16-bit piece of data to ensure that it
- * is in Big Endian format regardless of the currently selected CPU architecture.
- *
- * On big endian architectures, this macro does nothing.
- *
- * \note This macro is designed for run-time conversion of data - for compile-time endianness
- * conversion, use \ref CPU_TO_BE16 instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define cpu_to_be16(x) SwapEndian_16(x)
-
- /** Performs a conversion on a natively encoded 32-bit piece of data to ensure that it
- * is in Big Endian format regardless of the currently selected CPU architecture.
- *
- * On big endian architectures, this macro does nothing.
- *
- * \note This macro is designed for run-time conversion of data - for compile-time endianness
- * conversion, use \ref CPU_TO_BE32 instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define cpu_to_be32(x) SwapEndian_32(x)
-
- //@}
-
- /** \name Compile-time endianness conversion */
- //@{
-
- /** Performs a conversion between a Little Endian encoded 16-bit piece of data and the
- * Endianness of the currently selected CPU architecture.
- *
- * On little endian architectures, this macro does nothing.
- *
- * \note This macro is designed for compile-time conversion of data - for run time endianness
- * conversion, use \ref le16_to_cpu instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define LE16_TO_CPU(x) x
-
- /** Performs a conversion between a Little Endian encoded 32-bit piece of data and the
- * Endianness of the currently selected CPU architecture.
- *
- * On little endian architectures, this macro does nothing.
- *
- * \note This macro is designed for compile-time conversion of data - for run time endianness
- * conversion, use \ref le32_to_cpu instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define LE32_TO_CPU(x) x
-
- /** Performs a conversion between a Big Endian encoded 16-bit piece of data and the
- * Endianness of the currently selected CPU architecture.
- *
- * On big endian architectures, this macro does nothing.
- *
- * \note This macro is designed for compile-time conversion of data - for run-time endianness
- * conversion, use \ref be16_to_cpu instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define BE16_TO_CPU(x) SWAPENDIAN_16(x)
-
- /** Performs a conversion between a Big Endian encoded 32-bit piece of data and the
- * Endianness of the currently selected CPU architecture.
- *
- * On big endian architectures, this macro does nothing.
- *
- * \note This macro is designed for compile-time conversion of data - for run-time endianness
- * conversion, use \ref be32_to_cpu instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define BE32_TO_CPU(x) SWAPENDIAN_32(x)
-
- /** Performs a conversion on a natively encoded 16-bit piece of data to ensure that it
- * is in Little Endian format regardless of the currently selected CPU architecture.
- *
- * On little endian architectures, this macro does nothing.
- *
- * \note This macro is designed for compile-time conversion of data - for run-time endianness
- * conversion, use \ref cpu_to_le16 instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define CPU_TO_LE16(x) x
-
- /** Performs a conversion on a natively encoded 32-bit piece of data to ensure that it
- * is in Little Endian format regardless of the currently selected CPU architecture.
- *
- * On little endian architectures, this macro does nothing.
- *
- * \note This macro is designed for compile-time conversion of data - for run-time endianness
- * conversion, use \ref cpu_to_le32 instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define CPU_TO_LE32(x) x
-
- /** Performs a conversion on a natively encoded 16-bit piece of data to ensure that it
- * is in Big Endian format regardless of the currently selected CPU architecture.
- *
- * On big endian architectures, this macro does nothing.
- *
- * \note This macro is designed for compile-time conversion of data - for run-time endianness
- * conversion, use \ref cpu_to_be16 instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define CPU_TO_BE16(x) SWAPENDIAN_16(x)
-
- /** Performs a conversion on a natively encoded 32-bit piece of data to ensure that it
- * is in Big Endian format regardless of the currently selected CPU architecture.
- *
- * On big endian architectures, this macro does nothing.
- *
- * \note This macro is designed for compile-time conversion of data - for run-time endianness
- * conversion, use \ref cpu_to_be32 instead.
- *
- * \ingroup Group_EndianConversion
- *
- * \param[in] x Data to perform the endianness conversion on.
- *
- * \return Endian corrected version of the input value.
- */
- #define CPU_TO_BE32(x) SWAPENDIAN_32(x)
-
- //! @}
- #endif
-
- /* Inline Functions: */
- /** Function to reverse the byte ordering of the individual bytes in a 16 bit value.
- *
- * \ingroup Group_ByteSwapping
- *
- * \param[in] Word Word of data whose bytes are to be swapped.
- */
- static inline uint16_t SwapEndian_16(const uint16_t Word) ATTR_WARN_UNUSED_RESULT ATTR_CONST;
- static inline uint16_t SwapEndian_16(const uint16_t Word)
- {
- uint8_t Temp;
-
- union
- {
- uint16_t Word;
- uint8_t Bytes[2];
- } Data;
-
- Data.Word = Word;
-
- Temp = Data.Bytes[0];
- Data.Bytes[0] = Data.Bytes[1];
- Data.Bytes[1] = Temp;
-
- return Data.Word;
- }
-
- /** Function to reverse the byte ordering of the individual bytes in a 32 bit value.
- *
- * \ingroup Group_ByteSwapping
- *
- * \param[in] DWord Double word of data whose bytes are to be swapped.
- */
- static inline uint32_t SwapEndian_32(const uint32_t DWord) ATTR_WARN_UNUSED_RESULT ATTR_CONST;
- static inline uint32_t SwapEndian_32(const uint32_t DWord)
- {
- uint8_t Temp;
-
- union
- {
- uint32_t DWord;
- uint8_t Bytes[4];
- } Data;
-
- Data.DWord = DWord;
-
- Temp = Data.Bytes[0];
- Data.Bytes[0] = Data.Bytes[3];
- Data.Bytes[3] = Temp;
-
- Temp = Data.Bytes[1];
- Data.Bytes[1] = Data.Bytes[2];
- Data.Bytes[2] = Temp;
-
- return Data.DWord;
- }
-
- /** Function to reverse the byte ordering of the individual bytes in a n byte value.
- *
- * \ingroup Group_ByteSwapping
- *
- * \param[in,out] Data Pointer to a number containing an even number of bytes to be reversed.
- * \param[in] Length Length of the data in bytes.
- */
- static inline void SwapEndian_n(void* const Data,
- uint8_t Length) ATTR_NON_NULL_PTR_ARG(1);
- static inline void SwapEndian_n(void* const Data,
- uint8_t Length)
- {
- uint8_t* CurrDataPos = (uint8_t*)Data;
-
- while (Length > 1)
- {
- uint8_t Temp = *CurrDataPos;
- *CurrDataPos = *(CurrDataPos + Length - 1);
- *(CurrDataPos + Length - 1) = Temp;
-
- CurrDataPos++;
- Length -= 2;
- }
- }
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Endianness and Byte Ordering macros and functions.
+ *
+ * \copydetails Group_Endianness
+ */
+
+/** \ingroup Group_Endianness
+ * \defgroup Group_ByteSwapping Byte Reordering
+ * \brief Macros and functions for forced byte reordering.
+ */
+
+/** \ingroup Group_Endianness
+ * \defgroup Group_EndianConversion Endianness Conversion
+ * \brief Macros and functions for automatic endianness conversion.
+ */
+
+/** \ingroup Group_Common
+ * \defgroup Group_Endianness Endianness and Byte Ordering
+ * \brief Convenience macros and functions relating to byte (re-)ordering
+ *
+ * Common library convenience macros and functions relating to byte (re-)ordering.
+ *
+ * @{
+ */
+
+#ifndef __LUFA_ENDIANNESS_H__
+#define __LUFA_ENDIANNESS_H__
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_COMMON_H)
+ #error Do not include this file directly. Include LUFA/Common/Common.h instead to gain this functionality.
+ #endif
+
+ #if !(defined(ARCH_BIG_ENDIAN) || defined(ARCH_LITTLE_ENDIAN))
+ #error ARCH_BIG_ENDIAN or ARCH_LITTLE_ENDIAN not set for the specified architecture.
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** Swaps the byte ordering of a 16-bit value at compile-time. Do not use this macro for swapping byte orderings
+ * of dynamic values computed at runtime, use \ref SwapEndian_16() instead. The result of this macro can be used
+ * inside struct or other variable initializers outside of a function, something that is not possible with the
+ * inline function variant.
+ *
+ * \ingroup Group_ByteSwapping
+ *
+ * \param[in] x 16-bit value whose byte ordering is to be swapped.
+ *
+ * \return Input value with the byte ordering reversed.
+ */
+ #define SWAPENDIAN_16(x) (uint16_t)((((x) & 0xFF00) >> 8) | (((x) & 0x00FF) << 8))
+
+ /** Swaps the byte ordering of a 32-bit value at compile-time. Do not use this macro for swapping byte orderings
+ * of dynamic values computed at runtime- use \ref SwapEndian_32() instead. The result of this macro can be used
+ * inside struct or other variable initializers outside of a function, something that is not possible with the
+ * inline function variant.
+ *
+ * \ingroup Group_ByteSwapping
+ *
+ * \param[in] x 32-bit value whose byte ordering is to be swapped.
+ *
+ * \return Input value with the byte ordering reversed.
+ */
+ #define SWAPENDIAN_32(x) (uint32_t)((((x) & 0xFF000000UL) >> 24UL) | (((x) & 0x00FF0000UL) >> 8UL) | \
+ (((x) & 0x0000FF00UL) << 8UL) | (((x) & 0x000000FFUL) << 24UL))
+
+ #if defined(ARCH_BIG_ENDIAN) && !defined(le16_to_cpu)
+ #define le16_to_cpu(x) SwapEndian_16(x)
+ #define le32_to_cpu(x) SwapEndian_32(x)
+ #define be16_to_cpu(x) x
+ #define be32_to_cpu(x) x
+ #define cpu_to_le16(x) SwapEndian_16(x)
+ #define cpu_to_le32(x) SwapEndian_32(x)
+ #define cpu_to_be16(x) x
+ #define cpu_to_be32(x) x
+ #define LE16_TO_CPU(x) SWAPENDIAN_16(x)
+ #define LE32_TO_CPU(x) SWAPENDIAN_32(x)
+ #define BE16_TO_CPU(x) x
+ #define BE32_TO_CPU(x) x
+ #define CPU_TO_LE16(x) SWAPENDIAN_16(x)
+ #define CPU_TO_LE32(x) SWAPENDIAN_32(x)
+ #define CPU_TO_BE16(x) x
+ #define CPU_TO_BE32(x) x
+ #elif !defined(le16_to_cpu)
+ /** \name Run-time endianness conversion */
+ //@{
+
+ /** Performs a conversion between a Little Endian encoded 16-bit piece of data and the
+ * Endianness of the currently selected CPU architecture.
+ *
+ * On little endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for run-time conversion of data - for compile-time endianness
+ * conversion, use \ref LE16_TO_CPU instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define le16_to_cpu(x) x
+
+ /** Performs a conversion between a Little Endian encoded 32-bit piece of data and the
+ * Endianness of the currently selected CPU architecture.
+ *
+ * On little endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for run-time conversion of data - for compile-time endianness
+ * conversion, use \ref LE32_TO_CPU instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define le32_to_cpu(x) x
+
+ /** Performs a conversion between a Big Endian encoded 16-bit piece of data and the
+ * Endianness of the currently selected CPU architecture.
+ *
+ * On big endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for run-time conversion of data - for compile-time endianness
+ * conversion, use \ref BE16_TO_CPU instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define be16_to_cpu(x) SwapEndian_16(x)
+
+ /** Performs a conversion between a Big Endian encoded 32-bit piece of data and the
+ * Endianness of the currently selected CPU architecture.
+ *
+ * On big endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for run-time conversion of data - for compile-time endianness
+ * conversion, use \ref BE32_TO_CPU instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define be32_to_cpu(x) SwapEndian_32(x)
+
+ /** Performs a conversion on a natively encoded 16-bit piece of data to ensure that it
+ * is in Little Endian format regardless of the currently selected CPU architecture.
+ *
+ * On little endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for run-time conversion of data - for compile-time endianness
+ * conversion, use \ref CPU_TO_LE16 instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define cpu_to_le16(x) x
+
+ /** Performs a conversion on a natively encoded 32-bit piece of data to ensure that it
+ * is in Little Endian format regardless of the currently selected CPU architecture.
+ *
+ * On little endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for run-time conversion of data - for compile-time endianness
+ * conversion, use \ref CPU_TO_LE32 instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define cpu_to_le32(x) x
+
+ /** Performs a conversion on a natively encoded 16-bit piece of data to ensure that it
+ * is in Big Endian format regardless of the currently selected CPU architecture.
+ *
+ * On big endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for run-time conversion of data - for compile-time endianness
+ * conversion, use \ref CPU_TO_BE16 instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define cpu_to_be16(x) SwapEndian_16(x)
+
+ /** Performs a conversion on a natively encoded 32-bit piece of data to ensure that it
+ * is in Big Endian format regardless of the currently selected CPU architecture.
+ *
+ * On big endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for run-time conversion of data - for compile-time endianness
+ * conversion, use \ref CPU_TO_BE32 instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define cpu_to_be32(x) SwapEndian_32(x)
+
+ //@}
+
+ /** \name Compile-time endianness conversion */
+ //@{
+
+ /** Performs a conversion between a Little Endian encoded 16-bit piece of data and the
+ * Endianness of the currently selected CPU architecture.
+ *
+ * On little endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for compile-time conversion of data - for run time endianness
+ * conversion, use \ref le16_to_cpu instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define LE16_TO_CPU(x) x
+
+ /** Performs a conversion between a Little Endian encoded 32-bit piece of data and the
+ * Endianness of the currently selected CPU architecture.
+ *
+ * On little endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for compile-time conversion of data - for run time endianness
+ * conversion, use \ref le32_to_cpu instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define LE32_TO_CPU(x) x
+
+ /** Performs a conversion between a Big Endian encoded 16-bit piece of data and the
+ * Endianness of the currently selected CPU architecture.
+ *
+ * On big endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for compile-time conversion of data - for run-time endianness
+ * conversion, use \ref be16_to_cpu instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define BE16_TO_CPU(x) SWAPENDIAN_16(x)
+
+ /** Performs a conversion between a Big Endian encoded 32-bit piece of data and the
+ * Endianness of the currently selected CPU architecture.
+ *
+ * On big endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for compile-time conversion of data - for run-time endianness
+ * conversion, use \ref be32_to_cpu instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define BE32_TO_CPU(x) SWAPENDIAN_32(x)
+
+ /** Performs a conversion on a natively encoded 16-bit piece of data to ensure that it
+ * is in Little Endian format regardless of the currently selected CPU architecture.
+ *
+ * On little endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for compile-time conversion of data - for run-time endianness
+ * conversion, use \ref cpu_to_le16 instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define CPU_TO_LE16(x) x
+
+ /** Performs a conversion on a natively encoded 32-bit piece of data to ensure that it
+ * is in Little Endian format regardless of the currently selected CPU architecture.
+ *
+ * On little endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for compile-time conversion of data - for run-time endianness
+ * conversion, use \ref cpu_to_le32 instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define CPU_TO_LE32(x) x
+
+ /** Performs a conversion on a natively encoded 16-bit piece of data to ensure that it
+ * is in Big Endian format regardless of the currently selected CPU architecture.
+ *
+ * On big endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for compile-time conversion of data - for run-time endianness
+ * conversion, use \ref cpu_to_be16 instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define CPU_TO_BE16(x) SWAPENDIAN_16(x)
+
+ /** Performs a conversion on a natively encoded 32-bit piece of data to ensure that it
+ * is in Big Endian format regardless of the currently selected CPU architecture.
+ *
+ * On big endian architectures, this macro does nothing.
+ *
+ * \note This macro is designed for compile-time conversion of data - for run-time endianness
+ * conversion, use \ref cpu_to_be32 instead.
+ *
+ * \ingroup Group_EndianConversion
+ *
+ * \param[in] x Data to perform the endianness conversion on.
+ *
+ * \return Endian corrected version of the input value.
+ */
+ #define CPU_TO_BE32(x) SWAPENDIAN_32(x)
+
+ //! @}
+ #endif
+
+ /* Inline Functions: */
+ /** Function to reverse the byte ordering of the individual bytes in a 16 bit value.
+ *
+ * \ingroup Group_ByteSwapping
+ *
+ * \param[in] Word Word of data whose bytes are to be swapped.
+ */
+ static inline uint16_t SwapEndian_16(const uint16_t Word) ATTR_WARN_UNUSED_RESULT ATTR_CONST;
+ static inline uint16_t SwapEndian_16(const uint16_t Word)
+ {
+ uint8_t Temp;
+
+ union
+ {
+ uint16_t Word;
+ uint8_t Bytes[2];
+ } Data;
+
+ Data.Word = Word;
+
+ Temp = Data.Bytes[0];
+ Data.Bytes[0] = Data.Bytes[1];
+ Data.Bytes[1] = Temp;
+
+ return Data.Word;
+ }
+
+ /** Function to reverse the byte ordering of the individual bytes in a 32 bit value.
+ *
+ * \ingroup Group_ByteSwapping
+ *
+ * \param[in] DWord Double word of data whose bytes are to be swapped.
+ */
+ static inline uint32_t SwapEndian_32(const uint32_t DWord) ATTR_WARN_UNUSED_RESULT ATTR_CONST;
+ static inline uint32_t SwapEndian_32(const uint32_t DWord)
+ {
+ uint8_t Temp;
+
+ union
+ {
+ uint32_t DWord;
+ uint8_t Bytes[4];
+ } Data;
+
+ Data.DWord = DWord;
+
+ Temp = Data.Bytes[0];
+ Data.Bytes[0] = Data.Bytes[3];
+ Data.Bytes[3] = Temp;
+
+ Temp = Data.Bytes[1];
+ Data.Bytes[1] = Data.Bytes[2];
+ Data.Bytes[2] = Temp;
+
+ return Data.DWord;
+ }
+
+ /** Function to reverse the byte ordering of the individual bytes in a n byte value.
+ *
+ * \ingroup Group_ByteSwapping
+ *
+ * \param[in,out] Data Pointer to a number containing an even number of bytes to be reversed.
+ * \param[in] Length Length of the data in bytes.
+ */
+ static inline void SwapEndian_n(void* const Data,
+ uint8_t Length) ATTR_NON_NULL_PTR_ARG(1);
+ static inline void SwapEndian_n(void* const Data,
+ uint8_t Length)
+ {
+ uint8_t* CurrDataPos = (uint8_t*)Data;
+
+ while (Length > 1)
+ {
+ uint8_t Temp = *CurrDataPos;
+ *CurrDataPos = *(CurrDataPos + Length - 1);
+ *(CurrDataPos + Length - 1) = Temp;
+
+ CurrDataPos++;
+ Length -= 2;
+ }
+ }
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h b/LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h
index 125481d0e..97f20053e 100644
--- a/LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h
+++ b/LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h
@@ -1,124 +1,124 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Board specific LED driver header for the Adafruit U4 Breakout board.
- * \copydetails Group_LEDs_ADAFRUITU4
- *
- * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
- * dispatch header located in LUFA/Drivers/Board/LEDs.h.
- */
-
-/** \ingroup Group_LEDs
- * \defgroup Group_LEDs_ADAFRUITU4 ADAFRUITU4
- * \brief Board specific LED driver header for the Adafruit U4 Breakout board.
- *
- * Board specific LED driver header for the Adafruit U4 Breakout board (http://ladyada.net/products/atmega32u4breakout).
- *
- * @{
- */
-
-#ifndef __LEDS_ADAFRUITU4_H__
-#define __LEDS_ADAFRUITU4_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_LEDS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** LED mask for the first LED on the board. */
- #define LEDS_LED1 (1 << 6)
-
- /** LED mask for all the LEDs on the board. */
- #define LEDS_ALL_LEDS LEDS_LED1
-
- /** LED mask for the none of the board LEDs. */
- #define LEDS_NO_LEDS 0
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void LEDs_Init(void)
- {
- DDRE |= LEDS_ALL_LEDS;
- PORTE &= ~LEDS_ALL_LEDS;
- }
-
- static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
- {
- PORTE |= LEDMask;
- }
-
- static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
- {
- PORTE &= ~LEDMask;
- }
-
- static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
- {
- PORTE = ((PORTE & ~LEDS_ALL_LEDS) | LEDMask);
- }
-
- static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
- const uint8_t ActiveMask)
- {
- PORTE = ((PORTE & ~LEDMask) | ActiveMask);
- }
-
- static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
- {
- PORTE &= LEDMask;
- }
-
- static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint8_t LEDs_GetLEDs(void)
- {
- return (PORTE & LEDS_ALL_LEDS);
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Board specific LED driver header for the Adafruit U4 Breakout board.
+ * \copydetails Group_LEDs_ADAFRUITU4
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ * dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ * \defgroup Group_LEDs_ADAFRUITU4 ADAFRUITU4
+ * \brief Board specific LED driver header for the Adafruit U4 Breakout board.
+ *
+ * Board specific LED driver header for the Adafruit U4 Breakout board (http://ladyada.net/products/atmega32u4breakout).
+ *
+ * @{
+ */
+
+#ifndef __LEDS_ADAFRUITU4_H__
+#define __LEDS_ADAFRUITU4_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_LEDS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** LED mask for the first LED on the board. */
+ #define LEDS_LED1 (1 << 6)
+
+ /** LED mask for all the LEDs on the board. */
+ #define LEDS_ALL_LEDS LEDS_LED1
+
+ /** LED mask for the none of the board LEDs. */
+ #define LEDS_NO_LEDS 0
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void LEDs_Init(void)
+ {
+ DDRE |= LEDS_ALL_LEDS;
+ PORTE &= ~LEDS_ALL_LEDS;
+ }
+
+ static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+ {
+ PORTE |= LEDMask;
+ }
+
+ static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+ {
+ PORTE &= ~LEDMask;
+ }
+
+ static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+ {
+ PORTE = ((PORTE & ~LEDS_ALL_LEDS) | LEDMask);
+ }
+
+ static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+ const uint8_t ActiveMask)
+ {
+ PORTE = ((PORTE & ~LEDMask) | ActiveMask);
+ }
+
+ static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+ {
+ PORTE &= LEDMask;
+ }
+
+ static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint8_t LEDs_GetLEDs(void)
+ {
+ return (PORTE & LEDS_ALL_LEDS);
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h b/LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h
index 42e2788c8..dfb77fa38 100644
--- a/LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h
+++ b/LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h
@@ -1,126 +1,126 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Board specific LED driver header for the BLACKCAT USB JTAG.
- * \copydetails Group_LEDs_BLACKCAT
- *
- * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
- * dispatch header located in LUFA/Drivers/Board/LEDs.h.
- */
-
-/** \ingroup Group_LEDs
- * \defgroup Group_LEDs_BLACKCAT BLACKCAT
- * \brief Board specific LED driver header for the BLACKCAT USB JTAG.
- *
- * Board specific LED driver header for the TCNISO Blackcat USB JTAG (http://www.embeddedcomputers.net/products/BlackcatUSB/.
- *
- * @{
- */
-
-#ifndef __LEDS_BLACKCAT_H__
-#define __LEDS_BLACKCAT_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_LEDS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** LED mask for the first LED on the board. */
- #define LEDS_LED1 (1 << 6)
-
- /** LED mask for the second LED on the board. */
- #define LEDS_LED2 (1 << 3)
-
- /** LED mask for all the LEDs on the board. */
- #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2)
-
- /** LED mask for none of the board LEDs. */
- #define LEDS_NO_LEDS 0
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void LEDs_Init(void)
- {
- DDRD |= LEDS_ALL_LEDS;
- PORTD &= ~LEDS_ALL_LEDS;
- }
-
- static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
- {
- PORTD |= LEDMask;
- }
-
- static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
- {
- PORTD &= ~LEDMask;
- }
-
- static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
- {
- PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask);
- }
-
- static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
- const uint8_t ActiveMask)
- {
- PORTD = ((PORTD & ~LEDMask) | ActiveMask);
- }
-
- static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
- {
- PORTD ^= LEDMask;
- }
-
- static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint8_t LEDs_GetLEDs(void)
- {
- return (PORTD & LEDS_ALL_LEDS);
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Board specific LED driver header for the BLACKCAT USB JTAG.
+ * \copydetails Group_LEDs_BLACKCAT
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ * dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ * \defgroup Group_LEDs_BLACKCAT BLACKCAT
+ * \brief Board specific LED driver header for the BLACKCAT USB JTAG.
+ *
+ * Board specific LED driver header for the TCNISO Blackcat USB JTAG (http://www.embeddedcomputers.net/products/BlackcatUSB/.
+ *
+ * @{
+ */
+
+#ifndef __LEDS_BLACKCAT_H__
+#define __LEDS_BLACKCAT_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_LEDS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** LED mask for the first LED on the board. */
+ #define LEDS_LED1 (1 << 6)
+
+ /** LED mask for the second LED on the board. */
+ #define LEDS_LED2 (1 << 3)
+
+ /** LED mask for all the LEDs on the board. */
+ #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2)
+
+ /** LED mask for none of the board LEDs. */
+ #define LEDS_NO_LEDS 0
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void LEDs_Init(void)
+ {
+ DDRD |= LEDS_ALL_LEDS;
+ PORTD &= ~LEDS_ALL_LEDS;
+ }
+
+ static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+ {
+ PORTD |= LEDMask;
+ }
+
+ static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+ {
+ PORTD &= ~LEDMask;
+ }
+
+ static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+ {
+ PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask);
+ }
+
+ static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+ const uint8_t ActiveMask)
+ {
+ PORTD = ((PORTD & ~LEDMask) | ActiveMask);
+ }
+
+ static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+ {
+ PORTD ^= LEDMask;
+ }
+
+ static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint8_t LEDs_GetLEDs(void)
+ {
+ return (PORTD & LEDS_ALL_LEDS);
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h b/LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h
index a19bfe5bf..9030326e1 100644
--- a/LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h
+++ b/LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h
@@ -1,126 +1,126 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Board specific LED driver header for the Maximus.
- * \copydetails Group_LEDs_MAXIMUS
- *
- * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
- * dispatch header located in LUFA/Drivers/Board/LEDs.h.
- */
-
-/** \ingroup Group_LEDs
- * \defgroup Group_LEDs_MAXIMUS MAXIMUS
- * \brief Board specific LED driver header for the Maximus.
- *
- * Board specific LED driver header for the Maximus (http://www.avrusb.com/).
- *
- * @{
- */
-
-#ifndef __LEDS_MAXIMUS_H__
-#define __LEDS_MAXIMUS_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_LEDS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** LED mask for the first LED on the board. */
- #define LEDS_LED1 (1 << 6)
-
- /** LED mask for the second LED on the board. */
- #define LEDS_LED2 (1 << 7)
-
- /** LED mask for all the LEDs on the board. */
- #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2)
-
- /** LED mask for the none of the board LEDs. */
- #define LEDS_NO_LEDS 0
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void LEDs_Init(void)
- {
- DDRB |= LEDS_ALL_LEDS;
- PORTB &= ~LEDS_ALL_LEDS;
- }
-
- static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
- {
- PORTB |= LEDMask;
- }
-
- static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
- {
- PORTB &= ~LEDMask;
- }
-
- static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
- {
- PORTB = ((PORTB & ~LEDS_ALL_LEDS) | LEDMask);
- }
-
- static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
- const uint8_t ActiveMask)
- {
- PORTB = ((PORTB & ~LEDMask) | ActiveMask);
- }
-
- static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
- {
- PORTB ^= LEDMask;
- }
-
- static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint8_t LEDs_GetLEDs(void)
- {
- return (PORTB & LEDS_ALL_LEDS);
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Board specific LED driver header for the Maximus.
+ * \copydetails Group_LEDs_MAXIMUS
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ * dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ * \defgroup Group_LEDs_MAXIMUS MAXIMUS
+ * \brief Board specific LED driver header for the Maximus.
+ *
+ * Board specific LED driver header for the Maximus (http://www.avrusb.com/).
+ *
+ * @{
+ */
+
+#ifndef __LEDS_MAXIMUS_H__
+#define __LEDS_MAXIMUS_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_LEDS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** LED mask for the first LED on the board. */
+ #define LEDS_LED1 (1 << 6)
+
+ /** LED mask for the second LED on the board. */
+ #define LEDS_LED2 (1 << 7)
+
+ /** LED mask for all the LEDs on the board. */
+ #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2)
+
+ /** LED mask for the none of the board LEDs. */
+ #define LEDS_NO_LEDS 0
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void LEDs_Init(void)
+ {
+ DDRB |= LEDS_ALL_LEDS;
+ PORTB &= ~LEDS_ALL_LEDS;
+ }
+
+ static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+ {
+ PORTB |= LEDMask;
+ }
+
+ static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+ {
+ PORTB &= ~LEDMask;
+ }
+
+ static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+ {
+ PORTB = ((PORTB & ~LEDS_ALL_LEDS) | LEDMask);
+ }
+
+ static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+ const uint8_t ActiveMask)
+ {
+ PORTB = ((PORTB & ~LEDMask) | ActiveMask);
+ }
+
+ static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+ {
+ PORTB ^= LEDMask;
+ }
+
+ static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint8_t LEDs_GetLEDs(void)
+ {
+ return (PORTB & LEDS_ALL_LEDS);
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h b/LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h
index 46746f817..e3ba95786 100644
--- a/LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h
+++ b/LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h
@@ -1,92 +1,92 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Board specific Buttons driver header for the Microsin AVR-USB162 board.
- * \copydetails Group_Buttons_MICROSIN162
- *
- * \note This file should not be included directly. It is automatically included as needed by the Buttons driver
- * dispatch header located in LUFA/Drivers/Board/Buttons.h.
- */
-
-/** \ingroup Group_Buttons
- * \defgroup Group_Buttons_MICROSIN162 MICROSIN162
- * \brief Board specific Buttons driver header for the Microsin AVR-USB162 board.
- *
- * Board specific Buttons driver header for the Microsin AVR-USB162 board (http://microsin.ru/content/view/685/44/).
- *
- * @{
- */
-
-#ifndef __BUTTONS_MICROSIN162_H__
-#define __BUTTONS_MICROSIN162_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_BUTTONS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** Button mask for the first button on the board. */
- #define BUTTONS_BUTTON1 (1 << 7)
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void Buttons_Init(void)
- {
- DDRD &= ~BUTTONS_BUTTON1;
- PORTD |= BUTTONS_BUTTON1;
- }
-
- static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint8_t Buttons_GetStatus(void)
- {
- return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Board specific Buttons driver header for the Microsin AVR-USB162 board.
+ * \copydetails Group_Buttons_MICROSIN162
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ * dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ * \defgroup Group_Buttons_MICROSIN162 MICROSIN162
+ * \brief Board specific Buttons driver header for the Microsin AVR-USB162 board.
+ *
+ * Board specific Buttons driver header for the Microsin AVR-USB162 board (http://microsin.ru/content/view/685/44/).
+ *
+ * @{
+ */
+
+#ifndef __BUTTONS_MICROSIN162_H__
+#define __BUTTONS_MICROSIN162_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_BUTTONS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** Button mask for the first button on the board. */
+ #define BUTTONS_BUTTON1 (1 << 7)
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void Buttons_Init(void)
+ {
+ DDRD &= ~BUTTONS_BUTTON1;
+ PORTD |= BUTTONS_BUTTON1;
+ }
+
+ static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint8_t Buttons_GetStatus(void)
+ {
+ return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h b/LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h
index 443316be5..6e8472922 100644
--- a/LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h
+++ b/LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h
@@ -1,124 +1,124 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Board specific LED driver header for the Microsin AVR-USB162 board.
- * \copydetails Group_LEDs_MICROSIN162
- *
- * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
- * dispatch header located in LUFA/Drivers/Board/LEDs.h.
- */
-
-/** \ingroup Group_LEDs
- * \defgroup Group_LEDs_MICROSIN162 MICROSIN162
- * \brief Board specific LED driver header for the Microsin AVR-USB162 board.
- *
- * Board specific LED driver header for the Microsin AVR-USB162 board (http://microsin.ru/content/view/685/44/).
- *
- * @{
- */
-
-#ifndef __LEDS_MICROSIN162_H__
-#define __LEDS_MICROSIN162_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_LEDS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** LED mask for the first LED on the board. */
- #define LEDS_LED1 (1 << 4)
-
- /** LED mask for all the LEDs on the board. */
- #define LEDS_ALL_LEDS LEDS_LED1
-
- /** LED mask for none of the board LEDs. */
- #define LEDS_NO_LEDS 0
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void LEDs_Init(void)
- {
- DDRD |= LEDS_ALL_LEDS;
- PORTD |= LEDS_ALL_LEDS;
- }
-
- static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
- {
- PORTD &= ~LEDMask;
- }
-
- static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
- {
- PORTD |= LEDMask;
- }
-
- static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
- {
- PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask);
- }
-
- static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
- const uint8_t ActiveMask)
- {
- PORTD = ((PORTD | LEDMask) & ~ActiveMask);
- }
-
- static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
- {
- PORTD ^= LEDMask;
- }
-
- static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint8_t LEDs_GetLEDs(void)
- {
- return (~PORTD & LEDS_ALL_LEDS);
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Board specific LED driver header for the Microsin AVR-USB162 board.
+ * \copydetails Group_LEDs_MICROSIN162
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ * dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ * \defgroup Group_LEDs_MICROSIN162 MICROSIN162
+ * \brief Board specific LED driver header for the Microsin AVR-USB162 board.
+ *
+ * Board specific LED driver header for the Microsin AVR-USB162 board (http://microsin.ru/content/view/685/44/).
+ *
+ * @{
+ */
+
+#ifndef __LEDS_MICROSIN162_H__
+#define __LEDS_MICROSIN162_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_LEDS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** LED mask for the first LED on the board. */
+ #define LEDS_LED1 (1 << 4)
+
+ /** LED mask for all the LEDs on the board. */
+ #define LEDS_ALL_LEDS LEDS_LED1
+
+ /** LED mask for none of the board LEDs. */
+ #define LEDS_NO_LEDS 0
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void LEDs_Init(void)
+ {
+ DDRD |= LEDS_ALL_LEDS;
+ PORTD |= LEDS_ALL_LEDS;
+ }
+
+ static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+ {
+ PORTD &= ~LEDMask;
+ }
+
+ static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+ {
+ PORTD |= LEDMask;
+ }
+
+ static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+ {
+ PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask);
+ }
+
+ static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+ const uint8_t ActiveMask)
+ {
+ PORTD = ((PORTD | LEDMask) & ~ActiveMask);
+ }
+
+ static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+ {
+ PORTD ^= LEDMask;
+ }
+
+ static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint8_t LEDs_GetLEDs(void)
+ {
+ return (~PORTD & LEDS_ALL_LEDS);
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h b/LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h
index 3ea294fd8..0d645c514 100644
--- a/LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h
+++ b/LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h
@@ -1,91 +1,91 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Board specific Buttons driver header for the MINIMUS.
- * \copydetails Group_Buttons_MINIMUS
- *
- * \note This file should not be included directly. It is automatically included as needed by the Buttons driver
- * dispatch header located in LUFA/Drivers/Board/Buttons.h.
- */
-
-/** \ingroup Group_Buttons
- * \defgroup Group_Buttons_MINIMUS MINIMUS
- * \brief Board specific Buttons driver header for the MINIMUS.
- *
- * Board specific Buttons driver header for the MINIMUS.
- *
- * @{
- */
-
-#ifndef __BUTTONS_MINIMUS_H__
-#define __BUTTONS_MINIMUS_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_BUTTONS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** Button mask for the first button on the board. */
- #define BUTTONS_BUTTON1 (1 << 7)
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void Buttons_Init(void)
- {
- DDRD &= ~BUTTONS_BUTTON1;
- PORTD |= BUTTONS_BUTTON1;
- }
-
- static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint8_t Buttons_GetStatus(void)
- {
- return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Board specific Buttons driver header for the MINIMUS.
+ * \copydetails Group_Buttons_MINIMUS
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ * dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ * \defgroup Group_Buttons_MINIMUS MINIMUS
+ * \brief Board specific Buttons driver header for the MINIMUS.
+ *
+ * Board specific Buttons driver header for the MINIMUS.
+ *
+ * @{
+ */
+
+#ifndef __BUTTONS_MINIMUS_H__
+#define __BUTTONS_MINIMUS_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_BUTTONS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** Button mask for the first button on the board. */
+ #define BUTTONS_BUTTON1 (1 << 7)
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void Buttons_Init(void)
+ {
+ DDRD &= ~BUTTONS_BUTTON1;
+ PORTD |= BUTTONS_BUTTON1;
+ }
+
+ static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint8_t Buttons_GetStatus(void)
+ {
+ return ((PIND & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h b/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h
index 3dfcb3510..a7325482a 100644
--- a/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h
+++ b/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h
@@ -1,126 +1,126 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Board specific LED driver header for the MINIMUS.
- * \copydetails Group_LEDs_MINIMUS
- *
- * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
- * dispatch header located in LUFA/Drivers/Board/LEDs.h.
- */
-
-/** \ingroup Group_LEDs
- * \defgroup Group_LEDs_MINIMUS MINIMUS
- * \brief Board specific LED driver header for the MINIMUS.
- *
- * Board specific LED driver header for the Minimus USB (http://www.minimususb.com/).
- *
- * @{
- */
-
-#ifndef __LEDS_MINIMUS_H__
-#define __LEDS_MINIMUS_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_LEDS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** LED mask for the first LED on the board. */
- #define LEDS_LED1 (1 << 5)
-
- /** LED mask for the second LED on the board. */
- #define LEDS_LED2 (1 << 6)
-
- /** LED mask for all the LEDs on the board. */
- #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2)
-
- /** LED mask for the none of the board LEDs. */
- #define LEDS_NO_LEDS 1
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void LEDs_Init(void)
- {
- DDRD |= LEDS_ALL_LEDS;
- PORTD |= LEDS_ALL_LEDS;
- }
-
- static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
- {
- PORTD &= ~LEDMask;
- }
-
- static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
- {
- PORTD |= LEDMask;
- }
-
- static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
- {
- PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask);
- }
-
- static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
- const uint8_t ActiveMask)
- {
- PORTD = ((PORTD & ~LEDMask) | ActiveMask);
- }
-
- static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
- {
- PORTD ^= LEDMask;
- }
-
- static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint8_t LEDs_GetLEDs(void)
- {
- return (PORTD & LEDS_ALL_LEDS);
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Board specific LED driver header for the MINIMUS.
+ * \copydetails Group_LEDs_MINIMUS
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ * dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ * \defgroup Group_LEDs_MINIMUS MINIMUS
+ * \brief Board specific LED driver header for the MINIMUS.
+ *
+ * Board specific LED driver header for the Minimus USB (http://www.minimususb.com/).
+ *
+ * @{
+ */
+
+#ifndef __LEDS_MINIMUS_H__
+#define __LEDS_MINIMUS_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_LEDS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** LED mask for the first LED on the board. */
+ #define LEDS_LED1 (1 << 5)
+
+ /** LED mask for the second LED on the board. */
+ #define LEDS_LED2 (1 << 6)
+
+ /** LED mask for all the LEDs on the board. */
+ #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2)
+
+ /** LED mask for the none of the board LEDs. */
+ #define LEDS_NO_LEDS 1
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void LEDs_Init(void)
+ {
+ DDRD |= LEDS_ALL_LEDS;
+ PORTD |= LEDS_ALL_LEDS;
+ }
+
+ static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+ {
+ PORTD &= ~LEDMask;
+ }
+
+ static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+ {
+ PORTD |= LEDMask;
+ }
+
+ static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+ {
+ PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask);
+ }
+
+ static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+ const uint8_t ActiveMask)
+ {
+ PORTD = ((PORTD & ~LEDMask) | ActiveMask);
+ }
+
+ static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+ {
+ PORTD ^= LEDMask;
+ }
+
+ static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint8_t LEDs_GetLEDs(void)
+ {
+ return (PORTD & LEDS_ALL_LEDS);
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h b/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h
index d4436d35b..278bee5c7 100644
--- a/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h
+++ b/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h
@@ -1,124 +1,124 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Board specific LED driver header for the Sparkfun ATMEGA8U2 breakout board.
- * \copydetails Group_LEDs_SPARKFUN8U2
- *
- * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
- * dispatch header located in LUFA/Drivers/Board/LEDs.h.
- */
-
-/** \ingroup Group_LEDs
- * \defgroup Group_LEDs_SPARKFUN8U2 SPARKFUN8U2
- * \brief Board specific LED driver header for the Sparkfun ATMEGA8U2 breakout board.
- *
- * Board specific LED driver header for the Sparkfun ATMEGA8U2 breakout board (http://www.sparkfun.com/products/10277).
- *
- * @{
- */
-
-#ifndef __LEDS_SPARKFUN8U2_H__
-#define __LEDS_SPARKFUN8U2_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_LEDS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** LED mask for the first LED on the board. */
- #define LEDS_LED1 (1 << 4)
-
- /** LED mask for all the LEDs on the board. */
- #define LEDS_ALL_LEDS LEDS_LED1
-
- /** LED mask for none of the board LEDs. */
- #define LEDS_NO_LEDS 0
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void LEDs_Init(void)
- {
- DDRB |= LEDS_ALL_LEDS;
- PORTB |= LEDS_ALL_LEDS;
- }
-
- static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
- {
- PORTB &= ~LEDMask;
- }
-
- static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
- {
- PORTB |= LEDMask;
- }
-
- static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
- {
- PORTB = ((PORTB | LEDS_ALL_LEDS) & ~LEDMask);
- }
-
- static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
- const uint8_t ActiveMask)
- {
- PORTB = ((PORTB | LEDMask) & ~ActiveMask);
- }
-
- static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
- {
- PORTB ^= LEDMask;
- }
-
- static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint8_t LEDs_GetLEDs(void)
- {
- return (~PORTB & LEDS_ALL_LEDS);
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Board specific LED driver header for the Sparkfun ATMEGA8U2 breakout board.
+ * \copydetails Group_LEDs_SPARKFUN8U2
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ * dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ * \defgroup Group_LEDs_SPARKFUN8U2 SPARKFUN8U2
+ * \brief Board specific LED driver header for the Sparkfun ATMEGA8U2 breakout board.
+ *
+ * Board specific LED driver header for the Sparkfun ATMEGA8U2 breakout board (http://www.sparkfun.com/products/10277).
+ *
+ * @{
+ */
+
+#ifndef __LEDS_SPARKFUN8U2_H__
+#define __LEDS_SPARKFUN8U2_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_LEDS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** LED mask for the first LED on the board. */
+ #define LEDS_LED1 (1 << 4)
+
+ /** LED mask for all the LEDs on the board. */
+ #define LEDS_ALL_LEDS LEDS_LED1
+
+ /** LED mask for none of the board LEDs. */
+ #define LEDS_NO_LEDS 0
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void LEDs_Init(void)
+ {
+ DDRB |= LEDS_ALL_LEDS;
+ PORTB |= LEDS_ALL_LEDS;
+ }
+
+ static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+ {
+ PORTB &= ~LEDMask;
+ }
+
+ static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+ {
+ PORTB |= LEDMask;
+ }
+
+ static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+ {
+ PORTB = ((PORTB | LEDS_ALL_LEDS) & ~LEDMask);
+ }
+
+ static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+ const uint8_t ActiveMask)
+ {
+ PORTB = ((PORTB | LEDMask) & ~ActiveMask);
+ }
+
+ static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+ {
+ PORTB ^= LEDMask;
+ }
+
+ static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint8_t LEDs_GetLEDs(void)
+ {
+ return (~PORTB & LEDS_ALL_LEDS);
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/Board/AVR8/TUL/Buttons.h b/LUFA/Drivers/Board/AVR8/TUL/Buttons.h
index d4bc5848a..191caa9d2 100644
--- a/LUFA/Drivers/Board/AVR8/TUL/Buttons.h
+++ b/LUFA/Drivers/Board/AVR8/TUL/Buttons.h
@@ -1,92 +1,92 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Board specific Buttons driver header for the TUL.
- * \copydetails Group_Buttons_TUL
- *
- * \note This file should not be included directly. It is automatically included as needed by the Buttons driver
- * dispatch header located in LUFA/Drivers/Board/Buttons.h.
- */
-
-/** \ingroup Group_Buttons
- * \defgroup Group_Buttons_TUL TUL
- * \brief Board specific Buttons driver header for the TUL.
- *
- * Board specific Buttons driver header for the Busware TUL (http://www.busware.de/tiki-index.php?page=TUL).
- *
- * @{
- */
-
-#ifndef __BUTTONS_TUL_H__
-#define __BUTTONS_TUL_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_BUTTONS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** Button mask for the first button on the board. */
- #define BUTTONS_BUTTON1 (1 << 2)
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void Buttons_Init(void)
- {
- DDRE &= ~BUTTONS_BUTTON1;
- PORTE |= BUTTONS_BUTTON1;
- }
-
- static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint8_t Buttons_GetStatus(void)
- {
- return ((PINE & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Board specific Buttons driver header for the TUL.
+ * \copydetails Group_Buttons_TUL
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ * dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ * \defgroup Group_Buttons_TUL TUL
+ * \brief Board specific Buttons driver header for the TUL.
+ *
+ * Board specific Buttons driver header for the Busware TUL (http://www.busware.de/tiki-index.php?page=TUL).
+ *
+ * @{
+ */
+
+#ifndef __BUTTONS_TUL_H__
+#define __BUTTONS_TUL_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_BUTTONS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** Button mask for the first button on the board. */
+ #define BUTTONS_BUTTON1 (1 << 2)
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void Buttons_Init(void)
+ {
+ DDRE &= ~BUTTONS_BUTTON1;
+ PORTE |= BUTTONS_BUTTON1;
+ }
+
+ static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint8_t Buttons_GetStatus(void)
+ {
+ return ((PINE & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1);
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/Board/AVR8/TUL/LEDs.h b/LUFA/Drivers/Board/AVR8/TUL/LEDs.h
index 02b7970ce..4968a1888 100644
--- a/LUFA/Drivers/Board/AVR8/TUL/LEDs.h
+++ b/LUFA/Drivers/Board/AVR8/TUL/LEDs.h
@@ -1,124 +1,124 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Board specific LED driver header for the Busware TUL.
- * \copydetails Group_LEDs_TUL
- *
- * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
- * dispatch header located in LUFA/Drivers/Board/LEDs.h.
- */
-
-/** \ingroup Group_LEDs
- * \defgroup Group_LEDs_TUL TUL
- * \brief Board specific LED driver header for the Busware TUL.
- *
- * Board specific LED driver header for the Busware TUL (http://www.busware.de/tiki-index.php?page=TUL).
- *
- * @{
- */
-
-#ifndef __LEDS_TUL_H__
-#define __LEDS_TUL_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_LEDS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** LED mask for the first LED on the board. */
- #define LEDS_LED1 (1 << 0)
-
- /** LED mask for all the LEDs on the board. */
- #define LEDS_ALL_LEDS LEDS_LED1
-
- /** LED mask for the none of the board LEDs. */
- #define LEDS_NO_LEDS 0
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void LEDs_Init(void)
- {
- DDRF |= LEDS_ALL_LEDS;
- PORTF &= ~LEDS_ALL_LEDS;
- }
-
- static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
- {
- PORTF |= LEDMask;
- }
-
- static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
- {
- PORTF &= ~LEDMask;
- }
-
- static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
- {
- PORTF = ((PORTF & ~LEDS_ALL_LEDS) | LEDMask);
- }
-
- static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
- const uint8_t ActiveMask)
- {
- PORTF = ((PORTF & ~LEDMask) | ActiveMask);
- }
-
- static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
- {
- PORTF ^= LEDMask;
- }
-
- static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint8_t LEDs_GetLEDs(void)
- {
- return (PORTF & LEDS_ALL_LEDS);
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Board specific LED driver header for the Busware TUL.
+ * \copydetails Group_LEDs_TUL
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ * dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ * \defgroup Group_LEDs_TUL TUL
+ * \brief Board specific LED driver header for the Busware TUL.
+ *
+ * Board specific LED driver header for the Busware TUL (http://www.busware.de/tiki-index.php?page=TUL).
+ *
+ * @{
+ */
+
+#ifndef __LEDS_TUL_H__
+#define __LEDS_TUL_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_LEDS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** LED mask for the first LED on the board. */
+ #define LEDS_LED1 (1 << 0)
+
+ /** LED mask for all the LEDs on the board. */
+ #define LEDS_ALL_LEDS LEDS_LED1
+
+ /** LED mask for the none of the board LEDs. */
+ #define LEDS_NO_LEDS 0
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void LEDs_Init(void)
+ {
+ DDRF |= LEDS_ALL_LEDS;
+ PORTF &= ~LEDS_ALL_LEDS;
+ }
+
+ static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask)
+ {
+ PORTF |= LEDMask;
+ }
+
+ static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask)
+ {
+ PORTF &= ~LEDMask;
+ }
+
+ static inline void LEDs_SetAllLEDs(const uint8_t LEDMask)
+ {
+ PORTF = ((PORTF & ~LEDS_ALL_LEDS) | LEDMask);
+ }
+
+ static inline void LEDs_ChangeLEDs(const uint8_t LEDMask,
+ const uint8_t ActiveMask)
+ {
+ PORTF = ((PORTF & ~LEDMask) | ActiveMask);
+ }
+
+ static inline void LEDs_ToggleLEDs(const uint8_t LEDMask)
+ {
+ PORTF ^= LEDMask;
+ }
+
+ static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint8_t LEDs_GetLEDs(void)
+ {
+ return (PORTF & LEDS_ALL_LEDS);
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/Board/UC3/EVK1100/Buttons.h b/LUFA/Drivers/Board/UC3/EVK1100/Buttons.h
index 3f7b04d82..2f05f2c10 100644
--- a/LUFA/Drivers/Board/UC3/EVK1100/Buttons.h
+++ b/LUFA/Drivers/Board/UC3/EVK1100/Buttons.h
@@ -1,103 +1,103 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.fourwalledcubicle.com
-*/
-
-/*
- Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
-
- Permission to use, copy, modify, and distribute this software
- and its documentation for any purpose and without fee is hereby
- granted, 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 disclaim 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 Board specific Buttons driver header for the Atmel EVK1100.
- * \copydetails Group_Buttons_EVK1100
- *
- * \note This file should not be included directly. It is automatically included as needed by the Buttons driver
- * dispatch header located in LUFA/Drivers/Board/Buttons.h.
- */
-
-/** \ingroup Group_Buttons
- * \defgroup Group_Buttons_EVK1100 EVK1100
- * \brief Board specific Buttons driver header for the Atmel EVK1100.
- *
- * Board specific Buttons driver header for the Atmel EVK1100.
- *
- * @{
- */
-
-#ifndef __BUTTONS_EVK1100_H__
-#define __BUTTONS_EVK1100_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_BUTTONS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
- #endif
-
- /* Private Interface - For use in library only: */
- #if !defined(__DOXYGEN__)
- /* Macros: */
- #define BUTTONS_PORT 2
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** Mask of the first button on the board */
- #define BUTTONS_BUTTON1 (1UL << 24)
-
- /** Mask of the second button on the board */
- #define BUTTONS_BUTTON2 (1UL << 21)
-
- /** Mask of the third button on the board */
- #define BUTTONS_BUTTON3 (1UL << 18)
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void Buttons_Init(void)
- {
- AVR32_GPIO.port[BUTTONS_PORT].gpers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
- AVR32_GPIO.port[BUTTONS_PORT].puers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
- }
-
- static inline uint32_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint32_t Buttons_GetStatus(void)
- {
- return (~(AVR32_GPIO.port[JOY_MOVE_PORT].pvr & (BUTTONS_BUTTON1 | BUTTONS_BUTTON2)));
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.fourwalledcubicle.com
+*/
+
+/*
+ Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, and distribute this software
+ and its documentation for any purpose and without fee is hereby
+ granted, 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 disclaim 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 Board specific Buttons driver header for the Atmel EVK1100.
+ * \copydetails Group_Buttons_EVK1100
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ * dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ * \defgroup Group_Buttons_EVK1100 EVK1100
+ * \brief Board specific Buttons driver header for the Atmel EVK1100.
+ *
+ * Board specific Buttons driver header for the Atmel EVK1100.
+ *
+ * @{
+ */
+
+#ifndef __BUTTONS_EVK1100_H__
+#define __BUTTONS_EVK1100_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_BUTTONS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+ #endif
+
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Macros: */
+ #define BUTTONS_PORT 2
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** Mask of the first button on the board */
+ #define BUTTONS_BUTTON1 (1UL << 24)
+
+ /** Mask of the second button on the board */
+ #define BUTTONS_BUTTON2 (1UL << 21)
+
+ /** Mask of the third button on the board */
+ #define BUTTONS_BUTTON3 (1UL << 18)
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void Buttons_Init(void)
+ {
+ AVR32_GPIO.port[BUTTONS_PORT].gpers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+ AVR32_GPIO.port[BUTTONS_PORT].puers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+ }
+
+ static inline uint32_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint32_t Buttons_GetStatus(void)
+ {
+ return (~(AVR32_GPIO.port[JOY_MOVE_PORT].pvr & (BUTTONS_BUTTON1 | BUTTONS_BUTTON2)));
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/UC3/EVK1100/Joystick.h b/LUFA/Drivers/Board/UC3/EVK1100/Joystick.h
index 58108d47a..e35d1b336 100644
--- a/LUFA/Drivers/Board/UC3/EVK1100/Joystick.h
+++ b/LUFA/Drivers/Board/UC3/EVK1100/Joystick.h
@@ -1,110 +1,110 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.fourwalledcubicle.com
-*/
-
-/*
- Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
-
- Permission to use, copy, modify, and distribute this software
- and its documentation for any purpose and without fee is hereby
- granted, 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 disclaim 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 Board specific joystick driver header for the Atmel EVK1100.
- * \copydetails Group_Joystick_EVK1100
- *
- * \note This file should not be included directly. It is automatically included as needed by the joystick driver
- * dispatch header located in LUFA/Drivers/Board/Joystick.h.
- */
-
-/** \ingroup Group_Joystick
- * \defgroup Group_Joystick_EVK1100 EVK1100
- * \brief Board specific joystick driver header for the Atmel EVK1100.
- *
- * Board specific joystick driver header for the Atmel EVK1100.
- *
- * @{
- */
-
-#ifndef __JOYSTICK_EVK1100_H__
-#define __JOYSTICK_EVK1100_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_JOYSTICK_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/Joystick.h instead.
- #endif
-
- /* Private Interface - For use in library only: */
- #if !defined(__DOXYGEN__)
- /* Macros: */
- #define JOY_PORT 0
- #define JOY_MASK ((1UL << 28) | (1UL << 27) | (1UL << 26) | (1UL << 25) | (1UL << 20))
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** Mask for the joystick being pushed in the left direction. */
- #define JOY_LEFT (1UL << 25)
-
- /** Mask for the joystick being pushed in the upward direction. */
- #define JOY_UP (1UL << 26)
-
- /** Mask for the joystick being pushed in the right direction. */
- #define JOY_RIGHT (1UL << 28)
-
- /** Mask for the joystick being pushed in the downward direction. */
- #define JOY_DOWN (1UL << 27)
-
- /** Mask for the joystick being pushed inward. */
- #define JOY_PRESS (1UL << 20)
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void Joystick_Init(void)
- {
- AVR32_GPIO.port[JOY_PORT].gpers = JOY_MASK;
- AVR32_GPIO.port[JOY_PORT].gpers = JOY_MASK;
- };
-
- static inline uint32_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint32_t Joystick_GetStatus(void)
- {
- return (uint32_t)(~(AVR32_GPIO.port[JOY_PORT].pvr & JOY_MASK));
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.fourwalledcubicle.com
+*/
+
+/*
+ Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, and distribute this software
+ and its documentation for any purpose and without fee is hereby
+ granted, 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 disclaim 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 Board specific joystick driver header for the Atmel EVK1100.
+ * \copydetails Group_Joystick_EVK1100
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the joystick driver
+ * dispatch header located in LUFA/Drivers/Board/Joystick.h.
+ */
+
+/** \ingroup Group_Joystick
+ * \defgroup Group_Joystick_EVK1100 EVK1100
+ * \brief Board specific joystick driver header for the Atmel EVK1100.
+ *
+ * Board specific joystick driver header for the Atmel EVK1100.
+ *
+ * @{
+ */
+
+#ifndef __JOYSTICK_EVK1100_H__
+#define __JOYSTICK_EVK1100_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_JOYSTICK_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/Joystick.h instead.
+ #endif
+
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Macros: */
+ #define JOY_PORT 0
+ #define JOY_MASK ((1UL << 28) | (1UL << 27) | (1UL << 26) | (1UL << 25) | (1UL << 20))
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** Mask for the joystick being pushed in the left direction. */
+ #define JOY_LEFT (1UL << 25)
+
+ /** Mask for the joystick being pushed in the upward direction. */
+ #define JOY_UP (1UL << 26)
+
+ /** Mask for the joystick being pushed in the right direction. */
+ #define JOY_RIGHT (1UL << 28)
+
+ /** Mask for the joystick being pushed in the downward direction. */
+ #define JOY_DOWN (1UL << 27)
+
+ /** Mask for the joystick being pushed inward. */
+ #define JOY_PRESS (1UL << 20)
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void Joystick_Init(void)
+ {
+ AVR32_GPIO.port[JOY_PORT].gpers = JOY_MASK;
+ AVR32_GPIO.port[JOY_PORT].gpers = JOY_MASK;
+ };
+
+ static inline uint32_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint32_t Joystick_GetStatus(void)
+ {
+ return (uint32_t)(~(AVR32_GPIO.port[JOY_PORT].pvr & JOY_MASK));
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/UC3/EVK1100/LEDs.h b/LUFA/Drivers/Board/UC3/EVK1100/LEDs.h
index aac407a28..484cedeaf 100644
--- a/LUFA/Drivers/Board/UC3/EVK1100/LEDs.h
+++ b/LUFA/Drivers/Board/UC3/EVK1100/LEDs.h
@@ -1,153 +1,153 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.fourwalledcubicle.com
-*/
-
-/*
- Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
-
- Permission to use, copy, modify, and distribute this software
- and its documentation for any purpose and without fee is hereby
- granted, 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 disclaim 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 Board specific LED driver header for the Atmel EVK1100.
- * \copydetails Group_LEDs_EVK1100
- *
- * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
- * dispatch header located in LUFA/Drivers/Board/LEDs.h.
- */
-
-/** \ingroup Group_LEDs
- * \defgroup Group_LEDs_EVK1100 EVK1100
- * \brief Board specific LED driver header for the Atmel EVK1100.
- *
- * Board specific LED driver header for the Atmel EVK1100.
- *
- * @{
- */
-
-#ifndef __LEDS_EVK1100_H__
-#define __LEDS_EVK1100_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_LEDS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
- #endif
-
- /* Private Interface - For use in library only: */
- #if !defined(__DOXYGEN__)
- /* Macros: */
- #define LEDS_PORT 1
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** LED mask for the first LED on the board. */
- #define LEDS_LED1 (1UL << 19)
-
- /** LED mask for the second LED on the board. */
- #define LEDS_LED2 (1UL << 20)
-
- /** LED mask for the third LED on the board. */
- #define LEDS_LED3 (1UL << 21)
-
- /** LED mask for the fourth LED on the board. */
- #define LEDS_LED4 (1UL << 22)
-
- /** LED mask for the fifth LED on the board. */
- #define LEDS_LED5 (1UL << 27)
-
- /** LED mask for the sixth LED on the board. */
- #define LEDS_LED6 (1UL << 28)
-
- /** LED mask for the seventh LED on the board. */
- #define LEDS_LED7 (1UL << 29)
-
- /** LED mask for the eighth LED on the board. */
- #define LEDS_LED8 (1UL << 30)
-
- /** LED mask for all the LEDs on the board. */
- #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4 \
- LEDS_LED5 | LEDS_LED6 | LEDS_LED7 | LEDS_LED8)
-
- /** LED mask for the none of the board LEDs */
- #define LEDS_NO_LEDS 0
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void LEDs_Init(void)
- {
- AVR32_GPIO.port[LEDS_PORT].gpers = LEDS_ALL_LEDS;
- AVR32_GPIO.port[LEDS_PORT].oders = LEDS_ALL_LEDS;
- AVR32_GPIO.port[LEDS_PORT].ovrs = LEDS_ALL_LEDS;
- }
-
- static inline void LEDs_TurnOnLEDs(const uint32_t LEDMask)
- {
- AVR32_GPIO.port[LEDS_PORT].ovrc = LEDMask;
- }
-
- static inline void LEDs_TurnOffLEDs(const uint32_t LEDMask)
- {
- AVR32_GPIO.port[LEDS_PORT].ovrs = LEDMask;
- }
-
- static inline void LEDs_SetAllLEDs(const uint32_t LEDMask)
- {
- AVR32_GPIO.port[LEDS_PORT].ovrs = LEDS_ALL_LEDS;
- AVR32_GPIO.port[LEDS_PORT].ovrc = LEDMask;
- }
-
- static inline void LEDs_ChangeLEDs(const uint32_t LEDMask, const uint32_t ActiveMask)
- {
- AVR32_GPIO.port[LEDS_PORT].ovrs = LEDMask;
- AVR32_GPIO.port[LEDS_PORT].ovrc = ActiveMask;
- }
-
- static inline void LEDs_ToggleLEDs(const uint32_t LEDMask)
- {
- AVR32_GPIO.port[LEDS_PORT].ovrt = LEDMask;
- }
-
- static inline uint32_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint32_t LEDs_GetLEDs(void)
- {
- return (~AVR32_GPIO.port[LEDS_PORT].ovr & LEDS_ALL_LEDS);
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.fourwalledcubicle.com
+*/
+
+/*
+ Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, and distribute this software
+ and its documentation for any purpose and without fee is hereby
+ granted, 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 disclaim 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 Board specific LED driver header for the Atmel EVK1100.
+ * \copydetails Group_LEDs_EVK1100
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ * dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ * \defgroup Group_LEDs_EVK1100 EVK1100
+ * \brief Board specific LED driver header for the Atmel EVK1100.
+ *
+ * Board specific LED driver header for the Atmel EVK1100.
+ *
+ * @{
+ */
+
+#ifndef __LEDS_EVK1100_H__
+#define __LEDS_EVK1100_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_LEDS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+ #endif
+
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Macros: */
+ #define LEDS_PORT 1
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** LED mask for the first LED on the board. */
+ #define LEDS_LED1 (1UL << 19)
+
+ /** LED mask for the second LED on the board. */
+ #define LEDS_LED2 (1UL << 20)
+
+ /** LED mask for the third LED on the board. */
+ #define LEDS_LED3 (1UL << 21)
+
+ /** LED mask for the fourth LED on the board. */
+ #define LEDS_LED4 (1UL << 22)
+
+ /** LED mask for the fifth LED on the board. */
+ #define LEDS_LED5 (1UL << 27)
+
+ /** LED mask for the sixth LED on the board. */
+ #define LEDS_LED6 (1UL << 28)
+
+ /** LED mask for the seventh LED on the board. */
+ #define LEDS_LED7 (1UL << 29)
+
+ /** LED mask for the eighth LED on the board. */
+ #define LEDS_LED8 (1UL << 30)
+
+ /** LED mask for all the LEDs on the board. */
+ #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4 \
+ LEDS_LED5 | LEDS_LED6 | LEDS_LED7 | LEDS_LED8)
+
+ /** LED mask for the none of the board LEDs */
+ #define LEDS_NO_LEDS 0
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void LEDs_Init(void)
+ {
+ AVR32_GPIO.port[LEDS_PORT].gpers = LEDS_ALL_LEDS;
+ AVR32_GPIO.port[LEDS_PORT].oders = LEDS_ALL_LEDS;
+ AVR32_GPIO.port[LEDS_PORT].ovrs = LEDS_ALL_LEDS;
+ }
+
+ static inline void LEDs_TurnOnLEDs(const uint32_t LEDMask)
+ {
+ AVR32_GPIO.port[LEDS_PORT].ovrc = LEDMask;
+ }
+
+ static inline void LEDs_TurnOffLEDs(const uint32_t LEDMask)
+ {
+ AVR32_GPIO.port[LEDS_PORT].ovrs = LEDMask;
+ }
+
+ static inline void LEDs_SetAllLEDs(const uint32_t LEDMask)
+ {
+ AVR32_GPIO.port[LEDS_PORT].ovrs = LEDS_ALL_LEDS;
+ AVR32_GPIO.port[LEDS_PORT].ovrc = LEDMask;
+ }
+
+ static inline void LEDs_ChangeLEDs(const uint32_t LEDMask, const uint32_t ActiveMask)
+ {
+ AVR32_GPIO.port[LEDS_PORT].ovrs = LEDMask;
+ AVR32_GPIO.port[LEDS_PORT].ovrc = ActiveMask;
+ }
+
+ static inline void LEDs_ToggleLEDs(const uint32_t LEDMask)
+ {
+ AVR32_GPIO.port[LEDS_PORT].ovrt = LEDMask;
+ }
+
+ static inline uint32_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint32_t LEDs_GetLEDs(void)
+ {
+ return (~AVR32_GPIO.port[LEDS_PORT].ovr & LEDS_ALL_LEDS);
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/UC3/EVK1101/Buttons.h b/LUFA/Drivers/Board/UC3/EVK1101/Buttons.h
index 928d8e684..f6770a221 100644
--- a/LUFA/Drivers/Board/UC3/EVK1101/Buttons.h
+++ b/LUFA/Drivers/Board/UC3/EVK1101/Buttons.h
@@ -1,100 +1,100 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.fourwalledcubicle.com
-*/
-
-/*
- Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
-
- Permission to use, copy, modify, and distribute this software
- and its documentation for any purpose and without fee is hereby
- granted, 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 disclaim 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 Board specific Buttons driver header for the Atmel EVK1101.
- * \copydetails Group_Buttons_EVK1101
- *
- * \note This file should not be included directly. It is automatically included as needed by the Buttons driver
- * dispatch header located in LUFA/Drivers/Board/Buttons.h.
- */
-
-/** \ingroup Group_Buttons
- * \defgroup Group_Buttons_EVK1101 EVK1101
- * \brief Board specific Buttons driver header for the Atmel EVK1101.
- *
- * Board specific Buttons driver header for the Atmel EVK1101.
- *
- * @{
- */
-
-#ifndef __BUTTONS_EVK1101_H__
-#define __BUTTONS_EVK1101_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_BUTTONS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
- #endif
-
- /* Private Interface - For use in library only: */
- #if !defined(__DOXYGEN__)
- /* Macros: */
- #define BUTTONS_PORT 1
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** Mask of the first button on the board */
- #define BUTTONS_BUTTON1 (1UL << 2)
-
- /** Mask of the second button on the board */
- #define BUTTONS_BUTTON2 (1UL << 3)
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void Buttons_Init(void)
- {
- AVR32_GPIO.port[BUTTONS_PORT].gpers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
- AVR32_GPIO.port[BUTTONS_PORT].puers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
- }
-
- static inline uint32_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint32_t Buttons_GetStatus(void)
- {
- return (~(AVR32_GPIO.port[JOY_MOVE_PORT].pvr & (BUTTONS_BUTTON1 | BUTTONS_BUTTON2)));
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.fourwalledcubicle.com
+*/
+
+/*
+ Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, and distribute this software
+ and its documentation for any purpose and without fee is hereby
+ granted, 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 disclaim 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 Board specific Buttons driver header for the Atmel EVK1101.
+ * \copydetails Group_Buttons_EVK1101
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ * dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ * \defgroup Group_Buttons_EVK1101 EVK1101
+ * \brief Board specific Buttons driver header for the Atmel EVK1101.
+ *
+ * Board specific Buttons driver header for the Atmel EVK1101.
+ *
+ * @{
+ */
+
+#ifndef __BUTTONS_EVK1101_H__
+#define __BUTTONS_EVK1101_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_BUTTONS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+ #endif
+
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Macros: */
+ #define BUTTONS_PORT 1
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** Mask of the first button on the board */
+ #define BUTTONS_BUTTON1 (1UL << 2)
+
+ /** Mask of the second button on the board */
+ #define BUTTONS_BUTTON2 (1UL << 3)
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void Buttons_Init(void)
+ {
+ AVR32_GPIO.port[BUTTONS_PORT].gpers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+ AVR32_GPIO.port[BUTTONS_PORT].puers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+ }
+
+ static inline uint32_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint32_t Buttons_GetStatus(void)
+ {
+ return (~(AVR32_GPIO.port[JOY_MOVE_PORT].pvr & (BUTTONS_BUTTON1 | BUTTONS_BUTTON2)));
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/UC3/EVK1101/Joystick.h b/LUFA/Drivers/Board/UC3/EVK1101/Joystick.h
index 5085b49e5..892474db7 100644
--- a/LUFA/Drivers/Board/UC3/EVK1101/Joystick.h
+++ b/LUFA/Drivers/Board/UC3/EVK1101/Joystick.h
@@ -1,116 +1,116 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.fourwalledcubicle.com
-*/
-
-/*
- Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
-
- Permission to use, copy, modify, and distribute this software
- and its documentation for any purpose and without fee is hereby
- granted, 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 disclaim 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 Board specific joystick driver header for the Atmel EVK1101.
- * \copydetails Group_Joystick_EVK1101
- *
- * \note This file should not be included directly. It is automatically included as needed by the joystick driver
- * dispatch header located in LUFA/Drivers/Board/Joystick.h.
- */
-
-/** \ingroup Group_Joystick
- * \defgroup Group_Joystick_EVK1101 EVK1101
- * \brief Board specific joystick driver header for the Atmel EVK1101.
- *
- * Board specific joystick driver header for the Atmel EVK1101.
- *
- * @{
- */
-
-#ifndef __JOYSTICK_EVK1101_H__
-#define __JOYSTICK_EVK1101_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_JOYSTICK_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/Joystick.h instead.
- #endif
-
- /* Private Interface - For use in library only: */
- #if !defined(__DOXYGEN__)
- /* Macros: */
- #define JOY_MOVE_PORT 1
- #define JOY_MOVE_MASK ((1UL << 6) | (1UL << 7) | (1UL << 8) | (1UL << 9))
- #define JOY_PRESS_PORT 0
- #define JOY_PRESS_MASK (1UL << 13)
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** Mask for the joystick being pushed in the left direction. */
- #define JOY_LEFT (1UL << 6)
-
- /** Mask for the joystick being pushed in the upward direction. */
- #define JOY_UP (1UL << 7)
-
- /** Mask for the joystick being pushed in the right direction. */
- #define JOY_RIGHT (1UL << 9)
-
- /** Mask for the joystick being pushed in the downward direction. */
- #define JOY_DOWN (1UL << 8)
-
- /** Mask for the joystick being pushed inward. */
- #define JOY_PRESS (1UL << 13)
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void Joystick_Init(void)
- {
- AVR32_GPIO.port[JOY_MOVE_PORT].gpers = JOY_MOVE_MASK;
- AVR32_GPIO.port[JOY_PRESS_PORT].gpers = JOY_PRESS_MASK;
-
- AVR32_GPIO.port[JOY_MOVE_PORT].puers = JOY_MOVE_MASK;
- AVR32_GPIO.port[JOY_PRESS_PORT].puers = JOY_PRESS_MASK;
- };
-
- static inline uint32_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint32_t Joystick_GetStatus(void)
- {
- return (uint32_t)(~((AVR32_GPIO.port[JOY_MOVE_PORT].pvr & JOY_MOVE_MASK) |
- (AVR32_GPIO.port[JOY_PRESS_PORT].pvr & JOY_PRESS_MASK)));
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.fourwalledcubicle.com
+*/
+
+/*
+ Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, and distribute this software
+ and its documentation for any purpose and without fee is hereby
+ granted, 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 disclaim 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 Board specific joystick driver header for the Atmel EVK1101.
+ * \copydetails Group_Joystick_EVK1101
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the joystick driver
+ * dispatch header located in LUFA/Drivers/Board/Joystick.h.
+ */
+
+/** \ingroup Group_Joystick
+ * \defgroup Group_Joystick_EVK1101 EVK1101
+ * \brief Board specific joystick driver header for the Atmel EVK1101.
+ *
+ * Board specific joystick driver header for the Atmel EVK1101.
+ *
+ * @{
+ */
+
+#ifndef __JOYSTICK_EVK1101_H__
+#define __JOYSTICK_EVK1101_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_JOYSTICK_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/Joystick.h instead.
+ #endif
+
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Macros: */
+ #define JOY_MOVE_PORT 1
+ #define JOY_MOVE_MASK ((1UL << 6) | (1UL << 7) | (1UL << 8) | (1UL << 9))
+ #define JOY_PRESS_PORT 0
+ #define JOY_PRESS_MASK (1UL << 13)
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** Mask for the joystick being pushed in the left direction. */
+ #define JOY_LEFT (1UL << 6)
+
+ /** Mask for the joystick being pushed in the upward direction. */
+ #define JOY_UP (1UL << 7)
+
+ /** Mask for the joystick being pushed in the right direction. */
+ #define JOY_RIGHT (1UL << 9)
+
+ /** Mask for the joystick being pushed in the downward direction. */
+ #define JOY_DOWN (1UL << 8)
+
+ /** Mask for the joystick being pushed inward. */
+ #define JOY_PRESS (1UL << 13)
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void Joystick_Init(void)
+ {
+ AVR32_GPIO.port[JOY_MOVE_PORT].gpers = JOY_MOVE_MASK;
+ AVR32_GPIO.port[JOY_PRESS_PORT].gpers = JOY_PRESS_MASK;
+
+ AVR32_GPIO.port[JOY_MOVE_PORT].puers = JOY_MOVE_MASK;
+ AVR32_GPIO.port[JOY_PRESS_PORT].puers = JOY_PRESS_MASK;
+ };
+
+ static inline uint32_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint32_t Joystick_GetStatus(void)
+ {
+ return (uint32_t)(~((AVR32_GPIO.port[JOY_MOVE_PORT].pvr & JOY_MOVE_MASK) |
+ (AVR32_GPIO.port[JOY_PRESS_PORT].pvr & JOY_PRESS_MASK)));
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/UC3/EVK1101/LEDs.h b/LUFA/Drivers/Board/UC3/EVK1101/LEDs.h
index 44720da86..08b19fba4 100644
--- a/LUFA/Drivers/Board/UC3/EVK1101/LEDs.h
+++ b/LUFA/Drivers/Board/UC3/EVK1101/LEDs.h
@@ -1,140 +1,140 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.fourwalledcubicle.com
-*/
-
-/*
- Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
-
- Permission to use, copy, modify, and distribute this software
- and its documentation for any purpose and without fee is hereby
- granted, 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 disclaim 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 Board specific LED driver header for the Atmel EVK1101.
- * \copydetails Group_LEDs_EVK1101
- *
- * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
- * dispatch header located in LUFA/Drivers/Board/LEDs.h.
- */
-
-/** \ingroup Group_LEDs
- * \defgroup Group_LEDs_EVK1101 EVK1101
- * \brief Board specific LED driver header for the Atmel EVK1101.
- *
- * Board specific LED driver header for the Atmel EVK1101.
- *
- * @{
- */
-
-#ifndef __LEDS_EVK1101_H__
-#define __LEDS_EVK1101_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_LEDS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
- #endif
-
- /* Private Interface - For use in library only: */
- #if !defined(__DOXYGEN__)
- /* Macros: */
- #define LEDS_PORT 0
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** LED mask for the first LED on the board. */
- #define LEDS_LED1 (1UL << 7)
-
- /** LED mask for the second LED on the board. */
- #define LEDS_LED2 (1UL << 8)
-
- /** LED mask for the third LED on the board. */
- #define LEDS_LED3 (1UL << 21)
-
- /** LED mask for the fourth LED on the board. */
- #define LEDS_LED4 (1UL << 22)
-
- /** LED mask for all the LEDs on the board. */
- #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
-
- /** LED mask for the none of the board LEDs */
- #define LEDS_NO_LEDS 0
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void LEDs_Init(void)
- {
- AVR32_GPIO.port[LEDS_PORT].gpers = LEDS_ALL_LEDS;
- AVR32_GPIO.port[LEDS_PORT].oders = LEDS_ALL_LEDS;
- AVR32_GPIO.port[LEDS_PORT].ovrs = LEDS_ALL_LEDS;
- }
-
- static inline void LEDs_TurnOnLEDs(const uint32_t LEDMask)
- {
- AVR32_GPIO.port[LEDS_PORT].ovrc = LEDMask;
- }
-
- static inline void LEDs_TurnOffLEDs(const uint32_t LEDMask)
- {
- AVR32_GPIO.port[LEDS_PORT].ovrs = LEDMask;
- }
-
- static inline void LEDs_SetAllLEDs(const uint32_t LEDMask)
- {
- AVR32_GPIO.port[LEDS_PORT].ovrs = LEDS_ALL_LEDS;
- AVR32_GPIO.port[LEDS_PORT].ovrc = LEDMask;
- }
-
- static inline void LEDs_ChangeLEDs(const uint32_t LEDMask, const uint32_t ActiveMask)
- {
- AVR32_GPIO.port[LEDS_PORT].ovrs = LEDMask;
- AVR32_GPIO.port[LEDS_PORT].ovrc = ActiveMask;
- }
-
- static inline void LEDs_ToggleLEDs(const uint32_t LEDMask)
- {
- AVR32_GPIO.port[LEDS_PORT].ovrt = LEDMask;
- }
-
- static inline uint32_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint32_t LEDs_GetLEDs(void)
- {
- return (~AVR32_GPIO.port[LEDS_PORT].ovr & LEDS_ALL_LEDS);
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.fourwalledcubicle.com
+*/
+
+/*
+ Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, and distribute this software
+ and its documentation for any purpose and without fee is hereby
+ granted, 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 disclaim 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 Board specific LED driver header for the Atmel EVK1101.
+ * \copydetails Group_LEDs_EVK1101
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ * dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ * \defgroup Group_LEDs_EVK1101 EVK1101
+ * \brief Board specific LED driver header for the Atmel EVK1101.
+ *
+ * Board specific LED driver header for the Atmel EVK1101.
+ *
+ * @{
+ */
+
+#ifndef __LEDS_EVK1101_H__
+#define __LEDS_EVK1101_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_LEDS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+ #endif
+
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Macros: */
+ #define LEDS_PORT 0
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** LED mask for the first LED on the board. */
+ #define LEDS_LED1 (1UL << 7)
+
+ /** LED mask for the second LED on the board. */
+ #define LEDS_LED2 (1UL << 8)
+
+ /** LED mask for the third LED on the board. */
+ #define LEDS_LED3 (1UL << 21)
+
+ /** LED mask for the fourth LED on the board. */
+ #define LEDS_LED4 (1UL << 22)
+
+ /** LED mask for all the LEDs on the board. */
+ #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+
+ /** LED mask for the none of the board LEDs */
+ #define LEDS_NO_LEDS 0
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void LEDs_Init(void)
+ {
+ AVR32_GPIO.port[LEDS_PORT].gpers = LEDS_ALL_LEDS;
+ AVR32_GPIO.port[LEDS_PORT].oders = LEDS_ALL_LEDS;
+ AVR32_GPIO.port[LEDS_PORT].ovrs = LEDS_ALL_LEDS;
+ }
+
+ static inline void LEDs_TurnOnLEDs(const uint32_t LEDMask)
+ {
+ AVR32_GPIO.port[LEDS_PORT].ovrc = LEDMask;
+ }
+
+ static inline void LEDs_TurnOffLEDs(const uint32_t LEDMask)
+ {
+ AVR32_GPIO.port[LEDS_PORT].ovrs = LEDMask;
+ }
+
+ static inline void LEDs_SetAllLEDs(const uint32_t LEDMask)
+ {
+ AVR32_GPIO.port[LEDS_PORT].ovrs = LEDS_ALL_LEDS;
+ AVR32_GPIO.port[LEDS_PORT].ovrc = LEDMask;
+ }
+
+ static inline void LEDs_ChangeLEDs(const uint32_t LEDMask, const uint32_t ActiveMask)
+ {
+ AVR32_GPIO.port[LEDS_PORT].ovrs = LEDMask;
+ AVR32_GPIO.port[LEDS_PORT].ovrc = ActiveMask;
+ }
+
+ static inline void LEDs_ToggleLEDs(const uint32_t LEDMask)
+ {
+ AVR32_GPIO.port[LEDS_PORT].ovrt = LEDMask;
+ }
+
+ static inline uint32_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint32_t LEDs_GetLEDs(void)
+ {
+ return (~AVR32_GPIO.port[LEDS_PORT].ovr & LEDS_ALL_LEDS);
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/UC3/EVK1104/Buttons.h b/LUFA/Drivers/Board/UC3/EVK1104/Buttons.h
index 35f2bfadf..0b30c2315 100644
--- a/LUFA/Drivers/Board/UC3/EVK1104/Buttons.h
+++ b/LUFA/Drivers/Board/UC3/EVK1104/Buttons.h
@@ -1,97 +1,97 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.fourwalledcubicle.com
-*/
-
-/*
- Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
-
- Permission to use, copy, modify, and distribute this software
- and its documentation for any purpose and without fee is hereby
- granted, 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 disclaim 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 Board specific Buttons driver header for the Atmel EVK1104.
- * \copydetails Group_Buttons_EVK1104
- *
- * \note This file should not be included directly. It is automatically included as needed by the Buttons driver
- * dispatch header located in LUFA/Drivers/Board/Buttons.h.
- */
-
-/** \ingroup Group_Buttons
- * \defgroup Group_Buttons_EVK1104 EVK1104
- * \brief Board specific Buttons driver header for the Atmel EVK1104.
- *
- * Board specific Buttons driver header for the Atmel EVK1104.
- *
- * @{
- */
-
-#ifndef __BUTTONS_EVK1104_H__
-#define __BUTTONS_EVK1104_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_BUTTONS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
- #endif
-
- /* Private Interface - For use in library only: */
- #if !defined(__DOXYGEN__)
- /* Macros: */
- #define BUTTONS_PORT 1
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** Mask of the first button on the board */
- #define BUTTONS_BUTTON1 (1UL << 10)
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void Buttons_Init(void)
- {
- AVR32_GPIO.port[BUTTONS_PORT].gpers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
- AVR32_GPIO.port[BUTTONS_PORT].puers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
- }
-
- static inline uint32_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint32_t Buttons_GetStatus(void)
- {
- return (~(AVR32_GPIO.port[JOY_MOVE_PORT].pvr & (BUTTONS_BUTTON1 | BUTTONS_BUTTON2)));
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.fourwalledcubicle.com
+*/
+
+/*
+ Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, and distribute this software
+ and its documentation for any purpose and without fee is hereby
+ granted, 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 disclaim 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 Board specific Buttons driver header for the Atmel EVK1104.
+ * \copydetails Group_Buttons_EVK1104
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the Buttons driver
+ * dispatch header located in LUFA/Drivers/Board/Buttons.h.
+ */
+
+/** \ingroup Group_Buttons
+ * \defgroup Group_Buttons_EVK1104 EVK1104
+ * \brief Board specific Buttons driver header for the Atmel EVK1104.
+ *
+ * Board specific Buttons driver header for the Atmel EVK1104.
+ *
+ * @{
+ */
+
+#ifndef __BUTTONS_EVK1104_H__
+#define __BUTTONS_EVK1104_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_BUTTONS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/Buttons.h instead.
+ #endif
+
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Macros: */
+ #define BUTTONS_PORT 1
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** Mask of the first button on the board */
+ #define BUTTONS_BUTTON1 (1UL << 10)
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void Buttons_Init(void)
+ {
+ AVR32_GPIO.port[BUTTONS_PORT].gpers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+ AVR32_GPIO.port[BUTTONS_PORT].puers = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2);
+ }
+
+ static inline uint32_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint32_t Buttons_GetStatus(void)
+ {
+ return (~(AVR32_GPIO.port[JOY_MOVE_PORT].pvr & (BUTTONS_BUTTON1 | BUTTONS_BUTTON2)));
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Drivers/Board/UC3/EVK1104/LEDs.h b/LUFA/Drivers/Board/UC3/EVK1104/LEDs.h
index 963bd1b9c..6e26cc893 100644
--- a/LUFA/Drivers/Board/UC3/EVK1104/LEDs.h
+++ b/LUFA/Drivers/Board/UC3/EVK1104/LEDs.h
@@ -1,154 +1,154 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.fourwalledcubicle.com
-*/
-
-/*
- Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
-
- Permission to use, copy, modify, and distribute this software
- and its documentation for any purpose and without fee is hereby
- granted, 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 disclaim 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 Board specific LED driver header for the Atmel EVK1104.
- * \copydetails Group_LEDs_EVK1104
- *
- * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
- * dispatch header located in LUFA/Drivers/Board/LEDs.h.
- */
-
-/** \ingroup Group_LEDs
- * \defgroup Group_LEDs_EVK1104 EVK1104
- * \brief Board specific LED driver header for the Atmel EVK1104.
- *
- * Board specific LED driver header for the Atmel EVK1104.
- *
- * @{
- */
-
-#ifndef __LEDS_EVK1104_H__
-#define __LEDS_EVK1104_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Preprocessor Checks: */
- #if !defined(__INCLUDE_FROM_LEDS_H)
- #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
- #endif
-
- /* Private Interface - For use in library only: */
- #if !defined(__DOXYGEN__)
- /* Macros: */
- #define LEDS_LEDMASK2 (1UL << 3)
- #define LEDS_LEDMASK3 ((1UL << 9) | (1UL << 6) | (1UL << 5))
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** LED mask for the first LED on the board. */
- #define LEDS_LED1 (1UL << 3)
-
- /** LED mask for the second LED on the board. */
- #define LEDS_LED2 (1UL << 5)
-
- /** LED mask for the third LED on the board. */
- #define LEDS_LED3 (1UL << 9)
-
- /** LED mask for the fourth LED on the board. */
- #define LEDS_LED4 (1UL << 6)
-
- /** LED mask for all the LEDs on the board. */
- #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
-
- /** LED mask for the none of the board LEDs */
- #define LEDS_NO_LEDS 0
-
- /* Inline Functions: */
- #if !defined(__DOXYGEN__)
- static inline void LEDs_Init(void)
- {
- AVR32_GPIO.port[2].gpers = LEDS_LEDMASK2;
- AVR32_GPIO.port[2].oders = LEDS_LEDMASK2;
- AVR32_GPIO.port[2].ovrs = LEDS_LEDMASK2;
-
- AVR32_GPIO.port[3].gpers = LEDS_LEDMASK3;
- AVR32_GPIO.port[3].oders = LEDS_LEDMASK3;
- AVR32_GPIO.port[3].ovrs = LEDS_LEDMASK3;
- }
-
- static inline void LEDs_TurnOnLEDs(const uint32_t LEDMask)
- {
- AVR32_GPIO.port[2].ovrc = (LEDMask & LEDS_LEDMASK2);
- AVR32_GPIO.port[3].ovrc = (LEDMask & LEDS_LEDMASK3);
- }
-
- static inline void LEDs_TurnOffLEDs(const uint32_t LEDMask)
- {
- AVR32_GPIO.port[2].ovrs = (LEDMask & LEDS_LEDMASK2);
- AVR32_GPIO.port[3].ovrs = (LEDMask & LEDS_LEDMASK3);
- }
-
- static inline void LEDs_SetAllLEDs(const uint32_t LEDMask)
- {
- AVR32_GPIO.port[2].ovrs = LEDS_LEDMASK2;
- AVR32_GPIO.port[2].ovrc = (LEDMask & LEDS_LEDMASK2);
-
- AVR32_GPIO.port[3].ovrs = LEDS_LEDMASK3;
- AVR32_GPIO.port[3].ovrc = (LEDMask & LEDS_LEDMASK3);
- }
-
- static inline void LEDs_ChangeLEDs(const uint32_t LEDMask, const uint32_t ActiveMask)
- {
- AVR32_GPIO.port[2].ovrs = (LEDMask & LEDS_LEDMASK2);
- AVR32_GPIO.port[2].ovrc = (ActiveMask & LEDS_LEDMASK2);
-
- AVR32_GPIO.port[3].ovrs = (LEDMask & LEDS_LEDMASK3);
- AVR32_GPIO.port[3].ovrc = (ActiveMask & LEDS_LEDMASK3);
- }
-
- static inline void LEDs_ToggleLEDs(const uint32_t LEDMask)
- {
- AVR32_GPIO.port[2].ovrt = (LEDMask & LEDS_LEDMASK2);
- AVR32_GPIO.port[3].ovrt = (LEDMask & LEDS_LEDMASK3);
- }
-
- static inline uint32_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
- static inline uint32_t LEDs_GetLEDs(void)
- {
- return ((~AVR32_GPIO.port[2].ovr & LEDS_LEDMASK2) | (~AVR32_GPIO.port[3].ovr & LEDS_LEDMASK3));
- }
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.fourwalledcubicle.com
+*/
+
+/*
+ Copyright 2011 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+
+ Permission to use, copy, modify, and distribute this software
+ and its documentation for any purpose and without fee is hereby
+ granted, 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 disclaim 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 Board specific LED driver header for the Atmel EVK1104.
+ * \copydetails Group_LEDs_EVK1104
+ *
+ * \note This file should not be included directly. It is automatically included as needed by the LEDs driver
+ * dispatch header located in LUFA/Drivers/Board/LEDs.h.
+ */
+
+/** \ingroup Group_LEDs
+ * \defgroup Group_LEDs_EVK1104 EVK1104
+ * \brief Board specific LED driver header for the Atmel EVK1104.
+ *
+ * Board specific LED driver header for the Atmel EVK1104.
+ *
+ * @{
+ */
+
+#ifndef __LEDS_EVK1104_H__
+#define __LEDS_EVK1104_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Preprocessor Checks: */
+ #if !defined(__INCLUDE_FROM_LEDS_H)
+ #error Do not include this file directly. Include LUFA/Drivers/Board/LEDS.h instead.
+ #endif
+
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Macros: */
+ #define LEDS_LEDMASK2 (1UL << 3)
+ #define LEDS_LEDMASK3 ((1UL << 9) | (1UL << 6) | (1UL << 5))
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** LED mask for the first LED on the board. */
+ #define LEDS_LED1 (1UL << 3)
+
+ /** LED mask for the second LED on the board. */
+ #define LEDS_LED2 (1UL << 5)
+
+ /** LED mask for the third LED on the board. */
+ #define LEDS_LED3 (1UL << 9)
+
+ /** LED mask for the fourth LED on the board. */
+ #define LEDS_LED4 (1UL << 6)
+
+ /** LED mask for all the LEDs on the board. */
+ #define LEDS_ALL_LEDS (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4)
+
+ /** LED mask for the none of the board LEDs */
+ #define LEDS_NO_LEDS 0
+
+ /* Inline Functions: */
+ #if !defined(__DOXYGEN__)
+ static inline void LEDs_Init(void)
+ {
+ AVR32_GPIO.port[2].gpers = LEDS_LEDMASK2;
+ AVR32_GPIO.port[2].oders = LEDS_LEDMASK2;
+ AVR32_GPIO.port[2].ovrs = LEDS_LEDMASK2;
+
+ AVR32_GPIO.port[3].gpers = LEDS_LEDMASK3;
+ AVR32_GPIO.port[3].oders = LEDS_LEDMASK3;
+ AVR32_GPIO.port[3].ovrs = LEDS_LEDMASK3;
+ }
+
+ static inline void LEDs_TurnOnLEDs(const uint32_t LEDMask)
+ {
+ AVR32_GPIO.port[2].ovrc = (LEDMask & LEDS_LEDMASK2);
+ AVR32_GPIO.port[3].ovrc = (LEDMask & LEDS_LEDMASK3);
+ }
+
+ static inline void LEDs_TurnOffLEDs(const uint32_t LEDMask)
+ {
+ AVR32_GPIO.port[2].ovrs = (LEDMask & LEDS_LEDMASK2);
+ AVR32_GPIO.port[3].ovrs = (LEDMask & LEDS_LEDMASK3);
+ }
+
+ static inline void LEDs_SetAllLEDs(const uint32_t LEDMask)
+ {
+ AVR32_GPIO.port[2].ovrs = LEDS_LEDMASK2;
+ AVR32_GPIO.port[2].ovrc = (LEDMask & LEDS_LEDMASK2);
+
+ AVR32_GPIO.port[3].ovrs = LEDS_LEDMASK3;
+ AVR32_GPIO.port[3].ovrc = (LEDMask & LEDS_LEDMASK3);
+ }
+
+ static inline void LEDs_ChangeLEDs(const uint32_t LEDMask, const uint32_t ActiveMask)
+ {
+ AVR32_GPIO.port[2].ovrs = (LEDMask & LEDS_LEDMASK2);
+ AVR32_GPIO.port[2].ovrc = (ActiveMask & LEDS_LEDMASK2);
+
+ AVR32_GPIO.port[3].ovrs = (LEDMask & LEDS_LEDMASK3);
+ AVR32_GPIO.port[3].ovrc = (ActiveMask & LEDS_LEDMASK3);
+ }
+
+ static inline void LEDs_ToggleLEDs(const uint32_t LEDMask)
+ {
+ AVR32_GPIO.port[2].ovrt = (LEDMask & LEDS_LEDMASK2);
+ AVR32_GPIO.port[3].ovrt = (LEDMask & LEDS_LEDMASK3);
+ }
+
+ static inline uint32_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT;
+ static inline uint32_t LEDs_GetLEDs(void)
+ {
+ return ((~AVR32_GPIO.port[2].ovr & LEDS_LEDMASK2) | (~AVR32_GPIO.port[3].ovr & LEDS_LEDMASK3));
+ }
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Drivers/Misc/AT45DB321C.h b/LUFA/Drivers/Misc/AT45DB321C.h
index 725738bcf..e06cdc4b7 100644
--- a/LUFA/Drivers/Misc/AT45DB321C.h
+++ b/LUFA/Drivers/Misc/AT45DB321C.h
@@ -1,99 +1,99 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Command constants for the Atmel AT45DB321C Dataflash.
- * \copydetails Group_AT45DB321C
- */
-
-/** \ingroup Group_MiscDrivers
- * \defgroup Group_AT45DB321C Atmel AT45DB321C Dataflash Commands
- * \brief Command constants for the Atmel AT45DB321C Dataflash.
- *
- * Dataflash command constants for the Atmel AT45DB321C Dataflash IC.
- *
- * @{
- */
-
-#ifndef __AT45DB321C_CMDS_H__
-#define __AT45DB321C_CMDS_H__
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** \name Dataflash Status Values */
- //@{
- #define DF_STATUS_READY (1 << 7)
- #define DF_STATUS_COMPMISMATCH (1 << 6)
- #define DF_STATUS_SECTORPROTECTION_ON (1 << 1)
- //@}
-
- #define DF_MANUFACTURER_ATMEL 0x1F
-
- /** \name Dataflash Commands */
- //@{
- #define DF_CMD_GETSTATUS 0xD7
-
- #define DF_CMD_MAINMEMTOBUFF1 0x53
- #define DF_CMD_MAINMEMTOBUFF2 0x55
- #define DF_CMD_MAINMEMTOBUFF1COMP 0x60
- #define DF_CMD_MAINMEMTOBUFF2COMP 0x61
- #define DF_CMD_AUTOREWRITEBUFF1 0x58
- #define DF_CMD_AUTOREWRITEBUFF2 0x59
-
- #define DF_CMD_MAINMEMPAGEREAD 0xD2
- #define DF_CMD_CONTARRAYREAD_LF 0xE8
- #define DF_CMD_BUFF1READ_LF 0xD4
- #define DF_CMD_BUFF2READ_LF 0xD6
-
- #define DF_CMD_BUFF1WRITE 0x84
- #define DF_CMD_BUFF2WRITE 0x87
- #define DF_CMD_BUFF1TOMAINMEMWITHERASE 0x83
- #define DF_CMD_BUFF2TOMAINMEMWITHERASE 0x86
- #define DF_CMD_BUFF1TOMAINMEM 0x88
- #define DF_CMD_BUFF2TOMAINMEM 0x89
- #define DF_CMD_MAINMEMPAGETHROUGHBUFF1 0x82
- #define DF_CMD_MAINMEMPAGETHROUGHBUFF2 0x85
-
- #define DF_CMD_PAGEERASE 0x81
- #define DF_CMD_BLOCKERASE 0x50
-
- #define DF_CMD_SECTORPROTECTIONOFF ((char[]){0x3D, 0x2A, 0x7F, 0xCF})
- #define DF_CMD_SECTORPROTECTIONOFF_BYTE1 0x3D
- #define DF_CMD_SECTORPROTECTIONOFF_BYTE2 0x2A
- #define DF_CMD_SECTORPROTECTIONOFF_BYTE3 0x7F
- #define DF_CMD_SECTORPROTECTIONOFF_BYTE4 0xCF
-
- #define DF_CMD_READMANUFACTURERDEVICEINFO 0x9F
- //@}
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Command constants for the Atmel AT45DB321C Dataflash.
+ * \copydetails Group_AT45DB321C
+ */
+
+/** \ingroup Group_MiscDrivers
+ * \defgroup Group_AT45DB321C Atmel AT45DB321C Dataflash Commands
+ * \brief Command constants for the Atmel AT45DB321C Dataflash.
+ *
+ * Dataflash command constants for the Atmel AT45DB321C Dataflash IC.
+ *
+ * @{
+ */
+
+#ifndef __AT45DB321C_CMDS_H__
+#define __AT45DB321C_CMDS_H__
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** \name Dataflash Status Values */
+ //@{
+ #define DF_STATUS_READY (1 << 7)
+ #define DF_STATUS_COMPMISMATCH (1 << 6)
+ #define DF_STATUS_SECTORPROTECTION_ON (1 << 1)
+ //@}
+
+ #define DF_MANUFACTURER_ATMEL 0x1F
+
+ /** \name Dataflash Commands */
+ //@{
+ #define DF_CMD_GETSTATUS 0xD7
+
+ #define DF_CMD_MAINMEMTOBUFF1 0x53
+ #define DF_CMD_MAINMEMTOBUFF2 0x55
+ #define DF_CMD_MAINMEMTOBUFF1COMP 0x60
+ #define DF_CMD_MAINMEMTOBUFF2COMP 0x61
+ #define DF_CMD_AUTOREWRITEBUFF1 0x58
+ #define DF_CMD_AUTOREWRITEBUFF2 0x59
+
+ #define DF_CMD_MAINMEMPAGEREAD 0xD2
+ #define DF_CMD_CONTARRAYREAD_LF 0xE8
+ #define DF_CMD_BUFF1READ_LF 0xD4
+ #define DF_CMD_BUFF2READ_LF 0xD6
+
+ #define DF_CMD_BUFF1WRITE 0x84
+ #define DF_CMD_BUFF2WRITE 0x87
+ #define DF_CMD_BUFF1TOMAINMEMWITHERASE 0x83
+ #define DF_CMD_BUFF2TOMAINMEMWITHERASE 0x86
+ #define DF_CMD_BUFF1TOMAINMEM 0x88
+ #define DF_CMD_BUFF2TOMAINMEM 0x89
+ #define DF_CMD_MAINMEMPAGETHROUGHBUFF1 0x82
+ #define DF_CMD_MAINMEMPAGETHROUGHBUFF2 0x85
+
+ #define DF_CMD_PAGEERASE 0x81
+ #define DF_CMD_BLOCKERASE 0x50
+
+ #define DF_CMD_SECTORPROTECTIONOFF ((char[]){0x3D, 0x2A, 0x7F, 0xCF})
+ #define DF_CMD_SECTORPROTECTIONOFF_BYTE1 0x3D
+ #define DF_CMD_SECTORPROTECTIONOFF_BYTE2 0x2A
+ #define DF_CMD_SECTORPROTECTIONOFF_BYTE3 0x7F
+ #define DF_CMD_SECTORPROTECTIONOFF_BYTE4 0xCF
+
+ #define DF_CMD_READMANUFACTURERDEVICEINFO 0x9F
+ //@}
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/Misc/AT45DB642D.h b/LUFA/Drivers/Misc/AT45DB642D.h
index 98041167e..0cbf3da8f 100644
--- a/LUFA/Drivers/Misc/AT45DB642D.h
+++ b/LUFA/Drivers/Misc/AT45DB642D.h
@@ -1,109 +1,109 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Command constants for the Atmel AT45DB642D Dataflash.
- * \copydetails Group_AT45DB642D
- */
-
-/** \ingroup Group_MiscDrivers
- * \defgroup Group_AT45DB642D Atmel AT45DB642D Dataflash Commands
- * \brief Command constants for the Atmel AT45DB642D Dataflash.
- *
- * Dataflash command constants for the Atmel AT45DB642D Dataflash IC.
- *
- * @{
- */
-
-#ifndef __AT45DB642D_CMDS_H__
-#define __AT45DB642D_CMDS_H__
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** \name Dataflash Status Values */
- //@{
- #define DF_STATUS_READY (1 << 7)
- #define DF_STATUS_COMPMISMATCH (1 << 6)
- #define DF_STATUS_SECTORPROTECTION_ON (1 << 1)
- #define DF_STATUS_BINARYPAGESIZE_ON (1 << 0)
- //@}
-
- #define DF_MANUFACTURER_ATMEL 0x1F
-
- /** \name Dataflash Commands */
- //@{
- #define DF_CMD_GETSTATUS 0xD7
- #define DF_CMD_POWERDOWN 0xB9
- #define DF_CMD_WAKEUP 0xAB
-
- #define DF_CMD_MAINMEMTOBUFF1 0x53
- #define DF_CMD_MAINMEMTOBUFF2 0x55
- #define DF_CMD_MAINMEMTOBUFF1COMP 0x60
- #define DF_CMD_MAINMEMTOBUFF2COMP 0x61
- #define DF_CMD_AUTOREWRITEBUFF1 0x58
- #define DF_CMD_AUTOREWRITEBUFF2 0x59
-
- #define DF_CMD_MAINMEMPAGEREAD 0xD2
- #define DF_CMD_CONTARRAYREAD_LF 0x03
- #define DF_CMD_BUFF1READ_LF 0xD1
- #define DF_CMD_BUFF2READ_LF 0xD3
-
- #define DF_CMD_BUFF1WRITE 0x84
- #define DF_CMD_BUFF2WRITE 0x87
- #define DF_CMD_BUFF1TOMAINMEMWITHERASE 0x83
- #define DF_CMD_BUFF2TOMAINMEMWITHERASE 0x86
- #define DF_CMD_BUFF1TOMAINMEM 0x88
- #define DF_CMD_BUFF2TOMAINMEM 0x89
- #define DF_CMD_MAINMEMPAGETHROUGHBUFF1 0x82
- #define DF_CMD_MAINMEMPAGETHROUGHBUFF2 0x85
-
- #define DF_CMD_PAGEERASE 0x81
- #define DF_CMD_BLOCKERASE 0x50
- #define DF_CMD_SECTORERASE 0x7C
-
- #define DF_CMD_CHIPERASE ((char[]){0xC7, 0x94, 0x80, 0x9A})
- #define DF_CMD_CHIPERASE_BYTE1 0xC7
- #define DF_CMD_CHIPERASE_BYTE2 0x94
- #define DF_CMD_CHIPERASE_BYTE3 0x80
- #define DF_CMD_CHIPERASE_BYTE4 0x9A
-
- #define DF_CMD_SECTORPROTECTIONOFF ((char[]){0x3D, 0x2A, 0x7F, 0x9A})
- #define DF_CMD_SECTORPROTECTIONOFF_BYTE1 0x3D
- #define DF_CMD_SECTORPROTECTIONOFF_BYTE2 0x2A
- #define DF_CMD_SECTORPROTECTIONOFF_BYTE3 0x7F
- #define DF_CMD_SECTORPROTECTIONOFF_BYTE4 0x9A
-
- #define DF_CMD_READMANUFACTURERDEVICEINFO 0x9F
- //@}
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Command constants for the Atmel AT45DB642D Dataflash.
+ * \copydetails Group_AT45DB642D
+ */
+
+/** \ingroup Group_MiscDrivers
+ * \defgroup Group_AT45DB642D Atmel AT45DB642D Dataflash Commands
+ * \brief Command constants for the Atmel AT45DB642D Dataflash.
+ *
+ * Dataflash command constants for the Atmel AT45DB642D Dataflash IC.
+ *
+ * @{
+ */
+
+#ifndef __AT45DB642D_CMDS_H__
+#define __AT45DB642D_CMDS_H__
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** \name Dataflash Status Values */
+ //@{
+ #define DF_STATUS_READY (1 << 7)
+ #define DF_STATUS_COMPMISMATCH (1 << 6)
+ #define DF_STATUS_SECTORPROTECTION_ON (1 << 1)
+ #define DF_STATUS_BINARYPAGESIZE_ON (1 << 0)
+ //@}
+
+ #define DF_MANUFACTURER_ATMEL 0x1F
+
+ /** \name Dataflash Commands */
+ //@{
+ #define DF_CMD_GETSTATUS 0xD7
+ #define DF_CMD_POWERDOWN 0xB9
+ #define DF_CMD_WAKEUP 0xAB
+
+ #define DF_CMD_MAINMEMTOBUFF1 0x53
+ #define DF_CMD_MAINMEMTOBUFF2 0x55
+ #define DF_CMD_MAINMEMTOBUFF1COMP 0x60
+ #define DF_CMD_MAINMEMTOBUFF2COMP 0x61
+ #define DF_CMD_AUTOREWRITEBUFF1 0x58
+ #define DF_CMD_AUTOREWRITEBUFF2 0x59
+
+ #define DF_CMD_MAINMEMPAGEREAD 0xD2
+ #define DF_CMD_CONTARRAYREAD_LF 0x03
+ #define DF_CMD_BUFF1READ_LF 0xD1
+ #define DF_CMD_BUFF2READ_LF 0xD3
+
+ #define DF_CMD_BUFF1WRITE 0x84
+ #define DF_CMD_BUFF2WRITE 0x87
+ #define DF_CMD_BUFF1TOMAINMEMWITHERASE 0x83
+ #define DF_CMD_BUFF2TOMAINMEMWITHERASE 0x86
+ #define DF_CMD_BUFF1TOMAINMEM 0x88
+ #define DF_CMD_BUFF2TOMAINMEM 0x89
+ #define DF_CMD_MAINMEMPAGETHROUGHBUFF1 0x82
+ #define DF_CMD_MAINMEMPAGETHROUGHBUFF2 0x85
+
+ #define DF_CMD_PAGEERASE 0x81
+ #define DF_CMD_BLOCKERASE 0x50
+ #define DF_CMD_SECTORERASE 0x7C
+
+ #define DF_CMD_CHIPERASE ((char[]){0xC7, 0x94, 0x80, 0x9A})
+ #define DF_CMD_CHIPERASE_BYTE1 0xC7
+ #define DF_CMD_CHIPERASE_BYTE2 0x94
+ #define DF_CMD_CHIPERASE_BYTE3 0x80
+ #define DF_CMD_CHIPERASE_BYTE4 0x9A
+
+ #define DF_CMD_SECTORPROTECTIONOFF ((char[]){0x3D, 0x2A, 0x7F, 0x9A})
+ #define DF_CMD_SECTORPROTECTIONOFF_BYTE1 0x3D
+ #define DF_CMD_SECTORPROTECTIONOFF_BYTE2 0x2A
+ #define DF_CMD_SECTORPROTECTIONOFF_BYTE3 0x7F
+ #define DF_CMD_SECTORPROTECTIONOFF_BYTE4 0x9A
+
+ #define DF_CMD_READMANUFACTURERDEVICEINFO 0x9F
+ //@}
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/Misc/RingBuffer.h b/LUFA/Drivers/Misc/RingBuffer.h
index 64587e64c..3c5552143 100644
--- a/LUFA/Drivers/Misc/RingBuffer.h
+++ b/LUFA/Drivers/Misc/RingBuffer.h
@@ -1,303 +1,303 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Lightweight ring (circular) buffer, for fast insertion/deletion of bytes.
- *
- * Lightweight ring buffer, for fast insertion/deletion. Multiple buffers can be created of
- * different sizes to suit different needs.
- *
- * Note that for each buffer, insertion and removal operations may occur at the same time (via
- * a multi-threaded ISR based system) however the same kind of operation (two or more insertions
- * or deletions) must not overlap. If there is possibility of two or more of the same kind of
- * operating occurring at the same point in time, atomic (mutex) locking should be used.
- */
-
-/** \ingroup Group_MiscDrivers
- * \defgroup Group_RingBuff Generic Byte Ring Buffer - LUFA/Drivers/Misc/RingBuffer.h
- * \brief Lightweight ring buffer, for fast insertion/deletion of bytes.
- *
- * \section Sec_Dependencies Module Source Dependencies
- * The following files must be built with any user project that uses this module:
- * - None
- *
- * \section Sec_ModDescription Module Description
- * Lightweight ring buffer, for fast insertion/deletion. Multiple buffers can be created of
- * different sizes to suit different needs.
- *
- * Note that for each buffer, insertion and removal operations may occur at the same time (via
- * a multi-threaded ISR based system) however the same kind of operation (two or more insertions
- * or deletions) must not overlap. If there is possibility of two or more of the same kind of
- * operating occurring at the same point in time, atomic (mutex) locking should be used.
- *
- * \section Sec_ExampleUsage Example Usage
- * The following snippet is an example of how this module may be used within a typical
- * application.
- *
- * \code
- * // Create the buffer structure and its underlying storage array
- * RingBuffer_t Buffer;
- * uint8_t BufferData[128];
- *
- * // Initialize the buffer with the created storage array
- * RingBuffer_InitBuffer(&Buffer, BufferData, sizeof(BufferData));
- *
- * // Insert some data into the buffer
- * RingBuffer_Insert(Buffer, 'H');
- * RingBuffer_Insert(Buffer, 'E');
- * RingBuffer_Insert(Buffer, 'L');
- * RingBuffer_Insert(Buffer, 'L');
- * RingBuffer_Insert(Buffer, 'O');
- *
- * // Cache the number of stored bytes in the buffer
- * uint16_t BufferCount = RingBuffer_GetCount(&Buffer);
- *
- * // Printer stored data length
- * printf("Buffer Length: %d, Buffer Data: \r\n", BufferCount);
- *
- * // Print contents of the buffer one character at a time
- * while (BufferCount--)
- * putc(RingBuffer_Remove(&Buffer));
- * \endcode
- *
- * @{
- */
-
-#ifndef __RING_BUFFER_H__
-#define __RING_BUFFER_H__
-
- /* Includes: */
- #include "../../Common/Common.h"
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Type Defines: */
- /** \brief Ring Buffer Management Structure.
- *
- * Type define for a new ring buffer object. Buffers should be initialized via a call to
- * \ref RingBuffer_InitBuffer() before use.
- */
- typedef struct
- {
- uint8_t* In; /**< Current storage location in the circular buffer. */
- uint8_t* Out; /**< Current retrieval location in the circular buffer. */
- uint8_t* Start; /**< Pointer to the start of the buffer's underlying storage array. */
- uint8_t* End; /**< Pointer to the end of the buffer's underlying storage array. */
- uint8_t Size; /**< Size of the buffer's underlying storage array. */
- uint16_t Count; /**< Number of bytes currently stored in the buffer. */
- } RingBuffer_t;
-
- /* Inline Functions: */
- /** Initializes a ring buffer ready for use. Buffers must be initialized via this function
- * before any operations are called upon them. Already initialized buffers may be reset
- * by re-initializing them using this function.
- *
- * \param[out] Buffer Pointer to a ring buffer structure to initialize.
- * \param[out] DataPtr Pointer to a global array that will hold the data stored into the ring buffer.
- * \param[out] Size Maximum number of bytes that can be stored in the underlying data array.
- */
- static inline void RingBuffer_InitBuffer(RingBuffer_t* Buffer, uint8_t* const DataPtr, const uint16_t Size)
- ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
- static inline void RingBuffer_InitBuffer(RingBuffer_t* Buffer, uint8_t* const DataPtr, const uint16_t Size)
- {
- GCC_FORCE_POINTER_ACCESS(Buffer);
-
- uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
- GlobalInterruptDisable();
-
- Buffer->In = DataPtr;
- Buffer->Out = DataPtr;
- Buffer->Start = &DataPtr[0];
- Buffer->End = &DataPtr[Size];
- Buffer->Size = Size;
- Buffer->Count = 0;
-
- SetGlobalInterruptMask(CurrentGlobalInt);
- }
-
- /** Retrieves the current number of bytes stored in a particular buffer. This value is computed
- * by entering an atomic lock on the buffer, so that the buffer cannot be modified while the
- * computation takes place. This value should be cached when reading out the contents of the buffer,
- * so that as small a time as possible is spent in an atomic lock.
- *
- * \note The value returned by this function is guaranteed to only be the minimum number of bytes
- * stored in the given buffer; this value may change as other threads write new data, thus
- * the returned number should be used only to determine how many successive reads may safely
- * be performed on the buffer.
- *
- * \param[in] Buffer Pointer to a ring buffer structure whose count is to be computed.
- *
- * \return Number of bytes currently stored in the buffer.
- */
- static inline uint16_t RingBuffer_GetCount(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
- static inline uint16_t RingBuffer_GetCount(RingBuffer_t* const Buffer)
- {
- uint16_t Count;
-
- uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
- GlobalInterruptDisable();
-
- Count = Buffer->Count;
-
- SetGlobalInterruptMask(CurrentGlobalInt);
- return Count;
- }
-
- /** Retrieves the free space in a particular buffer. This value is computed by entering an atomic lock
- * on the buffer, so that the buffer cannot be modified while the computation takes place.
- *
- * \note The value returned by this function is guaranteed to only be the maximum number of bytes
- * free in the given buffer; this value may change as other threads write new data, thus
- * the returned number should be used only to determine how many successive writes may safely
- * be performed on the buffer when there is a single writer thread.
- *
- * \param[in] Buffer Pointer to a ring buffer structure whose free count is to be computed.
- *
- * \return Number of free bytes in the buffer.
- */
- static inline uint16_t RingBuffer_GetFreeCount(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
- static inline uint16_t RingBuffer_GetFreeCount(RingBuffer_t* const Buffer)
- {
- return (Buffer->Size - RingBuffer_GetCount(Buffer));
- }
-
- /** Atomically determines if the specified ring buffer contains any data. This should
- * be tested before removing data from the buffer, to ensure that the buffer does not
- * underflow.
- *
- * If the data is to be removed in a loop, store the total number of bytes stored in the
- * buffer (via a call to the \ref RingBuffer_GetCount() function) in a temporary variable
- * to reduce the time spent in atomicity locks.
- *
- * \param[in,out] Buffer Pointer to a ring buffer structure to insert into.
- *
- * \return Boolean \c true if the buffer contains no free space, false otherwise.
- */
- static inline bool RingBuffer_IsEmpty(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
- static inline bool RingBuffer_IsEmpty(RingBuffer_t* const Buffer)
- {
- return (RingBuffer_GetCount(Buffer) == 0);
- }
-
- /** Atomically determines if the specified ring buffer contains any free space. This should
- * be tested before storing data to the buffer, to ensure that no data is lost due to a
- * buffer overrun.
- *
- * \param[in,out] Buffer Pointer to a ring buffer structure to insert into.
- *
- * \return Boolean \c true if the buffer contains no free space, false otherwise.
- */
- static inline bool RingBuffer_IsFull(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
- static inline bool RingBuffer_IsFull(RingBuffer_t* const Buffer)
- {
- return (RingBuffer_GetCount(Buffer) == Buffer->Size);
- }
-
- /** Inserts an element into the ring buffer.
- *
- * \note Only one execution thread (main program thread or an ISR) may insert into a single buffer
- * otherwise data corruption may occur. Insertion and removal may occur from different execution
- * threads.
- *
- * \param[in,out] Buffer Pointer to a ring buffer structure to insert into.
- * \param[in] Data Data element to insert into the buffer.
- */
- static inline void RingBuffer_Insert(RingBuffer_t* Buffer, const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1);
- static inline void RingBuffer_Insert(RingBuffer_t* Buffer, const uint8_t Data)
- {
- GCC_FORCE_POINTER_ACCESS(Buffer);
-
- *Buffer->In = Data;
-
- if (++Buffer->In == Buffer->End)
- Buffer->In = Buffer->Start;
-
- uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
- GlobalInterruptDisable();
-
- Buffer->Count++;
-
- SetGlobalInterruptMask(CurrentGlobalInt);
- }
-
- /** Removes an element from the ring buffer.
- *
- * \note Only one execution thread (main program thread or an ISR) may remove from a single buffer
- * otherwise data corruption may occur. Insertion and removal may occur from different execution
- * threads.
- *
- * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from.
- *
- * \return Next data element stored in the buffer.
- */
- static inline uint8_t RingBuffer_Remove(RingBuffer_t* Buffer) ATTR_NON_NULL_PTR_ARG(1);
- static inline uint8_t RingBuffer_Remove(RingBuffer_t* Buffer)
- {
- GCC_FORCE_POINTER_ACCESS(Buffer);
-
- uint8_t Data = *Buffer->Out;
-
- if (++Buffer->Out == Buffer->End)
- Buffer->Out = Buffer->Start;
-
- uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
- GlobalInterruptDisable();
-
- Buffer->Count--;
-
- SetGlobalInterruptMask(CurrentGlobalInt);
-
- return Data;
- }
-
- /** Returns the next element stored in the ring buffer, without removing it.
- *
- * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from.
- *
- * \return Next data element stored in the buffer.
- */
- static inline uint8_t RingBuffer_Peek(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
- static inline uint8_t RingBuffer_Peek(RingBuffer_t* const Buffer)
- {
- return *Buffer->Out;
- }
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Lightweight ring (circular) buffer, for fast insertion/deletion of bytes.
+ *
+ * Lightweight ring buffer, for fast insertion/deletion. Multiple buffers can be created of
+ * different sizes to suit different needs.
+ *
+ * Note that for each buffer, insertion and removal operations may occur at the same time (via
+ * a multi-threaded ISR based system) however the same kind of operation (two or more insertions
+ * or deletions) must not overlap. If there is possibility of two or more of the same kind of
+ * operating occurring at the same point in time, atomic (mutex) locking should be used.
+ */
+
+/** \ingroup Group_MiscDrivers
+ * \defgroup Group_RingBuff Generic Byte Ring Buffer - LUFA/Drivers/Misc/RingBuffer.h
+ * \brief Lightweight ring buffer, for fast insertion/deletion of bytes.
+ *
+ * \section Sec_Dependencies Module Source Dependencies
+ * The following files must be built with any user project that uses this module:
+ * - None
+ *
+ * \section Sec_ModDescription Module Description
+ * Lightweight ring buffer, for fast insertion/deletion. Multiple buffers can be created of
+ * different sizes to suit different needs.
+ *
+ * Note that for each buffer, insertion and removal operations may occur at the same time (via
+ * a multi-threaded ISR based system) however the same kind of operation (two or more insertions
+ * or deletions) must not overlap. If there is possibility of two or more of the same kind of
+ * operating occurring at the same point in time, atomic (mutex) locking should be used.
+ *
+ * \section Sec_ExampleUsage Example Usage
+ * The following snippet is an example of how this module may be used within a typical
+ * application.
+ *
+ * \code
+ * // Create the buffer structure and its underlying storage array
+ * RingBuffer_t Buffer;
+ * uint8_t BufferData[128];
+ *
+ * // Initialize the buffer with the created storage array
+ * RingBuffer_InitBuffer(&Buffer, BufferData, sizeof(BufferData));
+ *
+ * // Insert some data into the buffer
+ * RingBuffer_Insert(Buffer, 'H');
+ * RingBuffer_Insert(Buffer, 'E');
+ * RingBuffer_Insert(Buffer, 'L');
+ * RingBuffer_Insert(Buffer, 'L');
+ * RingBuffer_Insert(Buffer, 'O');
+ *
+ * // Cache the number of stored bytes in the buffer
+ * uint16_t BufferCount = RingBuffer_GetCount(&Buffer);
+ *
+ * // Printer stored data length
+ * printf("Buffer Length: %d, Buffer Data: \r\n", BufferCount);
+ *
+ * // Print contents of the buffer one character at a time
+ * while (BufferCount--)
+ * putc(RingBuffer_Remove(&Buffer));
+ * \endcode
+ *
+ * @{
+ */
+
+#ifndef __RING_BUFFER_H__
+#define __RING_BUFFER_H__
+
+ /* Includes: */
+ #include "../../Common/Common.h"
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Type Defines: */
+ /** \brief Ring Buffer Management Structure.
+ *
+ * Type define for a new ring buffer object. Buffers should be initialized via a call to
+ * \ref RingBuffer_InitBuffer() before use.
+ */
+ typedef struct
+ {
+ uint8_t* In; /**< Current storage location in the circular buffer. */
+ uint8_t* Out; /**< Current retrieval location in the circular buffer. */
+ uint8_t* Start; /**< Pointer to the start of the buffer's underlying storage array. */
+ uint8_t* End; /**< Pointer to the end of the buffer's underlying storage array. */
+ uint8_t Size; /**< Size of the buffer's underlying storage array. */
+ uint16_t Count; /**< Number of bytes currently stored in the buffer. */
+ } RingBuffer_t;
+
+ /* Inline Functions: */
+ /** Initializes a ring buffer ready for use. Buffers must be initialized via this function
+ * before any operations are called upon them. Already initialized buffers may be reset
+ * by re-initializing them using this function.
+ *
+ * \param[out] Buffer Pointer to a ring buffer structure to initialize.
+ * \param[out] DataPtr Pointer to a global array that will hold the data stored into the ring buffer.
+ * \param[out] Size Maximum number of bytes that can be stored in the underlying data array.
+ */
+ static inline void RingBuffer_InitBuffer(RingBuffer_t* Buffer, uint8_t* const DataPtr, const uint16_t Size)
+ ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2);
+ static inline void RingBuffer_InitBuffer(RingBuffer_t* Buffer, uint8_t* const DataPtr, const uint16_t Size)
+ {
+ GCC_FORCE_POINTER_ACCESS(Buffer);
+
+ uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+ GlobalInterruptDisable();
+
+ Buffer->In = DataPtr;
+ Buffer->Out = DataPtr;
+ Buffer->Start = &DataPtr[0];
+ Buffer->End = &DataPtr[Size];
+ Buffer->Size = Size;
+ Buffer->Count = 0;
+
+ SetGlobalInterruptMask(CurrentGlobalInt);
+ }
+
+ /** Retrieves the current number of bytes stored in a particular buffer. This value is computed
+ * by entering an atomic lock on the buffer, so that the buffer cannot be modified while the
+ * computation takes place. This value should be cached when reading out the contents of the buffer,
+ * so that as small a time as possible is spent in an atomic lock.
+ *
+ * \note The value returned by this function is guaranteed to only be the minimum number of bytes
+ * stored in the given buffer; this value may change as other threads write new data, thus
+ * the returned number should be used only to determine how many successive reads may safely
+ * be performed on the buffer.
+ *
+ * \param[in] Buffer Pointer to a ring buffer structure whose count is to be computed.
+ *
+ * \return Number of bytes currently stored in the buffer.
+ */
+ static inline uint16_t RingBuffer_GetCount(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+ static inline uint16_t RingBuffer_GetCount(RingBuffer_t* const Buffer)
+ {
+ uint16_t Count;
+
+ uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+ GlobalInterruptDisable();
+
+ Count = Buffer->Count;
+
+ SetGlobalInterruptMask(CurrentGlobalInt);
+ return Count;
+ }
+
+ /** Retrieves the free space in a particular buffer. This value is computed by entering an atomic lock
+ * on the buffer, so that the buffer cannot be modified while the computation takes place.
+ *
+ * \note The value returned by this function is guaranteed to only be the maximum number of bytes
+ * free in the given buffer; this value may change as other threads write new data, thus
+ * the returned number should be used only to determine how many successive writes may safely
+ * be performed on the buffer when there is a single writer thread.
+ *
+ * \param[in] Buffer Pointer to a ring buffer structure whose free count is to be computed.
+ *
+ * \return Number of free bytes in the buffer.
+ */
+ static inline uint16_t RingBuffer_GetFreeCount(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+ static inline uint16_t RingBuffer_GetFreeCount(RingBuffer_t* const Buffer)
+ {
+ return (Buffer->Size - RingBuffer_GetCount(Buffer));
+ }
+
+ /** Atomically determines if the specified ring buffer contains any data. This should
+ * be tested before removing data from the buffer, to ensure that the buffer does not
+ * underflow.
+ *
+ * If the data is to be removed in a loop, store the total number of bytes stored in the
+ * buffer (via a call to the \ref RingBuffer_GetCount() function) in a temporary variable
+ * to reduce the time spent in atomicity locks.
+ *
+ * \param[in,out] Buffer Pointer to a ring buffer structure to insert into.
+ *
+ * \return Boolean \c true if the buffer contains no free space, false otherwise.
+ */
+ static inline bool RingBuffer_IsEmpty(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+ static inline bool RingBuffer_IsEmpty(RingBuffer_t* const Buffer)
+ {
+ return (RingBuffer_GetCount(Buffer) == 0);
+ }
+
+ /** Atomically determines if the specified ring buffer contains any free space. This should
+ * be tested before storing data to the buffer, to ensure that no data is lost due to a
+ * buffer overrun.
+ *
+ * \param[in,out] Buffer Pointer to a ring buffer structure to insert into.
+ *
+ * \return Boolean \c true if the buffer contains no free space, false otherwise.
+ */
+ static inline bool RingBuffer_IsFull(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+ static inline bool RingBuffer_IsFull(RingBuffer_t* const Buffer)
+ {
+ return (RingBuffer_GetCount(Buffer) == Buffer->Size);
+ }
+
+ /** Inserts an element into the ring buffer.
+ *
+ * \note Only one execution thread (main program thread or an ISR) may insert into a single buffer
+ * otherwise data corruption may occur. Insertion and removal may occur from different execution
+ * threads.
+ *
+ * \param[in,out] Buffer Pointer to a ring buffer structure to insert into.
+ * \param[in] Data Data element to insert into the buffer.
+ */
+ static inline void RingBuffer_Insert(RingBuffer_t* Buffer, const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1);
+ static inline void RingBuffer_Insert(RingBuffer_t* Buffer, const uint8_t Data)
+ {
+ GCC_FORCE_POINTER_ACCESS(Buffer);
+
+ *Buffer->In = Data;
+
+ if (++Buffer->In == Buffer->End)
+ Buffer->In = Buffer->Start;
+
+ uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+ GlobalInterruptDisable();
+
+ Buffer->Count++;
+
+ SetGlobalInterruptMask(CurrentGlobalInt);
+ }
+
+ /** Removes an element from the ring buffer.
+ *
+ * \note Only one execution thread (main program thread or an ISR) may remove from a single buffer
+ * otherwise data corruption may occur. Insertion and removal may occur from different execution
+ * threads.
+ *
+ * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from.
+ *
+ * \return Next data element stored in the buffer.
+ */
+ static inline uint8_t RingBuffer_Remove(RingBuffer_t* Buffer) ATTR_NON_NULL_PTR_ARG(1);
+ static inline uint8_t RingBuffer_Remove(RingBuffer_t* Buffer)
+ {
+ GCC_FORCE_POINTER_ACCESS(Buffer);
+
+ uint8_t Data = *Buffer->Out;
+
+ if (++Buffer->Out == Buffer->End)
+ Buffer->Out = Buffer->Start;
+
+ uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+ GlobalInterruptDisable();
+
+ Buffer->Count--;
+
+ SetGlobalInterruptMask(CurrentGlobalInt);
+
+ return Data;
+ }
+
+ /** Returns the next element stored in the ring buffer, without removing it.
+ *
+ * \param[in,out] Buffer Pointer to a ring buffer structure to retrieve from.
+ *
+ * \return Next data element stored in the buffer.
+ */
+ static inline uint8_t RingBuffer_Peek(RingBuffer_t* const Buffer) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1);
+ static inline uint8_t RingBuffer_Peek(RingBuffer_t* const Buffer)
+ {
+ return *Buffer->Out;
+ }
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/Device.h b/LUFA/Drivers/USB/Core/Device.h
index 68e5e9387..ad837e148 100644
--- a/LUFA/Drivers/USB/Core/Device.h
+++ b/LUFA/Drivers/USB/Core/Device.h
@@ -1,159 +1,159 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Common USB Device definitions for all architectures.
- * \copydetails Group_Device
- *
- * \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_USB
- * \defgroup Group_Device Device Management
- * \brief USB Device management definitions for USB device mode.
- *
- * USB Device mode related definitions common to all architectures. This module contains definitions which
- * are used when the USB controller is initialized in device mode.
- *
- * @{
- */
-
-#ifndef __USBDEVICE_H__
-#define __USBDEVICE_H__
-
- /* Includes: */
- #include "../../../Common/Common.h"
- #include "USBMode.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
-
- /* Public Interface - May be used in end-application: */
- /* Enums: */
- /** Enum for the various states of the USB Device state machine. Only some states are
- * implemented in the LUFA library - other states are left to the user to implement.
- *
- * For information on each possible USB device state, refer to the USB 2.0 specification.
- *
- * \see \ref USB_DeviceState, which stores the current device state machine state.
- */
- enum USB_Device_States_t
- {
- DEVICE_STATE_Unattached = 0, /**< Internally implemented by the library. This state indicates
- * that the device is not currently connected to a host.
- */
- DEVICE_STATE_Powered = 1, /**< Internally implemented by the library. This state indicates
- * that the device is connected to a host, but enumeration has not
- * yet begun.
- */
- DEVICE_STATE_Default = 2, /**< Internally implemented by the library. This state indicates
- * that the device's USB bus has been reset by the host and it is
- * now waiting for the host to begin the enumeration process.
- */
- DEVICE_STATE_Addressed = 3, /**< Internally implemented by the library. This state indicates
- * that the device has been addressed by the USB Host, but is not
- * yet configured.
- */
- DEVICE_STATE_Configured = 4, /**< May be implemented by the user project. This state indicates
- * that the device has been enumerated by the host and is ready
- * for USB communications to begin.
- */
- DEVICE_STATE_Suspended = 5, /**< May be implemented by the user project. This state indicates
- * that the USB bus has been suspended by the host, and the device
- * should power down to a minimal power level until the bus is
- * resumed.
- */
- };
-
- /* Function Prototypes: */
- /** Function to retrieve a given descriptor's size and memory location from the given descriptor type value,
- * index and language ID. This function MUST be overridden in the user application (added with full, identical
- * prototype and name so that the library can call it to retrieve descriptor data.
- *
- * \param[in] wValue The type of the descriptor to retrieve in the upper byte, and the index in the
- * lower byte (when more than one descriptor of the given type exists, such as the
- * case of string descriptors). The type may be one of the standard types defined
- * in the DescriptorTypes_t enum, or may be a class-specific descriptor type value.
- * \param[in] wIndex The language ID of the string to return if the \c wValue type indicates
- * \ref DTYPE_String, otherwise zero for standard descriptors, or as defined in a
- * class-specific standards.
- * \param[out] DescriptorAddress Pointer to the descriptor in memory. This should be set by the routine to
- * the address of the descriptor.
- * \param[out] MemoryAddressSpace A value from the \ref USB_DescriptorMemorySpaces_t enum to indicate the memory
- * space in which the descriptor is stored. This parameter does not exist when one
- * of the \c USE_*_DESCRIPTORS compile time options is used, or on architectures which
- * use a unified address space.
- *
- * \note By default, the library expects all descriptors to be located in flash memory via the \c PROGMEM attribute.
- * If descriptors should be located in RAM or EEPROM instead (to speed up access in the case of RAM, or to
- * allow the descriptors to be changed dynamically at runtime) either the \c USE_RAM_DESCRIPTORS or the
- * \c USE_EEPROM_DESCRIPTORS tokens may be defined in the project makefile and passed to the compiler by the -D
- * switch.
- *
- * \return Size in bytes of the descriptor if it exists, zero or \ref NO_DESCRIPTOR otherwise.
- */
- uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
- const uint8_t wIndex,
- const void** const DescriptorAddress
- #if (defined(ARCH_HAS_MULTI_ADDRESS_SPACE) || defined(__DOXYGEN__)) && \
- !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))
- , uint8_t* MemoryAddressSpace
- #endif
- ) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
-
- /* Architecture Includes: */
- #if (ARCH == ARCH_AVR8)
- #include "AVR8/Device_AVR8.h"
- #elif (ARCH == ARCH_UC3)
- #include "UC3/Device_UC3.h"
- #elif (ARCH == ARCH_XMEGA)
- #include "XMEGA/Device_XMEGA.h"
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Common USB Device definitions for all architectures.
+ * \copydetails Group_Device
+ *
+ * \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_USB
+ * \defgroup Group_Device Device Management
+ * \brief USB Device management definitions for USB device mode.
+ *
+ * USB Device mode related definitions common to all architectures. This module contains definitions which
+ * are used when the USB controller is initialized in device mode.
+ *
+ * @{
+ */
+
+#ifndef __USBDEVICE_H__
+#define __USBDEVICE_H__
+
+ /* Includes: */
+ #include "../../../Common/Common.h"
+ #include "USBMode.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
+
+ /* Public Interface - May be used in end-application: */
+ /* Enums: */
+ /** Enum for the various states of the USB Device state machine. Only some states are
+ * implemented in the LUFA library - other states are left to the user to implement.
+ *
+ * For information on each possible USB device state, refer to the USB 2.0 specification.
+ *
+ * \see \ref USB_DeviceState, which stores the current device state machine state.
+ */
+ enum USB_Device_States_t
+ {
+ DEVICE_STATE_Unattached = 0, /**< Internally implemented by the library. This state indicates
+ * that the device is not currently connected to a host.
+ */
+ DEVICE_STATE_Powered = 1, /**< Internally implemented by the library. This state indicates
+ * that the device is connected to a host, but enumeration has not
+ * yet begun.
+ */
+ DEVICE_STATE_Default = 2, /**< Internally implemented by the library. This state indicates
+ * that the device's USB bus has been reset by the host and it is
+ * now waiting for the host to begin the enumeration process.
+ */
+ DEVICE_STATE_Addressed = 3, /**< Internally implemented by the library. This state indicates
+ * that the device has been addressed by the USB Host, but is not
+ * yet configured.
+ */
+ DEVICE_STATE_Configured = 4, /**< May be implemented by the user project. This state indicates
+ * that the device has been enumerated by the host and is ready
+ * for USB communications to begin.
+ */
+ DEVICE_STATE_Suspended = 5, /**< May be implemented by the user project. This state indicates
+ * that the USB bus has been suspended by the host, and the device
+ * should power down to a minimal power level until the bus is
+ * resumed.
+ */
+ };
+
+ /* Function Prototypes: */
+ /** Function to retrieve a given descriptor's size and memory location from the given descriptor type value,
+ * index and language ID. This function MUST be overridden in the user application (added with full, identical
+ * prototype and name so that the library can call it to retrieve descriptor data.
+ *
+ * \param[in] wValue The type of the descriptor to retrieve in the upper byte, and the index in the
+ * lower byte (when more than one descriptor of the given type exists, such as the
+ * case of string descriptors). The type may be one of the standard types defined
+ * in the DescriptorTypes_t enum, or may be a class-specific descriptor type value.
+ * \param[in] wIndex The language ID of the string to return if the \c wValue type indicates
+ * \ref DTYPE_String, otherwise zero for standard descriptors, or as defined in a
+ * class-specific standards.
+ * \param[out] DescriptorAddress Pointer to the descriptor in memory. This should be set by the routine to
+ * the address of the descriptor.
+ * \param[out] MemoryAddressSpace A value from the \ref USB_DescriptorMemorySpaces_t enum to indicate the memory
+ * space in which the descriptor is stored. This parameter does not exist when one
+ * of the \c USE_*_DESCRIPTORS compile time options is used, or on architectures which
+ * use a unified address space.
+ *
+ * \note By default, the library expects all descriptors to be located in flash memory via the \c PROGMEM attribute.
+ * If descriptors should be located in RAM or EEPROM instead (to speed up access in the case of RAM, or to
+ * allow the descriptors to be changed dynamically at runtime) either the \c USE_RAM_DESCRIPTORS or the
+ * \c USE_EEPROM_DESCRIPTORS tokens may be defined in the project makefile and passed to the compiler by the -D
+ * switch.
+ *
+ * \return Size in bytes of the descriptor if it exists, zero or \ref NO_DESCRIPTOR otherwise.
+ */
+ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
+ const uint8_t wIndex,
+ const void** const DescriptorAddress
+ #if (defined(ARCH_HAS_MULTI_ADDRESS_SPACE) || defined(__DOXYGEN__)) && \
+ !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))
+ , uint8_t* MemoryAddressSpace
+ #endif
+ ) ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
+
+ /* Architecture Includes: */
+ #if (ARCH == ARCH_AVR8)
+ #include "AVR8/Device_AVR8.h"
+ #elif (ARCH == ARCH_UC3)
+ #include "UC3/Device_UC3.h"
+ #elif (ARCH == ARCH_XMEGA)
+ #include "XMEGA/Device_XMEGA.h"
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/Endpoint.h b/LUFA/Drivers/USB/Core/Endpoint.h
index 877f0c138..550414ce3 100644
--- a/LUFA/Drivers/USB/Core/Endpoint.h
+++ b/LUFA/Drivers/USB/Core/Endpoint.h
@@ -1,123 +1,123 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 all architectures.
- * \copydetails Group_EndpointManagement
- *
- * \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_EndpointManagement
- * \defgroup Group_EndpointRW Endpoint Data Reading and Writing
- * \brief Endpoint data read/write definitions.
- *
- * Functions, macros, variables, enums and types related to data reading and writing from and to endpoints.
- */
-
-/** \ingroup Group_EndpointRW
- * \defgroup Group_EndpointPrimitiveRW Read/Write of Primitive Data Types
- * \brief Endpoint data primitive read/write definitions.
- *
- * Functions, macros, variables, enums and types related to data reading and writing of primitive data types
- * from and to endpoints.
- */
-
-/** \ingroup Group_EndpointManagement
- * \defgroup Group_EndpointPacketManagement Endpoint Packet Management
- * \brief USB Endpoint package management definitions.
- *
- * Functions, macros, variables, enums and types related to packet management of endpoints.
- */
-
-/** \ingroup Group_USB
- * \defgroup Group_EndpointManagement Endpoint Management
- * \brief Endpoint management definitions.
- *
- * 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_H__
-#define __ENDPOINT_H__
-
- /* Includes: */
- #include "../../../Common/Common.h"
- #include "USBMode.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: */
- /** Endpoint number mask, for masking against endpoint addresses to retrieve the endpoint's
- * numerical address in the device.
- */
- #define ENDPOINT_EPNUM_MASK 0x07
-
- /** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's
- * direction for comparing with the \c ENDPOINT_DESCRIPTOR_DIR_* masks.
- */
- #define ENDPOINT_EPDIR_MASK 0x80
-
- /** Endpoint address for the default control endpoint, which always resides in address 0. This is
- * defined for convenience to give more readable code when used with the endpoint macros.
- */
- #define ENDPOINT_CONTROLEP 0
-
- /* Architecture Includes: */
- #if (ARCH == ARCH_AVR8)
- #include "AVR8/Endpoint_AVR8.h"
- #elif (ARCH == ARCH_UC3)
- #include "UC3/Endpoint_UC3.h"
- #elif (ARCH == ARCH_XMEGA)
- #include "XMEGA/Endpoint_XMEGA.h"
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 all architectures.
+ * \copydetails Group_EndpointManagement
+ *
+ * \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_EndpointManagement
+ * \defgroup Group_EndpointRW Endpoint Data Reading and Writing
+ * \brief Endpoint data read/write definitions.
+ *
+ * Functions, macros, variables, enums and types related to data reading and writing from and to endpoints.
+ */
+
+/** \ingroup Group_EndpointRW
+ * \defgroup Group_EndpointPrimitiveRW Read/Write of Primitive Data Types
+ * \brief Endpoint data primitive read/write definitions.
+ *
+ * Functions, macros, variables, enums and types related to data reading and writing of primitive data types
+ * from and to endpoints.
+ */
+
+/** \ingroup Group_EndpointManagement
+ * \defgroup Group_EndpointPacketManagement Endpoint Packet Management
+ * \brief USB Endpoint package management definitions.
+ *
+ * Functions, macros, variables, enums and types related to packet management of endpoints.
+ */
+
+/** \ingroup Group_USB
+ * \defgroup Group_EndpointManagement Endpoint Management
+ * \brief Endpoint management definitions.
+ *
+ * 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_H__
+#define __ENDPOINT_H__
+
+ /* Includes: */
+ #include "../../../Common/Common.h"
+ #include "USBMode.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: */
+ /** Endpoint number mask, for masking against endpoint addresses to retrieve the endpoint's
+ * numerical address in the device.
+ */
+ #define ENDPOINT_EPNUM_MASK 0x07
+
+ /** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's
+ * direction for comparing with the \c ENDPOINT_DESCRIPTOR_DIR_* masks.
+ */
+ #define ENDPOINT_EPDIR_MASK 0x80
+
+ /** Endpoint address for the default control endpoint, which always resides in address 0. This is
+ * defined for convenience to give more readable code when used with the endpoint macros.
+ */
+ #define ENDPOINT_CONTROLEP 0
+
+ /* Architecture Includes: */
+ #if (ARCH == ARCH_AVR8)
+ #include "AVR8/Endpoint_AVR8.h"
+ #elif (ARCH == ARCH_UC3)
+ #include "UC3/Endpoint_UC3.h"
+ #elif (ARCH == ARCH_XMEGA)
+ #include "XMEGA/Endpoint_XMEGA.h"
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/EndpointStream.h b/LUFA/Drivers/USB/Core/EndpointStream.h
index f360877cf..9afb4d203 100644
--- a/LUFA/Drivers/USB/Core/EndpointStream.h
+++ b/LUFA/Drivers/USB/Core/EndpointStream.h
@@ -1,124 +1,124 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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.
- * \copydetails Group_EndpointStreamRW
- *
- * \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_EndpointStreamRW Read/Write of Multi-Byte Streams
- * \brief Endpoint data stream transmission and reception management.
- *
- * Functions, macros, variables, enums and types related to data reading and writing of data streams from
- * and to endpoints.
- *
- * @{
- */
-
-#ifndef __ENDPOINT_STREAM_H__
-#define __ENDPOINT_STREAM_H__
-
- /* Includes: */
- #include "../../../Common/Common.h"
- #include "USBMode.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: */
- /* Enums: */
- /** Enum for the possible error return codes of the \c Endpoint_*_Stream_* functions. */
- enum Endpoint_Stream_RW_ErrorCodes_t
- {
- ENDPOINT_RWSTREAM_NoError = 0, /**< Command completed successfully, no error. */
- ENDPOINT_RWSTREAM_EndpointStalled = 1, /**< The endpoint was stalled during the stream
- * transfer by the host or device.
- */
- ENDPOINT_RWSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during
- * the transfer.
- */
- ENDPOINT_RWSTREAM_BusSuspended = 3, /**< The USB bus has been suspended by the host and
- * no USB endpoint traffic can occur until the bus
- * has resumed.
- */
- ENDPOINT_RWSTREAM_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.
- */
- ENDPOINT_RWSTREAM_IncompleteTransfer = 5, /**< Indicates that the endpoint bank became full or empty before
- * the complete contents of the current stream could be
- * transferred. The endpoint stream function should be called
- * again to process the next chunk of data in the transfer.
- */
- };
-
- /** Enum for the possible error return codes of the \c Endpoint_*_Control_Stream_* functions. */
- enum Endpoint_ControlStream_RW_ErrorCodes_t
- {
- ENDPOINT_RWCSTREAM_NoError = 0, /**< Command completed successfully, no error. */
- ENDPOINT_RWCSTREAM_HostAborted = 1, /**< The aborted the transfer prematurely. */
- ENDPOINT_RWCSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during
- * the transfer.
- */
- ENDPOINT_RWCSTREAM_BusSuspended = 3, /**< The USB bus has been suspended by the host and
- * no USB endpoint traffic can occur until the bus
- * has resumed.
- */
- };
-
- /* Architecture Includes: */
- #if (ARCH == ARCH_AVR8)
- #include "AVR8/EndpointStream_AVR8.h"
- #elif (ARCH == ARCH_UC3)
- #include "UC3/EndpointStream_UC3.h"
- #elif (ARCH == ARCH_XMEGA)
- #include "XMEGA/EndpointStream_XMEGA.h"
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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.
+ * \copydetails Group_EndpointStreamRW
+ *
+ * \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_EndpointStreamRW Read/Write of Multi-Byte Streams
+ * \brief Endpoint data stream transmission and reception management.
+ *
+ * Functions, macros, variables, enums and types related to data reading and writing of data streams from
+ * and to endpoints.
+ *
+ * @{
+ */
+
+#ifndef __ENDPOINT_STREAM_H__
+#define __ENDPOINT_STREAM_H__
+
+ /* Includes: */
+ #include "../../../Common/Common.h"
+ #include "USBMode.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: */
+ /* Enums: */
+ /** Enum for the possible error return codes of the \c Endpoint_*_Stream_* functions. */
+ enum Endpoint_Stream_RW_ErrorCodes_t
+ {
+ ENDPOINT_RWSTREAM_NoError = 0, /**< Command completed successfully, no error. */
+ ENDPOINT_RWSTREAM_EndpointStalled = 1, /**< The endpoint was stalled during the stream
+ * transfer by the host or device.
+ */
+ ENDPOINT_RWSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during
+ * the transfer.
+ */
+ ENDPOINT_RWSTREAM_BusSuspended = 3, /**< The USB bus has been suspended by the host and
+ * no USB endpoint traffic can occur until the bus
+ * has resumed.
+ */
+ ENDPOINT_RWSTREAM_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.
+ */
+ ENDPOINT_RWSTREAM_IncompleteTransfer = 5, /**< Indicates that the endpoint bank became full or empty before
+ * the complete contents of the current stream could be
+ * transferred. The endpoint stream function should be called
+ * again to process the next chunk of data in the transfer.
+ */
+ };
+
+ /** Enum for the possible error return codes of the \c Endpoint_*_Control_Stream_* functions. */
+ enum Endpoint_ControlStream_RW_ErrorCodes_t
+ {
+ ENDPOINT_RWCSTREAM_NoError = 0, /**< Command completed successfully, no error. */
+ ENDPOINT_RWCSTREAM_HostAborted = 1, /**< The aborted the transfer prematurely. */
+ ENDPOINT_RWCSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during
+ * the transfer.
+ */
+ ENDPOINT_RWCSTREAM_BusSuspended = 3, /**< The USB bus has been suspended by the host and
+ * no USB endpoint traffic can occur until the bus
+ * has resumed.
+ */
+ };
+
+ /* Architecture Includes: */
+ #if (ARCH == ARCH_AVR8)
+ #include "AVR8/EndpointStream_AVR8.h"
+ #elif (ARCH == ARCH_UC3)
+ #include "UC3/EndpointStream_UC3.h"
+ #elif (ARCH == ARCH_XMEGA)
+ #include "XMEGA/EndpointStream_XMEGA.h"
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/Host.h b/LUFA/Drivers/USB/Core/Host.h
index 6bd7fab20..a7e647dc1 100644
--- a/LUFA/Drivers/USB/Core/Host.h
+++ b/LUFA/Drivers/USB/Core/Host.h
@@ -1,139 +1,139 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Common USB Host definitions for all architectures.
- * \copydetails Group_Host
- *
- * \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_USB
- * \defgroup Group_Host Host Management
- * \brief USB Host management definitions for USB host mode.
- *
- * USB Host mode related macros and enums. This module contains macros and enums which are used when
- * the USB controller is initialized in host mode.
- *
- * @{
- */
-
-#ifndef __USBHOST_H__
-#define __USBHOST_H__
-
- /* Includes: */
- #include "../../../Common/Common.h"
- #include "USBMode.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: */
- /* Enums: */
- /** Enum for the various states of the USB Host state machine.
- *
- * For information on each possible USB host state, refer to the USB 2.0 specification.
- * Several of the USB host states are broken up further into multiple smaller sub-states,
- * so that they can be internally implemented inside the library in an efficient manner.
- *
- * \see \ref USB_HostState, which stores the current host state machine state.
- */
- enum USB_Host_States_t
- {
- HOST_STATE_WaitForDevice = 0, /**< This state indicates that the stack is waiting for an interval
- * to elapse before continuing with the next step of the device
- * enumeration process.
- */
- HOST_STATE_Unattached = 1, /**< This state indicates that the host state machine is waiting for
- * a device to be attached so that it can start the enumeration process.
- */
- HOST_STATE_Powered = 2, /**< This state indicates that a device has been attached, and the
- * library's internals are being configured to begin the enumeration
- * process.
- */
- HOST_STATE_Powered_WaitForDeviceSettle = 3, /**< This state indicates that the stack is waiting for the initial
- * settling period to elapse before beginning the enumeration process.
- */
- HOST_STATE_Powered_WaitForConnect = 4, /**< This state indicates that the stack is waiting for a connection event
- * from the USB controller to indicate a valid USB device has been attached
- * to the bus and is ready to be enumerated.
- */
- HOST_STATE_Powered_DoReset = 5, /**< This state indicates that a valid USB device has been attached, and that
- * it will now be reset to ensure it is ready for enumeration.
- */
- HOST_STATE_Powered_ConfigPipe = 6, /**< This state indicates that the attached device is currently powered and
- * reset, and that the control pipe is now being configured by the stack.
- */
- HOST_STATE_Default = 7, /**< This state indicates that the stack is currently retrieving the control
- * endpoint's size from the device, so that the control pipe can be altered
- * to match.
- */
- HOST_STATE_Default_PostReset = 8, /**< This state indicates that the control pipe is being reconfigured to match
- * the retrieved control endpoint size from the device, and the device's USB
- * bus address is being set.
- */
- HOST_STATE_Default_PostAddressSet = 9, /**< This state indicates that the device's address has now been set, and the
- * stack is has now completed the device enumeration process. This state causes
- * the stack to change the current USB device address to that set for the
- * connected device, before progressing to the \ref HOST_STATE_Addressed state
- * ready for use in the user application.
- */
- HOST_STATE_Addressed = 10, /**< Indicates that the device has been enumerated and addressed, and is now waiting
- * for the user application to configure the device ready for use.
- */
- HOST_STATE_Configured = 11, /**< Indicates that the device has been configured into a valid device configuration,
- * ready for general use by the user application.
- */
- };
-
- /* Architecture Includes: */
- #if (ARCH == ARCH_AVR8)
- #include "AVR8/Host_AVR8.h"
- #elif (ARCH == ARCH_UC3)
- #include "UC3/Host_UC3.h"
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Common USB Host definitions for all architectures.
+ * \copydetails Group_Host
+ *
+ * \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_USB
+ * \defgroup Group_Host Host Management
+ * \brief USB Host management definitions for USB host mode.
+ *
+ * USB Host mode related macros and enums. This module contains macros and enums which are used when
+ * the USB controller is initialized in host mode.
+ *
+ * @{
+ */
+
+#ifndef __USBHOST_H__
+#define __USBHOST_H__
+
+ /* Includes: */
+ #include "../../../Common/Common.h"
+ #include "USBMode.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: */
+ /* Enums: */
+ /** Enum for the various states of the USB Host state machine.
+ *
+ * For information on each possible USB host state, refer to the USB 2.0 specification.
+ * Several of the USB host states are broken up further into multiple smaller sub-states,
+ * so that they can be internally implemented inside the library in an efficient manner.
+ *
+ * \see \ref USB_HostState, which stores the current host state machine state.
+ */
+ enum USB_Host_States_t
+ {
+ HOST_STATE_WaitForDevice = 0, /**< This state indicates that the stack is waiting for an interval
+ * to elapse before continuing with the next step of the device
+ * enumeration process.
+ */
+ HOST_STATE_Unattached = 1, /**< This state indicates that the host state machine is waiting for
+ * a device to be attached so that it can start the enumeration process.
+ */
+ HOST_STATE_Powered = 2, /**< This state indicates that a device has been attached, and the
+ * library's internals are being configured to begin the enumeration
+ * process.
+ */
+ HOST_STATE_Powered_WaitForDeviceSettle = 3, /**< This state indicates that the stack is waiting for the initial
+ * settling period to elapse before beginning the enumeration process.
+ */
+ HOST_STATE_Powered_WaitForConnect = 4, /**< This state indicates that the stack is waiting for a connection event
+ * from the USB controller to indicate a valid USB device has been attached
+ * to the bus and is ready to be enumerated.
+ */
+ HOST_STATE_Powered_DoReset = 5, /**< This state indicates that a valid USB device has been attached, and that
+ * it will now be reset to ensure it is ready for enumeration.
+ */
+ HOST_STATE_Powered_ConfigPipe = 6, /**< This state indicates that the attached device is currently powered and
+ * reset, and that the control pipe is now being configured by the stack.
+ */
+ HOST_STATE_Default = 7, /**< This state indicates that the stack is currently retrieving the control
+ * endpoint's size from the device, so that the control pipe can be altered
+ * to match.
+ */
+ HOST_STATE_Default_PostReset = 8, /**< This state indicates that the control pipe is being reconfigured to match
+ * the retrieved control endpoint size from the device, and the device's USB
+ * bus address is being set.
+ */
+ HOST_STATE_Default_PostAddressSet = 9, /**< This state indicates that the device's address has now been set, and the
+ * stack is has now completed the device enumeration process. This state causes
+ * the stack to change the current USB device address to that set for the
+ * connected device, before progressing to the \ref HOST_STATE_Addressed state
+ * ready for use in the user application.
+ */
+ HOST_STATE_Addressed = 10, /**< Indicates that the device has been enumerated and addressed, and is now waiting
+ * for the user application to configure the device ready for use.
+ */
+ HOST_STATE_Configured = 11, /**< Indicates that the device has been configured into a valid device configuration,
+ * ready for general use by the user application.
+ */
+ };
+
+ /* Architecture Includes: */
+ #if (ARCH == ARCH_AVR8)
+ #include "AVR8/Host_AVR8.h"
+ #elif (ARCH == ARCH_UC3)
+ #include "UC3/Host_UC3.h"
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/OTG.h b/LUFA/Drivers/USB/Core/OTG.h
index 69caa7c59..59cb36833 100644
--- a/LUFA/Drivers/USB/Core/OTG.h
+++ b/LUFA/Drivers/USB/Core/OTG.h
@@ -1,80 +1,80 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Common USB OTG definitions for all architectures.
- * \copydetails Group_OTG
- *
- * \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_USB
- * \defgroup Group_OTG USB On The Go (OTG) Management
- * \brief USB OTG management definitions.
- *
- * This module contains macros for embedded USB hosts with dual role On The Go capabilities, for managing role
- * exchange. OTG is a way for two USB dual role devices to talk to one another directly without fixed device/host
- * roles.
- *
- * @{
- */
-
-#ifndef __USBOTG_H__
-#define __USBOTG_H__
-
- /* Includes: */
- #include "../../../Common/Common.h"
- #include "USBMode.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
-
- /* Architecture Includes: */
- #if (ARCH == ARCH_AVR8)
- #include "AVR8/OTG_AVR8.h"
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Common USB OTG definitions for all architectures.
+ * \copydetails Group_OTG
+ *
+ * \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_USB
+ * \defgroup Group_OTG USB On The Go (OTG) Management
+ * \brief USB OTG management definitions.
+ *
+ * This module contains macros for embedded USB hosts with dual role On The Go capabilities, for managing role
+ * exchange. OTG is a way for two USB dual role devices to talk to one another directly without fixed device/host
+ * roles.
+ *
+ * @{
+ */
+
+#ifndef __USBOTG_H__
+#define __USBOTG_H__
+
+ /* Includes: */
+ #include "../../../Common/Common.h"
+ #include "USBMode.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
+
+ /* Architecture Includes: */
+ #if (ARCH == ARCH_AVR8)
+ #include "AVR8/OTG_AVR8.h"
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/Pipe.h b/LUFA/Drivers/USB/Core/Pipe.h
index 5f82937f4..387ee5042 100644
--- a/LUFA/Drivers/USB/Core/Pipe.h
+++ b/LUFA/Drivers/USB/Core/Pipe.h
@@ -1,136 +1,136 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Common USB Pipe definitions for all architectures.
- * \copydetails Group_PipeManagement
- *
- * \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_PipeManagement
- * \defgroup Group_PipeRW Pipe Data Reading and Writing
- * \brief Pipe data read/write definitions.
- *
- * Functions, macros, variables, enums and types related to data reading and writing from and to pipes.
- */
-
-/** \ingroup Group_PipeRW
- * \defgroup Group_PipePrimitiveRW Read/Write of Primitive Data Types
- * \brief Pipe data primitive read/write definitions.
- *
- * Functions, macros, variables, enums and types related to data reading and writing of primitive data types
- * from and to pipes.
- */
-
-/** \ingroup Group_PipeManagement
- * \defgroup Group_PipePacketManagement Pipe Packet Management
- * \brief Pipe packet management definitions.
- *
- * Functions, macros, variables, enums and types related to packet management of pipes.
- */
-
-/** \ingroup Group_PipeManagement
- * \defgroup Group_PipeControlReq Pipe Control Request Management
- * \brief Pipe control request definitions.
- *
- * Module for host mode request processing. This module allows for the transmission of standard, class and
- * vendor control requests to the default control endpoint of an attached device while in host mode.
- *
- * \see Chapter 9 of the USB 2.0 specification.
- */
-
-/** \ingroup Group_USB
- * \defgroup Group_PipeManagement Pipe Management
- * \brief Pipe management definitions.
- *
- * This module contains functions, macros and enums related to pipe management when in USB Host mode. This
- * module contains the pipe management macros, as well as pipe interrupt and data send/receive functions
- * for various data types.
- *
- * @{
- */
-
-#ifndef __PIPE_H__
-#define __PIPE_H__
-
- /* Includes: */
- #include "../../../Common/Common.h"
- #include "USBMode.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: */
- /** Pipe address for the default control pipe, which always resides in address 0. This is
- * defined for convenience to give more readable code when used with the pipe macros.
- */
- #define PIPE_CONTROLPIPE 0
-
- /** Pipe number mask, for masking against pipe addresses to retrieve the pipe's numerical address
- * in the device.
- */
- #define PIPE_PIPENUM_MASK 0x07
-
- /** Endpoint number mask, for masking against endpoint addresses to retrieve the endpoint's
- * numerical address in the attached device.
- */
- #define PIPE_EPNUM_MASK 0x0F
-
- /** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's
- * direction for comparing with the \c ENDPOINT_DESCRIPTOR_DIR_* masks.
- */
- #define PIPE_EPDIR_MASK 0x80
-
- /* Architecture Includes: */
- #if (ARCH == ARCH_AVR8)
- #include "AVR8/Pipe_AVR8.h"
- #elif (ARCH == ARCH_UC3)
- #include "UC3/Pipe_UC3.h"
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Common USB Pipe definitions for all architectures.
+ * \copydetails Group_PipeManagement
+ *
+ * \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_PipeManagement
+ * \defgroup Group_PipeRW Pipe Data Reading and Writing
+ * \brief Pipe data read/write definitions.
+ *
+ * Functions, macros, variables, enums and types related to data reading and writing from and to pipes.
+ */
+
+/** \ingroup Group_PipeRW
+ * \defgroup Group_PipePrimitiveRW Read/Write of Primitive Data Types
+ * \brief Pipe data primitive read/write definitions.
+ *
+ * Functions, macros, variables, enums and types related to data reading and writing of primitive data types
+ * from and to pipes.
+ */
+
+/** \ingroup Group_PipeManagement
+ * \defgroup Group_PipePacketManagement Pipe Packet Management
+ * \brief Pipe packet management definitions.
+ *
+ * Functions, macros, variables, enums and types related to packet management of pipes.
+ */
+
+/** \ingroup Group_PipeManagement
+ * \defgroup Group_PipeControlReq Pipe Control Request Management
+ * \brief Pipe control request definitions.
+ *
+ * Module for host mode request processing. This module allows for the transmission of standard, class and
+ * vendor control requests to the default control endpoint of an attached device while in host mode.
+ *
+ * \see Chapter 9 of the USB 2.0 specification.
+ */
+
+/** \ingroup Group_USB
+ * \defgroup Group_PipeManagement Pipe Management
+ * \brief Pipe management definitions.
+ *
+ * This module contains functions, macros and enums related to pipe management when in USB Host mode. This
+ * module contains the pipe management macros, as well as pipe interrupt and data send/receive functions
+ * for various data types.
+ *
+ * @{
+ */
+
+#ifndef __PIPE_H__
+#define __PIPE_H__
+
+ /* Includes: */
+ #include "../../../Common/Common.h"
+ #include "USBMode.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: */
+ /** Pipe address for the default control pipe, which always resides in address 0. This is
+ * defined for convenience to give more readable code when used with the pipe macros.
+ */
+ #define PIPE_CONTROLPIPE 0
+
+ /** Pipe number mask, for masking against pipe addresses to retrieve the pipe's numerical address
+ * in the device.
+ */
+ #define PIPE_PIPENUM_MASK 0x07
+
+ /** Endpoint number mask, for masking against endpoint addresses to retrieve the endpoint's
+ * numerical address in the attached device.
+ */
+ #define PIPE_EPNUM_MASK 0x0F
+
+ /** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's
+ * direction for comparing with the \c ENDPOINT_DESCRIPTOR_DIR_* masks.
+ */
+ #define PIPE_EPDIR_MASK 0x80
+
+ /* Architecture Includes: */
+ #if (ARCH == ARCH_AVR8)
+ #include "AVR8/Pipe_AVR8.h"
+ #elif (ARCH == ARCH_UC3)
+ #include "UC3/Pipe_UC3.h"
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/PipeStream.h b/LUFA/Drivers/USB/Core/PipeStream.h
index ffb2cd46b..5d821f50a 100644
--- a/LUFA/Drivers/USB/Core/PipeStream.h
+++ b/LUFA/Drivers/USB/Core/PipeStream.h
@@ -1,100 +1,100 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Pipe data stream transmission and reception management.
- * \copydetails Group_PipeStreamRW
- *
- * \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_PipeRW
- * \defgroup Group_PipeStreamRW Read/Write of Multi-Byte Streams
- * \brief Pipe data stream transmission and reception management.
- *
- * Functions, macros, variables, enums and types related to data reading and writing of data streams from
- * and to pipes.
- *
- * @{
- */
-
-#ifndef __PIPE_STREAM_H__
-#define __PIPE_STREAM_H__
-
- /* Includes: */
- #include "../../../Common/Common.h"
- #include "USBMode.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: */
- /* Enums: */
- /** Enum for the possible error return codes of the Pipe_*_Stream_* functions. */
- enum Pipe_Stream_RW_ErrorCodes_t
- {
- PIPE_RWSTREAM_NoError = 0, /**< Command completed successfully, no error. */
- PIPE_RWSTREAM_PipeStalled = 1, /**< The device stalled the pipe during the transfer. */
- PIPE_RWSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during
- * the transfer.
- */
- PIPE_RWSTREAM_Timeout = 3, /**< The device failed to accept or send the next packet
- * within the software timeout period set by the
- * \ref USB_STREAM_TIMEOUT_MS macro.
- */
- PIPE_RWSTREAM_IncompleteTransfer = 4, /**< Indicates that the pipe bank became full/empty before the
- * complete contents of the stream could be transferred.
- */
- };
-
- /* Architecture Includes: */
- #if (ARCH == ARCH_AVR8)
- #include "AVR8/PipeStream_AVR8.h"
- #elif (ARCH == ARCH_UC3)
- #include "UC3/PipeStream_UC3.h"
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Pipe data stream transmission and reception management.
+ * \copydetails Group_PipeStreamRW
+ *
+ * \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_PipeRW
+ * \defgroup Group_PipeStreamRW Read/Write of Multi-Byte Streams
+ * \brief Pipe data stream transmission and reception management.
+ *
+ * Functions, macros, variables, enums and types related to data reading and writing of data streams from
+ * and to pipes.
+ *
+ * @{
+ */
+
+#ifndef __PIPE_STREAM_H__
+#define __PIPE_STREAM_H__
+
+ /* Includes: */
+ #include "../../../Common/Common.h"
+ #include "USBMode.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: */
+ /* Enums: */
+ /** Enum for the possible error return codes of the Pipe_*_Stream_* functions. */
+ enum Pipe_Stream_RW_ErrorCodes_t
+ {
+ PIPE_RWSTREAM_NoError = 0, /**< Command completed successfully, no error. */
+ PIPE_RWSTREAM_PipeStalled = 1, /**< The device stalled the pipe during the transfer. */
+ PIPE_RWSTREAM_DeviceDisconnected = 2, /**< Device was disconnected from the host during
+ * the transfer.
+ */
+ PIPE_RWSTREAM_Timeout = 3, /**< The device failed to accept or send the next packet
+ * within the software timeout period set by the
+ * \ref USB_STREAM_TIMEOUT_MS macro.
+ */
+ PIPE_RWSTREAM_IncompleteTransfer = 4, /**< Indicates that the pipe bank became full/empty before the
+ * complete contents of the stream could be transferred.
+ */
+ };
+
+ /* Architecture Includes: */
+ #if (ARCH == ARCH_AVR8)
+ #include "AVR8/PipeStream_AVR8.h"
+ #elif (ARCH == ARCH_UC3)
+ #include "UC3/PipeStream_UC3.h"
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/UC3/Device_UC3.c b/LUFA/Drivers/USB/Core/UC3/Device_UC3.c
index c6b41a81c..f98ecedc9 100644
--- a/LUFA/Drivers/USB/Core/UC3/Device_UC3.c
+++ b/LUFA/Drivers/USB/Core/UC3/Device_UC3.c
@@ -1,47 +1,47 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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_DEVICE)
-
-#include "../Device.h"
-
-void USB_Device_SendRemoteWakeup(void)
-{
- USB_CLK_Unfreeze();
-
- AVR32_USBB.UDCON.rmwkup = true;
- while (AVR32_USBB.UDCON.rmwkup);
-}
-
-#endif
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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_DEVICE)
+
+#include "../Device.h"
+
+void USB_Device_SendRemoteWakeup(void)
+{
+ USB_CLK_Unfreeze();
+
+ AVR32_USBB.UDCON.rmwkup = true;
+ while (AVR32_USBB.UDCON.rmwkup);
+}
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/UC3/Device_UC3.h b/LUFA/Drivers/USB/Core/UC3/Device_UC3.h
index 9b324ab69..fa034b576 100644
--- a/LUFA/Drivers/USB/Core/UC3/Device_UC3.h
+++ b/LUFA/Drivers/USB/Core/UC3/Device_UC3.h
@@ -1,259 +1,259 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 AVR32 UC3 microcontrollers.
- * \copydetails Group_Device_UC3
- *
- * \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_UC3 Device Management (UC3)
- * \brief USB Device definitions for the AVR32 UC3 microcontrollers.
- *
- * Architecture specific USB Device definitions for the Atmel 32-bit UC3 AVR microcontrollers.
- *
- * @{
- */
-
-#ifndef __USBDEVICE_UC3_H__
-#define __USBDEVICE_UC3_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
-
- /* 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 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)
-
- /** 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)
-
- #if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32) || defined(__DOXYGEN__)
- /** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
- * USB interface should be initialized in high speed (480Mb/s) mode.
- */
- #define USB_DEVICE_OPT_HIGHSPEED (1 << 1)
- #endif
- //@}
-
- #if (!defined(NO_INTERNAL_SERIAL) && \
- (defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32) || \
- 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 120
-
- /** Start address of the internal serial number, in the appropriate address space, if present on the selected microcontroller
- * model.
- */
- #define INTERNAL_SERIAL_START_ADDRESS 0x80800204
- #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 macro 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 macro 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.
- */
- static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
- static inline uint16_t USB_Device_GetFrameNumber(void)
- {
- return AVR32_USBB.UDFNUM.fnum;
- }
-
- #if !defined(NO_SOF_EVENTS)
- /** Enables the device mode Start Of Frame events. When enabled, this causes the
- * \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
- * at the start of each USB frame when enumerated in device mode.
- *
- * \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
- */
- static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Device_EnableSOFEvents(void)
- {
- USB_INT_Enable(USB_INT_SOFI);
- }
-
- /** Disables the device mode Start Of Frame events. When disabled, this stops the firing of the
- * \ref EVENT_USB_Device_StartOfFrame() event when enumerated in device mode.
- *
- * \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
- */
- static inline void USB_Device_DisableSOFEvents(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Device_DisableSOFEvents(void)
- {
- USB_INT_Disable(USB_INT_SOFI);
- }
- #endif
-
- /* Private Interface - For use in library only: */
- #if !defined(__DOXYGEN__)
- /* Inline Functions: */
- static inline void USB_Device_SetLowSpeed(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Device_SetLowSpeed(void)
- {
- AVR32_USBB.UDCON.ls = true;
- }
-
- static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Device_SetFullSpeed(void)
- {
- AVR32_USBB.UDCON.ls = false;
- #if defined(USB_DEVICE_OPT_HIGHSPEED)
- AVR32_USBB.UDCON.spdconf = 3;
- #endif
- }
-
- #if defined(USB_DEVICE_OPT_HIGHSPEED)
- static inline void USB_Device_SetHighSpeed(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Device_SetHighSpeed(void)
- {
- AVR32_USBB.UDCON.ls = false;
- AVR32_USBB.UDCON.spdconf = 0;
- }
- #endif
-
- static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
- static inline void USB_Device_SetDeviceAddress(const uint8_t Address)
- {
- AVR32_USBB.UDCON.uadd = Address;
- AVR32_USBB.UDCON.adden = true;
- }
-
- static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
- static inline bool USB_Device_IsAddressSet(void)
- {
- return AVR32_USBB.UDCON.adden;
- }
-
- #if (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
- 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 = (uint8_t*)INTERNAL_SERIAL_START_ADDRESS;
-
- for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++)
- {
- uint8_t SerialByte = *SigReadAddress;
-
- if (SerialCharNum & 0x01)
- {
- SerialByte >>= 4;
- SigReadAddress++;
- }
-
- SerialByte &= 0x0F;
-
- UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ?
- (('A' - 10) + SerialByte) : ('0' + SerialByte));
- }
-
- SetGlobalInterruptMask(CurrentGlobalInt);
- }
- #endif
-
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 AVR32 UC3 microcontrollers.
+ * \copydetails Group_Device_UC3
+ *
+ * \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_UC3 Device Management (UC3)
+ * \brief USB Device definitions for the AVR32 UC3 microcontrollers.
+ *
+ * Architecture specific USB Device definitions for the Atmel 32-bit UC3 AVR microcontrollers.
+ *
+ * @{
+ */
+
+#ifndef __USBDEVICE_UC3_H__
+#define __USBDEVICE_UC3_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
+
+ /* 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 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)
+
+ /** 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)
+
+ #if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32) || defined(__DOXYGEN__)
+ /** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the
+ * USB interface should be initialized in high speed (480Mb/s) mode.
+ */
+ #define USB_DEVICE_OPT_HIGHSPEED (1 << 1)
+ #endif
+ //@}
+
+ #if (!defined(NO_INTERNAL_SERIAL) && \
+ (defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32) || \
+ 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 120
+
+ /** Start address of the internal serial number, in the appropriate address space, if present on the selected microcontroller
+ * model.
+ */
+ #define INTERNAL_SERIAL_START_ADDRESS 0x80800204
+ #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 macro 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 macro 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.
+ */
+ static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+ static inline uint16_t USB_Device_GetFrameNumber(void)
+ {
+ return AVR32_USBB.UDFNUM.fnum;
+ }
+
+ #if !defined(NO_SOF_EVENTS)
+ /** Enables the device mode Start Of Frame events. When enabled, this causes the
+ * \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
+ * at the start of each USB frame when enumerated in device mode.
+ *
+ * \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
+ */
+ static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Device_EnableSOFEvents(void)
+ {
+ USB_INT_Enable(USB_INT_SOFI);
+ }
+
+ /** Disables the device mode Start Of Frame events. When disabled, this stops the firing of the
+ * \ref EVENT_USB_Device_StartOfFrame() event when enumerated in device mode.
+ *
+ * \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
+ */
+ static inline void USB_Device_DisableSOFEvents(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Device_DisableSOFEvents(void)
+ {
+ USB_INT_Disable(USB_INT_SOFI);
+ }
+ #endif
+
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Inline Functions: */
+ static inline void USB_Device_SetLowSpeed(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Device_SetLowSpeed(void)
+ {
+ AVR32_USBB.UDCON.ls = true;
+ }
+
+ static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Device_SetFullSpeed(void)
+ {
+ AVR32_USBB.UDCON.ls = false;
+ #if defined(USB_DEVICE_OPT_HIGHSPEED)
+ AVR32_USBB.UDCON.spdconf = 3;
+ #endif
+ }
+
+ #if defined(USB_DEVICE_OPT_HIGHSPEED)
+ static inline void USB_Device_SetHighSpeed(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Device_SetHighSpeed(void)
+ {
+ AVR32_USBB.UDCON.ls = false;
+ AVR32_USBB.UDCON.spdconf = 0;
+ }
+ #endif
+
+ static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
+ static inline void USB_Device_SetDeviceAddress(const uint8_t Address)
+ {
+ AVR32_USBB.UDCON.uadd = Address;
+ AVR32_USBB.UDCON.adden = true;
+ }
+
+ static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+ static inline bool USB_Device_IsAddressSet(void)
+ {
+ return AVR32_USBB.UDCON.adden;
+ }
+
+ #if (USE_INTERNAL_SERIAL != NO_DESCRIPTOR)
+ 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 = (uint8_t*)INTERNAL_SERIAL_START_ADDRESS;
+
+ for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++)
+ {
+ uint8_t SerialByte = *SigReadAddress;
+
+ if (SerialCharNum & 0x01)
+ {
+ SerialByte >>= 4;
+ SigReadAddress++;
+ }
+
+ SerialByte &= 0x0F;
+
+ UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ?
+ (('A' - 10) + SerialByte) : ('0' + SerialByte));
+ }
+
+ SetGlobalInterruptMask(CurrentGlobalInt);
+ }
+ #endif
+
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c b/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c
index 3337c7d5c..8e784e96c 100644
--- a/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c
+++ b/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c
@@ -1,141 +1,141 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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_DEVICE)
-
-#include "../Endpoint.h"
-
-#if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
-uint8_t USB_Device_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE;
-#endif
-
-volatile uint32_t USB_SelectedEndpoint = ENDPOINT_CONTROLEP;
-volatile uint8_t* USB_EndpointFIFOPos[ENDPOINT_TOTAL_ENDPOINTS];
-
-bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
- const uint32_t UECFG0Data)
-{
- Endpoint_SelectEndpoint(Number);
- Endpoint_EnableEndpoint();
-
- (&AVR32_USBB.uecfg0)[Number] = 0;
- (&AVR32_USBB.uecfg0)[Number] = UECFG0Data;
- USB_EndpointFIFOPos[Number] = &AVR32_USBB_SLAVE[Number * 0x10000];
-
- return Endpoint_IsConfigured();
-}
-
-void Endpoint_ClearEndpoints(void)
-{
- for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
- {
- Endpoint_SelectEndpoint(EPNum);
- (&AVR32_USBB.uecfg0)[EPNum] = 0;
- (&AVR32_USBB.uecon0clr)[EPNum] = -1;
- USB_EndpointFIFOPos[EPNum] = &AVR32_USBB_SLAVE[EPNum * 0x10000];
- Endpoint_DisableEndpoint();
- }
-}
-
-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
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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_DEVICE)
+
+#include "../Endpoint.h"
+
+#if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
+uint8_t USB_Device_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE;
+#endif
+
+volatile uint32_t USB_SelectedEndpoint = ENDPOINT_CONTROLEP;
+volatile uint8_t* USB_EndpointFIFOPos[ENDPOINT_TOTAL_ENDPOINTS];
+
+bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
+ const uint32_t UECFG0Data)
+{
+ Endpoint_SelectEndpoint(Number);
+ Endpoint_EnableEndpoint();
+
+ (&AVR32_USBB.uecfg0)[Number] = 0;
+ (&AVR32_USBB.uecfg0)[Number] = UECFG0Data;
+ USB_EndpointFIFOPos[Number] = &AVR32_USBB_SLAVE[Number * 0x10000];
+
+ return Endpoint_IsConfigured();
+}
+
+void Endpoint_ClearEndpoints(void)
+{
+ for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++)
+ {
+ Endpoint_SelectEndpoint(EPNum);
+ (&AVR32_USBB.uecfg0)[EPNum] = 0;
+ (&AVR32_USBB.uecon0clr)[EPNum] = -1;
+ USB_EndpointFIFOPos[EPNum] = &AVR32_USBB_SLAVE[EPNum * 0x10000];
+ Endpoint_DisableEndpoint();
+ }
+}
+
+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
+
diff --git a/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h b/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h
index 5b37b5413..a57a568b7 100644
--- a/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h
+++ b/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h
@@ -1,876 +1,876 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 AVR32 UC3 microcontrollers.
- * \copydetails Group_EndpointManagement_UC3
- *
- * \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_UC3 Endpoint Data Reading and Writing (UC3)
- * \brief Endpoint data read/write definitions for the Atmel AVR32 UC3 architecture.
- *
- * Functions, macros, variables, enums and types related to data reading and writing from and to endpoints.
- */
-
-/** \ingroup Group_EndpointPrimitiveRW
- * \defgroup Group_EndpointPrimitiveRW_UC3 Read/Write of Primitive Data Types (UC3)
- * \brief Endpoint primitive read/write definitions for the Atmel AVR32 UC3 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_UC3 Endpoint Packet Management (UC3)
- * \brief Endpoint packet management definitions for the Atmel AVR32 UC3 architecture.
- *
- * Functions, macros, variables, enums and types related to packet management of endpoints.
- */
-
-/** \ingroup Group_EndpointManagement
- * \defgroup Group_EndpointManagement_UC3 Endpoint Management (UC3)
- * \brief Endpoint management definitions for the Atmel AVR32 UC3 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_UC3_H__
-#define __ENDPOINT_UC3_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
- #include "../USBTask.h"
- #include "../USBInterrupt.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__)
- /* Macros: */
- #define _ENDPOINT_GET_MAXSIZE(EPIndex) _ENDPOINT_GET_MAXSIZE2(ENDPOINT_DETAILS_EP ## EPIndex)
- #define _ENDPOINT_GET_MAXSIZE2(EPDetails) _ENDPOINT_GET_MAXSIZE3(EPDetails)
- #define _ENDPOINT_GET_MAXSIZE3(MaxSize, Banks) (MaxSize)
-
- #define _ENDPOINT_GET_BANKS(EPIndex) _ENDPOINT_GET_BANKS2(ENDPOINT_DETAILS_EP ## EPIndex)
- #define _ENDPOINT_GET_BANKS2(EPDetails) _ENDPOINT_GET_BANKS3(EPDetails)
- #define _ENDPOINT_GET_BANKS3(MaxSize, Banks) (Banks)
-
- #if defined(USB_SERIES_UC3A0_AVR32) || defined(USB_SERIES_UC3A1_AVR32)
- #define ENDPOINT_DETAILS_MAXEP 7
-
- #define ENDPOINT_DETAILS_EP0 64, 1
- #define ENDPOINT_DETAILS_EP1 256, 2
- #define ENDPOINT_DETAILS_EP2 256, 2
- #define ENDPOINT_DETAILS_EP3 64, 2
- #define ENDPOINT_DETAILS_EP4 64, 2
- #define ENDPOINT_DETAILS_EP5 256, 2
- #define ENDPOINT_DETAILS_EP6 256, 2
- #elif defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32)
- #define ENDPOINT_DETAILS_MAXEP 8
-
- #define ENDPOINT_DETAILS_EP0 64, 1
- #define ENDPOINT_DETAILS_EP1 512, 3
- #define ENDPOINT_DETAILS_EP2 512, 3
- #define ENDPOINT_DETAILS_EP3 512, 3
- #define ENDPOINT_DETAILS_EP4 512, 3
- #define ENDPOINT_DETAILS_EP5 512, 3
- #define ENDPOINT_DETAILS_EP6 512, 3
- #define ENDPOINT_DETAILS_EP7 512, 3
- #elif defined(USB_SERIES_UC3B0_AVR32) || defined(USB_SERIES_UC3B1_AVR32)
- #define ENDPOINT_DETAILS_MAXEP 7
-
- #define ENDPOINT_DETAILS_EP0 64, 1
- #define ENDPOINT_DETAILS_EP1 64, 2
- #define ENDPOINT_DETAILS_EP2 64, 2
- #define ENDPOINT_DETAILS_EP3 64, 2
- #define ENDPOINT_DETAILS_EP4 64, 2
- #define ENDPOINT_DETAILS_EP5 256, 2
- #define ENDPOINT_DETAILS_EP6 256, 2
- #endif
-
- #define ENDPOINT_HSB_ADDRESS_SPACE_SIZE (64 * 1024UL)
-
- /* Inline Functions: */
- static inline uint32_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST
- ATTR_ALWAYS_INLINE;
- static inline uint32_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes)
- {
- uint8_t MaskVal = 0;
- uint16_t CheckBytes = 8;
-
- while (CheckBytes < Bytes)
- {
- MaskVal++;
- CheckBytes <<= 1;
- }
-
- return (MaskVal << AVR32_USBB_EPSIZE_OFFSET);
- }
-
- /* Function Prototypes: */
- void Endpoint_ClearEndpoints(void);
- bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
- const uint32_t UECFGXData);
-
- /* External Variables: */
- extern volatile uint32_t USB_SelectedEndpoint;
- extern volatile uint8_t* USB_EndpointFIFOPos[];
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** \name Endpoint Direction Masks */
- //@{
- /** Endpoint data direction mask for \ref Endpoint_ConfigureEndpoint(). This indicates that the endpoint
- * should be initialized in the OUT direction - i.e. data flows from host to device.
- */
- #define ENDPOINT_DIR_OUT AVR32_USBB_UECFG0_EPDIR_OUT
-
- /** Endpoint data direction mask for \ref Endpoint_ConfigureEndpoint(). This indicates that the endpoint
- * should be initialized in the IN direction - i.e. data flows from device to host.
- */
- #define ENDPOINT_DIR_IN AVR32_USBB_UECFG0_EPDIR_IN
- //@}
-
- /** \name Endpoint Bank Mode Masks */
- //@{
- /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates
- * that the endpoint should have one single bank, which requires less USB FIFO memory but results
- * in slower transfers as only one USB device (the AVR or the host) can access the endpoint's
- * bank at the one time.
- */
- #define ENDPOINT_BANK_SINGLE AVR32_USBB_UECFG0_EPBK_SINGLE
-
- /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates
- * that the endpoint should have two banks, which requires more USB FIFO memory but results
- * in faster transfers as one USB device (the AVR or the host) can access one bank while the other
- * accesses the second bank.
- */
- #define ENDPOINT_BANK_DOUBLE AVR32_USBB_UECFG0_EPBK_DOUBLE
-
- #if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32) || defined(__DOXYGEN__)
- /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates
- * that the endpoint should have three banks, which requires more USB FIFO memory but results
- * in faster transfers as one USB device (the AVR or the host) can access one bank while the other
- * accesses the remaining banks.
- *
- * \note Not available on all AVR models.
- */
- #define ENDPOINT_BANK_TRIPLE AVR32_USBB_UECFG0_EPBK_TRIPLE
- #endif
- //@}
-
- #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
-
- /** Retrieves the maximum bank size in bytes of a given endpoint.
- *
- * \note This macro will only work correctly on endpoint indexes that are compile-time constants
- * defined by the preprocessor.
- *
- * \param[in] EPIndex Endpoint number, a value between 0 and (\ref ENDPOINT_TOTAL_ENDPOINTS - 1)
- */
- #define ENDPOINT_MAX_SIZE(EPIndex) _ENDPOINT_GET_MAXSIZE(EPIndex)
-
- /** Retrieves the total number of banks supported by the given endpoint.
- *
- * \note This macro will only work correctly on endpoint indexes that are compile-time constants
- * defined by the preprocessor.
- *
- * \param[in] EPIndex Endpoint number, a value between 0 and (\ref ENDPOINT_TOTAL_ENDPOINTS - 1)
- */
- #define ENDPOINT_BANKS_SUPPORTED(EPIndex) _ENDPOINT_GET_BANKS(EPIndex)
-
- #if !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 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 ENDPOINT_DETAILS_MAXEP
- #else
- #define ENDPOINT_TOTAL_ENDPOINTS 1
- #endif
-
- /* Enums: */
- /** Enum for the possible error return codes of the \ref Endpoint_WaitUntilReady() function.
- *
- * \ingroup Group_EndpointRW_UC3
- */
- 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: */
- /** Configures the specified endpoint number with the given endpoint type, direction, bank size
- * and banking mode. Once configured, the endpoint may be read from or written to, depending
- * on its direction.
- *
- * \param[in] Number Endpoint number to configure. This must be more than 0 and less than
- * \ref ENDPOINT_TOTAL_ENDPOINTS.
- *
- * \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] Direction Endpoint data direction, either \ref ENDPOINT_DIR_OUT or \ref ENDPOINT_DIR_IN.
- * All endpoints (except Control type) are unidirectional - data may only be read
- * from or written to the endpoint bank based on its direction, not both.
- *
- * \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 banks to use for the endpoint being configured, an \c ENDPOINT_BANK_* mask.
- * More banks uses more USB DPRAM, but offers better performance. Isochronous type
- * endpoints <b>must</b> have at least two banks.
- *
- * \note When the \c ORDERED_EP_CONFIG compile time option is used, Endpoints <b>must</b> be configured in
- * ascending order, or bank corruption will occur.
- * \n\n
- *
- * \note Different endpoints may have different maximum packet sizes based on the endpoint's index - refer to
- * the chosen microcontroller model's datasheet to determine the maximum bank size for each endpoint.
- * \n\n
- *
- * \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 upon success. Upon failure, the endpoint
- * which failed to reconfigure correctly will be selected.
- *
- * \return Boolean \c true if the configuration succeeded, \c false otherwise.
- */
- static inline bool Endpoint_ConfigureEndpoint(const uint8_t Number,
- const uint8_t Type,
- const uint8_t Direction,
- const uint16_t Size,
- const uint8_t Banks) ATTR_ALWAYS_INLINE;
- static inline bool Endpoint_ConfigureEndpoint(const uint8_t Number,
- const uint8_t Type,
- const uint8_t Direction,
- const uint16_t Size,
- const uint8_t Banks)
- {
- return Endpoint_ConfigureEndpoint_Prv(Number, (AVR32_USBB_ALLOC_MASK |
- ((uint32_t)Type << AVR32_USBB_EPTYPE_OFFSET) |
- ((uint32_t)Direction << AVR32_USBB_EPDIR_OFFSET) |
- ((uint32_t)Banks << AVR32_USBB_EPBK_OFFSET) |
- Endpoint_BytesToEPSizeMask(Size)));
- }
-
- /** Indicates the number of bytes currently stored in the current endpoint's selected bank.
- *
- * \note The return width of this function may differ, depending on the maximum endpoint bank size
- * of the selected AVR model.
- *
- * \ingroup Group_EndpointRW_UC3
- *
- * \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)
- {
- return (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].byct;
- }
-
- /** Get the endpoint address of the currently selected endpoint. This is typically used to save
- * the currently selected endpoint number 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_SelectedEndpoint;
- }
-
- /** Selects the given endpoint number. If the address from the device descriptors is used, the
- * value should be masked with the \ref ENDPOINT_EPNUM_MASK constant to extract only the endpoint
- * number (and discarding the endpoint direction bit).
- *
- * Any endpoint operations which do not require the endpoint number to be indicated will operate on
- * the currently selected endpoint.
- *
- * \param[in] EndpointNumber Endpoint number to select.
- */
- static inline void Endpoint_SelectEndpoint(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_SelectEndpoint(const uint8_t EndpointNumber)
- {
- USB_SelectedEndpoint = EndpointNumber;
- }
-
- /** 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] EndpointNumber Endpoint number whose FIFO buffers are to be reset.
- */
- static inline void Endpoint_ResetEndpoint(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_ResetEndpoint(const uint8_t EndpointNumber)
- {
- AVR32_USBB.uerst |= (AVR32_USBB_EPRST0_MASK << EndpointNumber);
- AVR32_USBB.uerst &= ~(AVR32_USBB_EPRST0_MASK << EndpointNumber);
- USB_EndpointFIFOPos[EndpointNumber] = &AVR32_USBB_SLAVE[EndpointNumber * ENDPOINT_HSB_ADDRESS_SPACE_SIZE];
- }
-
- /** Enables the currently selected endpoint so that data can be sent and received through it to
- * and from a host.
- *
- * \note Endpoints must first be configured properly via \ref Endpoint_ConfigureEndpoint().
- */
- static inline void Endpoint_EnableEndpoint(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_EnableEndpoint(void)
- {
- AVR32_USBB.uerst |= (AVR32_USBB_EPEN0_MASK << USB_SelectedEndpoint);
- }
-
- /** Disables the currently selected endpoint so that data cannot be sent and received through it
- * to and from a host.
- */
- static inline void Endpoint_DisableEndpoint(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_DisableEndpoint(void)
- {
- AVR32_USBB.uerst &= ~(AVR32_USBB_EPEN0_MASK << USB_SelectedEndpoint);
- }
-
- /** 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 ((AVR32_USBB.uerst & (AVR32_USBB_EPEN0_MASK << USB_SelectedEndpoint)) ? true : false);
- }
-
- /** Retrieves the number of busy banks in the currently selected endpoint, which have been queued for
- * transmission via the \ref Endpoint_ClearIN() command, or are awaiting acknowledgement via the
- * \ref Endpoint_ClearOUT() command.
- *
- * \ingroup Group_EndpointPacketManagement_UC3
- *
- * \return Total number of busy banks in the selected endpoint.
- */
- static inline uint8_t Endpoint_GetBusyBanks(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
- static inline uint8_t Endpoint_GetBusyBanks(void)
- {
- return (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].nbusybk;
- }
-
- /** 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_UC3
- */
- static inline void Endpoint_AbortPendingIN(void)
- {
- while (Endpoint_GetBusyBanks() != 0)
- {
- (&AVR32_USBB.UECON0SET)[USB_SelectedEndpoint].killbks = true;
- while ((&AVR32_USBB.UECON0)[USB_SelectedEndpoint].killbk);
- }
- }
-
- /** 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_UC3
- *
- * \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 (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].rwall;
- }
-
- /** 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 (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].cfgok;
- }
-
- /** Returns a mask indicating which INTERRUPT type endpoints have interrupted - i.e. their
- * interrupt duration has elapsed. Which endpoints have interrupted can be determined by
- * masking the return value against <tt>(1 << <i>{Endpoint Number}</i>)</tt>.
- *
- * \return Mask whose bits indicate which endpoints have interrupted.
- */
- static inline uint8_t Endpoint_GetEndpointInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint8_t Endpoint_GetEndpointInterrupts(void)
- {
- return ((AVR32_USBB.udint & (AVR32_USBB_EP6INT_MASK | AVR32_USBB_EP5INT_MASK |
- AVR32_USBB_EP4INT_MASK | AVR32_USBB_EP3INT_MASK |
- AVR32_USBB_EP2INT_MASK | AVR32_USBB_EP1INT_MASK |
- AVR32_USBB_EP0INT_MASK)) >> AVR32_USBB_EP0INT_OFFSET);
- }
-
- /** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type
- * endpoints).
- *
- * \param[in] EndpointNumber Index of the endpoint whose interrupt flag should be tested.
- *
- * \return Boolean \c true if the specified endpoint has interrupted, \c false otherwise.
- */
- static inline bool Endpoint_HasEndpointInterrupted(const uint8_t EndpointNumber) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Endpoint_HasEndpointInterrupted(const uint8_t EndpointNumber)
- {
- return ((Endpoint_GetEndpointInterrupts() & (AVR32_USBB_EP0INT_MASK << EndpointNumber)) ? true : false);
- }
-
- /** Determines if the selected IN endpoint is ready for a new packet to be sent to the host.
- *
- * \ingroup Group_EndpointPacketManagement_UC3
- *
- * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
- */
- static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Endpoint_IsINReady(void)
- {
- return (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].txini;
- }
-
- /** Determines if the selected OUT endpoint has received new packet from the host.
- *
- * \ingroup Group_EndpointPacketManagement_UC3
- *
- * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
- */
- static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Endpoint_IsOUTReceived(void)
- {
- return (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].rxouti;
- }
-
- /** Determines if the current CONTROL type endpoint has received a SETUP packet.
- *
- * \ingroup Group_EndpointPacketManagement_UC3
- *
- * \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise.
- */
- static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Endpoint_IsSETUPReceived(void)
- {
- return (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].rxstpi;
- }
-
- /** Clears a received SETUP packet on the currently selected CONTROL type endpoint, freeing up the
- * endpoint for the next packet.
- *
- * \ingroup Group_EndpointPacketManagement_UC3
- *
- * \note This is not applicable for non CONTROL type endpoints.
- */
- static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_ClearSETUP(void)
- {
- (&AVR32_USBB.UESTA0CLR)[USB_SelectedEndpoint].rxstpic = true;
- USB_EndpointFIFOPos[USB_SelectedEndpoint] = &AVR32_USBB_SLAVE[USB_SelectedEndpoint * ENDPOINT_HSB_ADDRESS_SPACE_SIZE];
- }
-
- /** 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_UC3
- */
- static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_ClearIN(void)
- {
- (&AVR32_USBB.UESTA0CLR)[USB_SelectedEndpoint].txinic = true;
- (&AVR32_USBB.UECON0CLR)[USB_SelectedEndpoint].fifoconc = true;
- USB_EndpointFIFOPos[USB_SelectedEndpoint] = &AVR32_USBB_SLAVE[USB_SelectedEndpoint * ENDPOINT_HSB_ADDRESS_SPACE_SIZE];
- }
-
- /** 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_UC3
- */
- static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_ClearOUT(void)
- {
- (&AVR32_USBB.UESTA0CLR)[USB_SelectedEndpoint].rxoutic = true;
- (&AVR32_USBB.UECON0CLR)[USB_SelectedEndpoint].fifoconc = true;
- USB_EndpointFIFOPos[USB_SelectedEndpoint] = &AVR32_USBB_SLAVE[USB_SelectedEndpoint * ENDPOINT_HSB_ADDRESS_SPACE_SIZE];
- }
-
- /** 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_UC3
- */
- static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_StallTransaction(void)
- {
- (&AVR32_USBB.UECON0SET)[USB_SelectedEndpoint].stallrqs = true;
- }
-
- /** Clears the STALL condition on the currently selected endpoint.
- *
- * \ingroup Group_EndpointPacketManagement_UC3
- */
- static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_ClearStall(void)
- {
- (&AVR32_USBB.UECON0CLR)[USB_SelectedEndpoint].stallrqc = true;
- }
-
- /** Determines if the currently selected endpoint is stalled, false otherwise.
- *
- * \ingroup Group_EndpointPacketManagement_UC3
- *
- * \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 (&AVR32_USBB.UECON0)[USB_SelectedEndpoint].stallrq;
- }
-
- /** Resets the data toggle of the currently selected endpoint. */
- static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_ResetDataToggle(void)
- {
- (&AVR32_USBB.UECON0SET)[USB_SelectedEndpoint].rstdts = true;
- }
-
- /** Determines the currently selected endpoint's direction.
- *
- * \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask.
- */
- static inline uint32_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint32_t Endpoint_GetEndpointDirection(void)
- {
- return ((&AVR32_USBB.UECFG0)[USB_SelectedEndpoint].epdir ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT);
- }
-
- /** Sets the direction of the currently selected endpoint.
- *
- * \param[in] DirectionMask New endpoint direction, as a \c ENDPOINT_DIR_* mask.
- */
- static inline void Endpoint_SetEndpointDirection(const uint32_t DirectionMask) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_SetEndpointDirection(const uint32_t DirectionMask)
- {
- (&AVR32_USBB.UECFG0)[USB_SelectedEndpoint].epdir = (DirectionMask == ENDPOINT_DIR_IN);
- }
-
- /** Reads one byte from the currently selected endpoint's bank, for OUT direction endpoints.
- *
- * \ingroup Group_EndpointPrimitiveRW_UC3
- *
- * \return Next byte in the currently selected endpoint's FIFO buffer.
- */
- static inline uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint8_t Endpoint_Read_8(void)
- {
- return *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- }
-
- /** Writes one byte to the currently selected endpoint's bank, for IN direction endpoints.
- *
- * \ingroup Group_EndpointPrimitiveRW_UC3
- *
- * \param[in] Data Data to write into the the currently selected endpoint's FIFO buffer.
- */
- static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_Write_8(const uint8_t Data)
- {
- *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = Data;
- }
-
- /** Discards one byte from the currently selected endpoint's bank, for OUT direction endpoints.
- *
- * \ingroup Group_EndpointPrimitiveRW_UC3
- */
- static inline void Endpoint_Discard_8(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_Discard_8(void)
- {
- uint8_t Dummy;
-
- Dummy = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- }
-
- /** Reads two bytes from the currently selected endpoint's bank in little endian format, for OUT
- * direction endpoints.
- *
- * \ingroup Group_EndpointPrimitiveRW_UC3
- *
- * \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 Byte1 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- uint16_t Byte0 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
-
- return ((Byte0 << 8) | Byte1);
- }
-
- /** Reads two bytes from the currently selected endpoint's bank in big endian format, for OUT
- * direction endpoints.
- *
- * \ingroup Group_EndpointPrimitiveRW_UC3
- *
- * \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 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- uint16_t Byte1 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
-
- 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_UC3
- *
- * \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)
- {
- *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 8);
- *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data & 0xFF);
- }
-
- /** Writes two bytes to the currently selected endpoint's bank in big endian format, for IN
- * direction endpoints.
- *
- * \ingroup Group_EndpointPrimitiveRW_UC3
- *
- * \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)
- {
- *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data & 0xFF);
- *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 8);
- }
-
- /** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints.
- *
- * \ingroup Group_EndpointPrimitiveRW_UC3
- */
- static inline void Endpoint_Discard_16(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_Discard_16(void)
- {
- uint8_t Dummy;
-
- Dummy = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- Dummy = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- }
-
- /** Reads four bytes from the currently selected endpoint's bank in little endian format, for OUT
- * direction endpoints.
- *
- * \ingroup Group_EndpointPrimitiveRW_UC3
- *
- * \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 Byte3 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- uint32_t Byte2 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- uint32_t Byte1 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- uint32_t Byte0 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
-
- return ((Byte0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3);
- }
-
- /** Reads four bytes from the currently selected endpoint's bank in big endian format, for OUT
- * direction endpoints.
- *
- * \ingroup Group_EndpointPrimitiveRW_UC3
- *
- * \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 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- uint32_t Byte1 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- uint32_t Byte2 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- uint32_t Byte3 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
-
- 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_UC3
- *
- * \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)
- {
- *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 24);
- *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 16);
- *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 8);
- *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data & 0xFF);
- }
-
- /** Writes four bytes to the currently selected endpoint's bank in big endian format, for IN
- * direction endpoints.
- *
- * \ingroup Group_EndpointPrimitiveRW_UC3
- *
- * \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)
- {
- *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data & 0xFF);
- *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 8);
- *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 16);
- *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 24);
- }
-
- /** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints.
- *
- * \ingroup Group_EndpointPrimitiveRW_UC3
- */
- static inline void Endpoint_Discard_32(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_Discard_32(void)
- {
- uint8_t Dummy;
-
- Dummy = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- Dummy = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- Dummy = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- Dummy = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
- }
-
- /* 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.
- *
- * \note 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: */
- /** 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.
- */
- 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_UC3
- *
- * \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
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 AVR32 UC3 microcontrollers.
+ * \copydetails Group_EndpointManagement_UC3
+ *
+ * \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_UC3 Endpoint Data Reading and Writing (UC3)
+ * \brief Endpoint data read/write definitions for the Atmel AVR32 UC3 architecture.
+ *
+ * Functions, macros, variables, enums and types related to data reading and writing from and to endpoints.
+ */
+
+/** \ingroup Group_EndpointPrimitiveRW
+ * \defgroup Group_EndpointPrimitiveRW_UC3 Read/Write of Primitive Data Types (UC3)
+ * \brief Endpoint primitive read/write definitions for the Atmel AVR32 UC3 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_UC3 Endpoint Packet Management (UC3)
+ * \brief Endpoint packet management definitions for the Atmel AVR32 UC3 architecture.
+ *
+ * Functions, macros, variables, enums and types related to packet management of endpoints.
+ */
+
+/** \ingroup Group_EndpointManagement
+ * \defgroup Group_EndpointManagement_UC3 Endpoint Management (UC3)
+ * \brief Endpoint management definitions for the Atmel AVR32 UC3 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_UC3_H__
+#define __ENDPOINT_UC3_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+ #include "../USBTask.h"
+ #include "../USBInterrupt.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__)
+ /* Macros: */
+ #define _ENDPOINT_GET_MAXSIZE(EPIndex) _ENDPOINT_GET_MAXSIZE2(ENDPOINT_DETAILS_EP ## EPIndex)
+ #define _ENDPOINT_GET_MAXSIZE2(EPDetails) _ENDPOINT_GET_MAXSIZE3(EPDetails)
+ #define _ENDPOINT_GET_MAXSIZE3(MaxSize, Banks) (MaxSize)
+
+ #define _ENDPOINT_GET_BANKS(EPIndex) _ENDPOINT_GET_BANKS2(ENDPOINT_DETAILS_EP ## EPIndex)
+ #define _ENDPOINT_GET_BANKS2(EPDetails) _ENDPOINT_GET_BANKS3(EPDetails)
+ #define _ENDPOINT_GET_BANKS3(MaxSize, Banks) (Banks)
+
+ #if defined(USB_SERIES_UC3A0_AVR32) || defined(USB_SERIES_UC3A1_AVR32)
+ #define ENDPOINT_DETAILS_MAXEP 7
+
+ #define ENDPOINT_DETAILS_EP0 64, 1
+ #define ENDPOINT_DETAILS_EP1 256, 2
+ #define ENDPOINT_DETAILS_EP2 256, 2
+ #define ENDPOINT_DETAILS_EP3 64, 2
+ #define ENDPOINT_DETAILS_EP4 64, 2
+ #define ENDPOINT_DETAILS_EP5 256, 2
+ #define ENDPOINT_DETAILS_EP6 256, 2
+ #elif defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32)
+ #define ENDPOINT_DETAILS_MAXEP 8
+
+ #define ENDPOINT_DETAILS_EP0 64, 1
+ #define ENDPOINT_DETAILS_EP1 512, 3
+ #define ENDPOINT_DETAILS_EP2 512, 3
+ #define ENDPOINT_DETAILS_EP3 512, 3
+ #define ENDPOINT_DETAILS_EP4 512, 3
+ #define ENDPOINT_DETAILS_EP5 512, 3
+ #define ENDPOINT_DETAILS_EP6 512, 3
+ #define ENDPOINT_DETAILS_EP7 512, 3
+ #elif defined(USB_SERIES_UC3B0_AVR32) || defined(USB_SERIES_UC3B1_AVR32)
+ #define ENDPOINT_DETAILS_MAXEP 7
+
+ #define ENDPOINT_DETAILS_EP0 64, 1
+ #define ENDPOINT_DETAILS_EP1 64, 2
+ #define ENDPOINT_DETAILS_EP2 64, 2
+ #define ENDPOINT_DETAILS_EP3 64, 2
+ #define ENDPOINT_DETAILS_EP4 64, 2
+ #define ENDPOINT_DETAILS_EP5 256, 2
+ #define ENDPOINT_DETAILS_EP6 256, 2
+ #endif
+
+ #define ENDPOINT_HSB_ADDRESS_SPACE_SIZE (64 * 1024UL)
+
+ /* Inline Functions: */
+ static inline uint32_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST
+ ATTR_ALWAYS_INLINE;
+ static inline uint32_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes)
+ {
+ uint8_t MaskVal = 0;
+ uint16_t CheckBytes = 8;
+
+ while (CheckBytes < Bytes)
+ {
+ MaskVal++;
+ CheckBytes <<= 1;
+ }
+
+ return (MaskVal << AVR32_USBB_EPSIZE_OFFSET);
+ }
+
+ /* Function Prototypes: */
+ void Endpoint_ClearEndpoints(void);
+ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
+ const uint32_t UECFGXData);
+
+ /* External Variables: */
+ extern volatile uint32_t USB_SelectedEndpoint;
+ extern volatile uint8_t* USB_EndpointFIFOPos[];
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** \name Endpoint Direction Masks */
+ //@{
+ /** Endpoint data direction mask for \ref Endpoint_ConfigureEndpoint(). This indicates that the endpoint
+ * should be initialized in the OUT direction - i.e. data flows from host to device.
+ */
+ #define ENDPOINT_DIR_OUT AVR32_USBB_UECFG0_EPDIR_OUT
+
+ /** Endpoint data direction mask for \ref Endpoint_ConfigureEndpoint(). This indicates that the endpoint
+ * should be initialized in the IN direction - i.e. data flows from device to host.
+ */
+ #define ENDPOINT_DIR_IN AVR32_USBB_UECFG0_EPDIR_IN
+ //@}
+
+ /** \name Endpoint Bank Mode Masks */
+ //@{
+ /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates
+ * that the endpoint should have one single bank, which requires less USB FIFO memory but results
+ * in slower transfers as only one USB device (the AVR or the host) can access the endpoint's
+ * bank at the one time.
+ */
+ #define ENDPOINT_BANK_SINGLE AVR32_USBB_UECFG0_EPBK_SINGLE
+
+ /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates
+ * that the endpoint should have two banks, which requires more USB FIFO memory but results
+ * in faster transfers as one USB device (the AVR or the host) can access one bank while the other
+ * accesses the second bank.
+ */
+ #define ENDPOINT_BANK_DOUBLE AVR32_USBB_UECFG0_EPBK_DOUBLE
+
+ #if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32) || defined(__DOXYGEN__)
+ /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates
+ * that the endpoint should have three banks, which requires more USB FIFO memory but results
+ * in faster transfers as one USB device (the AVR or the host) can access one bank while the other
+ * accesses the remaining banks.
+ *
+ * \note Not available on all AVR models.
+ */
+ #define ENDPOINT_BANK_TRIPLE AVR32_USBB_UECFG0_EPBK_TRIPLE
+ #endif
+ //@}
+
+ #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
+
+ /** Retrieves the maximum bank size in bytes of a given endpoint.
+ *
+ * \note This macro will only work correctly on endpoint indexes that are compile-time constants
+ * defined by the preprocessor.
+ *
+ * \param[in] EPIndex Endpoint number, a value between 0 and (\ref ENDPOINT_TOTAL_ENDPOINTS - 1)
+ */
+ #define ENDPOINT_MAX_SIZE(EPIndex) _ENDPOINT_GET_MAXSIZE(EPIndex)
+
+ /** Retrieves the total number of banks supported by the given endpoint.
+ *
+ * \note This macro will only work correctly on endpoint indexes that are compile-time constants
+ * defined by the preprocessor.
+ *
+ * \param[in] EPIndex Endpoint number, a value between 0 and (\ref ENDPOINT_TOTAL_ENDPOINTS - 1)
+ */
+ #define ENDPOINT_BANKS_SUPPORTED(EPIndex) _ENDPOINT_GET_BANKS(EPIndex)
+
+ #if !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 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 ENDPOINT_DETAILS_MAXEP
+ #else
+ #define ENDPOINT_TOTAL_ENDPOINTS 1
+ #endif
+
+ /* Enums: */
+ /** Enum for the possible error return codes of the \ref Endpoint_WaitUntilReady() function.
+ *
+ * \ingroup Group_EndpointRW_UC3
+ */
+ 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: */
+ /** Configures the specified endpoint number with the given endpoint type, direction, bank size
+ * and banking mode. Once configured, the endpoint may be read from or written to, depending
+ * on its direction.
+ *
+ * \param[in] Number Endpoint number to configure. This must be more than 0 and less than
+ * \ref ENDPOINT_TOTAL_ENDPOINTS.
+ *
+ * \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] Direction Endpoint data direction, either \ref ENDPOINT_DIR_OUT or \ref ENDPOINT_DIR_IN.
+ * All endpoints (except Control type) are unidirectional - data may only be read
+ * from or written to the endpoint bank based on its direction, not both.
+ *
+ * \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 banks to use for the endpoint being configured, an \c ENDPOINT_BANK_* mask.
+ * More banks uses more USB DPRAM, but offers better performance. Isochronous type
+ * endpoints <b>must</b> have at least two banks.
+ *
+ * \note When the \c ORDERED_EP_CONFIG compile time option is used, Endpoints <b>must</b> be configured in
+ * ascending order, or bank corruption will occur.
+ * \n\n
+ *
+ * \note Different endpoints may have different maximum packet sizes based on the endpoint's index - refer to
+ * the chosen microcontroller model's datasheet to determine the maximum bank size for each endpoint.
+ * \n\n
+ *
+ * \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 upon success. Upon failure, the endpoint
+ * which failed to reconfigure correctly will be selected.
+ *
+ * \return Boolean \c true if the configuration succeeded, \c false otherwise.
+ */
+ static inline bool Endpoint_ConfigureEndpoint(const uint8_t Number,
+ const uint8_t Type,
+ const uint8_t Direction,
+ const uint16_t Size,
+ const uint8_t Banks) ATTR_ALWAYS_INLINE;
+ static inline bool Endpoint_ConfigureEndpoint(const uint8_t Number,
+ const uint8_t Type,
+ const uint8_t Direction,
+ const uint16_t Size,
+ const uint8_t Banks)
+ {
+ return Endpoint_ConfigureEndpoint_Prv(Number, (AVR32_USBB_ALLOC_MASK |
+ ((uint32_t)Type << AVR32_USBB_EPTYPE_OFFSET) |
+ ((uint32_t)Direction << AVR32_USBB_EPDIR_OFFSET) |
+ ((uint32_t)Banks << AVR32_USBB_EPBK_OFFSET) |
+ Endpoint_BytesToEPSizeMask(Size)));
+ }
+
+ /** Indicates the number of bytes currently stored in the current endpoint's selected bank.
+ *
+ * \note The return width of this function may differ, depending on the maximum endpoint bank size
+ * of the selected AVR model.
+ *
+ * \ingroup Group_EndpointRW_UC3
+ *
+ * \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)
+ {
+ return (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].byct;
+ }
+
+ /** Get the endpoint address of the currently selected endpoint. This is typically used to save
+ * the currently selected endpoint number 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_SelectedEndpoint;
+ }
+
+ /** Selects the given endpoint number. If the address from the device descriptors is used, the
+ * value should be masked with the \ref ENDPOINT_EPNUM_MASK constant to extract only the endpoint
+ * number (and discarding the endpoint direction bit).
+ *
+ * Any endpoint operations which do not require the endpoint number to be indicated will operate on
+ * the currently selected endpoint.
+ *
+ * \param[in] EndpointNumber Endpoint number to select.
+ */
+ static inline void Endpoint_SelectEndpoint(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_SelectEndpoint(const uint8_t EndpointNumber)
+ {
+ USB_SelectedEndpoint = EndpointNumber;
+ }
+
+ /** 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] EndpointNumber Endpoint number whose FIFO buffers are to be reset.
+ */
+ static inline void Endpoint_ResetEndpoint(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_ResetEndpoint(const uint8_t EndpointNumber)
+ {
+ AVR32_USBB.uerst |= (AVR32_USBB_EPRST0_MASK << EndpointNumber);
+ AVR32_USBB.uerst &= ~(AVR32_USBB_EPRST0_MASK << EndpointNumber);
+ USB_EndpointFIFOPos[EndpointNumber] = &AVR32_USBB_SLAVE[EndpointNumber * ENDPOINT_HSB_ADDRESS_SPACE_SIZE];
+ }
+
+ /** Enables the currently selected endpoint so that data can be sent and received through it to
+ * and from a host.
+ *
+ * \note Endpoints must first be configured properly via \ref Endpoint_ConfigureEndpoint().
+ */
+ static inline void Endpoint_EnableEndpoint(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_EnableEndpoint(void)
+ {
+ AVR32_USBB.uerst |= (AVR32_USBB_EPEN0_MASK << USB_SelectedEndpoint);
+ }
+
+ /** Disables the currently selected endpoint so that data cannot be sent and received through it
+ * to and from a host.
+ */
+ static inline void Endpoint_DisableEndpoint(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_DisableEndpoint(void)
+ {
+ AVR32_USBB.uerst &= ~(AVR32_USBB_EPEN0_MASK << USB_SelectedEndpoint);
+ }
+
+ /** 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 ((AVR32_USBB.uerst & (AVR32_USBB_EPEN0_MASK << USB_SelectedEndpoint)) ? true : false);
+ }
+
+ /** Retrieves the number of busy banks in the currently selected endpoint, which have been queued for
+ * transmission via the \ref Endpoint_ClearIN() command, or are awaiting acknowledgement via the
+ * \ref Endpoint_ClearOUT() command.
+ *
+ * \ingroup Group_EndpointPacketManagement_UC3
+ *
+ * \return Total number of busy banks in the selected endpoint.
+ */
+ static inline uint8_t Endpoint_GetBusyBanks(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+ static inline uint8_t Endpoint_GetBusyBanks(void)
+ {
+ return (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].nbusybk;
+ }
+
+ /** 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_UC3
+ */
+ static inline void Endpoint_AbortPendingIN(void)
+ {
+ while (Endpoint_GetBusyBanks() != 0)
+ {
+ (&AVR32_USBB.UECON0SET)[USB_SelectedEndpoint].killbks = true;
+ while ((&AVR32_USBB.UECON0)[USB_SelectedEndpoint].killbk);
+ }
+ }
+
+ /** 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_UC3
+ *
+ * \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 (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].rwall;
+ }
+
+ /** 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 (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].cfgok;
+ }
+
+ /** Returns a mask indicating which INTERRUPT type endpoints have interrupted - i.e. their
+ * interrupt duration has elapsed. Which endpoints have interrupted can be determined by
+ * masking the return value against <tt>(1 << <i>{Endpoint Number}</i>)</tt>.
+ *
+ * \return Mask whose bits indicate which endpoints have interrupted.
+ */
+ static inline uint8_t Endpoint_GetEndpointInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint8_t Endpoint_GetEndpointInterrupts(void)
+ {
+ return ((AVR32_USBB.udint & (AVR32_USBB_EP6INT_MASK | AVR32_USBB_EP5INT_MASK |
+ AVR32_USBB_EP4INT_MASK | AVR32_USBB_EP3INT_MASK |
+ AVR32_USBB_EP2INT_MASK | AVR32_USBB_EP1INT_MASK |
+ AVR32_USBB_EP0INT_MASK)) >> AVR32_USBB_EP0INT_OFFSET);
+ }
+
+ /** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type
+ * endpoints).
+ *
+ * \param[in] EndpointNumber Index of the endpoint whose interrupt flag should be tested.
+ *
+ * \return Boolean \c true if the specified endpoint has interrupted, \c false otherwise.
+ */
+ static inline bool Endpoint_HasEndpointInterrupted(const uint8_t EndpointNumber) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Endpoint_HasEndpointInterrupted(const uint8_t EndpointNumber)
+ {
+ return ((Endpoint_GetEndpointInterrupts() & (AVR32_USBB_EP0INT_MASK << EndpointNumber)) ? true : false);
+ }
+
+ /** Determines if the selected IN endpoint is ready for a new packet to be sent to the host.
+ *
+ * \ingroup Group_EndpointPacketManagement_UC3
+ *
+ * \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise.
+ */
+ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Endpoint_IsINReady(void)
+ {
+ return (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].txini;
+ }
+
+ /** Determines if the selected OUT endpoint has received new packet from the host.
+ *
+ * \ingroup Group_EndpointPacketManagement_UC3
+ *
+ * \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise.
+ */
+ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Endpoint_IsOUTReceived(void)
+ {
+ return (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].rxouti;
+ }
+
+ /** Determines if the current CONTROL type endpoint has received a SETUP packet.
+ *
+ * \ingroup Group_EndpointPacketManagement_UC3
+ *
+ * \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise.
+ */
+ static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Endpoint_IsSETUPReceived(void)
+ {
+ return (&AVR32_USBB.UESTA0)[USB_SelectedEndpoint].rxstpi;
+ }
+
+ /** Clears a received SETUP packet on the currently selected CONTROL type endpoint, freeing up the
+ * endpoint for the next packet.
+ *
+ * \ingroup Group_EndpointPacketManagement_UC3
+ *
+ * \note This is not applicable for non CONTROL type endpoints.
+ */
+ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_ClearSETUP(void)
+ {
+ (&AVR32_USBB.UESTA0CLR)[USB_SelectedEndpoint].rxstpic = true;
+ USB_EndpointFIFOPos[USB_SelectedEndpoint] = &AVR32_USBB_SLAVE[USB_SelectedEndpoint * ENDPOINT_HSB_ADDRESS_SPACE_SIZE];
+ }
+
+ /** 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_UC3
+ */
+ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_ClearIN(void)
+ {
+ (&AVR32_USBB.UESTA0CLR)[USB_SelectedEndpoint].txinic = true;
+ (&AVR32_USBB.UECON0CLR)[USB_SelectedEndpoint].fifoconc = true;
+ USB_EndpointFIFOPos[USB_SelectedEndpoint] = &AVR32_USBB_SLAVE[USB_SelectedEndpoint * ENDPOINT_HSB_ADDRESS_SPACE_SIZE];
+ }
+
+ /** 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_UC3
+ */
+ static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_ClearOUT(void)
+ {
+ (&AVR32_USBB.UESTA0CLR)[USB_SelectedEndpoint].rxoutic = true;
+ (&AVR32_USBB.UECON0CLR)[USB_SelectedEndpoint].fifoconc = true;
+ USB_EndpointFIFOPos[USB_SelectedEndpoint] = &AVR32_USBB_SLAVE[USB_SelectedEndpoint * ENDPOINT_HSB_ADDRESS_SPACE_SIZE];
+ }
+
+ /** 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_UC3
+ */
+ static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_StallTransaction(void)
+ {
+ (&AVR32_USBB.UECON0SET)[USB_SelectedEndpoint].stallrqs = true;
+ }
+
+ /** Clears the STALL condition on the currently selected endpoint.
+ *
+ * \ingroup Group_EndpointPacketManagement_UC3
+ */
+ static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_ClearStall(void)
+ {
+ (&AVR32_USBB.UECON0CLR)[USB_SelectedEndpoint].stallrqc = true;
+ }
+
+ /** Determines if the currently selected endpoint is stalled, false otherwise.
+ *
+ * \ingroup Group_EndpointPacketManagement_UC3
+ *
+ * \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 (&AVR32_USBB.UECON0)[USB_SelectedEndpoint].stallrq;
+ }
+
+ /** Resets the data toggle of the currently selected endpoint. */
+ static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_ResetDataToggle(void)
+ {
+ (&AVR32_USBB.UECON0SET)[USB_SelectedEndpoint].rstdts = true;
+ }
+
+ /** Determines the currently selected endpoint's direction.
+ *
+ * \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask.
+ */
+ static inline uint32_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint32_t Endpoint_GetEndpointDirection(void)
+ {
+ return ((&AVR32_USBB.UECFG0)[USB_SelectedEndpoint].epdir ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT);
+ }
+
+ /** Sets the direction of the currently selected endpoint.
+ *
+ * \param[in] DirectionMask New endpoint direction, as a \c ENDPOINT_DIR_* mask.
+ */
+ static inline void Endpoint_SetEndpointDirection(const uint32_t DirectionMask) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_SetEndpointDirection(const uint32_t DirectionMask)
+ {
+ (&AVR32_USBB.UECFG0)[USB_SelectedEndpoint].epdir = (DirectionMask == ENDPOINT_DIR_IN);
+ }
+
+ /** Reads one byte from the currently selected endpoint's bank, for OUT direction endpoints.
+ *
+ * \ingroup Group_EndpointPrimitiveRW_UC3
+ *
+ * \return Next byte in the currently selected endpoint's FIFO buffer.
+ */
+ static inline uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint8_t Endpoint_Read_8(void)
+ {
+ return *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ }
+
+ /** Writes one byte to the currently selected endpoint's bank, for IN direction endpoints.
+ *
+ * \ingroup Group_EndpointPrimitiveRW_UC3
+ *
+ * \param[in] Data Data to write into the the currently selected endpoint's FIFO buffer.
+ */
+ static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_Write_8(const uint8_t Data)
+ {
+ *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = Data;
+ }
+
+ /** Discards one byte from the currently selected endpoint's bank, for OUT direction endpoints.
+ *
+ * \ingroup Group_EndpointPrimitiveRW_UC3
+ */
+ static inline void Endpoint_Discard_8(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_Discard_8(void)
+ {
+ uint8_t Dummy;
+
+ Dummy = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ }
+
+ /** Reads two bytes from the currently selected endpoint's bank in little endian format, for OUT
+ * direction endpoints.
+ *
+ * \ingroup Group_EndpointPrimitiveRW_UC3
+ *
+ * \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 Byte1 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ uint16_t Byte0 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+
+ return ((Byte0 << 8) | Byte1);
+ }
+
+ /** Reads two bytes from the currently selected endpoint's bank in big endian format, for OUT
+ * direction endpoints.
+ *
+ * \ingroup Group_EndpointPrimitiveRW_UC3
+ *
+ * \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 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ uint16_t Byte1 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+
+ 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_UC3
+ *
+ * \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)
+ {
+ *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 8);
+ *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data & 0xFF);
+ }
+
+ /** Writes two bytes to the currently selected endpoint's bank in big endian format, for IN
+ * direction endpoints.
+ *
+ * \ingroup Group_EndpointPrimitiveRW_UC3
+ *
+ * \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)
+ {
+ *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data & 0xFF);
+ *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 8);
+ }
+
+ /** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints.
+ *
+ * \ingroup Group_EndpointPrimitiveRW_UC3
+ */
+ static inline void Endpoint_Discard_16(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_Discard_16(void)
+ {
+ uint8_t Dummy;
+
+ Dummy = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ Dummy = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ }
+
+ /** Reads four bytes from the currently selected endpoint's bank in little endian format, for OUT
+ * direction endpoints.
+ *
+ * \ingroup Group_EndpointPrimitiveRW_UC3
+ *
+ * \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 Byte3 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ uint32_t Byte2 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ uint32_t Byte1 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ uint32_t Byte0 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+
+ return ((Byte0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3);
+ }
+
+ /** Reads four bytes from the currently selected endpoint's bank in big endian format, for OUT
+ * direction endpoints.
+ *
+ * \ingroup Group_EndpointPrimitiveRW_UC3
+ *
+ * \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 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ uint32_t Byte1 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ uint32_t Byte2 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ uint32_t Byte3 = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+
+ 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_UC3
+ *
+ * \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)
+ {
+ *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 24);
+ *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 16);
+ *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 8);
+ *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data & 0xFF);
+ }
+
+ /** Writes four bytes to the currently selected endpoint's bank in big endian format, for IN
+ * direction endpoints.
+ *
+ * \ingroup Group_EndpointPrimitiveRW_UC3
+ *
+ * \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)
+ {
+ *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data & 0xFF);
+ *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 8);
+ *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 16);
+ *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++) = (Data >> 24);
+ }
+
+ /** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints.
+ *
+ * \ingroup Group_EndpointPrimitiveRW_UC3
+ */
+ static inline void Endpoint_Discard_32(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_Discard_32(void)
+ {
+ uint8_t Dummy;
+
+ Dummy = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ Dummy = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ Dummy = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ Dummy = *(USB_EndpointFIFOPos[USB_SelectedEndpoint]++);
+ }
+
+ /* 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.
+ *
+ * \note 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: */
+ /** 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.
+ */
+ 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_UC3
+ *
+ * \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
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/UC3/Host_UC3.c b/LUFA/Drivers/USB/Core/UC3/Host_UC3.c
index a56ef4819..55cd8f991 100644
--- a/LUFA/Drivers/USB/Core/UC3/Host_UC3.c
+++ b/LUFA/Drivers/USB/Core/UC3/Host_UC3.c
@@ -1,292 +1,292 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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)
-
-#define __INCLUDE_FROM_HOST_C
-#include "../Host.h"
-
-void USB_Host_ProcessNextHostState(void)
-{
- uint8_t ErrorCode = HOST_ENUMERROR_NoError;
- uint8_t SubErrorCode = HOST_ENUMERROR_NoError;
-
- static uint16_t WaitMSRemaining;
- static uint8_t PostWaitState;
-
- switch (USB_HostState)
- {
- case HOST_STATE_WaitForDevice:
- if (WaitMSRemaining)
- {
- if ((SubErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
- {
- USB_HostState = PostWaitState;
- ErrorCode = HOST_ENUMERROR_WaitStage;
- break;
- }
-
- if (!(--WaitMSRemaining))
- USB_HostState = PostWaitState;
- }
-
- break;
- case HOST_STATE_Powered:
- WaitMSRemaining = HOST_DEVICE_SETTLE_DELAY_MS;
-
- USB_HostState = HOST_STATE_Powered_WaitForDeviceSettle;
- break;
- case HOST_STATE_Powered_WaitForDeviceSettle:
- if (WaitMSRemaining--)
- {
- Delay_MS(1);
- break;
- }
- else
- {
- USB_Host_VBUS_Manual_Off();
-
- USB_OTGPAD_On();
- USB_Host_VBUS_Auto_Enable();
- USB_Host_VBUS_Auto_On();
-
- USB_HostState = HOST_STATE_Powered_WaitForConnect;
- }
-
- break;
- case HOST_STATE_Powered_WaitForConnect:
- if (USB_INT_HasOccurred(USB_INT_DCONNI))
- {
- USB_INT_Clear(USB_INT_DCONNI);
- USB_INT_Clear(USB_INT_DDISCI);
-
- USB_INT_Clear(USB_INT_VBERRI);
- USB_INT_Enable(USB_INT_VBERRI);
-
- USB_Host_ResumeBus();
- Pipe_ClearPipes();
-
- HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Powered_DoReset);
- }
-
- break;
- case HOST_STATE_Powered_DoReset:
- USB_Host_ResetDevice();
-
- HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Powered_ConfigPipe);
- break;
- case HOST_STATE_Powered_ConfigPipe:
- Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
- PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
- PIPE_CONTROLPIPE_DEFAULT_SIZE, PIPE_BANK_SINGLE);
-
- if (!(Pipe_IsConfigured()))
- {
- ErrorCode = HOST_ENUMERROR_PipeConfigError;
- SubErrorCode = 0;
- break;
- }
-
- USB_HostState = HOST_STATE_Default;
- break;
- case HOST_STATE_Default:
- USB_ControlRequest = (USB_Request_Header_t)
- {
- .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
- .bRequest = REQ_GetDescriptor,
- .wValue = (DTYPE_Device << 8),
- .wIndex = 0,
- .wLength = 8,
- };
-
- uint8_t DataBuffer[8];
-
- if ((SubErrorCode = USB_Host_SendControlRequest(DataBuffer)) != HOST_SENDCONTROL_Successful)
- {
- ErrorCode = HOST_ENUMERROR_ControlError;
- break;
- }
-
- USB_Host_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, Endpoint0Size)];
-
- USB_Host_ResetDevice();
-
- HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Default_PostReset);
- break;
- case HOST_STATE_Default_PostReset:
- Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
- PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
- USB_Host_ControlPipeSize, PIPE_BANK_SINGLE);
-
- if (!(Pipe_IsConfigured()))
- {
- ErrorCode = HOST_ENUMERROR_PipeConfigError;
- SubErrorCode = 0;
- break;
- }
-
- USB_ControlRequest = (USB_Request_Header_t)
- {
- .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
- .bRequest = REQ_SetAddress,
- .wValue = USB_HOST_DEVICEADDRESS,
- .wIndex = 0,
- .wLength = 0,
- };
-
- if ((SubErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
- {
- ErrorCode = HOST_ENUMERROR_ControlError;
- break;
- }
-
- HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Default_PostAddressSet);
- break;
- case HOST_STATE_Default_PostAddressSet:
- USB_Host_SetDeviceAddress(USB_HOST_DEVICEADDRESS);
-
- USB_HostState = HOST_STATE_Addressed;
-
- EVENT_USB_Host_DeviceEnumerationComplete();
- break;
- }
-
- if ((ErrorCode != HOST_ENUMERROR_NoError) && (USB_HostState != HOST_STATE_Unattached))
- {
- EVENT_USB_Host_DeviceEnumerationFailed(ErrorCode, SubErrorCode);
-
- USB_Host_VBUS_Auto_Off();
-
- EVENT_USB_Host_DeviceUnattached();
-
- USB_ResetInterface();
- }
-}
-
-uint8_t USB_Host_WaitMS(uint8_t MS)
-{
- bool BusSuspended = USB_Host_IsBusSuspended();
- uint8_t ErrorCode = HOST_WAITERROR_Successful;
- bool HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI);
-
- USB_INT_Disable(USB_INT_HSOFI);
- USB_INT_Clear(USB_INT_HSOFI);
-
- USB_Host_ResumeBus();
-
- while (MS)
- {
- if (USB_INT_HasOccurred(USB_INT_HSOFI))
- {
- USB_INT_Clear(USB_INT_HSOFI);
- MS--;
- }
-
- if ((USB_HostState == HOST_STATE_Unattached) || (USB_CurrentMode != USB_MODE_Host))
- {
- ErrorCode = HOST_WAITERROR_DeviceDisconnect;
-
- break;
- }
-
- if (Pipe_IsError() == true)
- {
- Pipe_ClearError();
- ErrorCode = HOST_WAITERROR_PipeError;
-
- break;
- }
-
- if (Pipe_IsStalled() == true)
- {
- Pipe_ClearStall();
- ErrorCode = HOST_WAITERROR_SetupStalled;
-
- break;
- }
- }
-
- if (BusSuspended)
- USB_Host_SuspendBus();
-
- if (HSOFIEnabled)
- USB_INT_Enable(USB_INT_HSOFI);
-
- return ErrorCode;
-}
-
-static void USB_Host_ResetDevice(void)
-{
- bool BusSuspended = USB_Host_IsBusSuspended();
-
- USB_INT_Disable(USB_INT_DDISCI);
-
- USB_Host_ResetBus();
- while (!(USB_Host_IsBusResetComplete()));
- USB_Host_ResumeBus();
-
- USB_Host_ConfigurationNumber = 0;
-
- bool HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI);
-
- USB_INT_Disable(USB_INT_HSOFI);
- USB_INT_Clear(USB_INT_HSOFI);
-
- for (uint8_t MSRem = 10; MSRem != 0; MSRem--)
- {
- /* Workaround for powerless-pull-up devices. After a USB bus reset,
- all disconnection interrupts are suppressed while a USB frame is
- looked for - if it is found within 10ms, the device is still
- present. */
-
- if (USB_INT_HasOccurred(USB_INT_HSOFI))
- {
- USB_INT_Clear(USB_INT_HSOFI);
- USB_INT_Clear(USB_INT_DDISCI);
- break;
- }
-
- Delay_MS(1);
- }
-
- if (HSOFIEnabled)
- USB_INT_Enable(USB_INT_HSOFI);
-
- if (BusSuspended)
- USB_Host_SuspendBus();
-
- USB_INT_Enable(USB_INT_DDISCI);
-}
-
-#endif
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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)
+
+#define __INCLUDE_FROM_HOST_C
+#include "../Host.h"
+
+void USB_Host_ProcessNextHostState(void)
+{
+ uint8_t ErrorCode = HOST_ENUMERROR_NoError;
+ uint8_t SubErrorCode = HOST_ENUMERROR_NoError;
+
+ static uint16_t WaitMSRemaining;
+ static uint8_t PostWaitState;
+
+ switch (USB_HostState)
+ {
+ case HOST_STATE_WaitForDevice:
+ if (WaitMSRemaining)
+ {
+ if ((SubErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful)
+ {
+ USB_HostState = PostWaitState;
+ ErrorCode = HOST_ENUMERROR_WaitStage;
+ break;
+ }
+
+ if (!(--WaitMSRemaining))
+ USB_HostState = PostWaitState;
+ }
+
+ break;
+ case HOST_STATE_Powered:
+ WaitMSRemaining = HOST_DEVICE_SETTLE_DELAY_MS;
+
+ USB_HostState = HOST_STATE_Powered_WaitForDeviceSettle;
+ break;
+ case HOST_STATE_Powered_WaitForDeviceSettle:
+ if (WaitMSRemaining--)
+ {
+ Delay_MS(1);
+ break;
+ }
+ else
+ {
+ USB_Host_VBUS_Manual_Off();
+
+ USB_OTGPAD_On();
+ USB_Host_VBUS_Auto_Enable();
+ USB_Host_VBUS_Auto_On();
+
+ USB_HostState = HOST_STATE_Powered_WaitForConnect;
+ }
+
+ break;
+ case HOST_STATE_Powered_WaitForConnect:
+ if (USB_INT_HasOccurred(USB_INT_DCONNI))
+ {
+ USB_INT_Clear(USB_INT_DCONNI);
+ USB_INT_Clear(USB_INT_DDISCI);
+
+ USB_INT_Clear(USB_INT_VBERRI);
+ USB_INT_Enable(USB_INT_VBERRI);
+
+ USB_Host_ResumeBus();
+ Pipe_ClearPipes();
+
+ HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Powered_DoReset);
+ }
+
+ break;
+ case HOST_STATE_Powered_DoReset:
+ USB_Host_ResetDevice();
+
+ HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Powered_ConfigPipe);
+ break;
+ case HOST_STATE_Powered_ConfigPipe:
+ Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
+ PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
+ PIPE_CONTROLPIPE_DEFAULT_SIZE, PIPE_BANK_SINGLE);
+
+ if (!(Pipe_IsConfigured()))
+ {
+ ErrorCode = HOST_ENUMERROR_PipeConfigError;
+ SubErrorCode = 0;
+ break;
+ }
+
+ USB_HostState = HOST_STATE_Default;
+ break;
+ case HOST_STATE_Default:
+ USB_ControlRequest = (USB_Request_Header_t)
+ {
+ .bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE),
+ .bRequest = REQ_GetDescriptor,
+ .wValue = (DTYPE_Device << 8),
+ .wIndex = 0,
+ .wLength = 8,
+ };
+
+ uint8_t DataBuffer[8];
+
+ if ((SubErrorCode = USB_Host_SendControlRequest(DataBuffer)) != HOST_SENDCONTROL_Successful)
+ {
+ ErrorCode = HOST_ENUMERROR_ControlError;
+ break;
+ }
+
+ USB_Host_ControlPipeSize = DataBuffer[offsetof(USB_Descriptor_Device_t, Endpoint0Size)];
+
+ USB_Host_ResetDevice();
+
+ HOST_TASK_NONBLOCK_WAIT(200, HOST_STATE_Default_PostReset);
+ break;
+ case HOST_STATE_Default_PostReset:
+ Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL,
+ PIPE_TOKEN_SETUP, ENDPOINT_CONTROLEP,
+ USB_Host_ControlPipeSize, PIPE_BANK_SINGLE);
+
+ if (!(Pipe_IsConfigured()))
+ {
+ ErrorCode = HOST_ENUMERROR_PipeConfigError;
+ SubErrorCode = 0;
+ break;
+ }
+
+ USB_ControlRequest = (USB_Request_Header_t)
+ {
+ .bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE),
+ .bRequest = REQ_SetAddress,
+ .wValue = USB_HOST_DEVICEADDRESS,
+ .wIndex = 0,
+ .wLength = 0,
+ };
+
+ if ((SubErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful)
+ {
+ ErrorCode = HOST_ENUMERROR_ControlError;
+ break;
+ }
+
+ HOST_TASK_NONBLOCK_WAIT(100, HOST_STATE_Default_PostAddressSet);
+ break;
+ case HOST_STATE_Default_PostAddressSet:
+ USB_Host_SetDeviceAddress(USB_HOST_DEVICEADDRESS);
+
+ USB_HostState = HOST_STATE_Addressed;
+
+ EVENT_USB_Host_DeviceEnumerationComplete();
+ break;
+ }
+
+ if ((ErrorCode != HOST_ENUMERROR_NoError) && (USB_HostState != HOST_STATE_Unattached))
+ {
+ EVENT_USB_Host_DeviceEnumerationFailed(ErrorCode, SubErrorCode);
+
+ USB_Host_VBUS_Auto_Off();
+
+ EVENT_USB_Host_DeviceUnattached();
+
+ USB_ResetInterface();
+ }
+}
+
+uint8_t USB_Host_WaitMS(uint8_t MS)
+{
+ bool BusSuspended = USB_Host_IsBusSuspended();
+ uint8_t ErrorCode = HOST_WAITERROR_Successful;
+ bool HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI);
+
+ USB_INT_Disable(USB_INT_HSOFI);
+ USB_INT_Clear(USB_INT_HSOFI);
+
+ USB_Host_ResumeBus();
+
+ while (MS)
+ {
+ if (USB_INT_HasOccurred(USB_INT_HSOFI))
+ {
+ USB_INT_Clear(USB_INT_HSOFI);
+ MS--;
+ }
+
+ if ((USB_HostState == HOST_STATE_Unattached) || (USB_CurrentMode != USB_MODE_Host))
+ {
+ ErrorCode = HOST_WAITERROR_DeviceDisconnect;
+
+ break;
+ }
+
+ if (Pipe_IsError() == true)
+ {
+ Pipe_ClearError();
+ ErrorCode = HOST_WAITERROR_PipeError;
+
+ break;
+ }
+
+ if (Pipe_IsStalled() == true)
+ {
+ Pipe_ClearStall();
+ ErrorCode = HOST_WAITERROR_SetupStalled;
+
+ break;
+ }
+ }
+
+ if (BusSuspended)
+ USB_Host_SuspendBus();
+
+ if (HSOFIEnabled)
+ USB_INT_Enable(USB_INT_HSOFI);
+
+ return ErrorCode;
+}
+
+static void USB_Host_ResetDevice(void)
+{
+ bool BusSuspended = USB_Host_IsBusSuspended();
+
+ USB_INT_Disable(USB_INT_DDISCI);
+
+ USB_Host_ResetBus();
+ while (!(USB_Host_IsBusResetComplete()));
+ USB_Host_ResumeBus();
+
+ USB_Host_ConfigurationNumber = 0;
+
+ bool HSOFIEnabled = USB_INT_IsEnabled(USB_INT_HSOFI);
+
+ USB_INT_Disable(USB_INT_HSOFI);
+ USB_INT_Clear(USB_INT_HSOFI);
+
+ for (uint8_t MSRem = 10; MSRem != 0; MSRem--)
+ {
+ /* Workaround for powerless-pull-up devices. After a USB bus reset,
+ all disconnection interrupts are suppressed while a USB frame is
+ looked for - if it is found within 10ms, the device is still
+ present. */
+
+ if (USB_INT_HasOccurred(USB_INT_HSOFI))
+ {
+ USB_INT_Clear(USB_INT_HSOFI);
+ USB_INT_Clear(USB_INT_DDISCI);
+ break;
+ }
+
+ Delay_MS(1);
+ }
+
+ if (HSOFIEnabled)
+ USB_INT_Enable(USB_INT_HSOFI);
+
+ if (BusSuspended)
+ USB_Host_SuspendBus();
+
+ USB_INT_Enable(USB_INT_DDISCI);
+}
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/UC3/Host_UC3.h b/LUFA/Drivers/USB/Core/UC3/Host_UC3.h
index 4bcba566b..6191559db 100644
--- a/LUFA/Drivers/USB/Core/UC3/Host_UC3.h
+++ b/LUFA/Drivers/USB/Core/UC3/Host_UC3.h
@@ -1,372 +1,372 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Host definitions for the AVR32 UC3B microcontrollers.
- * \copydetails Group_Host_UC3B
- *
- * \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_Host
- * \defgroup Group_Host_UC3B Host Management (UC3B)
- * \brief USB Host definitions for the AVR32 UC3B microcontrollers.
- *
- * Architecture specific USB Host definitions for the Atmel 32-bit AVR UC3B microcontrollers.
- *
- * @{
- */
-
-#ifndef __USBHOST_UC3B_H__
-#define __USBHOST_UC3B_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
- #include "../StdDescriptors.h"
- #include "../Pipe.h"
- #include "../USBInterrupt.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: */
- /** Indicates the fixed USB device address which any attached device is enumerated to when in
- * host mode. As only one USB device may be attached to the AVR in host mode at any one time
- * and that the address used is not important (other than the fact that it is non-zero), a
- * fixed value is specified by the library.
- */
- #define USB_HOST_DEVICEADDRESS 1
-
- #if !defined(USB_HOST_TIMEOUT_MS) || defined(__DOXYGEN__)
- /** Constant for the maximum software timeout period of sent USB control transactions to an attached
- * device. If a device fails to respond to a sent control request within this period, the
- * library will return a timeout error code.
- *
- * This value may be overridden in the user project makefile as the value of the
- * \ref USB_HOST_TIMEOUT_MS token, and passed to the compiler using the -D switch.
- */
- #define USB_HOST_TIMEOUT_MS 1000
- #endif
-
- #if !defined(HOST_DEVICE_SETTLE_DELAY_MS) || defined(__DOXYGEN__)
- /** Constant for the delay in milliseconds after a device is connected before the library
- * will start the enumeration process. Some devices require a delay of up to 5 seconds
- * after connection before the enumeration process can start or incorrect operation will
- * occur.
- *
- * The default delay value may be overridden in the user project makefile by defining the
- * \c HOST_DEVICE_SETTLE_DELAY_MS token to the required delay in milliseconds, and passed to the
- * compiler using the -D switch.
- */
- #define HOST_DEVICE_SETTLE_DELAY_MS 1000
- #endif
-
- /* Enums: */
- /** Enum for the error codes for the \ref EVENT_USB_Host_HostError() event.
- *
- * \see \ref Group_Events for more information on this event.
- */
- enum USB_Host_ErrorCodes_t
- {
- HOST_ERROR_VBusVoltageDip = 0, /**< VBUS voltage dipped to an unacceptable level. This
- * error may be the result of an attached device drawing
- * too much current from the VBUS line, or due to the
- * AVR's power source being unable to supply sufficient
- * current.
- */
- };
-
- /** Enum for the error codes for the \ref EVENT_USB_Host_DeviceEnumerationFailed() event.
- *
- * \see \ref Group_Events for more information on this event.
- */
- enum USB_Host_EnumerationErrorCodes_t
- {
- HOST_ENUMERROR_NoError = 0, /**< No error occurred. Used internally, this is not a valid
- * ErrorCode parameter value for the \ref EVENT_USB_Host_DeviceEnumerationFailed()
- * event.
- */
- HOST_ENUMERROR_WaitStage = 1, /**< One of the delays between enumeration steps failed
- * to complete successfully, due to a timeout or other
- * error.
- */
- HOST_ENUMERROR_NoDeviceDetected = 2, /**< No device was detected, despite the USB data lines
- * indicating the attachment of a device.
- */
- HOST_ENUMERROR_ControlError = 3, /**< One of the enumeration control requests failed to
- * complete successfully.
- */
- HOST_ENUMERROR_PipeConfigError = 4, /**< The default control pipe (address 0) failed to
- * configure correctly.
- */
- };
-
- /* Inline Functions: */
- /** Returns the current USB frame number, when in host mode. Every millisecond the USB bus is active (i.e. not suspended)
- * the frame number is incremented by one.
- */
- static inline uint16_t USB_Host_GetFrameNumber(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint16_t USB_Host_GetFrameNumber(void)
- {
- return AVR32_USBB_UHFNUM;
- }
-
- #if !defined(NO_SOF_EVENTS)
- /** Enables the host mode Start Of Frame events. When enabled, this causes the
- * \ref EVENT_USB_Host_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
- * at the start of each USB frame when a device is enumerated while in host mode.
- *
- * \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
- */
- static inline void USB_Host_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_EnableSOFEvents(void)
- {
- USB_INT_Enable(USB_INT_HSOFI);
- }
-
- /** Disables the host mode Start Of Frame events. When disabled, this stops the firing of the
- * \ref EVENT_USB_Host_StartOfFrame() event when enumerated in host mode.
- *
- * \note Not available when the NO_SOF_EVENTS compile time token is defined.
- */
- static inline void USB_Host_DisableSOFEvents(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_DisableSOFEvents(void)
- {
- USB_INT_Disable(USB_INT_HSOFI);
- }
- #endif
-
- /** Resets the USB bus, including the endpoints in any attached device and pipes on the AVR host.
- * USB bus resets leave the default control pipe configured (if already configured).
- *
- * If the USB bus has been suspended prior to issuing a bus reset, the attached device will be
- * woken up automatically and the bus resumed after the reset has been correctly issued.
- */
- static inline void USB_Host_ResetBus(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_ResetBus(void)
- {
- AVR32_USBB.UHCON.reset = true;
- }
-
- /** Determines if a previously issued bus reset (via the \ref USB_Host_ResetBus() macro) has
- * completed.
- *
- * \return Boolean \c true if no bus reset is currently being sent, \c false otherwise.
- */
- static inline bool USB_Host_IsBusResetComplete(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool USB_Host_IsBusResetComplete(void)
- {
- return AVR32_USBB.UHCON.reset;
- }
-
- /** Resumes USB communications with an attached and enumerated device, by resuming the transmission
- * of the 1MS Start Of Frame messages to the device. When resumed, USB communications between the
- * host and attached device may occur.
- */
- static inline void USB_Host_ResumeBus(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_ResumeBus(void)
- {
- AVR32_USBB.UHCON.sofe = true;
- }
-
- /** Suspends the USB bus, preventing any communications from occurring between the host and attached
- * device until the bus has been resumed. This stops the transmission of the 1MS Start Of Frame
- * messages to the device.
- *
- * \note While the USB bus is suspended, all USB interrupt sources are also disabled; this means that
- * some events (such as device disconnections) will not fire until the bus is resumed.
- */
- static inline void USB_Host_SuspendBus(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_SuspendBus(void)
- {
- AVR32_USBB.UHCON.sofe = false;
- }
-
- /** Determines if the USB bus has been suspended via the use of the \ref USB_Host_SuspendBus() macro,
- * false otherwise. While suspended, no USB communications can occur until the bus is resumed,
- * except for the Remote Wakeup event from the device if supported.
- *
- * \return Boolean \c true if the bus is currently suspended, \c false otherwise.
- */
- static inline bool USB_Host_IsBusSuspended(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool USB_Host_IsBusSuspended(void)
- {
- return AVR32_USBB.UHCON.sofe;
- }
-
- /** Determines if the attached device is currently enumerated in Full Speed mode (12Mb/s), or
- * false if the attached device is enumerated in Low Speed mode (1.5Mb/s).
- *
- * \return Boolean \c true if the attached device is enumerated in Full Speed mode, \c false otherwise.
- */
- static inline bool USB_Host_IsDeviceFullSpeed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool USB_Host_IsDeviceFullSpeed(void)
- {
- return (AVR32_USBB.USBSTA.speed == AVR32_USBB_SPEED_FULL);
- }
-
- /** Determines if the attached device is currently issuing a Remote Wakeup request, requesting
- * that the host resume the USB bus and wake up the device, false otherwise.
- *
- * \return Boolean \c true if the attached device has sent a Remote Wakeup request, \c false otherwise.
- */
- static inline bool USB_Host_IsRemoteWakeupSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool USB_Host_IsRemoteWakeupSent(void)
- {
- return AVR32_USBB.UHINT.rxrsmi;
- }
-
- /** Clears the flag indicating that a Remote Wakeup request has been issued by an attached device. */
- static inline void USB_Host_ClearRemoteWakeupSent(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_ClearRemoteWakeupSent(void)
- {
- AVR32_USBB.UHINTCLR.rxrsmic = true;
- }
-
- /** Accepts a Remote Wakeup request from an attached device. This must be issued in response to
- * a device's Remote Wakeup request within 2ms for the request to be accepted and the bus to
- * be resumed.
- */
- static inline void USB_Host_ResumeFromWakeupRequest(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_ResumeFromWakeupRequest(void)
- {
- AVR32_USBB.UHCON.resume = true;
- }
-
- /** Determines if a resume from Remote Wakeup request is currently being sent to an attached
- * device.
- *
- * \return Boolean \c true if no resume request is currently being sent, \c false otherwise.
- */
- static inline bool USB_Host_IsResumeFromWakeupRequestSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool USB_Host_IsResumeFromWakeupRequestSent(void)
- {
- return AVR32_USBB.UHCON.resume;
- }
-
- /* Private Interface - For use in library only: */
- #if !defined(__DOXYGEN__)
- /* Macros: */
- static inline void USB_Host_HostMode_On(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_HostMode_On(void)
- {
- // Not required for UC3B
- }
-
- static inline void USB_Host_HostMode_Off(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_HostMode_Off(void)
- {
- // Not required for UC3B
- }
-
- static inline void USB_Host_VBUS_Auto_Enable(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_VBUS_Auto_Enable(void)
- {
- AVR32_USBB.USBCON.vbushwc = false;
- }
-
- static inline void USB_Host_VBUS_Manual_Enable(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_VBUS_Manual_Enable(void)
- {
- AVR32_USBB.USBCON.vbushwc = true;
- }
-
- static inline void USB_Host_VBUS_Auto_On(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_VBUS_Auto_On(void)
- {
- AVR32_USBB.USBSTASET.vbusrqs = true;
- }
-
- static inline void USB_Host_VBUS_Manual_On(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_VBUS_Manual_On(void)
- {
- AVR32_USBB.USBSTASET.vbusrqs = true;
- }
-
- static inline void USB_Host_VBUS_Auto_Off(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_VBUS_Auto_Off(void)
- {
- AVR32_USBB.USBSTACLR.vbusrqc = true;
- }
-
- static inline void USB_Host_VBUS_Manual_Off(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_VBUS_Manual_Off(void)
- {
- AVR32_USBB.USBSTACLR.vbusrqc = true;
- }
-
- static inline void USB_Host_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
- static inline void USB_Host_SetDeviceAddress(const uint8_t Address)
- {
- AVR32_USBB.UHADDR1.uhaddr_p0 = Address;
- AVR32_USBB.UHADDR1.uhaddr_p1 = Address;
- AVR32_USBB.UHADDR1.uhaddr_p2 = Address;
- AVR32_USBB.UHADDR1.uhaddr_p3 = Address;
- AVR32_USBB.UHADDR2.uhaddr_p4 = Address;
- AVR32_USBB.UHADDR2.uhaddr_p5 = Address;
- AVR32_USBB.UHADDR2.uhaddr_p6 = Address;
- }
-
- /* Enums: */
- enum USB_Host_WaitMSErrorCodes_t
- {
- HOST_WAITERROR_Successful = 0,
- HOST_WAITERROR_DeviceDisconnect = 1,
- HOST_WAITERROR_PipeError = 2,
- HOST_WAITERROR_SetupStalled = 3,
- };
-
- /* Function Prototypes: */
- void USB_Host_ProcessNextHostState(void);
- uint8_t USB_Host_WaitMS(uint8_t MS);
-
- #if defined(__INCLUDE_FROM_HOST_C)
- static void USB_Host_ResetDevice(void);
- #endif
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Host definitions for the AVR32 UC3B microcontrollers.
+ * \copydetails Group_Host_UC3B
+ *
+ * \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_Host
+ * \defgroup Group_Host_UC3B Host Management (UC3B)
+ * \brief USB Host definitions for the AVR32 UC3B microcontrollers.
+ *
+ * Architecture specific USB Host definitions for the Atmel 32-bit AVR UC3B microcontrollers.
+ *
+ * @{
+ */
+
+#ifndef __USBHOST_UC3B_H__
+#define __USBHOST_UC3B_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+ #include "../StdDescriptors.h"
+ #include "../Pipe.h"
+ #include "../USBInterrupt.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: */
+ /** Indicates the fixed USB device address which any attached device is enumerated to when in
+ * host mode. As only one USB device may be attached to the AVR in host mode at any one time
+ * and that the address used is not important (other than the fact that it is non-zero), a
+ * fixed value is specified by the library.
+ */
+ #define USB_HOST_DEVICEADDRESS 1
+
+ #if !defined(USB_HOST_TIMEOUT_MS) || defined(__DOXYGEN__)
+ /** Constant for the maximum software timeout period of sent USB control transactions to an attached
+ * device. If a device fails to respond to a sent control request within this period, the
+ * library will return a timeout error code.
+ *
+ * This value may be overridden in the user project makefile as the value of the
+ * \ref USB_HOST_TIMEOUT_MS token, and passed to the compiler using the -D switch.
+ */
+ #define USB_HOST_TIMEOUT_MS 1000
+ #endif
+
+ #if !defined(HOST_DEVICE_SETTLE_DELAY_MS) || defined(__DOXYGEN__)
+ /** Constant for the delay in milliseconds after a device is connected before the library
+ * will start the enumeration process. Some devices require a delay of up to 5 seconds
+ * after connection before the enumeration process can start or incorrect operation will
+ * occur.
+ *
+ * The default delay value may be overridden in the user project makefile by defining the
+ * \c HOST_DEVICE_SETTLE_DELAY_MS token to the required delay in milliseconds, and passed to the
+ * compiler using the -D switch.
+ */
+ #define HOST_DEVICE_SETTLE_DELAY_MS 1000
+ #endif
+
+ /* Enums: */
+ /** Enum for the error codes for the \ref EVENT_USB_Host_HostError() event.
+ *
+ * \see \ref Group_Events for more information on this event.
+ */
+ enum USB_Host_ErrorCodes_t
+ {
+ HOST_ERROR_VBusVoltageDip = 0, /**< VBUS voltage dipped to an unacceptable level. This
+ * error may be the result of an attached device drawing
+ * too much current from the VBUS line, or due to the
+ * AVR's power source being unable to supply sufficient
+ * current.
+ */
+ };
+
+ /** Enum for the error codes for the \ref EVENT_USB_Host_DeviceEnumerationFailed() event.
+ *
+ * \see \ref Group_Events for more information on this event.
+ */
+ enum USB_Host_EnumerationErrorCodes_t
+ {
+ HOST_ENUMERROR_NoError = 0, /**< No error occurred. Used internally, this is not a valid
+ * ErrorCode parameter value for the \ref EVENT_USB_Host_DeviceEnumerationFailed()
+ * event.
+ */
+ HOST_ENUMERROR_WaitStage = 1, /**< One of the delays between enumeration steps failed
+ * to complete successfully, due to a timeout or other
+ * error.
+ */
+ HOST_ENUMERROR_NoDeviceDetected = 2, /**< No device was detected, despite the USB data lines
+ * indicating the attachment of a device.
+ */
+ HOST_ENUMERROR_ControlError = 3, /**< One of the enumeration control requests failed to
+ * complete successfully.
+ */
+ HOST_ENUMERROR_PipeConfigError = 4, /**< The default control pipe (address 0) failed to
+ * configure correctly.
+ */
+ };
+
+ /* Inline Functions: */
+ /** Returns the current USB frame number, when in host mode. Every millisecond the USB bus is active (i.e. not suspended)
+ * the frame number is incremented by one.
+ */
+ static inline uint16_t USB_Host_GetFrameNumber(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint16_t USB_Host_GetFrameNumber(void)
+ {
+ return AVR32_USBB_UHFNUM;
+ }
+
+ #if !defined(NO_SOF_EVENTS)
+ /** Enables the host mode Start Of Frame events. When enabled, this causes the
+ * \ref EVENT_USB_Host_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
+ * at the start of each USB frame when a device is enumerated while in host mode.
+ *
+ * \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
+ */
+ static inline void USB_Host_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_EnableSOFEvents(void)
+ {
+ USB_INT_Enable(USB_INT_HSOFI);
+ }
+
+ /** Disables the host mode Start Of Frame events. When disabled, this stops the firing of the
+ * \ref EVENT_USB_Host_StartOfFrame() event when enumerated in host mode.
+ *
+ * \note Not available when the NO_SOF_EVENTS compile time token is defined.
+ */
+ static inline void USB_Host_DisableSOFEvents(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_DisableSOFEvents(void)
+ {
+ USB_INT_Disable(USB_INT_HSOFI);
+ }
+ #endif
+
+ /** Resets the USB bus, including the endpoints in any attached device and pipes on the AVR host.
+ * USB bus resets leave the default control pipe configured (if already configured).
+ *
+ * If the USB bus has been suspended prior to issuing a bus reset, the attached device will be
+ * woken up automatically and the bus resumed after the reset has been correctly issued.
+ */
+ static inline void USB_Host_ResetBus(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_ResetBus(void)
+ {
+ AVR32_USBB.UHCON.reset = true;
+ }
+
+ /** Determines if a previously issued bus reset (via the \ref USB_Host_ResetBus() macro) has
+ * completed.
+ *
+ * \return Boolean \c true if no bus reset is currently being sent, \c false otherwise.
+ */
+ static inline bool USB_Host_IsBusResetComplete(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool USB_Host_IsBusResetComplete(void)
+ {
+ return AVR32_USBB.UHCON.reset;
+ }
+
+ /** Resumes USB communications with an attached and enumerated device, by resuming the transmission
+ * of the 1MS Start Of Frame messages to the device. When resumed, USB communications between the
+ * host and attached device may occur.
+ */
+ static inline void USB_Host_ResumeBus(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_ResumeBus(void)
+ {
+ AVR32_USBB.UHCON.sofe = true;
+ }
+
+ /** Suspends the USB bus, preventing any communications from occurring between the host and attached
+ * device until the bus has been resumed. This stops the transmission of the 1MS Start Of Frame
+ * messages to the device.
+ *
+ * \note While the USB bus is suspended, all USB interrupt sources are also disabled; this means that
+ * some events (such as device disconnections) will not fire until the bus is resumed.
+ */
+ static inline void USB_Host_SuspendBus(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_SuspendBus(void)
+ {
+ AVR32_USBB.UHCON.sofe = false;
+ }
+
+ /** Determines if the USB bus has been suspended via the use of the \ref USB_Host_SuspendBus() macro,
+ * false otherwise. While suspended, no USB communications can occur until the bus is resumed,
+ * except for the Remote Wakeup event from the device if supported.
+ *
+ * \return Boolean \c true if the bus is currently suspended, \c false otherwise.
+ */
+ static inline bool USB_Host_IsBusSuspended(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool USB_Host_IsBusSuspended(void)
+ {
+ return AVR32_USBB.UHCON.sofe;
+ }
+
+ /** Determines if the attached device is currently enumerated in Full Speed mode (12Mb/s), or
+ * false if the attached device is enumerated in Low Speed mode (1.5Mb/s).
+ *
+ * \return Boolean \c true if the attached device is enumerated in Full Speed mode, \c false otherwise.
+ */
+ static inline bool USB_Host_IsDeviceFullSpeed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool USB_Host_IsDeviceFullSpeed(void)
+ {
+ return (AVR32_USBB.USBSTA.speed == AVR32_USBB_SPEED_FULL);
+ }
+
+ /** Determines if the attached device is currently issuing a Remote Wakeup request, requesting
+ * that the host resume the USB bus and wake up the device, false otherwise.
+ *
+ * \return Boolean \c true if the attached device has sent a Remote Wakeup request, \c false otherwise.
+ */
+ static inline bool USB_Host_IsRemoteWakeupSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool USB_Host_IsRemoteWakeupSent(void)
+ {
+ return AVR32_USBB.UHINT.rxrsmi;
+ }
+
+ /** Clears the flag indicating that a Remote Wakeup request has been issued by an attached device. */
+ static inline void USB_Host_ClearRemoteWakeupSent(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_ClearRemoteWakeupSent(void)
+ {
+ AVR32_USBB.UHINTCLR.rxrsmic = true;
+ }
+
+ /** Accepts a Remote Wakeup request from an attached device. This must be issued in response to
+ * a device's Remote Wakeup request within 2ms for the request to be accepted and the bus to
+ * be resumed.
+ */
+ static inline void USB_Host_ResumeFromWakeupRequest(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_ResumeFromWakeupRequest(void)
+ {
+ AVR32_USBB.UHCON.resume = true;
+ }
+
+ /** Determines if a resume from Remote Wakeup request is currently being sent to an attached
+ * device.
+ *
+ * \return Boolean \c true if no resume request is currently being sent, \c false otherwise.
+ */
+ static inline bool USB_Host_IsResumeFromWakeupRequestSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool USB_Host_IsResumeFromWakeupRequestSent(void)
+ {
+ return AVR32_USBB.UHCON.resume;
+ }
+
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Macros: */
+ static inline void USB_Host_HostMode_On(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_HostMode_On(void)
+ {
+ // Not required for UC3B
+ }
+
+ static inline void USB_Host_HostMode_Off(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_HostMode_Off(void)
+ {
+ // Not required for UC3B
+ }
+
+ static inline void USB_Host_VBUS_Auto_Enable(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_VBUS_Auto_Enable(void)
+ {
+ AVR32_USBB.USBCON.vbushwc = false;
+ }
+
+ static inline void USB_Host_VBUS_Manual_Enable(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_VBUS_Manual_Enable(void)
+ {
+ AVR32_USBB.USBCON.vbushwc = true;
+ }
+
+ static inline void USB_Host_VBUS_Auto_On(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_VBUS_Auto_On(void)
+ {
+ AVR32_USBB.USBSTASET.vbusrqs = true;
+ }
+
+ static inline void USB_Host_VBUS_Manual_On(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_VBUS_Manual_On(void)
+ {
+ AVR32_USBB.USBSTASET.vbusrqs = true;
+ }
+
+ static inline void USB_Host_VBUS_Auto_Off(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_VBUS_Auto_Off(void)
+ {
+ AVR32_USBB.USBSTACLR.vbusrqc = true;
+ }
+
+ static inline void USB_Host_VBUS_Manual_Off(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_VBUS_Manual_Off(void)
+ {
+ AVR32_USBB.USBSTACLR.vbusrqc = true;
+ }
+
+ static inline void USB_Host_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE;
+ static inline void USB_Host_SetDeviceAddress(const uint8_t Address)
+ {
+ AVR32_USBB.UHADDR1.uhaddr_p0 = Address;
+ AVR32_USBB.UHADDR1.uhaddr_p1 = Address;
+ AVR32_USBB.UHADDR1.uhaddr_p2 = Address;
+ AVR32_USBB.UHADDR1.uhaddr_p3 = Address;
+ AVR32_USBB.UHADDR2.uhaddr_p4 = Address;
+ AVR32_USBB.UHADDR2.uhaddr_p5 = Address;
+ AVR32_USBB.UHADDR2.uhaddr_p6 = Address;
+ }
+
+ /* Enums: */
+ enum USB_Host_WaitMSErrorCodes_t
+ {
+ HOST_WAITERROR_Successful = 0,
+ HOST_WAITERROR_DeviceDisconnect = 1,
+ HOST_WAITERROR_PipeError = 2,
+ HOST_WAITERROR_SetupStalled = 3,
+ };
+
+ /* Function Prototypes: */
+ void USB_Host_ProcessNextHostState(void);
+ uint8_t USB_Host_WaitMS(uint8_t MS);
+
+ #if defined(__INCLUDE_FROM_HOST_C)
+ static void USB_Host_ResetDevice(void);
+ #endif
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c b/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c
index 83d3fd6ad..b1db1fc50 100644
--- a/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c
+++ b/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c
@@ -1,138 +1,138 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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)
-
-#include "../Pipe.h"
-
-uint8_t USB_Host_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE;
-
-volatile uint32_t USB_SelectedPipe = PIPE_CONTROLPIPE;
-volatile uint8_t* USB_PipeFIFOPos[PIPE_TOTAL_PIPES];
-
-bool Pipe_ConfigurePipe(const uint8_t Number,
- const uint8_t Type,
- const uint8_t Token,
- const uint8_t EndpointNumber,
- const uint16_t Size,
- const uint8_t Banks)
-{
- Pipe_SelectPipe(Number);
- Pipe_EnablePipe();
-
- (&AVR32_USBB.upcfg0)[Number] = 0;
- (&AVR32_USBB.upcfg0)[Number] = (AVR32_USBB_ALLOC_MASK |
- ((uint32_t)Type << AVR32_USBB_PTYPE_OFFSET) |
- ((uint32_t)Token << AVR32_USBB_PTOKEN_OFFSET) |
- ((uint32_t)Banks << AVR32_USBB_PBK_OFFSET) |
- ((EndpointNumber & PIPE_EPNUM_MASK) << AVR32_USBB_PEPNUM_OFFSET));
- USB_PipeFIFOPos[Number] = &AVR32_USBB_SLAVE[Number * 0x10000];
-
- Pipe_SetInfiniteINRequests();
-
- return Pipe_IsConfigured();
-}
-
-void Pipe_ClearPipes(void)
-{
- for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
- {
- Pipe_SelectPipe(PNum);
- (&AVR32_USBB.upcfg0)[PNum] = 0;
- (&AVR32_USBB.upcon0clr)[PNum] = -1;
- USB_PipeFIFOPos[PNum] = &AVR32_USBB_SLAVE[PNum * 0x10000];
- Pipe_DisablePipe();
- }
-}
-
-bool Pipe_IsEndpointBound(const uint8_t EndpointAddress)
-{
- uint8_t PrevPipeNumber = Pipe_GetCurrentPipe();
-
- for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
- {
- Pipe_SelectPipe(PNum);
-
- if (!(Pipe_IsConfigured()))
- continue;
-
- if (Pipe_GetBoundEndpointAddress() == EndpointAddress)
- return true;
- }
-
- Pipe_SelectPipe(PrevPipeNumber);
- return false;
-}
-
-uint8_t Pipe_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_Host_GetFrameNumber();
-
- for (;;)
- {
- if (Pipe_GetPipeToken() == PIPE_TOKEN_IN)
- {
- if (Pipe_IsINReceived())
- return PIPE_READYWAIT_NoError;
- }
- else
- {
- if (Pipe_IsOUTReady())
- return PIPE_READYWAIT_NoError;
- }
-
- if (Pipe_IsStalled())
- return PIPE_READYWAIT_PipeStalled;
- else if (USB_HostState == HOST_STATE_Unattached)
- return PIPE_READYWAIT_DeviceDisconnected;
-
- uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber();
-
- if (CurrentFrameNumber != PreviousFrameNumber)
- {
- PreviousFrameNumber = CurrentFrameNumber;
-
- if (!(TimeoutMSRem--))
- return PIPE_READYWAIT_Timeout;
- }
- }
-}
-
-#endif
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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)
+
+#include "../Pipe.h"
+
+uint8_t USB_Host_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE;
+
+volatile uint32_t USB_SelectedPipe = PIPE_CONTROLPIPE;
+volatile uint8_t* USB_PipeFIFOPos[PIPE_TOTAL_PIPES];
+
+bool Pipe_ConfigurePipe(const uint8_t Number,
+ const uint8_t Type,
+ const uint8_t Token,
+ const uint8_t EndpointNumber,
+ const uint16_t Size,
+ const uint8_t Banks)
+{
+ Pipe_SelectPipe(Number);
+ Pipe_EnablePipe();
+
+ (&AVR32_USBB.upcfg0)[Number] = 0;
+ (&AVR32_USBB.upcfg0)[Number] = (AVR32_USBB_ALLOC_MASK |
+ ((uint32_t)Type << AVR32_USBB_PTYPE_OFFSET) |
+ ((uint32_t)Token << AVR32_USBB_PTOKEN_OFFSET) |
+ ((uint32_t)Banks << AVR32_USBB_PBK_OFFSET) |
+ ((EndpointNumber & PIPE_EPNUM_MASK) << AVR32_USBB_PEPNUM_OFFSET));
+ USB_PipeFIFOPos[Number] = &AVR32_USBB_SLAVE[Number * 0x10000];
+
+ Pipe_SetInfiniteINRequests();
+
+ return Pipe_IsConfigured();
+}
+
+void Pipe_ClearPipes(void)
+{
+ for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
+ {
+ Pipe_SelectPipe(PNum);
+ (&AVR32_USBB.upcfg0)[PNum] = 0;
+ (&AVR32_USBB.upcon0clr)[PNum] = -1;
+ USB_PipeFIFOPos[PNum] = &AVR32_USBB_SLAVE[PNum * 0x10000];
+ Pipe_DisablePipe();
+ }
+}
+
+bool Pipe_IsEndpointBound(const uint8_t EndpointAddress)
+{
+ uint8_t PrevPipeNumber = Pipe_GetCurrentPipe();
+
+ for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++)
+ {
+ Pipe_SelectPipe(PNum);
+
+ if (!(Pipe_IsConfigured()))
+ continue;
+
+ if (Pipe_GetBoundEndpointAddress() == EndpointAddress)
+ return true;
+ }
+
+ Pipe_SelectPipe(PrevPipeNumber);
+ return false;
+}
+
+uint8_t Pipe_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_Host_GetFrameNumber();
+
+ for (;;)
+ {
+ if (Pipe_GetPipeToken() == PIPE_TOKEN_IN)
+ {
+ if (Pipe_IsINReceived())
+ return PIPE_READYWAIT_NoError;
+ }
+ else
+ {
+ if (Pipe_IsOUTReady())
+ return PIPE_READYWAIT_NoError;
+ }
+
+ if (Pipe_IsStalled())
+ return PIPE_READYWAIT_PipeStalled;
+ else if (USB_HostState == HOST_STATE_Unattached)
+ return PIPE_READYWAIT_DeviceDisconnected;
+
+ uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber();
+
+ if (CurrentFrameNumber != PreviousFrameNumber)
+ {
+ PreviousFrameNumber = CurrentFrameNumber;
+
+ if (!(TimeoutMSRem--))
+ return PIPE_READYWAIT_Timeout;
+ }
+ }
+}
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h b/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h
index 25a4586d8..f8700383c 100644
--- a/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h
+++ b/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h
@@ -1,928 +1,928 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Pipe definitions for the AVR32 UC3 microcontrollers.
- * \copydetails Group_PipeManagement_UC3
- *
- * \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_PipeRW
- * \defgroup Group_PipeRW_UC3 Pipe Data Reading and Writing (UC3)
- * \brief Pipe data read/write definitions for the Atmel AVR32 UC3 architecture.
- *
- * Functions, macros, variables, enums and types related to data reading and writing from and to pipes.
- */
-
-/** \ingroup Group_PipePrimitiveRW
- * \defgroup Group_PipePrimitiveRW_UC3 Read/Write of Primitive Data Types (UC3)
- * \brief Pipe primitive data read/write definitions for the Atmel AVR32 UC3 architecture.
- *
- * Functions, macros, variables, enums and types related to data reading and writing of primitive data types
- * from and to pipes.
- */
-
-/** \ingroup Group_PipePacketManagement
- * \defgroup Group_PipePacketManagement_UC3 Pipe Packet Management (UC3)
- * \brief Pipe packet management definitions for the Atmel AVR32 UC3 architecture.
- *
- * Functions, macros, variables, enums and types related to packet management of pipes.
- */
-
-/** \ingroup Group_PipeControlReq
- * \defgroup Group_PipeControlReq_UC3 Pipe Control Request Management (UC3)
- * \brief Pipe control request management definitions for the Atmel AVR32 UC3 architecture.
- *
- * Module for host mode request processing. This module allows for the transmission of standard, class and
- * vendor control requests to the default control endpoint of an attached device while in host mode.
- *
- * \see Chapter 9 of the USB 2.0 specification.
- */
-
-/** \ingroup Group_PipeManagement
- * \defgroup Group_PipeManagement_UC3 Pipe Management (UC3)
- * \brief Pipe management definitions for the Atmel AVR32 UC3 architecture.
- *
- * This module contains functions, macros and enums related to pipe management when in USB Host mode. This
- * module contains the pipe management macros, as well as pipe interrupt and data send/receive functions
- * for various data types.
- *
- * @{
- */
-
-#ifndef __PIPE_UC3_H__
-#define __PIPE_UC3_H__
-
- /* Includes: */
- #include "../../../../Common/Common.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
-
- /* Private Interface - For use in library only: */
- #if !defined(__DOXYGEN__)
- /* Macros: */
- #define PIPE_HSB_ADDRESS_SPACE_SIZE (64 * 1024UL)
-
- /* External Variables: */
- extern volatile uint32_t USB_SelectedPipe;
- extern volatile uint8_t* USB_PipeFIFOPos[];
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** \name Pipe Error Flag Masks */
- //@{
- /** Mask for \ref Pipe_GetErrorFlags(), indicating that an overflow error occurred in the pipe on the received data. */
- #define PIPE_ERRORFLAG_OVERFLOW (AVR32_USBB_UPSTA0_OVERFI_MASK << 8)
-
- /** Mask for \ref Pipe_GetErrorFlags(), indicating that a CRC error occurred in the pipe on the received data. */
- #define PIPE_ERRORFLAG_CRC16 AVR32_USBB_UPERR0_CRC16_MASK
-
- /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware timeout error occurred in the pipe. */
- #define PIPE_ERRORFLAG_TIMEOUT AVR32_USBB_UPERR0_TIMEOUT_MASK
-
- /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware PID error occurred in the pipe. */
- #define PIPE_ERRORFLAG_PID AVR32_USBB_UPERR0_PID_MASK
-
- /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data PID error occurred in the pipe. */
- #define PIPE_ERRORFLAG_DATAPID AVR32_USBB_UPERR0_DATAPID_MASK
-
- /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data toggle error occurred in the pipe. */
- #define PIPE_ERRORFLAG_DATATGL AVR32_USBB_UPERR0_DATATGL_MASK
- //@}
-
- /** \name Pipe Token Masks */
- //@{
- /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a SETUP token (for CONTROL type pipes),
- * which will trigger a control request on the attached device when data is written to the pipe.
- */
- #define PIPE_TOKEN_SETUP AVR32_USBB_UPCFG0_PTOKEN_SETUP
-
- /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a IN token (for non-CONTROL type pipes),
- * indicating that the pipe data will flow from device to host.
- */
- #define PIPE_TOKEN_IN AVR32_USBB_UPCFG0_PTOKEN_IN
-
- /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a OUT token (for non-CONTROL type pipes),
- * indicating that the pipe data will flow from host to device.
- */
- #define PIPE_TOKEN_OUT AVR32_USBB_UPCFG0_PTOKEN_OUT
- //@}
-
- /** \name Pipe Bank Mode Masks */
- //@{
- /** Mask for the bank mode selection for the \ref Pipe_ConfigurePipe() macro. This indicates that the pipe
- * should have one single bank, which requires less USB FIFO memory but results in slower transfers as
- * only one USB device (the AVR or the attached device) can access the pipe's bank at the one time.
- */
- #define PIPE_BANK_SINGLE AVR32_USBB_UPCFG0_PBK_SINGLE
-
- /** Mask for the bank mode selection for the \ref Pipe_ConfigurePipe() macro. This indicates that the pipe
- * should have two banks, which requires more USB FIFO memory but results in faster transfers as one
- * USB device (the AVR or the attached device) can access one bank while the other accesses the second
- * bank.
- */
- #define PIPE_BANK_DOUBLE AVR32_USBB_UPCFG0_PBK_DOUBLE
-
- #if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32) || defined(__DOXYGEN__)
- /** Mask for the bank mode selection for the \ref Pipe_ConfigurePipe() macro. This indicates that the
- * pipe should have three banks, which requires more USB FIFO memory but results in faster transfers
- * as one USB device (the AVR or the attached device) can access one bank while the other accesses the
- * remaining banks.
- *
- * \note Not available on all AVR models.
- */
- #define PIPE_BANK_TRIPLE AVR32_USBB_UPCFG0_PBK_TRIPLE
- #endif
- //@}
-
- /** Default size of the default control pipe's bank, until altered by the Endpoint0Size value
- * in the device descriptor of the attached device.
- */
- #define PIPE_CONTROLPIPE_DEFAULT_SIZE 64
-
- #if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32) || defined(__DOXYGEN__)
- /** Total number of pipes (including the default control pipe at address 0) which may be used in
- * the device.
- */
- #define PIPE_TOTAL_PIPES 8
- #else
- #define PIPE_TOTAL_PIPES 7
- #endif
-
- /** Size in bytes of the largest pipe bank size possible in the device. Not all banks on each AVR
- * model supports the largest bank size possible on the device; different pipe numbers support
- * different maximum bank sizes. This value reflects the largest possible bank of any pipe on the
- * currently selected UC3 AVR model.
- */
- #define PIPE_MAX_SIZE 256
-
- /* Enums: */
- /** Enum for the possible error return codes of the \ref Pipe_WaitUntilReady() function.
- *
- * \ingroup Group_PipeRW_UC3
- */
- enum Pipe_WaitUntilReady_ErrorCodes_t
- {
- PIPE_READYWAIT_NoError = 0, /**< Pipe ready for next packet, no error. */
- PIPE_READYWAIT_PipeStalled = 1, /**< The device stalled the pipe while waiting. */
- PIPE_READYWAIT_DeviceDisconnected = 2, /**< Device was disconnected from the host while waiting. */
- PIPE_READYWAIT_Timeout = 3, /**< The device failed to accept or send the next packet
- * within the software timeout period set by the
- * \ref USB_STREAM_TIMEOUT_MS macro.
- */
- };
-
- /* Inline Functions: */
- /** Indicates the number of bytes currently stored in the current pipes's selected bank.
- *
- * \note The return width of this function may differ, depending on the maximum pipe bank size
- * of the selected AVR model.
- *
- * \ingroup Group_PipeRW_UC3
- *
- * \return Total number of bytes in the currently selected pipe's FIFO buffer.
- */
- static inline uint16_t Pipe_BytesInPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint16_t Pipe_BytesInPipe(void)
- {
- return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].pbyct;
- }
-
- /** Returns the pipe address of the currently selected pipe. This is typically used to save the
- * currently selected pipe number so that it can be restored after another pipe has been manipulated.
- *
- * \return Index of the currently selected pipe.
- */
- static inline uint8_t Pipe_GetCurrentPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint8_t Pipe_GetCurrentPipe(void)
- {
- return USB_SelectedPipe;
- }
-
- /** Selects the given pipe number. Any pipe operations which do not require the pipe number to be
- * indicated will operate on the currently selected pipe.
- *
- * \param[in] PipeNumber Index of the pipe to select.
- */
- static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
- static inline void Pipe_SelectPipe(const uint8_t PipeNumber)
- {
- USB_SelectedPipe = PipeNumber;
- }
-
- /** Resets the desired pipe, including the pipe banks and flags.
- *
- * \param[in] PipeNumber Index of the pipe to reset.
- */
- static inline void Pipe_ResetPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
- static inline void Pipe_ResetPipe(const uint8_t PipeNumber)
- {
- AVR32_USBB.uprst |= (AVR32_USBB_PRST0_MASK << PipeNumber);
- AVR32_USBB.uprst &= ~(AVR32_USBB_PRST0_MASK << PipeNumber);
- USB_PipeFIFOPos[USB_SelectedPipe] = &AVR32_USBB_SLAVE[USB_SelectedPipe * PIPE_HSB_ADDRESS_SPACE_SIZE];
- }
-
- /** Enables the currently selected pipe so that data can be sent and received through it to and from
- * an attached device.
- *
- * \pre The currently selected pipe must first be configured properly via \ref Pipe_ConfigurePipe().
- */
- static inline void Pipe_EnablePipe(void) ATTR_ALWAYS_INLINE;
- static inline void Pipe_EnablePipe(void)
- {
- AVR32_USBB.uprst |= (AVR32_USBB_PEN0_MASK << USB_SelectedPipe);
- }
-
- /** Disables the currently selected pipe so that data cannot be sent and received through it to and
- * from an attached device.
- */
- static inline void Pipe_DisablePipe(void) ATTR_ALWAYS_INLINE;
- static inline void Pipe_DisablePipe(void)
- {
- AVR32_USBB.uprst &= ~(AVR32_USBB_PEN0_MASK << USB_SelectedPipe);
- }
-
- /** Determines if the currently selected pipe is enabled, but not necessarily configured.
- *
- * \return Boolean \c true if the currently selected pipe is enabled, \c false otherwise.
- */
- static inline bool Pipe_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Pipe_IsEnabled(void)
- {
- return ((AVR32_USBB.uprst & (AVR32_USBB_PEN0_MASK << USB_SelectedPipe)) ? true : false);
- }
-
- /** Gets the current pipe token, indicating the pipe's data direction and type.
- *
- * \return The current pipe token, as a \c PIPE_TOKEN_* mask.
- */
- static inline uint8_t Pipe_GetPipeToken(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint8_t Pipe_GetPipeToken(void)
- {
- return (&AVR32_USBB.UPCFG0)[USB_SelectedPipe].ptoken;
- }
-
- /** Sets the token for the currently selected pipe to one of the tokens specified by the \c PIPE_TOKEN_*
- * masks. This can be used on CONTROL type pipes, to allow for bidirectional transfer of data during
- * control requests, or on regular pipes to allow for half-duplex bidirectional data transfer to devices
- * which have two endpoints of opposite direction sharing the same endpoint address within the device.
- *
- * \param[in] Token New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask.
- */
- static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE;
- static inline void Pipe_SetPipeToken(const uint8_t Token)
- {
- (&AVR32_USBB.UPCFG0)[USB_SelectedPipe].ptoken = Token;
- }
-
- /** Configures the currently selected pipe to allow for an unlimited number of IN requests. */
- static inline void Pipe_SetInfiniteINRequests(void) ATTR_ALWAYS_INLINE;
- static inline void Pipe_SetInfiniteINRequests(void)
- {
- (&AVR32_USBB.UPINRQ0)[USB_SelectedPipe].inmode = true;
- }
-
- /** Configures the currently selected pipe to only allow the specified number of IN requests to be
- * accepted by the pipe before it is automatically frozen.
- *
- * \param[in] TotalINRequests Total number of IN requests that the pipe may receive before freezing.
- */
- static inline void Pipe_SetFiniteINRequests(const uint8_t TotalINRequests) ATTR_ALWAYS_INLINE;
- static inline void Pipe_SetFiniteINRequests(const uint8_t TotalINRequests)
- {
- (&AVR32_USBB.UPINRQ0)[USB_SelectedPipe].inmode = false;
- (&AVR32_USBB.UPINRQ0)[USB_SelectedPipe].inrq = TotalINRequests;
- }
-
- /** Determines if the currently selected pipe is configured.
- *
- * \return Boolean \c true if the selected pipe is configured, \c false otherwise.
- */
- static inline bool Pipe_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Pipe_IsConfigured(void)
- {
- return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].cfgok;
- }
-
- /** Retrieves the endpoint address of the endpoint within the attached device that the currently selected
- * pipe is bound to.
- *
- * \return Endpoint address the currently selected pipe is bound to.
- */
- static inline uint8_t Pipe_GetBoundEndpointAddress(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint8_t Pipe_GetBoundEndpointAddress(void)
- {
- return ((&AVR32_USBB.UPCFG0)[USB_SelectedPipe].pepnum |
- ((Pipe_GetPipeToken() == PIPE_TOKEN_IN) ? PIPE_EPDIR_MASK : 0));
- }
-
- /** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds.
- *
- * \param[in] Milliseconds Number of milliseconds between each pipe poll.
- */
- static inline void Pipe_SetInterruptPeriod(const uint8_t Milliseconds) ATTR_ALWAYS_INLINE;
- static inline void Pipe_SetInterruptPeriod(const uint8_t Milliseconds)
- {
- (&AVR32_USBB.UPCFG0)[USB_SelectedPipe].intfrq = Milliseconds;
- }
-
- /** Returns a mask indicating which pipe's interrupt periods have elapsed, indicating that the pipe should
- * be serviced.
- *
- * \return Mask whose bits indicate which pipes have interrupted.
- */
- static inline uint8_t Pipe_GetPipeInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint8_t Pipe_GetPipeInterrupts(void)
- {
- return ((AVR32_USBB.uhint & (AVR32_USBB_P6INT_MASK | AVR32_USBB_P5INT_MASK |
- AVR32_USBB_P4INT_MASK | AVR32_USBB_P3INT_MASK |
- AVR32_USBB_P2INT_MASK | AVR32_USBB_P1INT_MASK |
- AVR32_USBB_P0INT_MASK)) >> AVR32_USBB_P0INT_OFFSET);
- }
-
- /** Determines if the specified pipe number has interrupted (valid only for INTERRUPT type
- * pipes).
- *
- * \param[in] PipeNumber Index of the pipe whose interrupt flag should be tested.
- *
- * \return Boolean \c true if the specified pipe has interrupted, \c false otherwise.
- */
- static inline bool Pipe_HasPipeInterrupted(const uint8_t PipeNumber) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Pipe_HasPipeInterrupted(const uint8_t PipeNumber)
- {
- return ((AVR32_USBB.uhint & (AVR32_USBB_P0INTES_MASK << USB_SelectedPipe)) ? true : false);
- }
-
- /** Unfreezes the selected pipe, allowing it to communicate with an attached device. */
- static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE;
- static inline void Pipe_Unfreeze(void)
- {
- (&AVR32_USBB.UPCON0CLR)[USB_SelectedPipe].pfreezec = true;
- }
-
- /** Freezes the selected pipe, preventing it from communicating with an attached device. */
- static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE;
- static inline void Pipe_Freeze(void)
- {
- (&AVR32_USBB.UPCON0SET)[USB_SelectedPipe].pfreezes = true;
- }
-
- /** Determines if the currently selected pipe is frozen, and not able to accept data.
- *
- * \return Boolean \c true if the currently selected pipe is frozen, \c false otherwise.
- */
- static inline bool Pipe_IsFrozen(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Pipe_IsFrozen(void)
- {
- return (((&AVR32_USBB.UPCON0)[USB_SelectedPipe].pfreeze) ? true : false);
- }
-
- /** Clears the error flags for the currently selected pipe. */
- static inline void Pipe_ClearError(void) ATTR_ALWAYS_INLINE;
- static inline void Pipe_ClearError(void)
- {
- (&AVR32_USBB.uperr0)[USB_SelectedPipe] = 0;
- (&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].overfic = true;
- }
-
- /** Determines if the master pipe error flag is set for the currently selected pipe, indicating that
- * some sort of hardware error has occurred on the pipe.
- *
- * \see \ref Pipe_GetErrorFlags() macro for information on retrieving the exact error flag.
- *
- * \return Boolean \c true if an error has occurred on the selected pipe, \c false otherwise.
- */
- static inline bool Pipe_IsError(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Pipe_IsError(void)
- {
- return (((&AVR32_USBB.upsta0)[USB_SelectedPipe] &
- (AVR32_USBB_PERRI_MASK | AVR32_USBB_OVERFI_MASK)) ? true : false);
- }
-
- /** Gets a mask of the hardware error flags which have occurred on the currently selected pipe. This
- * value can then be masked against the \c PIPE_ERRORFLAG_* masks to determine what error has occurred.
- *
- * \return Mask comprising of \c PIPE_ERRORFLAG_* bits indicating what error has occurred on the selected pipe.
- */
- static inline uint8_t Pipe_GetErrorFlags(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint8_t Pipe_GetErrorFlags(void)
- {
-
- return (((&AVR32_USBB.uperr0)[USB_SelectedPipe] &
- (PIPE_ERRORFLAG_CRC16 | PIPE_ERRORFLAG_TIMEOUT |
- PIPE_ERRORFLAG_PID | PIPE_ERRORFLAG_DATAPID |
- PIPE_ERRORFLAG_DATATGL)) |
- (((&AVR32_USBB.upsta0)[USB_SelectedPipe] << 8) &
- PIPE_ERRORFLAG_OVERFLOW));
- }
-
- /** Retrieves the number of busy banks in the currently selected pipe, which have been queued for
- * transmission via the \ref Pipe_ClearOUT() command, or are awaiting acknowledgement via the
- * \ref Pipe_ClearIN() command.
- *
- * \ingroup Group_PipePacketManagement_UC3
- *
- * \return Total number of busy banks in the selected pipe.
- */
- static inline uint8_t Pipe_GetBusyBanks(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint8_t Pipe_GetBusyBanks(void)
- {
- return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].nbusybk;
- }
-
- /** Determines if the currently selected pipe may be read from (if data is waiting in the pipe
- * bank and the pipe is an IN direction, or if the bank is not yet full if the pipe is an OUT
- * direction). This function will return false if an error has occurred in the pipe, or if the pipe
- * is an IN direction and no packet (or an empty packet) has been received, or if the pipe is an OUT
- * direction and the pipe bank is full.
- *
- * \note This function is not valid on CONTROL type pipes.
- *
- * \ingroup Group_PipePacketManagement_UC3
- *
- * \return Boolean \c true if the currently selected pipe may be read from or written to, depending
- * on its direction.
- */
- static inline bool Pipe_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Pipe_IsReadWriteAllowed(void)
- {
- return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].rwall;
- }
-
- /** Determines if a packet has been received on the currently selected IN pipe from the attached device.
- *
- * \ingroup Group_PipePacketManagement_UC3
- *
- * \return Boolean \c true if the current pipe has received an IN packet, \c false otherwise.
- */
- static inline bool Pipe_IsINReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Pipe_IsINReceived(void)
- {
- return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].rxini;
- }
-
- /** Determines if the currently selected OUT pipe is ready to send an OUT packet to the attached device.
- *
- * \ingroup Group_PipePacketManagement_UC3
- *
- * \return Boolean \c true if the current pipe is ready for an OUT packet, \c false otherwise.
- */
- static inline bool Pipe_IsOUTReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Pipe_IsOUTReady(void)
- {
- return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].txouti;
- }
-
- /** Determines if no SETUP request is currently being sent to the attached device on the selected
- * CONTROL type pipe.
- *
- * \ingroup Group_PipePacketManagement_UC3
- *
- * \return Boolean \c true if the current pipe is ready for a SETUP packet, \c false otherwise.
- */
- static inline bool Pipe_IsSETUPSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Pipe_IsSETUPSent(void)
- {
- return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].txstpi;
- }
-
- /** Sends the currently selected CONTROL type pipe's contents to the device as a SETUP packet.
- *
- * \ingroup Group_PipePacketManagement_UC3
- */
- static inline void Pipe_ClearSETUP(void) ATTR_ALWAYS_INLINE;
- static inline void Pipe_ClearSETUP(void)
- {
- (&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].txstpic = true;
- USB_PipeFIFOPos[USB_SelectedPipe] = &AVR32_USBB_SLAVE[USB_SelectedPipe * PIPE_HSB_ADDRESS_SPACE_SIZE];
- }
-
- /** Acknowledges the reception of a setup IN request from the attached device on the currently selected
- * pipe, freeing the bank ready for the next packet.
- *
- * \ingroup Group_PipePacketManagement_UC3
- */
- static inline void Pipe_ClearIN(void) ATTR_ALWAYS_INLINE;
- static inline void Pipe_ClearIN(void)
- {
- (&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].rxinic = true;
- (&AVR32_USBB.UPCON0CLR)[USB_SelectedPipe].fifoconc = true;
- USB_PipeFIFOPos[USB_SelectedPipe] = &AVR32_USBB_SLAVE[USB_SelectedPipe * PIPE_HSB_ADDRESS_SPACE_SIZE];
- }
-
- /** Sends the currently selected pipe's contents to the device as an OUT packet on the selected pipe, freeing
- * the bank ready for the next packet.
- *
- * \ingroup Group_PipePacketManagement_UC3
- */
- static inline void Pipe_ClearOUT(void) ATTR_ALWAYS_INLINE;
- static inline void Pipe_ClearOUT(void)
- {
- (&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].txoutic = true;
- (&AVR32_USBB.UPCON0CLR)[USB_SelectedPipe].fifoconc = true;
- USB_PipeFIFOPos[USB_SelectedPipe] = &AVR32_USBB_SLAVE[USB_SelectedPipe * PIPE_HSB_ADDRESS_SPACE_SIZE];
- }
-
- /** Determines if the device sent a NAK (Negative Acknowledge) in response to the last sent packet on
- * the currently selected pipe. This occurs when the host sends a packet to the device, but the device
- * is not currently ready to handle the packet (i.e. its endpoint banks are full). Once a NAK has been
- * received, it must be cleared using \ref Pipe_ClearNAKReceived() before the previous (or any other) packet
- * can be re-sent.
- *
- * \ingroup Group_PipePacketManagement_UC3
- *
- * \return Boolean \c true if an NAK has been received on the current pipe, \c false otherwise.
- */
- static inline bool Pipe_IsNAKReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Pipe_IsNAKReceived(void)
- {
- return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].nakedi;
- }
-
- /** Clears the NAK condition on the currently selected pipe.
- *
- * \ingroup Group_PipePacketManagement_UC3
- *
- * \see \ref Pipe_IsNAKReceived() for more details.
- */
- static inline void Pipe_ClearNAKReceived(void) ATTR_ALWAYS_INLINE;
- static inline void Pipe_ClearNAKReceived(void)
- {
- (&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].nakedic = true;
- }
-
- /** Determines if the currently selected pipe has had the STALL condition set by the attached device.
- *
- * \ingroup Group_PipePacketManagement_UC3
- *
- * \return Boolean \c true if the current pipe has been stalled by the attached device, \c false otherwise.
- */
- static inline bool Pipe_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Pipe_IsStalled(void)
- {
- return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].rxstalldi;
- }
-
- /** Clears the STALL condition detection flag on the currently selected pipe, but does not clear the
- * STALL condition itself (this must be done via a ClearFeature control request to the device).
- *
- * \ingroup Group_PipePacketManagement_UC3
- */
- static inline void Pipe_ClearStall(void) ATTR_ALWAYS_INLINE;
- static inline void Pipe_ClearStall(void)
- {
- (&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].rxstalldic = true;
- USB_PipeFIFOPos[USB_SelectedPipe] = &AVR32_USBB_SLAVE[USB_SelectedPipe * PIPE_HSB_ADDRESS_SPACE_SIZE];
- }
-
- /** Reads one byte from the currently selected pipe's bank, for OUT direction pipes.
- *
- * \ingroup Group_PipePrimitiveRW_UC3
- *
- * \return Next byte in the currently selected pipe's FIFO buffer.
- */
- static inline uint8_t Pipe_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint8_t Pipe_Read_8(void)
- {
- return *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- }
-
- /** Writes one byte to the currently selected pipe's bank, for IN direction pipes.
- *
- * \ingroup Group_PipePrimitiveRW_UC3
- *
- * \param[in] Data Data to write into the the currently selected pipe's FIFO buffer.
- */
- static inline void Pipe_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
- static inline void Pipe_Write_8(const uint8_t Data)
- {
- *(USB_PipeFIFOPos[USB_SelectedPipe]++) = Data;
- }
-
- /** Discards one byte from the currently selected pipe's bank, for OUT direction pipes.
- *
- * \ingroup Group_PipePrimitiveRW_UC3
- */
- static inline void Pipe_Discard_8(void) ATTR_ALWAYS_INLINE;
- static inline void Pipe_Discard_8(void)
- {
- uint8_t Dummy;
-
- Dummy = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- }
-
- /** Reads two bytes from the currently selected pipe's bank in little endian format, for OUT
- * direction pipes.
- *
- * \ingroup Group_PipePrimitiveRW_UC3
- *
- * \return Next two bytes in the currently selected pipe's FIFO buffer.
- */
- static inline uint16_t Pipe_Read_16_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint16_t Pipe_Read_16_LE(void)
- {
- uint16_t Byte1 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- uint16_t Byte0 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
-
- return ((Byte0 << 8) | Byte1);
- }
-
- /** Reads two bytes from the currently selected pipe's bank in big endian format, for OUT
- * direction pipes.
- *
- * \ingroup Group_PipePrimitiveRW_UC3
- *
- * \return Next two bytes in the currently selected pipe's FIFO buffer.
- */
- static inline uint16_t Pipe_Read_16_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint16_t Pipe_Read_16_BE(void)
- {
- uint16_t Byte0 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- uint16_t Byte1 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
-
- return ((Byte0 << 8) | Byte1);
- }
-
- /** Writes two bytes to the currently selected pipe's bank in little endian format, for IN
- * direction pipes.
- *
- * \ingroup Group_PipePrimitiveRW_UC3
- *
- * \param[in] Data Data to write to the currently selected pipe's FIFO buffer.
- */
- static inline void Pipe_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE;
- static inline void Pipe_Write_16_LE(const uint16_t Data)
- {
- *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 8);
- *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data & 0xFF);
- }
-
- /** Writes two bytes to the currently selected pipe's bank in big endian format, for IN
- * direction pipes.
- *
- * \ingroup Group_PipePrimitiveRW_UC3
- *
- * \param[in] Data Data to write to the currently selected pipe's FIFO buffer.
- */
- static inline void Pipe_Write_16_BE(const uint16_t Data) ATTR_ALWAYS_INLINE;
- static inline void Pipe_Write_16_BE(const uint16_t Data)
- {
- *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data & 0xFF);
- *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 8);
- }
-
- /** Discards two bytes from the currently selected pipe's bank, for OUT direction pipes.
- *
- * \ingroup Group_PipePrimitiveRW_UC3
- */
- static inline void Pipe_Discard_16(void) ATTR_ALWAYS_INLINE;
- static inline void Pipe_Discard_16(void)
- {
- uint8_t Dummy;
-
- Dummy = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- Dummy = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- }
-
- /** Reads four bytes from the currently selected pipe's bank in little endian format, for OUT
- * direction pipes.
- *
- * \ingroup Group_PipePrimitiveRW_UC3
- *
- * \return Next four bytes in the currently selected pipe's FIFO buffer.
- */
- static inline uint32_t Pipe_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint32_t Pipe_Read_32_LE(void)
- {
- uint32_t Byte3 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- uint32_t Byte2 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- uint32_t Byte1 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- uint32_t Byte0 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
-
- return ((Byte0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3);
- }
-
- /** Reads four bytes from the currently selected pipe's bank in big endian format, for OUT
- * direction pipes.
- *
- * \ingroup Group_PipePrimitiveRW_UC3
- *
- * \return Next four bytes in the currently selected pipe's FIFO buffer.
- */
- static inline uint32_t Pipe_Read_32_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint32_t Pipe_Read_32_BE(void)
- {
- uint32_t Byte0 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- uint32_t Byte1 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- uint32_t Byte2 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- uint32_t Byte3 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
-
- return ((Byte0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3);
- }
-
- /** Writes four bytes to the currently selected pipe's bank in little endian format, for IN
- * direction pipes.
- *
- * \ingroup Group_PipePrimitiveRW_UC3
- *
- * \param[in] Data Data to write to the currently selected pipe's FIFO buffer.
- */
- static inline void Pipe_Write_32_LE(const uint32_t Data) ATTR_ALWAYS_INLINE;
- static inline void Pipe_Write_32_LE(const uint32_t Data)
- {
- *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 24);
- *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 16);
- *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 8);
- *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data & 0xFF);
- }
-
- /** Writes four bytes to the currently selected pipe's bank in big endian format, for IN
- * direction pipes.
- *
- * \ingroup Group_PipePrimitiveRW_UC3
- *
- * \param[in] Data Data to write to the currently selected pipe's FIFO buffer.
- */
- static inline void Pipe_Write_32_BE(const uint32_t Data) ATTR_ALWAYS_INLINE;
- static inline void Pipe_Write_32_BE(const uint32_t Data)
- {
- *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data & 0xFF);
- *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 8);
- *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 16);
- *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 24);
- }
-
- /** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes.
- *
- * \ingroup Group_PipePrimitiveRW_UC3
- */
- static inline void Pipe_Discard_32(void) ATTR_ALWAYS_INLINE;
- static inline void Pipe_Discard_32(void)
- {
- uint8_t Dummy;
-
- Dummy = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- Dummy = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- Dummy = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- Dummy = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
- }
-
- /* External Variables: */
- /** Global indicating the maximum packet size of the default control pipe located at address
- * 0 in the device. This value is set to the value indicated in the attached device's device
- * descriptor once the USB interface is initialized into host mode and a device is attached
- * to the USB bus.
- *
- * \note This variable should be treated as read-only in the user application, and never manually
- * changed in value.
- */
- extern uint8_t USB_Host_ControlPipeSize;
-
- /* Function Prototypes: */
- /** Configures the specified pipe number with the given pipe type, token, target endpoint number in the
- * attached device, bank size and banking mode.
- *
- * A newly configured pipe is frozen by default, and must be unfrozen before use via the \ref Pipe_Unfreeze()
- * before being used. Pipes should be kept frozen unless waiting for data from a device while in IN mode, or
- * sending data to the device in OUT mode. IN type pipes are also automatically configured to accept infinite
- * numbers of IN requests without automatic freezing - this can be overridden by a call to
- * \ref Pipe_SetFiniteINRequests().
- *
- * \param[in] Number Pipe number to configure. This must be more than 0 and less than \ref PIPE_TOTAL_PIPES.
- *
- * \param[in] Type Type of pipe to configure, an \c EP_TYPE_* mask. Not all pipe types are available on Low
- * Speed USB devices - refer to the USB 2.0 specification.
- *
- * \param[in] Token Pipe data token, either \ref PIPE_TOKEN_SETUP, \ref PIPE_TOKEN_OUT or \ref PIPE_TOKEN_IN.
- * All pipes (except Control type) are unidirectional - data may only be read from or
- * written to the pipe bank based on its direction, not both.
- *
- * \param[in] EndpointNumber Endpoint index within the attached device that the pipe should interface to.
- *
- * \param[in] Size Size of the pipe's bank, where packets are stored before they are transmitted to
- * the USB device, or after they have been received from the USB device (depending on
- * the pipe's data direction). The bank size must indicate the maximum packet size that
- * the pipe can handle.
- *
- * \param[in] Banks Number of banks to use for the pipe being configured, a \c PIPE_BANK_* mask. More banks
- * uses more USB DPRAM, but offers better performance. Isochronous type pipes <b>must</b>
- * have at least two banks.
- *
- * \note When the \c ORDERED_EP_CONFIG compile time option is used, Pipes <b>must</b> be configured in ascending order,
- * or bank corruption will occur.
- * \n\n
- *
- * \note Certain microcontroller model's pipes may have different maximum packet sizes based on the pipe's
- * index - refer to the chosen microcontroller's datasheet to determine the maximum bank size for each pipe.
- * \n\n
- *
- * \note The default control pipe 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 pipe upon success. Upon failure, the pipe which
- * failed to reconfigure correctly will be selected.
- *
- * \return Boolean \c true if the configuration succeeded, \c false otherwise.
- */
- bool Pipe_ConfigurePipe(const uint8_t Number,
- const uint8_t Type,
- const uint8_t Token,
- const uint8_t EndpointNumber,
- const uint16_t Size,
- const uint8_t Banks);
-
- /** Spin-loops until the currently selected non-control pipe is ready for the next packed of data to be read
- * or written to it, aborting in the case of an error condition (such as a timeout or device disconnect).
- *
- * \ingroup Group_PipeRW_UC3
- *
- * \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum.
- */
- uint8_t Pipe_WaitUntilReady(void);
-
- /** Determines if a pipe has been bound to the given device endpoint address. If a pipe which is bound to the given
- * endpoint is found, it is automatically selected.
- *
- * \param[in] EndpointAddress Address and direction mask of the endpoint within the attached device to check.
- *
- * \return Boolean \c true if a pipe bound to the given endpoint address of the specified direction is found,
- * \c false otherwise.
- */
- bool Pipe_IsEndpointBound(const uint8_t EndpointAddress) ATTR_WARN_UNUSED_RESULT;
-
- /* Private Interface - For use in library only: */
- #if !defined(__DOXYGEN__)
- /* Macros: */
- #if !defined(ENDPOINT_CONTROLEP)
- #define ENDPOINT_CONTROLEP 0
- #endif
-
- /* Inline Functions: */
- static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE;
- static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes)
- {
- uint8_t MaskVal = 0;
- uint16_t CheckBytes = 8;
-
- while ((CheckBytes < Bytes) && (CheckBytes < PIPE_MAX_SIZE))
- {
- MaskVal++;
- CheckBytes <<= 1;
- }
-
- return (MaskVal << AVR32_USBB_PSIZE_OFFSET);
- }
-
- /* Function Prototypes: */
- void Pipe_ClearPipes(void);
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Pipe definitions for the AVR32 UC3 microcontrollers.
+ * \copydetails Group_PipeManagement_UC3
+ *
+ * \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_PipeRW
+ * \defgroup Group_PipeRW_UC3 Pipe Data Reading and Writing (UC3)
+ * \brief Pipe data read/write definitions for the Atmel AVR32 UC3 architecture.
+ *
+ * Functions, macros, variables, enums and types related to data reading and writing from and to pipes.
+ */
+
+/** \ingroup Group_PipePrimitiveRW
+ * \defgroup Group_PipePrimitiveRW_UC3 Read/Write of Primitive Data Types (UC3)
+ * \brief Pipe primitive data read/write definitions for the Atmel AVR32 UC3 architecture.
+ *
+ * Functions, macros, variables, enums and types related to data reading and writing of primitive data types
+ * from and to pipes.
+ */
+
+/** \ingroup Group_PipePacketManagement
+ * \defgroup Group_PipePacketManagement_UC3 Pipe Packet Management (UC3)
+ * \brief Pipe packet management definitions for the Atmel AVR32 UC3 architecture.
+ *
+ * Functions, macros, variables, enums and types related to packet management of pipes.
+ */
+
+/** \ingroup Group_PipeControlReq
+ * \defgroup Group_PipeControlReq_UC3 Pipe Control Request Management (UC3)
+ * \brief Pipe control request management definitions for the Atmel AVR32 UC3 architecture.
+ *
+ * Module for host mode request processing. This module allows for the transmission of standard, class and
+ * vendor control requests to the default control endpoint of an attached device while in host mode.
+ *
+ * \see Chapter 9 of the USB 2.0 specification.
+ */
+
+/** \ingroup Group_PipeManagement
+ * \defgroup Group_PipeManagement_UC3 Pipe Management (UC3)
+ * \brief Pipe management definitions for the Atmel AVR32 UC3 architecture.
+ *
+ * This module contains functions, macros and enums related to pipe management when in USB Host mode. This
+ * module contains the pipe management macros, as well as pipe interrupt and data send/receive functions
+ * for various data types.
+ *
+ * @{
+ */
+
+#ifndef __PIPE_UC3_H__
+#define __PIPE_UC3_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.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
+
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Macros: */
+ #define PIPE_HSB_ADDRESS_SPACE_SIZE (64 * 1024UL)
+
+ /* External Variables: */
+ extern volatile uint32_t USB_SelectedPipe;
+ extern volatile uint8_t* USB_PipeFIFOPos[];
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** \name Pipe Error Flag Masks */
+ //@{
+ /** Mask for \ref Pipe_GetErrorFlags(), indicating that an overflow error occurred in the pipe on the received data. */
+ #define PIPE_ERRORFLAG_OVERFLOW (AVR32_USBB_UPSTA0_OVERFI_MASK << 8)
+
+ /** Mask for \ref Pipe_GetErrorFlags(), indicating that a CRC error occurred in the pipe on the received data. */
+ #define PIPE_ERRORFLAG_CRC16 AVR32_USBB_UPERR0_CRC16_MASK
+
+ /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware timeout error occurred in the pipe. */
+ #define PIPE_ERRORFLAG_TIMEOUT AVR32_USBB_UPERR0_TIMEOUT_MASK
+
+ /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware PID error occurred in the pipe. */
+ #define PIPE_ERRORFLAG_PID AVR32_USBB_UPERR0_PID_MASK
+
+ /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data PID error occurred in the pipe. */
+ #define PIPE_ERRORFLAG_DATAPID AVR32_USBB_UPERR0_DATAPID_MASK
+
+ /** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data toggle error occurred in the pipe. */
+ #define PIPE_ERRORFLAG_DATATGL AVR32_USBB_UPERR0_DATATGL_MASK
+ //@}
+
+ /** \name Pipe Token Masks */
+ //@{
+ /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a SETUP token (for CONTROL type pipes),
+ * which will trigger a control request on the attached device when data is written to the pipe.
+ */
+ #define PIPE_TOKEN_SETUP AVR32_USBB_UPCFG0_PTOKEN_SETUP
+
+ /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a IN token (for non-CONTROL type pipes),
+ * indicating that the pipe data will flow from device to host.
+ */
+ #define PIPE_TOKEN_IN AVR32_USBB_UPCFG0_PTOKEN_IN
+
+ /** Token mask for \ref Pipe_ConfigurePipe(). This sets the pipe as a OUT token (for non-CONTROL type pipes),
+ * indicating that the pipe data will flow from host to device.
+ */
+ #define PIPE_TOKEN_OUT AVR32_USBB_UPCFG0_PTOKEN_OUT
+ //@}
+
+ /** \name Pipe Bank Mode Masks */
+ //@{
+ /** Mask for the bank mode selection for the \ref Pipe_ConfigurePipe() macro. This indicates that the pipe
+ * should have one single bank, which requires less USB FIFO memory but results in slower transfers as
+ * only one USB device (the AVR or the attached device) can access the pipe's bank at the one time.
+ */
+ #define PIPE_BANK_SINGLE AVR32_USBB_UPCFG0_PBK_SINGLE
+
+ /** Mask for the bank mode selection for the \ref Pipe_ConfigurePipe() macro. This indicates that the pipe
+ * should have two banks, which requires more USB FIFO memory but results in faster transfers as one
+ * USB device (the AVR or the attached device) can access one bank while the other accesses the second
+ * bank.
+ */
+ #define PIPE_BANK_DOUBLE AVR32_USBB_UPCFG0_PBK_DOUBLE
+
+ #if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32) || defined(__DOXYGEN__)
+ /** Mask for the bank mode selection for the \ref Pipe_ConfigurePipe() macro. This indicates that the
+ * pipe should have three banks, which requires more USB FIFO memory but results in faster transfers
+ * as one USB device (the AVR or the attached device) can access one bank while the other accesses the
+ * remaining banks.
+ *
+ * \note Not available on all AVR models.
+ */
+ #define PIPE_BANK_TRIPLE AVR32_USBB_UPCFG0_PBK_TRIPLE
+ #endif
+ //@}
+
+ /** Default size of the default control pipe's bank, until altered by the Endpoint0Size value
+ * in the device descriptor of the attached device.
+ */
+ #define PIPE_CONTROLPIPE_DEFAULT_SIZE 64
+
+ #if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32) || defined(__DOXYGEN__)
+ /** Total number of pipes (including the default control pipe at address 0) which may be used in
+ * the device.
+ */
+ #define PIPE_TOTAL_PIPES 8
+ #else
+ #define PIPE_TOTAL_PIPES 7
+ #endif
+
+ /** Size in bytes of the largest pipe bank size possible in the device. Not all banks on each AVR
+ * model supports the largest bank size possible on the device; different pipe numbers support
+ * different maximum bank sizes. This value reflects the largest possible bank of any pipe on the
+ * currently selected UC3 AVR model.
+ */
+ #define PIPE_MAX_SIZE 256
+
+ /* Enums: */
+ /** Enum for the possible error return codes of the \ref Pipe_WaitUntilReady() function.
+ *
+ * \ingroup Group_PipeRW_UC3
+ */
+ enum Pipe_WaitUntilReady_ErrorCodes_t
+ {
+ PIPE_READYWAIT_NoError = 0, /**< Pipe ready for next packet, no error. */
+ PIPE_READYWAIT_PipeStalled = 1, /**< The device stalled the pipe while waiting. */
+ PIPE_READYWAIT_DeviceDisconnected = 2, /**< Device was disconnected from the host while waiting. */
+ PIPE_READYWAIT_Timeout = 3, /**< The device failed to accept or send the next packet
+ * within the software timeout period set by the
+ * \ref USB_STREAM_TIMEOUT_MS macro.
+ */
+ };
+
+ /* Inline Functions: */
+ /** Indicates the number of bytes currently stored in the current pipes's selected bank.
+ *
+ * \note The return width of this function may differ, depending on the maximum pipe bank size
+ * of the selected AVR model.
+ *
+ * \ingroup Group_PipeRW_UC3
+ *
+ * \return Total number of bytes in the currently selected pipe's FIFO buffer.
+ */
+ static inline uint16_t Pipe_BytesInPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint16_t Pipe_BytesInPipe(void)
+ {
+ return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].pbyct;
+ }
+
+ /** Returns the pipe address of the currently selected pipe. This is typically used to save the
+ * currently selected pipe number so that it can be restored after another pipe has been manipulated.
+ *
+ * \return Index of the currently selected pipe.
+ */
+ static inline uint8_t Pipe_GetCurrentPipe(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint8_t Pipe_GetCurrentPipe(void)
+ {
+ return USB_SelectedPipe;
+ }
+
+ /** Selects the given pipe number. Any pipe operations which do not require the pipe number to be
+ * indicated will operate on the currently selected pipe.
+ *
+ * \param[in] PipeNumber Index of the pipe to select.
+ */
+ static inline void Pipe_SelectPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_SelectPipe(const uint8_t PipeNumber)
+ {
+ USB_SelectedPipe = PipeNumber;
+ }
+
+ /** Resets the desired pipe, including the pipe banks and flags.
+ *
+ * \param[in] PipeNumber Index of the pipe to reset.
+ */
+ static inline void Pipe_ResetPipe(const uint8_t PipeNumber) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_ResetPipe(const uint8_t PipeNumber)
+ {
+ AVR32_USBB.uprst |= (AVR32_USBB_PRST0_MASK << PipeNumber);
+ AVR32_USBB.uprst &= ~(AVR32_USBB_PRST0_MASK << PipeNumber);
+ USB_PipeFIFOPos[USB_SelectedPipe] = &AVR32_USBB_SLAVE[USB_SelectedPipe * PIPE_HSB_ADDRESS_SPACE_SIZE];
+ }
+
+ /** Enables the currently selected pipe so that data can be sent and received through it to and from
+ * an attached device.
+ *
+ * \pre The currently selected pipe must first be configured properly via \ref Pipe_ConfigurePipe().
+ */
+ static inline void Pipe_EnablePipe(void) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_EnablePipe(void)
+ {
+ AVR32_USBB.uprst |= (AVR32_USBB_PEN0_MASK << USB_SelectedPipe);
+ }
+
+ /** Disables the currently selected pipe so that data cannot be sent and received through it to and
+ * from an attached device.
+ */
+ static inline void Pipe_DisablePipe(void) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_DisablePipe(void)
+ {
+ AVR32_USBB.uprst &= ~(AVR32_USBB_PEN0_MASK << USB_SelectedPipe);
+ }
+
+ /** Determines if the currently selected pipe is enabled, but not necessarily configured.
+ *
+ * \return Boolean \c true if the currently selected pipe is enabled, \c false otherwise.
+ */
+ static inline bool Pipe_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Pipe_IsEnabled(void)
+ {
+ return ((AVR32_USBB.uprst & (AVR32_USBB_PEN0_MASK << USB_SelectedPipe)) ? true : false);
+ }
+
+ /** Gets the current pipe token, indicating the pipe's data direction and type.
+ *
+ * \return The current pipe token, as a \c PIPE_TOKEN_* mask.
+ */
+ static inline uint8_t Pipe_GetPipeToken(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint8_t Pipe_GetPipeToken(void)
+ {
+ return (&AVR32_USBB.UPCFG0)[USB_SelectedPipe].ptoken;
+ }
+
+ /** Sets the token for the currently selected pipe to one of the tokens specified by the \c PIPE_TOKEN_*
+ * masks. This can be used on CONTROL type pipes, to allow for bidirectional transfer of data during
+ * control requests, or on regular pipes to allow for half-duplex bidirectional data transfer to devices
+ * which have two endpoints of opposite direction sharing the same endpoint address within the device.
+ *
+ * \param[in] Token New pipe token to set the selected pipe to, as a \c PIPE_TOKEN_* mask.
+ */
+ static inline void Pipe_SetPipeToken(const uint8_t Token) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_SetPipeToken(const uint8_t Token)
+ {
+ (&AVR32_USBB.UPCFG0)[USB_SelectedPipe].ptoken = Token;
+ }
+
+ /** Configures the currently selected pipe to allow for an unlimited number of IN requests. */
+ static inline void Pipe_SetInfiniteINRequests(void) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_SetInfiniteINRequests(void)
+ {
+ (&AVR32_USBB.UPINRQ0)[USB_SelectedPipe].inmode = true;
+ }
+
+ /** Configures the currently selected pipe to only allow the specified number of IN requests to be
+ * accepted by the pipe before it is automatically frozen.
+ *
+ * \param[in] TotalINRequests Total number of IN requests that the pipe may receive before freezing.
+ */
+ static inline void Pipe_SetFiniteINRequests(const uint8_t TotalINRequests) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_SetFiniteINRequests(const uint8_t TotalINRequests)
+ {
+ (&AVR32_USBB.UPINRQ0)[USB_SelectedPipe].inmode = false;
+ (&AVR32_USBB.UPINRQ0)[USB_SelectedPipe].inrq = TotalINRequests;
+ }
+
+ /** Determines if the currently selected pipe is configured.
+ *
+ * \return Boolean \c true if the selected pipe is configured, \c false otherwise.
+ */
+ static inline bool Pipe_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Pipe_IsConfigured(void)
+ {
+ return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].cfgok;
+ }
+
+ /** Retrieves the endpoint address of the endpoint within the attached device that the currently selected
+ * pipe is bound to.
+ *
+ * \return Endpoint address the currently selected pipe is bound to.
+ */
+ static inline uint8_t Pipe_GetBoundEndpointAddress(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint8_t Pipe_GetBoundEndpointAddress(void)
+ {
+ return ((&AVR32_USBB.UPCFG0)[USB_SelectedPipe].pepnum |
+ ((Pipe_GetPipeToken() == PIPE_TOKEN_IN) ? PIPE_EPDIR_MASK : 0));
+ }
+
+ /** Sets the period between interrupts for an INTERRUPT type pipe to a specified number of milliseconds.
+ *
+ * \param[in] Milliseconds Number of milliseconds between each pipe poll.
+ */
+ static inline void Pipe_SetInterruptPeriod(const uint8_t Milliseconds) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_SetInterruptPeriod(const uint8_t Milliseconds)
+ {
+ (&AVR32_USBB.UPCFG0)[USB_SelectedPipe].intfrq = Milliseconds;
+ }
+
+ /** Returns a mask indicating which pipe's interrupt periods have elapsed, indicating that the pipe should
+ * be serviced.
+ *
+ * \return Mask whose bits indicate which pipes have interrupted.
+ */
+ static inline uint8_t Pipe_GetPipeInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint8_t Pipe_GetPipeInterrupts(void)
+ {
+ return ((AVR32_USBB.uhint & (AVR32_USBB_P6INT_MASK | AVR32_USBB_P5INT_MASK |
+ AVR32_USBB_P4INT_MASK | AVR32_USBB_P3INT_MASK |
+ AVR32_USBB_P2INT_MASK | AVR32_USBB_P1INT_MASK |
+ AVR32_USBB_P0INT_MASK)) >> AVR32_USBB_P0INT_OFFSET);
+ }
+
+ /** Determines if the specified pipe number has interrupted (valid only for INTERRUPT type
+ * pipes).
+ *
+ * \param[in] PipeNumber Index of the pipe whose interrupt flag should be tested.
+ *
+ * \return Boolean \c true if the specified pipe has interrupted, \c false otherwise.
+ */
+ static inline bool Pipe_HasPipeInterrupted(const uint8_t PipeNumber) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Pipe_HasPipeInterrupted(const uint8_t PipeNumber)
+ {
+ return ((AVR32_USBB.uhint & (AVR32_USBB_P0INTES_MASK << USB_SelectedPipe)) ? true : false);
+ }
+
+ /** Unfreezes the selected pipe, allowing it to communicate with an attached device. */
+ static inline void Pipe_Unfreeze(void) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_Unfreeze(void)
+ {
+ (&AVR32_USBB.UPCON0CLR)[USB_SelectedPipe].pfreezec = true;
+ }
+
+ /** Freezes the selected pipe, preventing it from communicating with an attached device. */
+ static inline void Pipe_Freeze(void) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_Freeze(void)
+ {
+ (&AVR32_USBB.UPCON0SET)[USB_SelectedPipe].pfreezes = true;
+ }
+
+ /** Determines if the currently selected pipe is frozen, and not able to accept data.
+ *
+ * \return Boolean \c true if the currently selected pipe is frozen, \c false otherwise.
+ */
+ static inline bool Pipe_IsFrozen(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Pipe_IsFrozen(void)
+ {
+ return (((&AVR32_USBB.UPCON0)[USB_SelectedPipe].pfreeze) ? true : false);
+ }
+
+ /** Clears the error flags for the currently selected pipe. */
+ static inline void Pipe_ClearError(void) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_ClearError(void)
+ {
+ (&AVR32_USBB.uperr0)[USB_SelectedPipe] = 0;
+ (&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].overfic = true;
+ }
+
+ /** Determines if the master pipe error flag is set for the currently selected pipe, indicating that
+ * some sort of hardware error has occurred on the pipe.
+ *
+ * \see \ref Pipe_GetErrorFlags() macro for information on retrieving the exact error flag.
+ *
+ * \return Boolean \c true if an error has occurred on the selected pipe, \c false otherwise.
+ */
+ static inline bool Pipe_IsError(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Pipe_IsError(void)
+ {
+ return (((&AVR32_USBB.upsta0)[USB_SelectedPipe] &
+ (AVR32_USBB_PERRI_MASK | AVR32_USBB_OVERFI_MASK)) ? true : false);
+ }
+
+ /** Gets a mask of the hardware error flags which have occurred on the currently selected pipe. This
+ * value can then be masked against the \c PIPE_ERRORFLAG_* masks to determine what error has occurred.
+ *
+ * \return Mask comprising of \c PIPE_ERRORFLAG_* bits indicating what error has occurred on the selected pipe.
+ */
+ static inline uint8_t Pipe_GetErrorFlags(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint8_t Pipe_GetErrorFlags(void)
+ {
+
+ return (((&AVR32_USBB.uperr0)[USB_SelectedPipe] &
+ (PIPE_ERRORFLAG_CRC16 | PIPE_ERRORFLAG_TIMEOUT |
+ PIPE_ERRORFLAG_PID | PIPE_ERRORFLAG_DATAPID |
+ PIPE_ERRORFLAG_DATATGL)) |
+ (((&AVR32_USBB.upsta0)[USB_SelectedPipe] << 8) &
+ PIPE_ERRORFLAG_OVERFLOW));
+ }
+
+ /** Retrieves the number of busy banks in the currently selected pipe, which have been queued for
+ * transmission via the \ref Pipe_ClearOUT() command, or are awaiting acknowledgement via the
+ * \ref Pipe_ClearIN() command.
+ *
+ * \ingroup Group_PipePacketManagement_UC3
+ *
+ * \return Total number of busy banks in the selected pipe.
+ */
+ static inline uint8_t Pipe_GetBusyBanks(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint8_t Pipe_GetBusyBanks(void)
+ {
+ return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].nbusybk;
+ }
+
+ /** Determines if the currently selected pipe may be read from (if data is waiting in the pipe
+ * bank and the pipe is an IN direction, or if the bank is not yet full if the pipe is an OUT
+ * direction). This function will return false if an error has occurred in the pipe, or if the pipe
+ * is an IN direction and no packet (or an empty packet) has been received, or if the pipe is an OUT
+ * direction and the pipe bank is full.
+ *
+ * \note This function is not valid on CONTROL type pipes.
+ *
+ * \ingroup Group_PipePacketManagement_UC3
+ *
+ * \return Boolean \c true if the currently selected pipe may be read from or written to, depending
+ * on its direction.
+ */
+ static inline bool Pipe_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Pipe_IsReadWriteAllowed(void)
+ {
+ return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].rwall;
+ }
+
+ /** Determines if a packet has been received on the currently selected IN pipe from the attached device.
+ *
+ * \ingroup Group_PipePacketManagement_UC3
+ *
+ * \return Boolean \c true if the current pipe has received an IN packet, \c false otherwise.
+ */
+ static inline bool Pipe_IsINReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Pipe_IsINReceived(void)
+ {
+ return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].rxini;
+ }
+
+ /** Determines if the currently selected OUT pipe is ready to send an OUT packet to the attached device.
+ *
+ * \ingroup Group_PipePacketManagement_UC3
+ *
+ * \return Boolean \c true if the current pipe is ready for an OUT packet, \c false otherwise.
+ */
+ static inline bool Pipe_IsOUTReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Pipe_IsOUTReady(void)
+ {
+ return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].txouti;
+ }
+
+ /** Determines if no SETUP request is currently being sent to the attached device on the selected
+ * CONTROL type pipe.
+ *
+ * \ingroup Group_PipePacketManagement_UC3
+ *
+ * \return Boolean \c true if the current pipe is ready for a SETUP packet, \c false otherwise.
+ */
+ static inline bool Pipe_IsSETUPSent(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Pipe_IsSETUPSent(void)
+ {
+ return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].txstpi;
+ }
+
+ /** Sends the currently selected CONTROL type pipe's contents to the device as a SETUP packet.
+ *
+ * \ingroup Group_PipePacketManagement_UC3
+ */
+ static inline void Pipe_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_ClearSETUP(void)
+ {
+ (&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].txstpic = true;
+ USB_PipeFIFOPos[USB_SelectedPipe] = &AVR32_USBB_SLAVE[USB_SelectedPipe * PIPE_HSB_ADDRESS_SPACE_SIZE];
+ }
+
+ /** Acknowledges the reception of a setup IN request from the attached device on the currently selected
+ * pipe, freeing the bank ready for the next packet.
+ *
+ * \ingroup Group_PipePacketManagement_UC3
+ */
+ static inline void Pipe_ClearIN(void) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_ClearIN(void)
+ {
+ (&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].rxinic = true;
+ (&AVR32_USBB.UPCON0CLR)[USB_SelectedPipe].fifoconc = true;
+ USB_PipeFIFOPos[USB_SelectedPipe] = &AVR32_USBB_SLAVE[USB_SelectedPipe * PIPE_HSB_ADDRESS_SPACE_SIZE];
+ }
+
+ /** Sends the currently selected pipe's contents to the device as an OUT packet on the selected pipe, freeing
+ * the bank ready for the next packet.
+ *
+ * \ingroup Group_PipePacketManagement_UC3
+ */
+ static inline void Pipe_ClearOUT(void) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_ClearOUT(void)
+ {
+ (&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].txoutic = true;
+ (&AVR32_USBB.UPCON0CLR)[USB_SelectedPipe].fifoconc = true;
+ USB_PipeFIFOPos[USB_SelectedPipe] = &AVR32_USBB_SLAVE[USB_SelectedPipe * PIPE_HSB_ADDRESS_SPACE_SIZE];
+ }
+
+ /** Determines if the device sent a NAK (Negative Acknowledge) in response to the last sent packet on
+ * the currently selected pipe. This occurs when the host sends a packet to the device, but the device
+ * is not currently ready to handle the packet (i.e. its endpoint banks are full). Once a NAK has been
+ * received, it must be cleared using \ref Pipe_ClearNAKReceived() before the previous (or any other) packet
+ * can be re-sent.
+ *
+ * \ingroup Group_PipePacketManagement_UC3
+ *
+ * \return Boolean \c true if an NAK has been received on the current pipe, \c false otherwise.
+ */
+ static inline bool Pipe_IsNAKReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Pipe_IsNAKReceived(void)
+ {
+ return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].nakedi;
+ }
+
+ /** Clears the NAK condition on the currently selected pipe.
+ *
+ * \ingroup Group_PipePacketManagement_UC3
+ *
+ * \see \ref Pipe_IsNAKReceived() for more details.
+ */
+ static inline void Pipe_ClearNAKReceived(void) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_ClearNAKReceived(void)
+ {
+ (&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].nakedic = true;
+ }
+
+ /** Determines if the currently selected pipe has had the STALL condition set by the attached device.
+ *
+ * \ingroup Group_PipePacketManagement_UC3
+ *
+ * \return Boolean \c true if the current pipe has been stalled by the attached device, \c false otherwise.
+ */
+ static inline bool Pipe_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Pipe_IsStalled(void)
+ {
+ return (&AVR32_USBB.UPSTA0)[USB_SelectedPipe].rxstalldi;
+ }
+
+ /** Clears the STALL condition detection flag on the currently selected pipe, but does not clear the
+ * STALL condition itself (this must be done via a ClearFeature control request to the device).
+ *
+ * \ingroup Group_PipePacketManagement_UC3
+ */
+ static inline void Pipe_ClearStall(void) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_ClearStall(void)
+ {
+ (&AVR32_USBB.UPSTA0CLR)[USB_SelectedPipe].rxstalldic = true;
+ USB_PipeFIFOPos[USB_SelectedPipe] = &AVR32_USBB_SLAVE[USB_SelectedPipe * PIPE_HSB_ADDRESS_SPACE_SIZE];
+ }
+
+ /** Reads one byte from the currently selected pipe's bank, for OUT direction pipes.
+ *
+ * \ingroup Group_PipePrimitiveRW_UC3
+ *
+ * \return Next byte in the currently selected pipe's FIFO buffer.
+ */
+ static inline uint8_t Pipe_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint8_t Pipe_Read_8(void)
+ {
+ return *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ }
+
+ /** Writes one byte to the currently selected pipe's bank, for IN direction pipes.
+ *
+ * \ingroup Group_PipePrimitiveRW_UC3
+ *
+ * \param[in] Data Data to write into the the currently selected pipe's FIFO buffer.
+ */
+ static inline void Pipe_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_Write_8(const uint8_t Data)
+ {
+ *(USB_PipeFIFOPos[USB_SelectedPipe]++) = Data;
+ }
+
+ /** Discards one byte from the currently selected pipe's bank, for OUT direction pipes.
+ *
+ * \ingroup Group_PipePrimitiveRW_UC3
+ */
+ static inline void Pipe_Discard_8(void) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_Discard_8(void)
+ {
+ uint8_t Dummy;
+
+ Dummy = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ }
+
+ /** Reads two bytes from the currently selected pipe's bank in little endian format, for OUT
+ * direction pipes.
+ *
+ * \ingroup Group_PipePrimitiveRW_UC3
+ *
+ * \return Next two bytes in the currently selected pipe's FIFO buffer.
+ */
+ static inline uint16_t Pipe_Read_16_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint16_t Pipe_Read_16_LE(void)
+ {
+ uint16_t Byte1 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ uint16_t Byte0 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+
+ return ((Byte0 << 8) | Byte1);
+ }
+
+ /** Reads two bytes from the currently selected pipe's bank in big endian format, for OUT
+ * direction pipes.
+ *
+ * \ingroup Group_PipePrimitiveRW_UC3
+ *
+ * \return Next two bytes in the currently selected pipe's FIFO buffer.
+ */
+ static inline uint16_t Pipe_Read_16_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint16_t Pipe_Read_16_BE(void)
+ {
+ uint16_t Byte0 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ uint16_t Byte1 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+
+ return ((Byte0 << 8) | Byte1);
+ }
+
+ /** Writes two bytes to the currently selected pipe's bank in little endian format, for IN
+ * direction pipes.
+ *
+ * \ingroup Group_PipePrimitiveRW_UC3
+ *
+ * \param[in] Data Data to write to the currently selected pipe's FIFO buffer.
+ */
+ static inline void Pipe_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_Write_16_LE(const uint16_t Data)
+ {
+ *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 8);
+ *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data & 0xFF);
+ }
+
+ /** Writes two bytes to the currently selected pipe's bank in big endian format, for IN
+ * direction pipes.
+ *
+ * \ingroup Group_PipePrimitiveRW_UC3
+ *
+ * \param[in] Data Data to write to the currently selected pipe's FIFO buffer.
+ */
+ static inline void Pipe_Write_16_BE(const uint16_t Data) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_Write_16_BE(const uint16_t Data)
+ {
+ *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data & 0xFF);
+ *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 8);
+ }
+
+ /** Discards two bytes from the currently selected pipe's bank, for OUT direction pipes.
+ *
+ * \ingroup Group_PipePrimitiveRW_UC3
+ */
+ static inline void Pipe_Discard_16(void) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_Discard_16(void)
+ {
+ uint8_t Dummy;
+
+ Dummy = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ Dummy = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ }
+
+ /** Reads four bytes from the currently selected pipe's bank in little endian format, for OUT
+ * direction pipes.
+ *
+ * \ingroup Group_PipePrimitiveRW_UC3
+ *
+ * \return Next four bytes in the currently selected pipe's FIFO buffer.
+ */
+ static inline uint32_t Pipe_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint32_t Pipe_Read_32_LE(void)
+ {
+ uint32_t Byte3 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ uint32_t Byte2 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ uint32_t Byte1 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ uint32_t Byte0 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+
+ return ((Byte0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3);
+ }
+
+ /** Reads four bytes from the currently selected pipe's bank in big endian format, for OUT
+ * direction pipes.
+ *
+ * \ingroup Group_PipePrimitiveRW_UC3
+ *
+ * \return Next four bytes in the currently selected pipe's FIFO buffer.
+ */
+ static inline uint32_t Pipe_Read_32_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint32_t Pipe_Read_32_BE(void)
+ {
+ uint32_t Byte0 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ uint32_t Byte1 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ uint32_t Byte2 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ uint32_t Byte3 = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+
+ return ((Byte0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3);
+ }
+
+ /** Writes four bytes to the currently selected pipe's bank in little endian format, for IN
+ * direction pipes.
+ *
+ * \ingroup Group_PipePrimitiveRW_UC3
+ *
+ * \param[in] Data Data to write to the currently selected pipe's FIFO buffer.
+ */
+ static inline void Pipe_Write_32_LE(const uint32_t Data) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_Write_32_LE(const uint32_t Data)
+ {
+ *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 24);
+ *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 16);
+ *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 8);
+ *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data & 0xFF);
+ }
+
+ /** Writes four bytes to the currently selected pipe's bank in big endian format, for IN
+ * direction pipes.
+ *
+ * \ingroup Group_PipePrimitiveRW_UC3
+ *
+ * \param[in] Data Data to write to the currently selected pipe's FIFO buffer.
+ */
+ static inline void Pipe_Write_32_BE(const uint32_t Data) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_Write_32_BE(const uint32_t Data)
+ {
+ *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data & 0xFF);
+ *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 8);
+ *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 16);
+ *(USB_PipeFIFOPos[USB_SelectedPipe]++) = (Data >> 24);
+ }
+
+ /** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes.
+ *
+ * \ingroup Group_PipePrimitiveRW_UC3
+ */
+ static inline void Pipe_Discard_32(void) ATTR_ALWAYS_INLINE;
+ static inline void Pipe_Discard_32(void)
+ {
+ uint8_t Dummy;
+
+ Dummy = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ Dummy = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ Dummy = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ Dummy = *(USB_PipeFIFOPos[USB_SelectedPipe]++);
+ }
+
+ /* External Variables: */
+ /** Global indicating the maximum packet size of the default control pipe located at address
+ * 0 in the device. This value is set to the value indicated in the attached device's device
+ * descriptor once the USB interface is initialized into host mode and a device is attached
+ * to the USB bus.
+ *
+ * \note This variable should be treated as read-only in the user application, and never manually
+ * changed in value.
+ */
+ extern uint8_t USB_Host_ControlPipeSize;
+
+ /* Function Prototypes: */
+ /** Configures the specified pipe number with the given pipe type, token, target endpoint number in the
+ * attached device, bank size and banking mode.
+ *
+ * A newly configured pipe is frozen by default, and must be unfrozen before use via the \ref Pipe_Unfreeze()
+ * before being used. Pipes should be kept frozen unless waiting for data from a device while in IN mode, or
+ * sending data to the device in OUT mode. IN type pipes are also automatically configured to accept infinite
+ * numbers of IN requests without automatic freezing - this can be overridden by a call to
+ * \ref Pipe_SetFiniteINRequests().
+ *
+ * \param[in] Number Pipe number to configure. This must be more than 0 and less than \ref PIPE_TOTAL_PIPES.
+ *
+ * \param[in] Type Type of pipe to configure, an \c EP_TYPE_* mask. Not all pipe types are available on Low
+ * Speed USB devices - refer to the USB 2.0 specification.
+ *
+ * \param[in] Token Pipe data token, either \ref PIPE_TOKEN_SETUP, \ref PIPE_TOKEN_OUT or \ref PIPE_TOKEN_IN.
+ * All pipes (except Control type) are unidirectional - data may only be read from or
+ * written to the pipe bank based on its direction, not both.
+ *
+ * \param[in] EndpointNumber Endpoint index within the attached device that the pipe should interface to.
+ *
+ * \param[in] Size Size of the pipe's bank, where packets are stored before they are transmitted to
+ * the USB device, or after they have been received from the USB device (depending on
+ * the pipe's data direction). The bank size must indicate the maximum packet size that
+ * the pipe can handle.
+ *
+ * \param[in] Banks Number of banks to use for the pipe being configured, a \c PIPE_BANK_* mask. More banks
+ * uses more USB DPRAM, but offers better performance. Isochronous type pipes <b>must</b>
+ * have at least two banks.
+ *
+ * \note When the \c ORDERED_EP_CONFIG compile time option is used, Pipes <b>must</b> be configured in ascending order,
+ * or bank corruption will occur.
+ * \n\n
+ *
+ * \note Certain microcontroller model's pipes may have different maximum packet sizes based on the pipe's
+ * index - refer to the chosen microcontroller's datasheet to determine the maximum bank size for each pipe.
+ * \n\n
+ *
+ * \note The default control pipe 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 pipe upon success. Upon failure, the pipe which
+ * failed to reconfigure correctly will be selected.
+ *
+ * \return Boolean \c true if the configuration succeeded, \c false otherwise.
+ */
+ bool Pipe_ConfigurePipe(const uint8_t Number,
+ const uint8_t Type,
+ const uint8_t Token,
+ const uint8_t EndpointNumber,
+ const uint16_t Size,
+ const uint8_t Banks);
+
+ /** Spin-loops until the currently selected non-control pipe is ready for the next packed of data to be read
+ * or written to it, aborting in the case of an error condition (such as a timeout or device disconnect).
+ *
+ * \ingroup Group_PipeRW_UC3
+ *
+ * \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum.
+ */
+ uint8_t Pipe_WaitUntilReady(void);
+
+ /** Determines if a pipe has been bound to the given device endpoint address. If a pipe which is bound to the given
+ * endpoint is found, it is automatically selected.
+ *
+ * \param[in] EndpointAddress Address and direction mask of the endpoint within the attached device to check.
+ *
+ * \return Boolean \c true if a pipe bound to the given endpoint address of the specified direction is found,
+ * \c false otherwise.
+ */
+ bool Pipe_IsEndpointBound(const uint8_t EndpointAddress) ATTR_WARN_UNUSED_RESULT;
+
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Macros: */
+ #if !defined(ENDPOINT_CONTROLEP)
+ #define ENDPOINT_CONTROLEP 0
+ #endif
+
+ /* Inline Functions: */
+ static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE;
+ static inline uint8_t Pipe_BytesToEPSizeMask(const uint16_t Bytes)
+ {
+ uint8_t MaskVal = 0;
+ uint16_t CheckBytes = 8;
+
+ while ((CheckBytes < Bytes) && (CheckBytes < PIPE_MAX_SIZE))
+ {
+ MaskVal++;
+ CheckBytes <<= 1;
+ }
+
+ return (MaskVal << AVR32_USBB_PSIZE_OFFSET);
+ }
+
+ /* Function Prototypes: */
+ void Pipe_ClearPipes(void);
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c b/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c
index 1472dd6a8..93ed03ecf 100644
--- a/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c
+++ b/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c
@@ -1,215 +1,215 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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
-#define __INCLUDE_FROM_USB_CONTROLLER_C
-#include "../USBController.h"
-
-#if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY))
-volatile uint8_t USB_CurrentMode = USB_MODE_None;
-#endif
-
-#if !defined(USE_STATIC_OPTIONS)
-volatile uint8_t USB_Options;
-#endif
-
-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
-
- #if defined(USB_CAN_BE_BOTH)
- if (Mode == USB_MODE_UID)
- {
- AVR32_USBB.USBCON.uide = true;
- USB_INT_Enable(USB_INT_IDTI);
- USB_CurrentMode = USB_GetUSBModeFromUID();
- }
- else
- {
- AVR32_USBB.USBCON.uide = false;
- USB_CurrentMode = Mode;
- }
- #else
- AVR32_USBB.USBCON.uide = false;
- #endif
-
- USB_IsInitialized = true;
-
- USB_ResetInterface();
-}
-
-void USB_Disable(void)
-{
- USB_INT_DisableAllInterrupts();
- USB_INT_ClearAllInterrupts();
-
- USB_Detach();
- USB_Controller_Disable();
-
- USB_OTGPAD_Off();
-
- #if defined(USB_CAN_BE_BOTH)
- USB_CurrentMode = USB_MODE_None;
- #endif
-
- AVR32_PM.GCCTRL[3].cen = false;
-
- USB_IsInitialized = false;
-}
-
-void USB_ResetInterface(void)
-{
- #if defined(USB_CAN_BE_BOTH)
- bool UIDModeSelectEnabled = AVR32_USBB.USBCON.uide;
- #endif
-
- AVR32_PM.GCCTRL[AVR32_PM_GCLK_USBB].pllsel = !(USB_Options & USB_OPT_GCLK_SRC_OSC);
- AVR32_PM.GCCTRL[AVR32_PM_GCLK_USBB].oscsel = !(USB_Options & USB_OPT_GCLK_CHANNEL_0);
- AVR32_PM.GCCTRL[AVR32_PM_GCLK_USBB].diven = (F_USB != USB_CLOCK_REQUIRED_FREQ);
- AVR32_PM.GCCTRL[AVR32_PM_GCLK_USBB].div = (F_USB == USB_CLOCK_REQUIRED_FREQ) ? 0 : (uint32_t)(((F_USB / USB_CLOCK_REQUIRED_FREQ) - 1) / 2);
- AVR32_PM.GCCTRL[AVR32_PM_GCLK_USBB].cen = true;
-
- USB_INT_DisableAllInterrupts();
- USB_INT_ClearAllInterrupts();
-
- USB_Controller_Reset();
-
- #if defined(USB_CAN_BE_BOTH)
- if (UIDModeSelectEnabled)
- USB_INT_Enable(USB_INT_IDTI);
- #endif
-
- USB_CLK_Unfreeze();
-
- if (USB_CurrentMode == USB_MODE_Device)
- {
- #if defined(USB_CAN_BE_DEVICE)
- AVR32_USBB.USBCON.uimod = true;
-
- USB_Init_Device();
- #endif
- }
- else if (USB_CurrentMode == USB_MODE_Host)
- {
- #if defined(USB_CAN_BE_HOST)
- AVR32_USBB.USBCON.uimod = false;
-
- USB_Init_Host();
- #endif
- }
-
- USB_OTGPAD_On();
-}
-
-#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 (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr) != NO_DESCRIPTOR)
- USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size;
- #endif
-
- if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
- {
- USB_Device_SetLowSpeed();
- }
- else
- {
- #if defined(USB_DEVICE_OPT_HIGHSPEED)
- if (USB_Options & USB_DEVICE_OPT_HIGHSPEED)
- USB_Device_SetHighSpeed();
- else
- USB_Device_SetFullSpeed();
- #else
- USB_Device_SetFullSpeed();
- #endif
- }
-
- USB_INT_Enable(USB_INT_VBUSTI);
-
- Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
- ENDPOINT_DIR_OUT, USB_Device_ControlEndpointSize,
- ENDPOINT_BANK_SINGLE);
-
- USB_INT_Clear(USB_INT_SUSPI);
- USB_INT_Enable(USB_INT_SUSPI);
- USB_INT_Enable(USB_INT_EORSTI);
-
- USB_Attach();
-}
-#endif
-
-#if defined(USB_CAN_BE_HOST)
-static void USB_Init_Host(void)
-{
- USB_HostState = HOST_STATE_Unattached;
- USB_Host_ConfigurationNumber = 0;
- USB_Host_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE;
-
- USB_Host_HostMode_On();
-
- USB_Host_VBUS_Auto_On();
-
- USB_INT_Enable(USB_INT_DCONNI);
- USB_INT_Enable(USB_INT_BCERRI);
-
- USB_Attach();
-}
-#endif
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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
+#define __INCLUDE_FROM_USB_CONTROLLER_C
+#include "../USBController.h"
+
+#if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY))
+volatile uint8_t USB_CurrentMode = USB_MODE_None;
+#endif
+
+#if !defined(USE_STATIC_OPTIONS)
+volatile uint8_t USB_Options;
+#endif
+
+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
+
+ #if defined(USB_CAN_BE_BOTH)
+ if (Mode == USB_MODE_UID)
+ {
+ AVR32_USBB.USBCON.uide = true;
+ USB_INT_Enable(USB_INT_IDTI);
+ USB_CurrentMode = USB_GetUSBModeFromUID();
+ }
+ else
+ {
+ AVR32_USBB.USBCON.uide = false;
+ USB_CurrentMode = Mode;
+ }
+ #else
+ AVR32_USBB.USBCON.uide = false;
+ #endif
+
+ USB_IsInitialized = true;
+
+ USB_ResetInterface();
+}
+
+void USB_Disable(void)
+{
+ USB_INT_DisableAllInterrupts();
+ USB_INT_ClearAllInterrupts();
+
+ USB_Detach();
+ USB_Controller_Disable();
+
+ USB_OTGPAD_Off();
+
+ #if defined(USB_CAN_BE_BOTH)
+ USB_CurrentMode = USB_MODE_None;
+ #endif
+
+ AVR32_PM.GCCTRL[3].cen = false;
+
+ USB_IsInitialized = false;
+}
+
+void USB_ResetInterface(void)
+{
+ #if defined(USB_CAN_BE_BOTH)
+ bool UIDModeSelectEnabled = AVR32_USBB.USBCON.uide;
+ #endif
+
+ AVR32_PM.GCCTRL[AVR32_PM_GCLK_USBB].pllsel = !(USB_Options & USB_OPT_GCLK_SRC_OSC);
+ AVR32_PM.GCCTRL[AVR32_PM_GCLK_USBB].oscsel = !(USB_Options & USB_OPT_GCLK_CHANNEL_0);
+ AVR32_PM.GCCTRL[AVR32_PM_GCLK_USBB].diven = (F_USB != USB_CLOCK_REQUIRED_FREQ);
+ AVR32_PM.GCCTRL[AVR32_PM_GCLK_USBB].div = (F_USB == USB_CLOCK_REQUIRED_FREQ) ? 0 : (uint32_t)(((F_USB / USB_CLOCK_REQUIRED_FREQ) - 1) / 2);
+ AVR32_PM.GCCTRL[AVR32_PM_GCLK_USBB].cen = true;
+
+ USB_INT_DisableAllInterrupts();
+ USB_INT_ClearAllInterrupts();
+
+ USB_Controller_Reset();
+
+ #if defined(USB_CAN_BE_BOTH)
+ if (UIDModeSelectEnabled)
+ USB_INT_Enable(USB_INT_IDTI);
+ #endif
+
+ USB_CLK_Unfreeze();
+
+ if (USB_CurrentMode == USB_MODE_Device)
+ {
+ #if defined(USB_CAN_BE_DEVICE)
+ AVR32_USBB.USBCON.uimod = true;
+
+ USB_Init_Device();
+ #endif
+ }
+ else if (USB_CurrentMode == USB_MODE_Host)
+ {
+ #if defined(USB_CAN_BE_HOST)
+ AVR32_USBB.USBCON.uimod = false;
+
+ USB_Init_Host();
+ #endif
+ }
+
+ USB_OTGPAD_On();
+}
+
+#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 (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr) != NO_DESCRIPTOR)
+ USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size;
+ #endif
+
+ if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
+ {
+ USB_Device_SetLowSpeed();
+ }
+ else
+ {
+ #if defined(USB_DEVICE_OPT_HIGHSPEED)
+ if (USB_Options & USB_DEVICE_OPT_HIGHSPEED)
+ USB_Device_SetHighSpeed();
+ else
+ USB_Device_SetFullSpeed();
+ #else
+ USB_Device_SetFullSpeed();
+ #endif
+ }
+
+ USB_INT_Enable(USB_INT_VBUSTI);
+
+ Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
+ ENDPOINT_DIR_OUT, USB_Device_ControlEndpointSize,
+ ENDPOINT_BANK_SINGLE);
+
+ USB_INT_Clear(USB_INT_SUSPI);
+ USB_INT_Enable(USB_INT_SUSPI);
+ USB_INT_Enable(USB_INT_EORSTI);
+
+ USB_Attach();
+}
+#endif
+
+#if defined(USB_CAN_BE_HOST)
+static void USB_Init_Host(void)
+{
+ USB_HostState = HOST_STATE_Unattached;
+ USB_Host_ConfigurationNumber = 0;
+ USB_Host_ControlPipeSize = PIPE_CONTROLPIPE_DEFAULT_SIZE;
+
+ USB_Host_HostMode_On();
+
+ USB_Host_VBUS_Auto_On();
+
+ USB_INT_Enable(USB_INT_DCONNI);
+ USB_INT_Enable(USB_INT_BCERRI);
+
+ USB_Attach();
+}
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/UC3/USBController_UC3.h b/LUFA/Drivers/USB/Core/UC3/USBController_UC3.h
index c2f85b8af..565517842 100644
--- a/LUFA/Drivers/USB/Core/UC3/USBController_UC3.h
+++ b/LUFA/Drivers/USB/Core/UC3/USBController_UC3.h
@@ -1,383 +1,383 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 AVR32 UC3 microcontrollers.
- * \copydetails Group_USBManagement_UC3
- *
- * \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_UC3 USB Interface Management (UC3)
- * \brief USB Controller definitions for the AVR32 UC3 microcontrollers.
- *
- * Functions, macros, variables, enums and types related to the setup and management of the USB interface.
- *
- * @{
- */
-
-#ifndef __USBCONTROLLER_UC3_H__
-#define __USBCONTROLLER_UC3_H__
-
- /* Includes: */
- #include "../../../../Common/Common.h"
- #include "../USBMode.h"
- #include "../Events.h"
- #include "../USBTask.h"
- #include "../USBInterrupt.h"
-
- #if defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)
- #include "../Host.h"
- #include "../OTG.h"
- #include "../Pipe.h"
- #include "../HostStandardReq.h"
- #include "../PipeStream.h"
- #endif
-
- #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 clock input to the USB module.
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** \name USB Controller Option Masks */
- //@{
- /** Selects one of the system's main clock oscillators as the input clock to the USB Generic Clock source
- * generation module. This indicates that an external oscillator should be used directly instead of an
- * internal PLL clock source.
- */
- #define USB_OPT_GCLK_SRC_OSC (1 << 2)
-
- /** Selects one of the system's PLL oscillators as the input clock to the USB Generic Clock source
- * generation module. This indicates that one of the device's PLL outputs should be used instead of an
- * external oscillator source.
- */
- #define USB_OPT_GCLK_SRC_PLL (0 << 2)
-
- /** Selects PLL or External Oscillator 0 as the USB Generic Clock source module input clock. */
- #define USB_OPT_GCLK_CHANNEL_0 (1 << 3)
-
- /** Selects PLL or External Oscillator 1 as the USB Generic Clock source module input clock. */
- #define USB_OPT_GCLK_CHANNEL_1 (0 << 3)
- //@}
-
- /** \name Endpoint/Pipe Type Masks */
- //@{
- /** Mask for a CONTROL type endpoint or pipe.
- *
- * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
- */
- #define EP_TYPE_CONTROL 0x00
-
- /** Mask for an ISOCHRONOUS type endpoint or pipe.
- *
- * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
- */
- #define EP_TYPE_ISOCHRONOUS 0x01
-
- /** Mask for a BULK type endpoint or pipe.
- *
- * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
- */
- #define EP_TYPE_BULK 0x02
-
- /** Mask for an INTERRUPT type endpoint or pipe.
- *
- * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
- */
- #define EP_TYPE_INTERRUPT 0x03
- //@}
-
- #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: */
- /** Determines if the VBUS line is currently high (i.e. the USB host is supplying power).
- *
- * \return Boolean \c true if the VBUS line is currently detecting power from a host, \c false otherwise.
- */
- static inline bool USB_VBUS_GetStatus(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool USB_VBUS_GetStatus(void)
- {
- return AVR32_USBB.USBSTA.vbus;
- }
-
- /** Detaches the device from the USB bus. This has the effect of removing the device from any
- * attached host, ceasing USB communications. If no host is present, this prevents any host from
- * enumerating the device once attached until \ref USB_Attach() is called.
- */
- static inline void USB_Detach(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Detach(void)
- {
- AVR32_USBB.UDCON.detach = true;
- }
-
- /** 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)
- {
- AVR32_USBB.UDCON.detach = false;
- }
-
- /* 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 This is a mask indicating what mode the USB interface is to be initialized to, a value
- * from the \ref USB_Modes_t enum.
- *
- * \param[in] Options Mask indicating the options which should be used when initializing the USB
- * interface to control the USB interface's behaviour. 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 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.
- *
- * \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_HOST_ONLY) && !defined(USB_DEVICE_ONLY)) || defined(__DOXYGEN__)
- /** Indicates the mode that the USB interface is currently initialized to, a value from the
- * \ref USB_Modes_t enum.
- *
- * \note This variable should be treated as read-only in the user application, and never manually
- * changed in value.
- * \n\n
- *
- * \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_HOST_ONLY)
- #define USB_CurrentMode USB_MODE_Host
- #elif defined(USB_DEVICE_ONLY)
- #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.
- *
- * \note 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
-
- /* Enums: */
- /** Enum for the possible USB controller modes, for initialization via \ref USB_Init() and indication back to the
- * user application via \ref USB_CurrentMode.
- */
- enum USB_Modes_t
- {
- USB_MODE_None = 0, /**< Indicates that the controller is currently not initialized in any specific USB mode. */
- USB_MODE_Device = 1, /**< Indicates that the controller is currently initialized in USB Device mode. */
- USB_MODE_Host = 2, /**< Indicates that the controller is currently initialized in USB Host mode. */
- USB_MODE_UID = 3, /**< Indicates that the controller should determine the USB mode from the UID pin of the
- * USB connector.
- */
- };
-
- /* Private Interface - For use in library only: */
- #if !defined(__DOXYGEN__)
- /* Macros: */
- #if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32)
- #define USB_CLOCK_REQUIRED_FREQ 12000000UL
- #else
- #define USB_CLOCK_REQUIRED_FREQ 48000000UL
- #endif
-
- /* Function Prototypes: */
- #if defined(__INCLUDE_FROM_USB_CONTROLLER_C)
- #if defined(USB_CAN_BE_DEVICE)
- static void USB_Init_Device(void);
- #endif
-
- #if defined(USB_CAN_BE_HOST)
- static void USB_Init_Host(void);
- #endif
- #endif
-
- /* Inline Functions: */
- static inline void USB_OTGPAD_On(void) ATTR_ALWAYS_INLINE;
- static inline void USB_OTGPAD_On(void)
- {
- AVR32_USBB.USBCON.otgpade = true;
- }
-
- static inline void USB_OTGPAD_Off(void) ATTR_ALWAYS_INLINE;
- static inline void USB_OTGPAD_Off(void)
- {
- AVR32_USBB.USBCON.otgpade = false;
- }
-
- static inline void USB_CLK_Freeze(void) ATTR_ALWAYS_INLINE;
- static inline void USB_CLK_Freeze(void)
- {
- AVR32_USBB.USBCON.frzclk = true;
- }
-
- static inline void USB_CLK_Unfreeze(void) ATTR_ALWAYS_INLINE;
- static inline void USB_CLK_Unfreeze(void)
- {
- AVR32_USBB.USBCON.frzclk = false;
- }
-
- static inline void USB_Controller_Enable(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Controller_Enable(void)
- {
- AVR32_USBB.USBCON.usbe = true;
- }
-
- static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Controller_Disable(void)
- {
- AVR32_USBB.USBCON.usbe = false;
- }
-
- static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Controller_Reset(void)
- {
- AVR32_USBB.USBCON.usbe = false;
- AVR32_USBB.USBCON.usbe = true;
- }
-
- #if defined(USB_CAN_BE_BOTH)
- static inline uint8_t USB_GetUSBModeFromUID(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint8_t USB_GetUSBModeFromUID(void)
- {
- if (AVR32_USBB.USBSTA.id)
- return USB_MODE_Device;
- else
- return USB_MODE_Host;
- }
- #endif
-
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 AVR32 UC3 microcontrollers.
+ * \copydetails Group_USBManagement_UC3
+ *
+ * \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_UC3 USB Interface Management (UC3)
+ * \brief USB Controller definitions for the AVR32 UC3 microcontrollers.
+ *
+ * Functions, macros, variables, enums and types related to the setup and management of the USB interface.
+ *
+ * @{
+ */
+
+#ifndef __USBCONTROLLER_UC3_H__
+#define __USBCONTROLLER_UC3_H__
+
+ /* Includes: */
+ #include "../../../../Common/Common.h"
+ #include "../USBMode.h"
+ #include "../Events.h"
+ #include "../USBTask.h"
+ #include "../USBInterrupt.h"
+
+ #if defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)
+ #include "../Host.h"
+ #include "../OTG.h"
+ #include "../Pipe.h"
+ #include "../HostStandardReq.h"
+ #include "../PipeStream.h"
+ #endif
+
+ #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 clock input to the USB module.
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** \name USB Controller Option Masks */
+ //@{
+ /** Selects one of the system's main clock oscillators as the input clock to the USB Generic Clock source
+ * generation module. This indicates that an external oscillator should be used directly instead of an
+ * internal PLL clock source.
+ */
+ #define USB_OPT_GCLK_SRC_OSC (1 << 2)
+
+ /** Selects one of the system's PLL oscillators as the input clock to the USB Generic Clock source
+ * generation module. This indicates that one of the device's PLL outputs should be used instead of an
+ * external oscillator source.
+ */
+ #define USB_OPT_GCLK_SRC_PLL (0 << 2)
+
+ /** Selects PLL or External Oscillator 0 as the USB Generic Clock source module input clock. */
+ #define USB_OPT_GCLK_CHANNEL_0 (1 << 3)
+
+ /** Selects PLL or External Oscillator 1 as the USB Generic Clock source module input clock. */
+ #define USB_OPT_GCLK_CHANNEL_1 (0 << 3)
+ //@}
+
+ /** \name Endpoint/Pipe Type Masks */
+ //@{
+ /** Mask for a CONTROL type endpoint or pipe.
+ *
+ * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+ */
+ #define EP_TYPE_CONTROL 0x00
+
+ /** Mask for an ISOCHRONOUS type endpoint or pipe.
+ *
+ * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+ */
+ #define EP_TYPE_ISOCHRONOUS 0x01
+
+ /** Mask for a BULK type endpoint or pipe.
+ *
+ * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+ */
+ #define EP_TYPE_BULK 0x02
+
+ /** Mask for an INTERRUPT type endpoint or pipe.
+ *
+ * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+ */
+ #define EP_TYPE_INTERRUPT 0x03
+ //@}
+
+ #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: */
+ /** Determines if the VBUS line is currently high (i.e. the USB host is supplying power).
+ *
+ * \return Boolean \c true if the VBUS line is currently detecting power from a host, \c false otherwise.
+ */
+ static inline bool USB_VBUS_GetStatus(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool USB_VBUS_GetStatus(void)
+ {
+ return AVR32_USBB.USBSTA.vbus;
+ }
+
+ /** Detaches the device from the USB bus. This has the effect of removing the device from any
+ * attached host, ceasing USB communications. If no host is present, this prevents any host from
+ * enumerating the device once attached until \ref USB_Attach() is called.
+ */
+ static inline void USB_Detach(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Detach(void)
+ {
+ AVR32_USBB.UDCON.detach = true;
+ }
+
+ /** 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)
+ {
+ AVR32_USBB.UDCON.detach = false;
+ }
+
+ /* 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 This is a mask indicating what mode the USB interface is to be initialized to, a value
+ * from the \ref USB_Modes_t enum.
+ *
+ * \param[in] Options Mask indicating the options which should be used when initializing the USB
+ * interface to control the USB interface's behaviour. 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 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.
+ *
+ * \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_HOST_ONLY) && !defined(USB_DEVICE_ONLY)) || defined(__DOXYGEN__)
+ /** Indicates the mode that the USB interface is currently initialized to, a value from the
+ * \ref USB_Modes_t enum.
+ *
+ * \note This variable should be treated as read-only in the user application, and never manually
+ * changed in value.
+ * \n\n
+ *
+ * \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_HOST_ONLY)
+ #define USB_CurrentMode USB_MODE_Host
+ #elif defined(USB_DEVICE_ONLY)
+ #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.
+ *
+ * \note 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
+
+ /* Enums: */
+ /** Enum for the possible USB controller modes, for initialization via \ref USB_Init() and indication back to the
+ * user application via \ref USB_CurrentMode.
+ */
+ enum USB_Modes_t
+ {
+ USB_MODE_None = 0, /**< Indicates that the controller is currently not initialized in any specific USB mode. */
+ USB_MODE_Device = 1, /**< Indicates that the controller is currently initialized in USB Device mode. */
+ USB_MODE_Host = 2, /**< Indicates that the controller is currently initialized in USB Host mode. */
+ USB_MODE_UID = 3, /**< Indicates that the controller should determine the USB mode from the UID pin of the
+ * USB connector.
+ */
+ };
+
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Macros: */
+ #if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32)
+ #define USB_CLOCK_REQUIRED_FREQ 12000000UL
+ #else
+ #define USB_CLOCK_REQUIRED_FREQ 48000000UL
+ #endif
+
+ /* Function Prototypes: */
+ #if defined(__INCLUDE_FROM_USB_CONTROLLER_C)
+ #if defined(USB_CAN_BE_DEVICE)
+ static void USB_Init_Device(void);
+ #endif
+
+ #if defined(USB_CAN_BE_HOST)
+ static void USB_Init_Host(void);
+ #endif
+ #endif
+
+ /* Inline Functions: */
+ static inline void USB_OTGPAD_On(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_OTGPAD_On(void)
+ {
+ AVR32_USBB.USBCON.otgpade = true;
+ }
+
+ static inline void USB_OTGPAD_Off(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_OTGPAD_Off(void)
+ {
+ AVR32_USBB.USBCON.otgpade = false;
+ }
+
+ static inline void USB_CLK_Freeze(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_CLK_Freeze(void)
+ {
+ AVR32_USBB.USBCON.frzclk = true;
+ }
+
+ static inline void USB_CLK_Unfreeze(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_CLK_Unfreeze(void)
+ {
+ AVR32_USBB.USBCON.frzclk = false;
+ }
+
+ static inline void USB_Controller_Enable(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Controller_Enable(void)
+ {
+ AVR32_USBB.USBCON.usbe = true;
+ }
+
+ static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Controller_Disable(void)
+ {
+ AVR32_USBB.USBCON.usbe = false;
+ }
+
+ static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Controller_Reset(void)
+ {
+ AVR32_USBB.USBCON.usbe = false;
+ AVR32_USBB.USBCON.usbe = true;
+ }
+
+ #if defined(USB_CAN_BE_BOTH)
+ static inline uint8_t USB_GetUSBModeFromUID(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint8_t USB_GetUSBModeFromUID(void)
+ {
+ if (AVR32_USBB.USBSTA.id)
+ return USB_MODE_Device;
+ else
+ return USB_MODE_Host;
+ }
+ #endif
+
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c b/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c
index 93d23c3da..d92011ff6 100644
--- a/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c
+++ b/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c
@@ -1,202 +1,202 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 "../USBInterrupt.h"
-
-void USB_INT_DisableAllInterrupts(void)
-{
- AVR32_USBB.USBCON.vbuste = false;
- AVR32_USBB.USBCON.idte = false;
-
- AVR32_USBB.uhinteclr = -1;
- AVR32_USBB.udinteclr = -1;
-}
-
-void USB_INT_ClearAllInterrupts(void)
-{
- AVR32_USBB.USBSTACLR.vbustic = true;
- AVR32_USBB.USBSTACLR.idtic = true;
-
- AVR32_USBB.uhintclr = -1;
- AVR32_USBB.udintclr = -1;
-}
-
-ISR(USB_GEN_vect)
-{
- #if defined(USB_CAN_BE_DEVICE)
- #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_VBUSTI) && USB_INT_IsEnabled(USB_INT_VBUSTI))
- {
- USB_INT_Clear(USB_INT_VBUSTI);
-
- if (USB_VBUS_GetStatus())
- {
- USB_DeviceState = DEVICE_STATE_Powered;
- EVENT_USB_Device_Connect();
- }
- else
- {
- USB_DeviceState = DEVICE_STATE_Unattached;
- EVENT_USB_Device_Disconnect();
- }
- }
-
- if (USB_INT_HasOccurred(USB_INT_SUSPI) && USB_INT_IsEnabled(USB_INT_SUSPI))
- {
- USB_INT_Disable(USB_INT_SUSPI);
- USB_INT_Enable(USB_INT_WAKEUPI);
-
- USB_CLK_Freeze();
-
- USB_DeviceState = DEVICE_STATE_Suspended;
- EVENT_USB_Device_Suspend();
- }
-
- if (USB_INT_HasOccurred(USB_INT_WAKEUPI) && USB_INT_IsEnabled(USB_INT_WAKEUPI))
- {
- USB_CLK_Unfreeze();
-
- USB_INT_Clear(USB_INT_WAKEUPI);
-
- USB_INT_Disable(USB_INT_WAKEUPI);
- USB_INT_Enable(USB_INT_SUSPI);
-
- if (USB_Device_ConfigurationNumber)
- USB_DeviceState = DEVICE_STATE_Configured;
- else
- USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered;
-
- EVENT_USB_Device_WakeUp();
- }
-
- if (USB_INT_HasOccurred(USB_INT_EORSTI) && USB_INT_IsEnabled(USB_INT_EORSTI))
- {
- USB_INT_Clear(USB_INT_EORSTI);
-
- USB_DeviceState = DEVICE_STATE_Default;
- USB_Device_ConfigurationNumber = 0;
-
- USB_INT_Clear(USB_INT_SUSPI);
- USB_INT_Disable(USB_INT_SUSPI);
- USB_INT_Enable(USB_INT_WAKEUPI);
-
- USB_Device_SetDeviceAddress(0);
- Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
- ENDPOINT_DIR_OUT, USB_Device_ControlEndpointSize,
- ENDPOINT_BANK_SINGLE);
-
- EVENT_USB_Device_Reset();
- }
- #endif
-
- #if defined(USB_CAN_BE_HOST)
- #if !defined(NO_SOF_EVENTS)
- if (USB_INT_HasOccurred(USB_INT_HSOFI) && USB_INT_IsEnabled(USB_INT_HSOFI))
- {
- USB_INT_Clear(USB_INT_HSOFI);
-
- EVENT_USB_Host_StartOfFrame();
- }
- #endif
-
- if (USB_INT_HasOccurred(USB_INT_DDISCI) && USB_INT_IsEnabled(USB_INT_DDISCI))
- {
- USB_INT_Clear(USB_INT_DDISCI);
- USB_INT_Clear(USB_INT_DCONNI);
- USB_INT_Disable(USB_INT_DDISCI);
-
- EVENT_USB_Host_DeviceUnattached();
-
- USB_ResetInterface();
- }
-
- if (USB_INT_HasOccurred(USB_INT_VBERRI) && USB_INT_IsEnabled(USB_INT_VBERRI))
- {
- USB_INT_Clear(USB_INT_VBERRI);
-
- USB_Host_VBUS_Manual_Off();
- USB_Host_VBUS_Auto_Off();
-
- EVENT_USB_Host_HostError(HOST_ERROR_VBusVoltageDip);
- EVENT_USB_Host_DeviceUnattached();
-
- USB_HostState = HOST_STATE_Unattached;
- }
-
- if (USB_INT_HasOccurred(USB_INT_DCONNI) && USB_INT_IsEnabled(USB_INT_DCONNI))
- {
- USB_INT_Clear(USB_INT_DCONNI);
- USB_INT_Disable(USB_INT_DCONNI);
-
- EVENT_USB_Host_DeviceAttached();
-
- USB_INT_Enable(USB_INT_DDISCI);
-
- USB_HostState = HOST_STATE_Powered;
- }
-
- if (USB_INT_HasOccurred(USB_INT_BCERRI) && USB_INT_IsEnabled(USB_INT_BCERRI))
- {
- USB_INT_Clear(USB_INT_BCERRI);
-
- EVENT_USB_Host_DeviceEnumerationFailed(HOST_ENUMERROR_NoDeviceDetected, 0);
- EVENT_USB_Host_DeviceUnattached();
-
- USB_ResetInterface();
- }
- #endif
-
- #if defined(USB_CAN_BE_BOTH)
- if (USB_INT_HasOccurred(USB_INT_IDTI) && USB_INT_IsEnabled(USB_INT_IDTI))
- {
- USB_INT_Clear(USB_INT_IDTI);
-
- if (USB_DeviceState != DEVICE_STATE_Unattached)
- EVENT_USB_Device_Disconnect();
-
- if (USB_HostState != HOST_STATE_Unattached)
- EVENT_USB_Host_DeviceUnattached();
-
- USB_CurrentMode = USB_GetUSBModeFromUID();
- USB_ResetInterface();
-
- EVENT_USB_UIDChange();
- }
- #endif
-}
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 "../USBInterrupt.h"
+
+void USB_INT_DisableAllInterrupts(void)
+{
+ AVR32_USBB.USBCON.vbuste = false;
+ AVR32_USBB.USBCON.idte = false;
+
+ AVR32_USBB.uhinteclr = -1;
+ AVR32_USBB.udinteclr = -1;
+}
+
+void USB_INT_ClearAllInterrupts(void)
+{
+ AVR32_USBB.USBSTACLR.vbustic = true;
+ AVR32_USBB.USBSTACLR.idtic = true;
+
+ AVR32_USBB.uhintclr = -1;
+ AVR32_USBB.udintclr = -1;
+}
+
+ISR(USB_GEN_vect)
+{
+ #if defined(USB_CAN_BE_DEVICE)
+ #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_VBUSTI) && USB_INT_IsEnabled(USB_INT_VBUSTI))
+ {
+ USB_INT_Clear(USB_INT_VBUSTI);
+
+ if (USB_VBUS_GetStatus())
+ {
+ USB_DeviceState = DEVICE_STATE_Powered;
+ EVENT_USB_Device_Connect();
+ }
+ else
+ {
+ USB_DeviceState = DEVICE_STATE_Unattached;
+ EVENT_USB_Device_Disconnect();
+ }
+ }
+
+ if (USB_INT_HasOccurred(USB_INT_SUSPI) && USB_INT_IsEnabled(USB_INT_SUSPI))
+ {
+ USB_INT_Disable(USB_INT_SUSPI);
+ USB_INT_Enable(USB_INT_WAKEUPI);
+
+ USB_CLK_Freeze();
+
+ USB_DeviceState = DEVICE_STATE_Suspended;
+ EVENT_USB_Device_Suspend();
+ }
+
+ if (USB_INT_HasOccurred(USB_INT_WAKEUPI) && USB_INT_IsEnabled(USB_INT_WAKEUPI))
+ {
+ USB_CLK_Unfreeze();
+
+ USB_INT_Clear(USB_INT_WAKEUPI);
+
+ USB_INT_Disable(USB_INT_WAKEUPI);
+ USB_INT_Enable(USB_INT_SUSPI);
+
+ if (USB_Device_ConfigurationNumber)
+ USB_DeviceState = DEVICE_STATE_Configured;
+ else
+ USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered;
+
+ EVENT_USB_Device_WakeUp();
+ }
+
+ if (USB_INT_HasOccurred(USB_INT_EORSTI) && USB_INT_IsEnabled(USB_INT_EORSTI))
+ {
+ USB_INT_Clear(USB_INT_EORSTI);
+
+ USB_DeviceState = DEVICE_STATE_Default;
+ USB_Device_ConfigurationNumber = 0;
+
+ USB_INT_Clear(USB_INT_SUSPI);
+ USB_INT_Disable(USB_INT_SUSPI);
+ USB_INT_Enable(USB_INT_WAKEUPI);
+
+ USB_Device_SetDeviceAddress(0);
+ Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
+ ENDPOINT_DIR_OUT, USB_Device_ControlEndpointSize,
+ ENDPOINT_BANK_SINGLE);
+
+ EVENT_USB_Device_Reset();
+ }
+ #endif
+
+ #if defined(USB_CAN_BE_HOST)
+ #if !defined(NO_SOF_EVENTS)
+ if (USB_INT_HasOccurred(USB_INT_HSOFI) && USB_INT_IsEnabled(USB_INT_HSOFI))
+ {
+ USB_INT_Clear(USB_INT_HSOFI);
+
+ EVENT_USB_Host_StartOfFrame();
+ }
+ #endif
+
+ if (USB_INT_HasOccurred(USB_INT_DDISCI) && USB_INT_IsEnabled(USB_INT_DDISCI))
+ {
+ USB_INT_Clear(USB_INT_DDISCI);
+ USB_INT_Clear(USB_INT_DCONNI);
+ USB_INT_Disable(USB_INT_DDISCI);
+
+ EVENT_USB_Host_DeviceUnattached();
+
+ USB_ResetInterface();
+ }
+
+ if (USB_INT_HasOccurred(USB_INT_VBERRI) && USB_INT_IsEnabled(USB_INT_VBERRI))
+ {
+ USB_INT_Clear(USB_INT_VBERRI);
+
+ USB_Host_VBUS_Manual_Off();
+ USB_Host_VBUS_Auto_Off();
+
+ EVENT_USB_Host_HostError(HOST_ERROR_VBusVoltageDip);
+ EVENT_USB_Host_DeviceUnattached();
+
+ USB_HostState = HOST_STATE_Unattached;
+ }
+
+ if (USB_INT_HasOccurred(USB_INT_DCONNI) && USB_INT_IsEnabled(USB_INT_DCONNI))
+ {
+ USB_INT_Clear(USB_INT_DCONNI);
+ USB_INT_Disable(USB_INT_DCONNI);
+
+ EVENT_USB_Host_DeviceAttached();
+
+ USB_INT_Enable(USB_INT_DDISCI);
+
+ USB_HostState = HOST_STATE_Powered;
+ }
+
+ if (USB_INT_HasOccurred(USB_INT_BCERRI) && USB_INT_IsEnabled(USB_INT_BCERRI))
+ {
+ USB_INT_Clear(USB_INT_BCERRI);
+
+ EVENT_USB_Host_DeviceEnumerationFailed(HOST_ENUMERROR_NoDeviceDetected, 0);
+ EVENT_USB_Host_DeviceUnattached();
+
+ USB_ResetInterface();
+ }
+ #endif
+
+ #if defined(USB_CAN_BE_BOTH)
+ if (USB_INT_HasOccurred(USB_INT_IDTI) && USB_INT_IsEnabled(USB_INT_IDTI))
+ {
+ USB_INT_Clear(USB_INT_IDTI);
+
+ if (USB_DeviceState != DEVICE_STATE_Unattached)
+ EVENT_USB_Device_Disconnect();
+
+ if (USB_HostState != HOST_STATE_Unattached)
+ EVENT_USB_Host_DeviceUnattached();
+
+ USB_CurrentMode = USB_GetUSBModeFromUID();
+ USB_ResetInterface();
+
+ EVENT_USB_UIDChange();
+ }
+ #endif
+}
diff --git a/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h b/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h
index 2cebf4106..268eaa827 100644
--- a/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h
+++ b/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h
@@ -1,353 +1,353 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 AVR32 UC3 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_UC3_H__
-#define __USBINTERRUPT_UC3_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_VBUSTI = 0,
- #if (defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__))
- USB_INT_IDTI = 1,
- #endif
- #if (defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__))
- USB_INT_WAKEUPI = 2,
- USB_INT_SUSPI = 3,
- USB_INT_EORSTI = 4,
- USB_INT_SOFI = 5,
- #endif
- #if (defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__))
- USB_INT_HSOFI = 6,
- USB_INT_DCONNI = 7,
- USB_INT_DDISCI = 8,
- USB_INT_RSTI = 9,
- USB_INT_BCERRI = 10,
- USB_INT_VBERRI = 11,
- #endif
- };
-
- /* 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_VBUSTI:
- AVR32_USBB.USBCON.vbuste = true;
- break;
- #if defined(USB_CAN_BE_BOTH)
- case USB_INT_IDTI:
- AVR32_USBB.USBCON.idte = true;
- break;
- #endif
- #if defined(USB_CAN_BE_DEVICE)
- case USB_INT_WAKEUPI:
- AVR32_USBB.UDINTESET.wakeupes = true;
- break;
- case USB_INT_SUSPI:
- AVR32_USBB.UDINTESET.suspes = true;
- break;
- case USB_INT_EORSTI:
- AVR32_USBB.UDINTESET.eorstes = true;
- break;
- case USB_INT_SOFI:
- AVR32_USBB.UDINTESET.sofes = true;
- break;
- #endif
- #if defined(USB_CAN_BE_HOST)
- case USB_INT_HSOFI:
- AVR32_USBB.UHINTESET.hsofies = true;
- break;
- case USB_INT_DCONNI:
- AVR32_USBB.UHINTESET.dconnies = true;
- break;
- case USB_INT_DDISCI:
- AVR32_USBB.UHINTESET.ddiscies = true;
- break;
- case USB_INT_RSTI:
- AVR32_USBB.UHINTESET.rsties = true;
- break;
- case USB_INT_BCERRI:
- AVR32_USBB.USBCON.bcerre = true;
- break;
- case USB_INT_VBERRI:
- AVR32_USBB.USBCON.vberre = true;
- break;
- #endif
- }
- }
-
- 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_VBUSTI:
- AVR32_USBB.USBCON.vbuste = false;
- break;
- #if defined(USB_CAN_BE_BOTH)
- case USB_INT_IDTI:
- AVR32_USBB.USBCON.idte = false;
- break;
- #endif
- #if defined(USB_CAN_BE_DEVICE)
- case USB_INT_WAKEUPI:
- AVR32_USBB.UDINTECLR.wakeupec = true;
- break;
- case USB_INT_SUSPI:
- AVR32_USBB.UDINTECLR.suspec = true;
- break;
- case USB_INT_EORSTI:
- AVR32_USBB.UDINTECLR.eorstec = true;
- break;
- case USB_INT_SOFI:
- AVR32_USBB.UDINTECLR.sofec = true;
- break;
- #endif
- #if defined(USB_CAN_BE_HOST)
- case USB_INT_HSOFI:
- AVR32_USBB.UHINTECLR.hsofiec = true;
- break;
- case USB_INT_DCONNI:
- AVR32_USBB.UHINTECLR.dconniec = true;
- break;
- case USB_INT_DDISCI:
- AVR32_USBB.UHINTECLR.ddisciec = true;
- break;
- case USB_INT_RSTI:
- AVR32_USBB.UHINTECLR.rstiec = true;
- break;
- case USB_INT_BCERRI:
- AVR32_USBB.USBCON.bcerre = false;
- break;
- case USB_INT_VBERRI:
- AVR32_USBB.USBCON.vberre = false;
- break;
- #endif
- }
- }
-
- 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_VBUSTI:
- AVR32_USBB.USBSTACLR.vbustic = true;
- (void)AVR32_USBB.USBSTACLR;
- break;
- #if defined(USB_CAN_BE_BOTH)
- case USB_INT_IDTI:
- AVR32_USBB.USBSTACLR.idtic = true;
- (void)AVR32_USBB.USBSTACLR;
- break;
- #endif
- #if defined(USB_CAN_BE_DEVICE)
- case USB_INT_WAKEUPI:
- AVR32_USBB.UDINTCLR.wakeupc = true;
- (void)AVR32_USBB.UDINTCLR;
- break;
- case USB_INT_SUSPI:
- AVR32_USBB.UDINTCLR.suspc = true;
- (void)AVR32_USBB.UDINTCLR;
- break;
- case USB_INT_EORSTI:
- AVR32_USBB.UDINTCLR.eorstc = true;
- (void)AVR32_USBB.UDINTCLR;
- break;
- case USB_INT_SOFI:
- AVR32_USBB.UDINTCLR.sofc = true;
- (void)AVR32_USBB.UDINTCLR;
- break;
- #endif
- #if defined(USB_CAN_BE_HOST)
- case USB_INT_HSOFI:
- AVR32_USBB.UHINTCLR.hsofic = true;
- (void)AVR32_USBB.UHINTCLR;
- break;
- case USB_INT_DCONNI:
- AVR32_USBB.UHINTCLR.dconnic = true;
- (void)AVR32_USBB.UHINTCLR;
- break;
- case USB_INT_DDISCI:
- AVR32_USBB.UHINTCLR.ddiscic = true;
- (void)AVR32_USBB.UHINTCLR;
- break;
- case USB_INT_RSTI:
- AVR32_USBB.UHINTCLR.rstic = true;
- (void)AVR32_USBB.UHINTCLR;
- break;
- case USB_INT_BCERRI:
- AVR32_USBB.USBSTACLR.bcerric = true;
- (void)AVR32_USBB.USBSTACLR;
- break;
- case USB_INT_VBERRI:
- AVR32_USBB.USBSTACLR.vberric = true;
- (void)AVR32_USBB.USBSTACLR;
- break;
- #endif
- }
- }
-
- 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_VBUSTI:
- return AVR32_USBB.USBCON.vbuste;
- #if defined(USB_CAN_BE_BOTH)
- case USB_INT_IDTI:
- return AVR32_USBB.USBCON.idte;
- #endif
- #if defined(USB_CAN_BE_DEVICE)
- case USB_INT_WAKEUPI:
- return AVR32_USBB.UDINTE.wakeupe;
- case USB_INT_SUSPI:
- return AVR32_USBB.UDINTE.suspe;
- case USB_INT_EORSTI:
- return AVR32_USBB.UDINTE.eorste;
- case USB_INT_SOFI:
- return AVR32_USBB.UDINTE.sofe;
- #endif
- #if defined(USB_CAN_BE_HOST)
- case USB_INT_HSOFI:
- return AVR32_USBB.UHINTE.hsofie;
- case USB_INT_DCONNI:
- return AVR32_USBB.UHINTE.dconnie;
- case USB_INT_DDISCI:
- return AVR32_USBB.UHINTE.ddiscie;
- case USB_INT_RSTI:
- return AVR32_USBB.UHINTE.rstie;
- case USB_INT_BCERRI:
- return AVR32_USBB.USBCON.bcerre;
- case USB_INT_VBERRI:
- return AVR32_USBB.USBCON.vberre;
- #endif
- }
-
- 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_VBUSTI:
- return AVR32_USBB.USBSTA.vbusti;
- #if defined(USB_CAN_BE_BOTH)
- case USB_INT_IDTI:
- return AVR32_USBB.USBSTA.idti;
- #endif
- #if defined(USB_CAN_BE_DEVICE)
- case USB_INT_WAKEUPI:
- return AVR32_USBB.UDINT.wakeup;
- case USB_INT_SUSPI:
- return AVR32_USBB.UDINT.susp;
- case USB_INT_EORSTI:
- return AVR32_USBB.UDINT.eorst;
- case USB_INT_SOFI:
- return AVR32_USBB.UDINT.sof;
- #endif
- #if defined(USB_CAN_BE_HOST)
- case USB_INT_HSOFI:
- return AVR32_USBB.UHINT.hsofi;
- case USB_INT_DCONNI:
- return AVR32_USBB.UHINT.dconni;
- case USB_INT_DDISCI:
- return AVR32_USBB.UHINT.ddisci;
- case USB_INT_RSTI:
- return AVR32_USBB.UHINT.rsti;
- case USB_INT_BCERRI:
- return AVR32_USBB.USBSTA.bcerri;
- case USB_INT_VBERRI:
- return AVR32_USBB.USBSTA.vberri;
- #endif
- }
-
- 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
-
- /* Public Interface - May be used in end-application: */
- /* ISR Prototypes: */
- #if defined(__DOXYGEN__)
- /** Interrupt service routine handler for the USB controller ISR group. This interrupt routine <b>must</b> be
- * linked to the entire USB controller ISR vector group inside the AVR32's interrupt controller peripheral,
- * using the user application's preferred USB controller driver.
- */
- void USB_GEN_vect(void);
- #else
- ISR(USB_GEN_vect);
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 AVR32 UC3 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_UC3_H__
+#define __USBINTERRUPT_UC3_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_VBUSTI = 0,
+ #if (defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__))
+ USB_INT_IDTI = 1,
+ #endif
+ #if (defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__))
+ USB_INT_WAKEUPI = 2,
+ USB_INT_SUSPI = 3,
+ USB_INT_EORSTI = 4,
+ USB_INT_SOFI = 5,
+ #endif
+ #if (defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__))
+ USB_INT_HSOFI = 6,
+ USB_INT_DCONNI = 7,
+ USB_INT_DDISCI = 8,
+ USB_INT_RSTI = 9,
+ USB_INT_BCERRI = 10,
+ USB_INT_VBERRI = 11,
+ #endif
+ };
+
+ /* 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_VBUSTI:
+ AVR32_USBB.USBCON.vbuste = true;
+ break;
+ #if defined(USB_CAN_BE_BOTH)
+ case USB_INT_IDTI:
+ AVR32_USBB.USBCON.idte = true;
+ break;
+ #endif
+ #if defined(USB_CAN_BE_DEVICE)
+ case USB_INT_WAKEUPI:
+ AVR32_USBB.UDINTESET.wakeupes = true;
+ break;
+ case USB_INT_SUSPI:
+ AVR32_USBB.UDINTESET.suspes = true;
+ break;
+ case USB_INT_EORSTI:
+ AVR32_USBB.UDINTESET.eorstes = true;
+ break;
+ case USB_INT_SOFI:
+ AVR32_USBB.UDINTESET.sofes = true;
+ break;
+ #endif
+ #if defined(USB_CAN_BE_HOST)
+ case USB_INT_HSOFI:
+ AVR32_USBB.UHINTESET.hsofies = true;
+ break;
+ case USB_INT_DCONNI:
+ AVR32_USBB.UHINTESET.dconnies = true;
+ break;
+ case USB_INT_DDISCI:
+ AVR32_USBB.UHINTESET.ddiscies = true;
+ break;
+ case USB_INT_RSTI:
+ AVR32_USBB.UHINTESET.rsties = true;
+ break;
+ case USB_INT_BCERRI:
+ AVR32_USBB.USBCON.bcerre = true;
+ break;
+ case USB_INT_VBERRI:
+ AVR32_USBB.USBCON.vberre = true;
+ break;
+ #endif
+ }
+ }
+
+ 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_VBUSTI:
+ AVR32_USBB.USBCON.vbuste = false;
+ break;
+ #if defined(USB_CAN_BE_BOTH)
+ case USB_INT_IDTI:
+ AVR32_USBB.USBCON.idte = false;
+ break;
+ #endif
+ #if defined(USB_CAN_BE_DEVICE)
+ case USB_INT_WAKEUPI:
+ AVR32_USBB.UDINTECLR.wakeupec = true;
+ break;
+ case USB_INT_SUSPI:
+ AVR32_USBB.UDINTECLR.suspec = true;
+ break;
+ case USB_INT_EORSTI:
+ AVR32_USBB.UDINTECLR.eorstec = true;
+ break;
+ case USB_INT_SOFI:
+ AVR32_USBB.UDINTECLR.sofec = true;
+ break;
+ #endif
+ #if defined(USB_CAN_BE_HOST)
+ case USB_INT_HSOFI:
+ AVR32_USBB.UHINTECLR.hsofiec = true;
+ break;
+ case USB_INT_DCONNI:
+ AVR32_USBB.UHINTECLR.dconniec = true;
+ break;
+ case USB_INT_DDISCI:
+ AVR32_USBB.UHINTECLR.ddisciec = true;
+ break;
+ case USB_INT_RSTI:
+ AVR32_USBB.UHINTECLR.rstiec = true;
+ break;
+ case USB_INT_BCERRI:
+ AVR32_USBB.USBCON.bcerre = false;
+ break;
+ case USB_INT_VBERRI:
+ AVR32_USBB.USBCON.vberre = false;
+ break;
+ #endif
+ }
+ }
+
+ 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_VBUSTI:
+ AVR32_USBB.USBSTACLR.vbustic = true;
+ (void)AVR32_USBB.USBSTACLR;
+ break;
+ #if defined(USB_CAN_BE_BOTH)
+ case USB_INT_IDTI:
+ AVR32_USBB.USBSTACLR.idtic = true;
+ (void)AVR32_USBB.USBSTACLR;
+ break;
+ #endif
+ #if defined(USB_CAN_BE_DEVICE)
+ case USB_INT_WAKEUPI:
+ AVR32_USBB.UDINTCLR.wakeupc = true;
+ (void)AVR32_USBB.UDINTCLR;
+ break;
+ case USB_INT_SUSPI:
+ AVR32_USBB.UDINTCLR.suspc = true;
+ (void)AVR32_USBB.UDINTCLR;
+ break;
+ case USB_INT_EORSTI:
+ AVR32_USBB.UDINTCLR.eorstc = true;
+ (void)AVR32_USBB.UDINTCLR;
+ break;
+ case USB_INT_SOFI:
+ AVR32_USBB.UDINTCLR.sofc = true;
+ (void)AVR32_USBB.UDINTCLR;
+ break;
+ #endif
+ #if defined(USB_CAN_BE_HOST)
+ case USB_INT_HSOFI:
+ AVR32_USBB.UHINTCLR.hsofic = true;
+ (void)AVR32_USBB.UHINTCLR;
+ break;
+ case USB_INT_DCONNI:
+ AVR32_USBB.UHINTCLR.dconnic = true;
+ (void)AVR32_USBB.UHINTCLR;
+ break;
+ case USB_INT_DDISCI:
+ AVR32_USBB.UHINTCLR.ddiscic = true;
+ (void)AVR32_USBB.UHINTCLR;
+ break;
+ case USB_INT_RSTI:
+ AVR32_USBB.UHINTCLR.rstic = true;
+ (void)AVR32_USBB.UHINTCLR;
+ break;
+ case USB_INT_BCERRI:
+ AVR32_USBB.USBSTACLR.bcerric = true;
+ (void)AVR32_USBB.USBSTACLR;
+ break;
+ case USB_INT_VBERRI:
+ AVR32_USBB.USBSTACLR.vberric = true;
+ (void)AVR32_USBB.USBSTACLR;
+ break;
+ #endif
+ }
+ }
+
+ 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_VBUSTI:
+ return AVR32_USBB.USBCON.vbuste;
+ #if defined(USB_CAN_BE_BOTH)
+ case USB_INT_IDTI:
+ return AVR32_USBB.USBCON.idte;
+ #endif
+ #if defined(USB_CAN_BE_DEVICE)
+ case USB_INT_WAKEUPI:
+ return AVR32_USBB.UDINTE.wakeupe;
+ case USB_INT_SUSPI:
+ return AVR32_USBB.UDINTE.suspe;
+ case USB_INT_EORSTI:
+ return AVR32_USBB.UDINTE.eorste;
+ case USB_INT_SOFI:
+ return AVR32_USBB.UDINTE.sofe;
+ #endif
+ #if defined(USB_CAN_BE_HOST)
+ case USB_INT_HSOFI:
+ return AVR32_USBB.UHINTE.hsofie;
+ case USB_INT_DCONNI:
+ return AVR32_USBB.UHINTE.dconnie;
+ case USB_INT_DDISCI:
+ return AVR32_USBB.UHINTE.ddiscie;
+ case USB_INT_RSTI:
+ return AVR32_USBB.UHINTE.rstie;
+ case USB_INT_BCERRI:
+ return AVR32_USBB.USBCON.bcerre;
+ case USB_INT_VBERRI:
+ return AVR32_USBB.USBCON.vberre;
+ #endif
+ }
+
+ 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_VBUSTI:
+ return AVR32_USBB.USBSTA.vbusti;
+ #if defined(USB_CAN_BE_BOTH)
+ case USB_INT_IDTI:
+ return AVR32_USBB.USBSTA.idti;
+ #endif
+ #if defined(USB_CAN_BE_DEVICE)
+ case USB_INT_WAKEUPI:
+ return AVR32_USBB.UDINT.wakeup;
+ case USB_INT_SUSPI:
+ return AVR32_USBB.UDINT.susp;
+ case USB_INT_EORSTI:
+ return AVR32_USBB.UDINT.eorst;
+ case USB_INT_SOFI:
+ return AVR32_USBB.UDINT.sof;
+ #endif
+ #if defined(USB_CAN_BE_HOST)
+ case USB_INT_HSOFI:
+ return AVR32_USBB.UHINT.hsofi;
+ case USB_INT_DCONNI:
+ return AVR32_USBB.UHINT.dconni;
+ case USB_INT_DDISCI:
+ return AVR32_USBB.UHINT.ddisci;
+ case USB_INT_RSTI:
+ return AVR32_USBB.UHINT.rsti;
+ case USB_INT_BCERRI:
+ return AVR32_USBB.USBSTA.bcerri;
+ case USB_INT_VBERRI:
+ return AVR32_USBB.USBSTA.vberri;
+ #endif
+ }
+
+ 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
+
+ /* Public Interface - May be used in end-application: */
+ /* ISR Prototypes: */
+ #if defined(__DOXYGEN__)
+ /** Interrupt service routine handler for the USB controller ISR group. This interrupt routine <b>must</b> be
+ * linked to the entire USB controller ISR vector group inside the AVR32's interrupt controller peripheral,
+ * using the user application's preferred USB controller driver.
+ */
+ void USB_GEN_vect(void);
+ #else
+ ISR(USB_GEN_vect);
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/USBController.h b/LUFA/Drivers/USB/Core/USBController.h
index 290ed9f08..28faee5bf 100644
--- a/LUFA/Drivers/USB/Core/USBController.h
+++ b/LUFA/Drivers/USB/Core/USBController.h
@@ -1,82 +1,82 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Common USB Controller definitions for all architectures.
- * \copydetails Group_USBManagement
- *
- * \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_USB
- * \defgroup Group_USBManagement USB Interface Management
- * \brief USB Controller definitions for general USB controller management.
- *
- * Functions, macros, variables, enums and types related to the setup and management of the USB interface.
- *
- * @{
- */
-
-#ifndef __USBCONTROLLER_H__
-#define __USBCONTROLLER_H__
-
- /* Includes: */
- #include "../../../Common/Common.h"
- #include "USBMode.h"
-
- /* 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
-
- /* Architecture Includes: */
- #if (ARCH == ARCH_AVR8)
- #include "AVR8/USBController_AVR8.h"
- #elif (ARCH == ARCH_UC3)
- #include "UC3/USBController_UC3.h"
- #elif (ARCH == ARCH_XMEGA)
- #include "XMEGA/USBController_XMEGA.h"
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Common USB Controller definitions for all architectures.
+ * \copydetails Group_USBManagement
+ *
+ * \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_USB
+ * \defgroup Group_USBManagement USB Interface Management
+ * \brief USB Controller definitions for general USB controller management.
+ *
+ * Functions, macros, variables, enums and types related to the setup and management of the USB interface.
+ *
+ * @{
+ */
+
+#ifndef __USBCONTROLLER_H__
+#define __USBCONTROLLER_H__
+
+ /* Includes: */
+ #include "../../../Common/Common.h"
+ #include "USBMode.h"
+
+ /* 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
+
+ /* Architecture Includes: */
+ #if (ARCH == ARCH_AVR8)
+ #include "AVR8/USBController_AVR8.h"
+ #elif (ARCH == ARCH_UC3)
+ #include "UC3/USBController_UC3.h"
+ #elif (ARCH == ARCH_XMEGA)
+ #include "XMEGA/USBController_XMEGA.h"
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/USBInterrupt.h b/LUFA/Drivers/USB/Core/USBInterrupt.h
index c69d15a84..f0b3181c7 100644
--- a/LUFA/Drivers/USB/Core/USBInterrupt.h
+++ b/LUFA/Drivers/USB/Core/USBInterrupt.h
@@ -1,73 +1,73 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 service routine management.
- *
- * 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_H__
-#define __USBINTERRUPT_H__
-
- /* Includes: */
- #include "../../../Common/Common.h"
- #include "USBMode.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
-
- /* Architecture Includes: */
- #if (ARCH == ARCH_AVR8)
- #include "AVR8/USBInterrupt_AVR8.h"
- #elif (ARCH == ARCH_UC3)
- #include "UC3/USBInterrupt_UC3.h"
- #elif (ARCH == ARCH_XMEGA)
- #include "XMEGA/USBInterrupt_XMEGA.h"
- #endif
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 service routine management.
+ *
+ * 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_H__
+#define __USBINTERRUPT_H__
+
+ /* Includes: */
+ #include "../../../Common/Common.h"
+ #include "USBMode.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
+
+ /* Architecture Includes: */
+ #if (ARCH == ARCH_AVR8)
+ #include "AVR8/USBInterrupt_AVR8.h"
+ #elif (ARCH == ARCH_UC3)
+ #include "UC3/USBInterrupt_UC3.h"
+ #elif (ARCH == ARCH_XMEGA)
+ #include "XMEGA/USBInterrupt_XMEGA.h"
+ #endif
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c b/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c
index 55598ffaf..e00afd1c0 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c
+++ b/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c
@@ -1,44 +1,44 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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_DEVICE)
-
-#include "../Device.h"
-
-void USB_Device_SendRemoteWakeup(void)
-{
- USB.CTRLB |= USB_RWAKEUP_bm;
-}
-
-#endif
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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_DEVICE)
+
+#include "../Device.h"
+
+void USB_Device_SendRemoteWakeup(void)
+{
+ USB.CTRLB |= USB_RWAKEUP_bm;
+}
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h b/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h
index 4b438911e..0cc53e1d4 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h
+++ b/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h
@@ -1,238 +1,238 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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
-
- /* 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)
-
- /** 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)
- //@}
-
- /** 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)
-
- /* 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 macro 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 macro 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.
- */
- static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
- static inline uint16_t USB_Device_GetFrameNumber(void)
- {
- return (((uint16_t)USB_EndpointTable.FRAMENUMH << 8) | USB_EndpointTable.FRAMENUML);
- }
-
- #if !defined(NO_SOF_EVENTS)
- /** Enables the device mode Start Of Frame events. When enabled, this causes the
- * \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
- * at the start of each USB frame when enumerated in device mode.
- *
- * \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
- */
- static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
- static inline void USB_Device_EnableSOFEvents(void)
- {
- USB.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 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)
- {
- 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);
-
- 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
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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
+
+ /* 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)
+
+ /** 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)
+ //@}
+
+ /** 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)
+
+ /* 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 macro 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 macro 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.
+ */
+ static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+ static inline uint16_t USB_Device_GetFrameNumber(void)
+ {
+ return (((uint16_t)USB_EndpointTable.FRAMENUMH << 8) | USB_EndpointTable.FRAMENUML);
+ }
+
+ #if !defined(NO_SOF_EVENTS)
+ /** Enables the device mode Start Of Frame events. When enabled, this causes the
+ * \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus,
+ * at the start of each USB frame when enumerated in device mode.
+ *
+ * \note Not available when the \c NO_SOF_EVENTS compile time token is defined.
+ */
+ static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE;
+ static inline void USB_Device_EnableSOFEvents(void)
+ {
+ USB.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 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)
+ {
+ 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);
+
+ 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
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c b/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c
index daace9697..3eb156ca6 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c
+++ b/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c
@@ -1,67 +1,67 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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_DEVICE)
-
-#include "../Endpoint.h"
-
-#if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
-uint8_t USB_Device_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE;
-#endif
-
-bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
- const uint8_t UECFG0XData,
- const uint8_t UECFG1XData)
-{
- return false; // TODO
-}
-
-void Endpoint_ClearEndpoints(void)
-{
- // TODO
-}
-
-void Endpoint_ClearStatusStage(void)
-{
- // TODO
-}
-
-#if !defined(CONTROL_ONLY_DEVICE)
-uint8_t Endpoint_WaitUntilReady(void)
-{
- return 0; // TODO
-}
-#endif
-
-#endif
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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_DEVICE)
+
+#include "../Endpoint.h"
+
+#if !defined(FIXED_CONTROL_ENDPOINT_SIZE)
+uint8_t USB_Device_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE;
+#endif
+
+bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
+ const uint8_t UECFG0XData,
+ const uint8_t UECFG1XData)
+{
+ return false; // TODO
+}
+
+void Endpoint_ClearEndpoints(void)
+{
+ // TODO
+}
+
+void Endpoint_ClearStatusStage(void)
+{
+ // TODO
+}
+
+#if !defined(CONTROL_ONLY_DEVICE)
+uint8_t Endpoint_WaitUntilReady(void)
+{
+ return 0; // TODO
+}
+#endif
+
+#endif
+
diff --git a/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h b/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h
index 2a2d4f28d..4e7592a2f 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h
+++ b/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h
@@ -1,773 +1,773 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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"
-
- /* 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__)
- /* Macros: */
- #define _ENDPOINT_GET_MAXSIZE(EPIndex) 1023
- #define _ENDPOINT_GET_BANKS(EPIndex) 2
-
- #define ENDPOINT_DETAILS_MAXEP 16
-
- /* 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: */
- void Endpoint_ClearEndpoints(void);
- bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
- const uint8_t UECFG0XData,
- const uint8_t UECFG1XData);
-
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** \name Endpoint Direction Masks */
- //@{
- /** Endpoint data direction mask for \ref Endpoint_ConfigureEndpoint(). This indicates that the endpoint
- * should be initialized in the OUT direction - i.e. data flows from host to device.
- */
- #define ENDPOINT_DIR_OUT false
-
- /** Endpoint data direction mask for \ref Endpoint_ConfigureEndpoint(). This indicates that the endpoint
- * should be initialized in the IN direction - i.e. data flows from device to host.
- */
- #define ENDPOINT_DIR_IN true
- //@}
-
- /** \name Endpoint Bank Mode Masks */
- //@{
- /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates
- * that the endpoint should have one single bank, which requires less USB FIFO memory but results
- * in slower transfers as only one USB device (the AVR or the host) can access the endpoint's
- * bank at the one time.
- */
- #define ENDPOINT_BANK_SINGLE 0
-
- /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates
- * that the endpoint should have two banks, which requires more USB FIFO memory but results
- * in faster transfers as one USB device (the AVR or the host) can access one bank while the other
- * accesses the second bank.
- */
- #define ENDPOINT_BANK_DOUBLE USB_EP_BANK_bm
- //@}
-
- #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
-
- /** Retrieves the maximum bank size in bytes of a given endpoint.
- *
- * \note This macro will only work correctly on endpoint indexes that are compile-time constants
- * defined by the preprocessor.
- *
- * \param[in] EPIndex Endpoint number, a value between 0 and (\ref ENDPOINT_TOTAL_ENDPOINTS - 1)
- */
- #define ENDPOINT_MAX_SIZE(EPIndex) _ENDPOINT_GET_MAXSIZE(EPIndex)
-
- /** Retrieves the total number of banks supported by the given endpoint.
- *
- * \note This macro will only work correctly on endpoint indexes that are compile-time constants
- * defined by the preprocessor.
- *
- * \param[in] EPIndex Endpoint number, a value between 0 and (\ref ENDPOINT_TOTAL_ENDPOINTS - 1)
- */
- #define ENDPOINT_BANKS_SUPPORTED(EPIndex) _ENDPOINT_GET_BANKS(EPIndex)
-
- #if !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 ENDPOINT_DETAILS_MAXEP
- #else
- #define ENDPOINT_TOTAL_ENDPOINTS 1
- #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: */
- /** Configures the specified endpoint number with the given endpoint type, direction, bank size
- * and banking mode. Once configured, the endpoint may be read from or written to, depending
- * on its direction.
- *
- * \param[in] Number Endpoint number to configure. This must be more than 0 and less than
- * \ref ENDPOINT_TOTAL_ENDPOINTS.
- *
- * \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] Direction Endpoint data direction, either \ref ENDPOINT_DIR_OUT or \ref ENDPOINT_DIR_IN.
- * All endpoints (except Control type) are unidirectional - data may only be read
- * from or written to the endpoint bank based on its direction, not both.
- *
- * \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 banks to use for the endpoint being configured, an \c ENDPOINT_BANK_* mask.
- * More banks uses more USB DPRAM, but offers better performance. Isochronous type
- * endpoints <b>must</b> have at least two banks.
- *
- * \note When the \c ORDERED_EP_CONFIG compile time option is used, Endpoints <b>must</b> be configured in
- * ascending order, or bank corruption will occur.
- * \n\n
- *
- * \note Different endpoints may have different maximum packet sizes based on the endpoint's index - refer to
- * the chosen microcontroller model's datasheet to determine the maximum bank size for each endpoint.
- * \n\n
- *
- * \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 upon success. Upon failure, the endpoint
- * which failed to reconfigure correctly will be selected.
- *
- * \return Boolean \c true if the configuration succeeded, \c false otherwise.
- */
- static inline bool Endpoint_ConfigureEndpoint(const uint8_t Number,
- const uint8_t Type,
- const uint8_t Direction,
- const uint16_t Size,
- const uint8_t Banks) ATTR_ALWAYS_INLINE;
- static inline bool Endpoint_ConfigureEndpoint(const uint8_t Number,
- const uint8_t Type,
- const uint8_t Direction,
- const uint16_t Size,
- const uint8_t Banks)
- {
- return 0; // TODO
- }
-
- /** Indicates the number of bytes currently stored in the current endpoint's selected bank.
- *
- * \note The return width of this function may differ, depending on the maximum endpoint bank size
- * of the selected AVR model.
- *
- * \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)
- {
- return 0; // TODO
- }
-
- /** Get the endpoint address of the currently selected endpoint. This is typically used to save
- * the currently selected endpoint number 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 0; // TODO
- }
-
- /** Selects the given endpoint number. If the address from the device descriptors is used, the
- * value should be masked with the \ref ENDPOINT_EPNUM_MASK constant to extract only the endpoint
- * number (and discarding the endpoint direction bit).
- *
- * Any endpoint operations which do not require the endpoint number to be indicated will operate on
- * the currently selected endpoint.
- *
- * \param[in] EndpointNumber Endpoint number to select.
- */
- static inline void Endpoint_SelectEndpoint(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_SelectEndpoint(const uint8_t EndpointNumber)
- {
- // TODO
- }
-
- /** 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] EndpointNumber Endpoint number whose FIFO buffers are to be reset.
- */
- static inline void Endpoint_ResetEndpoint(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_ResetEndpoint(const uint8_t EndpointNumber)
- {
- // TODO
- }
-
- /** Enables the currently selected endpoint so that data can be sent and received through it to
- * and from a host.
- *
- * \note Endpoints must first be configured properly via \ref Endpoint_ConfigureEndpoint().
- */
- static inline void Endpoint_EnableEndpoint(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_EnableEndpoint(void)
- {
- // TODO
- }
-
- /** Disables the currently selected endpoint so that data cannot be sent and received through it
- * to and from a host.
- */
- static inline void Endpoint_DisableEndpoint(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_DisableEndpoint(void)
- {
- // TODO
- }
-
- /** 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 0; // TODO
- }
-
- /** Retrieves the number of busy banks in the currently selected endpoint, which have been queued for
- * transmission via the \ref Endpoint_ClearIN() command, or are awaiting acknowledgement via the
- * \ref Endpoint_ClearOUT() command.
- *
- * \ingroup Group_EndpointPacketManagement_XMEGA
- *
- * \return Total number of busy banks in the selected endpoint.
- */
- static inline uint8_t Endpoint_GetBusyBanks(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
- static inline uint8_t Endpoint_GetBusyBanks(void)
- {
- return 0; // TODO
- }
-
- /** 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)
- {
- // TODO
- }
-
- /** 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 0; // TODO
- }
-
- /** 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 0; // TODO
- }
-
- /** Returns a mask indicating which INTERRUPT type endpoints have interrupted - i.e. their
- * interrupt duration has elapsed. Which endpoints have interrupted can be determined by
- * masking the return value against <tt>(1 << <i>{Endpoint Number}</i>)</tt>.
- *
- * \return Mask whose bits indicate which endpoints have interrupted.
- */
- static inline uint8_t Endpoint_GetEndpointInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint8_t Endpoint_GetEndpointInterrupts(void)
- {
- return 0; // TODO
- }
-
- /** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type
- * endpoints).
- *
- * \param[in] EndpointNumber Index of the endpoint whose interrupt flag should be tested.
- *
- * \return Boolean \c true if the specified endpoint has interrupted, \c false otherwise.
- */
- static inline bool Endpoint_HasEndpointInterrupted(const uint8_t EndpointNumber) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Endpoint_HasEndpointInterrupted(const uint8_t EndpointNumber)
- {
- return 0; // TODO
- }
-
- /** 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.
- */
- static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Endpoint_IsINReady(void)
- {
- return 0; // TODO
- }
-
- /** 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.
- */
- static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Endpoint_IsOUTReceived(void)
- {
- return 0; // TODO
- }
-
- /** 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.
- */
- static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline bool Endpoint_IsSETUPReceived(void)
- {
- return 0; // TODO
- }
-
- /** 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.
- */
- static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_ClearSETUP(void)
- {
- // TODO
- }
-
- /** 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
- */
- static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_ClearIN(void)
- {
- // TODO
- }
-
- /** 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
- */
- static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_ClearOUT(void)
- {
- // TODO
- }
-
- /** 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
- */
- static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_StallTransaction(void)
- {
- // TODO
- }
-
- /** 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)
- {
- // TODO
- }
-
- /** Determines if the currently selected endpoint is stalled, 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 0; // TODO
- }
-
- /** Resets the data toggle of the currently selected endpoint. */
- static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_ResetDataToggle(void)
- {
- // TODO
- }
-
- /** 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 0; // TODO
- }
-
- /** Sets the direction of the currently selected endpoint.
- *
- * \param[in] DirectionMask New endpoint direction, as a \c ENDPOINT_DIR_* mask.
- */
- static inline void Endpoint_SetEndpointDirection(const uint8_t DirectionMask) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_SetEndpointDirection(const uint8_t DirectionMask)
- {
- // TODO
- }
-
- /** 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.
- */
- static inline uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
- static inline uint8_t Endpoint_Read_8(void)
- {
- return 0; // TODO
- }
-
- /** 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.
- */
- static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
- static inline void Endpoint_Write_8(const uint8_t Data)
- {
- // TODO
- }
-
- /** 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)
- {
- // TODO
- }
-
- /** 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)
- {
- return 0; // TODO
- }
-
- /** 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)
- {
- return 0; // TODO
- }
-
- /** 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)
- {
- // TODO
- }
-
- /** 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)
- {
- // TODO
- }
-
- /** 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)
- {
- // TODO
- }
-
- /** 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)
- {
- return 0; // TODO
- }
-
- /** 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)
- {
- return 0; // TODO
- }
-
- /** 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)
- {
- // TODO
- }
-
- /** 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)
- {
- // TODO
- }
-
- /** 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)
- {
- // TODO
- }
-
- /* 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.
- *
- * \note 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: */
- /** 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.
- */
- 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
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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"
+
+ /* 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__)
+ /* Macros: */
+ #define _ENDPOINT_GET_MAXSIZE(EPIndex) 1023
+ #define _ENDPOINT_GET_BANKS(EPIndex) 2
+
+ #define ENDPOINT_DETAILS_MAXEP 16
+
+ /* 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: */
+ void Endpoint_ClearEndpoints(void);
+ bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number,
+ const uint8_t UECFG0XData,
+ const uint8_t UECFG1XData);
+
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** \name Endpoint Direction Masks */
+ //@{
+ /** Endpoint data direction mask for \ref Endpoint_ConfigureEndpoint(). This indicates that the endpoint
+ * should be initialized in the OUT direction - i.e. data flows from host to device.
+ */
+ #define ENDPOINT_DIR_OUT false
+
+ /** Endpoint data direction mask for \ref Endpoint_ConfigureEndpoint(). This indicates that the endpoint
+ * should be initialized in the IN direction - i.e. data flows from device to host.
+ */
+ #define ENDPOINT_DIR_IN true
+ //@}
+
+ /** \name Endpoint Bank Mode Masks */
+ //@{
+ /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates
+ * that the endpoint should have one single bank, which requires less USB FIFO memory but results
+ * in slower transfers as only one USB device (the AVR or the host) can access the endpoint's
+ * bank at the one time.
+ */
+ #define ENDPOINT_BANK_SINGLE 0
+
+ /** Mask for the bank mode selection for the \ref Endpoint_ConfigureEndpoint() macro. This indicates
+ * that the endpoint should have two banks, which requires more USB FIFO memory but results
+ * in faster transfers as one USB device (the AVR or the host) can access one bank while the other
+ * accesses the second bank.
+ */
+ #define ENDPOINT_BANK_DOUBLE USB_EP_BANK_bm
+ //@}
+
+ #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
+
+ /** Retrieves the maximum bank size in bytes of a given endpoint.
+ *
+ * \note This macro will only work correctly on endpoint indexes that are compile-time constants
+ * defined by the preprocessor.
+ *
+ * \param[in] EPIndex Endpoint number, a value between 0 and (\ref ENDPOINT_TOTAL_ENDPOINTS - 1)
+ */
+ #define ENDPOINT_MAX_SIZE(EPIndex) _ENDPOINT_GET_MAXSIZE(EPIndex)
+
+ /** Retrieves the total number of banks supported by the given endpoint.
+ *
+ * \note This macro will only work correctly on endpoint indexes that are compile-time constants
+ * defined by the preprocessor.
+ *
+ * \param[in] EPIndex Endpoint number, a value between 0 and (\ref ENDPOINT_TOTAL_ENDPOINTS - 1)
+ */
+ #define ENDPOINT_BANKS_SUPPORTED(EPIndex) _ENDPOINT_GET_BANKS(EPIndex)
+
+ #if !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 ENDPOINT_DETAILS_MAXEP
+ #else
+ #define ENDPOINT_TOTAL_ENDPOINTS 1
+ #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: */
+ /** Configures the specified endpoint number with the given endpoint type, direction, bank size
+ * and banking mode. Once configured, the endpoint may be read from or written to, depending
+ * on its direction.
+ *
+ * \param[in] Number Endpoint number to configure. This must be more than 0 and less than
+ * \ref ENDPOINT_TOTAL_ENDPOINTS.
+ *
+ * \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] Direction Endpoint data direction, either \ref ENDPOINT_DIR_OUT or \ref ENDPOINT_DIR_IN.
+ * All endpoints (except Control type) are unidirectional - data may only be read
+ * from or written to the endpoint bank based on its direction, not both.
+ *
+ * \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 banks to use for the endpoint being configured, an \c ENDPOINT_BANK_* mask.
+ * More banks uses more USB DPRAM, but offers better performance. Isochronous type
+ * endpoints <b>must</b> have at least two banks.
+ *
+ * \note When the \c ORDERED_EP_CONFIG compile time option is used, Endpoints <b>must</b> be configured in
+ * ascending order, or bank corruption will occur.
+ * \n\n
+ *
+ * \note Different endpoints may have different maximum packet sizes based on the endpoint's index - refer to
+ * the chosen microcontroller model's datasheet to determine the maximum bank size for each endpoint.
+ * \n\n
+ *
+ * \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 upon success. Upon failure, the endpoint
+ * which failed to reconfigure correctly will be selected.
+ *
+ * \return Boolean \c true if the configuration succeeded, \c false otherwise.
+ */
+ static inline bool Endpoint_ConfigureEndpoint(const uint8_t Number,
+ const uint8_t Type,
+ const uint8_t Direction,
+ const uint16_t Size,
+ const uint8_t Banks) ATTR_ALWAYS_INLINE;
+ static inline bool Endpoint_ConfigureEndpoint(const uint8_t Number,
+ const uint8_t Type,
+ const uint8_t Direction,
+ const uint16_t Size,
+ const uint8_t Banks)
+ {
+ return 0; // TODO
+ }
+
+ /** Indicates the number of bytes currently stored in the current endpoint's selected bank.
+ *
+ * \note The return width of this function may differ, depending on the maximum endpoint bank size
+ * of the selected AVR model.
+ *
+ * \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)
+ {
+ return 0; // TODO
+ }
+
+ /** Get the endpoint address of the currently selected endpoint. This is typically used to save
+ * the currently selected endpoint number 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 0; // TODO
+ }
+
+ /** Selects the given endpoint number. If the address from the device descriptors is used, the
+ * value should be masked with the \ref ENDPOINT_EPNUM_MASK constant to extract only the endpoint
+ * number (and discarding the endpoint direction bit).
+ *
+ * Any endpoint operations which do not require the endpoint number to be indicated will operate on
+ * the currently selected endpoint.
+ *
+ * \param[in] EndpointNumber Endpoint number to select.
+ */
+ static inline void Endpoint_SelectEndpoint(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_SelectEndpoint(const uint8_t EndpointNumber)
+ {
+ // TODO
+ }
+
+ /** 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] EndpointNumber Endpoint number whose FIFO buffers are to be reset.
+ */
+ static inline void Endpoint_ResetEndpoint(const uint8_t EndpointNumber) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_ResetEndpoint(const uint8_t EndpointNumber)
+ {
+ // TODO
+ }
+
+ /** Enables the currently selected endpoint so that data can be sent and received through it to
+ * and from a host.
+ *
+ * \note Endpoints must first be configured properly via \ref Endpoint_ConfigureEndpoint().
+ */
+ static inline void Endpoint_EnableEndpoint(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_EnableEndpoint(void)
+ {
+ // TODO
+ }
+
+ /** Disables the currently selected endpoint so that data cannot be sent and received through it
+ * to and from a host.
+ */
+ static inline void Endpoint_DisableEndpoint(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_DisableEndpoint(void)
+ {
+ // TODO
+ }
+
+ /** 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 0; // TODO
+ }
+
+ /** Retrieves the number of busy banks in the currently selected endpoint, which have been queued for
+ * transmission via the \ref Endpoint_ClearIN() command, or are awaiting acknowledgement via the
+ * \ref Endpoint_ClearOUT() command.
+ *
+ * \ingroup Group_EndpointPacketManagement_XMEGA
+ *
+ * \return Total number of busy banks in the selected endpoint.
+ */
+ static inline uint8_t Endpoint_GetBusyBanks(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+ static inline uint8_t Endpoint_GetBusyBanks(void)
+ {
+ return 0; // TODO
+ }
+
+ /** 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)
+ {
+ // TODO
+ }
+
+ /** 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 0; // TODO
+ }
+
+ /** 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 0; // TODO
+ }
+
+ /** Returns a mask indicating which INTERRUPT type endpoints have interrupted - i.e. their
+ * interrupt duration has elapsed. Which endpoints have interrupted can be determined by
+ * masking the return value against <tt>(1 << <i>{Endpoint Number}</i>)</tt>.
+ *
+ * \return Mask whose bits indicate which endpoints have interrupted.
+ */
+ static inline uint8_t Endpoint_GetEndpointInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint8_t Endpoint_GetEndpointInterrupts(void)
+ {
+ return 0; // TODO
+ }
+
+ /** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type
+ * endpoints).
+ *
+ * \param[in] EndpointNumber Index of the endpoint whose interrupt flag should be tested.
+ *
+ * \return Boolean \c true if the specified endpoint has interrupted, \c false otherwise.
+ */
+ static inline bool Endpoint_HasEndpointInterrupted(const uint8_t EndpointNumber) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Endpoint_HasEndpointInterrupted(const uint8_t EndpointNumber)
+ {
+ return 0; // TODO
+ }
+
+ /** 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.
+ */
+ static inline bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Endpoint_IsINReady(void)
+ {
+ return 0; // TODO
+ }
+
+ /** 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.
+ */
+ static inline bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Endpoint_IsOUTReceived(void)
+ {
+ return 0; // TODO
+ }
+
+ /** 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.
+ */
+ static inline bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline bool Endpoint_IsSETUPReceived(void)
+ {
+ return 0; // TODO
+ }
+
+ /** 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.
+ */
+ static inline void Endpoint_ClearSETUP(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_ClearSETUP(void)
+ {
+ // TODO
+ }
+
+ /** 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
+ */
+ static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_ClearIN(void)
+ {
+ // TODO
+ }
+
+ /** 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
+ */
+ static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_ClearOUT(void)
+ {
+ // TODO
+ }
+
+ /** 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
+ */
+ static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_StallTransaction(void)
+ {
+ // TODO
+ }
+
+ /** 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)
+ {
+ // TODO
+ }
+
+ /** Determines if the currently selected endpoint is stalled, 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 0; // TODO
+ }
+
+ /** Resets the data toggle of the currently selected endpoint. */
+ static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_ResetDataToggle(void)
+ {
+ // TODO
+ }
+
+ /** 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 0; // TODO
+ }
+
+ /** Sets the direction of the currently selected endpoint.
+ *
+ * \param[in] DirectionMask New endpoint direction, as a \c ENDPOINT_DIR_* mask.
+ */
+ static inline void Endpoint_SetEndpointDirection(const uint8_t DirectionMask) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_SetEndpointDirection(const uint8_t DirectionMask)
+ {
+ // TODO
+ }
+
+ /** 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.
+ */
+ static inline uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE;
+ static inline uint8_t Endpoint_Read_8(void)
+ {
+ return 0; // TODO
+ }
+
+ /** 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.
+ */
+ static inline void Endpoint_Write_8(const uint8_t Data) ATTR_ALWAYS_INLINE;
+ static inline void Endpoint_Write_8(const uint8_t Data)
+ {
+ // TODO
+ }
+
+ /** 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)
+ {
+ // TODO
+ }
+
+ /** 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)
+ {
+ return 0; // TODO
+ }
+
+ /** 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)
+ {
+ return 0; // TODO
+ }
+
+ /** 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)
+ {
+ // TODO
+ }
+
+ /** 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)
+ {
+ // TODO
+ }
+
+ /** 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)
+ {
+ // TODO
+ }
+
+ /** 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)
+ {
+ return 0; // TODO
+ }
+
+ /** 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)
+ {
+ return 0; // TODO
+ }
+
+ /** 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)
+ {
+ // TODO
+ }
+
+ /** 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)
+ {
+ // TODO
+ }
+
+ /** 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)
+ {
+ // TODO
+ }
+
+ /* 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.
+ *
+ * \note 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: */
+ /** 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.
+ */
+ 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
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c b/LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c
index d58ad2dfb..b9d9d7699 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c
+++ b/LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c
@@ -1,37 +1,37 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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
+
diff --git a/LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c b/LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c
index 515c38df5..4144a06c5 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c
+++ b/LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c
@@ -1,37 +1,37 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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
+
diff --git a/LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c b/LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c
index d58ad2dfb..b9d9d7699 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c
+++ b/LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c
@@ -1,37 +1,37 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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
+
diff --git a/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c b/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c
index 570898a3a..68f645b89 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c
+++ b/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c
@@ -1,83 +1,83 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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));
-
- 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
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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));
+
+ 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
diff --git a/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c b/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c
index d1b5f7a06..5d4fc42f2 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c
+++ b/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c
@@ -1,92 +1,92 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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;
-
- 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;
- }
-
- return ENDPOINT_RWCSTREAM_NoError;
-}
-
-#undef TEMPLATE_BUFFER_OFFSET
-#undef TEMPLATE_BUFFER_MOVE
-#undef TEMPLATE_FUNC_NAME
-#undef TEMPLATE_TRANSFER_BYTE
-
-#endif
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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;
+
+ 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;
+ }
+
+ return ENDPOINT_RWCSTREAM_NoError;
+}
+
+#undef TEMPLATE_BUFFER_OFFSET
+#undef TEMPLATE_BUFFER_MOVE
+#undef TEMPLATE_FUNC_NAME
+#undef TEMPLATE_TRANSFER_BYTE
+
+#endif
diff --git a/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c b/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c
index ef9e8eaad..9ce034007 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c
+++ b/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c
@@ -1,88 +1,88 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 (BytesProcessed != NULL)
- {
- *BytesProcessed += BytesInTransfer;
- return ENDPOINT_RWSTREAM_IncompleteTransfer;
- }
-
- #if !defined(INTERRUPT_CONTROL_ENDPOINT)
- USB_USBTask();
- #endif
-
- 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
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 (BytesProcessed != NULL)
+ {
+ *BytesProcessed += BytesInTransfer;
+ return ENDPOINT_RWSTREAM_IncompleteTransfer;
+ }
+
+ #if !defined(INTERRUPT_CONTROL_ENDPOINT)
+ USB_USBTask();
+ #endif
+
+ 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
diff --git a/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c b/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c
index dcb506b2b..9f44dc46a 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c
+++ b/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c
@@ -1,169 +1,169 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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
-#define __INCLUDE_FROM_USB_CONTROLLER_C
-#include "../USBController.h"
-
-#if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY))
-volatile uint8_t USB_CurrentMode = USB_MODE_None;
-#endif
-
-#if !defined(USE_STATIC_OPTIONS)
-volatile uint8_t USB_Options;
-#endif
-
-USB_EP_TABLE_t USB_EndpointTable ATTR_ALIGNED(2);
-
-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
-
- USB_IsInitialized = true;
-
- 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));
- NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc;
- USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1));
-
- 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);
-
- USB_ResetInterface();
-}
-
-void USB_Disable(void)
-{
- USB_INT_DisableAllInterrupts();
- USB_INT_ClearAllInterrupts();
-
- USB_Detach();
- USB_Controller_Disable();
-
- USB_IsInitialized = false;
-}
-
-void USB_ResetInterface(void)
-{
- if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
- CLK.USBCTRL = ((((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp) | CLK_USBSRC_PLL_gc | CLK_USBSEN_bm);
- else
- CLK.USBCTRL = ((((F_USB / 48000000) - 1) << CLK_USBPSDIV_gp) | CLK_USBSRC_PLL_gc | CLK_USBSEN_bm);
-
- 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,
- ENDPOINT_DIR_OUT, USB_Device_ControlEndpointSize,
- ENDPOINT_BANK_SINGLE);
-
- USB_INT_Enable(USB_INT_BUSEVENTI);
-
- USB_Attach();
-}
-#endif
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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
+#define __INCLUDE_FROM_USB_CONTROLLER_C
+#include "../USBController.h"
+
+#if (!defined(USB_HOST_ONLY) && !defined(USB_DEVICE_ONLY))
+volatile uint8_t USB_CurrentMode = USB_MODE_None;
+#endif
+
+#if !defined(USE_STATIC_OPTIONS)
+volatile uint8_t USB_Options;
+#endif
+
+USB_EP_TABLE_t USB_EndpointTable ATTR_ALIGNED(2);
+
+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
+
+ USB_IsInitialized = true;
+
+ 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));
+ NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc;
+ USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1));
+
+ 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);
+
+ USB_ResetInterface();
+}
+
+void USB_Disable(void)
+{
+ USB_INT_DisableAllInterrupts();
+ USB_INT_ClearAllInterrupts();
+
+ USB_Detach();
+ USB_Controller_Disable();
+
+ USB_IsInitialized = false;
+}
+
+void USB_ResetInterface(void)
+{
+ if (USB_Options & USB_DEVICE_OPT_LOWSPEED)
+ CLK.USBCTRL = ((((F_USB / 6000000) - 1) << CLK_USBPSDIV_gp) | CLK_USBSRC_PLL_gc | CLK_USBSEN_bm);
+ else
+ CLK.USBCTRL = ((((F_USB / 48000000) - 1) << CLK_USBPSDIV_gp) | CLK_USBSRC_PLL_gc | CLK_USBSEN_bm);
+
+ 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,
+ ENDPOINT_DIR_OUT, USB_Device_ControlEndpointSize,
+ ENDPOINT_BANK_SINGLE);
+
+ USB_INT_Enable(USB_INT_BUSEVENTI);
+
+ USB_Attach();
+}
+#endif
diff --git a/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h b/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h
index f6c4a7aa8..6b6c39a2c 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h
+++ b/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h
@@ -1,319 +1,319 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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__)
- /* External Variables: */
- extern USB_EP_TABLE_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
-
- /* 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 << 1) | (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 << 1) | (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 << 1) | (0 << 1))
- //@}
-
- /** \name Endpoint/Pipe Type Masks */
- //@{
- /** Mask for a CONTROL type endpoint or pipe.
- *
- * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
- */
- #define EP_TYPE_CONTROL 0x00
-
- /** Mask for an ISOCHRONOUS type endpoint or pipe.
- *
- * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
- */
- #define EP_TYPE_ISOCHRONOUS 0x01
-
- /** Mask for a BULK type endpoint or pipe.
- *
- * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
- */
- #define EP_TYPE_BULK 0x02
-
- /** Mask for an INTERRUPT type endpoint or pipe.
- *
- * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
- */
- #define EP_TYPE_INTERRUPT 0x03
- //@}
-
- #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 This is a mask indicating what mode the USB interface is to be initialized to, a value
- * from the \ref USB_Modes_t enum.
- *
- * \param[in] Options Mask indicating the options which should be used when initializing the USB
- * interface to control the USB interface's behaviour. 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 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_HOST_ONLY) && !defined(USB_DEVICE_ONLY)) || defined(__DOXYGEN__)
- /** Indicates the mode that the USB interface is currently initialized to, a value from the
- * \ref USB_Modes_t enum.
- *
- * \note This variable should be treated as read-only in the user application, and never manually
- * changed in value.
- * \n\n
- *
- * \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_DEVICE_ONLY)
- #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.
- *
- * \note 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
-
- /* Enums: */
- /** Enum for the possible USB controller modes, for initialization via \ref USB_Init() and indication back to the
- * user application via \ref USB_CurrentMode.
- */
- enum USB_Modes_t
- {
- USB_MODE_None = 0, /**< Indicates that the controller is currently not initialized in any specific USB mode. */
- USB_MODE_Device = 1, /**< Indicates that the controller is currently initialized in USB Device mode. */
- };
-
- /* 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 | USB_STFRNUM_bm | USB_MAXEP_gm);
- }
-
- 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
-
-/** @} */
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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__)
+ /* External Variables: */
+ extern USB_EP_TABLE_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
+
+ /* 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 << 1) | (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 << 1) | (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 << 1) | (0 << 1))
+ //@}
+
+ /** \name Endpoint/Pipe Type Masks */
+ //@{
+ /** Mask for a CONTROL type endpoint or pipe.
+ *
+ * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+ */
+ #define EP_TYPE_CONTROL 0x00
+
+ /** Mask for an ISOCHRONOUS type endpoint or pipe.
+ *
+ * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+ */
+ #define EP_TYPE_ISOCHRONOUS 0x01
+
+ /** Mask for a BULK type endpoint or pipe.
+ *
+ * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+ */
+ #define EP_TYPE_BULK 0x02
+
+ /** Mask for an INTERRUPT type endpoint or pipe.
+ *
+ * \note See \ref Group_EndpointManagement and \ref Group_PipeManagement for endpoint/pipe functions.
+ */
+ #define EP_TYPE_INTERRUPT 0x03
+ //@}
+
+ #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 This is a mask indicating what mode the USB interface is to be initialized to, a value
+ * from the \ref USB_Modes_t enum.
+ *
+ * \param[in] Options Mask indicating the options which should be used when initializing the USB
+ * interface to control the USB interface's behaviour. 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 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_HOST_ONLY) && !defined(USB_DEVICE_ONLY)) || defined(__DOXYGEN__)
+ /** Indicates the mode that the USB interface is currently initialized to, a value from the
+ * \ref USB_Modes_t enum.
+ *
+ * \note This variable should be treated as read-only in the user application, and never manually
+ * changed in value.
+ * \n\n
+ *
+ * \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_DEVICE_ONLY)
+ #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.
+ *
+ * \note 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
+
+ /* Enums: */
+ /** Enum for the possible USB controller modes, for initialization via \ref USB_Init() and indication back to the
+ * user application via \ref USB_CurrentMode.
+ */
+ enum USB_Modes_t
+ {
+ USB_MODE_None = 0, /**< Indicates that the controller is currently not initialized in any specific USB mode. */
+ USB_MODE_Device = 1, /**< Indicates that the controller is currently initialized in USB Device mode. */
+ };
+
+ /* 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 | USB_STFRNUM_bm | USB_MAXEP_gm);
+ }
+
+ 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
+
+/** @} */
+
diff --git a/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c b/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c
index b52a716d6..dccdf2e45 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c
+++ b/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c
@@ -1,100 +1,100 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 "../USBInterrupt.h"
-
-void USB_INT_DisableAllInterrupts(void)
-{
- USB.INTCTRLA = 0;
- 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_Configured : 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;
-
- Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
- ENDPOINT_DIR_OUT, USB_Device_ControlEndpointSize,
- ENDPOINT_BANK_SINGLE);
-
- EVENT_USB_Device_Reset();
- }
-}
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 "../USBInterrupt.h"
+
+void USB_INT_DisableAllInterrupts(void)
+{
+ USB.INTCTRLA = 0;
+ 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_Configured : 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;
+
+ Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL,
+ ENDPOINT_DIR_OUT, USB_Device_ControlEndpointSize,
+ ENDPOINT_BANK_SINGLE);
+
+ EVENT_USB_Device_Reset();
+ }
+}
+
diff --git a/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h b/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h
index b6acec4ea..c25c5c86e 100644
--- a/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h
+++ b/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h
@@ -1,166 +1,166 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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;
- return;
- case USB_INT_SOFI:
- USB.INTCTRLA |= USB_SOFIE_bm;
- return;
- }
- }
-
- static inline void USB_INT_Disable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;
- static inline void USB_INT_Disable(const uint8_t Interrupt)
- {
- switch (Interrupt)
- {
- case USB_INT_BUSEVENTI:
- USB.INTCTRLA &= ~USB_BUSEVIE_bm;
- return;
- case USB_INT_SOFI:
- USB.INTCTRLA &= ~USB_SOFIE_bm;
- return;
- }
- }
-
- static inline void USB_INT_Clear(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;
- static inline void USB_INT_Clear(const uint8_t Interrupt)
- {
- switch (Interrupt)
- {
- case USB_INT_BUSEVENTI_Suspend:
- USB.INTFLAGSACLR = USB_SUSPENDIF_bm;
- return;
- case USB_INT_BUSEVENTI_Resume:
- USB.INTFLAGSACLR = USB_RESUMEIF_bm;
- return;
- case USB_INT_BUSEVENTI_Reset:
- USB.INTFLAGSACLR = USB_RSTIF_bm;
- return;
- case USB_INT_SOFI:
- USB.INTFLAGSACLR = USB_SOFIF_bm;
- return;
- }
- }
-
- static inline bool USB_INT_IsEnabled(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
- static inline bool USB_INT_IsEnabled(const uint8_t Interrupt)
- {
- switch (Interrupt)
- {
- case USB_INT_BUSEVENTI:
- return (USB.INTCTRLA & USB_BUSEVIE_bm);
- case USB_INT_SOFI:
- return (USB.INTCTRLA & USB_SOFIE_bm);
- }
-
- 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);
- case USB_INT_BUSEVENTI_Resume:
- return (USB.INTFLAGSACLR & USB_RESUMEIF_bm);
- case USB_INT_BUSEVENTI_Reset:
- return (USB.INTFLAGSACLR & USB_RSTIF_bm);
- case USB_INT_SOFI:
- return (USB.INTFLAGSACLR & USB_SOFIF_bm);
- }
-
- 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
-
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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;
+ return;
+ case USB_INT_SOFI:
+ USB.INTCTRLA |= USB_SOFIE_bm;
+ return;
+ }
+ }
+
+ static inline void USB_INT_Disable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;
+ static inline void USB_INT_Disable(const uint8_t Interrupt)
+ {
+ switch (Interrupt)
+ {
+ case USB_INT_BUSEVENTI:
+ USB.INTCTRLA &= ~USB_BUSEVIE_bm;
+ return;
+ case USB_INT_SOFI:
+ USB.INTCTRLA &= ~USB_SOFIE_bm;
+ return;
+ }
+ }
+
+ static inline void USB_INT_Clear(const uint8_t Interrupt) ATTR_ALWAYS_INLINE;
+ static inline void USB_INT_Clear(const uint8_t Interrupt)
+ {
+ switch (Interrupt)
+ {
+ case USB_INT_BUSEVENTI_Suspend:
+ USB.INTFLAGSACLR = USB_SUSPENDIF_bm;
+ return;
+ case USB_INT_BUSEVENTI_Resume:
+ USB.INTFLAGSACLR = USB_RESUMEIF_bm;
+ return;
+ case USB_INT_BUSEVENTI_Reset:
+ USB.INTFLAGSACLR = USB_RSTIF_bm;
+ return;
+ case USB_INT_SOFI:
+ USB.INTFLAGSACLR = USB_SOFIF_bm;
+ return;
+ }
+ }
+
+ static inline bool USB_INT_IsEnabled(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT;
+ static inline bool USB_INT_IsEnabled(const uint8_t Interrupt)
+ {
+ switch (Interrupt)
+ {
+ case USB_INT_BUSEVENTI:
+ return (USB.INTCTRLA & USB_BUSEVIE_bm);
+ case USB_INT_SOFI:
+ return (USB.INTCTRLA & USB_SOFIE_bm);
+ }
+
+ 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);
+ case USB_INT_BUSEVENTI_Resume:
+ return (USB.INTFLAGSACLR & USB_RESUMEIF_bm);
+ case USB_INT_BUSEVENTI_Reset:
+ return (USB.INTFLAGSACLR & USB_RSTIF_bm);
+ case USB_INT_SOFI:
+ return (USB.INTFLAGSACLR & USB_SOFIF_bm);
+ }
+
+ 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
+
diff --git a/LUFA/Platform/UC3/ClockManagement.h b/LUFA/Platform/UC3/ClockManagement.h
index 125a8a9b5..bb5679ad9 100644
--- a/LUFA/Platform/UC3/ClockManagement.h
+++ b/LUFA/Platform/UC3/ClockManagement.h
@@ -1,324 +1,324 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Module Clock Driver for the AVR32 UC3 microcontrollers.
- *
- * Clock management driver for the AVR32 UC3 microcontrollers. This driver allows for the configuration
- * of the various clocks within the device to clock the various peripherals.
- */
-
-/** \ingroup Group_PlatformDrivers
- * \defgroup Group_PlatformDrivers_UC3Clocks UC3 Clock Management Driver - LUFA/Platform/UC3/ClockManagement.h
- * \brief Module Clock Driver for the AVR32 UC3 microcontrollers.
- *
- * \section Sec_Dependencies Module Source Dependencies
- * The following files must be built with any user project that uses this module:
- * - None
- *
- * \section Sec_ModDescription Module Description
- * Clock management driver for the AVR32 UC3 microcontrollers. This driver allows for the configuration
- * of the various clocks within the device to clock the various peripherals.
- *
- * Usage Example:
- * \code
- * #include <LUFA/Platform/UC3/ClockManagement.h>
- *
- * void main(void)
- * {
- * // Start the master external oscillator which will be used as the main clock reference
- * AVR32CLK_StartExternalOscillator(0, EXOSC_MODE_8MHZ_OR_MORE, EXOSC_START_0CLK);
- *
- * // Start the PLL for the CPU clock, switch CPU to it
- * AVR32CLK_StartPLL(0, CLOCK_SRC_OSC0, 12000000, F_CPU);
- * AVR32CLK_SetCPUClockSource(CLOCK_SRC_PLL0, F_CPU);
- *
- * // Start the PLL for the USB Generic Clock module
- * AVR32CLK_StartPLL(1, CLOCK_SRC_OSC0, 12000000, 48000000);
- * }
- * \endcode
- *
- * @{
- */
-
-#ifndef _UC3_CLOCK_MANAGEMENT_H_
-#define _UC3_CLOCK_MANAGEMENT_H_
-
- /* Includes: */
- #include <LUFA/Common/Common.h>
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** Enum for the possible external oscillator types. */
- enum UC3_Extern_OSC_ClockTypes_t
- {
- EXOSC_MODE_CLOCK = AVR32_PM_OSCCTRL0_MODE_EXT_CLOCK, /**< External clock (non-crystal) mode. */
- EXOSC_MODE_900KHZ_MAX = AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G0, /**< External crystal oscillator equal to or slower than 900KHz. */
- EXOSC_MODE_3MHZ_MAX = AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G1, /**< External crystal oscillator equal to or slower than 3MHz. */
- EXOSC_MODE_8MHZ_MAX = AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G2, /**< External crystal oscillator equal to or slower than 8MHz. */
- EXOSC_MODE_8MHZ_OR_MORE = AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G3, /**< External crystal oscillator equal to or faster than 8MHz. */
- };
-
- /** Enum for the possible external oscillator statup times. */
- enum UC3_Extern_OSC_ClockStartup_t
- {
- EXOSC_START_0CLK = AVR32_PM_OSCCTRL0_STARTUP_0_RCOSC, /**< Immediate startup, no delay. */
- EXOSC_START_64CLK = AVR32_PM_OSCCTRL0_STARTUP_64_RCOSC, /**< Wait 64 clock cyles before startup for stability. */
- EXOSC_START_128CLK = AVR32_PM_OSCCTRL0_STARTUP_128_RCOSC, /**< Wait 128 clock cyles before startup for stability. */
- EXOSC_START_2048CLK = AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC, /**< Wait 2048 clock cyles before startup for stability. */
- EXOSC_START_4096CLK = AVR32_PM_OSCCTRL0_STARTUP_4096_RCOSC, /**< Wait 4096 clock cyles before startup for stability. */
- EXOSC_START_8192CLK = AVR32_PM_OSCCTRL0_STARTUP_8192_RCOSC, /**< Wait 8192 clock cyles before startup for stability. */
- EXOSC_START_16384CLK = AVR32_PM_OSCCTRL0_STARTUP_16384_RCOSC, /**< Wait 16384 clock cyles before startup for stability. */
- };
-
- /** Enum for the possible module clock sources. */
- enum UC3_System_ClockSource_t
- {
- CLOCK_SRC_SLOW_CLK = 0, /**< Clock sourced from the internal slow clock. */
- CLOCK_SRC_OSC0 = 1, /**< Clock sourced from the Oscillator 0 clock. */
- CLOCK_SRC_OSC1 = 2, /**< Clock sourced from the Oscillator 1 clock. */
- CLOCK_SRC_PLL0 = 3, /**< Clock sourced from the PLL 0 clock. */
- CLOCK_SRC_PLL1 = 4, /**< Clock sourced from the PLL 1 clock. */
- };
-
- /* Inline Functions: */
- /** Starts the given external oscillator of the UC3 microcontroller, with the given options. This routine blocks until
- * the oscillator is ready for use.
- *
- * \param[in] Channel Index of the external oscillator to start.
- * \param[in] Type Type of clock attached to the given oscillator channel, a value from \ref UC3_Extern_OSC_ClockTypes_t.
- * \param[in] Startup Statup time of the external oscillator, a value from \ref UC3_Extern_OSC_ClockStartup_t.
- *
- * \return Boolean \c true if the external oscillator was successfully started, \c false if invalid parameters specified.
- */
- static inline bool AVR32CLK_StartExternalOscillator(const uint8_t Channel,
- const uint8_t Type,
- const uint8_t Startup) ATTR_ALWAYS_INLINE;
- static inline bool AVR32CLK_StartExternalOscillator(const uint8_t Channel,
- const uint8_t Type,
- const uint8_t Startup)
- {
- switch (Channel)
- {
- case 0:
- AVR32_PM.OSCCTRL0.startup = Startup;
- AVR32_PM.OSCCTRL0.mode = Type;
- break;
- case 1:
- AVR32_PM.OSCCTRL1.startup = Startup;
- AVR32_PM.OSCCTRL1.mode = Type;
- break;
- default:
- return false;
- }
-
- AVR32_PM.mcctrl |= (1 << (AVR32_PM_MCCTRL_OSC0EN_OFFSET + Channel));
-
- while (!(AVR32_PM.poscsr & (1 << (AVR32_PM_POSCSR_OSC0RDY_OFFSET + Channel))));
- return true;
- }
-
- /** Stops the given external oscillator of the UC3 microcontroller.
- *
- * \param[in] Channel Index of the external oscillator to stop.
- */
- static inline void AVR32CLK_StopExternalOscillator(const uint8_t Channel) ATTR_ALWAYS_INLINE;
- static inline void AVR32CLK_StopExternalOscillator(const uint8_t Channel)
- {
- AVR32_PM.mcctrl &= ~(1 << (AVR32_PM_MCCTRL_OSC0EN_OFFSET + Channel));
- }
-
- /** Starts the given PLL of the UC3 microcontroller, with the given options. This routine blocks until the PLL is ready for use.
- *
- * \note The output frequency must be equal to or greater than the source frequency.
- *
- * \param[in] Channel Index of the PLL to start.
- * \param[in] Source Clock source for the PLL, a value from \ref UC3_System_ClockSource_t.
- * \param[in] SourceFreq Frequency of the PLL's clock source, in Hz.
- * \param[in] Frequency Target frequency of the PLL's output.
- *
- * \return Boolean \c true if the PLL was successfully started, \c false if invalid parameters specified.
- */
- static inline bool AVR32CLK_StartPLL(const uint8_t Channel,
- const uint8_t Source,
- const uint32_t SourceFreq,
- const uint32_t Frequency) ATTR_ALWAYS_INLINE;
- static inline bool AVR32CLK_StartPLL(const uint8_t Channel,
- const uint8_t Source,
- const uint32_t SourceFreq,
- const uint32_t Frequency)
- {
- if (SourceFreq > Frequency)
- return false;
-
- switch (Source)
- {
- case CLOCK_SRC_OSC0:
- AVR32_PM.PLL[Channel].pllosc = 0;
- break;
- case CLOCK_SRC_OSC1:
- AVR32_PM.PLL[Channel].pllosc = 1;
- break;
- default:
- return false;
- }
-
- AVR32_PM.PLL[Channel].pllmul = (Frequency / SourceFreq) ? (((Frequency / SourceFreq) - 1) / 2) : 0;
- AVR32_PM.PLL[Channel].plldiv = 0;
- AVR32_PM.PLL[Channel].pllen = true;
-
- while (!(AVR32_PM.poscsr & (1 << (AVR32_PM_POSCSR_LOCK0_OFFSET + Channel))));
- return true;
- }
-
- /** Stops the given PLL of the UC3 microcontroller.
- *
- * \param[in] Channel Index of the PLL to stop.
- */
- static inline void AVR32CLK_StopPLL(const uint8_t Channel) ATTR_ALWAYS_INLINE;
- static inline void AVR32CLK_StopPLL(const uint8_t Channel)
- {
- AVR32_PM.PLL[Channel].pllen = false;
- }
-
- /** Starts the given Generic Clock of the UC3 microcontroller, with the given options.
- *
- * \param[in] Channel Index of the Generic Clock to start.
- * \param[in] Source Clock source for the Generic Clock, a value from \ref UC3_System_ClockSource_t.
- * \param[in] SourceFreq Frequency of the Generic Clock's clock source, in Hz.
- * \param[in] Frequency Target frequency of the Generic Clock's output.
- *
- * \return Boolean \c true if the Generic Clock was successfully started, \c false if invalid parameters specified.
- */
- static inline bool AVR32CLK_StartGenericClock(const uint8_t Channel,
- const uint8_t Source,
- const uint32_t SourceFreq,
- const uint32_t Frequency) ATTR_ALWAYS_INLINE;
- static inline bool AVR32CLK_StartGenericClock(const uint8_t Channel,
- const uint8_t Source,
- const uint32_t SourceFreq,
- const uint32_t Frequency)
- {
- switch (Source)
- {
- case CLOCK_SRC_OSC0:
- AVR32_PM.GCCTRL[Channel].pllsel = false;
- AVR32_PM.GCCTRL[Channel].oscsel = 0;
- break;
- case CLOCK_SRC_OSC1:
- AVR32_PM.GCCTRL[Channel].pllsel = false;
- AVR32_PM.GCCTRL[Channel].oscsel = 1;
- break;
- case CLOCK_SRC_PLL0:
- AVR32_PM.GCCTRL[Channel].pllsel = true;
- AVR32_PM.GCCTRL[Channel].oscsel = 0;
- break;
- case CLOCK_SRC_PLL1:
- AVR32_PM.GCCTRL[Channel].pllsel = true;
- AVR32_PM.GCCTRL[Channel].oscsel = 1;
- break;
- default:
- return false;
- }
-
- if (SourceFreq < Frequency)
- return false;
-
- AVR32_PM.GCCTRL[Channel].diven = (SourceFreq > Frequency) ? true : false;
- AVR32_PM.GCCTRL[Channel].div = (((SourceFreq / Frequency) - 1) / 2);
- AVR32_PM.GCCTRL[Channel].cen = true;
-
- return true;
- }
-
- /** Stops the given generic clock of the UC3 microcontroller.
- *
- * \param[in] Channel Index of the generic clock to stop.
- */
- static inline void AVR32CLK_StopGenericClock(const uint8_t Channel) ATTR_ALWAYS_INLINE;
- static inline void AVR32CLK_StopGenericClock(const uint8_t Channel)
- {
- AVR32_PM.GCCTRL[Channel].cen = false;
- }
-
- /** Sets the clock source for the main microcontroller core. The given clock source should be configured
- * and ready for use before this function is called.
- *
- * This function will configure the FLASH controller's wait states automatically to suit the given clock source.
- *
- * \param[in] Source Clock source for the CPU core, a value from \ref UC3_System_ClockSource_t.
- * \param[in] SourceFreq Frequency of the CPU core's clock source, in Hz.
- *
- * \return Boolean \c true if the CPU core clock was sucessfully altered, \c false if invalid parameters specified.
- */
- static inline bool AVR32CLK_SetCPUClockSource(const uint8_t Source,
- const uint32_t SourceFreq) ATTR_ALWAYS_INLINE;
- static inline bool AVR32CLK_SetCPUClockSource(const uint8_t Source,
- const uint32_t SourceFreq)
- {
- AVR32_FLASHC.FCR.fws = (SourceFreq > 30000000) ? true : false;
-
- switch (Source)
- {
- #if defined(AVR32_PM_MCCTRL_MCSEL_SLOW)
- case CLOCK_SRC_SLOW_CLK:
- AVR32_PM.MCCTRL.mcsel = AVR32_PM_MCCTRL_MCSEL_SLOW;
- break;
- #endif
- #if defined(AVR32_PM_MCCTRL_MCSEL_OSC0)
- case CLOCK_SRC_OSC0:
- AVR32_PM.MCCTRL.mcsel = AVR32_PM_MCCTRL_MCSEL_OSC0;
- break;
- #endif
- #if defined(AVR32_PM_MCCTRL_MCSEL_PLL0)
- case CLOCK_SRC_PLL0:
- AVR32_PM.MCCTRL.mcsel = AVR32_PM_MCCTRL_MCSEL_PLL0;
- break;
- #endif
- default:
- return false;
- }
-
- return true;
- }
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Module Clock Driver for the AVR32 UC3 microcontrollers.
+ *
+ * Clock management driver for the AVR32 UC3 microcontrollers. This driver allows for the configuration
+ * of the various clocks within the device to clock the various peripherals.
+ */
+
+/** \ingroup Group_PlatformDrivers
+ * \defgroup Group_PlatformDrivers_UC3Clocks UC3 Clock Management Driver - LUFA/Platform/UC3/ClockManagement.h
+ * \brief Module Clock Driver for the AVR32 UC3 microcontrollers.
+ *
+ * \section Sec_Dependencies Module Source Dependencies
+ * The following files must be built with any user project that uses this module:
+ * - None
+ *
+ * \section Sec_ModDescription Module Description
+ * Clock management driver for the AVR32 UC3 microcontrollers. This driver allows for the configuration
+ * of the various clocks within the device to clock the various peripherals.
+ *
+ * Usage Example:
+ * \code
+ * #include <LUFA/Platform/UC3/ClockManagement.h>
+ *
+ * void main(void)
+ * {
+ * // Start the master external oscillator which will be used as the main clock reference
+ * AVR32CLK_StartExternalOscillator(0, EXOSC_MODE_8MHZ_OR_MORE, EXOSC_START_0CLK);
+ *
+ * // Start the PLL for the CPU clock, switch CPU to it
+ * AVR32CLK_StartPLL(0, CLOCK_SRC_OSC0, 12000000, F_CPU);
+ * AVR32CLK_SetCPUClockSource(CLOCK_SRC_PLL0, F_CPU);
+ *
+ * // Start the PLL for the USB Generic Clock module
+ * AVR32CLK_StartPLL(1, CLOCK_SRC_OSC0, 12000000, 48000000);
+ * }
+ * \endcode
+ *
+ * @{
+ */
+
+#ifndef _UC3_CLOCK_MANAGEMENT_H_
+#define _UC3_CLOCK_MANAGEMENT_H_
+
+ /* Includes: */
+ #include <LUFA/Common/Common.h>
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** Enum for the possible external oscillator types. */
+ enum UC3_Extern_OSC_ClockTypes_t
+ {
+ EXOSC_MODE_CLOCK = AVR32_PM_OSCCTRL0_MODE_EXT_CLOCK, /**< External clock (non-crystal) mode. */
+ EXOSC_MODE_900KHZ_MAX = AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G0, /**< External crystal oscillator equal to or slower than 900KHz. */
+ EXOSC_MODE_3MHZ_MAX = AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G1, /**< External crystal oscillator equal to or slower than 3MHz. */
+ EXOSC_MODE_8MHZ_MAX = AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G2, /**< External crystal oscillator equal to or slower than 8MHz. */
+ EXOSC_MODE_8MHZ_OR_MORE = AVR32_PM_OSCCTRL0_MODE_CRYSTAL_G3, /**< External crystal oscillator equal to or faster than 8MHz. */
+ };
+
+ /** Enum for the possible external oscillator statup times. */
+ enum UC3_Extern_OSC_ClockStartup_t
+ {
+ EXOSC_START_0CLK = AVR32_PM_OSCCTRL0_STARTUP_0_RCOSC, /**< Immediate startup, no delay. */
+ EXOSC_START_64CLK = AVR32_PM_OSCCTRL0_STARTUP_64_RCOSC, /**< Wait 64 clock cyles before startup for stability. */
+ EXOSC_START_128CLK = AVR32_PM_OSCCTRL0_STARTUP_128_RCOSC, /**< Wait 128 clock cyles before startup for stability. */
+ EXOSC_START_2048CLK = AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC, /**< Wait 2048 clock cyles before startup for stability. */
+ EXOSC_START_4096CLK = AVR32_PM_OSCCTRL0_STARTUP_4096_RCOSC, /**< Wait 4096 clock cyles before startup for stability. */
+ EXOSC_START_8192CLK = AVR32_PM_OSCCTRL0_STARTUP_8192_RCOSC, /**< Wait 8192 clock cyles before startup for stability. */
+ EXOSC_START_16384CLK = AVR32_PM_OSCCTRL0_STARTUP_16384_RCOSC, /**< Wait 16384 clock cyles before startup for stability. */
+ };
+
+ /** Enum for the possible module clock sources. */
+ enum UC3_System_ClockSource_t
+ {
+ CLOCK_SRC_SLOW_CLK = 0, /**< Clock sourced from the internal slow clock. */
+ CLOCK_SRC_OSC0 = 1, /**< Clock sourced from the Oscillator 0 clock. */
+ CLOCK_SRC_OSC1 = 2, /**< Clock sourced from the Oscillator 1 clock. */
+ CLOCK_SRC_PLL0 = 3, /**< Clock sourced from the PLL 0 clock. */
+ CLOCK_SRC_PLL1 = 4, /**< Clock sourced from the PLL 1 clock. */
+ };
+
+ /* Inline Functions: */
+ /** Starts the given external oscillator of the UC3 microcontroller, with the given options. This routine blocks until
+ * the oscillator is ready for use.
+ *
+ * \param[in] Channel Index of the external oscillator to start.
+ * \param[in] Type Type of clock attached to the given oscillator channel, a value from \ref UC3_Extern_OSC_ClockTypes_t.
+ * \param[in] Startup Statup time of the external oscillator, a value from \ref UC3_Extern_OSC_ClockStartup_t.
+ *
+ * \return Boolean \c true if the external oscillator was successfully started, \c false if invalid parameters specified.
+ */
+ static inline bool AVR32CLK_StartExternalOscillator(const uint8_t Channel,
+ const uint8_t Type,
+ const uint8_t Startup) ATTR_ALWAYS_INLINE;
+ static inline bool AVR32CLK_StartExternalOscillator(const uint8_t Channel,
+ const uint8_t Type,
+ const uint8_t Startup)
+ {
+ switch (Channel)
+ {
+ case 0:
+ AVR32_PM.OSCCTRL0.startup = Startup;
+ AVR32_PM.OSCCTRL0.mode = Type;
+ break;
+ case 1:
+ AVR32_PM.OSCCTRL1.startup = Startup;
+ AVR32_PM.OSCCTRL1.mode = Type;
+ break;
+ default:
+ return false;
+ }
+
+ AVR32_PM.mcctrl |= (1 << (AVR32_PM_MCCTRL_OSC0EN_OFFSET + Channel));
+
+ while (!(AVR32_PM.poscsr & (1 << (AVR32_PM_POSCSR_OSC0RDY_OFFSET + Channel))));
+ return true;
+ }
+
+ /** Stops the given external oscillator of the UC3 microcontroller.
+ *
+ * \param[in] Channel Index of the external oscillator to stop.
+ */
+ static inline void AVR32CLK_StopExternalOscillator(const uint8_t Channel) ATTR_ALWAYS_INLINE;
+ static inline void AVR32CLK_StopExternalOscillator(const uint8_t Channel)
+ {
+ AVR32_PM.mcctrl &= ~(1 << (AVR32_PM_MCCTRL_OSC0EN_OFFSET + Channel));
+ }
+
+ /** Starts the given PLL of the UC3 microcontroller, with the given options. This routine blocks until the PLL is ready for use.
+ *
+ * \note The output frequency must be equal to or greater than the source frequency.
+ *
+ * \param[in] Channel Index of the PLL to start.
+ * \param[in] Source Clock source for the PLL, a value from \ref UC3_System_ClockSource_t.
+ * \param[in] SourceFreq Frequency of the PLL's clock source, in Hz.
+ * \param[in] Frequency Target frequency of the PLL's output.
+ *
+ * \return Boolean \c true if the PLL was successfully started, \c false if invalid parameters specified.
+ */
+ static inline bool AVR32CLK_StartPLL(const uint8_t Channel,
+ const uint8_t Source,
+ const uint32_t SourceFreq,
+ const uint32_t Frequency) ATTR_ALWAYS_INLINE;
+ static inline bool AVR32CLK_StartPLL(const uint8_t Channel,
+ const uint8_t Source,
+ const uint32_t SourceFreq,
+ const uint32_t Frequency)
+ {
+ if (SourceFreq > Frequency)
+ return false;
+
+ switch (Source)
+ {
+ case CLOCK_SRC_OSC0:
+ AVR32_PM.PLL[Channel].pllosc = 0;
+ break;
+ case CLOCK_SRC_OSC1:
+ AVR32_PM.PLL[Channel].pllosc = 1;
+ break;
+ default:
+ return false;
+ }
+
+ AVR32_PM.PLL[Channel].pllmul = (Frequency / SourceFreq) ? (((Frequency / SourceFreq) - 1) / 2) : 0;
+ AVR32_PM.PLL[Channel].plldiv = 0;
+ AVR32_PM.PLL[Channel].pllen = true;
+
+ while (!(AVR32_PM.poscsr & (1 << (AVR32_PM_POSCSR_LOCK0_OFFSET + Channel))));
+ return true;
+ }
+
+ /** Stops the given PLL of the UC3 microcontroller.
+ *
+ * \param[in] Channel Index of the PLL to stop.
+ */
+ static inline void AVR32CLK_StopPLL(const uint8_t Channel) ATTR_ALWAYS_INLINE;
+ static inline void AVR32CLK_StopPLL(const uint8_t Channel)
+ {
+ AVR32_PM.PLL[Channel].pllen = false;
+ }
+
+ /** Starts the given Generic Clock of the UC3 microcontroller, with the given options.
+ *
+ * \param[in] Channel Index of the Generic Clock to start.
+ * \param[in] Source Clock source for the Generic Clock, a value from \ref UC3_System_ClockSource_t.
+ * \param[in] SourceFreq Frequency of the Generic Clock's clock source, in Hz.
+ * \param[in] Frequency Target frequency of the Generic Clock's output.
+ *
+ * \return Boolean \c true if the Generic Clock was successfully started, \c false if invalid parameters specified.
+ */
+ static inline bool AVR32CLK_StartGenericClock(const uint8_t Channel,
+ const uint8_t Source,
+ const uint32_t SourceFreq,
+ const uint32_t Frequency) ATTR_ALWAYS_INLINE;
+ static inline bool AVR32CLK_StartGenericClock(const uint8_t Channel,
+ const uint8_t Source,
+ const uint32_t SourceFreq,
+ const uint32_t Frequency)
+ {
+ switch (Source)
+ {
+ case CLOCK_SRC_OSC0:
+ AVR32_PM.GCCTRL[Channel].pllsel = false;
+ AVR32_PM.GCCTRL[Channel].oscsel = 0;
+ break;
+ case CLOCK_SRC_OSC1:
+ AVR32_PM.GCCTRL[Channel].pllsel = false;
+ AVR32_PM.GCCTRL[Channel].oscsel = 1;
+ break;
+ case CLOCK_SRC_PLL0:
+ AVR32_PM.GCCTRL[Channel].pllsel = true;
+ AVR32_PM.GCCTRL[Channel].oscsel = 0;
+ break;
+ case CLOCK_SRC_PLL1:
+ AVR32_PM.GCCTRL[Channel].pllsel = true;
+ AVR32_PM.GCCTRL[Channel].oscsel = 1;
+ break;
+ default:
+ return false;
+ }
+
+ if (SourceFreq < Frequency)
+ return false;
+
+ AVR32_PM.GCCTRL[Channel].diven = (SourceFreq > Frequency) ? true : false;
+ AVR32_PM.GCCTRL[Channel].div = (((SourceFreq / Frequency) - 1) / 2);
+ AVR32_PM.GCCTRL[Channel].cen = true;
+
+ return true;
+ }
+
+ /** Stops the given generic clock of the UC3 microcontroller.
+ *
+ * \param[in] Channel Index of the generic clock to stop.
+ */
+ static inline void AVR32CLK_StopGenericClock(const uint8_t Channel) ATTR_ALWAYS_INLINE;
+ static inline void AVR32CLK_StopGenericClock(const uint8_t Channel)
+ {
+ AVR32_PM.GCCTRL[Channel].cen = false;
+ }
+
+ /** Sets the clock source for the main microcontroller core. The given clock source should be configured
+ * and ready for use before this function is called.
+ *
+ * This function will configure the FLASH controller's wait states automatically to suit the given clock source.
+ *
+ * \param[in] Source Clock source for the CPU core, a value from \ref UC3_System_ClockSource_t.
+ * \param[in] SourceFreq Frequency of the CPU core's clock source, in Hz.
+ *
+ * \return Boolean \c true if the CPU core clock was sucessfully altered, \c false if invalid parameters specified.
+ */
+ static inline bool AVR32CLK_SetCPUClockSource(const uint8_t Source,
+ const uint32_t SourceFreq) ATTR_ALWAYS_INLINE;
+ static inline bool AVR32CLK_SetCPUClockSource(const uint8_t Source,
+ const uint32_t SourceFreq)
+ {
+ AVR32_FLASHC.FCR.fws = (SourceFreq > 30000000) ? true : false;
+
+ switch (Source)
+ {
+ #if defined(AVR32_PM_MCCTRL_MCSEL_SLOW)
+ case CLOCK_SRC_SLOW_CLK:
+ AVR32_PM.MCCTRL.mcsel = AVR32_PM_MCCTRL_MCSEL_SLOW;
+ break;
+ #endif
+ #if defined(AVR32_PM_MCCTRL_MCSEL_OSC0)
+ case CLOCK_SRC_OSC0:
+ AVR32_PM.MCCTRL.mcsel = AVR32_PM_MCCTRL_MCSEL_OSC0;
+ break;
+ #endif
+ #if defined(AVR32_PM_MCCTRL_MCSEL_PLL0)
+ case CLOCK_SRC_PLL0:
+ AVR32_PM.MCCTRL.mcsel = AVR32_PM_MCCTRL_MCSEL_PLL0;
+ break;
+ #endif
+ default:
+ return false;
+ }
+
+ return true;
+ }
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Platform/UC3/Exception.S b/LUFA/Platform/UC3/Exception.S
index 9509fd7f2..ddfe00984 100644
--- a/LUFA/Platform/UC3/Exception.S
+++ b/LUFA/Platform/UC3/Exception.S
@@ -1,125 +1,125 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 <avr32/io.h>
-
-.section .exception_handlers, "ax", @progbits
-
-// ================= EXCEPTION TABLE ================
-.balign 0x200
-.global EVBA_Table
-EVBA_Table:
-
-.org 0x000
-Exception_Unrecoverable_Exception:
- rjmp $
-.org 0x004
-Exception_TLB_Multiple_Hit:
- rjmp $
-.org 0x008
-Exception_Bus_Error_Data_Fetch:
- rjmp $
-.org 0x00C
-Exception_Bus_Error_Instruction_Fetch:
- rjmp $
-.org 0x010
-Exception_NMI:
- rjmp $
-.org 0x014
-Exception_Instruction_Address:
- rjmp $
-.org 0x018
-Exception_ITLB_Protection:
- rjmp $
-.org 0x01C
-Exception_OCD_Breakpoint:
- rjmp $
-.org 0x020
-Exception_Illegal_Opcode:
- rjmp $
-.org 0x024
-Exception_Unimplemented_Instruction:
- rjmp $
-.org 0x028
-Exception_Privilege_Violation:
- rjmp $
-.org 0x02C
-Exception_Floating_Point:
- rjmp $
-.org 0x030
-Exception_Coprocessor_Absent:
- rjmp $
-.org 0x034
-Exception_Data_Address_Read:
- rjmp $
-.org 0x038
-Exception_Data_Address_Write:
- rjmp $
-.org 0x03C
-Exception_DTLB_Protection_Read:
- rjmp $
-.org 0x040
-Exception_DTLB_Protection_Write:
- rjmp $
-.org 0x044
-Exception_DTLB_Modified:
- rjmp $
-.org 0x050
-Exception_ITLB_Miss:
- rjmp $
-.org 0x060
-Exception_DTLB_Miss_Read:
- rjmp $
-.org 0x070
-Exception_DTLB_Miss_Write:
- rjmp $
-.org 0x100
-Exception_Supervisor_Call:
- rjmp $
-// ============== END OF EXCEPTION TABLE =============
-
-// ============= GENERAL INTERRUPT HANDLER ===========
-.balign 4
-.irp Level, 0, 1, 2, 3
-Exception_INT\Level:
- mov r12, \Level
- call INTC_GetInterruptHandler
- mov pc, r12
-.endr
-// ========= END OF GENERAL INTERRUPT HANDLER ========
-
-// ====== GENERAL INTERRUPT HANDLER OFFSET TABLE ======
-.balign 4
-.global Autovector_Table
-Autovector_Table:
-.irp Level, 0, 1, 2, 3
- .word ((AVR32_INTC_INT0 + \Level) << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (Exception_INT\Level - EVBA_Table)
-.endr
-// === END OF GENERAL INTERRUPT HANDLER OFFSET TABLE ===
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 <avr32/io.h>
+
+.section .exception_handlers, "ax", @progbits
+
+// ================= EXCEPTION TABLE ================
+.balign 0x200
+.global EVBA_Table
+EVBA_Table:
+
+.org 0x000
+Exception_Unrecoverable_Exception:
+ rjmp $
+.org 0x004
+Exception_TLB_Multiple_Hit:
+ rjmp $
+.org 0x008
+Exception_Bus_Error_Data_Fetch:
+ rjmp $
+.org 0x00C
+Exception_Bus_Error_Instruction_Fetch:
+ rjmp $
+.org 0x010
+Exception_NMI:
+ rjmp $
+.org 0x014
+Exception_Instruction_Address:
+ rjmp $
+.org 0x018
+Exception_ITLB_Protection:
+ rjmp $
+.org 0x01C
+Exception_OCD_Breakpoint:
+ rjmp $
+.org 0x020
+Exception_Illegal_Opcode:
+ rjmp $
+.org 0x024
+Exception_Unimplemented_Instruction:
+ rjmp $
+.org 0x028
+Exception_Privilege_Violation:
+ rjmp $
+.org 0x02C
+Exception_Floating_Point:
+ rjmp $
+.org 0x030
+Exception_Coprocessor_Absent:
+ rjmp $
+.org 0x034
+Exception_Data_Address_Read:
+ rjmp $
+.org 0x038
+Exception_Data_Address_Write:
+ rjmp $
+.org 0x03C
+Exception_DTLB_Protection_Read:
+ rjmp $
+.org 0x040
+Exception_DTLB_Protection_Write:
+ rjmp $
+.org 0x044
+Exception_DTLB_Modified:
+ rjmp $
+.org 0x050
+Exception_ITLB_Miss:
+ rjmp $
+.org 0x060
+Exception_DTLB_Miss_Read:
+ rjmp $
+.org 0x070
+Exception_DTLB_Miss_Write:
+ rjmp $
+.org 0x100
+Exception_Supervisor_Call:
+ rjmp $
+// ============== END OF EXCEPTION TABLE =============
+
+// ============= GENERAL INTERRUPT HANDLER ===========
+.balign 4
+.irp Level, 0, 1, 2, 3
+Exception_INT\Level:
+ mov r12, \Level
+ call INTC_GetInterruptHandler
+ mov pc, r12
+.endr
+// ========= END OF GENERAL INTERRUPT HANDLER ========
+
+// ====== GENERAL INTERRUPT HANDLER OFFSET TABLE ======
+.balign 4
+.global Autovector_Table
+Autovector_Table:
+.irp Level, 0, 1, 2, 3
+ .word ((AVR32_INTC_INT0 + \Level) << AVR32_INTC_IPR_INTLEVEL_OFFSET) | (Exception_INT\Level - EVBA_Table)
+.endr
+// === END OF GENERAL INTERRUPT HANDLER OFFSET TABLE ===
diff --git a/LUFA/Platform/UC3/InterruptManagement.c b/LUFA/Platform/UC3/InterruptManagement.c
index 2e260b38b..98d1e45f5 100644
--- a/LUFA/Platform/UC3/InterruptManagement.c
+++ b/LUFA/Platform/UC3/InterruptManagement.c
@@ -1,62 +1,62 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 "InterruptManagement.h"
-
-/** Interrupt vector table, containing the ISR to call for each interrupt group */
-InterruptHandlerPtr_t InterruptHandlers[AVR32_INTC_NUM_INT_GRPS];
-
-/** ISR for unhandled interrupt groups */
-ISR(Unhandled_Interrupt)
-{
- for (;;);
-}
-
-/** Retrieves the associated interrupt handler for the interrupt group currently being fired. This
- * is called directly from the exception handler routine before dispatching to the ISR.
- */
-InterruptHandlerPtr_t INTC_GetInterruptHandler(const uint_reg_t InterruptLevel)
-{
- return InterruptHandlers[AVR32_INTC.icr[AVR32_INTC_INT3 - InterruptLevel]];
-}
-
-/** Initializes the interrupt controller ready to handle interrupts. This must be called at the
- * start of the user program before any interrupts are registered or enabled.
- */
-void INTC_Init(void)
-{
- for (uint8_t InterruptGroup = 0; InterruptGroup < AVR32_INTC_NUM_INT_GRPS; InterruptGroup++)
- {
- InterruptHandlers[InterruptGroup] = Unhandled_Interrupt;
- AVR32_INTC.ipr[InterruptGroup] = Autovector_Table[AVR32_INTC_INT0];
- }
-
- __builtin_mtsr(AVR32_EVBA, (uintptr_t)&EVBA_Table);
-}
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 "InterruptManagement.h"
+
+/** Interrupt vector table, containing the ISR to call for each interrupt group */
+InterruptHandlerPtr_t InterruptHandlers[AVR32_INTC_NUM_INT_GRPS];
+
+/** ISR for unhandled interrupt groups */
+ISR(Unhandled_Interrupt)
+{
+ for (;;);
+}
+
+/** Retrieves the associated interrupt handler for the interrupt group currently being fired. This
+ * is called directly from the exception handler routine before dispatching to the ISR.
+ */
+InterruptHandlerPtr_t INTC_GetInterruptHandler(const uint_reg_t InterruptLevel)
+{
+ return InterruptHandlers[AVR32_INTC.icr[AVR32_INTC_INT3 - InterruptLevel]];
+}
+
+/** Initializes the interrupt controller ready to handle interrupts. This must be called at the
+ * start of the user program before any interrupts are registered or enabled.
+ */
+void INTC_Init(void)
+{
+ for (uint8_t InterruptGroup = 0; InterruptGroup < AVR32_INTC_NUM_INT_GRPS; InterruptGroup++)
+ {
+ InterruptHandlers[InterruptGroup] = Unhandled_Interrupt;
+ AVR32_INTC.ipr[InterruptGroup] = Autovector_Table[AVR32_INTC_INT0];
+ }
+
+ __builtin_mtsr(AVR32_EVBA, (uintptr_t)&EVBA_Table);
+}
diff --git a/LUFA/Platform/UC3/InterruptManagement.h b/LUFA/Platform/UC3/InterruptManagement.h
index 67dc3ea1d..dd70675c3 100644
--- a/LUFA/Platform/UC3/InterruptManagement.h
+++ b/LUFA/Platform/UC3/InterruptManagement.h
@@ -1,162 +1,162 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Interrupt Controller Driver for the AVR32 UC3 microcontrollers.
- *
- * Interrupt controller driver for the AVR32 UC3 microcontrollers, for the configuration of interrupt
- * handlers within the device.
- */
-
-/** \ingroup Group_PlatformDrivers
- * \defgroup Group_PlatformDrivers_UC3Interrupts UC3 Interrupt Controller Driver - LUFA/Platform/UC3/InterruptManagement.h
- * \brief Interrupt Controller Driver for the AVR32 UC3 microcontrollers.
- *
- * \section Sec_Dependencies Module Source Dependencies
- * The following files must be built with any user project that uses this module:
- * - LUFA/Platform/UC3/InterruptManagement.c
- * - LUFA/Platform/UC3/Exception.S
- *
- * \section Sec_ModDescription Module Description
- * Interrupt controller driver for the AVR32 UC3 microcontrollers, for the configuration of interrupt
- * handlers within the device.
- *
- * Usage Example:
- * \code
- * #include <LUFA/Platform/UC3/InterruptManagement.h>
- *
- * ISR(USB_Group_IRQ_Handler)
- * {
- * // USB group handler code here
- * }
- *
- * void main(void)
- * {
- * INTC_Init();
- * INTC_RegisterGroupHandler(INTC_IRQ_GROUP(AVR32_USBB_IRQ), AVR32_INTC_INT0, USB_Group_IRQ_Handler);
- * }
- * \endcode
- *
- * @{
- */
-
-#ifndef _UC3_INTERRUPT_MANAGEMENT_H_
-#define _UC3_INTERRUPT_MANAGEMENT_H_
-
- /* Includes: */
- #include <LUFA/Common/Common.h>
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Private Interface - For use in library only: */
- #if !defined(__DOXYGEN__)
- /* Type Defines: */
- typedef void (*InterruptHandlerPtr_t)(void);
-
- /* External Variables: */
- extern const void EVBA_Table;
- extern const uint32_t Autovector_Table[];
- extern InterruptHandlerPtr_t InterruptHandlers[AVR32_INTC_NUM_INT_GRPS];
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** Converts a given interrupt index into its assocated interrupt group.
- *
- * \param[in] IRQIndex Index of the interrupt request to convert.
- *
- * \return Interrupt group number associated with the interrupt index.
- */
- #define INTC_IRQ_GROUP(IRQIndex) (IRQIndex / 32)
-
- /** Converts a given interrupt index into its assocated interrupt line.
- *
- * \param[in] IRQIndex Index of the interrupt request to convert.
- *
- * \return Interrupt line number associated with the interrupt index.
- */
- #define INTC_IRQ_LINE(IRQIndex) (IRQIndex % 32)
-
- /* Function Prototypes: */
- /** Initializes the interrupt controller, nulling out all interrupt handlers ready for new registration. This
- * function should be called once on startup to ensure the interrupt controller is ready for use.
- */
- void INTC_Init(void);
-
- /* Inline Functions: */
- /** Registers a handler for a given interrupt group. On the AVR32 UC3 devices, interrupts are grouped by
- * peripheral. To save on SRAM used, a single ISR handles all interrupt lines within a single group - to
- * determine the exact line that has interrupted within the group ISR handler, use \ref INTC_GetGroupInterrupts().
- *
- * If multiple interrupts with the same group are registered, the last registered handler will become the
- * handler called for interrupts raised within that group.
- *
- * To obtain the group number of a specific interrupt index, use the \ref INTC_IRQ_GROUP() macro.
- *
- * \param[in] GroupNumber Group number of the interrupt group to register a handler for.
- * \param[in] InterruptLevel Priority level for the specified interrupt, a \c AVR32_INTC_INT* mask.
- * \param[in] Handler Address of the ISR handler for the interrupt group.
- */
- static inline void INTC_RegisterGroupHandler(const uint16_t GroupNumber,
- const uint8_t InterruptLevel,
- const InterruptHandlerPtr_t Handler) ATTR_ALWAYS_INLINE;
- static inline void INTC_RegisterGroupHandler(const uint16_t GroupNumber,
- const uint8_t InterruptLevel,
- const InterruptHandlerPtr_t Handler)
- {
- InterruptHandlers[GroupNumber] = Handler;
- AVR32_INTC.ipr[GroupNumber] = Autovector_Table[InterruptLevel];
- }
-
- /** Retrieves the pending interrupts for a given interrupt group. The result of this function should be masked
- * against interrupt request indexes converted to a request line number via the \ref INTC_IRQ_LINE() macro. To
- * obtain the group number of a given interrupt request, use the \ref INTC_IRQ_GROUP() macro.
- *
- * \param[in] GroupNumber Group number of the interrupt group to check.
- *
- * \return Mask of pending interrupt lines for the given interrupt group.
- */
- static inline uint_reg_t INTC_GetGroupInterrupts(const uint16_t GroupNumber) ATTR_ALWAYS_INLINE;
- static inline uint_reg_t INTC_GetGroupInterrupts(const uint16_t GroupNumber)
- {
- return AVR32_INTC.irr[GroupNumber];
- }
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Interrupt Controller Driver for the AVR32 UC3 microcontrollers.
+ *
+ * Interrupt controller driver for the AVR32 UC3 microcontrollers, for the configuration of interrupt
+ * handlers within the device.
+ */
+
+/** \ingroup Group_PlatformDrivers
+ * \defgroup Group_PlatformDrivers_UC3Interrupts UC3 Interrupt Controller Driver - LUFA/Platform/UC3/InterruptManagement.h
+ * \brief Interrupt Controller Driver for the AVR32 UC3 microcontrollers.
+ *
+ * \section Sec_Dependencies Module Source Dependencies
+ * The following files must be built with any user project that uses this module:
+ * - LUFA/Platform/UC3/InterruptManagement.c
+ * - LUFA/Platform/UC3/Exception.S
+ *
+ * \section Sec_ModDescription Module Description
+ * Interrupt controller driver for the AVR32 UC3 microcontrollers, for the configuration of interrupt
+ * handlers within the device.
+ *
+ * Usage Example:
+ * \code
+ * #include <LUFA/Platform/UC3/InterruptManagement.h>
+ *
+ * ISR(USB_Group_IRQ_Handler)
+ * {
+ * // USB group handler code here
+ * }
+ *
+ * void main(void)
+ * {
+ * INTC_Init();
+ * INTC_RegisterGroupHandler(INTC_IRQ_GROUP(AVR32_USBB_IRQ), AVR32_INTC_INT0, USB_Group_IRQ_Handler);
+ * }
+ * \endcode
+ *
+ * @{
+ */
+
+#ifndef _UC3_INTERRUPT_MANAGEMENT_H_
+#define _UC3_INTERRUPT_MANAGEMENT_H_
+
+ /* Includes: */
+ #include <LUFA/Common/Common.h>
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Private Interface - For use in library only: */
+ #if !defined(__DOXYGEN__)
+ /* Type Defines: */
+ typedef void (*InterruptHandlerPtr_t)(void);
+
+ /* External Variables: */
+ extern const void EVBA_Table;
+ extern const uint32_t Autovector_Table[];
+ extern InterruptHandlerPtr_t InterruptHandlers[AVR32_INTC_NUM_INT_GRPS];
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** Converts a given interrupt index into its assocated interrupt group.
+ *
+ * \param[in] IRQIndex Index of the interrupt request to convert.
+ *
+ * \return Interrupt group number associated with the interrupt index.
+ */
+ #define INTC_IRQ_GROUP(IRQIndex) (IRQIndex / 32)
+
+ /** Converts a given interrupt index into its assocated interrupt line.
+ *
+ * \param[in] IRQIndex Index of the interrupt request to convert.
+ *
+ * \return Interrupt line number associated with the interrupt index.
+ */
+ #define INTC_IRQ_LINE(IRQIndex) (IRQIndex % 32)
+
+ /* Function Prototypes: */
+ /** Initializes the interrupt controller, nulling out all interrupt handlers ready for new registration. This
+ * function should be called once on startup to ensure the interrupt controller is ready for use.
+ */
+ void INTC_Init(void);
+
+ /* Inline Functions: */
+ /** Registers a handler for a given interrupt group. On the AVR32 UC3 devices, interrupts are grouped by
+ * peripheral. To save on SRAM used, a single ISR handles all interrupt lines within a single group - to
+ * determine the exact line that has interrupted within the group ISR handler, use \ref INTC_GetGroupInterrupts().
+ *
+ * If multiple interrupts with the same group are registered, the last registered handler will become the
+ * handler called for interrupts raised within that group.
+ *
+ * To obtain the group number of a specific interrupt index, use the \ref INTC_IRQ_GROUP() macro.
+ *
+ * \param[in] GroupNumber Group number of the interrupt group to register a handler for.
+ * \param[in] InterruptLevel Priority level for the specified interrupt, a \c AVR32_INTC_INT* mask.
+ * \param[in] Handler Address of the ISR handler for the interrupt group.
+ */
+ static inline void INTC_RegisterGroupHandler(const uint16_t GroupNumber,
+ const uint8_t InterruptLevel,
+ const InterruptHandlerPtr_t Handler) ATTR_ALWAYS_INLINE;
+ static inline void INTC_RegisterGroupHandler(const uint16_t GroupNumber,
+ const uint8_t InterruptLevel,
+ const InterruptHandlerPtr_t Handler)
+ {
+ InterruptHandlers[GroupNumber] = Handler;
+ AVR32_INTC.ipr[GroupNumber] = Autovector_Table[InterruptLevel];
+ }
+
+ /** Retrieves the pending interrupts for a given interrupt group. The result of this function should be masked
+ * against interrupt request indexes converted to a request line number via the \ref INTC_IRQ_LINE() macro. To
+ * obtain the group number of a given interrupt request, use the \ref INTC_IRQ_GROUP() macro.
+ *
+ * \param[in] GroupNumber Group number of the interrupt group to check.
+ *
+ * \return Mask of pending interrupt lines for the given interrupt group.
+ */
+ static inline uint_reg_t INTC_GetGroupInterrupts(const uint16_t GroupNumber) ATTR_ALWAYS_INLINE;
+ static inline uint_reg_t INTC_GetGroupInterrupts(const uint16_t GroupNumber)
+ {
+ return AVR32_INTC.irr[GroupNumber];
+ }
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */
diff --git a/LUFA/Platform/XMEGA/ClockManagement.h b/LUFA/Platform/XMEGA/ClockManagement.h
index 9e6a0f4b1..62e9284d3 100644
--- a/LUFA/Platform/XMEGA/ClockManagement.h
+++ b/LUFA/Platform/XMEGA/ClockManagement.h
@@ -1,298 +1,298 @@
-/*
- LUFA Library
- Copyright (C) Dean Camera, 2011.
-
- dean [at] fourwalledcubicle [dot] com
- www.lufa-lib.org
-*/
-
-/*
- Copyright 2011 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 disclaim 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 Module Clock Driver for the AVR USB XMEGA microcontrollers.
- *
- * Clock management driver for the AVR USB XMEGA microcontrollers. This driver allows for the configuration
- * of the various clocks within the device to clock the various peripherals.
- */
-
-/** \ingroup Group_PlatformDrivers
- * \defgroup Group_PlatformDrivers_XMEGAClocks AVR USB XMEGA Clock Management Driver - LUFA/Platform/XMEGA/ClockManagement.h
- * \brief Module Clock Driver for the AVR USB XMEGA microcontrollers.
- *
- * \section Sec_Dependencies Module Source Dependencies
- * The following files must be built with any user project that uses this module:
- * - None
- *
- * \section Sec_ModDescription Module Description
- * Clock management driver for the AVR USB XMEGA microcontrollers. This driver allows for the configuration
- * of the various clocks within the device to clock the various peripherals.
- *
- * Usage Example:
- * \code
- * #include <LUFA/Platform/XMEGA/ClockManagement.h>
- *
- * void main(void)
- * {
- * // Start the internal 32MHz RC oscillator and switch the CPU core to run from it
- * AVR32CLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ);
- * XMEGACLK_SetCPUClockSource(CLOCK_SRC_INT_RC32MHZ, F_CPU);
- *
- * // Start the external oscillator and multiply up the frequency
- * AVR32CLK_StartExternalOscillator(EXOSC_FREQ_9MHZ_MAX, EXOSC_START_1KCLK);
- * AVR32CLK_StartPLL(CLOCK_SRC_XOSC, 8000000, F_USB);
- * }
- * \endcode
- *
- * @{
- */
-
-#ifndef _XMEGA_CLOCK_MANAGEMENT_H_
-#define _XMEGA_CLOCK_MANAGEMENT_H_
-
- /* Includes: */
- #include <LUFA/Common/Common.h>
-
- /* Enable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- extern "C" {
- #endif
-
- /* Public Interface - May be used in end-application: */
- /* Macros: */
- /** Enum for the possible external oscillator frequency ranges. */
- enum XMEGA_Extern_OSC_ClockFrequency_t
- {
- EXOSC_FREQ_2MHZ_MAX = OSC_FRQRANGE_04TO2_gc, /**< External crystal oscillator equal to or slower than 2MHz. */
- EXOSC_FREQ_9MHZ_MAX = OSC_FRQRANGE_2TO9_gc, /**< External crystal oscillator equal to or slower than 9MHz. */
- EXOSC_FREQ_12MHZ_MAX = OSC_FRQRANGE_9TO12_gc, /**< External crystal oscillator equal to or slower than 12MHz. */
- EXOSC_FREQ_16MHZ_MAX = OSC_FRQRANGE_12TO16_gc, /**< External crystal oscillator equal to or slower than 16MHz. */
- };
-
- /** Enum for the possible external oscillator statup times. */
- enum XMEGA_Extern_OSC_ClockStartup_t
- {
- EXOSC_START_6CLK = OSC_XOSCSEL_EXTCLK_gc, /**< Wait 6 clock cycles before startup (external clock). */
- EXOSC_START_32KCLK = OSC_XOSCSEL_32KHz_gc, /**< Wait 32K clock cycles before startup (32.768KHz crystal). */
- EXOSC_START_256CLK = OSC_XOSCSEL_XTAL_256CLK_gc, /**< Wait 256 clock cycles before startup. */
- EXOSC_START_1KCLK = OSC_XOSCSEL_XTAL_1KCLK_gc, /**< Wait 1K clock cycles before startup. */
- EXOSC_START_16KCLK = OSC_XOSCSEL_XTAL_16KCLK_gc, /**< Wait 16K clock cycles before startup. */
- };
-
- /** Enum for the possible module clock sources. */
- enum XMEGA_System_ClockSource_t
- {
- CLOCK_SRC_INT_RC2MHZ = 0, /**< Clock sourced from the Internal 2MHz RC Oscillator clock. */
- CLOCK_SRC_INT_RC32MHZ = 1, /**< Clock sourced from the Internal 32MHz RC Oscillator clock. */
- CLOCK_SRC_INT_RC32KHZ = 2, /**< Clock sourced from the Internal 32KHz RC Oscillator clock. */
- CLOCK_SRC_XOSC = 3, /**< Clock sourced from the External Oscillator clock. */
- CLOCK_SRC_PLL = 4, /**< Clock sourced from the Internal PLL clock. */
- };
-
- /* Inline Functions: */
- /** Starts the external oscillator of the XMEGA microcontroller, with the given options. This routine blocks until
- * the oscillator is ready for use.
- *
- * \param[in] FreqRange Frequency range of the external oscillator, a value from \ref XMEGA_Extern_OSC_ClockFrequency_t.
- * \param[in] Startup Statup time of the external oscillator, a value from \ref XMEGA_Extern_OSC_ClockStartup_t.
- *
- * \return Boolean \c true if the external oscillator was successfully started, \c false if invalid parameters specified.
- */
- static inline bool AVR32CLK_StartExternalOscillator(const uint8_t FreqRange,
- const uint8_t Startup) ATTR_ALWAYS_INLINE;
- static inline bool AVR32CLK_StartExternalOscillator(const uint8_t FreqRange,
- const uint8_t Startup)
- {
- OSC.XOSCCTRL = (FreqRange | ((Startup == EXOSC_START_32KCLK) ? OSC_X32KLPM_bm : 0) | Startup);
- OSC.CTRL |= OSC_XOSCEN_bm;
-
- while (!(OSC.STATUS & OSC_XOSCRDY_bm));
- return true;
- }
-
- /** Stops the external oscillator of the XMEGA microcontroller. */
- static inline void AVR32CLK_StopExternalOscillator(void) ATTR_ALWAYS_INLINE;
- static inline void AVR32CLK_StopExternalOscillator(void)
- {
- OSC.CTRL &= ~OSC_XOSCEN_bm;
- }
-
- /** Starts the given internal oscillator of the XMEGA microcontroller, with the given options. This routine blocks until
- * the oscillator is ready for use.
- *
- * \param[in] Source Internal oscillator to start, a value from \ref XMEGA_System_ClockSource_t.
- *
- * \return Boolean \c true if the internal oscillator was successfully started, \c false if invalid parameters specified.
- */
- static inline uint8_t AVR32CLK_StartInternalOscillator(const uint8_t Source) ATTR_ALWAYS_INLINE;
- static inline uint8_t AVR32CLK_StartInternalOscillator(const uint8_t Source)
- {
- switch (Source)
- {
- case CLOCK_SRC_INT_RC2MHZ:
- OSC.CTRL |= OSC_RC2MEN_bm;
- while (!(OSC.STATUS & OSC_RC2MRDY_bm));
- return true;
- case CLOCK_SRC_INT_RC32MHZ:
- OSC.CTRL |= OSC_RC32MEN_bm;
- while (!(OSC.STATUS & OSC_RC32MRDY_bm));
- return true;
- case CLOCK_SRC_INT_RC32KHZ:
- OSC.CTRL |= OSC_RC32KEN_bm;
- while (!(OSC.STATUS & OSC_RC32KRDY_bm));
- return true;
- }
-
- return false;
- }
-
- /** Stops the given internal oscillator of the XMEGA microcontroller.
- *
- * \param[in] Source Internal oscillator to stop, a value from \ref XMEGA_System_ClockSource_t.
- *
- * \return Boolean \c true if the internal oscillator was successfully stopped, \c false if invalid parameters specified.
- */
- static inline bool AVR32CLK_StopInternalOscillator(const uint8_t Source) ATTR_ALWAYS_INLINE;
- static inline bool AVR32CLK_StopInternalOscillator(const uint8_t Source)
- {
- switch (Source)
- {
- case CLOCK_SRC_INT_RC2MHZ:
- OSC.CTRL &= ~OSC_RC2MEN_bm;
- return true;
- case CLOCK_SRC_INT_RC32MHZ:
- OSC.CTRL &= ~OSC_RC32MEN_bm;
- return true;
- case CLOCK_SRC_INT_RC32KHZ:
- OSC.CTRL &= ~OSC_RC32KEN_bm;
- return true;
- }
-
- return false;
- }
-
- /** Starts the PLL of the XMEGA microcontroller, with the given options. This routine blocks until the PLL is ready for use.
- *
- * \note The output frequency must be equal to or greater than the source frequency.
- *
- * \param[in] Source Clock source for the PLL, a value from \ref XMEGA_System_ClockSource_t.
- * \param[in] SourceFreq Frequency of the PLL's clock source, in Hz.
- * \param[in] Frequency Target frequency of the PLL's output.
- *
- * \return Boolean \c true if the PLL was successfully started, \c false if invalid parameters specified.
- */
- static inline bool AVR32CLK_StartPLL(const uint8_t Source,
- const uint32_t SourceFreq,
- const uint32_t Frequency) ATTR_ALWAYS_INLINE;
- static inline bool AVR32CLK_StartPLL(const uint8_t Source,
- const uint32_t SourceFreq,
- const uint32_t Frequency)
- {
- uint8_t MulFactor = (Frequency / SourceFreq);
-
- if (SourceFreq > Frequency)
- return false;
-
- switch (Source)
- {
- case CLOCK_SRC_INT_RC2MHZ:
- OSC.PLLCTRL = (OSC_PLLSRC_RC2M_gc | MulFactor);
- break;
- case CLOCK_SRC_INT_RC32MHZ:
- OSC.PLLCTRL = (OSC_PLLSRC_RC32M_gc | MulFactor);
- break;
- case CLOCK_SRC_XOSC:
- OSC.PLLCTRL = (OSC_PLLSRC_XOSC_gc | MulFactor);
- break;
- default:
- return false;
- }
-
- OSC.CTRL |= OSC_PLLEN_bm;
-
- while (!(OSC.STATUS & OSC_PLLRDY_bm));
- return true;
- }
-
- /** Stops the PLL of the XMEGA microcontroller. */
- static inline void AVR32CLK_StopPLL(void) ATTR_ALWAYS_INLINE;
- static inline void AVR32CLK_StopPLL(void)
- {
- OSC.CTRL &= ~OSC_PLLEN_bm;
- }
-
- /** Sets the clock source for the main microcontroller core. The given clock source should be configured
- * and ready for use before this function is called.
- *
- * \param[in] Source Clock source for the CPU core, a value from \ref XMEGA_System_ClockSource_t.
- * \param[in] SourceFreq Frequency of the CPU core's clock source, in Hz.
- *
- * \return Boolean \c true if the CPU core clock was sucessfully altered, \c false if invalid parameters specified.
- */
- static inline bool XMEGACLK_SetCPUClockSource(const uint8_t Source,
- const uint32_t SourceFreq) ATTR_ALWAYS_INLINE;
- static inline bool XMEGACLK_SetCPUClockSource(const uint8_t Source,
- const uint32_t SourceFreq)
- {
- uint8_t ClockSourceMask = 0;
-
- switch (Source)
- {
- case CLOCK_SRC_INT_RC2MHZ:
- ClockSourceMask = CLK_SCLKSEL_RC2M_gc;
- break;
- case CLOCK_SRC_INT_RC32MHZ:
- ClockSourceMask = CLK_SCLKSEL_RC32M_gc;
- break;
- case CLOCK_SRC_INT_RC32KHZ:
- ClockSourceMask = CLK_SCLKSEL_RC32K_gc;
- break;
- case CLOCK_SRC_XOSC:
- ClockSourceMask = CLK_SCLKSEL_XOSC_gc;
- break;
- case CLOCK_SRC_PLL:
- ClockSourceMask = CLK_SCLKSEL_PLL_gc;
- break;
- default:
- return false;
- }
-
- uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
- GlobalInterruptDisable();
-
- CCP = CCP_IOREG_gc;
- CLK.CTRL = ClockSourceMask;
-
- SetGlobalInterruptMask(CurrentGlobalInt);
-
- Delay_MS(1);
- return (CLK.CTRL == ClockSourceMask);
- }
-
- /* Disable C linkage for C++ Compilers: */
- #if defined(__cplusplus)
- }
- #endif
-
-#endif
-
-/** @} */
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2011.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2011 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 disclaim 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 Module Clock Driver for the AVR USB XMEGA microcontrollers.
+ *
+ * Clock management driver for the AVR USB XMEGA microcontrollers. This driver allows for the configuration
+ * of the various clocks within the device to clock the various peripherals.
+ */
+
+/** \ingroup Group_PlatformDrivers
+ * \defgroup Group_PlatformDrivers_XMEGAClocks AVR USB XMEGA Clock Management Driver - LUFA/Platform/XMEGA/ClockManagement.h
+ * \brief Module Clock Driver for the AVR USB XMEGA microcontrollers.
+ *
+ * \section Sec_Dependencies Module Source Dependencies
+ * The following files must be built with any user project that uses this module:
+ * - None
+ *
+ * \section Sec_ModDescription Module Description
+ * Clock management driver for the AVR USB XMEGA microcontrollers. This driver allows for the configuration
+ * of the various clocks within the device to clock the various peripherals.
+ *
+ * Usage Example:
+ * \code
+ * #include <LUFA/Platform/XMEGA/ClockManagement.h>
+ *
+ * void main(void)
+ * {
+ * // Start the internal 32MHz RC oscillator and switch the CPU core to run from it
+ * AVR32CLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ);
+ * XMEGACLK_SetCPUClockSource(CLOCK_SRC_INT_RC32MHZ, F_CPU);
+ *
+ * // Start the external oscillator and multiply up the frequency
+ * AVR32CLK_StartExternalOscillator(EXOSC_FREQ_9MHZ_MAX, EXOSC_START_1KCLK);
+ * AVR32CLK_StartPLL(CLOCK_SRC_XOSC, 8000000, F_USB);
+ * }
+ * \endcode
+ *
+ * @{
+ */
+
+#ifndef _XMEGA_CLOCK_MANAGEMENT_H_
+#define _XMEGA_CLOCK_MANAGEMENT_H_
+
+ /* Includes: */
+ #include <LUFA/Common/Common.h>
+
+ /* Enable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ extern "C" {
+ #endif
+
+ /* Public Interface - May be used in end-application: */
+ /* Macros: */
+ /** Enum for the possible external oscillator frequency ranges. */
+ enum XMEGA_Extern_OSC_ClockFrequency_t
+ {
+ EXOSC_FREQ_2MHZ_MAX = OSC_FRQRANGE_04TO2_gc, /**< External crystal oscillator equal to or slower than 2MHz. */
+ EXOSC_FREQ_9MHZ_MAX = OSC_FRQRANGE_2TO9_gc, /**< External crystal oscillator equal to or slower than 9MHz. */
+ EXOSC_FREQ_12MHZ_MAX = OSC_FRQRANGE_9TO12_gc, /**< External crystal oscillator equal to or slower than 12MHz. */
+ EXOSC_FREQ_16MHZ_MAX = OSC_FRQRANGE_12TO16_gc, /**< External crystal oscillator equal to or slower than 16MHz. */
+ };
+
+ /** Enum for the possible external oscillator statup times. */
+ enum XMEGA_Extern_OSC_ClockStartup_t
+ {
+ EXOSC_START_6CLK = OSC_XOSCSEL_EXTCLK_gc, /**< Wait 6 clock cycles before startup (external clock). */
+ EXOSC_START_32KCLK = OSC_XOSCSEL_32KHz_gc, /**< Wait 32K clock cycles before startup (32.768KHz crystal). */
+ EXOSC_START_256CLK = OSC_XOSCSEL_XTAL_256CLK_gc, /**< Wait 256 clock cycles before startup. */
+ EXOSC_START_1KCLK = OSC_XOSCSEL_XTAL_1KCLK_gc, /**< Wait 1K clock cycles before startup. */
+ EXOSC_START_16KCLK = OSC_XOSCSEL_XTAL_16KCLK_gc, /**< Wait 16K clock cycles before startup. */
+ };
+
+ /** Enum for the possible module clock sources. */
+ enum XMEGA_System_ClockSource_t
+ {
+ CLOCK_SRC_INT_RC2MHZ = 0, /**< Clock sourced from the Internal 2MHz RC Oscillator clock. */
+ CLOCK_SRC_INT_RC32MHZ = 1, /**< Clock sourced from the Internal 32MHz RC Oscillator clock. */
+ CLOCK_SRC_INT_RC32KHZ = 2, /**< Clock sourced from the Internal 32KHz RC Oscillator clock. */
+ CLOCK_SRC_XOSC = 3, /**< Clock sourced from the External Oscillator clock. */
+ CLOCK_SRC_PLL = 4, /**< Clock sourced from the Internal PLL clock. */
+ };
+
+ /* Inline Functions: */
+ /** Starts the external oscillator of the XMEGA microcontroller, with the given options. This routine blocks until
+ * the oscillator is ready for use.
+ *
+ * \param[in] FreqRange Frequency range of the external oscillator, a value from \ref XMEGA_Extern_OSC_ClockFrequency_t.
+ * \param[in] Startup Statup time of the external oscillator, a value from \ref XMEGA_Extern_OSC_ClockStartup_t.
+ *
+ * \return Boolean \c true if the external oscillator was successfully started, \c false if invalid parameters specified.
+ */
+ static inline bool AVR32CLK_StartExternalOscillator(const uint8_t FreqRange,
+ const uint8_t Startup) ATTR_ALWAYS_INLINE;
+ static inline bool AVR32CLK_StartExternalOscillator(const uint8_t FreqRange,
+ const uint8_t Startup)
+ {
+ OSC.XOSCCTRL = (FreqRange | ((Startup == EXOSC_START_32KCLK) ? OSC_X32KLPM_bm : 0) | Startup);
+ OSC.CTRL |= OSC_XOSCEN_bm;
+
+ while (!(OSC.STATUS & OSC_XOSCRDY_bm));
+ return true;
+ }
+
+ /** Stops the external oscillator of the XMEGA microcontroller. */
+ static inline void AVR32CLK_StopExternalOscillator(void) ATTR_ALWAYS_INLINE;
+ static inline void AVR32CLK_StopExternalOscillator(void)
+ {
+ OSC.CTRL &= ~OSC_XOSCEN_bm;
+ }
+
+ /** Starts the given internal oscillator of the XMEGA microcontroller, with the given options. This routine blocks until
+ * the oscillator is ready for use.
+ *
+ * \param[in] Source Internal oscillator to start, a value from \ref XMEGA_System_ClockSource_t.
+ *
+ * \return Boolean \c true if the internal oscillator was successfully started, \c false if invalid parameters specified.
+ */
+ static inline uint8_t AVR32CLK_StartInternalOscillator(const uint8_t Source) ATTR_ALWAYS_INLINE;
+ static inline uint8_t AVR32CLK_StartInternalOscillator(const uint8_t Source)
+ {
+ switch (Source)
+ {
+ case CLOCK_SRC_INT_RC2MHZ:
+ OSC.CTRL |= OSC_RC2MEN_bm;
+ while (!(OSC.STATUS & OSC_RC2MRDY_bm));
+ return true;
+ case CLOCK_SRC_INT_RC32MHZ:
+ OSC.CTRL |= OSC_RC32MEN_bm;
+ while (!(OSC.STATUS & OSC_RC32MRDY_bm));
+ return true;
+ case CLOCK_SRC_INT_RC32KHZ:
+ OSC.CTRL |= OSC_RC32KEN_bm;
+ while (!(OSC.STATUS & OSC_RC32KRDY_bm));
+ return true;
+ }
+
+ return false;
+ }
+
+ /** Stops the given internal oscillator of the XMEGA microcontroller.
+ *
+ * \param[in] Source Internal oscillator to stop, a value from \ref XMEGA_System_ClockSource_t.
+ *
+ * \return Boolean \c true if the internal oscillator was successfully stopped, \c false if invalid parameters specified.
+ */
+ static inline bool AVR32CLK_StopInternalOscillator(const uint8_t Source) ATTR_ALWAYS_INLINE;
+ static inline bool AVR32CLK_StopInternalOscillator(const uint8_t Source)
+ {
+ switch (Source)
+ {
+ case CLOCK_SRC_INT_RC2MHZ:
+ OSC.CTRL &= ~OSC_RC2MEN_bm;
+ return true;
+ case CLOCK_SRC_INT_RC32MHZ:
+ OSC.CTRL &= ~OSC_RC32MEN_bm;
+ return true;
+ case CLOCK_SRC_INT_RC32KHZ:
+ OSC.CTRL &= ~OSC_RC32KEN_bm;
+ return true;
+ }
+
+ return false;
+ }
+
+ /** Starts the PLL of the XMEGA microcontroller, with the given options. This routine blocks until the PLL is ready for use.
+ *
+ * \note The output frequency must be equal to or greater than the source frequency.
+ *
+ * \param[in] Source Clock source for the PLL, a value from \ref XMEGA_System_ClockSource_t.
+ * \param[in] SourceFreq Frequency of the PLL's clock source, in Hz.
+ * \param[in] Frequency Target frequency of the PLL's output.
+ *
+ * \return Boolean \c true if the PLL was successfully started, \c false if invalid parameters specified.
+ */
+ static inline bool AVR32CLK_StartPLL(const uint8_t Source,
+ const uint32_t SourceFreq,
+ const uint32_t Frequency) ATTR_ALWAYS_INLINE;
+ static inline bool AVR32CLK_StartPLL(const uint8_t Source,
+ const uint32_t SourceFreq,
+ const uint32_t Frequency)
+ {
+ uint8_t MulFactor = (Frequency / SourceFreq);
+
+ if (SourceFreq > Frequency)
+ return false;
+
+ switch (Source)
+ {
+ case CLOCK_SRC_INT_RC2MHZ:
+ OSC.PLLCTRL = (OSC_PLLSRC_RC2M_gc | MulFactor);
+ break;
+ case CLOCK_SRC_INT_RC32MHZ:
+ OSC.PLLCTRL = (OSC_PLLSRC_RC32M_gc | MulFactor);
+ break;
+ case CLOCK_SRC_XOSC:
+ OSC.PLLCTRL = (OSC_PLLSRC_XOSC_gc | MulFactor);
+ break;
+ default:
+ return false;
+ }
+
+ OSC.CTRL |= OSC_PLLEN_bm;
+
+ while (!(OSC.STATUS & OSC_PLLRDY_bm));
+ return true;
+ }
+
+ /** Stops the PLL of the XMEGA microcontroller. */
+ static inline void AVR32CLK_StopPLL(void) ATTR_ALWAYS_INLINE;
+ static inline void AVR32CLK_StopPLL(void)
+ {
+ OSC.CTRL &= ~OSC_PLLEN_bm;
+ }
+
+ /** Sets the clock source for the main microcontroller core. The given clock source should be configured
+ * and ready for use before this function is called.
+ *
+ * \param[in] Source Clock source for the CPU core, a value from \ref XMEGA_System_ClockSource_t.
+ * \param[in] SourceFreq Frequency of the CPU core's clock source, in Hz.
+ *
+ * \return Boolean \c true if the CPU core clock was sucessfully altered, \c false if invalid parameters specified.
+ */
+ static inline bool XMEGACLK_SetCPUClockSource(const uint8_t Source,
+ const uint32_t SourceFreq) ATTR_ALWAYS_INLINE;
+ static inline bool XMEGACLK_SetCPUClockSource(const uint8_t Source,
+ const uint32_t SourceFreq)
+ {
+ uint8_t ClockSourceMask = 0;
+
+ switch (Source)
+ {
+ case CLOCK_SRC_INT_RC2MHZ:
+ ClockSourceMask = CLK_SCLKSEL_RC2M_gc;
+ break;
+ case CLOCK_SRC_INT_RC32MHZ:
+ ClockSourceMask = CLK_SCLKSEL_RC32M_gc;
+ break;
+ case CLOCK_SRC_INT_RC32KHZ:
+ ClockSourceMask = CLK_SCLKSEL_RC32K_gc;
+ break;
+ case CLOCK_SRC_XOSC:
+ ClockSourceMask = CLK_SCLKSEL_XOSC_gc;
+ break;
+ case CLOCK_SRC_PLL:
+ ClockSourceMask = CLK_SCLKSEL_PLL_gc;
+ break;
+ default:
+ return false;
+ }
+
+ uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask();
+ GlobalInterruptDisable();
+
+ CCP = CCP_IOREG_gc;
+ CLK.CTRL = ClockSourceMask;
+
+ SetGlobalInterruptMask(CurrentGlobalInt);
+
+ Delay_MS(1);
+ return (CLK.CTRL == ClockSourceMask);
+ }
+
+ /* Disable C linkage for C++ Compilers: */
+ #if defined(__cplusplus)
+ }
+ #endif
+
+#endif
+
+/** @} */