diff options
Diffstat (limited to 'lib/lufa/LUFA')
450 files changed, 78394 insertions, 0 deletions
diff --git a/lib/lufa/LUFA/Build/DMBS/.gitignore b/lib/lufa/LUFA/Build/DMBS/.gitignore new file mode 100644 index 0000000000..938768908a --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/.gitignore @@ -0,0 +1,9 @@ +*.lss +*.bin +*.elf +*.hex +*.eep +*.map +*.o +*.d +*.sym diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/HID_EEPROM_Loader/HID_EEPROM_Loader.c b/lib/lufa/LUFA/Build/DMBS/DMBS/HID_EEPROM_Loader/HID_EEPROM_Loader.c new file mode 100644 index 0000000000..35ea2d79b7 --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/HID_EEPROM_Loader/HID_EEPROM_Loader.c @@ -0,0 +1,39 @@ +/* +             DMBS Build System +      Released into the public domain. + +   dean [at] fourwalledcubicle [dot] com +         www.fourwalledcubicle.com + */ + +/** \file + * + *  Special application to extract an EEPROM image stored in FLASH memory, and + *  copy it to the device EEPROM. This application is designed to be used with + *  the HID build system module of DMBS to program the EEPROM of a target device + *  that uses the HID bootloader protocol, which does not have native EEPROM + *  programming support. + */ + +#include <avr/io.h> +#include <avr/eeprom.h> +#include <avr/pgmspace.h> + +/* References to the binary EEPROM data linked in the AVR's FLASH memory space */ +extern const char _binary_InputEEData_bin_start[]; +extern const char _binary_InputEEData_bin_end[]; +extern const char _binary_InputEEData_bin_size[]; + +/* Friendly names for the embedded binary data stored in FLASH memory space */ +#define InputEEData       _binary_InputEEData_bin_start +#define InputEEData_size  ((int)_binary_InputEEData_bin_size) + +int main(void) +{ +	/* Copy out the embedded EEPROM data from FLASH to EEPROM memory space */ +	for (uint16_t i = 0; i < InputEEData_size; i++) +	  eeprom_update_byte((uint8_t*)i, pgm_read_byte(&InputEEData[i])); + +	/* Infinite loop once complete */ +	for (;;); +} diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/HID_EEPROM_Loader/makefile b/lib/lufa/LUFA/Build/DMBS/DMBS/HID_EEPROM_Loader/makefile new file mode 100644 index 0000000000..879eda8cf2 --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/HID_EEPROM_Loader/makefile @@ -0,0 +1,35 @@ +# +#            DMBS Build System +#     Released into the public domain. +# +#  dean [at] fourwalledcubicle [dot] com +#        www.fourwalledcubicle.com +# + +# Run "make help" for target help. + +MCU          = atmega128 +ARCH         = AVR8 +F_CPU        = 1000000 +OPTIMIZATION = s +TARGET       = HID_EEPROM_Loader +SRC          = $(TARGET).c +CC_FLAGS     = +LD_FLAGS     = +OBJECT_FILES = InputEEData.o + +# Default target +all: + +# Determine the AVR sub-architecture of the build main application object file +FIND_AVR_SUBARCH = avr$(shell avr-objdump -f $(TARGET).o | grep architecture | cut -d':' -f3 | cut -d',' -f1) + +# Create a linkable object file with the input binary EEPROM data stored in the FLASH section +InputEEData.o: InputEEData.bin $(TARGET).o $(MAKEFILE_LIST) +	@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a object file \"$@\" +	avr-objcopy -I binary -O elf32-avr -B $(call FIND_AVR_SUBARCH) --rename-section .data=.progmem.data,contents,alloc,readonly,data $< $@ + +# Include LUFA build script makefiles +include ../core.mk +include ../gcc.mk +include ../hid.mk diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/License.txt b/lib/lufa/LUFA/Build/DMBS/DMBS/License.txt new file mode 100644 index 0000000000..322c7624e5 --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/License.txt @@ -0,0 +1,32 @@ +             DMBS Build System +      Released into the public domain. + +   dean [at] fourwalledcubicle [dot] com +         www.fourwalledcubicle.com + + + +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to <http://unlicense.org/> diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/ModulesOverview.md b/lib/lufa/LUFA/Build/DMBS/DMBS/ModulesOverview.md new file mode 100644 index 0000000000..1fd9cc11cc --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/ModulesOverview.md @@ -0,0 +1,38 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Modules Overview +---------------- + +The following modules are currently included: + + - [ATPROGRAM](atprogram.md) - Device Programming + - [AVRDUDE](avrdude.md) - Device Programming + - [CORE](core.md) - DMBS Core Functionality + - [CPPCHECK](cppcheck.md) - Static Code Analysis + - [DFU](dfu.md) - Device Programming + - [DOXYGEN](doxygen.md) - Automated Source Code Documentation + - [GCC](gcc.md) - Compiling/Assembling/Linking with GCC + - [HID](hid.md) - Device Programming + +## Importing modules into your project makefile + +To use a module, it is recommended to add the following boilerplate to your +makefile: + +    # Include DMBS build script makefiles +    DMBS_PATH   ?= ../DMBS + +Which can then used to indicate the location of your DMBS installation, relative +to the current directory, when importing modules. For example: + +    DMBS_PATH   ?= ../DMBS +    include $(DMBS_PATH)/core.mk +    include $(DMBS_PATH)/gcc.mk + +Imports the `CORE` and `GCC` modules from DMBS using a single path relative to +your project's makefile. + +If you wish to write your own DMBS module(s), +[see the documentation here for more details.](WritingYourOwnModules.md) diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/WritingYourOwnModules.md b/lib/lufa/LUFA/Build/DMBS/DMBS/WritingYourOwnModules.md new file mode 100644 index 0000000000..16df7a53bb --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/WritingYourOwnModules.md @@ -0,0 +1,95 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Writing Your Own Modules +------------------------ + +A DMBS module consists of the several boilerplate sections, explained below. + +## The DMBS module hooks + +Your module needs to advertise to DMBS its name, its makefile targets, the +required and optional variables, and the variables and macros the module +provides for use elsewhere. This is achieved with the following section: + +    DMBS_BUILD_MODULES         += EXAMPLE +    DMBS_BUILD_TARGETS         += example-target another-target +    DMBS_BUILD_MANDATORY_VARS  += MANDATORY_NAME ALSO_MANDATORY +    DMBS_BUILD_OPTIONAL_VARS   += OPTIONAL_NAME ALSO_OPTIONAL +    DMBS_BUILD_PROVIDED_VARS   += MEANING_OF_LIFE +    DMBS_BUILD_PROVIDED_MACROS += STRIP_WHITESPACE + +The example above declares that this module is called `EXAMPLE`, and exposes the +listed targets, variable requirements and provides variables and macros. + +Your module name and provided variable/macro names must be unique, however you +can (and should) re-use variable names where appropriate if they apply to +several modules (such as `ARCH` to specify the project's microcontroller +architecture). Re-using targets is not recommended, but can be used to extend +the dependencies of another module's targets. + +## Importing the CORE module + +Next, your module should always import the DMBS `CORE` module, via the +following: + +    # Conditionally import the CORE module of DMBS if it is not already imported +    DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +    ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) +      include $(DMBS_MODULE_PATH)/core.mk +    endif + +This ensures that the `make help` target is always available. In addition, the +`CORE` module exposes some [commonly used macros and variables](core.md) to +your module. + +## Setting optional variable's defaults + +If a variable is optional, you should provide a default value. Do this via the +`?=` operator of `make`, which sets a variable's value if it has not yet been +set: + +    MY_OPTIONAL_VARIABLE ?= some_default_value + +## Sanity checking user input + +Sanity checks are what make DMBS useful. Where possible, validate user input and +convert generated errors to human-friendly messages. This can be achieved by +enforcing that all the declared module mandatory variables have been set by the +user: + +    # Sanity-check values of mandatory user-supplied variables +    $(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) + +As well as complaining if they are set, but currently empty: + +    $(call ERROR_IF_EMPTY, SOME_MANDATORY_VARIABLE) +    $(call ERROR_IF_EMPTY, SOME_OPTIONAL_BUT_NON_EMPTY_VARIABLE) + +Or even if they are boolean (`Y` or `N`) variables that have an invalid value: + +    $(call ERROR_IF_NONBOOL, SOME_BOOL_VARIABLE) + +## Adding targets + +The meat of a DMBS module is the targets, which are run when the user types +`make {target name}` from the command line. These can be as complex or simple +as you like. See the GNU make manual for information on writing make targets. + +    example-target: +        echo "Your DMBS module works!" + +## And finally, list the PHONYs + +Important in GNU Make is the concept of phony targets; this special directive +tells make that a given target should never be considered a valid file. Listing +phonies ensures that, for example, if your module had a target called `build`, +it would always run when the user types `make build` from the command line, even +if a file called `build` existed in the user project folder. + +You can list module-internal targets here, as well as mark all public targets +via the module header's `DMBS_BUILD_TARGETS` variable. + +    # Phony build targets for this module +    .PHONY: $(DMBS_BUILD_TARGETS) some-module-internal-target another-internal-target diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/atprogram.md b/lib/lufa/LUFA/Build/DMBS/DMBS/atprogram.md new file mode 100644 index 0000000000..ea1b0d9194 --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/atprogram.md @@ -0,0 +1,119 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: ATPROGRAM +----------------- + +The ATPROGRAM module provides build targets for use with the official +`ATPROGRAM` back-end utility distributed with the free +[Atmel Studio](http://www.atmel.com) software released by Atmel. + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + +    include $(DMBS_PATH)/atprogram.mk + +## Prerequisites: + +This module requires the `atprogram.exe` utility to be available in your +system's `PATH` variable. The `atprogram.exe` utility is distributed in Atmel +Studio (usually) inside the application install folder's `atbackend` +subdirectory. + +## Build Targets: + +The following targets are supported by this module: + +<table> + <tbody> +   <tr> +    <td>atprogram</td> +    <td>Program the device FLASH memory with the application's executable data.</td> +   </tr> +   <tr> +    <td>atprogram-ee</td> +    <td>Program the device EEPROM memory with the application's EEPROM data.</td> +   </tr> + </tbody> +</table> + +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + +<table> + <tbody> +   <tr> +    <td>MCU</td> +    <td>Name of the Atmel processor model (e.g. `at90usb1287`).</td> +   </tr> +   <tr> +    <td>TARGET</td> +    <td>Name of the application output file prefix (e.g. `TestApplication`).</td> +   </tr> + </tbody> +</table> + +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + +<table> + <tbody> +   <tr> +    <td>ATPROGRAM_PROGRAMMER</td> +    <td>Name of the Atmel programmer or debugger tool to communicate with (e.g. `jtagice3`). Default is `atmelice`.</td> +   </tr> +   <tr> +    <td>ATPROGRAM_INTERFACE</td> +    <td>Name of the programming interface to use when programming the target (e.g. `spi`). Default is `jtag`.</td> +   </tr> +   <tr> +    <td>ATPROGRAM_PORT</td> +    <td>Name of the communication port to use when when programming with a serially connected tool (e.g. `COM2`). Default is `usb`.</td> +   </tr> + </tbody> +</table> + +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module provides no variables.</td> +   </tr> + </tbody> +</table> + +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module provides no macros.</td> +   </tr> + </tbody> +</table> + +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20160403 +Initial release. diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/atprogram.mk b/lib/lufa/LUFA/Build/DMBS/DMBS/atprogram.mk new file mode 100644 index 0000000000..a505275aed --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/atprogram.mk @@ -0,0 +1,68 @@ +# +#            DMBS Build System +#     Released into the public domain. +# +#  dean [at] fourwalledcubicle [dot] com +#        www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES         += ATPROGRAM +DMBS_BUILD_TARGETS         += atprogram atprogram-ee +DMBS_BUILD_MANDATORY_VARS  += MCU TARGET +DMBS_BUILD_OPTIONAL_VARS   += ATPROGRAM_PROGRAMMER ATPROGRAM_INTERFACE ATPROGRAM_PORT +DMBS_BUILD_PROVIDED_VARS   += +DMBS_BUILD_PROVIDED_MACROS += + +# Conditionally import the CORE module of DMBS if it is not already imported +DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) +  include $(DMBS_MODULE_PATH)/core.mk +endif + +# Default values of optionally user-supplied variables +ATPROGRAM_PROGRAMMER ?= atmelice +ATPROGRAM_INTERFACE  ?= jtag +ATPROGRAM_PORT       ?= + +# Sanity check user supplied values +$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, MCU) +$(call ERROR_IF_EMPTY, TARGET) +$(call ERROR_IF_EMPTY, ATPROGRAM_PROGRAMMER) +$(call ERROR_IF_EMPTY, ATPROGRAM_INTERFACE) + +# Output Messages +MSG_ATPROGRAM_CMD    := ' [ATPRGRM] :' + +# Construct base atprogram command flags +BASE_ATPROGRAM_FLAGS := --tool $(ATPROGRAM_PROGRAMMER) --interface $(ATPROGRAM_INTERFACE) --device $(MCU) +ifneq ($(ATPROGRAM_PORT),) +   BASE_ATPROGRAM_FLAGS += --port $(ATPROGRAM_PORT) +endif + +# Construct the flags to use for the various memory spaces +ifeq ($(ARCH), AVR8) +   ATPROGRAM_FLASH_FLAGS  := --chiperase --flash +   ATPROGRAM_EEPROM_FLAGS := --eeprom +else ifeq ($(ARCH), XMEGA) +   ATPROGRAM_FLASH_FLAGS  := --erase --flash +   ATPROGRAM_EEPROM_FLAGS := --eeprom +else ifeq ($(ARCH), UC3) +   ATPROGRAM_FLASH_FLAGS  := --erase +   ATPROGRAM_EEPROM_FLAGS := --eeprom +else +   $(error Unsupported architecture "$(ARCH)") +endif + +# Programs in the target FLASH memory using ATPROGRAM +atprogram: $(TARGET).elf $(MAKEFILE_LIST) +	@echo $(MSG_ATPROGRAM_CMD) Programming device \"$(MCU)\" FLASH using \"$(ATPROGRAM_PROGRAMMER)\" +	atprogram $(BASE_ATPROGRAM_FLAGS) program $(ATPROGRAM_FLASH_FLAGS) --file $< + +# Programs in the target EEPROM memory using ATPROGRAM +atprogram-ee: $(TARGET).elf $(MAKEFILE_LIST) +	@echo $(MSG_ATPROGRAM_CMD) Programming device \"$(MCU)\" EEPROM using \"$(ATPROGRAM_PROGRAMMER)\" +	atprogram $(BASE_ATPROGRAM_FLAGS) program $(ATPROGRAM_EEPROM_FLAGS) --file $< + +# Phony build targets for this module +.PHONY: $(DMBS_BUILD_TARGETS) diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/avrdude.md b/lib/lufa/LUFA/Build/DMBS/DMBS/avrdude.md new file mode 100644 index 0000000000..d6c71ce6db --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/avrdude.md @@ -0,0 +1,124 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: AVRDUDE +----------------- + +The AVRDUDE module provides build targets for use with the official +open source `AVRDUDE` programmer utility, for the reprogramming of Atmel devices +using a wide variety of official and non-official programming devices and +bootloaders. + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + +    include $(DMBS_PATH)/avrdude.mk + +## Prerequisites: + +This module requires the `avrdude` utility to be available in your +system's `PATH` variable. The `avrdude` utility is distributed on the project's +[official site](https://savannah.nongnu.org/projects/avrdude) but is also +made available in many *nix operating system's package managers. + +## Build Targets: + +The following targets are supported by this module: + +<table> + <tbody> +   <tr> +    <td>avrdude</td> +    <td>Program the device FLASH memory with the application's executable data.</td> +   </tr> +   <tr> +    <td>avrdude-ee</td> +    <td>Program the device EEPROM memory with the application's EEPROM data.</td> +   </tr> + </tbody> +</table> + +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + +<table> + <tbody> +   <tr> +    <td>MCU</td> +    <td>Name of the Atmel processor model (e.g. `at90usb1287`).</td> +   </tr> +   <tr> +    <td>TARGET</td> +    <td>Name of the application output file prefix (e.g. `TestApplication`).</td> +   </tr> + </tbody> +</table> + +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + +<table> + <tbody> +   <tr> +    <td>AVRDUDE_PROGRAMMER</td> +    <td>Name of the programmer/debugger tool or bootloader to communicate with (e.g. `jtagicemkii`). Default is `jtagicemkii`.</td> +   </tr> +   <tr> +    <td>AVRDUDE_PORT</td> +    <td>Name of the communication port to use when when programming with a serially connected tool (e.g. `COM2`). Default is `usb`.</td> +   </tr> +   <tr> +    <td>AVRDUDE_FLAGS</td> +    <td>Additional flags to pass to `avrdude` when invoking the tool. Default is empty (no additional flags).</td> +   </tr> +   <tr> +    <td>AVRDUDE_MEMORY</td> +    <td>Memory space to program when executing the `avrdude` target (e.g. 'application` for an XMEGA device). Default is `flash`.</td> +   </tr> + </tbody> +</table> + +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module provides no variables.</td> +   </tr> + </tbody> +</table> + +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module provides no macros.</td> +   </tr> + </tbody> +</table> + +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20160403 +Initial release. diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/avrdude.mk b/lib/lufa/LUFA/Build/DMBS/DMBS/avrdude.mk new file mode 100644 index 0000000000..c4bac8fd0e --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/avrdude.mk @@ -0,0 +1,52 @@ +# +#            DMBS Build System +#     Released into the public domain. +# +#  dean [at] fourwalledcubicle [dot] com +#        www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES         += AVRDUDE +DMBS_BUILD_TARGETS         += avrdude avrdude-ee +DMBS_BUILD_MANDATORY_VARS  += MCU TARGET +DMBS_BUILD_OPTIONAL_VARS   += AVRDUDE_PROGRAMMER AVRDUDE_PORT AVRDUDE_FLAGS AVRDUDE_MEMORY +DMBS_BUILD_PROVIDED_VARS   += +DMBS_BUILD_PROVIDED_MACROS += + +# Conditionally import the CORE module of DMBS if it is not already imported +DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) +  include $(DMBS_MODULE_PATH)/core.mk +endif + +# Default values of optionally user-supplied variables +AVRDUDE_PROGRAMMER ?= jtagicemkii +AVRDUDE_PORT       ?= usb +AVRDUDE_FLAGS      ?= +AVRDUDE_MEMORY     ?= flash + +# Sanity check user supplied values +$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, MCU) +$(call ERROR_IF_EMPTY, TARGET) +$(call ERROR_IF_EMPTY, AVRDUDE_PROGRAMMER) +$(call ERROR_IF_EMPTY, AVRDUDE_PORT) + +# Output Messages +MSG_AVRDUDE_CMD    := ' [AVRDUDE] :' + +# Construct base avrdude command flags +BASE_AVRDUDE_FLAGS := -p $(MCU) -P $(AVRDUDE_PORT) -c $(AVRDUDE_PROGRAMMER) + +# Programs in the target FLASH memory using AVRDUDE +avrdude: $(TARGET).hex $(MAKEFILE_LIST) +	@echo $(MSG_AVRDUDE_CMD) Programming device \"$(MCU)\" FLASH using \"$(AVRDUDE_PROGRAMMER)\" on port \"$(AVRDUDE_PORT)\" +	avrdude $(BASE_AVRDUDE_FLAGS) -U $(AVRDUDE_MEMORY):w:$< $(AVRDUDE_FLAGS) + +# Programs in the target EEPROM memory using AVRDUDE +avrdude-ee: $(TARGET).eep $(MAKEFILE_LIST) +	@echo $(MSG_AVRDUDE_CMD) Programming device \"$(MCU)\" EEPROM using \"$(AVRDUDE_PROGRAMMER)\" on port \"$(AVRDUDE_PORT)\" +	avrdude $(BASE_AVRDUDE_FLAGS) -U eeprom:w:$< $(AVRDUDE_FLAGS) + +# Phony build targets for this module +.PHONY: $(DMBS_BUILD_TARGETS) diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/core.md b/lib/lufa/LUFA/Build/DMBS/DMBS/core.md new file mode 100644 index 0000000000..406abfecd7 --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/core.md @@ -0,0 +1,136 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: CORE +------------ + +The CORE module provides the core DMBS infrastructure used by other DMBS +modules, and must always be imported. Additionally, this module provides the +help system for DMBS. + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + +    include $(DMBS_PATH)/core.mk + +## Prerequisites: + +None. + +## Build Targets: + +The following targets are supported by this module: + +<table> + <tbody> +   <tr> +    <td>help</td> +    <td>Show help for the current project, including a list of all available targets, variables and macros from the imported modules.</td> +   </tr> +   <tr> +    <td>list_targets</td> +    <td>Show a list of all build targets from the imported modules.</td> +   </tr> +   <tr> +    <td>list_modules</td> +    <td>Show a list of all imported modules.</td> +   </tr> +   <tr> +    <td>list_mandatory</td> +    <td>Show a list of all mandatory variables from the imported modules.</td> +   </tr> +   <tr> +    <td>list_optional</td> +    <td>Show a list of all optional variables from the imported modules.</td> +   </tr> +   <tr> +    <td>list_provided</td> +    <td>Show a list of all variables provided by the imported modules.</td> +   </tr> +   <tr> +    <td>list_macros</td> +    <td>Show a list of all macros provided by the imported modules.</td> +   </tr> + </tbody> +</table> + +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module has no mandatory variables.</td> +   </tr> + </tbody> +</table> + +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module has no optional variables.</td> +   </tr> + </tbody> +</table> + +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + +<table> + <tbody> +   <tr> +    <td>DMBS_VERSION</td> +    <td>Current version of this DMBS release, as a ISO 8601 integer (such as `20160403` for `2016-04-03`).</td> +   </tr> + </tbody> +</table> + +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + +<table> + <tbody> +   <tr> +    <td>DMBS_CHECK_VERSION</td> +    <td>Macro to check the current DMBS version against the first argument and abort if the required version is newer than the current version.</td> +   </tr> +   <tr> +    <td>ERROR_IF_UNSET</td> +    <td>Macro to check the given makefile variable name passed as the first argument, and abort if it has not been set by any makefile module.</td> +   </tr> +   <tr> +    <td>ERROR_IF_EMPTY</td> +    <td>Macro to check the given makefile variable name passed as the first argument, and abort if it has an empty value.</td> +   </tr> +   <tr> +    <td>ERROR_IF_NONBOOL</td> +    <td>Macro to check the given makefile variable name passed as the first argument, and abort if it has a value other than `Y` or `N`.</td> +   </tr> + </tbody> +</table> + +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20160403 +Initial release. diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/core.mk b/lib/lufa/LUFA/Build/DMBS/DMBS/core.mk new file mode 100644 index 0000000000..1edbd178c1 --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/core.mk @@ -0,0 +1,147 @@ +# +#            DMBS Build System +#     Released into the public domain. +# +#  dean [at] fourwalledcubicle [dot] com +#        www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES         += CORE +DMBS_BUILD_TARGETS         += help list_targets list_modules list_mandatory list_optional list_provided list_macros +DMBS_BUILD_MANDATORY_VARS  += +DMBS_BUILD_OPTIONAL_VARS   += +DMBS_BUILD_PROVIDED_VARS   += DMBS_VERSION +DMBS_BUILD_PROVIDED_MACROS += DMBS_CHECK_VERSION ERROR_IF_UNSET ERROR_IF_EMPTY ERROR_IF_NONBOOL + +SHELL = /bin/sh + +# Current DMBS release version +DMBS_VERSION       := 20170426 + +# Macro to check the DMBS version, aborts if the given DMBS version is below the current version +DMBS_CHECK_VERSION ?= $(if $(filter-out 0, $(shell test $(DMBS_VERSION) -lt $(1); echo $$?)), , $(error DMBS version $(1) or newer required, current version is $(DMBS_VERSION))) + +# Macros to use in other modules to check various conditions +ERROR_IF_UNSET     ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) +ERROR_IF_EMPTY     ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) +ERROR_IF_NONBOOL   ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) + +# Converts a given input to a printable output using "(None)" if no items are in the list +CONVERT_TO_PRINTABLE           = $(if $(strip $(1)), $(1), (None)) + +# Build sorted and filtered lists of the included build module data +SORTED_DMBS_BUILD_MODULES      = $(sort $(DMBS_BUILD_MODULES)) +SORTED_DMBS_BUILD_TARGETS      = $(sort $(DMBS_BUILD_TARGETS)) +SORTED_DMBS_MANDATORY_VARS     = $(sort $(DMBS_BUILD_MANDATORY_VARS)) +SORTED_DMBS_OPTIONAL_VARS      = $(filter-out $(SORTED_DMBS_MANDATORY_VARS), $(sort $(DMBS_BUILD_OPTIONAL_VARS))) +SORTED_DMBS_PROVIDED_VARS      = $(sort $(DMBS_BUILD_PROVIDED_VARS)) +SORTED_DMBS_PROVIDED_MACROS    = $(sort $(DMBS_BUILD_PROVIDED_MACROS)) + +# Create printable versions of the sorted build module data (use "(None)" when no data is available) +PRINTABLE_DMBS_BUILD_MODULES   = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_BUILD_MODULES)) +PRINTABLE_DMBS_BUILD_TARGETS   = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_BUILD_TARGETS)) +PRINTABLE_DMBS_MANDATORY_VARS  = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_MANDATORY_VARS)) +PRINTABLE_DMBS_OPTIONAL_VARS   = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_OPTIONAL_VARS)) +PRINTABLE_DMBS_PROVIDED_VARS   = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_PROVIDED_VARS)) +PRINTABLE_DMBS_PROVIDED_MACROS = $(call CONVERT_TO_PRINTABLE, $(SORTED_DMBS_PROVIDED_MACROS)) + +help: +	@echo "===================================================================" +	@echo "                       The DMBS Build System                       " +	@echo "         By Dean Camera { dean @ fourwalledcubicle . com }         " +	@echo "===================================================================" +	@echo "DESCRIPTION:                                                       " +	@echo " This build system is a set of makefile modules for (GNU) Make, to " +	@echo " provide a simple system for building DMBS powered applications.   " +	@echo " Each makefile module can be included from within a user makefile, " +	@echo " to expose the build rules documented in the comments at the top of" +	@echo " each build module.                                                " +	@echo "                                                                   " +	@echo "USAGE:                                                             " +	@echo " To execute a rule, define all variables indicated in the desired  " +	@echo " module as a required parameter before including the build module  " +	@echo " in your project makefile. Parameters marked as optional will      " +	@echo " assume a default value in the modules if not user-assigned.       " +	@echo "                                                                   " +	@echo " By default the target output shows both a friendly summary, as    " +	@echo " well as the actual invoked command. To suppress the output of the " +	@echo " invoked commands and show only the friendly command output, run   " +	@echo " make with the \"-s\" switch added before the target(s).           " +	@echo "===================================================================" +	@echo "                                                                   " +	@echo "  Currently used build system modules in this application:         " +	@echo "                                                                   " +	@printf " %b" "$(PRINTABLE_DMBS_BUILD_MODULES:%=   - %\n)" +	@echo "                                                                   " +	@echo "                                                                   " +	@echo "  Currently available build targets in this application:           " +	@echo "                                                                   " +	@printf " %b" "$(PRINTABLE_DMBS_BUILD_TARGETS:%=   - %\n)" +	@echo "                                                                   " +	@echo "                                                                   " +	@echo "  Mandatory variables required by the selected build Modules:      " +	@echo "                                                                   " +	@printf " %b" "$(PRINTABLE_DMBS_MANDATORY_VARS:%=   - %\n)" +	@echo "                                                                   " +	@echo "                                                                   " +	@echo "  Optional variables required by the selected build Modules:       " +	@echo "                                                                   " +	@printf " %b" "$(PRINTABLE_DMBS_OPTIONAL_VARS:%=   - %\n)" +	@echo "                                                                   " +	@echo "                                                                   " +	@echo "  Variables provided by the selected build Modules:                " +	@echo "                                                                   " +	@printf " %b" "$(PRINTABLE_DMBS_PROVIDED_VARS:%=   - %\n)" +	@echo "                                                                   " +	@echo "                                                                   " +	@echo "  Macros provided by the selected build Modules:                   " +	@echo "                                                                   " +	@printf " %b" "$(PRINTABLE_DMBS_PROVIDED_MACROS:%=   - %\n)" +	@echo "                                                                   " +	@echo "===================================================================" +	@echo "          The DMBS Build System $(DMBS_VERSION) - Making MAKE easier." +	@echo "===================================================================" + +# Lists build modules included by the project makefile, in alphabetical order +list_modules: +	@echo Currently Used Build System Modules: +	@printf " %b" "$(PRINTABLE_DMBS_BUILD_MODULES:%=   - %\n)" + +# Lists build targets included by the project makefile, in alphabetical order +list_targets: +	@echo Currently Available Build Targets: +	@printf " %b" "$(PRINTABLE_DMBS_BUILD_TARGETS:%=   - %\n)" + +# Lists mandatory variables that must be set by the project makefile, in alphabetical order +list_mandatory: +	@echo Mandatory Variables for Included Modules: +	@printf " %b" "$(PRINTABLE_DMBS_MANDATORY_VARS:%=   - %\n)" + +# Lists optional variables that must be set by the project makefile, in alphabetical order +list_optional: +	@echo Optional Variables for Included Modules: +	@printf " %b" "$(PRINTABLE_DMBS_OPTIONAL_VARS:%=   - %\n)" + +# Lists variables provided by the included build modules, in alphabetical order +list_provided: +	@echo Variables Provided by the Included Modules: +	@printf " %b" "$(PRINTABLE_DMBS_PROVIDED_VARS:%=   - %\n)" + +# Lists macros provided by the included build modules, in alphabetical order +list_macros: +	@echo Macros Provided by the Included Modules: +	@printf " %b" "$(PRINTABLE_DMBS_PROVIDED_MACROS:%=   - %\n)" + +# Debugging; "make print-VARNAME" will output the variable VARNAME's value +print-%: +	@printf "%s = %s" $(@:print-%=%) $($(@:print-%=%)) + +# Disable default in-built make rules (those that are needed are explicitly +# defined, and doing so has performance benefits when recursively building) +ifeq ($(filter -r,$(MAKEFLAGS)),) +  MAKEFLAGS += -r +endif +.SUFFIXES: + +# Phony build targets for this module +.PHONY: $(DMBS_BUILD_TARGETS) diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/cppcheck.md b/lib/lufa/LUFA/Build/DMBS/DMBS/cppcheck.md new file mode 100644 index 0000000000..ec0e38d020 --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/cppcheck.md @@ -0,0 +1,134 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: CPPCHECK +----------------- + +The CPPCHECK module provides build targets to perform static analysis of the +user application, using the open source `cppcheck` tool. + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + +    include $(DMBS_PATH)/cppcheck.mk + +## Prerequisites: + +This module requires the `cppcheck` utility to be available in your system's +`PATH` variable. The `cppcheck` utility is distributed on the project's +[official site](http://cppcheck.sourceforge.net/) but is also +made available in many *nix operating system's package managers. + +## Build Targets: + +The following targets are supported by this module: + +<table> + <tbody> +   <tr> +    <td>cppcheck</td> +    <td>Scan the project with CPPCHECK, and show all discovered issues.</td> +   </tr> +   <tr> +    <td>cppcheck-config</td> +    <td>Check the project with CPPCHECK, to find missing header paths.</td> +   </tr> + </tbody> +</table> + +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + +<table> + <tbody> +   <tr> +    <td>SRC</td> +    <td>List of all project source files to scan.</td> +   </tr> + </tbody> +</table> + +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + +<table> + <tbody> +   <tr> +    <td>CPPCHECK_INCLUDES</td> +    <td>Extra include paths to search, for any missing header files. Default is empty (no additional paths).</td> +   </tr> +   <tr> +    <td>CPPCHECK_EXCLUDES</td> +    <td>List of source files, file paths or path fragments to exclude from the scan. Default is empty (no exclusions).</td> +   </tr> +   <tr> +    <td>CPPCHECK_MSG_TEMPLATE</td> +    <td>Template for error and warning message output. Default is `{file}:{line}: {severity} ({id}): {message}`.</td> +   </tr> +   <tr> +    <td>CPPCHECK_ENABLE</td> +    <td>List of CPPCHECK checks to enable. Default is `all`.</td> +   </tr> +   <tr> +    <td>CPPCHECK_SUPPRESS</td> +    <td>List of CPPCHECK checks to ignore. Default is `variableScope missingInclude`.</td> +   </tr> +   <tr> +    <td>CPPCHECK_FAIL_ON_WARNING</td> +    <td>Boolean, if `Y` the build will fail if CPPCHECK discovers any errors or warnings. If `N`, fail only on errors. Default is `Y`.</td> +   </tr> +   <tr> +    <td>CPPCHECK_QUIET</td> +    <td>Boolean, if `Y` CPPCHECK will suppress all output except for discovered errors or warnings. If `N`, scan progress will be emitted. Default is `Y`.</td> +   </tr> +   <tr> +    <td>CPPCHECK_FLAGS_</td> +    <td>Additional flags to pass to CPPCHECK when scans are started. Default is empty (no additional flags).</td> +   </tr> + </tbody> +</table> + +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module provides no variables.</td> +   </tr> + </tbody> +</table> + +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module provides no macros.</td> +   </tr> + </tbody> +</table> + +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20160403 +Initial release. diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/cppcheck.mk b/lib/lufa/LUFA/Build/DMBS/DMBS/cppcheck.mk new file mode 100644 index 0000000000..9b82fc3b08 --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/cppcheck.mk @@ -0,0 +1,66 @@ +# +#            DMBS Build System +#     Released into the public domain. +# +#  dean [at] fourwalledcubicle [dot] com +#        www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES         += CPPCHECK +DMBS_BUILD_TARGETS         += cppcheck cppcheck-config +DMBS_BUILD_MANDATORY_VARS  += SRC +DMBS_BUILD_OPTIONAL_VARS   += CPPCHECK_INCLUDES CPPCHECK_EXCLUDES CPPCHECK_MSG_TEMPLATE CPPCHECK_ENABLE \ +                              CPPCHECK_SUPPRESS CPPCHECK_FAIL_ON_WARNING CPPCHECK_QUIET CPPCHECK_FLAGS +DMBS_BUILD_PROVIDED_VARS   += +DMBS_BUILD_PROVIDED_MACROS += + +# Conditionally import the CORE module of DMBS if it is not already imported +DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) +  include $(DMBS_MODULE_PATH)/core.mk +endif + +# Default values of optionally user-supplied variables +CPPCHECK_INCLUDES            ?= +CPPCHECK_EXCLUDES            ?= +CPPCHECK_MSG_TEMPLATE        ?= {file}:{line}: {severity} ({id}): {message} +CPPCHECK_ENABLE              ?= all +CPPCHECK_SUPPRESS            ?= variableScope missingInclude +CPPCHECK_FAIL_ON_WARNING     ?= Y +CPPCHECK_QUIET               ?= Y +CPPCHECK_FLAGS               ?= + +# Sanity check user supplied values +$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, SRC) +$(call ERROR_IF_EMPTY, CPPCHECK_MSG_TEMPLATE) +$(call ERROR_IF_EMPTY, CPPCHECK_ENABLE) +$(call ERROR_IF_NONBOOL, CPPCHECK_FAIL_ON_WARNING) +$(call ERROR_IF_NONBOOL, CPPCHECK_QUIET) + +# Build a default argument list for cppcheck +BASE_CPPCHECK_FLAGS := --template="$(CPPCHECK_MSG_TEMPLATE)" $(CPPCHECK_INCLUDES:%=-I%) $(CPPCHECK_EXCLUDES:%=-i%) --inline-suppr --force --std=c99 + +# Sanity check parameters and construct additional command line arguments to cppcheck +ifeq ($(CPPCHECK_FAIL_ON_WARNING), Y) +   BASE_CPPCHECK_FLAGS += --error-exitcode=1 +endif +ifeq ($(CPPCHECK_QUIET), Y) +   BASE_CPPCHECK_FLAGS += --quiet +endif + +# Output Messages +MSG_CPPCHECK_CMD         := ' [CPPCHECK]:' + +# Checks the CPPCheck configuration as used in the user project, to determine if any paths are missing or invalid +cppcheck-config: $(MAKEFILE_LIST) +	@echo $(MSG_CPPCHECK_CMD) Checking cppcheck configuration check on source files +	cppcheck $(BASE_CPPCHECK_FLAGS) --check-config $(CPPCHECK_FLAGS) $(SRC) + +# Runs a static analysis using CPPCheck to determine if there are any issues +cppcheck: $(MAKEFILE_LIST) +	@echo $(MSG_CPPCHECK_CMD) Performing static analysis on source files +	cppcheck $(BASE_CPPCHECK_FLAGS) --enable=$(CPPCHECK_ENABLE) $(CPPCHECK_SUPPRESS:%=--suppress=%) $(CPPCHECK_FLAGS) $(SRC) + +# Phony build targets for this module +.PHONY: $(DMBS_BUILD_TARGETS) diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/dfu.md b/lib/lufa/LUFA/Build/DMBS/DMBS/dfu.md new file mode 100644 index 0000000000..456bbf6f5f --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/dfu.md @@ -0,0 +1,122 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: DFU +----------------- + +The DFU module provides build targets to program a USB connected target running +a DFU class bootloader, via the official Atmel FLIP utility running via the +command line, or the open source `DFU-Programmer` tool. + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + +    include $(DMBS_PATH)/dfu.mk + +## Prerequisites: + +This module requires the `batchisp` utility to be available in your system's +`PATH` variable. The `batchisp` utility is distributed as part of Atmel's FLIP +software which can be downloaded from the [official site](http://www.atmel.com). + +This module requires the `dfu-programmer` utility to be available in your +system's `PATH` variable. The `dfu-programmer` utility is distributed from the +[official project site](https://dfu-programmer.github.io/). + +## Build Targets: + +The following targets are supported by this module: + +<table> + <tbody> +   <tr> +    <td>flip</td> +    <td>Program the application into the device's flash memory, using Atmel FLIP.</td> +   </tr> +   <tr> +    <td>flip-ee</td> +    <td>Program the application's EEPROM data into the device's EEPROM memory, using Atmel FLIP.</td> +   </tr> +   <tr> +    <td>dfu</td> +    <td>Program the application into the device's flash memory, using `dfu-programmer`.</td> +   </tr> +   <tr> +    <td>dfu-ee</td> +    <td>Program the application's EEPROM data into the device's EEPROM memory, using `dfu-programmer`.</td> +   </tr> + </tbody> +</table> + +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + +<table> + <tbody> +   <tr> +    <td>MCU</td> +    <td>Name of the Atmel processor model (e.g. `at90usb1287`).</td> +   </tr> +   <tr> +    <td>TARGET</td> +    <td>Name of the application output file prefix (e.g. `TestApplication`).</td> +   </tr>    + </tbody> +</table> + +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module has no optional variables.</td> +   </tr> + </tbody> +</table> + +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module provides no variables.</td> +   </tr> + </tbody> +</table> + +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module provides no macros.</td> +   </tr> + </tbody> +</table> + +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20160403 +Initial release. diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/dfu.mk b/lib/lufa/LUFA/Build/DMBS/DMBS/dfu.mk new file mode 100644 index 0000000000..1eb22b864f --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/dfu.mk @@ -0,0 +1,62 @@ +# +#            DMBS Build System +#     Released into the public domain. +# +#  dean [at] fourwalledcubicle [dot] com +#        www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES         += DFU +DMBS_BUILD_TARGETS         += flip flip-ee dfu dfu-ee +DMBS_BUILD_MANDATORY_VARS  += MCU TARGET +DMBS_BUILD_OPTIONAL_VARS   += +DMBS_BUILD_PROVIDED_VARS   += +DMBS_BUILD_PROVIDED_MACROS += + +# Conditionally import the CORE module of DMBS if it is not already imported +DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) +  include $(DMBS_MODULE_PATH)/core.mk +endif + +# Sanity-check values of mandatory user-supplied variables +$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, MCU) +$(call ERROR_IF_EMPTY, TARGET) + +# Output Messages +MSG_COPY_CMD   := ' [CP]      :' +MSG_REMOVE_CMD := ' [RM]      :' +MSG_DFU_CMD    := ' [DFU]     :' + +# Programs in the target FLASH memory using BATCHISP, the command line tool used by FLIP +flip: $(TARGET).hex $(MAKEFILE_LIST) +	@echo $(MSG_DFU_CMD) Programming FLASH with batchisp using \"$<\" +	batchisp -hardware usb -device $(MCU) -operation erase f loadbuffer $< program +	batchisp -hardware usb -device $(MCU) -operation start reset 0 + +# Programs in the target EEPROM memory using BATCHISP, the command line tool used by FLIP +flip-ee: $(TARGET).eep $(MAKEFILE_LIST) +	@echo $(MSG_COPY_CMD) Copying EEP file to temporary file \"$<.hex\" +	cp $< $<.hex +	@echo $(MSG_DFU_CMD) Programming EEPROM with batchisp using \"$<.hex\" +	batchisp -hardware usb -device $(MCU) -operation memory EEPROM loadbuffer $<.hex program +	batchisp -hardware usb -device $(MCU) -operation start reset 0 +	@echo $(MSG_REMOVE_CMD) Removing temporary file \"$<.hex\" +	rm $<.hex + +# Programs in the target FLASH memory using DFU-PROGRAMMER +dfu: $(TARGET).hex $(MAKEFILE_LIST) +	@echo $(MSG_DFU_CMD) Programming FLASH with dfu-programmer using \"$<\" +	dfu-programmer $(MCU) erase +	dfu-programmer $(MCU) flash $< +	dfu-programmer $(MCU) reset + +# Programs in the target EEPROM memory using DFU-PROGRAMMER +dfu-ee: $(TARGET).eep $(MAKEFILE_LIST) +	@echo $(MSG_DFU_CMD) Programming EEPROM with dfu-programmer using \"$<\" +	dfu-programmer $(MCU) flash --eeprom $< +	dfu-programmer $(MCU) reset + +# Phony build targets for this module +.PHONY: $(DMBS_BUILD_TARGETS) diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/doxygen.md b/lib/lufa/LUFA/Build/DMBS/DMBS/doxygen.md new file mode 100644 index 0000000000..837704aca0 --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/doxygen.md @@ -0,0 +1,118 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: DOXYGEN +----------------- + +The DOXYGEN module provides build targets to automatically generate API +documentation for a project, using the open-source Doxygen tool. + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + +    include $(DMBS_PATH)/doxygen.mk + +## Prerequisites: + +This module requires the `doxygen` utility to be available in your system's +`PATH` variable. The `doxygen` utility is distributed on the project's +[official site](http://doxygen.org/) but is also +made available in many *nix operating system's package managers. + +## Build Targets: + +The following targets are supported by this module: + +<table> + <tbody> +   <tr> +    <td>doxygen</td> +    <td>Generate project documentation, via Doxygen.</td> +   </tr> +   <tr> +    <td>doxygen-create</td> +    <td>Create a new project Doxygen template, which can then be customized.</td> +   </tr> +   <tr> +    <td>doxygen-upgrade</td> +    <td>Upgrade an existing project Doxygen template to the latest Doxygen version.</td> +   </tr> + </tbody> +</table> + +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module has no mandatory variables.</td> +   </tr> + </tbody> +</table> + +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + +<table> + <tbody> +   <tr> +    <td>DOXYGEN_CONF</td> +    <td>Name of the Doxygen project configuration file that should be used when generating documentation, or creating/upgrading the configuration file.</td> +   </tr> +   <tr> +    <td>DOXYGEN_FAIL_ON_WARNING</td> +    <td>Boolean, if `Y` the build will fail if Doxygen encounters any errors or warnings. If `N`, fail only on errors. Default is `Y`.</td> +   </tr> +   <tr> +    <td>DOXYGEN_OVERRIDE_PARAMS</td> +    <td>List of `NAME=VALUE` parameters which should override the values specified in the project configuration file, when building documentation.</td> +   </tr> + </tbody> +</table> + +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module provides no variables.</td> +   </tr> + </tbody> +</table> + +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module provides no macros.</td> +   </tr> + </tbody> +</table> + +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20160403 +Initial release. diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/doxygen.mk b/lib/lufa/LUFA/Build/DMBS/DMBS/doxygen.mk new file mode 100644 index 0000000000..45639ad156 --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/doxygen.mk @@ -0,0 +1,62 @@ +# +#            DMBS Build System +#     Released into the public domain. +# +#  dean [at] fourwalledcubicle [dot] com +#        www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES         += DOXYGEN +DMBS_BUILD_TARGETS         += doxygen doxygen-upgrade doxygen-create +DMBS_BUILD_MANDATORY_VARS  += +DMBS_BUILD_OPTIONAL_VARS   += DOXYGEN_CONF DOXYGEN_FAIL_ON_WARNING DOXYGEN_OVERRIDE_PARAMS +DMBS_BUILD_PROVIDED_VARS   += +DMBS_BUILD_PROVIDED_MACROS += + +# Conditionally import the CORE module of DMBS if it is not already imported +DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) +  include $(DMBS_MODULE_PATH)/core.mk +endif + +# Default values of optionally user-supplied variables +DOXYGEN_CONF            ?= doxyfile +DOXYGEN_FAIL_ON_WARNING ?= Y +DOXYGEN_OVERRIDE_PARAMS ?= QUIET=YES + +# Sanity check user supplied values +$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, DOXYGEN_CONF) +$(call ERROR_IF_NONBOOL, DOXYGEN_FAIL_ON_WARNING) + +# Output Messages +MSG_DOXYGEN_CMD         := ' [DOXYGEN] :' + +# Determine Doxygen invocation command +BASE_DOXYGEN_CMD := ( cat $(DOXYGEN_CONF) $(DOXYGEN_OVERRIDE_PARAMS:%=; echo "%") ) | doxygen - +ifeq ($(DOXYGEN_FAIL_ON_WARNING), Y) +   DOXYGEN_CMD := if ( $(BASE_DOXYGEN_CMD) 2>&1 | grep -v "warning: ignoring unsupported tag" ;); then exit 1; fi; +else +   DOXYGEN_CMD := $(BASE_DOXYGEN_CMD) +endif + +# Error if the specified Doxygen configuration file does not exist +$(DOXYGEN_CONF): +	$(error Doxygen configuration file $@ does not exist) + +# Builds the project documentation using the specified configuration file and the DOXYGEN tool +doxygen: $(DOXYGEN_CONF) $(MAKEFILE_LIST) +	@echo $(MSG_DOXYGEN_CMD) Configuration file \"$(DOXYGEN_CONF)\" with parameters \"$(DOXYGEN_OVERRIDE_PARAMS)\" +	$(DOXYGEN_CMD) + +# Upgrades an existing Doxygen configuration file to the latest Doxygen template, preserving settings +doxygen-upgrade: $(DOXYGEN_CONF) $(MAKEFILE_LIST) +	@echo $(MSG_DOXYGEN_CMD) Upgrading configuration file \"$(DOXYGEN_CONF)\" with latest template +	doxygen -u $(DOXYGEN_CONF) > /dev/null + +# Creates a new Doxygen configuration file with the set file name +doxygen-create: $(MAKEFILE_LIST) +	@echo $(MSG_DOXYGEN_CMD) Creating new configuration file \"$(DOXYGEN_CONF)\" with latest template +	doxygen -g $(DOXYGEN_CONF) > /dev/null + + diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/gcc.md b/lib/lufa/LUFA/Build/DMBS/DMBS/gcc.md new file mode 100644 index 0000000000..d28fd9ae45 --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/gcc.md @@ -0,0 +1,211 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: GCC +----------------- + +The GCC module provides build targets to compile a user application, using a +variant of GCC for a specific target architecture (such as `avr-gcc`). + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + +    include $(DMBS_PATH)/gcc.mk + +## Prerequisites: + +This module requires the GCC compiler to be installed and available in the +system's `PATH` variable for the desired target architecture. + +## Build Targets: + +The following targets are supported by this module: + +<table> + <tbody> +   <tr> +    <td>size</td> +    <td>Show the compiled binary size for the various memory segments.</td> +   </tr> +   <tr> +    <td>symbol-sizes</td> +    <td>Show the size of each symbol in the compiled binary (useful to find large functions to optimize further).</td> +   </tr> +   <tr> +    <td>all</td> +    <td>Build application and generate all binary (BIN, ELF, HEX) and auxiliary (LSS, MAP, SYM, etc.) output files.</td> +   </tr> +   <tr> +    <td>lib</td> +    <td>Generate a static `.a` library from the application code, containing the flash region's data.</td> +   </tr> +   <tr> +    <td>elf</td> +    <td>Generate an ELF debug file from the application code, containing all region's data.</td> +   </tr> +   <tr> +    <td>bin</td> +    <td>Generate a flat BIN binary file from the application code, containing the flash region's data.</td> +   </tr> +   <tr> +    <td>hex</td> +    <td>Generate a pair of Intel HEX files from the application code, containing the flash region's data (HEX) and EEPROM data (EEP).</td> +   </tr> +   <tr> +    <td>lss</td> +    <td>Generate a LSS listing file showing the disassembly of the compiled application.</td> +   </tr> +   <tr> +    <td>clean</td> +    <td>Remove all generated project intermediary and binary output files.</td> +   </tr> +   <tr> +    <td>mostlyclean</td> +    <td>Remove all generated project intermediary output files, but preserve the binary output files.</td> +   </tr> + </tbody> +</table> + +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + +<table> + <tbody> +   <tr> +    <td>MCU</td> +    <td>Name of the Atmel processor model (e.g. `at90usb1287`).</td> +   </tr> +   <tr> +    <td>TARGET</td> +    <td>Name of the application output file prefix (e.g. `TestApplication`).</td> +   </tr> +   <tr> +    <td>ARCH</td> +    <td>Target device architecture (e.g. `AVR8`).</td> +   </tr> +   <tr> +     <td>SRC</td> +     <td>List of all project source files (C, C++, ASM).</td> +   </tr> + </tbody> +</table> + +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + +<table> + <tbody> +   <tr> +    <td>COMPILER_PATH</td> +    <td>Path to the compiler to use, in case a specific compiler should be substituted for the one in the system's `PATH` variable. Default is blank (use `PATH` provided compiler).</td> +   </tr> +   <tr> +    <td>OPTIMIZATION</td> +    <td>Optimization level to use when compiling C and C++ source files. Default is `s` (optimize for smallest size).</td> +   </tr> +   <tr> +    <td>C_STANDARD</td> +    <td>C language standard used when compiling C language source files. Default is `gnu99` (C99 standard with GNU extensions)./td> +   </tr> +   <tr> +    <td>CPP_STANDARD</td> +    <td>C++ language standard used when compiling C++ language source files. Default is `gnu++98` (C++98 standard with GNU extensions)./td> +   </tr> +   <tr> +    <td>F_CPU</td> +    <td>Processor core clock frequency, in Hz. This is used by some architectures for functions such as software spin-loop delays. Default is blank (no value defined).</td> +   </tr> +   <tr> +    <td>C_FLAGS</td> +    <td>Common GCC flags passed to the compiler for C language (C) input files. Default is blank (no additional flags).</td> +   </tr> +   <tr> +    <td>CPP_FLAGS</td> +    <td>Common GCC flags passed to the compiler for C++ language (CPP) input files. Default is blank (no additional flags).</td> +   </tr> +   <tr> +    <td>ASM_FLAGS</td> +    <td>Common GCC flags passed to the assembler for assembly language (S) input files. Default is blank (no additional flags).</td> +   </tr> +   <tr> +    <td>CC_FLAGS</td> +    <td>Common GCC flags passed to the compiler for all source file types. Default is blank (no additional flags).</td> +   </tr> +   <tr> +    <td>LD_FLAGS</td> +    <td>Extra flags to pass to the GNU linker when linking the compiled object files into the resulting binary. Default is blank (no additional flags).</td> +   </tr> +   <tr> +    <td>LINKER_RELAXATIONS</td> +    <td>Boolean, if `Y` linker relaxations will be enabled to slightly reduce the resulting binary's size. Default is `Y`.</td> +   </tr> +   <tr> +    <td>JUMP_TABLES</td> +    <td>Boolean, if `Y` jump tables will be enabled to slightly reduce the resulting binary's size - note that this can cause incorrect jumps if the binary is relocated after compilation, such as for a bootloader. Default is `N`.</td> +   </tr> +   <tr> +    <td>OBJDIR</td> +    <td>Directory to store the intermediate object files, as they are generated from the source files. Default is `obj`.</td> +   </tr> +   <tr> +    <td>OBJECT_FILES</td> +    <td>List of additional `.o` object files to link into the final binary. Default is blank (no additional objects).</td> +   </tr> +   <tr> +    <td>DEBUG_FORMAT</td> +    <td>Debug ELF file format to generate. Default is `dwarf-2`.</td> +   </tr> +   <tr> +    <td>DEBUG_LEVEL</td> +    <td>Level of the debugging information to generate in the compiled object files. Debug is 2 (medium level debugging information).</td> +   </tr> + </tbody> +</table> + +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module provides no variables.</td> +   </tr> + </tbody> +</table> + +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module provides no macros.</td> +   </tr> + </tbody> +</table> + +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20170426 +Added `JUMP_TABLES` optional variable. + +### 20160403 +Initial release. diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/gcc.mk b/lib/lufa/LUFA/Build/DMBS/DMBS/gcc.mk new file mode 100644 index 0000000000..6126cf97fc --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/gcc.mk @@ -0,0 +1,273 @@ +# +#            DMBS Build System +#     Released into the public domain. +# +#  dean [at] fourwalledcubicle [dot] com +#        www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES         += GCC +DMBS_BUILD_TARGETS         += size symbol-sizes all lib elf bin hex lss clean mostlyclean +DMBS_BUILD_MANDATORY_VARS  += TARGET ARCH MCU SRC +DMBS_BUILD_OPTIONAL_VARS   += COMPILER_PATH OPTIMIZATION C_STANDARD CPP_STANDARD F_CPU C_FLAGS CPP_FLAGS ASM_FLAGS CC_FLAGS LD_FLAGS OBJDIR OBJECT_FILES DEBUG_TYPE DEBUG_LEVEL LINKER_RELAXATIONS JUMP_TABLES +DMBS_BUILD_PROVIDED_VARS   += +DMBS_BUILD_PROVIDED_MACROS += + +# Conditionally import the CORE module of DMBS if it is not already imported +DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) +  include $(DMBS_MODULE_PATH)/core.mk +endif + +# Default values of optionally user-supplied variables +COMPILER_PATH      ?= +OPTIMIZATION       ?= s +F_CPU              ?= +C_STANDARD         ?= gnu99 +CPP_STANDARD       ?= gnu++98 +C_FLAGS            ?= +CPP_FLAGS          ?= +ASM_FLAGS          ?= +CC_FLAGS           ?= +OBJDIR             ?= obj +OBJECT_FILES       ?= +DEBUG_FORMAT       ?= dwarf-2 +DEBUG_LEVEL        ?= 2 +LINKER_RELAXATIONS ?= Y +JUMP_TABLES        ?= N + +# Sanity check user supplied values +$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, MCU) +$(call ERROR_IF_EMPTY, TARGET) +$(call ERROR_IF_EMPTY, ARCH) +$(call ERROR_IF_EMPTY, OPTIMIZATION) +$(call ERROR_IF_EMPTY, C_STANDARD) +$(call ERROR_IF_EMPTY, CPP_STANDARD) +$(call ERROR_IF_EMPTY, OBJDIR) +$(call ERROR_IF_EMPTY, DEBUG_FORMAT) +$(call ERROR_IF_EMPTY, DEBUG_LEVEL) +$(call ERROR_IF_NONBOOL, LINKER_RELAXATIONS) +$(call ERROR_IF_NONBOOL, JUMP_TABLES) + +# Determine the utility prefix to use for the selected architecture +ifeq ($(ARCH), AVR8) +   CROSS        := $(COMPILER_PATH)avr +else ifeq ($(ARCH), XMEGA) +   CROSS        := $(COMPILER_PATH)avr +else ifeq ($(ARCH), UC3) +   CROSS        := $(COMPILER_PATH)avr32 +else +   $(error Unsupported architecture "$(ARCH)") +endif + +# Output Messages +MSG_INFO_MESSAGE := ' [INFO]    :' +MSG_COMPILE_CMD  := ' [GCC]     :' +MSG_ASSEMBLE_CMD := ' [GAS]     :' +MSG_NM_CMD       := ' [NM]      :' +MSG_REMOVE_CMD   := ' [RM]      :' +MSG_LINK_CMD     := ' [LNK]     :' +MSG_ARCHIVE_CMD  := ' [AR]      :' +MSG_SIZE_CMD     := ' [SIZE]    :' +MSG_OBJCPY_CMD   := ' [OBJCPY]  :' +MSG_OBJDMP_CMD   := ' [OBJDMP]  :' + +# Convert input source file list to differentiate them by type +C_SOURCE   := $(filter %.c, $(SRC)) +CPP_SOURCE := $(filter %.cpp, $(SRC)) +ASM_SOURCE := $(filter %.S, $(SRC)) + +# Create a list of unknown source file types, if any are found throw an error +UNKNOWN_SOURCE := $(filter-out $(C_SOURCE) $(CPP_SOURCE) $(ASM_SOURCE), $(SRC)) +ifneq ($(UNKNOWN_SOURCE),) +   $(error Unknown input source file formats: $(UNKNOWN_SOURCE)) +endif + +# Convert input source filenames into a list of required output object files +OBJECT_FILES += $(addsuffix .o, $(basename $(SRC))) + +# Check if an output object file directory was specified instead of the input file location +ifneq ($(OBJDIR),.) +   # Prefix all the object filenames with the output object file directory path +   OBJECT_FILES    := $(addprefix $(patsubst %/,%,$(OBJDIR))/, $(notdir $(OBJECT_FILES))) + +   # Check if any object file (without path) appears more than once in the object file list +   ifneq ($(words $(sort $(OBJECT_FILES))), $(words $(OBJECT_FILES))) +       $(error Cannot build with OBJDIR parameter set - one or more object file name is not unique) +   endif + +   # Create the output object file directory if it does not exist and add it to the virtual path list +   $(shell mkdir -p $(OBJDIR) 2> /dev/null) +   VPATH           += $(dir $(SRC)) +endif + +# Create a list of dependency files from the list of object files +DEPENDENCY_FILES := $(OBJECT_FILES:%.o=%.d) + +# Create a list of common flags to pass to the compiler/linker/assembler +BASE_CC_FLAGS    := -pipe -g$(DEBUG_FORMAT) -g$(DEBUG_LEVEL) +ifneq ($(findstring $(ARCH), AVR8 XMEGA),) +   BASE_CC_FLAGS += -mmcu=$(MCU) -fshort-enums -fno-inline-small-functions -fpack-struct +else ifneq ($(findstring $(ARCH), UC3),) +   BASE_CC_FLAGS += -mpart=$(MCU:at32%=%) -masm-addr-pseudos +endif +BASE_CC_FLAGS += -Wall -fno-strict-aliasing -funsigned-char -funsigned-bitfields -ffunction-sections +BASE_CC_FLAGS += -I. +BASE_CC_FLAGS += -DARCH=ARCH_$(ARCH) +ifneq ($(F_CPU),) +   BASE_CC_FLAGS += -DF_CPU=$(F_CPU)UL +endif +ifeq ($(LINKER_RELAXATIONS), Y) +   BASE_CC_FLAGS += -mrelax +endif +ifeq ($(JUMP_TABLES), N) +   # This flag is required for bootloaders as GCC will emit invalid jump table +   # assembly code for devices with large amounts of flash; the jump table target +   # is extracted from FLASH without using the correct ELPM instruction, resulting +   # in a pseudo-random jump target. +   BASE_CC_FLAGS += -fno-jump-tables +endif + +# Additional language specific compiler flags +BASE_C_FLAGS   := -x c -O$(OPTIMIZATION) -std=$(C_STANDARD) -Wstrict-prototypes +BASE_CPP_FLAGS := -x c++ -O$(OPTIMIZATION) -std=$(CPP_STANDARD) +BASE_ASM_FLAGS := -x assembler-with-cpp + +# Create a list of flags to pass to the linker +BASE_LD_FLAGS := -lm -Wl,-Map=$(TARGET).map,--cref -Wl,--gc-sections +ifeq ($(LINKER_RELAXATIONS), Y) +   BASE_LD_FLAGS += -Wl,--relax +endif +ifneq ($(findstring $(ARCH), AVR8 XMEGA),) +   BASE_LD_FLAGS += -mmcu=$(MCU) +else ifneq ($(findstring $(ARCH), UC3),) +   BASE_LD_FLAGS += -mpart=$(MCU:at32%=%) --rodata-writable --direct-data +endif + +# Determine flags to pass to the size utility based on its reported features (only invoke if size target required) +# and on an architecture where this non-standard patch is available +ifneq ($(ARCH), UC3) +size: SIZE_MCU_FLAG    := $(shell $(CROSS)-size --help | grep -- --mcu > /dev/null && echo --mcu=$(MCU) ) +size: SIZE_FORMAT_FLAG := $(shell $(CROSS)-size --help | grep -- --format=.*avr > /dev/null && echo --format=avr ) +endif + +# Pre-build informational target, to give compiler and project name information when building +build_begin: +	@echo $(MSG_INFO_MESSAGE) Begin compilation of project \"$(TARGET)\"... +	@echo "" +	@$(CROSS)-gcc --version + +# Post-build informational target, to project name information when building has completed +build_end: +	@echo $(MSG_INFO_MESSAGE) Finished building project \"$(TARGET)\". + +# Prints size information of a compiled application (FLASH, RAM and EEPROM usages) +size: $(TARGET).elf +	@echo $(MSG_SIZE_CMD) Determining size of \"$<\" +	@echo "" +	$(CROSS)-size $(SIZE_MCU_FLAG) $(SIZE_FORMAT_FLAG) $< + +# Prints size information on the symbols within a compiled application in decimal bytes +symbol-sizes: $(TARGET).elf +	@echo $(MSG_NM_CMD) Extracting \"$<\" symbols with decimal byte sizes +	$(CROSS)-nm --size-sort --demangle --radix=d $< + +# Cleans intermediary build files, leaving only the compiled application files +mostlyclean: +	@echo $(MSG_REMOVE_CMD) Removing object files of \"$(TARGET)\" +	rm -f $(OBJECT_FILES) +	@echo $(MSG_REMOVE_CMD) Removing dependency files of \"$(TARGET)\" +	rm -f $(DEPENDENCY_FILES) + +# Cleans all build files, leaving only the original source code +clean: mostlyclean +	@echo $(MSG_REMOVE_CMD) Removing output files of \"$(TARGET)\" +	rm -f $(TARGET).elf $(TARGET).hex $(TARGET).bin $(TARGET).eep $(TARGET).map $(TARGET).lss $(TARGET).sym lib$(TARGET).a + +# Performs a complete build of the user application and prints size information afterwards +all: build_begin elf hex bin lss sym size build_end + +# Helper targets, to build a specific type of output file without having to know the project target name +lib: lib$(TARGET).a +elf: $(TARGET).elf +hex: $(TARGET).hex $(TARGET).eep +bin: $(TARGET).bin +lss: $(TARGET).lss +sym: $(TARGET).sym + +# Default target to *create* the user application's specified source files; if this rule is executed by +# make, the input source file doesn't exist and an error needs to be presented to the user +$(SRC): +	$(error Source file does not exist: $@) + +# Compiles an input C source file and generates an assembly listing for it +%.s: %.c $(MAKEFILE_LIST) +	@echo $(MSG_COMPILE_CMD) Generating assembly from C file \"$(notdir $<)\" +	$(CROSS)-gcc -S $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) $< -o $@ + +# Compiles an input C++ source file and generates an assembly listing for it +%.s: %.cpp $(MAKEFILE_LIST) +	@echo $(MSG_COMPILE_CMD) Generating assembly from C++ file \"$(notdir $<)\" +	$(CROSS)-gcc -S $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) $< -o $@ + +# Compiles an input C source file and generates a linkable object file for it +$(OBJDIR)/%.o: %.c $(MAKEFILE_LIST) +	@echo $(MSG_COMPILE_CMD) Compiling C file \"$(notdir $<)\" +	$(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_C_FLAGS) $(CC_FLAGS) $(C_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ + +# Compiles an input C++ source file and generates a linkable object file for it +$(OBJDIR)/%.o: %.cpp $(MAKEFILE_LIST) +	@echo $(MSG_COMPILE_CMD) Compiling C++ file \"$(notdir $<)\" +	$(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_CPP_FLAGS) $(CC_FLAGS) $(CPP_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ + +# Assembles an input ASM source file and generates a linkable object file for it +$(OBJDIR)/%.o: %.S $(MAKEFILE_LIST) +	@echo $(MSG_ASSEMBLE_CMD) Assembling \"$(notdir $<)\" +	$(CROSS)-gcc -c $(BASE_CC_FLAGS) $(BASE_ASM_FLAGS) $(CC_FLAGS) $(ASM_FLAGS) -MMD -MP -MF $(@:%.o=%.d) $< -o $@ + +# Generates a library archive file from the user application, which can be linked into other applications +.PRECIOUS  : $(OBJECT_FILES) +.SECONDARY : %.a +%.a: $(OBJECT_FILES) +	@echo $(MSG_ARCHIVE_CMD) Archiving object files into \"$@\" +	$(CROSS)-ar rcs $@ $(OBJECT_FILES) + +# Generates an ELF debug file from the user application, which can be further processed for FLASH and EEPROM data +# files, or used for programming and debugging directly +.PRECIOUS  : $(OBJECT_FILES) +.SECONDARY : %.elf +%.elf: $(OBJECT_FILES) +	@echo $(MSG_LINK_CMD) Linking object files into \"$@\" +	$(CROSS)-gcc $^ -o $@ $(BASE_LD_FLAGS) $(LD_FLAGS) + +# Extracts out the loadable FLASH memory data from the project ELF file, and creates an Intel HEX format file of it +%.hex: %.elf +	@echo $(MSG_OBJCPY_CMD) Extracting HEX file data from \"$<\" +	$(CROSS)-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature $< $@ + +# Extracts out the loadable FLASH memory data from the project ELF file, and creates an Binary format file of it +%.bin: %.elf +	@echo $(MSG_OBJCPY_CMD) Extracting BIN file data from \"$<\" +	$(CROSS)-objcopy -O binary -R .eeprom -R .fuse -R .lock -R .signature $< $@ + +# Extracts out the loadable EEPROM memory data from the project ELF file, and creates an Intel HEX format file of it +%.eep: %.elf +	@echo $(MSG_OBJCPY_CMD) Extracting EEP file data from \"$<\" +	$(CROSS)-objcopy -O ihex -j .eeprom --set-section-flags=.eeprom="alloc,load" --change-section-lma .eeprom=0 --no-change-warnings $< $@ || exit 0 + +# Creates an assembly listing file from an input project ELF file, containing interleaved assembly and source data +%.lss: %.elf +	@echo $(MSG_OBJDMP_CMD) Extracting LSS file data from \"$<\" +	$(CROSS)-objdump -h -d -S -z $< > $@ + +# Creates a symbol file listing the loadable and discarded symbols from an input project ELF file +%.sym: %.elf +	@echo $(MSG_NM_CMD) Extracting SYM file data from \"$<\" +	$(CROSS)-nm -n $< > $@ + +# Include build dependency files +-include $(DEPENDENCY_FILES) + +# Phony build targets for this module +.PHONY: build_begin build_end $(DMBS_BUILD_TARGETS) diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/hid.md b/lib/lufa/LUFA/Build/DMBS/DMBS/hid.md new file mode 100644 index 0000000000..b2dfbf7136 --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/hid.md @@ -0,0 +1,129 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Module: HID +----------------- + +The HID module provides build targets to program a target running a PJRC Teensy +or LUFA compatible HID class bootloader. + +## Importing This Module into a Makefile: + +To use this module in your application makefile, add the following code to your +makefile: + +    include $(DMBS_PATH)/hid.mk + +## Prerequisites: + +This module requires the `teensy_loader_cli` utility to be available in your +system's `PATH` variable. The `teensy_loader_cli` utility is distributed in +a modified form (from PJRC) in the LUFA project's +[official site](http://www.lufa-lib.org/), but is also +made available in its original form directly from the  +[PJRC website](https://www.pjrc.com/teensy/loader_cli.html). Note that the +original tool works with Teensy boards only, and not LUFA HID bootloader +devices. + +This module requires the `hid_bootloader_cli` utility to be available in your +system's `PATH` variable. The `hid_bootloader_cli` Python script utility is +distributed in LUFA project's [official site](http://www.lufa-lib.org/). + +This module requires the AVR-GCC compiler to be installed and available in the +system's `PATH` variable. + +## Build Targets: + +The following targets are supported by this module: + +<table> + <tbody> +   <tr> +    <td>hid</td> +    <td>Program a LUFA HID class bootloader device, using the `hid_bootloader_cli.py` Python script.</td> +   </tr> +   <tr> +    <td>hid-ee</td> +    <td>Program a LUFA HID class bootloader device's EEPROM, using the `hid_bootloader_cli.py` Python script and a shim application which is programmed into the target's flash.</td> +   </tr> +   <tr> +    <td>teensy</td> +    <td>Program a LUFA HID class bootloader device or Teensy board, using the `teensy_loader_cli` tool.</td> +   </tr> +   <tr> +    <td>teensy-ee</td> +    <td>Program a LUFA HID class bootloader device's EEPROM, using the `teensy_loader_cli` tool and a shim application which is programmed into the target's flash.</td> +   </tr> + </tbody> +</table> + +## Mandatory Variables: + +The following variables must be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile to be able to use this module: + +<table> + <tbody> +   <tr> +    <td>MCU</td> +    <td>Name of the Atmel processor model (e.g. `at90usb1287`).</td> +   </tr> +   <tr> +    <td>TARGET</td> +    <td>Name of the application output file prefix (e.g. `TestApplication`).</td> +   </tr>    + </tbody> +</table> + +## Optional Variables: + +The following variables may be defined (with a `NAME = VALUE` syntax, one +variable per line) in the user makefile. If not specified, a default value will +be assumed. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module has no optional variables.</td> +   </tr> + </tbody> +</table> + +## Provided Variables: + +The following variables may be referenced in a user makefile (via `$(NAME)` +syntax) if desired, as they are provided by this module. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module provides no variables.</td> +   </tr> + </tbody> +</table> + +## Provided Macros: + +The following macros may be referenced in a user makefile (via +`$(call NAME, ARG1, ARG2, ...)` syntax) if desired, as they are provided by +this module. + +<table> + <tbody> +   <tr> +    <td>N/A</td> +    <td>This module provides no macros.</td> +   </tr> + </tbody> +</table> + +## Module Changelog: + +The changes to this module since its initial release are listed below, as of the +DMBS version where the change was made. + +### 20160403 +Initial release. diff --git a/lib/lufa/LUFA/Build/DMBS/DMBS/hid.mk b/lib/lufa/LUFA/Build/DMBS/DMBS/hid.mk new file mode 100644 index 0000000000..7a0ad9d0e6 --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/DMBS/hid.mk @@ -0,0 +1,57 @@ +# +#            DMBS Build System +#     Released into the public domain. +# +#  dean [at] fourwalledcubicle [dot] com +#        www.fourwalledcubicle.com +# + +DMBS_BUILD_MODULES         += HID +DMBS_BUILD_TARGETS         += hid hid-ee teensy teensy-ee +DMBS_BUILD_MANDATORY_VARS  += MCU TARGET +DMBS_BUILD_OPTIONAL_VARS   += +DMBS_BUILD_PROVIDED_VARS   += +DMBS_BUILD_PROVIDED_MACROS += + +# Conditionally import the CORE module of DMBS if it is not already imported +DMBS_MODULE_PATH := $(patsubst %/,%,$(dir $(lastword $(MAKEFILE_LIST)))) +ifeq ($(findstring CORE, $(DMBS_BUILD_MODULES)),) +  include $(DMBS_MODULE_PATH)/core.mk +endif + +# Sanity-check values of mandatory user-supplied variables +$(foreach MANDATORY_VAR, $(DMBS_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, MCU) +$(call ERROR_IF_EMPTY, TARGET) + +# Output Messages +MSG_HID_BOOTLOADER_CMD := ' [HID]     :' +MSG_OBJCPY_CMD         := ' [OBJCPY]  :' +MSG_MAKE_CMD           := ' [MAKE]    :' + +# Programs in the target FLASH memory using the HID_BOOTLOADER_CLI tool +hid: $(TARGET).hex $(MAKEFILE_LIST) +	@echo $(MSG_HID_BOOTLOADER_CMD) Programming FLASH with hid_bootloader_cli using \"$<\" +	hid_bootloader_cli -mmcu=$(MCU) -v $< + +# Programs in the target EEPROM memory using the HID_BOOTLOADER_CLI tool (note: clears target FLASH memory) +hid-ee: $(TARGET).eep $(MAKEFILE_LIST) +	@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a binary file \"InputEEData.bin\" +	avr-objcopy -I ihex -O binary $< $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/InputEEData.bin +	@echo $(MSG_MAKE_CMD) Making EEPROM loader application for \"$<\" +	$(MAKE) -C $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/ MCU=$(MCU) clean hid + +# Programs in the target FLASH memory using the TEENSY_BOOTLOADER_CLI tool +teensy: $(TARGET).hex $(MAKEFILE_LIST) +	@echo $(MSG_HID_BOOTLOADER_CMD) Programming FLASH with teensy_loader_cli using \"$<\" +	teensy_loader_cli -mmcu=$(MCU) -v $< + +# Programs in the target EEPROM memory using the TEENSY_BOOTLOADER_CLI tool (note: clears target FLASH memory) +teensy-ee: $(TARGET).hex $(MAKEFILE_LIST) +	@echo $(MSG_OBJCPY_CMD) Converting \"$<\" to a binary file \"InputEEData.bin\" +	avr-objcopy -I ihex -O binary $< $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/InputEEData.bin +	@echo $(MSG_MAKE_CMD) Making EEPROM loader application for \"$<\" +	$(MAKE) -s -C $(DMBS_MODULE_PATH)/HID_EEPROM_Loader/ MCU=$(MCU) clean teensy + +# Phony build targets for this module +.PHONY: $(DMBS_BUILD_TARGETS) diff --git a/lib/lufa/LUFA/Build/DMBS/Readme.md b/lib/lufa/LUFA/Build/DMBS/Readme.md new file mode 100644 index 0000000000..f4f7a5f15c --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/Readme.md @@ -0,0 +1,123 @@ +DMBS - Dean's Makefile Build System +=================================== + + +Project Overview +---------------- + +GNU Make is scary, and it's tough to get the rules right sometimes. Many +projects get by via simple copy-pasting of old makefiles, resulting in many +redundant copies of the same old rules. DMBS aims to solve this by providing a +simple modular set of makefiles which can be included by your project to quickly +add various build functionality. + +This aims to replace the old WinAVR "mfile" makefile template, giving better +functionality and much simpler user makefiles. + + +Benefits: +---------------- + +Apart from much simpler, cleaner makefiles DMBS carries the aim of making the +process of troubleshooting build issues a little easier. Lots can go wrong, so +DMBS tries to sanity check its inputs wherever possible, and produce +human-readable error messages. Forgotten to set a variable? Get a +`Makefile {X} value not set.` message, rather than a possibly unrelated message. +Have the wrong filename? See `Source file does not exist: {X}` rather than the +infamous `No rule to make target {X}` message. + + +Use: +---------------- + +A template user makefile is provided in the `Template` directory. DMBS modules +are included via a GNU Make `include` directive. While the DMBS `core` module is +always required, you can pick and choose what other modules you wish to add to +your user project. + +[See here for the documentation on the individual modules provided by DMBS.](DMBS/ModulesOverview.md) +If you're interested in writing your own DMBS module(s), [see here.](DMBS/WritingYourOwnModules.md) + +Here's an example user makefile: + +	MCU          = atmega128 +	ARCH         = AVR8 +	F_CPU        = 8000000 +	OPTIMIZATION = s +	TARGET       = Template +	SRC          = $(TARGET).c +	CC_FLAGS     = +	LD_FLAGS     = + +	# Default target +	all: + +	# Include DMBS build script makefiles +	DMBS_PATH   ?= ../DMBS +	include $(DMBS_PATH)/core.mk +	include $(DMBS_PATH)/gcc.mk +	include $(DMBS_PATH)/cppcheck.mk +	include $(DMBS_PATH)/doxygen.mk +	include $(DMBS_PATH)/dfu.mk +	include $(DMBS_PATH)/hid.mk +	include $(DMBS_PATH)/avrdude.mk +	include $(DMBS_PATH)/atprogram.mk + +Each DMBS module can optionally supply one or more Make variables and macros, +which you can reference in your user makefile. Additionally, modules can require +one or more variables to be set by the user makefile, with (in some cases) sane +defaults used if left out. + +As modules are added, you can get a list of available targets by simply typing +`make help` from the command line. This will produce a formatted list of targets +as well as mandatory and optional variables and exposed variables and macros. + + +Distribution +---------------- + +You can embed DMBS in your project any way you like - some options are: +1. A git submodule +2. A source tarball +3. A manually copied extracted archive + +The intention of DMBS is that users can just import it from whatever source +they like. If your project needs to extend the existing modules in an unusual +manner, or if you want to provide your own modules, you can include them in +your project repository (or submit a patch to DMBS if your module is generic +enough to warrant wide use). + + +License +---------------- + +DMBS is released into the public domain, making is suitable for use everywhere, +by everyone. Contributions are greatly appreciated however, in order to make +DMBS better for everyone. + +The actual license text is as follows: + +	This is free and unencumbered software released into the public domain. + +	Anyone is free to copy, modify, publish, use, compile, sell, or +	distribute this software, either in source code form or as a compiled +	binary, for any purpose, commercial or non-commercial, and by any +	means. + +	In jurisdictions that recognize copyright laws, the author or authors +	of this software dedicate any and all copyright interest in the +	software to the public domain. We make this dedication for the benefit +	of the public at large and to the detriment of our heirs and +	successors. We intend this dedication to be an overt act of +	relinquishment in perpetuity of all present and future rights to this +	software under copyright law. + +	THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +	EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +	MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +	IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +	OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +	ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +	OTHER DEALINGS IN THE SOFTWARE. + +	For more information, please refer to <http://unlicense.org/> diff --git a/lib/lufa/LUFA/Build/DMBS/Template/Template.c b/lib/lufa/LUFA/Build/DMBS/Template/Template.c new file mode 100644 index 0000000000..95d36f7dbf --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/Template/Template.c @@ -0,0 +1,12 @@ +/* +             DMBS Build System +      Released into the public domain. + +   dean [at] fourwalledcubicle [dot] com +         www.fourwalledcubicle.com + */ + +int main(void) +{ +	// Application code here. +} diff --git a/lib/lufa/LUFA/Build/DMBS/Template/makefile b/lib/lufa/LUFA/Build/DMBS/Template/makefile new file mode 100644 index 0000000000..d88292388c --- /dev/null +++ b/lib/lufa/LUFA/Build/DMBS/Template/makefile @@ -0,0 +1,32 @@ +# +#            DMBS Build System +#     Released into the public domain. +# +#  dean [at] fourwalledcubicle [dot] com +#        www.fourwalledcubicle.com +# + +# Run "make help" for target help. + +MCU          = atmega128 +ARCH         = AVR8 +F_CPU        = 8000000 +OPTIMIZATION = s +TARGET       = Template +SRC          = $(TARGET).c +CC_FLAGS     = +LD_FLAGS     = + +# Default target +all: + +# Include DMBS build script makefiles +DMBS_PATH   ?= ../DMBS +include $(DMBS_PATH)/core.mk +include $(DMBS_PATH)/gcc.mk +include $(DMBS_PATH)/cppcheck.mk +include $(DMBS_PATH)/doxygen.mk +include $(DMBS_PATH)/dfu.mk +include $(DMBS_PATH)/hid.mk +include $(DMBS_PATH)/avrdude.mk +include $(DMBS_PATH)/atprogram.mk diff --git a/lib/lufa/LUFA/Build/LUFA/lufa-gcc.mk b/lib/lufa/LUFA/Build/LUFA/lufa-gcc.mk new file mode 100644 index 0000000000..f824362e4d --- /dev/null +++ b/lib/lufa/LUFA/Build/LUFA/lufa-gcc.mk @@ -0,0 +1,43 @@ +# +#             LUFA Library +#     Copyright (C) Dean Camera, 2015. +# +#  dean [at] fourwalledcubicle [dot] com +#           www.lufa-lib.org +# + +DMBS_BUILD_MODULES         += LUFA_GCC +DMBS_BUILD_TARGETS         += +DMBS_BUILD_MANDATORY_VARS  += LUFA_PATH ARCH F_USB +DMBS_BUILD_OPTIONAL_VARS   += BOARD +DMBS_BUILD_PROVIDED_VARS   += +DMBS_BUILD_PROVIDED_MACROS += + +SHELL = /bin/sh + +ERROR_IF_UNSET   ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) +ERROR_IF_EMPTY   ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) +ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) + +# Sanity check user supplied values +$(call ERROR_IF_EMPTY, LUFA_PATH) +$(call ERROR_IF_EMPTY, ARCH) +$(call ERROR_IF_EMPTY, F_USB) + +# Default values of optionally user-supplied variables +BOARD ?= NONE + +# Determine the utility prefix to use for the selected architecture +ifeq ($(ARCH), XMEGA) +   $(warning The XMEGA device support is currently EXPERIMENTAL (incomplete and/or non-functional), and is included for preview purposes only.) +else ifeq ($(ARCH), UC3) +   $(warning The UC3 device support is currently EXPERIMENTAL (incomplete and/or non-functional), and is included for preview purposes only.) +endif + +# Common LUFA C/C++ includes/definitions +LUFA_CXX_INCLUDES = -I. -I$(patsubst %/,%,$(LUFA_PATH))/.. +LUFA_CXX_DEFINES  = -DARCH=ARCH_$(ARCH) -DBOARD=BOARD_$(BOARD) -DF_USB=$(F_USB)UL + +# LUFA specific standard build options +C_FLAGS   += $(LUFA_CXX_INCLUDES) $(LUFA_CXX_DEFINES) $(LUFA_CXX_FLAGS) +CPP_FLAGS += $(LUFA_CXX_INCLUDES) $(LUFA_CXX_DEFINES) $(LUFA_CXX_FLAGS) diff --git a/lib/lufa/LUFA/Build/LUFA/lufa-sources.mk b/lib/lufa/LUFA/Build/LUFA/lufa-sources.mk new file mode 100644 index 0000000000..7ca9a28dc9 --- /dev/null +++ b/lib/lufa/LUFA/Build/LUFA/lufa-sources.mk @@ -0,0 +1,95 @@ +# +#             LUFA Library +#     Copyright (C) Dean Camera, 2015. +# +#  dean [at] fourwalledcubicle [dot] com +#           www.lufa-lib.org +# + +DMBS_BUILD_MODULES         += LUFA_SOURCES +DMBS_BUILD_TARGETS         += +DMBS_BUILD_MANDATORY_VARS  += LUFA_PATH ARCH +DMBS_BUILD_OPTIONAL_VARS   += +DMBS_BUILD_PROVIDED_VARS   += LUFA_SRC_USB_DEVICE LUFA_SRC_USB_HOST    \ +                              LUFA_SRC_USB LUFA_SRC_USBCLASS_DEVICE    \ +                              LUFA_SRC_USBCLASS_HOST LUFA_SRC_USBCLASS \ +                              LUFA_SRC_TEMPERATURE LUFA_SRC_SERIAL     \ +                              LUFA_SRC_TWI LUFA_SRC_PLATFORM +DMBS_BUILD_PROVIDED_MACROS += + +SHELL = /bin/sh + +ERROR_IF_UNSET   ?= $(if $(filter undefined, $(origin $(strip $(1)))), $(error Makefile $(strip $(1)) value not set)) +ERROR_IF_EMPTY   ?= $(if $(strip $($(strip $(1)))), , $(error Makefile $(strip $(1)) option cannot be blank)) +ERROR_IF_NONBOOL ?= $(if $(filter Y N, $($(strip $(1)))), , $(error Makefile $(strip $(1)) option must be Y or N)) + +# Sanity check user supplied values +$(foreach MANDATORY_VAR, $(LUFA_BUILD_MANDATORY_VARS), $(call ERROR_IF_UNSET, $(MANDATORY_VAR))) +$(call ERROR_IF_EMPTY, LUFA_PATH) +$(call ERROR_IF_EMPTY, ARCH) + +# Allow LUFA_ROOT_PATH to be overridden elsewhere to support legacy LUFA makefiles +LUFA_ROOT_PATH ?= $(patsubst %/,%,$(LUFA_PATH)) + +# Construct LUFA module source variables +LUFA_SRC_USB_COMMON      := $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBController_$(ARCH).c   \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/USBInterrupt_$(ARCH).c    \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Core/ConfigDescriptors.c               \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Core/Events.c                          \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Core/USBTask.c                         \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Class/Common/HIDParser.c               \ + +LUFA_SRC_USB_HOST        := $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Host_$(ARCH).c            \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Pipe_$(ARCH).c            \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/PipeStream_$(ARCH).c      \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Core/HostStandardReq.c                 \ +                            $(LUFA_SRC_USB_COMMON) + +LUFA_SRC_USB_DEVICE      := $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Device_$(ARCH).c          \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/Endpoint_$(ARCH).c        \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Core/$(ARCH)/EndpointStream_$(ARCH).c  \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Core/DeviceStandardReq.c               \ +                            $(LUFA_SRC_USB_COMMON) + +LUFA_SRC_USBCLASS_DEVICE := $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/AudioClassDevice.c        \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/CDCClassDevice.c          \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/HIDClassDevice.c          \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/MassStorageClassDevice.c  \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/MIDIClassDevice.c         \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/PrinterClassDevice.c      \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Class/Device/RNDISClassDevice.c        \ + +LUFA_SRC_USBCLASS_HOST   := $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/AudioClassHost.c            \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/CDCClassHost.c              \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/HIDClassHost.c              \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/MassStorageClassHost.c      \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/MIDIClassHost.c             \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/PrinterClassHost.c          \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/RNDISClassHost.c            \ +                            $(LUFA_ROOT_PATH)/Drivers/USB/Class/Host/StillImageClassHost.c + +LUFA_SRC_USB             := $(sort $(LUFA_SRC_USB_COMMON) $(LUFA_SRC_USB_HOST) $(LUFA_SRC_USB_DEVICE)) + +LUFA_SRC_USBCLASS        := $(LUFA_SRC_USBCLASS_DEVICE) $(LUFA_SRC_USBCLASS_HOST) + +LUFA_SRC_TEMPERATURE     := $(LUFA_ROOT_PATH)/Drivers/Board/Temperature.c + +LUFA_SRC_SERIAL          := $(LUFA_ROOT_PATH)/Drivers/Peripheral/$(ARCH)/Serial_$(ARCH).c + +LUFA_SRC_TWI             := $(LUFA_ROOT_PATH)/Drivers/Peripheral/$(ARCH)/TWI_$(ARCH).c + +ifeq ($(ARCH), UC3) +   LUFA_SRC_PLATFORM     := $(LUFA_ROOT_PATH)/Platform/UC3/Exception.S   \ +                            $(LUFA_ROOT_PATH)/Platform/UC3/InterruptManagement.c +else +   LUFA_SRC_PLATFORM     := +endif + +# Build a list of all available module sources +LUFA_SRC_ALL_FILES   := $(LUFA_SRC_USB)            \ +                        $(LUFA_SRC_USBCLASS)       \ +                        $(LUFA_SRC_TEMPERATURE)    \ +                        $(LUFA_SRC_SERIAL)         \ +                        $(LUFA_SRC_TWI)            \ +                        $(LUFA_SRC_PLATFORM) diff --git a/lib/lufa/LUFA/Build/lufa_atprogram.mk b/lib/lufa/LUFA/Build/lufa_atprogram.mk new file mode 100644 index 0000000000..86988d1cae --- /dev/null +++ b/lib/lufa/LUFA/Build/lufa_atprogram.mk @@ -0,0 +1,10 @@ +# +#             LUFA Library +#     Copyright (C) Dean Camera, 2015. +# +#  dean [at] fourwalledcubicle [dot] com +#           www.lufa-lib.org +# + +DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/atprogram.mk diff --git a/lib/lufa/LUFA/Build/lufa_avrdude.mk b/lib/lufa/LUFA/Build/lufa_avrdude.mk new file mode 100644 index 0000000000..649215f5a3 --- /dev/null +++ b/lib/lufa/LUFA/Build/lufa_avrdude.mk @@ -0,0 +1,10 @@ +# +#             LUFA Library +#     Copyright (C) Dean Camera, 2015. +# +#  dean [at] fourwalledcubicle [dot] com +#           www.lufa-lib.org +# + +DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/avrdude.mk diff --git a/lib/lufa/LUFA/Build/lufa_build.mk b/lib/lufa/LUFA/Build/lufa_build.mk new file mode 100644 index 0000000000..f7c496e183 --- /dev/null +++ b/lib/lufa/LUFA/Build/lufa_build.mk @@ -0,0 +1,12 @@ +# +#             LUFA Library +#     Copyright (C) Dean Camera, 2015. +# +#  dean [at] fourwalledcubicle [dot] com +#           www.lufa-lib.org +# + +DMBS_PATH      ?= $(LUFA_PATH)/Build/DMBS/DMBS +DMBS_LUFA_PATH ?= $(LUFA_PATH)/Build/LUFA +include $(DMBS_PATH)/gcc.mk +include $(DMBS_LUFA_PATH)/lufa-gcc.mk diff --git a/lib/lufa/LUFA/Build/lufa_core.mk b/lib/lufa/LUFA/Build/lufa_core.mk new file mode 100644 index 0000000000..62cef9046a --- /dev/null +++ b/lib/lufa/LUFA/Build/lufa_core.mk @@ -0,0 +1,10 @@ +# +#             LUFA Library +#     Copyright (C) Dean Camera, 2015. +# +#  dean [at] fourwalledcubicle [dot] com +#           www.lufa-lib.org +# + +DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/core.mk diff --git a/lib/lufa/LUFA/Build/lufa_cppcheck.mk b/lib/lufa/LUFA/Build/lufa_cppcheck.mk new file mode 100644 index 0000000000..801a4c15c5 --- /dev/null +++ b/lib/lufa/LUFA/Build/lufa_cppcheck.mk @@ -0,0 +1,10 @@ +# +#             LUFA Library +#     Copyright (C) Dean Camera, 2015. +# +#  dean [at] fourwalledcubicle [dot] com +#           www.lufa-lib.org +# + +DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/cppcheck.mk diff --git a/lib/lufa/LUFA/Build/lufa_dfu.mk b/lib/lufa/LUFA/Build/lufa_dfu.mk new file mode 100644 index 0000000000..2100ae8f78 --- /dev/null +++ b/lib/lufa/LUFA/Build/lufa_dfu.mk @@ -0,0 +1,10 @@ +# +#             LUFA Library +#     Copyright (C) Dean Camera, 2015. +# +#  dean [at] fourwalledcubicle [dot] com +#           www.lufa-lib.org +# + +DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/dfu.mk diff --git a/lib/lufa/LUFA/Build/lufa_doxygen.mk b/lib/lufa/LUFA/Build/lufa_doxygen.mk new file mode 100644 index 0000000000..64afd4a5ac --- /dev/null +++ b/lib/lufa/LUFA/Build/lufa_doxygen.mk @@ -0,0 +1,10 @@ +# +#             LUFA Library +#     Copyright (C) Dean Camera, 2015. +# +#  dean [at] fourwalledcubicle [dot] com +#           www.lufa-lib.org +# + +DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/doxygen.mk diff --git a/lib/lufa/LUFA/Build/lufa_hid.mk b/lib/lufa/LUFA/Build/lufa_hid.mk new file mode 100644 index 0000000000..86ca145bfa --- /dev/null +++ b/lib/lufa/LUFA/Build/lufa_hid.mk @@ -0,0 +1,10 @@ +# +#             LUFA Library +#     Copyright (C) Dean Camera, 2015. +# +#  dean [at] fourwalledcubicle [dot] com +#           www.lufa-lib.org +# + +DMBS_PATH := $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/hid.mk diff --git a/lib/lufa/LUFA/Build/lufa_sources.mk b/lib/lufa/LUFA/Build/lufa_sources.mk new file mode 100644 index 0000000000..48291c7317 --- /dev/null +++ b/lib/lufa/LUFA/Build/lufa_sources.mk @@ -0,0 +1,10 @@ +# +#             LUFA Library +#     Copyright (C) Dean Camera, 2015. +# +#  dean [at] fourwalledcubicle [dot] com +#           www.lufa-lib.org +# + +DMBS_LUFA_PATH ?= $(LUFA_PATH)/Build/LUFA +include $(DMBS_LUFA_PATH)/lufa-sources.mk diff --git a/lib/lufa/LUFA/CodeTemplates/DeviceTemplate/Descriptors.c b/lib/lufa/LUFA/CodeTemplates/DeviceTemplate/Descriptors.c new file mode 100644 index 0000000000..0b44c0df28 --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/DeviceTemplate/Descriptors.c @@ -0,0 +1,180 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + * + *  USB Device Descriptors, for library use when in USB device mode. Descriptors are special + *  computer-readable structures which the host requests upon device enumeration, to determine + *  the device's capabilities and functions. + */ + +#include "Descriptors.h" + +/** Device descriptor structure. This descriptor describes the overall device + *  characteristics, including the supported USB version, control endpoint size + *  and the number of device configurations. The descriptor is read out by the + *  USB host when the enumeration process begins. + */ +const USB_Descriptor_Device_t DeviceDescriptor = +{ +	.Header                 = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device}, + +	.USBSpecification       = VERSION_BCD(2,0,0), +	.Class                  = USB_CSCP_NoDeviceClass, +	.SubClass               = USB_CSCP_NoDeviceSubclass, +	.Protocol               = USB_CSCP_NoDeviceProtocol, + +	.Endpoint0Size          = 64, + +	.VendorID               = 0x0000, +	.ProductID              = 0x0000, +	.ReleaseNumber          = VERSION_BCD(0,0,2), + +	.ManufacturerStrIndex   = 0x01, +	.ProductStrIndex        = 0x02, +	.SerialNumStrIndex      = NO_DESCRIPTOR, + +	.NumberOfConfigurations = 1 +}; + +/** Configuration descriptor structure. This descriptor, located in FLASH memory, describes the usage + *  of the device in one of its supported configurations, including information about any device interfaces + *  and endpoints. The descriptor is read out by the USB host during the enumeration process when selecting + *  a configuration so that the host may correctly communicate with the USB device. + */ +const USB_Descriptor_Configuration_t ConfigurationDescriptor = +{ +	.Config = +		{ +			.Header                   = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration}, + +			.TotalConfigurationSize   = sizeof(USB_Descriptor_Configuration_t), +			.TotalInterfaces          = 0, + +			.ConfigurationNumber      = 1, +			.ConfigurationStrIndex    = NO_DESCRIPTOR, + +			.ConfigAttributes         = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED), + +			.MaxPowerConsumption      = USB_CONFIG_POWER_MA(100) +		}, +}; + +/** Language descriptor structure. This descriptor, located in FLASH memory, is returned when the host requests + *  the string descriptor with index 0 (the first index). It is actually an array of 16-bit integers, which indicate + *  via the language ID table available at USB.org what languages the device supports for its string descriptors. + */ +const USB_Descriptor_String_t LanguageString = +{ +	.Header                 = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String}, + +	.UnicodeString          = {LANGUAGE_ID_ENG} +}; + +/** Manufacturer descriptor string. This is a Unicode string containing the manufacturer's details in human readable + *  form, and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + *  Descriptor. + */ +const USB_Descriptor_String_t ManufacturerString = +{ +	.Header                 = {.Size = USB_STRING_LEN(14), .Type = DTYPE_String}, + +	.UnicodeString          = L"Your Name Here" +}; + +/** Product descriptor string. This is a Unicode string containing the product's details in human readable form, + *  and is read out upon request by the host when the appropriate string ID is requested, listed in the Device + *  Descriptor. + */ +const USB_Descriptor_String_t ProductString = +{ +	.Header                 = {.Size = USB_STRING_LEN(15), .Type = DTYPE_String}, + +	.UnicodeString          = L"LUFA USB Device" +}; + +/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors" + *  documentation) by the application code so that the address and size of a requested descriptor can be given + *  to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function + *  is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the + *  USB host. + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, +                                    const uint16_t wIndex, +                                    const void** const DescriptorAddress +									#if defined(HAS_MULTIPLE_DESCRIPTOR_ADDRESS_SPACES) +									, uint8_t* const DescriptorMemorySpace +									#endif +									) +{ +	const uint8_t  DescriptorType   = (wValue >> 8); +	const uint8_t  DescriptorNumber = (wValue & 0xFF); + +	const void* Address = NULL; +	uint16_t    Size    = NO_DESCRIPTOR; + +	switch (DescriptorType) +	{ +		case DTYPE_Device: +			Address = &DeviceDescriptor; +			Size    = sizeof(USB_Descriptor_Device_t); +			break; +		case DTYPE_Configuration: +			Address = &ConfigurationDescriptor; +			Size    = sizeof(USB_Descriptor_Configuration_t); +			break; +		case DTYPE_String: +			switch (DescriptorNumber) +			{ +				case 0x00: +					Address = &LanguageString; +					Size    = pgm_read_byte(&LanguageString.Header.Size); +					break; +				case 0x01: +					Address = &ManufacturerString; +					Size    = pgm_read_byte(&ManufacturerString.Header.Size); +					break; +				case 0x02: +					Address = &ProductString; +					Size    = pgm_read_byte(&ProductString.Header.Size); +					break; +			} + +			break; +	} + +	#if defined(HAS_MULTIPLE_DESCRIPTOR_ADDRESS_SPACES) +	*DescriptorMemorySpace = MEMSPACE_RAM; +	#endif + +	*DescriptorAddress = Address; +	return Size; +} + diff --git a/lib/lufa/LUFA/CodeTemplates/DeviceTemplate/Descriptors.h b/lib/lufa/LUFA/CodeTemplates/DeviceTemplate/Descriptors.h new file mode 100644 index 0000000000..2bf6a6a346 --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/DeviceTemplate/Descriptors.h @@ -0,0 +1,59 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + * + *  Header file for Descriptors.c. + */ + +#ifndef _DESCRIPTORS_H_ +#define _DESCRIPTORS_H_ + +	/* Includes: */ +		#include <LUFA/Drivers/USB/USB.h> + +  /* Macros: */ +    #if (defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \ +         !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))) +      #define HAS_MULTIPLE_DESCRIPTOR_ADDRESS_SPACES +    #endif + +	/* Type Defines: */ +		/** Type define for the device configuration descriptor structure. This must be defined in the +		 *  application code, as the configuration descriptor contains several sub-descriptors which +		 *  vary between devices, and which describe the device's usage to the host. +		 */ +		typedef struct +		{ +			USB_Descriptor_Configuration_Header_t Config; +		} USB_Descriptor_Configuration_t; + +#endif + diff --git a/lib/lufa/LUFA/CodeTemplates/DeviceTemplate/DeviceApplication.c b/lib/lufa/LUFA/CodeTemplates/DeviceTemplate/DeviceApplication.c new file mode 100644 index 0000000000..2bc44b492c --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/DeviceTemplate/DeviceApplication.c @@ -0,0 +1,106 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + * + *  Main source file for the USB device application. This file contains the + *  main tasks of the application and is responsible for the initial + *  application hardware configuration. + */ + +#include "DeviceApplication.h" + +/** Main program entry point. This routine contains the overall program flow, including initial + *  setup of all components and the main program loop. + */ +int main(void) +{ +	SetupHardware(); + +	GlobalInterruptEnable(); + +	for (;;) +	{ +		USB_USBTask(); +	} +} + +/** Configures the board hardware and chip peripherals for the demo's functionality. */ +void SetupHardware(void) +{ +	#if (ARCH == ARCH_AVR8) +		/* Disable watchdog if enabled by bootloader/fuses */ +		MCUSR &= ~(1 << WDRF); +		wdt_disable(); + +		/* Disable clock division */ +		clock_prescale_set(clock_div_1); + +		/* Hardware Initialization */ +		USB_Init(USB_MODE_Device, USB_DEVICE_OPT_FULLSPEED | USB_OPT_AUTO_PLL); +	#elif (ARCH == ARCH_XMEGA) +		/* Start the PLL to multiply the 2MHz RC oscillator to 32MHz and switch the CPU core to run from it */ +		XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU); +		XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL); + +		/* Start the 32MHz internal RC oscillator and start the DFLL to increase it to 48MHz using the USB SOF as a reference */ +		XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ); +		XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB); + +		PMIC.CTRL = PMIC_LOLVLEN_bm | PMIC_MEDLVLEN_bm | PMIC_HILVLEN_bm; + +		/* Hardware Initialization */ +		USB_Init(USB_OPT_RC32MCLKSRC | USB_OPT_BUSEVENT_PRIHIGH); +	#endif +} + +/** Event handler for the library USB Connection event. */ +void EVENT_USB_Device_Connect(void) +{ + +} + +/** Event handler for the library USB Disconnection event. */ +void EVENT_USB_Device_Disconnect(void) +{ + +} + +/** Event handler for the library USB Configuration Changed event. */ +void EVENT_USB_Device_ConfigurationChanged(void) +{ + +} + +/** Event handler for the library USB Control Request reception event. */ +void EVENT_USB_Device_ControlRequest(void) +{ + +} diff --git a/lib/lufa/LUFA/CodeTemplates/DeviceTemplate/DeviceApplication.h b/lib/lufa/LUFA/CodeTemplates/DeviceTemplate/DeviceApplication.h new file mode 100644 index 0000000000..b3429099af --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/DeviceTemplate/DeviceApplication.h @@ -0,0 +1,53 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + * + *  Header file for DeviceApplication.c. + */ + +#ifndef _USB_DEVICE_APPLICATION_H_ +#define _USB_DEVICE_APPLICATION_H_ + +	/* Includes: */ +		#include <avr/io.h> +		#include <avr/wdt.h> +		#include <avr/power.h> + +		#include <LUFA/Platform/Platform.h> +		#include <LUFA/Drivers/USB/USB.h> + +		#include "Descriptors.h" + +	/* Function Prototypes: */ +		void SetupHardware(void); + +#endif + diff --git a/lib/lufa/LUFA/CodeTemplates/DeviceTemplate/asf.xml b/lib/lufa/LUFA/CodeTemplates/DeviceTemplate/asf.xml new file mode 100644 index 0000000000..e952714e16 --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/DeviceTemplate/asf.xml @@ -0,0 +1,55 @@ +<asf xmlversion="1.0"> +	<project caption="USB Device Template" id="lufa.templates.device.project.avr8"> +		<require idref="lufa.templates.device"/> +		<require idref="lufa.boards.dummy.avr8"/> +		<generator value="as5_8_template"/> + +		<device-support value="at90usb1287"/> +		<config name="lufa.drivers.board.name" value="usbkey"/> + +		<build type="define" name="F_CPU" value="8000000UL"/> +		<build type="define" name="F_USB" value="8000000UL"/> +	</project> + +	<project caption="USB Device Template" id="lufa.templates.device.project.xmega"> +		<require idref="lufa.templates.device"/> +		<require idref="lufa.boards.dummy.xmega"/> +		<generator value="as5_8_template"/> + +		<device-support value="atxmega256a3bu"/> +		<config name="lufa.drivers.board.name" value="a3bu_xplained"/> + +		<build type="define" name="F_CPU" value="32000000UL"/> +		<build type="define" name="F_USB" value="48000000UL"/> +	</project> + +	<module type="application" id="lufa.templates.device" caption="USB Device Template"> +		<info type="description" value="summary"> +		Template for a LUFA USB device mode application. +		</info> + + 		<info type="gui-flag" value="move-to-root"/> + +		<info type="keyword" value="Technology"> +			<keyword value="USB Device"/> +			<keyword value="Template Projects"/> +		</info> + +		<device-support-alias value="lufa_avr8"/> +		<device-support-alias value="lufa_xmega"/> +		<device-support-alias value="lufa_uc3"/> + +		<build type="c-source" value="DeviceApplication.c"/> +		<build type="c-source" value="Descriptors.c"/> +		<build type="header-file" value="DeviceApplication.h"/> +		<build type="header-file" value="Descriptors.h"/> + +		<build type="module-config" subtype="path" value=".."/> +		<build type="header-file" value="../LUFAConfig.h"/> + +		<require idref="lufa.common"/> +		<require idref="lufa.platform"/> +		<require idref="lufa.drivers.usb"/> +		<require idref="lufa.drivers.board"/> +	</module> +</asf> diff --git a/lib/lufa/LUFA/CodeTemplates/DriverStubs/Board.h b/lib/lufa/LUFA/CodeTemplates/DriverStubs/Board.h new file mode 100644 index 0000000000..9dce2f5907 --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/DriverStubs/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief LUFA Custom Board Hardware Information Driver (Template) + * + *  This is a stub driver header file, for implementing custom board + *  layout hardware with compatible LUFA board specific drivers. If + *  the library is configured to use the BOARD_USER board mode, this + *  driver file should be completed and copied into the "/Board/" folder + *  inside the application's folder. + * + *  This stub is for the board-specific component of the LUFA Board Hardware + *  information driver. + */ + +#ifndef __BOARD_USER_H__ +#define __BOARD_USER_H__ + +	/* Includes: */ +		// TODO: Add any required includes here + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted if defined. */ +//			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has a hardware Dataflash mounted if defined. */ +//			#define BOARD_HAS_DATAFLASH + +			/** Indicates the board has a hardware Joystick mounted if defined. */ +//			#define BOARD_HAS_JOYSTICK + +			/** Indicates the board has hardware LEDs mounted if defined. */ +//			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/CodeTemplates/DriverStubs/Buttons.h b/lib/lufa/LUFA/CodeTemplates/DriverStubs/Buttons.h new file mode 100644 index 0000000000..fd74652c91 --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/DriverStubs/Buttons.h @@ -0,0 +1,90 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief LUFA Custom Board Button Hardware Driver (Template) + * + *  This is a stub driver header file, for implementing custom board + *  layout hardware with compatible LUFA board specific drivers. If + *  the library is configured to use the BOARD_USER board mode, this + *  driver file should be completed and copied into the "/Board/" folder + *  inside the application's folder. + * + *  This stub is for the board-specific component of the LUFA Buttons driver, + *  for the control of physical board-mounted GPIO pushbuttons. + */ + +#ifndef __BUTTONS_USER_H__ +#define __BUTTONS_USER_H__ + +	/* Includes: */ +		// TODO: Add any required includes here + +	/* 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          // TODO: Add mask for first board button here + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void Buttons_Init(void) +			{ +				// TODO: Initialize the appropriate port pins as an inputs here, with pull-ups +			} + +			static inline void Buttons_Disable(void) +			{ +				// TODO: Clear the appropriate port pins as high impedance inputs here +			} + +			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Buttons_GetStatus(void) +			{ +				// TODO: Return current button status here, debounced if required +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + diff --git a/lib/lufa/LUFA/CodeTemplates/DriverStubs/Dataflash.h b/lib/lufa/LUFA/CodeTemplates/DriverStubs/Dataflash.h new file mode 100644 index 0000000000..f405a80d52 --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/DriverStubs/Dataflash.h @@ -0,0 +1,223 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief LUFA Custom Board Dataflash Hardware Driver (Template) + * + *  This is a stub driver header file, for implementing custom board + *  layout hardware with compatible LUFA board specific drivers. If + *  the library is configured to use the BOARD_USER board mode, this + *  driver file should be completed and copied into the "/Board/" folder + *  inside the application's folder. + * + *  This stub is for the board-specific component of the LUFA Dataflash + *  driver. +*/ + +#ifndef __DATAFLASH_USER_H__ +#define __DATAFLASH_USER_H__ + +	/* Includes: */ +		// TODO: Add any required includes here + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_DATAFLASH_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead. +		#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#define DATAFLASH_CHIPCS_MASK                // TODO: Replace this with a mask of all the /CS pins of all Dataflashes +			#define DATAFLASH_CHIPCS_DDR                 // TODO: Replace with the DDR register name for the board's Dataflash ICs +			#define DATAFLASH_CHIPCS_PORT                // TODO: Replace with the PORT register name for the board's Dataflash ICs +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */ +			#define DATAFLASH_TOTALCHIPS                 1 // TODO: Replace with the number of Dataflashes on the board, max 2 + +			/** Mask for no dataflash chip selected. */ +			#define DATAFLASH_NO_CHIP                    0 + +			/** Mask for the first dataflash chip selected. */ +			#define DATAFLASH_CHIP1                      // TODO: Replace with mask with the pin attached to the first Dataflash /CS set + +			/** Mask for the second dataflash chip selected. */ +			#define DATAFLASH_CHIP2                      // TODO: Replace with mask with the pin attached to the second Dataflash /CS set + +			/** Internal main memory page size for the board's dataflash ICs. */ +			#define DATAFLASH_PAGE_SIZE                  // TODO: Replace with the page size for the Dataflash ICs + +			/** Total number of pages inside each of the board's dataflash ICs. */ +			#define DATAFLASH_PAGES                      // TODO: Replace with the total number of pages inside one of the Dataflash ICs + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC. +			 *  The microcontroller's SPI driver MUST be initialized before any of the dataflash commands are used. +			 */ +			static inline void Dataflash_Init(void) +			{ +				DATAFLASH_CHIPCS_DDR  |= DATAFLASH_CHIPCS_MASK; +				DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK; +			} + +			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) +			{ +				// TODO +			} + +			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 */ +			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SendByte(const uint8_t Byte) +			{ +				// TODO +			} + +			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash. +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_ReceiveByte(void) +			{ +				// TODO +			} + +			/** Determines the currently selected dataflash chip. +			 * +			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected +			 *          or a DATAFLASH_CHIPn mask (where n is the chip number). +			 */ +			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_GetSelectedChip(void) +			{ +				return (~DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK); +			} + +			/** Selects the given dataflash chip. +			 * +			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is +			 *              the chip number). +			 */ +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) +			{ +				DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT | DATAFLASH_CHIPCS_MASK) & ~ChipMask); +			} + +			/** Deselects the current dataflash chip, so that no dataflash is selected. */ +			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_DeselectChip(void) +			{ +				Dataflash_SelectChip(DATAFLASH_NO_CHIP); +			} + +			/** Selects a dataflash IC from the given page number, which should range from 0 to +			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one +			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside +			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs +			 *  are deselected. +			 * +			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from +			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). +			 */ +			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress) +			{ +				Dataflash_DeselectChip(); + +				if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS)) +				  return; + +				#if (DATAFLASH_TOTALCHIPS == 2) +					if (PageAddress & 0x01) +					  Dataflash_SelectChip(DATAFLASH_CHIP2); +					else +					  Dataflash_SelectChip(DATAFLASH_CHIP1); +				#else +					Dataflash_SelectChip(DATAFLASH_CHIP1); +				#endif +			} + +			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive +			 *  a new command. +			 */ +			static inline void Dataflash_ToggleSelectedChipCS(void) +			{ +				uint8_t SelectedChipMask = Dataflash_GetSelectedChip(); + +				Dataflash_DeselectChip(); +				Dataflash_SelectChip(SelectedChipMask); +			} + +			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main +			 *  memory page program or main memory to buffer transfer. +			 */ +			static inline void Dataflash_WaitWhileBusy(void) +			{ +				Dataflash_ToggleSelectedChipCS(); +				Dataflash_SendByte(DF_CMD_GETSTATUS); +				while (!(Dataflash_ReceiveByte() & DF_STATUS_READY)); +				Dataflash_ToggleSelectedChipCS(); +			} + +			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with +			 *  dataflash commands which require a complete 24-bit address. +			 * +			 *  \param[in] PageAddress  Page address within the selected dataflash IC +			 *  \param[in] BufferByte   Address within the dataflash's buffer +			 */ +			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, +			                                              const uint16_t BufferByte) +			{ +				#if (DATAFLASH_TOTALCHIPS == 2) +					PageAddress >>= 1; +				#endif + +				Dataflash_SendByte(PageAddress >> 5); +				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8)); +				Dataflash_SendByte(BufferByte); +			} +		#endif + +#endif + diff --git a/lib/lufa/LUFA/CodeTemplates/DriverStubs/Joystick.h b/lib/lufa/LUFA/CodeTemplates/DriverStubs/Joystick.h new file mode 100644 index 0000000000..bf17c43c4c --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/DriverStubs/Joystick.h @@ -0,0 +1,102 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief LUFA Custom Board Joystick Hardware Driver (Template) + * + *  This is a stub driver header file, for implementing custom board + *  layout hardware with compatible LUFA board specific drivers. If + *  the library is configured to use the BOARD_USER board mode, this + *  driver file should be completed and copied into the "/Board/" folder + *  inside the application's folder. + * + *  This stub is for the board-specific component of the LUFA Joystick + *  driver, for a digital four-way (plus button) joystick. +*/ + +#ifndef __JOYSTICK_USER_H__ +#define __JOYSTICK_USER_H__ + +	/* Includes: */ +		// TODO: Add any required includes here + +	/* 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 + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Mask for the joystick being pushed in the left direction. */ +			#define JOY_LEFT                  // TODO: Add mask to indicate joystick left position here + +			/** Mask for the joystick being pushed in the right direction. */ +			#define JOY_RIGHT                 // TODO: Add mask to indicate joystick right position here + +			/** Mask for the joystick being pushed in the upward direction. */ +			#define JOY_UP                    // TODO: Add mask to indicate joystick up position here + +			/** Mask for the joystick being pushed in the downward direction. */ +			#define JOY_DOWN                  // TODO: Add mask to indicate joystick down position here + +			/** Mask for the joystick being pushed inward. */ +			#define JOY_PRESS                 // TODO: Add mask to indicate joystick pressed position here + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void Joystick_Init(void) +			{ +				// TODO: Initialize joystick port pins as inputs with pull-ups +			} + +			static inline void Joystick_Disable(void) +			{ +				// TODO: Clear the joystick pins as high impedance inputs here +			} + +			static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Joystick_GetStatus(void) +			{ +				// TODO: Return current joystick position data which can be obtained by masking against the JOY_* macros +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + diff --git a/lib/lufa/LUFA/CodeTemplates/DriverStubs/LEDs.h b/lib/lufa/LUFA/CodeTemplates/DriverStubs/LEDs.h new file mode 100644 index 0000000000..d7d2f50236 --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/DriverStubs/LEDs.h @@ -0,0 +1,130 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief LUFA Custom Board LED Hardware Driver (Template) + * + *  This is a stub driver header file, for implementing custom board + *  layout hardware with compatible LUFA board specific drivers. If + *  the library is configured to use the BOARD_USER board mode, this + *  driver file should be completed and copied into the "/Board/" folder + *  inside the application's folder. + * + *  This stub is for the board-specific component of the LUFA LEDs driver, + *  for the LEDs (up to four) mounted on most development boards. +*/ + +#ifndef __LEDS_USER_H__ +#define __LEDS_USER_H__ + +	/* Includes: */ +		// TODO: Add any required includes here + +	/* 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        // TODO: Add mask for first board LED here + +			/** LED mask for the second LED on the board. */ +			#define LEDS_LED2        // TODO: Add mask for second board LED here + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        // TODO: Add mask for third board LED here + +			/** LED mask for the fourth LED on the board. */ +			#define LEDS_LED4        // TODO: Add mask for fourth board LED here + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4) + +			/** LED mask for none of the board LEDs. */ +			#define LEDS_NO_LEDS     0 + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void LEDs_Init(void) +			{ +				// TODO: Add code to initialize LED port pins as outputs here +			} + +			static inline void LEDs_Disable(void) +			{ +				// TODO: Clear the LED port pins as high impedance inputs here +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				// TODO: Add code to turn on LEDs given in the LEDMask mask here, leave others as-is +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				// TODO: Add code to turn off LEDs given in the LEDMask mask here, leave others as-is +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				// TODO: Add code to turn on only LEDs given in the LEDMask mask here, all others off +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, const uint8_t ActiveMask) +			{ +				// TODO: Add code to set the Leds in the given LEDMask to the status given in ActiveMask here +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				// TODO: Add code to toggle the Leds in the given LEDMask, ignoring all others +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				// TODO: Add code to return the current LEDs status' here which can be masked against LED_LED* macros +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + diff --git a/lib/lufa/LUFA/CodeTemplates/HostTemplate/HostApplication.c b/lib/lufa/LUFA/CodeTemplates/HostTemplate/HostApplication.c new file mode 100644 index 0000000000..e0774b3cd3 --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/HostTemplate/HostApplication.c @@ -0,0 +1,133 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + * + *  Main source file for the USB host application. This file contains the + *  main tasks of the application and is responsible for the initial + *  application hardware configuration. + */ + +#include "HostApplication.h" + +/** Main program entry point. This routine configures the hardware required by the application, then + *  enters a loop to run the application tasks in sequence. + */ +int main(void) +{ +	SetupHardware(); + +	GlobalInterruptEnable(); + +	for (;;) +	{ +		USB_USBTask(); +	} +} + +/** Configures the board hardware and chip peripherals for the demo's functionality. */ +void SetupHardware(void) +{ +	/* Disable watchdog if enabled by bootloader/fuses */ +	MCUSR &= ~(1 << WDRF); +	wdt_disable(); + +	/* Disable clock division */ +	clock_prescale_set(clock_div_1); + +	/* Hardware Initialization */ +	USB_Init(USB_MODE_Host, USB_DEVICE_OPT_FULLSPEED | USB_OPT_AUTO_PLL); +} + +/** Event handler for the USB_DeviceAttached event. This indicates that a device has been attached to the host, and + *  starts the library USB task to begin the enumeration and USB management process. + */ +void EVENT_USB_Host_DeviceAttached(void) +{ + +} + +/** Event handler for the USB_DeviceUnattached event. This indicates that a device has been removed from the host, and + *  stops the library USB task management process. + */ +void EVENT_USB_Host_DeviceUnattached(void) +{ + +} + +/** Event handler for the USB_DeviceEnumerationComplete event. This indicates that a device has been successfully + *  enumerated by the host and is now ready to be used by the application. + */ +void EVENT_USB_Host_DeviceEnumerationComplete(void) +{ +	uint16_t ConfigDescriptorSize; +	uint8_t  ConfigDescriptorData[512]; + +	if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData, +	                                       sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful) +	{ +		return; +	} + +	if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful) +	{ +		return; +	} +} + +/** Event handler for the USB_HostError event. This indicates that a hardware error occurred while in host mode. */ +void EVENT_USB_Host_HostError(const uint8_t ErrorCode) +{ +	USB_Disable(); +	for(;;); +} + +/** Event handler for the USB_DeviceEnumerationFailed event. This indicates that a problem occurred while + *  enumerating an attached USB device. + */ +void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, +                                            const uint8_t SubErrorCode) +{ + +} + +/* Required callback for retrieving descriptors from a LUFA device - unless the USB_HOST_ONLY configuration + * option is set, this is still required even in an application that uses host mode only. + */ +uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, +		const uint16_t wIndex, +		const void** const DescriptorAddress +#if defined(HAS_MULTIPLE_DESCRIPTOR_ADDRESS_SPACES) +		, uint8_t* const DescriptorMemorySpace +#endif +) +{ +	return 0; +} diff --git a/lib/lufa/LUFA/CodeTemplates/HostTemplate/HostApplication.h b/lib/lufa/LUFA/CodeTemplates/HostTemplate/HostApplication.h new file mode 100644 index 0000000000..31eea287ca --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/HostTemplate/HostApplication.h @@ -0,0 +1,56 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + * + *  Header file for HostApplication.c. + */ + +#ifndef _USB_HOST_APPLICATION_H_ +#define _USB_HOST_APPLICATION_H_ + +	/* Includes: */ +		#include <avr/io.h> +		#include <avr/wdt.h> +		#include <avr/power.h> + +		#include <LUFA/Drivers/USB/USB.h> + +	/* Macros: */ +		#if (defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \ +			 !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS))) +		  #define HAS_MULTIPLE_DESCRIPTOR_ADDRESS_SPACES +		#endif + +	/* Function Prototypes: */ +		void SetupHardware(void); + +#endif + diff --git a/lib/lufa/LUFA/CodeTemplates/HostTemplate/asf.xml b/lib/lufa/LUFA/CodeTemplates/HostTemplate/asf.xml new file mode 100644 index 0000000000..c3860c056d --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/HostTemplate/asf.xml @@ -0,0 +1,41 @@ +<asf xmlversion="1.0"> +	<project caption="USB Host Template" id="lufa.templates.host.project"> +		<require idref="lufa.templates.host"/> +		<require idref="lufa.boards.dummy.avr8"/> +		<generator value="as5_8_template"/> + +		<device-support value="at90usb1287"/> +		<config name="lufa.drivers.board.name" value="usbkey"/> + +		<build type="define" name="F_CPU" value="8000000UL"/> +		<build type="define" name="F_USB" value="8000000UL"/> +	</project> + +	<module type="application" id="lufa.templates.host" caption="USB Host Template"> +		<info type="description" value="summary"> +		Template for a LUFA USB host mode application. +		</info> + + 		<info type="gui-flag" value="move-to-root"/> + +		<info type="keyword" value="Technology"> +			<keyword value="USB Host"/> +			<keyword value="Template Projects"/> +		</info> + +		<device-support-alias value="lufa_avr8"/> +		<device-support-alias value="lufa_xmega"/> +		<device-support-alias value="lufa_uc3"/> + +		<build type="c-source" value="HostApplication.c"/> +		<build type="header-file" value="HostApplication.h"/> + +		<build type="module-config" subtype="path" value=".."/> +		<build type="header-file" value="../LUFAConfig.h"/> + +		<require idref="lufa.common"/> +		<require idref="lufa.platform"/> +		<require idref="lufa.drivers.usb"/> +		<require idref="lufa.drivers.board"/> +	</module> +</asf> diff --git a/lib/lufa/LUFA/CodeTemplates/LUFAConfig.h b/lib/lufa/LUFA/CodeTemplates/LUFAConfig.h new file mode 100644 index 0000000000..bf6ee37e2e --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/LUFAConfig.h @@ -0,0 +1,167 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief LUFA Library Configuration Header File (Template) + * + *  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 \c 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_CONFIGURATIONS         {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} +//		#define NO_AUTO_VBUS_MANAGEMENT +//		#define INVERTED_VBUS_ENABLE_LINE + +	#elif (ARCH == ARCH_XMEGA) + +		/* 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_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_CONFIGURATIONS         {Insert Value Here} +//		#define CONTROL_ONLY_DEVICE +// 		#define MAX_ENDPOINT_INDEX               {Insert Value Here} +//		#define NO_DEVICE_REMOTE_WAKEUP +//		#define NO_DEVICE_SELF_POWER + +	#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 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_SOF_EVENTS + +		/* USB Device Mode Driver Related Tokens: */ +//		#define NO_INTERNAL_SERIAL +//		#define FIXED_CONTROL_ENDPOINT_SIZE      {Insert Value Here} +//		#define FIXED_NUM_CONFIGURATIONS         {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 USB_HOST_TIMEOUT_MS              {Insert Value Here} +//		#define HOST_DEVICE_SETTLE_DELAY_MS	     {Insert Value Here} +//		#define NO_AUTO_VBUS_MANAGEMENT +//		#define INVERTED_VBUS_ENABLE_LINE + +	#else + +		#error Unsupported architecture for this LUFA configuration file. + +	#endif +#endif + diff --git a/lib/lufa/LUFA/CodeTemplates/WindowsINF/LUFA CDC-ACM.inf b/lib/lufa/LUFA/CodeTemplates/WindowsINF/LUFA CDC-ACM.inf new file mode 100644 index 0000000000..212b5bbcb3 --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/WindowsINF/LUFA CDC-ACM.inf @@ -0,0 +1,64 @@ +;     Windows LUFA CDC ACM Setup File +; Copyright (c) 2000 Microsoft Corporation + +[DefaultInstall] +CopyINF="LUFA CDC-ACM.inf" + +[Version] +Signature="$Windows NT$" +Class=Ports +ClassGuid={4D36E978-E325-11CE-BFC1-08002BE10318} +Provider=%MFGNAME% +DriverVer=7/1/2012,10.0.0.0 + +[Manufacturer] +%MFGNAME%=DeviceList, NTx86, NTamd64, NTia64 + +[SourceDisksNames] + +[SourceDisksFiles] + +[DestinationDirs] +DefaultDestDir=12 + +[DriverInstall] +Include=mdmcpq.inf +CopyFiles=FakeModemCopyFileSection +AddReg=DriverInstall.AddReg + +[DriverInstall.Services] +Include=mdmcpq.inf +AddService=usbser, 0x00000002, LowerFilter_Service_Inst + +[DriverInstall.AddReg] +HKR,,EnumPropPages32,,"msports.dll,SerialPortPropPageProvider" + +;------------------------------------------------------------------------------ +;  Vendor and Product ID Definitions +;------------------------------------------------------------------------------ +; When developing your USB device, the VID and PID used in the PC side +; application program and the firmware on the microcontroller must match. +; Modify the below line to use your VID and PID.  Use the format as shown below. +; Note: One INF file can be used for multiple devices with different VID and PIDs. +; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line. +;------------------------------------------------------------------------------ +[DeviceList] +%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_2044 + +[DeviceList.NTx86] +%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_2044 + +[DeviceList.NTamd64] +%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_2044 + +[DeviceList.NTia64] +%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_2044 + +;------------------------------------------------------------------------------ +;  String Definitions +;------------------------------------------------------------------------------ +;Modify these strings to customize your device +;------------------------------------------------------------------------------ +[Strings] +MFGNAME="http://www.lufa-lib.org" +DESCRIPTION="LUFA CDC-ACM Virtual Serial Port" diff --git a/lib/lufa/LUFA/CodeTemplates/WindowsINF/LUFA RNDIS.inf b/lib/lufa/LUFA/CodeTemplates/WindowsINF/LUFA RNDIS.inf new file mode 100644 index 0000000000..73ca50e687 --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/WindowsINF/LUFA RNDIS.inf @@ -0,0 +1,59 @@ +;     Windows LUFA RNDIS Setup File +; Copyright (c) 2000 Microsoft Corporation + +[DefaultInstall] +CopyINF="LUFA RNDIS.inf" + +[Version] +Signature="$Windows NT$" +Class=Net +ClassGuid={4d36e972-e325-11ce-bfc1-08002be10318} +Provider=%MFGNAME% +DriverVer=7/1/2012,10.0.0.0 + +[Manufacturer] +%MFGNAME%=DeviceList, NTx86, NTamd64, NTia64 + +[ControlFlags] +ExcludeFromSelect=* + +[DriverInstall] +Characteristics=0x84 ; NCF_PHYSICAL + NCF_HAS_UI +BusType=15 +include=netrndis.inf +needs=Usb_Rndis.ndi +AddReg=Rndis_AddReg_Vista + +[DriverInstall.Services] +include=netrndis.inf +needs=Usb_Rndis.ndi.Services + +;------------------------------------------------------------------------------ +;  Vendor and Product ID Definitions +;------------------------------------------------------------------------------ +; When developing your USB device, the VID and PID used in the PC side +; application program and the firmware on the microcontroller must match. +; Modify the below line to use your VID and PID.  Use the format as shown below. +; Note: One INF file can be used for multiple devices with different VID and PIDs. +; For each supported device, append ",USB\VID_xxxx&PID_yyyy" to the end of the line. +;------------------------------------------------------------------------------ +[DeviceList] +%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204C + +[DeviceList.NTx86] +%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204C + +[DeviceList.NTamd64] +%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204C + +[DeviceList.NTia64] +%DESCRIPTION%=DriverInstall, USB\VID_03EB&PID_204C + +;------------------------------------------------------------------------------ +;  String Definitions +;------------------------------------------------------------------------------ +;Modify these strings to customize your device +;------------------------------------------------------------------------------ +[Strings] +MFGNAME="http://www.lufa-lib.org" +DESCRIPTION="LUFA RNDIS USB Ethernet Adapter" diff --git a/lib/lufa/LUFA/CodeTemplates/makefile_template b/lib/lufa/LUFA/CodeTemplates/makefile_template new file mode 100644 index 0000000000..945d6fd613 --- /dev/null +++ b/lib/lufa/LUFA/CodeTemplates/makefile_template @@ -0,0 +1,43 @@ +# +#             LUFA Library +#     Copyright (C) Dean Camera, 2017. +# +#  dean [at] fourwalledcubicle [dot] com +#           www.lufa-lib.org +# +# -------------------------------------- +#         LUFA Project Makefile. +# -------------------------------------- + +# Run "make help" for target help. + +MCU          = at90usb1287 +ARCH         = AVR8 +BOARD        = USBKEY +F_CPU        = 8000000 +F_USB        = $(F_CPU) +OPTIMIZATION = s +TARGET       = Target +SRC          = $(TARGET).c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) $(LUFA_SRC_PLATFORM) +LUFA_PATH    = ../../LUFA +CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig +LD_FLAGS     = + +# Default target +all: + +# Include LUFA-specific DMBS extension modules +DMBS_LUFA_PATH ?= $(LUFA_PATH)/Build/LUFA +include $(DMBS_LUFA_PATH)/lufa-sources.mk +include $(DMBS_LUFA_PATH)/lufa-gcc.mk + +# Include common DMBS build system modules +DMBS_PATH      ?= $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/core.mk +include $(DMBS_PATH)/cppcheck.mk +include $(DMBS_PATH)/doxygen.mk +include $(DMBS_PATH)/dfu.mk +include $(DMBS_PATH)/gcc.mk +include $(DMBS_PATH)/hid.mk +include $(DMBS_PATH)/avrdude.mk +include $(DMBS_PATH)/atprogram.mk diff --git a/lib/lufa/LUFA/Common/ArchitectureSpecific.h b/lib/lufa/LUFA/Common/ArchitectureSpecific.h new file mode 100644 index 0000000000..28f2900b96 --- /dev/null +++ b/lib/lufa/LUFA/Common/ArchitectureSpecific.h @@ -0,0 +1,185 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Architecture specific definitions relating to specific processor architectures. + * + *  \copydetails Group_ArchitectureSpecific + * + *  \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_ArchitectureSpecific Architecture Specific Definitions + *  \brief Architecture specific definitions relating to specific processor architectures. + * + *  Architecture specific macros, functions and other definitions, which relate to specific architectures. This + *  definitions may or may not be available in some form on other architectures, and thus should be protected by + *  preprocessor checks in portable code to prevent compile errors. + * + *  @{ + */ + +#ifndef __LUFA_ARCHSPEC_H__ +#define __LUFA_ARCHSPEC_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 + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			#if (ARCH == ARCH_AVR8) || (ARCH == ARCH_XMEGA) || defined(__DOXYGEN__) +				#if (ARCH == ARCH_AVR8) || defined(__DOXYGEN__) +					/** Re-enables the AVR's JTAG bus in software, until a system reset. This will re-enable JTAG debugging +					 *  interface after is has been disabled in software via \ref JTAG_DISABLE(). +					 * +					 *  \note This macro is not available for all architectures. +					 */ +					#define JTAG_ENABLE()               do {                                     \ +					                                        __asm__ __volatile__ (               \ +					                                        "in __tmp_reg__,__SREG__" "\n\t"     \ +					                                        "cli" "\n\t"                         \ +					                                        "out %1, %0" "\n\t"                  \ +					                                        "out __SREG__, __tmp_reg__" "\n\t"   \ +					                                        "out %1, %0" "\n\t"                  \ +					                                        :                                    \ +					                                        : "r" (MCUCR & ~(1 << JTD)),         \ +					                                          "M" (_SFR_IO_ADDR(MCUCR))          \ +					                                        : "r0");                             \ +					                                    } while (0) + +					/** Disables the AVR's JTAG bus in software, until a system reset. This will override the current JTAG +					 *  status as set by the JTAGEN fuse, disabling JTAG debugging and reverting the JTAG pins back to GPIO +					 *  mode. +					 * +					 *  \note This macro is not available for all architectures. +					 */ +					#define JTAG_DISABLE()              do {                                     \ +					                                        __asm__ __volatile__ (               \ +					                                        "in __tmp_reg__,__SREG__" "\n\t"     \ +					                                        "cli" "\n\t"                         \ +					                                        "out %1, %0" "\n\t"                  \ +					                                        "out __SREG__, __tmp_reg__" "\n\t"   \ +					                                        "out %1, %0" "\n\t"                  \ +					                                        :                                    \ +					                                        : "r" (MCUCR | (1 << JTD)),          \ +					                                          "M" (_SFR_IO_ADDR(MCUCR))          \ +					                                        : "r0");                             \ +					                                    } while (0) +				#endif + +				/** Defines a volatile \c NOP statement which cannot be optimized out by the compiler, and thus can always +				 *  be set as a breakpoint in the resulting code. Useful for debugging purposes, where the optimizer +				 *  removes/reorders code to the point where break points cannot reliably be set. +				 * +				 *  \note This macro is not available for all architectures. +				 */ +				#define JTAG_DEBUG_POINT()              __asm__ __volatile__ ("nop" ::) + +				/** Defines an explicit JTAG break point in the resulting binary via the assembly \c BREAK statement. When +				 *  a JTAG is used, this causes the program execution to halt when reached until manually resumed. +				 * +				 *  \note This macro is not available for all architectures. +				 */ +				#define JTAG_DEBUG_BREAK()              __asm__ __volatile__ ("break" ::) + +				/** Macro for testing condition "x" and breaking via \ref JTAG_DEBUG_BREAK() if the condition is false. +				 * +				 *  \note This macro is not available for all architectures. +				 * +				 *  \param[in] Condition  Condition that will be evaluated. +				*/ +				#define JTAG_ASSERT(Condition)          do {                       \ +				                                            if (!(Condition))      \ +				                                              JTAG_DEBUG_BREAK();  \ +				                                        } while (0) + +				/** Macro for testing condition \c "x" and writing debug data to the stdout stream if \c false. The stdout stream +				 *  must be pre-initialized before this macro is run and linked to an output device, such as the microcontroller's +				 *  USART peripheral. +				 * +				 *  The output takes the form "{FILENAME}: Function {FUNCTION NAME}, Line {LINE NUMBER}: Assertion {Condition} failed." +				 * +				 *  \note This macro is not available for all architectures. +				 * +				 *  \param[in] Condition  Condition that will be evaluated, +				 */ +				#define STDOUT_ASSERT(Condition)        do {                                                           \ +				                                            if (!(Condition))                                          \ +				                                              printf_P(PSTR("%s: Function \"%s\", Line %d: "           \ +				                                                            "Assertion \"%s\" failed.\r\n"),           \ +				                                                            __FILE__, __func__, __LINE__, #Condition); \ +				                                        } while (0) + +				#if !defined(pgm_read_ptr) || defined(__DOXYGEN__) +					/** Reads a pointer out of PROGMEM space on the AVR8 architecture. This is a wrapper for the avr-libc +					 *  \c pgm_read_word() macro with a \c void* cast, so that its value can be assigned directly to a +					 *  pointer variable or used in pointer arithmetic without further casting in C. +					 * +					 *  \note This macro is not available for all architectures. +					 * +					 *  \param[in] Address  Address of the pointer to read. +					 * +					 *  \return Pointer retrieved from PROGMEM space. +					 */ +					#define pgm_read_ptr(Address)       (void*)pgm_read_word(Address) +				#endif +			#elif (ARCH == ARCH_UC3) +				#define JTAG_DEBUG_POINT()              __asm__ __volatile__ ("nop" ::) +				#define JTAG_DEBUG_BREAK()              __asm__ __volatile__ ("breakpoint" ::) +				#define JTAG_ASSERT(Condition)          do {                                                    \ +				                                            if (!(Condition))                                   \ +				                                              JTAG_DEBUG_BREAK();                               \ +				                                        } while (0) +				#define STDOUT_ASSERT(Condition)        do {                                                    \ +				                                            if (!(Condition))                                   \ +				                                              printf("%s: Function \"%s\", Line %d: "           \ +				                                                     "Assertion \"%s\" failed.\r\n",            \ +				                                                     __FILE__, __func__, __LINE__, #Condition); \ +				                                        } while (0) +			#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Common/Architectures.h b/lib/lufa/LUFA/Common/Architectures.h new file mode 100644 index 0000000000..587367413e --- /dev/null +++ b/lib/lufa/LUFA/Common/Architectures.h @@ -0,0 +1,84 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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* 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/lib/lufa/LUFA/Common/Attributes.h b/lib/lufa/LUFA/Common/Attributes.h new file mode 100644 index 0000000000..c8e4104d72 --- /dev/null +++ b/lib/lufa/LUFA/Common/Attributes.h @@ -0,0 +1,150 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Special function/variable attribute macros. + * + *  \copydetails Group_FuncVarAttributes + * + *  \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_FuncVarAttributes Function/Variable Attributes + *  \brief Special function/variable attribute macros. + * + *  This module contains macros for applying specific attributes to functions and variables to control various + *  optimizer and code generation features of the compiler. Attributes may be placed in the function prototype + *  or variable declaration in any order, and multiple attributes can be specified for a single item via a space + *  separated list. + * + *  On incompatible versions of GCC or on other compilers, these macros evaluate to nothing unless they are + *  critical to the code's function and thus must throw a compile error when used. + * + *  @{ + */ + +#ifndef __LUFA_ATTR_H__ +#define __LUFA_ATTR_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 (__GNUC__ >= 3) || defined(__DOXYGEN__) +				/** Indicates to the compiler that the function can not ever return, so that any stack restoring or +				 *  return code may be omitted by the compiler in the resulting binary. +				 */ +				#define ATTR_NO_RETURN               __attribute__ ((noreturn)) + +				/** Indicates that the function returns a value which should not be ignored by the user code. When +				 *  applied, any ignored return value from calling the function will produce a compiler warning. +				 */ +				#define ATTR_WARN_UNUSED_RESULT      __attribute__ ((warn_unused_result)) + +				/** Indicates that the specified parameters of the function are pointers which should never be \c NULL. +				 *  When applied as a 1-based comma separated list the compiler will emit a warning if the specified +				 *  parameters are known at compiler time to be \c NULL at the point of calling the function. +				 */ +				#define ATTR_NON_NULL_PTR_ARG(...)   __attribute__ ((nonnull (__VA_ARGS__))) + +				/** Removes any preamble or postamble from the function. When used, the function will not have any +				 *  register or stack saving code. This should be used with caution, and when used the programmer +				 *  is responsible for maintaining stack and register integrity. +				 */ +				#define ATTR_NAKED                   __attribute__ ((naked)) + +				/** Prevents the compiler from considering a specified function for in-lining. When applied, the given +				 *  function will not be in-lined under any circumstances. +				 */ +				#define ATTR_NO_INLINE               __attribute__ ((noinline)) + +				/** Forces the compiler to inline the specified function. When applied, the given function will be +				 *  in-lined under all circumstances. +				 */ +				#define ATTR_ALWAYS_INLINE           __attribute__ ((always_inline)) + +				/** Indicates that the specified function is pure, in that it has no side-effects other than global +				 *  or parameter variable access. +				 */ +				#define ATTR_PURE                    __attribute__ ((pure)) + +				/** Indicates that the specified function is constant, in that it has no side effects other than +				 *  parameter access. +				 */ +				#define ATTR_CONST                   __attribute__ ((const)) + +				/** Marks a given function as deprecated, which produces a warning if the function is called. */ +				#define ATTR_DEPRECATED              __attribute__ ((deprecated)) + +				/** Marks a function as a weak reference, which can be overridden by other functions with an +				 *  identical name (in which case the weak reference is discarded at link time). +				 */ +				#define ATTR_WEAK                    __attribute__ ((weak)) +			#endif + +			/** Forces the compiler to not automatically zero the given global variable on startup, so that the +			 *  current RAM contents is retained. Under most conditions this value will be random due to the +			 *  behavior of volatile memory once power is removed, but may be used in some specific circumstances, +			 *  like the passing of values back after a system watchdog reset. +			 */ +			#define ATTR_NO_INIT                     __attribute__ ((section (".noinit"))) + +			/** Places the function in one of the initialization sections, which execute before the main function +			 *  of the application. Refer to the avr-libc manual for more information on the initialization sections. +			 * +			 *  \param[in] SectionIndex  Initialization section number where the function should be placed. +			 */ +			#define ATTR_INIT_SECTION(SectionIndex)  __attribute__ ((used, naked, section (".init" #SectionIndex ))) + +			/** Marks a function as an alias for another function. +			 * +			 *  \param[in] Func  Name of the function which the given function name should alias. +			 */ +			#define ATTR_ALIAS(Func)                 __attribute__ ((alias( #Func ))) + +			/** Marks a variable or struct element for packing into the smallest space available, omitting any +			 *  alignment bytes usually added between fields to optimize field accesses. +			 */ +			#define ATTR_PACKED                      __attribute__ ((packed)) + +			/** Indicates the minimum alignment in bytes for a variable or struct element. +			 * +			 *  \param[in] Bytes  Minimum number of bytes the item should be aligned to. +			 */ +			#define ATTR_ALIGNED(Bytes)              __attribute__ ((aligned(Bytes))) +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Common/BoardTypes.h b/lib/lufa/LUFA/Common/BoardTypes.h new file mode 100644 index 0000000000..e945523427 --- /dev/null +++ b/lib/lufa/LUFA/Common/BoardTypes.h @@ -0,0 +1,263 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Supported pre-made board hardware defines. + * + *  \copydetails Group_BoardTypes + * + *  \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_BoardTypes Board Types + *  \brief Supported pre-made board hardware defines. + * + *  Board macros for indicating the chosen physical board hardware to the library. These macros should be used when + *  defining the \c BOARD token to the chosen hardware via the \c -D switch in the project makefile. If a custom + *  board is used, the \ref BOARD_NONE or \ref BOARD_USER values should be selected. + * + *  @{ + */ + +#ifndef __LUFA_BOARDTYPES_H__ +#define __LUFA_BOARDTYPES_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 user-defined board drivers, which should be placed in the user project's folder +			 *  under a directory named \c /Board/. Each board driver should be named identically to the LUFA +			 *  master board driver (i.e., driver in the \c LUFA/Drivers/Board directory) so that the library +			 *  can correctly identify it. +			 */ +			#define BOARD_USER                 0 + +			/** Disables board drivers when operation will not be adversely affected (e.g. LEDs) - use of board drivers +			 *  such as the Joystick driver, where the removal would adversely affect the code's operation is still disallowed. */ +			#define BOARD_NONE                 1 + +			/** Selects the USBKEY specific board drivers, including Temperature, Button, Dataflash, Joystick and LED drivers. */ +			#define BOARD_USBKEY               2 + +			/** Selects the STK525 specific board drivers, including Temperature, Button, Dataflash, Joystick and LED drivers. */ +			#define BOARD_STK525               3 + +			/** Selects the STK526 specific board drivers, including Temperature, Button, Dataflash, Joystick and LED drivers. */ +			#define BOARD_STK526               4 + +			/** Selects the RZUSBSTICK specific board drivers, including the driver for the boards LEDs. */ +			#define BOARD_RZUSBSTICK           5 + +			/** Selects the ATAVRUSBRF01 specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_ATAVRUSBRF01         6 + +			/** Selects the BUMBLEB specific board drivers, using the officially recommended peripheral layout. */ +			#define BOARD_BUMBLEB              7 + +			/** Selects the XPLAIN (Revision 2 or newer) specific board drivers, including LED and Dataflash drivers. */ +			#define BOARD_XPLAIN               8 + +			/** Selects the XPLAIN (Revision 1) specific board drivers, including LED and Dataflash drivers. */ +			#define BOARD_XPLAIN_REV1          9 + +			/** Selects the EVK527 specific board drivers, including Temperature, Button, Dataflash, Joystick and LED drivers. */ +			#define BOARD_EVK527               10 + +			/** Selects the Teensy version 1.x specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_TEENSY               11 + +			/** Selects the USBTINY MKII specific board drivers, including the Button and LEDs drivers. */ +			#define BOARD_USBTINYMKII          12 + +			/** Selects the Benito specific board drivers, including the Button and LEDs drivers. */ +			#define BOARD_BENITO               13 + +			/** Selects the JM-DB-U2 specific board drivers, including the Button and LEDs drivers. */ +			#define BOARD_JMDBU2               14 + +			/** Selects the Olimex AVR-USB-162 specific board drivers, including the Button and LEDs drivers. */ +			#define BOARD_OLIMEX162            15 + +			/** Selects the UDIP specific board drivers, including the Button and LEDs drivers. */ +			#define BOARD_UDIP                 16 + +			/** Selects the BUI specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_BUI                  17 + +			/** Selects the Arduino Uno specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_UNO                  18 + +			/** Selects the Busware CUL V3 specific board drivers, including the Button and LEDs drivers. */ +			#define BOARD_CULV3                19 + +			/** Selects the Blackcat USB JTAG specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_BLACKCAT             20 + +			/** Selects the Maximus specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_MAXIMUS              21 + +			/** Selects the Minimus specific board drivers, including the Button and LEDs drivers. */ +			#define BOARD_MINIMUS              22 + +			/** Selects the Adafruit U4 specific board drivers, including the Button driver. */ +			#define BOARD_ADAFRUITU4           23 + +			/** Selects the Microsin AVR-USB162 specific board drivers, including the Button and LEDs drivers. */ +			#define BOARD_MICROSIN162          24 + +			/** Selects the Kernel Concepts USBFOO specific board drivers, including the Button and LEDs drivers. */ +			#define BOARD_USBFOO               25 + +			/** Selects the Sparkfun ATMEGA8U2 specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_SPARKFUN8U2          26 + +			/** Selects the Atmel EVK1101 specific board drivers, including the Button, Joystick and LED drivers. */ +			#define BOARD_EVK1101              27 + +			/** Selects the Busware TUL specific board drivers, including the Button and LED drivers. */ +			#define BOARD_TUL                  28 + +			/** Selects the Atmel EVK1100 specific board drivers, including the Button, Joystick and LED drivers. */ +			#define BOARD_EVK1100              29 + +			/** Selects the Atmel EVK1104 specific board drivers, including the Button and LED drivers. */ +			#define BOARD_EVK1104              30 + +			/** Selects the Atmel XMEGA A3BU Xplained specific board drivers, including Dataflash, Button and LED drivers. */ +			#define BOARD_A3BU_XPLAINED        31 + +			/** Selects the Teensy version 2.x specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_TEENSY2              32 + +			/** Selects the USB2AX version 1 and 2 specific board drivers, including the Button and LEDs drivers. */ +			#define BOARD_USB2AX               33 + +			/** Selects the USB2AX version 3 specific board drivers, including the Button and LEDs drivers. */ +			#define BOARD_USB2AX_V3            34 + +			/** Selects the Micropendous 32U2 specific board drivers, including the Button and LED drivers. */ +			#define BOARD_MICROPENDOUS_32U2    35 + +			/** Selects the Micropendous A specific board drivers, including the driver for the board Button. */ +			#define BOARD_MICROPENDOUS_A       36 + +			/** Selects the Micropendous 1 specific board drivers, including the driver for the board Button. */ +			#define BOARD_MICROPENDOUS_1       37 + +			/** Selects the Micropendous 2 specific board drivers, including the driver for the board Button. */ +			#define BOARD_MICROPENDOUS_2       38 + +			/** Selects the Micropendous 3 specific board drivers, including the driver for the board Button. */ +			#define BOARD_MICROPENDOUS_3       39 + +			/** Selects the Micropendous 4 specific board drivers, including the driver for the board Button. */ +			#define BOARD_MICROPENDOUS_4       40 + +			/** Selects the Micropendous DIP specific board drivers, including the driver for the board Button. */ +			#define BOARD_MICROPENDOUS_DIP     41 + +			/** Selects the Micropendous (Arduino-like) revision 1 specific board drivers, including the Button and LED drivers. */ +			#define BOARD_MICROPENDOUS_REV1    42 + +			/** Selects the Micropendous (Arduino-like) revision 2 specific board drivers, including the Button and LED drivers. */ +			#define BOARD_MICROPENDOUS_REV2    43 + +			/** Selects the XMEGA B1 Xplained specific board drivers, including the Button and LED drivers. */ +			#define BOARD_B1_XPLAINED          44 + +			/** Selects the Bitwizard Multio specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_MULTIO               45 + +			/** Selects the Bitwizard Big-Multio specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_BIGMULTIO            46 + +			/** Selects the DorkbotPDX Duce specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_DUCE                 47 + +			/** Selects the Olimex AVR-USB-32U4 specific board drivers, including the Button and LED drivers. */ +			#define BOARD_OLIMEX32U4           48 + +			/** Selects the Olimex AVR-USB-T32U4 specific board drivers, including the Button and LED drivers. */ +			#define BOARD_OLIMEXT32U4          49 + +			/** Selects the Olimex AVR-ISP-MK2 specific board drivers, including the Button and LED drivers. */ +			#define BOARD_OLIMEXISPMK2         50 + +			/** Selects the Arduino Leonardo specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_LEONARDO             51 + +			/** Selects the UC3-A3 Xplained specific board drivers, including the Button and LED drivers. */ +			#define BOARD_UC3A3_XPLAINED       52 + +			/** Selects the USB2AX version 3.1 specific board drivers, including the Button and LEDs drivers. */ +			#define BOARD_USB2AX_V31           53 + +			/** Selects the Stange-ISP specific board drivers, including the Button and LEDs drivers. */ +			#define BOARD_STANGE_ISP           54 + +			/** Selects the XMEGA C3 XPLAINED specific board drivers, including the Button and LEDs drivers. */ +			#define BOARD_C3_XPLAINED          55 + +			/** Selects the U2S specific board drivers, including the Button and LEDs drivers. */ +			#define BOARD_U2S                  56 + +			/** Selects the Arduino YUN specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_YUN                  57 + +			/** Selects the Arduino Micro specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_MICRO                58 + +			/** Selects the Pololu A-Star Micro specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_POLOLUMICRO          59 + +			/** Selects the Atmel Xplained-MINI specific board drivers, including the driver for the board LEDs. */ +			#define BOARD_XPLAINED_MINI        60 + +			/** Selects the QMK specific board drivres, including the driver for the board LEDs. */ +			#define BOARD_QMK                  61 + +			#if !defined(__DOXYGEN__) +				#define BOARD_                 BOARD_NONE + +				#if !defined(BOARD) +					#define BOARD              BOARD_NONE +				#endif +			#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Common/Common.h b/lib/lufa/LUFA/Common/Common.h new file mode 100644 index 0000000000..6864eb64ca --- /dev/null +++ b/lib/lufa/LUFA/Common/Common.h @@ -0,0 +1,393 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \dir + *  \brief Common library header files. + * + *  This folder contains header files which are common to all parts of the LUFA library. They may be used freely in + *  user applications. + */ + +/** \file + *  \brief Common library convenience headers, macros and functions. + * + *  \copydetails Group_Common + */ + +/** \defgroup Group_Common Common Utility Headers - LUFA/Drivers/Common/Common.h + *  \brief Common library convenience headers, macros and functions. + * + *  Common utility headers containing macros, functions, enums and types which are common to all + *  aspects of the library. + * + *  @{ + */ + +/** \defgroup Group_GlobalInt Global Interrupt Macros + *  \brief Convenience macros for the management of interrupts globally within the device. + * + *  Macros and functions to create and control global interrupts within the device. + */ + +#ifndef __LUFA_COMMON_H__ +#define __LUFA_COMMON_H__ + +	/* Macros: */ +		#define __INCLUDE_FROM_COMMON_H + +	/* Includes: */ +		#include <stdint.h> +		#include <stdbool.h> +		#include <string.h> +		#include <stddef.h> + +		#include "Architectures.h" +		#include "BoardTypes.h" +		#include "ArchitectureSpecific.h" +		#include "CompilerSpecific.h" +		#include "Attributes.h" + +		#if defined(USE_LUFA_CONFIG_HEADER) +			#include "LUFAConfig.h" +		#endif + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Architecture specific utility includes: */ +		#if defined(__DOXYGEN__) +			/** Type define for an unsigned integer the same width as the selected architecture's machine register. +			 *  This is distinct from the non-specific standard int data type, whose width is machine dependant but +			 *  which may not reflect the actual machine register width on some targets (e.g. AVR8). +			 */ +			typedef MACHINE_REG_t uint_reg_t; +		#elif (ARCH == ARCH_AVR8) +			#include <avr/io.h> +			#include <avr/interrupt.h> +			#include <avr/pgmspace.h> +			#include <avr/eeprom.h> +			#include <avr/boot.h> +			#include <math.h> +			#include <util/delay.h> + +			typedef uint8_t uint_reg_t; + +			#define ARCH_HAS_EEPROM_ADDRESS_SPACE +			#define ARCH_HAS_FLASH_ADDRESS_SPACE +			#define ARCH_HAS_MULTI_ADDRESS_SPACE +			#define ARCH_LITTLE_ENDIAN + +			#include "Endianness.h" +		#elif (ARCH == ARCH_UC3) +			#include <avr32/io.h> +			#include <math.h> + +			// === TODO: Find abstracted way to handle these === +			#define PROGMEM +			#define pgm_read_byte(x)         *x +			#define memcmp_P(...)            memcmp(__VA_ARGS__) +			#define memcpy_P(...)            memcpy(__VA_ARGS__) +			// ================================================= + +			typedef uint32_t uint_reg_t; + +			#define ARCH_BIG_ENDIAN + +			#include "Endianness.h" +		#elif (ARCH == ARCH_XMEGA) +			#include <avr/io.h> +			#include <avr/interrupt.h> +			#include <avr/pgmspace.h> +			#include <avr/eeprom.h> +			#include <math.h> +			#include <util/delay.h> + +			typedef uint8_t uint_reg_t; + +			#define ARCH_HAS_EEPROM_ADDRESS_SPACE +			#define ARCH_HAS_FLASH_ADDRESS_SPACE +			#define ARCH_HAS_MULTI_ADDRESS_SPACE +			#define ARCH_LITTLE_ENDIAN + +			#include "Endianness.h" +		#else +			#error Unknown device architecture specified. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			#if !defined(__DOXYGEN__) +				// Obsolete, retained for compatibility with user code +				#define MACROS                  do +				#define MACROE                  while (0) +			#endif + +			/** Convenience macro to determine the larger of two values. +			 * +			 *  \attention This macro should only be used with operands that do not have side effects from being evaluated +			 *             multiple times. +			 * +			 *  \param[in] x  First value to compare +			 *  \param[in] y  First value to compare +			 * +			 *  \return The larger of the two input parameters +			 */ +			#if !defined(MAX) || defined(__DOXYGEN__) +				#define MAX(x, y)               (((x) > (y)) ? (x) : (y)) +			#endif + +			/** Convenience macro to determine the smaller of two values. +			 * +			 *  \attention This macro should only be used with operands that do not have side effects from being evaluated +			 *             multiple times. +			 * +			 *  \param[in] x  First value to compare. +			 *  \param[in] y  First value to compare. +			 * +			 *  \return The smaller of the two input parameters +			 */ +			#if !defined(MIN) || defined(__DOXYGEN__) +				#define MIN(x, y)               (((x) < (y)) ? (x) : (y)) +			#endif + +			#if !defined(STRINGIFY) || defined(__DOXYGEN__) +				/** Converts the given input into a string, via the C Preprocessor. This macro puts literal quotation +				 *  marks around the input, converting the source into a string literal. +				 * +				 *  \param[in] x  Input to convert into a string literal. +				 * +				 *  \return String version of the input. +				 */ +				#define STRINGIFY(x)            #x + +				/** Converts the given input into a string after macro expansion, via the C Preprocessor. This macro puts +				 *  literal quotation marks around the expanded input, converting the source into a string literal. +				 * +				 *  \param[in] x  Input to expand and convert into a string literal. +				 * +				 *  \return String version of the expanded input. +				 */ +				#define STRINGIFY_EXPANDED(x)   STRINGIFY(x) +			#endif + +			#if !defined(CONCAT) || defined(__DOXYGEN__) +				/** Concatenates the given input into a single token, via the C Preprocessor. +				 * +				 *  \param[in] x  First item to concatenate. +				 *  \param[in] y  Second item to concatenate. +				 * +				 *  \return Concatenated version of the input. +				 */ +				#define CONCAT(x, y)            x ## y + +				/** CConcatenates the given input into a single token after macro expansion, via the C Preprocessor. +				 * +				 *  \param[in] x  First item to concatenate. +				 *  \param[in] y  Second item to concatenate. +				 * +				 *  \return Concatenated version of the expanded input. +				 */ +				#define CONCAT_EXPANDED(x, y)   CONCAT(x, y) +			#endif + +			#if !defined(ISR) || defined(__DOXYGEN__) +				/** Macro for the definition of interrupt service routines, so that the compiler can insert the required +				 *  prologue and epilogue code to properly manage the interrupt routine without affecting the main thread's +				 *  state with unintentional side-effects. +				 * +				 *  Interrupt handlers written using this macro may still need to be registered with the microcontroller's +				 *  Interrupt Controller (if present) before they will properly handle incoming interrupt events. +				 * +				 *  \note This macro is only supplied on some architectures, where the standard library does not include a valid +				 *        definition. If an existing definition exists, the alternative definition here will be ignored. +				 * +				 *  \ingroup Group_GlobalInt +				 * +				 *  \param[in] Name  Unique name of the interrupt service routine. +				 */ +				#define ISR(Name, ...)          void Name (void) __attribute__((__interrupt__)) __VA_ARGS__; void Name (void) +			#endif + +		/* Inline Functions: */ +			/** Function to reverse the individual bits in a byte - i.e. bit 7 is moved to bit 0, bit 6 to bit 1, +			 *  etc. +			 * +			 *  \param[in] Byte  Byte of data whose bits are to be reversed. +			 * +			 *  \return Input data with the individual bits reversed (mirrored). +			 */ +			static inline uint8_t BitReverse(uint8_t Byte) ATTR_WARN_UNUSED_RESULT ATTR_CONST; +			static inline uint8_t BitReverse(uint8_t Byte) +			{ +				Byte = (((Byte & 0xF0) >> 4) | ((Byte & 0x0F) << 4)); +				Byte = (((Byte & 0xCC) >> 2) | ((Byte & 0x33) << 2)); +				Byte = (((Byte & 0xAA) >> 1) | ((Byte & 0x55) << 1)); + +				return Byte; +			} + +			/** Function to perform a blocking delay for a specified number of milliseconds. The actual delay will be +			 *  at a minimum the specified number of milliseconds, however due to loop overhead and internal calculations +			 *  may be slightly higher. +			 * +			 *  \param[in] Milliseconds  Number of milliseconds to delay +			 */ +			static inline void Delay_MS(uint16_t Milliseconds) ATTR_ALWAYS_INLINE; +			static inline void Delay_MS(uint16_t Milliseconds) +			{ +				#if (ARCH == ARCH_AVR8) +				if (GCC_IS_COMPILE_CONST(Milliseconds)) +				{ +					_delay_ms(Milliseconds); +				} +				else +				{ +					while (Milliseconds--) +					  _delay_ms(1); +				} +				#elif (ARCH == ARCH_UC3) +				while (Milliseconds--) +				{ +					__builtin_mtsr(AVR32_COUNT, 0); +					while ((uint32_t)__builtin_mfsr(AVR32_COUNT) < (F_CPU / 1000)); +				} +				#elif (ARCH == ARCH_XMEGA) +				if (GCC_IS_COMPILE_CONST(Milliseconds)) +				{ +					_delay_ms(Milliseconds); +				} +				else +				{ +					while (Milliseconds--) +					  _delay_ms(1); +				} +				#endif +			} + +			/** Retrieves a mask which contains the current state of the global interrupts for the device. This +			 *  value can be stored before altering the global interrupt enable state, before restoring the +			 *  flag(s) back to their previous values after a critical section using \ref SetGlobalInterruptMask(). +			 * +			 *  \ingroup Group_GlobalInt +			 * +			 *  \return  Mask containing the current Global Interrupt Enable Mask bit(s). +			 */ +			static inline uint_reg_t GetGlobalInterruptMask(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint_reg_t GetGlobalInterruptMask(void) +			{ +				GCC_MEMORY_BARRIER(); + +				#if (ARCH == ARCH_AVR8) +				return SREG; +				#elif (ARCH == ARCH_UC3) +				return __builtin_mfsr(AVR32_SR); +				#elif (ARCH == ARCH_XMEGA) +				return SREG; +				#endif +			} + +			/** Sets the global interrupt enable state of the microcontroller to the mask passed into the function. +			 *  This can be combined with \ref GetGlobalInterruptMask() to save and restore the Global Interrupt Enable +			 *  Mask bit(s) of the device after a critical section has completed. +			 * +			 *  \ingroup Group_GlobalInt +			 * +			 *  \param[in] GlobalIntState  Global Interrupt Enable Mask value to use +			 */ +			static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState) ATTR_ALWAYS_INLINE; +			static inline void SetGlobalInterruptMask(const uint_reg_t GlobalIntState) +			{ +				GCC_MEMORY_BARRIER(); + +				#if (ARCH == ARCH_AVR8) +				SREG = GlobalIntState; +				#elif (ARCH == ARCH_UC3) +				if (GlobalIntState & AVR32_SR_GM) +				  __builtin_ssrf(AVR32_SR_GM_OFFSET); +				else +				  __builtin_csrf(AVR32_SR_GM_OFFSET); +				#elif (ARCH == ARCH_XMEGA) +				SREG = GlobalIntState; +				#endif + +				GCC_MEMORY_BARRIER(); +			} + +			/** Enables global interrupt handling for the device, allowing interrupts to be handled. +			 * +			 *  \ingroup Group_GlobalInt +			 */ +			static inline void GlobalInterruptEnable(void) ATTR_ALWAYS_INLINE; +			static inline void GlobalInterruptEnable(void) +			{ +				GCC_MEMORY_BARRIER(); + +				#if (ARCH == ARCH_AVR8) +				sei(); +				#elif (ARCH == ARCH_UC3) +				__builtin_csrf(AVR32_SR_GM_OFFSET); +				#elif (ARCH == ARCH_XMEGA) +				sei(); +				#endif + +				GCC_MEMORY_BARRIER(); +			} + +			/** Disabled global interrupt handling for the device, preventing interrupts from being handled. +			 * +			 *  \ingroup Group_GlobalInt +			 */ +			static inline void GlobalInterruptDisable(void) ATTR_ALWAYS_INLINE; +			static inline void GlobalInterruptDisable(void) +			{ +				GCC_MEMORY_BARRIER(); + +				#if (ARCH == ARCH_AVR8) +				cli(); +				#elif (ARCH == ARCH_UC3) +				__builtin_ssrf(AVR32_SR_GM_OFFSET); +				#elif (ARCH == ARCH_XMEGA) +				cli(); +				#endif + +				GCC_MEMORY_BARRIER(); +			} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Common/CompilerSpecific.h b/lib/lufa/LUFA/Common/CompilerSpecific.h new file mode 100644 index 0000000000..41e5305b1d --- /dev/null +++ b/lib/lufa/LUFA/Common/CompilerSpecific.h @@ -0,0 +1,97 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Compiler specific definitions 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 Definitions + *  \brief Compiler specific definitions for code optimization and correctness. + * + *  Compiler specific definitions 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"); + +				/** Determines 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 \c true if the given value is known to be a compile time constant, \c false otherwise. +				 */ +				#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/lib/lufa/LUFA/Common/Endianness.h b/lib/lufa/LUFA/Common/Endianness.h new file mode 100644 index 0000000000..8be9e0d699 --- /dev/null +++ b/lib/lufa/LUFA/Common/Endianness.h @@ -0,0 +1,493 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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. +			 * +			 *  \hideinitializer +			 * +			 *  \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. +			 * +			 *  \hideinitializer +			 * +			 *  \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. +			 * +			 *  \return Input data with the individual bytes reversed. +			 */ +			static inline uint16_t SwapEndian_16(const uint16_t Word) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE; +			static inline uint16_t SwapEndian_16(const uint16_t Word) +			{ +				if (GCC_IS_COMPILE_CONST(Word)) +				  return SWAPENDIAN_16(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. +			 * +			 *  \return Input data with the individual bytes reversed. +			 */ +			static inline uint32_t SwapEndian_32(const uint32_t DWord) ATTR_WARN_UNUSED_RESULT ATTR_CONST ATTR_ALWAYS_INLINE; +			static inline uint32_t SwapEndian_32(const uint32_t DWord) +			{ +				if (GCC_IS_COMPILE_CONST(DWord)) +				  return SWAPENDIAN_32(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. +			 * +			 *  \return Input data with the individual bytes reversed. +			 */ +			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/lib/lufa/LUFA/DoxygenPages/BuildSystem.txt b/lib/lufa/LUFA/DoxygenPages/BuildSystem.txt new file mode 100644 index 0000000000..e0d84f0acd --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/BuildSystem.txt @@ -0,0 +1,281 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** \page Page_BuildSystem The LUFA Build System + * + *  \section Sec_BuildSystem_Overview Overview of the LUFA Build System + *  The LUFA build system was originally an attempt at making a set of + *  re-usable, modular build make files which could be referenced in a LUFA + *  powered project, to minimize the amount of code required in an + *  application makefile. + * + *  As it turned out to be fairly generic in nature, it was split out into its + *  own separate project, called DMBS (<i>Dean's Makefile Build System</i>) + *  which is released into the public domain. LUFA-specific portions of the + *  LUFA build system extend DMBS, and provide a universal build system for all + *  LUFA projects. + * + *  The latest DMBS project information and documentation can be found at: + *  https://github.com/abcminiuser/dmbs + * + *  DMBS is written in GNU Make, and each module is independent of one-another. + * + *  LUFA now uses DMBS for its build system, with some LUFA specific extension + *  modules. + * + *  If you have problems building using LUFA, see \subpage Page_BuildTroubleshooting for resolution steps. + * + *  \li \subpage Page_BuildModule_LUFA_SOURCES - The LUFA SOURCES extension module for DMBS + *  \li \subpage Page_BuildModule_LUFA_GCC - The LUFA GCC extension module for DMBS + */ + +/** \page Page_BuildModule_LUFA_SOURCES LUFA SOURCES extension module for DMBS + * + *  The LUFA SOURCES extension more for DMBS provides LUFA specific variables + *  listing the various LUFA source files required to be build by a project for + *  a given LUFA module. This module gives a way to reference LUFA source files + *  symbolically, so that changes to the library structure do not break the + *  library makefile. + * + *  To use this module in your application makefile, add the following code: + *  \code + *  include $(LUFA_PATH)/Build/LUFA/lufa-sources.mk + *  \endcode + * + *  \section SSec_BuildModule_LUFA_SOURCES_Requirements Requirements + *  None. + * + *  \section SSec_BuildModule_LUFA_SOURCES_Targets Targets + * + *  <table> + *   <tr> + *    <td><i>None</i></td> + *   </tr> + *  </table> + * + *  \section SSec_BuildModule_LUFA_SOURCES_MandatoryParams Mandatory Parameters + * + *  <table> + *   <tr> + *    <td><tt>LUFA_PATH</tt></td> + *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td> + *   </tr> + *   <tr> + *    <td><tt>ARCH</tt></td> + *    <td>Architecture of the target processor (see \ref Page_DeviceSupport).</td> + *   </tr> + *  </table> + * + *  \section SSec_BuildModule_LUFA_SOURCES_OptionalParams Optional Parameters + * + *  <table> + *   <tr> + *    <td><i>None</i></td> + *   </tr> + *  </table> + * + *  \section SSec_BuildModule_LUFA_SOURCES_ProvidedVariables Module Provided Variables + * + *  <table> + *   <tr> + *    <td><tt>LUFA_SRC_USB</tt></td> + *    <td>List of LUFA USB driver source files.</td> + *   </tr> + *   <tr> + *    <td><tt>LUFA_SRC_USBCLASS</tt></td> + *    <td>List of LUFA USB Class driver source files.</td> + *   </tr> + *   <tr> + *    <td><tt>LUFA_SRC_TEMPERATURE</tt></td> + *    <td>List of LUFA temperature sensor driver source files.</td> + *   </tr> + *   <tr> + *    <td><tt>LUFA_SRC_SERIAL</tt></td> + *    <td>List of LUFA Serial U(S)ART driver source files.</td> + *   </tr> + *   <tr> + *    <td><tt>LUFA_SRC_TWI</tt></td> + *    <td>List of LUFA TWI driver source files.</td> + *   </tr> + *   <tr> + *    <td><tt>LUFA_SRC_PLATFORM</tt></td> + *    <td>List of LUFA architecture specific platform management source files.</td> + *   </tr> + *  </table> + * + *  \section SSec_BuildModule_LUFA_SOURCES_ProvidedMacros Module Provided Macros + * + *  <table> + *   <tr> + *    <td><i>None</i></td> + *   </tr> + *  </table> + */ + +/** \page Page_BuildModule_LUFA_GCC LUFA GCC extension module for DMBS + * + *  The LUFA GCC extension module for the standard DMBS GCC module extends the + *  latter to support the compilation of LUFA powered projects. It should be + *  imported into your LUFA powered project makefiles to ensure that the correct + *  build settings are used for the project's configuration. + * + *  To use this module in your application makefile, add the following code: + *  \code + *  include $(LUFA_PATH)/Build/LUFA/lufa-gcc.mk + *  \endcode + * + *  \section SSec_BuildModule_LUFA_GCC_Requirements Requirements + *  This module should be included in your makefile *after* the DMBS GCC module. + * + *  \section SSec_BuildModule_LUFA_GCC_Targets Targets + * + *  <table> + *   <tr> + *    <td><i>None</i></td> + *   </tr> + *  </table> + * + *  \section SSec_BuildModule_LUFA_GCC_MandatoryParams Mandatory Parameters + * + *  <table> + *   <tr> + *    <td><tt>LUFA_PATH</tt></td> + *    <td>Path to the LUFA library core, either relative or absolute (e.g. <tt>../LUFA-000000/LUFA/</tt>).</td> + *   </tr> + *  </table> + * + *  \section SSec_BuildModule_LUFA_GCC_OptionalParams Optional Parameters + * + *  <table> + *   <tr> + *    <td><tt>BOARD</tt></td> + *    <td>LUFA board hardware drivers to use (see \ref Page_DeviceSupport).</td> + *   </tr> + *  </table> + * + *  \section SSec_BuildModule_LUFA_GCC_ProvidedVariables Module Provided Variables + * + *  <table> + *   <tr> + *    <td><i>None</i></td> + *   </tr> + *  </table> + * + *  \section SSec_BuildModule_LUFA_GCC_ProvidedMacros Module Provided Macros + * + *  <table> + *   <tr> + *    <td><i>None</i></td> + *   </tr> + *  </table> + */ + +/** \page Page_BuildTroubleshooting Troubleshooting Information + * + *  LUFA uses a lot of advanced features of the AVR-GCC compiler, linker, and + *  surrounding binaries. This can sometimes lead to problems compiling + *  applications if one of these features is buggy in the version of the tools + *  used in a build environment. Missing utilities and incorrectly set makefile + *  configuration options can also result in different errors being produced + *  when compilation or other operations are attempted. The table below lists a + *  set of commonly encountered errors and their resolutions. + * + *  <table> + *    <tr> + *    <th>Problem</th> + *    <th>Resolution</th> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>relocation truncated to fit: R_AVR_13_PCREL against symbol <i>{X}</i></tt></b>" shown when compiling.</td> + *    <td>Try compiling with the setting <tt>LINKER_RELAXATIONS=N</tt> in your LUFA Build System 2.0 makefile, or remove the line <tt>-Wl,--relax</tt> + *        from other makefiles. Alternatively, make sure you have the latest version of the Atmel Toolchain installed for your system.</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>error: ld terminated with signal 11 [Segmentation fault]</tt></b>" shown when compiling.</td> + *    <td>Try compiling with the setting <tt>DEBUG_LEVEL=2</tt> in your LUFA Build System 2.0 makefile, or make sure you are using <tt>binutils</tt> version 2.22 or later.</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>EMERGENCY ABORT: INFINITE RECURSION DETECTED</tt></b>" shown when compiling.</td> + *    <td>Make sure you are using an up to date version of GNU Make when compiling. This error is a safety system added to the mid-level makefiles, to prevent an issue with + *        GNU make or other variants of Make causing an infinitely recursive build.</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>Unsupported architecture "<i>{X}</i>"</tt></b>" shown when compiling.</td> + *    <td>Ensure your makefile's <tt>ARCH</tt> setting is set to one of the architecture names (case-sensitive) supported by the version of LUFA you are compiling against.</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>Makefile <i>{X}</i> value not set</tt></b>" shown when compiling.</td> + *    <td>The specified Makefile value was not configured in your project's makefile or on the command line, and the nominated setting is required by one or more LUFA + *        build system modules. Define the value in your project makefile and try again.</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>Makefile <i>{X}</i> option cannot be blank</tt></b>" shown when compiling.</td> + *    <td>The specified Makefile value was configured in your project's makefile or on the command line, but was set to an empty value. For the nominated configuration + *        option, an empty value is not allowed. Define the nominated setting to a correct non-blank value and try again.</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>Makefile <i>{X}</i> option must be Y or N</tt></b>" shown when compiling.</td> + *    <td>The specified Makefile value was configured in your project's makefile or on the command line, but was set to a value other than a Y (for "Yes") or "N" (for "No"). + *        This configuration option is required to be one of the aforementioned boolean values, and other values are invalid. Set this option to either Y or N and try again.</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>Unknown input source file formats: <i>{X}</i></tt></b>" shown when compiling.</td> + *    <td>The nominated source files, specified in your project's makefile in the <tt>SRC</tt> configuration option, has an extension that the LUFA build system does not + *        recognise. The file extensions are case sensitive, and must be one of the supported formats (<tt>*.c</tt>, <tt>*.cpp</tt> or <tt>*.S</tt>).</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>Cannot build with OBJDIR parameter set - one or more object file name is not unique</tt></b>" shown when compiling.</td> + *    <td>When a project is built with a non-empty <tt>OBJDIR</tt> object directory name set, all input source files must have unique names, excluding extension and path. + *        This means that input files that are named identically and differ only by their path or extension are invalid when this mode is used.</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>Source file does not exist: <i>{X}</i></tt></b>" shown when compiling.</td> + *    <td>The nominated input source file, specified in the user project's <tt>SRC</tt> parameter, could not be found. Ensure the source file exists and the absolute or + *        relative path given in the user project makefile is correct and try again.</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>Doxygen configuration file <i>{X}</i> does not exist</tt></b>" shown when upgrading a Doxygen configuration file.</td> + *    <td>The nominated Doxygen configuration file, specified in the user project's <tt>DOXYGEN_CONF</tt> parameter, could not be found. Ensure the configuration file exists + *        and the absolute or relative path given in the user project makefile is correct and try again, or run the appropriate makefile target to generate a new configuration + *        file.</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>avr-gcc: error: unrecognized option '<i>{X}</i>'</tt></b>" shown when compiling.</td> + *    <td>An unrecognised option was supplied to the compiler, usually in the <tt>C_FLAGS</tt>, <tt>CPP_FLAGS</tt>, <tt>ASM_FLAGS</tt> or <tt>CC_FLAGS</tt> configuration + *        options. The nominated compiler switch may be invalid, or unsupported by the version of AVR-GCC on the host system. Remove the unrecognised flag if invalid, or + *        upgrade to the latest AVR-GCC. If the option is a valid linker option, use the prefix "-Wl," to ensure it is passed to the linker correctly.</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>makefile:{X}: {Y}.mk: No such file or directory</tt></b>" shown when make is invoked.</td> + *    <td>The path to the nominated makefile module was incorrect. This usually indicates that the makefile <tt>LUFA_PATH</tt> option is not set to a valid relative or + *        absolute path to the LUFA library core.</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>fatal error: LUFAConfig.h: No such file or directory</tt></b>" shown when compiling.</td> + *    <td>The <tt>USE_LUFA_CONFIG_HEADER</tt> compile time option was set in the user project makefile, but the user supplied <tt>LUFAConfig.h</tt> header could not be + *        found. Ensure that the directory that contains this configuration file is correctly passed to the compiler via the -I switch in the makefile <tt>CC_FLAGS</tt> + *        parameter.</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>ld.exe: section .apitable_trampolines loaded at <i>{X}</i> overlaps section .text</tt></b>" shown when compiling a bootloader.</td> + *    <td>The bootloader is compiling too large for the given <tt>FLASH_SIZE_KB</tt> and <tt>BOOT_SECTION_SIZE_KB</tt> parameters set in the bootloader makefile. This + *        usually indicates that these values are incorrect for the specified device the bootloader is targeting. If these values are correct, a newer version of the + *        compiler may need to be used to ensure that the bootloader is built within the section size constraints of the target device.</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>unknown MCU '<i>{X}</i>' specified</tt></b>" shown when compiling.</td> + *    <td>The specified microcontroller device model name set in the user application's makefile as the <tt>MCU</tt> parameter is incorrect, or unsupported by the + *        version of the compiler being used. Make sure the model name is correct, or upgrade to the latest Atmel Toolchain to obtain newer device support.</td> + *   </tr> + *   <tr> + *    <td>Error "<b><tt>undefined reference to `<i>{X}</i>'</tt></b>" shown when compiling.</td> + *    <td>This is usually caused by a missing source file in the user application's <tt>SRC</tt> configuration parameter. If the indicated symbol is one from the LUFA + *        library, you may be missing a LUFA source makefile module (see \ref Page_BuildModule_LUFA_SOURCES).</td> + *   </tr> + *  </table> + * + *  For troubleshooting other errors you encounter, please see \ref Sec_ProjectHelp. + */ diff --git a/lib/lufa/LUFA/DoxygenPages/BuildingLinkableLibraries.txt b/lib/lufa/LUFA/DoxygenPages/BuildingLinkableLibraries.txt new file mode 100644 index 0000000000..cbbae4b8e9 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/BuildingLinkableLibraries.txt @@ -0,0 +1,23 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** \page Page_BuildLibrary Building as a Linkable Library + * + *  The LUFA library can be built as a proper linkable library (with the extension .a) under AVR-GCC, so that + *  the library does not need to be recompiled with each revision of a user project. Instructions for creating + *  a library from a given source tree can be found in the AVR-GCC user manual included in the WinAVR install + *  /Docs/ directory. + * + *  However, building the library is <b>not recommended</b>, as the static (compile-time) options will be + *  unable to be changed without a recompilation of the LUFA code. Therefore, if the library is to be built + *  from the LUFA source, it should be made to be application-specific and compiled with the static options + *  that are required for each project (which should be recorded along with the library). + * + *  Normal library use has the library components compiled in at the same point as the application code, as + *  demonstrated in the library demos and applications. This is the preferred method, as the library is recompiled + *  each time to ensure that all static options for a particular application are applied. + */ + diff --git a/lib/lufa/LUFA/DoxygenPages/ChangeLog.txt b/lib/lufa/LUFA/DoxygenPages/ChangeLog.txt new file mode 100644 index 0000000000..aedfd3ce53 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/ChangeLog.txt @@ -0,0 +1,1653 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + + /** \page Page_ChangeLog Project Changelog +  * +  *  \section Sec_ChangeLog170418 Version 170418 +  *  <b>New:</b> +  *  - Core: +  *   - Added support for the Pololu A-Star Micro board (thanks to Joh Schneider) +  *   - Added new \c LUFA_VERSION_RELEASE_TYPE macro to the library version header, to determine release type (thanks to NicoHood) +  * +  *  <b>Fixed:</b> +  *  - Core: +  *   - The CALLBACK_USB_GetDescriptor() callback function into the user application erroneously had a uint8_t type for the wIndex +  *     parameter, instead of uint16_t (thanks to Matlo) +  *   - Fixed broken USE_RAM_DESCRIPTORS compile time option when the FIXED_NUM_CONFIGURATIONS compile time option is not enabled +  *     in a user application (thanks to Matlo) +  *   - Fixed missing \c va_end() calls in the HID bootloader CLI app which could cause portability issues +  *   - Fixed void pointer arithmetic in the \c Serial_SendData() functions for AVR8 and XMEGA architectures +  *   - Fixed void pointer arithmetic in the low level and class driver RNDIS demo protocol decoders +  *   - Fixed low level RNDIS demo incorrectly setting the RNDIS state when a null packet filter was requested +  *   - Fixed missing entries in several project's Atmel Studio integration files, such as driver INF files +  *   - Fixed invalid endpoint indexes causing memory corruption in device Clear/Set Feature standard requests (thanks to Peter Popovec) +  *   - Fixed incorrect serialization in USB_SetHIDReportItemInfo() function (thanks to e-chip) +  * +  *  <b>Changed:</b> +  *   - Added signed alternative libUSB driver for the AVRISP-MKII clone project, to support Atmel Studio 7 (thanks to Atmel) +  *   - Removed no longer required LIBUSB_DRIVER_COMPAT and RESET_TOGGLES_LIBUSB_COMPAT configuration options from the AVRISP-MKII +  *     clone project, as the new libUSB driver works for AVRDUDE and Atmel Studio 7 under Windows +  *   - Replaced the LUFA build system with its (compatible) successor, DMBS (Dean's Makefile Build System) +  *   - Removed obsolete library TAR export and associated documentation +  *   - Fixed incorrect HID_DESCRIPTOR_KEYBOARD() macro definition (thanks to Eric Tang) +  * +  *  \section Sec_ChangeLog151115 Version 151115 +  *  <b>New:</b> +  *   - Added support for the Atmel Xplained-MINI series of development kits +  *   - Added new PROGMEM variant send functions to the CDC class device driver (thanks to Stefan Hellermann) +  *   - Added new PROGMEM variant send functions to the CDC class host driver +  *   - Added additional Arduino Uno board definitions for the main processor reset (thanks to NicoHood) +  *   - Added modified DocBook transforms to generate Atmel Studio 6/7 internal help documentation (thanks to Morten Engelhardt Olsen) +  * +  *  <b>Changed:</b> +  *  - Core: +  *   - The TWI peripheral driver's TWI_WritePacket() and TWI_ReadPacket() functions now takes a 16-bit Length rather than an 8-bit +  *     length, for longer transfers +  *  - Library Applications: +  *   - The CDC, DFU, Mass Storage and Printer class bootloaders will no longer run the user application if the application reset +  *     vector is blank (thanks to Alex Kazik) +  *   - The CDC, DFU and Printer class bootloaders are now compatible with the original Atmel XPLAIN and Arduino Leonardo boards +  *   - The CDC, DFU, Mass Storage and Printer class bootloaders are not compatible with devices with the BOOTRST fuse set and will +  *     exit automatically unless an external reset was the last reset cause (thanks to Alex Kazik) +  *   - Added missing force-inline attribute to the endianness utility functions (thanks to Stefan Hellermann) +  *   - Updated the DFU build system module to use updated EEPROM programming command arguments for dfu-programmer 0.6.2 or newer +  * +  *  <b>Fixed:</b> +  *   - Fixed broken XMEGA serial stream driver due to missing USART base pointer parameter (thanks to William Patterson) +  *   - Fixed incorrect signature reported in the CDC/DFU bootloaders for the AT90USB82 (thanks to NicoHood) +  *   - Fixed broken RNDIS demos on Linux machines whose DHCP hosts require a Lease Time option (thanks to Stefan Hellermann) +  *   - Fixed broken LEDs_Disable() implementation for the Arduino Uno board (thanks to NicoHood) +  *   - Fixed missing bounds checks and off-by-one in the DFU bootloader signature bytes (thanks to Reuti) +  * +  *  \section Sec_ChangeLog140928 Version 140928 +  *  <b>New:</b> +  *  - Core: +  *   - Updated the BUILD build system module to add a new COMPILER_PATH optional variable +  *   - Added Serial_IsSendReady() and Serial_IsSendComplete() functions to the Serial hardware peripheral driver +  *   - Added support for the Arduino Yun board (ATMEGA32U4 co-processor) +  *   - Added support for the Arduino Micro board (thanks to Zoltán Szőke) +  *  - Library Applications: +  *   - Added new Dual MIDI class driver device demo +  * +  *  <b>Changed:</b> +  *  - Core: +  *   - The RNDIS device class driver now takes a user-supplied buffer and buffer length for the internal RNDIS +  *     message management (thanks to Peter Mc Shane) +  * +  *  <b>Fixed:</b> +  *  - Core: +  *   - Fixed device class driver pipe configuration routines returning success with a partially constructed instance +  *     when a pipe configuration failed (thanks to Helge Suess) +  *   - Fixed incorrect XMEGA DFLL reference frequency (thanks to Martin Aakerberg) +  *   - Fixed possible infinite loop in the control endpoint stream write function (thanks to Clayton Knight) +  *   - Fixed missing HID report ID prefix on HID class driver GetReport request responses (thanks to Bert van Hall) +  *   - Fixed incorrect XMEGA USB controller clock division factory for non-Full Speed operation (thanks to Bert van Hall) +  *   - Fixed the LUFA build system to prevent incorrect code from being generated in newer toolchains when building for larger +  *     FLASH memory devices (thanks to demultiplexer) +  *   - Fixed missing parenthesis in the MIDI_EVENT() macro which could cause incorrect results (thanks to hexwab) +  *   - Fixed mixed capitalization of TWI in the XMEGA TWI driver causing compilation failures (thanks to Jacob Schloss) +  *   - Fixed broken AVR8 USART-SPI peripheral driver (thanks to Phil Zakielarz) +  *  - Library Applications: +  *   - Fixed spurious 0xFE USART byte sent in the USBtoSerial project when the baud rate is changed (thanks to Carl Kjeldsen) +  *   - Fixed blocking USART reads causing low throughput on slow baud rates in the USBtoSerial project (thanks to Nevada Smith) +  *   - Fixed USART reception overrun corrupting the internal buffers in the USBtoSerial project (thanks to Nevada Smith) +  *   - Fixed broken LowLevel Audio Out demo sampling frequency configuration (thanks to Torsten Duwe) +  * +  *  \section Sec_ChangeLog140302 Version 140302 +  *  <b>New:</b> +  *  - Library Applications: +  *   - Added new Bulk Vendor low level device demo +  *   - Added new libUSB host Python and NodeJS application examples for the Class driver GenericHID demo (thanks to Laszlo Monda) +  *   - Added new AVR8 USB option to keep 3.3V regulator enabled (thanks to Michael Hanselmann) +  *   - Added new USB_STRING_DESCRIPTOR() and USB_STRING_DESCRIPTOR_ARRAY() convenience macros (thanks to Laszlo Monda) +  * +  *  <b>Changed:</b> +  *  - Library Applications: +  *   - Refactored out USB interface IDs in the demo applications into enums (thanks to Laszlo Monda) +  *   - AVRISP-MKII Clone Project PDI/TPI frequency increased from 250KHz to 2MHz as it is now stable +  *   - Increased TPI/PDI handshake delay to 100us from 1us to support targets with high amounts of capacitance on their +  *     /RESET lines (thanks to Paul Duke) +  *   - Changed the VERSION_BCD() macro to accept the major/minor/revision values as separate parameters +  * +  *  <b>Fixed:</b> +  *  - Core: +  *   - Fixed MIDI device class driver MIDI_Device_ReceiveEventPacket() for the XMEGA architecture +  *  - Library Applications: +  *   - Fixed incorrect signature bytes returned in the DFU bootloader +  * +  *  \section Sec_ChangeLog130901 Version 130901 +  *  <b>New:</b> +  *  - Core: +  *   - Added additional MIDI command definitions to the MIDI class driver (thanks to Daniel Dreibrodt) +  *   - Added new CONCAT() and CONCAT_EXPANDED() convenience macros +  *   - Added new Printer Device Class driver +  *   - Added support for the XMEGA C3 Xplained board +  *   - Added support for the U2S board (thanks to megal0maniac) +  *   - Added TWI Master driver for the XMEGA architecture (thanks to Michael Janssen) +  *  - Library Applications: +  *   - Added new Printer class bootloader +  *   - Added new Mass Storage class bootloader +  *   - Added XMEGA support for class driver device demos (where applicable) +  *   - Added Python host application example for the Generic HID class driver device demo +  *   - Added Python alternative host application for the HID class bootloader +  * +  *  <b>Changed:</b> +  *  - Core: +  *   - Updated the BUILD build system module to produce binary BIN files in addition to Intel HEX files +  *   - Updated the Android Accessory Class to accept version 2 protocol devices (with version 1 functionality) +  *   - All board drivers now implement dummy functions and constants when BOARD is set to NONE +  *   - Added missing LEDs to the XMEGA A3BU Xplained board LED driver (thanks to Michael Janssen) +  *   - Changed board Dataflash drivers to automatically configure the appropriate SPI interface for the selected board +  *  - Library Applications: +  *   - Re-added Set Control Line State request handling to the CDC class bootloader to prevent issues with the .NET serial +  *     class (thanks to Erik Lins) +  *   - TemperatureDataLogger project dummy RTC mode now tracks real time (thanks to David Lazarus) +  * +  *  <b>Fixed:</b> +  *  - Core: +  *   - Fixed Low Speed USB devices broken when using the library HID Class driver (thanks to Michael) +  *   - Fixed possible register corruption in USB Host mode on AVR8 devices when ORDERED_EP_CONFIG is used (thanks to Martin Aakerberg) +  *   - Fixed Pipe_GetBoundEndpointAddress() returning invalid endpoint directions on AVR8 architecture devices (thanks to decerri) +  *     under some circumstances +  *   - Fixed incorrect USB device state set when a suspended LUFA device is woken while addressed but not configured (thanks to Balaji Krishnan) +  *   - Fixed broken USART SPI driver for the AVR8 architecture due to incorrect initialization +  *   - Fixed re-enumeration issue of XMEGA architecture targets (thanks to Jaroslav Jedlinsky) +  *   - Fixed error receiving PIMA events via the Still Image Host class driver +  *  - Library Applications: +  *   - Added handler for SCSI_CMD_START_STOP_UNIT in demos using the Mass Storage class, to prevent ejection errors on *nix systems due to an +  *     unknown SCSI command +  *   - Fixed incorrect HID report descriptor generated for 16-bit axis ranges by the HID_DESCRIPTOR_MOUSE() and HID_DESCRIPTOR_JOYSTICK() +  *     macros (thanks to Armory) +  *   - Fixed incorrect HID report descriptor generated for button multiples of 8 by the HID_DESCRIPTOR_MOUSE() and HID_DESCRIPTOR_JOYSTICK() +  *     macros +  *   - Fixed race condition in the DFU class bootloader causing failed device reprogramming in some circumstances (thanks to Luis Mendes) +  *   - Fixed incorrect time/date configuration data order in the TempDataLogger host application (thanks to David Lazarus) +  * +  *  \section Sec_ChangeLog130303 Version 130303 +  *  <b>New:</b> +  *  - Core: +  *   - Added support for the Arduino Leonardo board +  *   - Added support for the Atmel UC3-A3 Xplained board +  *   - Added support for the Xevelabs USB2AX revision 3.1 board +  *   - Added support for the Dimex Stange-ISP board (thanks to Gerhard Wesser) +  *   - Added new \c doxygen_upgrade and \c doxygen_create targets to the DOXYGEN build system module +  *   - Added new Board Hardware Information board driver +  *  - Library Applications: +  *   - Added a different device serial number when the AVRISP-MKII Clone project is in libUSB compatibility mode, so that +  *     both the libUSB and Jungo drivers can be installed at the same time without having to use a filter driver +  * +  *  <b>Changed:</b> +  *  - Core: +  *   - Added workaround for broken VBUS detection on AVR8 devices when a bootloader starts the application +  *     via a software jump without first turning off the OTG pad (thanks to Simon Inns) +  *  - Library Applications: +  *   - Increased throughput in the USBtoSerial project now that data transmission is non-blocking (thanks to Joseph Lacerte) +  *   - Updated bootloader makefiles to remove dependency on the \c bc command line calculator tool +  *   - Updated AVRISP-MKII Clone Programmer project so that the SCK clock period is saved in EEPROM (thanks to Gerhard Wesser) +  *   - Changed all *_SendByte() function prototypes to accept a void pointer for the input buffer (thanks to Simon Kuppers) +  * +  *  <b>Fixed:</b> +  *  - Core: +  *   - Fixed incorrectly issuing STALL response to unsupported control request SETUP packets, rather than in the data/status stage +  *   - Fixed inverted LEDs_GetLEDs() function implementation for the Benito, Minimus and Arduino UNO boards +  *   - Fixed missing Windows 32-bit compatibility sections in the LUFA INF driver files (thanks to Christan Beharrell) +  *   - Fixed logic hole breaking USB operations on a USB controller with only one supported USB mode and no USB_DEVICE_ONLY or USB_HOST_ONLY +  *     configuration token set +  *   - Fixed possible rounding in the VERSION_BCD() macros for some 0.01 step increments (thanks to Oliver Zander) +  *   - Fixed incorrect Dataflash functionality in the USBKEY board if the driver is modified for a single Dataflash chip (thanks to Jonathan Oakley) +  *   - Fixed incorrect definitions of \c HID_KEYBOARD_LED_KANA, \c HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN and \c HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN_AS400 +  *     and added a missing definition for \c HID_KEYBOARD_SC_APPLICATION (thanks to David Monro) +  *   - Fixed maximum allowed keyboard key code usage of \c 0x65 rather than \c 0xFF for the \c HID_DESCRIPTOR_KEYBOARD() macro (thanks to David Monro) +  *   - Fixed hardware race condition that could cause failed device enumerations for AVR8 and UC3 architectures (thanks to Mike Beyhs) +  *   - Fixed incorrect Minimus board LED definitions (thanks to Joonas Lahtinen) +  *   - Fixed incorrect ordering of the linker options in the build system causing link failures in some cases +  *   - Fixed bug in the TWI peripheral driver for the AVR8 devices causing incorrect failure codes to be returned in some cases (thanks to Peter K) +  *   - Fixed swapped LED3 and LED4 masks for the Olimex-32U4 development board LED driver +  *   - Fixed potential NULL pointer dereference in the HID Host mode Class Driver (thanks to Pavel Kuzmin) +  *  - Library Applications: +  *   - Fixed broken RESET_TOGGLES_LIBUSB_COMPAT compile time option in the AVRISP-MKII project +  *   - Fixed incompatibility in the CDC class bootloader on some systems (thanks to Sylvain Munaut) +  *   - Fixed lengthy timeouts in the USBtoSerial project if no application on the host is consuming data (thanks to Nicolas Saugnier) +  *   - Fixed lengthy automatic data flushing in the CDC and MIDI device class drivers +  *   - Fixed incorrect LED masks for received data display in the Device GenericHID demos (thanks to Denys Berkovskyy) +  *   - Fixed incorrect output in the HIDReportViewer project when no device is connected (thanks to Pavel Kuzmin) +  * +  *  \section Sec_ChangeLog120730 Version 120730 +  *  <b>New:</b> +  *  - Core: +  *   - Added new, revamped modular build system with new makefile templates +  *   - Added support for the BitWizard Multio and Big-Multio boards +  *   - Added support for the DorkbotPDX Duce board +  *   - Added support for the Olimex AVR-USB-32U4 board +  *   - Added support for the Olimex AVR-USB-T32U4 board +  *   - Added support for the Olimex AVR-ISP-MK2 board +  *   - Added new Endpoint_ConfigureEndpointTable() function +  *   - Added new Pipe_ConfigurePipeTable() function +  *   - Added build test to verify correct compilation of all board drivers using all driver APIs +  *   - Added build test to verify correct compilation of all bootloaders using all supported devices +  *   - Added build test to verify that there are no detectable errors in the codebase via static analysis +  *   - Added new JTAG_ENABLE() macro for the AVR8 architecture +  *  - Library Applications: +  *   - Modified the CDC Host demos to set a default CDC Line Encoding on enumerated devices +  *   - Added Dataflash operational checks and aborts to all projects using the Dataflash to ensure it is working correctly before use +  *   - Added new SerialToLCD user project contributed by Simon Foster +  *   - Added new RESET_TOGGLES_LIBUSB_COMPAT compile time option to the AVRISP-MKII clone programmer project (thanks to Robert Spitzenpfeil) +  * +  *  <b>Changed:</b> +  *  - Core: +  *   - Android Accessory Host property strings changed from a struct of pointer to an array to prevent unaligned access on greater than 8-bit architectures +  *   - Audio Device Class driver changed to also require the index of the Audio Control interface within the device, for SET/GET/CUR/MIN/MAX/RES property adjustments +  *   - Removed variable axis support from the HID_DESCRIPTOR_JOYSTICK() macro due to OS incompatibilities, replaced with fixed 3-axis joystick report structure +  *   - Removed the old pseudo-scheduler from the library as it was unused and deprecated since the 090810 release +  *   - Endpoint indexes are now specified as full endpoint addresses within the device in device mode, rather than a logical index +  *   - The Endpoint_ConfigureEndpoint() function no longer takes an endpoint direction as a parameter, as this is now deduced from the specified full endpoint +  *     address and type +  *   - The Endpoint_ConfigureEndpoint() function no longer takes a number of banks as a special mask; the number of banks is now specified as an integer parameter +  *   - Endpoints are now configured via instances of a new struct USB_Endpoint_Table_t in all device mode class drivers, rather than a list of endpoint parameters +  *   - Pipe indexes are now specified as full pipe addresses within the host in host mode, rather than a logical index +  *   - The Pipe_ConfigurePipe() function no longer takes an pipe token as a parameter, as this is now deduced from the specified full pipe address and type +  *   - The Pipe_ConfigurePipe() function no longer takes a number of banks as a special mask; the number of banks is now specified as an integer parameter +  *   - Pipes are now configured via instances of a new struct USB_Pipe_Table_t in all host mode class drivers, rather than a list of pipe parameters +  *   - Added support for various assert and debugging macros for the UC3 devices +  *   - Changed MIDI event structure MIDI_EventPacket_t to use a single field for the combined virtual cable index and command ID, to prevent bitfield packing issues +  *     on some architectures (thanks to Darren Gibbs) +  *   - Changed board LED driver implementations of LEDs_ToggleLEDs() for the AVR8 architecture to use the fast PIN register toggle alternative function for speed +  *  - Library Applications: +  *   - Raised the guard bits in the AVRISP-MKII clone project when in PDI and TPI to 32, to prevent communication errors on low quality connections to a target +  *   - Added additional bootloader API data to expose the bootloader start address and class to the DFU and CDC class bootloaders +  *   - Reverted AVRISP-MKII clone project watchdog based command timeout patch in favour of a hardware timer, to allow for use in devices with WDTRST fuse programmed +  *   - The library bootloaders will now correctly start the user application after a watchdog-based application start, even if the /HWB line is held low externally +  *     during the reset phase +  *   - Increased endpoint polling interval for all demos and projects to 5ms, as 1ms was causing some enumeration issues on some machines (thanks to Riku Salminen) +  * +  *  <b>Fixed:</b> +  *  - Core: +  *   - Fixed possible enumeration error if the user application selects a pipe other than the default Control pipe between the Powered and Default states of +  *     the host state machine +  *   - Fixed incorrect call to the user callback CALLBACK_Audio_Device_GetSetInterfaceProperty() in the Audio Class device driver (thanks to Tiit Ratsep) +  *   - Fixed compile error for the UC3 architecture when INTERRUPT_CONTROL_ENDPOINT is specified (thanks to Andrus Aaslaid) +  *   - Fixed compile error if LEDs_Disable() is called and BOARD=NONE is set (thanks to Sam Lin) +  *   - Fixed inverted LED logic in the OLIMEX162 board LED driver +  *   - Fixed incorrect response to GET STATUS requests in device mode if NO_DEVICE_SELF_POWER or NO_DEVICE_REMOTE_WAKEUP tokens are defined (thanks to Georg Glock) +  *   - Fixed inverted LED logic in the USB2AX board LED driver +  *   - Fixed possible deadlock in the CDC device driver if the USB connection is dropped while the CDC_REQ_SetLineEncoding control request is being processed by +  *     the stack (thanks to Jonathan Hudgins) +  *   - Fixed broken MIDI host driver MIDI_Host_ReceiveEventPacket() function due to not unfreezing the MIDI data IN pipe before use (thanks to Michael Brown) +  *   - Fixed swapped Little Endian/Big Endian endpoint and pipe write code for the UC3 devices (thanks to Andrew Chu) +  *   - Fixed the JTAG_DISABLE() macro clearing all other bits in MCUSR when called +  *   - Fixed incorrect Micropendous board LED driver LEDs_SetAllLEDs() and LEDs_ChangeLEDs() function implementations (thanks to MitchJS) +  *   - Fixed endianess issues in the RNDIS host class driver for UC3 devices (thanks to Andrew Chu) +  *  - Library Applications: +  *   - Fixed error in the AVRISP-MKII programmer when ISP mode is used at 64KHz (thanks to Ben R. Porter) +  *   - Fixed AVRISP-MKII programmer project failing to compile for the U4 chips when VTARGET_ADC_CHANNEL is defined to an invalid channel and NO_VTARGET_DETECT is +  *     defined (thanks to Steven Morehouse) +  *   - Fixed AVRISP-MKII programmer project reset line polarity inverted when the generated EEP file is loaded into the USB AVR's EEPROM and avr-dude is used +  *   - Fixed CDC and DFU bootloaders failing to compile when the bootloader section size is 8KB or more (thanks to Georg Glock) +  *   - Fixed CDC and DFU bootloaders API function offsets incorrect on some devices (thanks to Rod DeMay) +  *   - Fixed incorrect DFU version number reported to the host in the  DFU bootloader descriptors (thanks to Georg Glock) +  *   - Fixed incorrect version hundredths value encoding in VERSION_BCD() macro (thanks to Georg Glock) +  *   - Fixed invalid configuration descriptor in the low level KeyboardMouse device demo (thanks to Jun Wako) +  *   - Fixed CDC and DFU bootloaders API page erase and write function failures (thanks to Martin Lambert) +  * +  *  \section Sec_ChangeLog120219 Version 120219 +  *  <b>New:</b> +  *  - Core: +  *   - Added support for the XMEGA A3BU Xplained board +  *   - Added support for the new B series XMEGA devices +  *   - Added support for version 2 of the Teensy boards (thanks to Christoph Redecker) +  *   - Added support for the USB2AX boards, hardware revision 1-3 +  *   - Added new Android Accessory Host class driver +  *   - Added new USB_Host_GetDescriptor(), USB_Host_GetDeviceConfiguration() and USB_Host_GetInterfaceAltSetting() functions +  *   - Added new CALLBACK_Audio_Device_GetSetInterfaceProperty() callback to the Audio Device Class driver +  *   - Added new LEDs_Disable(), Buttons_Disable() and Joystick_Disable() functions to the board hardware drivers +  *   - Added support for the Micropendous family of boards (Arduino-like revisions 1 and 2, DIP, 32U2, A, 1, 2, 3 and 4) +  *   - Added INVERTED_VBUS_ENABLE_LINE and NO_AUTO_VBUS_MANAGEMENT compile time options (thanks to Opendous Inc.) +  *   - Added support for the Atmel XMEGA B1 Xplained board +  *   - Added Serial USART peripheral driver for the XMEGA architecture +  *   - Added Master Mode SPI USART peripheral driver for the XMEGA and AVR8 architectures +  *   - Added build test to verify correct compilation of as many modules as possible under as many architectures as possible under the C and C++ languages +  *   - Added build test to verify correct compilation of the USB driver when forced into single USB mode under as many architectures as possible +  *  - Library Applications: +  *   - Added User Application APIs to the CDC and DFU class bootloaders +  *   - Added INVERTED_ISP_MISO compile time option to the AVRISP-MKII clone project (thanks to Chuck Rohs) +  *   - Added new Android Accessory Host demo (thanks to Opendous Inc.) +  * +  *  <b>Changed:</b> +  *  - Core: +  *   - When automatic PLL management mode is enabled on the U4 series AVR8 chips, the PLL is now configured for 48MHz and not +  *     a divided 96MHz, to lower power consumption and to keep the system within the datasheet specs for 3.3V operation (thanks to Scott Vitale) +  *   - Added Class, ClassDevice, ClassHost and ClassCommon to the internal class driver source filenames to prevent ambiguities +  *   - Altered the Mass Storage Host class driver so that SCSI data STALLs from the attached device can be recovered from automatically without +  *     having to reset the Mass Storage interface +  *   - USB_CONFIG_ATTR_BUSPOWERED constant renamed to USB_CONFIG_ATTR_RESERVED, as this was misnamed (thanks to NXP Semiconductors) +  *   - Reordered board name definition indexes so that a misspelled BOARD compile option will default to BOARD_USER rather than BOARD_USBKEY +  *   - Altered the HID class driver to only try to construct at maximum one packet per USB frame, to reduce CPU usage +  *   - All USB Class Driver configuration struct values are now non-const, to allow for run-time modifications if required before configuring an instance +  *  - Library Applications: +  *   - Altered the Mass Storage Host LowLevel demo so that SCSI data STALLs from the attached device can be recovered from automatically without +  *     having to reset the Mass Storage interface +  *   - Updated the AVRISP-MKII Clone programmer project to be compatible with the latest version of AVR Studio (version 5.1) +  *   - Changed the AVRISP-MKII Clone programmer project to report a fixed 3.3V VTARGET voltage on USB AVRs lacking an ADC instead of 5V to prevent +  *     warnings in AVR Studio 5.1 when programming XMEGA devices +  *   - Allow serial strings to be generated on the older AVR8 devices which do not explicitly state they contain unique values in the datasheet, +  *     as this appears to be implemented in hardware +  * +  *  <b>Fixed:</b> +  *  - Core: +  *   - Fixed ring buffer size limited to 255 elements, instead of the intended 65535 elements. +  *   - Fixed CDC class drivers not saving and sending all 16-bits of the control line states (thanks to Matthew Swabey) +  *   - Fixed race conditions in the CDC, HID and Mass Storage class drivers when processing some control requests +  *   - Fixed misspelled HID_KEYBOARD_MODIFIER_* macros in the HID class driver (thanks to Laszlo Monda) +  *   - Fixed broken AVR32 endpoint/pipe communications when ORDERED_EP_CONFIG compile time option is not enabled (thanks to Matthias Jahr) +  *   - Fixed broken compilation for the AVR32 devices if the NO_SOF_EVENTS compile time option was not enabled (thanks to Matthias Jahr) +  *   - Fixed compiler warning on GCC with \c -wundef compile flag is used (thanks to Georg Glock) +  *   - Fixed incorrect implementation of LEDs_ToggleLEDs() for the Adafruit-U4 board (thanks to Caroline Saliman) +  *   - Fixed broken compilation of LUFA under C++ compilers when the Serial peripheral module header file is included in a C++ source file +  *   - Fixed missing semicolon in the UC3 architecture host pipe functions +  *   - Fixed failed compilation for the XMEGA architecture if USB_DEVICE_ONLY us not specified +  *   - Fixed UC3 architecture ignoring the pipe size when Pipe_ConfigurePipe() is called +  *  - Library Applications: +  *   - Added reliability patches to the AVRISP-MKII Clone project's PDI/TPI protocols (thanks to Justin Mattair) +  *   - Fixed AVRISP-MKII Clone compile warning on AVR8 U4 targets even when NO_VTARGET_DETECT is enabled +  *   - Fixed AVRISP-MKII Clone failing to start application firmware once a TPI programming session is exited +  *   - Fixed DFU class bootloader not resetting the LED pins as high impedance inputs when a software jump to the user applications is requested +  *   - Fixed AVRISP-MKII Clone timing out on long programming commands such as programming the EEPROM on an ATMEGA8 (thanks to Martin Kelling) +  *   - Fixed invalid PID value used in the TempDataLogger project host application (thanks to Anupam Pathak) +  * +  *  \section Sec_ChangeLog111009 Version 111009 +  *  <b>New:</b> +  *  - Core: +  *   - Added USE_LUFA_CONFIG_HEADER compile time option to include a LUFAConfig.h header in the user director for LUFA configuration +  *     tokens as an alternative to tokens defined in the project makefile +  *   - Added new USB_Host_SetInterfaceAltSetting() convenience function for the selection of an interface's alternative setting +  *   - Added Audio class control request definitions +  *   - Added new CALLBACK_Audio_Device_GetSetEndpointProperty() callback to the Audio Device Class driver to allow for endpoint control manipulations +  *     such as data sample rates +  *   - Added support for the Audio class GET STATUS request in the Audio Device Class driver so that it is correctly ACKed when sent by the host +  *   - Added new EVENT_Audio_Device_StreamStartStop() event to the Audio Device Class driver to detect stream start/stop events +  *   - Added board driver support for the Busware TUL board +  *   - Added board hardware driver support for the EVK1100 board +  *   - Added board hardware driver support for the EVK1104 board +  *   - Added new Host mode Audio Class driver +  *   - Added new SPI_GetCurrentMode() function to the SPI peripheral driver +  *   - Added RingBuffer_GetFreeCount() function to the Ring Buffer driver +  *   - Added new HID_Host_SetIdlePeriod() function to the HID Host Class driver +  *   - Added new USB_Host_ConfigurationNumber global variable to indicate the selected configuration in an attached device +  *   - Added new USB_Host_GetDeviceStatus() function to the host standard request function set +  *   - Added AVR USB XMEGA architecture port (currently incomplete/experimental) +  *   - Added new STRINGIFY() and STRINGIFY_EXPANDED() convenience macros +  *   - Added new JTAG_DISABLE() macro for the AVR8 architecture +  *   - Added Device Qualifier standard descriptor structure definitions USB_StdDescriptor_DeviceQualifier_t and USB_Descriptor_DeviceQualifier_t +  *  - Library Applications: +  *   - Added RNDIS device mode to the Webserver project +  *   - Added new incomplete AndroidAccessoryHost Host LowLevel demo +  *   - Added new HIDReportViewer project +  *   - Added new MediaControl project +  *   - Added new AudioInputHost Host ClassDriver demo +  *   - Added new AudioOutputHost Host ClassDriver demo +  *   - Added new AudioInputHost Host LowLevel demo +  *   - Added new AudioOutputHost Host LowLevel demo +  *   - Added new "checksource" target to all library project makefiles +  *   - Added new VTARGET_USE_INTERNAL_REF configuration option to the AVRISP-MKII clone project (thanks to Volker Bosch) +  * +  *  <b>Changed:</b> +  *  - Core: +  *   - Altered the definition of the USB_Audio_Descriptor_Format_t descriptor so that the user is now responsible for supplying +  *     the supported audio sampling rates, to allow for multiple audio interfaces with different numbers of supported rates and/or +  *     continuous sample rates +  *   - Pipe_BoundEndpointNumber() has been renamed to Pipe_GetBoundEndpointAddress(), and now returns the correct endpoint direction +  *     as part of the endpoint address +  *   - Renamed global state variables that are specific to a certain USB mode to clearly indicate which mode the variable relates to, +  *     by changing the USB_* prefix to USB_Device_* or USB_Host_* +  *   - Removed the HOST_STATE_WaitForDeviceRemoval and HOST_STATE_Suspended host state machine states, as these are no longer required +  *   - Altered the USB_Host_SetDeviceConfiguration() function to update the global Host state machine state and the new +  *     USB_Host_ConfigurationNumber global as required +  *   - Added endian correcting code to the library USB class drivers for multiple architecture support +  *   - Removed the ENDPOINT_DESCRIPTOR_DIR_* macros, replaced by ENDPOINT_DIR_* instead +  *   - Renamed the JTAG_DEBUG_ASSERT() macro to JTAG_ASSERT() +  *   - Added variable number of axis to HID_DESCRIPTOR_JOYSTICK() for multi-axis joysticks above just X and Y +  *   - Renamed USB_Host_ClearPipeStall() to USB_Host_ClearEndpointStall() as the function works on an endpoint address within the attached device, +  *     and not a Pipe within the host +  *   - The MS_Host_ResetMSInterface() now performs a full Mass Storage reset sequence to prevent data corruption in the event of a device +  *     lock up or timeout (thanks to David Lyons) +  *   - Added endian-correction to the CDC driver's Line Encoding control request handlers. +  *  - Library Applications: +  *   - Modified the Low Level and Class Driver AudioInput and AudioOutput demos to support multiple audio sample rates +  *   - Updated all host mode demos and projects to use the EVENT_USB_Host_DeviceEnumerationComplete() event callback for device configuration +  *     instead of manual host state machine manipulations in the main application task +  *   - Changed the reports in the GenericHID device demos to control the board LEDs, to reduce user confusion over the callback routines +  *   - Added reliability patches to the AVRISP-MKII Clone project's ISP and PDI/TPI protocols (thanks to Justin Mattair) +  * +  *  <b>Fixed:</b> +  *  - Core: +  *   - Large number of documentation and code comment corrections (thanks to Andrey from Microsin.ru) +  *   - Fixed possibility of the AVR's SPI interface being pulled out of master mode if the /SS pin is a input and pulled low (thanks +  *     to Andrey from Microsin.ru) +  *   - Fixed compile error when FIXED_CONTROL_ENDPOINT_SIZE compile time option was disabled, and a USE_*_DESCRIPTORS compile time +  *     option was not enabled on the AVR8s +  *   - Fixed lack of C++ compatibility in some internal header files causing compile errors when using LUFA in C++ projects +  *   - Fixed error in the pipe unordered allocation algorithm for the AVR8 devices breaking compatibility with some devices +  *   - Fixed USB_USBTask not being called internally in stream transfers between packets when Partial Stream Transfers are used +  *   - Fixed swapped TWI_ADDRESS_READ and TWI_ADDRESS_WRITE values +  *   - Fixed TWI_ReadPacket() not releasing the TWI bus on read completion +  *   - Fixed optimization error in the HID Parser item value USB_SetHIDReportItemInfo() and USB_GetHIDReportItemInfo() routines if the report item was +  *     \c NULL (which should be allowable according to the API) +  *   - Fixed HID Parser CALLBACK_HIDParser_FilterHIDReportItem() callback function not being passed a cacheable report item pointer +  *   - Fixed HID Parser's largest report size bit count not including the size of the last parsed report item +  *   - Fixed HID host driver's largest HID report size count corrupt when the number of report bits exceeds 255 +  *  - Library Applications: +  *   - Fixed incorrect signature in the CDC and DFU class bootloaders for the ATMEGA8U2 +  *   - Fixed KeyboardHost and KeyboardHostWithParser demos displaying incorrect values when numerical keys were pressed +  *   - Fixed compile errors in the incomplete BluetoothHost demo application (thanks to Timo Lindfors) +  *   - Fixed incorrect Dataflash buffer use in the DataflashManager_WriteBlocks_RAM() function of several demos/projects (thanks to Jeremy Willden) +  *   - Fixed incorrect logging interval (always 500ms longer than requested) in the TempDataLogger project +  *   - Fixed incorrect buffer size check in the USBtoSerial project (thanks to Yuri A Nikiforov) +  *   - Fixed port state table corruption in the TCP layer of the RNDIS Ethernet device demos +  * +  *  \section Sec_ChangeLog110528 Version 110528 +  *  <b>New:</b> +  *  - Core: +  *   - Added new ORDERED_EP_CONFIG compile time option to restrict endpoint/pipe configuration to ascending order +  *     in exchange for a smaller compiled program binary size +  *   - Added a new general RingBuff.h miscellaneous ring buffer library driver header +  *   - Added new GCC_FORCE_POINTER_ACCESS() macro to correct GCC's mishandling of struct pointer accesses +  *   - Added new GCC_MEMORY_BARRIER() macro to prevent instruction reordering across boundaries +  *   - Added basic driver example use code to the library documentation +  *   - Added new Endpoint_Null_Stream() and Pipe_Null_Stream() functions +  *   - Added new ADC_GET_CHANNEL_MASK() convenience macro +  *   - Added new HID report item macros (with HID_RI_ prefix) to allow for easy creation and editing of HID report descriptors +  *   - Added new HID_DESCRIPTOR_MOUSE(), HID_DESCRIPTOR_KEYBOARD(), HID_DESCRIPTOR_JOYSTICK() and HID_DESCRIPTOR_VENDOR() macros +  *     for easy automatic creation of basic USB HID device reports +  *   - Added new MAX() and MIN() convenience macros +  *   - Added new Serial_SendData() function to the Serial driver +  *   - Added board driver support for the Sparkfun ATMEGA8U2 breakout board +  *   - Added TWI baud rate prescaler and bit length parameters to the TWI_Init() function (thanks to Thomas Herlinghaus) +  *   - Internal restructuring for eventual multiple architecture ports +  *   - Added AVR32 UC3 architecture port (currently incomplete/experimental) +  *   - Added new architecture independent functions to enable, disable, save and restore the Global Interrupt Enable flags +  *   - Added new RNDIS Device Class Driver packet send and receive functions +  *  - Library Applications: +  *   - Added ability to write protect Mass Storage disk write operations from the host OS +  *   - Added new MIDIToneGenerator project +  *   - Added new KeyboardMouseMultiReport Device ClassDriver demo +  *   - Added new VirtualSerialMassStorage Device ClassDriver demo +  *   - Added HID class bootloader, compatible with a modified version of the command line Teensy loader from PJRC.com +  *   - Added LED flashing to the CDC and DFU class bootloaders to indicate when they are running +  * +  *  <b>Changed:</b> +  *  - Core: +  *   - Unordered Endpoint/Pipe configuration is now allowed once again by default via the previous reconfig workaround +  *   - Refactored Host mode Class Driver *_Host_ConfigurePipes() routines to be more space efficient when compiled +  *   - Added new *_ENUMERROR_PipeConfigurationFailed error codes for the *_Host_ConfigurePipes() routines +  *   - The USARTStream global is now public and documented in the SerialStream module, allowing for the serial USART +  *     stream to be accessed via its handle rather than via the implicit stdout and stdin streams +  *   - The FAST_STREAM_TRANSFERS compile time option has been removed due to lack of use and low cost/benefit ratio +  *   - Altered all endpoint/pipe stream transfers so that the new BytesProcessed parameter now points to a location +  *     where the number of bytes in the transfer that have been completed can be stored (or NULL if entire transaction +  *     should be performed in one chunk) +  *   - The NO_STREAM_CALLBACKS compile time option has now been removed due to the new partial stream transfer feature +  *   - Changed over all project and demo HID report descriptors to use the new HID report item macros +  *   - Moved the HIDParser.c source file to the LUFA/Drivers/USB/Class/Common/ directory from the LUFA/Drivers/USB/Class/Host/ +  *   - Added support to the HID parser for extended USAGE items that contain the usage page as well as the usage index +  *   - Removed the SerialStream driver, rolled functionality into the regular Serial peripheral driver via the new +  *     Serial_CreateStream() and Serial_CreateBlockingStream() functions +  *   - Renamed the low level Serial byte send/receive functions, to be consistent with the CDC class driver byte functions +  *   - Altered the behaviour of the serial byte reception function so that is is non-blocking, and now returns a negative +  *     value if no character is received (to remain consistent with the CDC class driver byte reception routines) +  *   - Renamed the PRNT_Host_SendString(), CDC_Host_SendString() and CDC_Device_SendString() functions to *_SendData(), and +  *     added new versions of the *_SendString() routines that expect a null terminated string instead +  *   - Renamed all driver termination *_ShutDown() functions to the more logical name *_Disable() +  *   - Reduced latency for executing the Start-Of-Frame events (if enabled in the user application) +  *   - Removed Pipe_ClearErrorFlags(), pipe error flags are now automatically cleared when Pipe_ClearError() is called +  *   - Endpoint_ResetFIFO() renamed to Endpoint_ResetEndpoint(), to be consistent with the Pipe_ResetPipe() function name +  *   - Implemented on-demand PLL clock generation for the U4, U6 and U7 series USB AVRs when automatic PLL mode is specified +  *   - F_CLOCK changed to F_USB to be more descriptive, and applicable on future architecture ports +  *   - Renamed all low level Endpoint_Read_*, Endpoint_Write_* and Endpoint_Discard_* functions to use the number of bits instead of +  *     a symbolic size (Byte, Word, DWord) so that the function names are applicable and correct across all architectures +  *   - Renamed all low level Pipe_Read_*, Pipe_Write_* and Pipe_Discard_* functions to use the number of bits instead of +  *     a symbolic size (Byte, Word, DWord) so that the function names are applicable and correct across all architectures +  *   - Separated out board drivers by architecture in the library internals for better organisation +  *  - Library Applications: +  *   - Changed the XPLAINBridge software UART to use the regular timer CTC mode instead of the alternative CTC mode +  *     via the Input Capture register, to reduce user confusion +  *   - Combined page and word ISP programming mode code in the AVRISP-MKII clone project to reduce compiled size and +  *     increase maintainability of the code +  *   - Changed over library projects to use the new general ring buffer library driver module +  *   - Added new high level TWI packet read/write commands, altered behaviour of the TWI_StartTransmission() function +  *   - Changed TempDataLogger project's DS1307 driver to simplify the function interface and prevent a possible race condition +  *   - Changed AVRISP-MKII project to use the Watchdog interrupt for command timeouts, to reduce CPU usage and free timer 0 +  *     for other uses +  *   - Updated the software USART code in the XPLAIN Bridge application so that the incoming bits are sampled at their mid-point +  *     instead of starting point, to give maximum reliability (thanks to Anton Staaf) +  * +  *  <b>Fixed:</b> +  *  - Core: +  *   - Fixed broken USBFOO board drivers due to missing BOARD_USBFOO define +  *   - Fixed HID host class driver incorrectly binding to HID devices that do not have an OUT endpoint +  *   - Fixed incorrect definition of the HID_KEYBOARD_SC_D constant in the HID class driver (thanks to Opendous Inc.) +  *   - Fixed incorrect definition of the HID_KEYBOARD_SC_RIGHT_ARROW constant in the HID class driver (thanks to Joby Taffey) +  *   - Fixed incorrect endpoint initialisation order in the several device demos (thanks to Rick Drolet) +  *   - Fixed inverted Minimus board LEDs +  *   - Fixed incorrect byte ordering in the Audio_Device_WriteSample24 function (thanks to WZab) +  *   - Fixed several functions in the Host mode Still Image Class driver returning an error code from the incorrect +  *     error code enum (thanks to Daniel Seibert) +  *   - Fixed ReportID not being removed from the feature/out report data array in the HID class driver when Report IDs are used +  *   - Fixed incorrect BUTTONS_BUTTON1 definition for the Minimus board +  *   - Fixed Still Image Host class driver exiting the descriptor search routine prematurely if the data pipes (but not event pipe) +  *     is found +  *   - Fixed missing call to Pipe_SetInfiniteINRequests() in the Pipe_ConfigurePipe() routine +  *   - Fixed Remote Wakeup broken on the AVRs due to the mechanism only operating when the SUSPI bit is set (thanks to Holger Steinhaus) +  *   - Fixed possible invalid program execution when in host mode if corrupt descriptor lengths are supplied by the attached device +  *  - Library Applications: +  *   - Fixed Benito project discarding incoming data from the USB virtual serial port when the USART is busy +  *   - Fixed broken DFU bootloader, added XPLAIN support for bootloader start when XCK jumpered to ground +  *   - Fixed broken HID_REQ_GetReport request handler in the Low Level GenericHID demo +  *   - Fixed possible lost data in the XPLAINBridge, USBtoSerial and Benito projects when the host exceeds the packet +  *     timeout period on received packets as set by USB_STREAM_TIMEOUT_MS (thanks to Justin Rajewski) +  *   - Fixed possible programming problem in the AVRISP-MKII clone project when programming specific patterns into a target +  *     memory space that is only byte (not page) addressable +  *   - Fixed errors in the incomplete Test and Measurement device demo preventing proper operation (thanks to Pavel Plotnikov) +  *   - Fixed programming errors in the AVRISP-MKII project when the programming packet is a round multiple of the endpoint bank +  *     size under avrdude (thanks to Steffan Woltjer) +  * +  * +  *  \section Sec_ChangeLog101122 Version 101122 +  *  <b>New:</b> +  *  - Core: +  *    - Added new SCSI_ASENSE_NOT_READY_TO_READY_CHANGE constant to the Mass Storage class driver, to indicate when a previously +  *      not ready removable medium has now become ready for the host's use (thanks to Martin Degelsegger) +  *    - Moved the Pipe and Endpoint stream related code to two new USB library core source files EndpointStream.c and PipeStream.c +  *    - Added new USB_Device_GetFrameNumber() and USB_Host_GetFrameNumber() functions to retrieve the current USB frame number +  *    - Added new USB_Host_EnableSOFEvents(), USB_Host_DisableSOFEvents() and EVENT_USB_Host_StartOfFrame() for the user application +  *      handling of USB Start of Frame events while in USB Host mode +  *    - Added new PRNT_Host_BytesReceived(), PRNT_Host_ReceiveByte(), PRNT_Host_SendByte() and PRNT_Host_Flush() functions to the +  *      Print Host Class driver +  *    - Added class specific descriptor alternative struct type defines with standard USB-IF element naming +  *    - Added new project makefile template to the library and moved board driver stub files into in a new "CodeTemplates" directory +  *    - Added board hardware driver support for the Adafruit U4 breakout board +  *    - Added board hardware driver support for the Arduino Uno development board +  *    - Added board hardware driver support for the Blackcat USB JTAG board (thanks to the PSGroove team) +  *    - Added board hardware driver support for the Busware BUI development board +  *    - Added board hardware driver support for the Busware CUL V3 868MHZ radio board (thanks to Dirk Tostmann) +  *    - Added board hardware driver support for the Kernel Concepts USBFOO development board +  *    - Added board hardware driver support for the Linnix UDIP development board +  *    - Added board hardware driver support for the Olimex AVR-USB-162 development board (thanks to Steve Fawcett) +  *    - Added board hardware driver support for the Maximus board (thanks to the PSGroove team) +  *    - Added board hardware driver support for the Microsin AVR-USB162 breakout board +  *    - Added board hardware driver support for the Minimus board (thanks to the PSGroove team) +  *    - Added new NO_CLASS_DRIVER_AUTOFLUSH compile time option to disable automatic flushing of interfaces when the USB management +  *      tasks for each driver is called +  *    - Added standard keyboard HID report scan-code defines (thanks to Laszlo Monda) +  *    - Added new Pipe_GetBusyBanks(), Endpoint_GetBusyBanks() and Endpoint_AbortPendingIN() functions +  *  - Library Applications: +  *    - Added default test tone generation mode to the Device mode AudioInput demos +  *    - Added new NO_BLOCK_SUPPORT, NO_EEPROM_BYTE_SUPPORT, NO_FLASH_BYTE_SUPPORT and NO_LOCK_BYTE_WRITE_SUPPORT compile time options to the +  *      CDC class bootloader +  *    - Added new XCK_RESCUE_CLOCK_ENABLE compile time option to the AVRISP-MKII clone programmer project (thanks to Tom Light) +  * +  *  <b>Changed:</b> +  *  - Core: +  *    - Removed complicated logic for the Endpoint_ConfigureEndpoint() function to use inlined or function called versions +  *      depending of if the given bank size is a compile time constant, as the compiler does a better job of optimizing +  *      with basic code +  *    - Changed the signature of the CALLBACK_USB_GetDescriptor() callback function so that the descriptor pointer is const, to remove +  *      the need for extra casting inside the callback (thanks to Jonathan Kollasch) +  *    - Reduced HOST_DEVICE_SETTLE_DELAY_MS to 1000ms down from 1500ms to improve device compatibility while in USB Host mode +  *    - Removed the EVENT_USB_InitFailure() event, not specifying a USB mode correctly now defaults to UID selection mode +  *    - Renamed and moved class driver common constant definitions to make the naming scheme more uniform +  *    - Moved the USB mode specifier constants into a new enum, so that they are semantically related to one another +  *    - Renamed ENDPOINT_DOUBLEBANK_SUPPORTED() to ENDPOINT_BANKS_SUPPORTED() and changed it to return the maximum number of supported banks for +  *      the given endpoint +  *    - Better algorithm to extract and convert the internal device serial number into a string descriptor (if present) +  *    - All USB class drivers are now automatically included when LUFA/Drivers/USB.h is included, and no longer need to be separately included +  *    - The MIDI class drivers now automatically flushes the MIDI interface when the MIDI class driver's USBTask() function is called +  *    - Renamed the EVENT_USB_Device_UnhandledControlRequest() event to EVENT_USB_Device_ControlRequest() as it is now fired before the library +  *      request handlers, not afterwards +  *  - Library Applications: +  *    - Changed over all device demos to use a clearer algorithm for the configuring of the application's endpoints +  *    - Added missing DataflashManager_CheckDataflashOperation() function to the MassStorageKeyboard demo, removed redundant +  *      SCSI_Codes.h file as these values are part of the MassStorage Class Driver +  *    - Added compile time error to the AVRISP-MKII project when built for the U4 chips, as the default VTARGET detection ADC channel +  *      does not exist on these chips (thanks to Marco) +  *    - Changed all Device mode LowLevel demos and Device Class drivers so that the control request is acknowledged and any data +  *      transferred as quickly as possible without any processing in between sections, so that long callbacks or event handlers will +  *      not break communications with the host by exceeding the maximum control request stage timeout period +  *    - Changed over all demos, drivers and internal functions to use the current frame number over the Start of Frame flag where possible +  *      to free up the Start of Frame flag for interrupt use in the user application +  *    - All project makefiles now correctly clean intermediate build files from assembly and C++ sources (thanks to Daniel Czigany) +  *    - Changed default value for the reset polarity parameter in the AVRISP-MKII project so that it defaults to active low drive +  *    - Changed configuration descriptor parser for all host mode projects and class drivers to ensure better compatibility with devices +  *    - All LowLevel demos changed to use the constants and types defined in the USB class drivers +  *    - Changed AudioInput and AudioOutput demos to reload the next sample via an interrupt rather than polling the sample timer +  *    - Rescue clock of the AVRISP-MKII moved to the AVR's OCR1A pin, so that the clock can be generated at all times +  *    - Changed ClassDriver MIDI demos to process all incoming events in a loop until the bank becomes empty rather than one at a time +  *    - Changed LowLevel MIDI demos to only clear the incoming event bank once it has become empty to support packed event packets +  * +  *  <b>Fixed:</b> +  *  - Core: +  *    - Fixed USB_GetHIDReportItemInfo() function modifying the given report item's data when the report item does not exist +  *      within the supplied report of a multiple report HID device +  *    - Fixed critical pipe/endpoint memory allocation issue where the bank memory address space could be silently overlapped +  *      in the USB controller if the endpoints or pipes were allocated in anything other than ascending order (thanks to Martin Degelsegger) +  *    - Added LEDs_ToggleLEDs() function to several board LED drivers which were missing it (thanks to Andrei Krainev) +  *    - Fixed SET FEATURE and CLEAR FEATURE control requests directed at an unconfigured endpoint causing request timeouts +  *    - Fixed USB_Host_ClearPipeStall() incorrectly determining the endpoint direction from the currently selected pipe +  *    - Fixed JTAG_DEBUG_POINT() and JTAG_DEBUG_BREAK() macros not compiling under pure C99 standards mode +  *    - Fixed endpoint selection within the CALLBACK_HID_Device_CreateHIDReport() callback function causing broken GET REPORT requests +  *    - Fixed incorrect command name for EEPROM memory programming in the makefile dfu-ee target +  *    - Fixed incorrect LEDs_ChangeLEDs() function in the Benito board LED driver +  *    - Fixed incorrect USB_DeviceState value when unconfiguring the device without an address set +  *    - Fixed SPI driver not explicitly setting /SS and MISO pins as inputs when SPI_Init() is called +  *    - Fixed random enumeration failure while in device mode due to interrupts causing the Set Address request to exceed maximum timings +  *    - Fixed MIDI_Host_Flush() not aborting early when the specified MIDI host interface was not configured +  *    - Fixed MIDI class driver send routines silently discarding packets if the endpoint or pipe is busy (thanks to Robin Green) +  *  - Library Applications: +  *    - Fixed MassStorage based demos and projects resetting the SCSI sense values before the command is executed, leading to +  *      missed SCSI sense values when the host retrieves the sense key (thanks to Martin Degelsegger) +  *    - Fixed USBtoSerial and Benito project SetLineEncoding calls failing if the USART is busy, due to the RX ISR delaying the control +  *      request handler +  *    - Fixed LowLevel PrinterHost demo not sending control requests to the attached printer with the correct printer interface wIndex value +  *    - Fixed incorrect signature reported in the CDC class bootloader for the ATMEGA32U2 +  *    - Fixed BootloaderCDC project failing on some operating systems due to removed Line Encoding options (thanks to Alexey Belyaev) +  *    - Fixed broken FLASH/EEPROM programming in the AVRISP-MKII clone project when writing in non-paged mode and the polling byte cannot be used +  *    - Fixed ISR definition conflict in the XPLAIN bridge between the software UART and the AVRISP-MKII ISP modules +  *    - Fixed USBtoSerial and XPLAINBridge demos discarding data from the PC if the send buffer becomes full +  *    - Fixed broken input in the MagStripe reader project due to an incorrect HID report descriptor +  *    - Fixed incorrect PollingIntervalMS values in the demo/project/bootloader endpoint descriptors (thanks to MCS Electronics) +  *    - Fixed AVRISP-MKII clone project not starting the target's program automatically after exiting TPI programming mode +  * +  * +  *  \section Sec_ChangeLog100807 Version 100807 +  *  <b>New:</b> +  *  - Added new ADC_DisableChannel() function (thanks to Mich Davis) +  *  - Added new VTARGET_REF_VOLTS and VTARGET_SCALE_FACTOR compile time defines to the AVRISP-MKII programmer project to set +  *    the VTARGET reference voltage and scale factor +  *  - Added new pgm_read_ptr() macro to Common.h for reading of pointers out of flash memory space +  *  - Added new SWAPENDIAN_16() and SWAPENDIAN_32() macros to Common.h for statically initialized variables at compile time +  *  - Added new Drivers/USB/LowLevel/Device.c file to house Device mode specific functions that are more complicated than simple macros +  *  - Added new AVRStudio 4 project files for all library demos, projects and bootloaders +  *  - Added ability to set the serial baud rate via the user's terminal in the XPLAINBridge project +  *  - Added new LUFA module variables for the different source modules in the core library makefile to simplify project makefiles +  *  - Added start of a new Test and Measurement class demo (thanks to Peter Lawrence) +  *  - Added new SPI_ORDER_* data order masks to the SPI peripheral driver +  *  - Added support to the AVRISP-MKII project for ISP speeds slower than 125KHz via a new software SPI driver +  *  - Added support for the new button/LED on the latest model USBTINY-MKII +  * +  *  <b>Changed:</b> +  *  - The RingBuff library code has been replaced in the XPLAINBridge, Benito and USBtoSerial projects with an ultra lightweight +  *    ring buffer to help improve the reliability of the projects +  *  - The EEPROM stream read/write functions now use eeprom_update_byte() instead of eeprom_write_byte(), so that only +  *    changed bytes are written to EEPROM to preserve its lifespan +  *  - Changed over the AVRISP-MKII and TemperatureDataLogger projects to use eeprom_update_byte() when writing non-volatile +  *    parameters to EEPROM to preserve its lifespan +  *  - Removed unused line encoding data and control requests from the CDC Bootloader code, to save space +  *  - Renamed SERIAL_STREAM_ASSERT() macro to STDOUT_ASSERT() +  *  - The USB_Device_IsRemoteWakeupSent() and USB_Device_IsUSBSuspended() macros have been deleted, as they are now obsolete +  *  - Rewrote the implementation of the SwapEndian_16() and SwapEndian_32() functions so that they compile down in most instances to +  *    minimal loads and stores rather than complicated shifts +  *  - The software UART in the XPLAINBridge has been largely altered to try to improve upon its performance and reliability +  *  - The USBtoSerial and Benito projects now flushes received data via a flush timer, so that several bytes can be transmitted at once +  *  - Removed the automated checking of event names in the demo, project and bootloader makefiles due to inconsistencies between the +  *    behaviour of the command line tools used to perform the check on each platform +  *  - Internal USB driver source files renamed and moved to ease future possible architecture ports +  *  - All internal pseudo-function macros have been converted to true inline functions for type-safety and readability +  *  - Changed LED indicator masks for the AVRISP-MKII project, so that there are defined roles for each LED +  *  - Altered the CDC Device and Host Class drivers' receive byte routines, so that no data is indicated by the function returning a +  *    negative value (thanks to Andreas Paulin) +  *  - Added auto flushing of OUT data to the CDC Host Class driver's USBTask function to automatically flush the send pipe buffer +  * +  *  <b>Fixed:</b> +  *  - Fixed AVRISP project sending a LOAD EXTENDED ADDRESS command to 128KB AVRs after programming or reading from +  *    the last page of FLASH (thanks to Gerard Sexton) +  *  - Fixed AVRISP project not sending a full erase-and-write EEPROM command to XMEGA targets when writing to the EEPROM +  *    instead of the split write-only command (thanks to Tim Margush) +  *  - Fixed RNDISEthernet demos crashing when calculating checksums for Ethernet/TCP packets of more than ~500 bytes due to +  *    an overflow in the checksum calculation loop (thanks to Kevin Malec) +  *  - Fixed XPLAINBridge project not correctly reading the XMEGA's supply voltage when reporting back to the host +  *  - Fixed incorrect signature for the ATMEGA32U2 in the DFU bootloader (thanks to Axel Rohde) +  *  - Fixed internal device serial not being accessible on the ATMEGAXXU2 AVRs (thanks to Axel Rohde) +  *  - Fixed void pointer arithmetic in ConfigDescriptor.h breaking C++ compatibility (thanks to Michael Hennebry) +  *  - Fixed broken PDI EEPROM Section Erase functionality in the AVRISP-MKII project +  *  - Fixed USB_Device_SendRemoteWakeup() not working when the USB clock was frozen during USB bus suspend (thanks to Brian Dickman) +  *  - Fixed occasional lockup of the AVRISP project due to the timeout extension code incorrectly extending the timeout in +  *    PDI and TPI programming modes infinitely +  *  - Fixed HID device class driver still using PrevReportINBuffer for GetReport control requests even when it has been +  *    set to NULL by the user application (thanks to Axel Rohde) +  *  - Fixed MIDI_Device_SendEventPacket() not correctly waiting for the endpoint to become ready (thanks to Robin Green) +  *  - Fixed Benito and USBtoSerial projects not turning off the USART before reconfiguring it, which could cause incorrect +  *    operation to occur (thanks to Bob Paddock) +  *  - Fixed Serial peripheral driver not turning off the USART before reconfiguring it, which would cause incorrect operation +  *    to occur (thanks to Bob Paddock) +  *  - Fixed software application start command broken in the DFU class bootloader when dfu-programmer is used due to application +  *    start address corruption +  * +  * +  *  \section Sec_ChangeLog100513 Version 100513 +  *  <b>New:</b> +  *  - Added incomplete MIDIToneGenerator project +  *  - Added new Relay Controller Board project (thanks to OBinou) +  *  - Added board hardware driver support for the Teensy, USBTINY MKII, Benito and JM-DB-U2 lines of third party USB AVR boards +  *  - Added new ATTR_NO_INIT variable attribute for global variables that should not be automatically cleared on startup +  *  - Added new ENDPOINT_*_BusSuspended error code to the Endpoint function, so that the stream functions early-abort if the bus +  *    is suspended before or during a transfer +  *  - Added new EVENT_CDC_Device_BreakSent() event and CDC_Host_SendBreak() function to the Device and Host CDC Class drivers +  *  - Added ReportType parameter to the HID device class driver CALLBACK_HID_Device_ProcessHIDReport() function so that FEATURE +  *    reports from the host to the device can be correctly processed +  *  - Added ReportType parameter to the HID host class driver HID_Host_SendReportByID() function so that FEATURE reports can be +  *    issued to the attached device +  * +  *  <b>Changed:</b> +  *  - AVRISP programmer project now has a more robust timeout system +  *  - Added a timeout value to the TWI_StartTransmission() function, within which the addressed device must respond +  *  - Webserver project now uses the board LEDs to indicate the current IP configuration state +  *  - Added ENABLE_TELNET_SERVER compile time option to the Webserver project to disable the TELNET server if desired +  *  - Increased throughput of the USBtoSerial demo on systems that send multiple bytes per packet (thanks to Opendous Inc.) +  *  - Double bank CDC endpoints in the XPLAIN Bridge project, re-enable JTAG once the mode selection pin has been sampled. +  *  - Standardized the naming scheme given to configuration descriptor sub-elements in the Device mode demos, bootloaders +  *    and projects +  *  - All Class Driver Host mode demos now correctly set the board LEDs to READY once the enumeration process has completed +  *  - Added LIBUSB_FILTERDRV_COMPAT compile time option to the AVRISP programmer project to make the code compatible with Windows +  *    builds of avrdude at the expense of AVRStudio compatibility +  *  - Removed two-step endpoint/pipe bank clear and switch sequence for smaller, faster endpoint/pipe code +  *  - The USB_Init() function no longer calls sei() - the user is now responsible for enabling interrupts when they are ready +  *    for them to be enabled (thanks to Andrei Krainev) +  *  - The Audio_Device_IsSampleReceived() and Audio_Device_IsReadyForNextSample() functions are now inline, to reduce overhead +  *  - Removed the cast to uint16_t on the set baud rate in the USBtoSerial project, so that the higher >1M baud rates can be +  *    selected (thanks to Steffan Woltjer) +  *  - Removed software PDI and TPI emulation from the AVRISP-MKII clone project as it was very buggy and slow - PDI and TPI must +  *    now be implemented via separate programming headers +  *  - The CDC class bootloader now uses a watchdog reset rather than a soft-reset when exited to ensure that all hardware is +  *    properly reset to their defaults +  *  - Device mode class driver callbacks are now fired before the control request status stage is sent to prevent the host from +  *    timing out if another request is immediately fired and the device has a lengthy callback routine +  *  - The TeensyHID bootloader has been removed, per request from Paul at PJRC +  *  - The LIBUSB_FILTERDRV_COMPAT compile time option in the XPLAINBridge and AVRISP-MKII projects has been renamed +  *    LIBUSB_DRIVER_COMPAT, as it applies to all software on all platforms using the libUSB driver +  * +  *  <b>Fixed:</b> +  *  - Fixed possible device lockup when INTERRUPT_CONTROL_ENDPOINT is enabled and the control endpoint is not properly +  *    selected when the ISR completes +  *  - Fixed AVRISP-MKII clone project not correctly issuing LOAD EXTENDED ADDRESS commands when the extended address +  *    boundary is crossed during programming or read back (thanks to Gerard Sexton) +  *  - Fixed warnings when building the AVRISP-MKII clone project with the ENABLE_XPROG_PROTOCOL compile time option disabled +  *  - Fixed software PDI/TPI programming mode in the AVRISP project not correctly toggling just the clock pin +  *  - Fixed TWI_StartTransmission() corrupting the contents of the GPIOR0 register +  *  - Fixed TWI driver not aborting when faced with no response after attempting to address a device on the bus +  *  - Fixed ADC routines not correctly returning the last result when multiple channels were read +  *  - Fixed ADC routines failing to read the extended channels (Channels 8 to 13, Internal Temperature Sensor) on the +  *    U4 series USB AVR parts +  *  - Fixed LowLevel MassStorage demo broken on the U2 series USB AVRs due to unsupported double-banked endpoint modes used +  *  - Fixed compilation error in the AudioInput demos when MICROPHONE_BIASED_TO_HALF_RAIL is defined (thanks to C. Scott Ananian) +  *  - Fixed incorrect definition of HID_ALIGN_DATA() causing incorrect HID report item data alignment +  *  - Fixed Still Image Host class driver not resetting the transaction ID when a new session is opened, fixed driver not sending +  *    a valid session ID to the device +  *  - Removed invalid dfu and flip related targets from the bootloaders - bootloaders can only be replaced with an external programmer +  *  - Fixed Set/Clear Feature requests directed to a non-configured endpoint not returning a stall to the host +  *  - Fixed HID Device Class Driver not allocating a temporary buffer when the host requests a report via the control endpoint and the +  *    user has set the PrevReportINBuffer driver configuration element to NULL (thanks to Lars Noschinski) +  *  - Fixed device state not being reset to DEVICE_STATE_Default if the host sets a 0x00 device address +  *  - Fixed device not stalling configuration requests before the device's address has been set +  *  - Fixed possibility of internal signature retrieval being corrupted if an interrupt occurs during a signature byte +  *    read (thanks to Andrei Krainev) +  *  - Fixed device state not being reset back to the default state if the host sets the address to 0 +  *  - Fixed Set Configuration requests not being stalled until the host has set the device's address +  *  - Fixed Host mode HID class driver not sending the correct report type when HID_Host_SendReportByID() was called and the +  *    HID_HOST_BOOT_PROTOCOL_ONLY compile time option is set +  *  - Fixed INTERRUPT_CONTROL_ENDPOINT compile time option preventing other interrupts from occurring while the control endpoint +  *    request is being processed, causing possible lockups if a USB interrupt occurs during a transfer +  *  - Remove incorrect Abstract Call Management class specific descriptor from the CDC demos, bootloaders and projects +  * +  * +  *  \section Sec_ChangeLog100219 Version 100219 +  * +  *  <b>New:</b> +  *  - Added TPI programming support for 6-pin ATTINY devices to the AVRISP programmer project (thanks to Tom Light) +  *  - Added command timeout counter to the AVRISP project so that the device no longer freezes when incorrectly connected +  *    to a target +  *  - Added new TemperatureDataLogger application, a USB data logger which writes to the device's dataflash and appears to +  *    the host as a standard Mass Storage device when inserted +  *  - Added MIDI event packing support to the MIDI Device and Host mode Class drivers, allowing for multiple MIDI events to +  *    sent or received in packed form in a single USB packet +  *  - Added new MIDI send buffer flush routines to the MIDI Device and Host mode Class drivers, to flush packed events +  *  - Added master mode hardware TWI driver for easy TWI peripheral control +  *  - Added ADC MUX masks for the standard ADC input channels on all AVR models with an ADC, altered demos to use these masks +  *    as on some models, the channel number is not identical to its single-ended ADC MUX mask +  *  - New Webserver project, a RNDIS host USB webserver using the open source uIP TCP/IP network stack and FatFS library +  *  - New BOARD value option BOARD_NONE (equivalent to not specifying BOARD) which will remove all board hardware drivers which +  *    do not adversely affect the code operation (currently only the LEDs driver) +  *  - Added keyboard modifier masks (HID_KEYBOARD_MODIFER_*) and LED report masks (KEYBOARD_LED_*) to the HID class driver and +  *    Keyboard demos +  *  - Added .5MHz recovery clock to the AVRISP programmer project when in ISP programming mode to correct mis-set fuses +  * +  *  <b>Changed:</b> +  *  - Slowed down software USART carried PDI programming in the AVRISP project to prevent transmission errors +  *  - Renamed the AVRISP project folder to AVRISP-MKII to reduce confusion +  *  - Renamed the RESET_LINE_* makefile tokens in the AVRISP MKII Project to AUX_LINE_*, as they are not always used for target +  *    reset +  *  - Changed over the MassStorageKeyboard Class driver device demo to use Start of Frame events rather than a timer to keep track +  *    of elapsed milliseconds +  *  - Inlined currently unused (but standardized) maintenance functions in the Device and Host Class drivers to save space +  *  - The XPLAINBridge project now selects between a USB to Serial bridge and a PDI programmer on startup, reading the JTAG port's +  *    TDI pin to determine which mode to use +  *  - Removed the stream example code from the Low Level VirtualSerial demos, as they were buggy and only served to add clutter +  * +  *  <b>Fixed:</b> +  *  - Fixed AVRISP project not able to enter programming mode when ISP protocol is used +  *  - Fixed AVRISP PDI race condition where the guard time between direction changes could be interpreted as a start bit +  *  - Fixed ADC_IsReadingComplete() returning an inverted result +  *  - Fixed blocking CDC streams not aborting when the host is disconnected +  *  - Fixed XPLAIN board Dataflash driver broken due to incorrect preprocessor commands +  *  - Fixed inverted XPLAIN LED driver output (LED turned on when it was supposed to be turned off, and vice-versa) +  *  - Fixed Class Driver struct interface numbers in the KeyboardMouse and VirtualSerialMouse demos (thanks to Renaud Cerrato) +  *  - Fixed invalid USB controller PLL prescaler values for the ATMEGAxxU2 controllers +  *  - Fixed lack of support for the ATMEGA32U2 in the DFU and CDC class bootloaders +  *  - Fixed Benito project not resetting the target AVR automatically when programming has completed +  *  - Fixed DFU bootloader programming not discarding the correct number of filler bytes from the host when non-aligned programming +  *    ranges are specified (thanks to Thomas Bleeker) +  *  - Fixed CDC and RNDIS host demos and class drivers - bidirectional endpoints should use two separate pipes, not one half-duplex pipe +  *  - Fixed Pipe_IsEndpointBound() not taking the endpoint's direction into account +  *  - Fixed EEPROM and FLASH ISP programming in the AVRISP project +  *  - Fixed incorrect values of USB_CONFIG_ATTR_SELFPOWERED and USB_CONFIG_ATTR_REMOTEWAKEUP tokens (thanks to Claus Christensen) +  *  - Fixed SerialStream driver blocking while waiting for characters to be received instead of returning EOF +  *  - Fixed SerialStream driver not setting stdin to the created serial stream (thanks to Mike Alexander) +  *  - Fixed USB_GetHIDReportSize() returning the number of bits in the specified report instead of bytes +  *  - Fixed AVRISP project not extending the command delay after each successful page/word/byte program +  *  - Fixed accuracy of the SERIAL_UBBRVAL() and SERIAL_2X_UBBRVAL() macros for higher baud rates (thanks to Renaud Cerrato) +  * +  * +  *  \section Sec_ChangeLog091223 Version 091223 +  * +  *  <b>New:</b> +  *  - Added activity LED indicators to the AVRISP project to indicate when the device is busy processing a command +  *  - The USB target family and allowable USB mode tokens are now public and documented (USB_CAN_BE_*, USB_SERIES_*_AVR) +  *  - Added new XPLAIN USB to Serial Bridge project (thanks to John Steggall for initial proof-of-concept, David Prentice +  *    and Peter Danneger for revised software USART code) +  *  - Added new RNDIS Ethernet Host LowLevel demo +  *  - Added new RNDIS Ethernet Host Class Driver +  *  - Added new RNDIS Ethernet Host ClassDriver demo +  *  - Added CDC_Host_Flush() function to the CDC Host Class driver to flush sent data to the attached device +  *  - Added PDI programming support for XMEGA devices to the AVRISP programmer project (thanks to Justin Mattair) +  *  - Added support for the XPLAIN board Dataflash, with new XPLAIN_REV1 board target for the different Dataflash used +  *    on the first revision boards compared to the one mounted on later revisions +  *  - Added new HID_ALIGN_DATA() macro to return the pre-retrieved value of a HID report item, left-aligned to a given datatype +  *  - Added new PreviousValue to the HID Report Parser report item structure, for easy monitoring of previous report item values +  *  - Added new EVK527 board target +  *  - Added new USB_Host_GetDeviceStringDescriptor() convenience function +  *  - Added new LEDNotification project to the library, to give a visual LED notification on new events from the host +  *  - Added new NO_DEVICE_REMOTE_WAKEUP and NO_DEVICE_SELF_POWER compile time options +  * +  *  <b>Changed:</b> +  *  - Removed code in the Keyboard demos to send zeroed reports between two reports with differing numbers of key codes +  *    as this relied on non-standard OS driver behaviour to repeat key groups +  *  - The SCSI_Request_Sense_Response_t and SCSI_Inquiry_Response_t type defines are now part of the Mass Storage Class +  *    driver common defines, rather than being defined in the Host mode Class driver section only +  *  - The USB_MODE_HOST token is now defined even when host mode is not available +  *  - The CALLBACK_HID_Device_CreateHIDReport() HID Device Class driver callback now has a new ReportType parameter to +  *    indicate the report type to generate +  *  - All Class Drivers now return false or the "DeviceDisconnected" error code of their respective error enums when a function +  *    is called when no host/device is connected where possible +  *  - The HOST_SENDCONTROL_DeviceDisconnect enum value has been renamed to HOST_SENDCONTROL_DeviceDisconnected to be in line +  *    with the rest of the library error codes +  *  - Make MIDI device demos also turn off the on board LEDs if MIDI Note On messages are sent with a velocity of zero, +  *    which some devices use instead of Note Off messages (thanks to Robin Green) +  *  - The CDC demos are now named "VirtualSerial" instead to indicate the demos' function rather than its implemented USB class, +  *    to reduce confusion and to be in line with the rest of the LUFA demos +  *  - The SImage_Host_SendBlockHeader() and SImage_Host_ReceiveBlockHeader() Still Image Host Class driver functions are now public +  * +  *  <b>Fixed:</b> +  *  - Added missing CDC_Host_CreateBlockingStream() function code to the CDC Host Class driver +  *  - Fixed incorrect values for REPORT_ITEM_TYPE_* enum values causing corrupt data in the HID Host Parser +  *  - Fixed misnamed SI_Host_USBTask() and SI_Host_ConfigurePipes() functions +  *  - Fixed broken USB_GetNextDescriptor() function causing the descriptor to jump ahead double the expected amount +  *  - Fixed Pipe_IsEndpointBound() not masking the given Endpoint Address against PIPE_EPNUM_MASK +  *  - Fixed host state machine not enabling Auto VBUS mode when HOST_DEVICE_SETTLE_DELAY_MS is set to zero +  *  - Fixed misnamed Pipe_SetPipeToken() macro for setting a pipe's direction +  *  - Fixed CDCHost failing on devices with bidirectional endpoints +  *  - Fixed USB driver failing to define the PLL prescaler mask for the ATMEGA8U2 and ATMEGA16U2 +  *  - Fixed HID Parser not distributing the Usage Min and Usage Max values across an array of report items +  *  - Fixed Mass Storage Host Class driver and Low Level demo not clearing the error condition if an attached device returns a +  *    STALL to a GET MAX LUN request (thanks to Martin Luxen) +  *  - Fixed TeensyHID bootloader not properly shutting down the USB interface to trigger a disconnection on the host before resetting +  *  - Fixed MassStorageHost Class driver demo not having USB_STREAM_TIMEOUT_MS compile time option set properly to prevent slow +  *    devices from timing out the data pipes +  *  - Fixed the definition of the Endpoint_BytesInEndpoint() macro for the U4 series AVR parts +  *  - Fixed MIDI host Class driver MIDI_Host_SendEventPacket() routine not properly checking for Pipe ready before writing +  *  - Fixed use of deprecated struct initializers, removed library unused parameter warnings when compiled with -Wextra enabled +  *  - Fixed Still Image Host Class driver truncating the PIMA response code (thanks to Daniel Seibert) +  *  - Fixed USB_CurrentMode not being reset to USB_MODE_NONE when the USB interface is shut down and both Host and Device modes can be +  *    used (thanks to Daniel Levy) +  *  - Fixed TeensyHID bootloader not enumerating to the host correctly (thanks to Clint Fisher) +  *  - Fixed AVRISP project timeouts not checking for the correct timeout period (thanks to Carl Ott) +  *  - Fixed STK525 Dataflash driver using incorrect bit-shifting for Dataflash addresses (thanks to Tim Mitchell) +  * +  * +  *  \section Sec_ChangeLog091122 Version 091122 +  * +  *  <b>New:</b> +  *  - Added new Dual Role Keyboard/Mouse demo +  *  - Added new HID_HOST_BOOT_PROTOCOL_ONLY compile time token to reduce the size of the HID Host Class driver when +  *    Report protocol is not needed +  *  - Added new MIDI LowLevel and ClassDriver Host demo, add new MIDI Host Class driver +  *  - Added new CDC/Mouse ClassDriver device demo +  *  - Added new Joystick Host ClassDriver and LowLevel demos +  *  - Added new Printer Host mode Class driver +  *  - Added new Printer Host mode ClassDriver demo +  *  - Added optional support for double banked endpoints and pipes in the Device and Host mode Class drivers +  *  - Added new stream creation function to the CDC Class drivers, to easily make standard I/O streams from CDC Class driver instances +  * +  *  <b>Changed:</b> +  *  - Removed mostly useless "TestApp" demo, as it was mainly useful only for checking for syntax errors in the library +  *  - MIDI device demos now receive MIDI events from the host and display note ON messages via the board LEDs +  *  - Cleanups to the Device mode Mass Storage demo application SCSI routines +  *  - Changed Audio Class driver sample read/write functions to be inline, to reduce the number of cycles needed to transfer +  *    samples to and from the device (allowing more time for sample processing and output) +  *  - Audio class Device mode demos now work at both 16MHz and 8MHz, rather than just at 8MHz +  *  - The previous USBtoSerial demo has been moved into the projects directory, as it was just a modified CDC demo +  *  - The Endpoint/Pipe functions now use the const qualifier on the input buffer +  *  - Changed the CALLBACK_HIDParser_FilterHIDReportItem() callback to pass a HID_ReportItem_t rather than just the current +  *    item's attributes, to expose more information on the item (including it's type, collection path, etc.) +  *  - Changed MouseHostWithParser demos to check that the report items have a Mouse usage collection as a parent at some point, +  *    to prevent Joysticks from enumerating with the demo +  *  - Corrected the name of the misnamed USB_GetDeviceConfigDescriptor() function to USB_Host_GetDeviceConfigDescriptor(). +  *  - Keyboard LowLevel/ClassDriver demos now support multiple simultaneous key presses (up to 6) per report +  * +  *  <b>Fixed:</b> +  *  - Fixed PrinterHost demo returning invalid Device ID data when the attached device does not have a +  *    device ID (thanks to Andrei Krainev) +  *  - Changed LUFA_VERSION_INTEGER define to use BCD values, to make comparisons easier +  *  - Fixed issue in the HID Host class driver's HID_Host_SendReportByID() routine using the incorrect mode (control/pipe) +  *    to send report to the attached device +  *  - Fixed ClassDriver AudioOutput device demo not selecting an audio output mode +  *  - Fixed incorrect SampleFrequencyType value in the AudioInput and AudioOutput ClassDriver demos' descriptors +  *  - Fixed incorrect event name rule in demo/project/bootloader makefiles +  *  - Fixed HID device class driver not reselecting the correct endpoint once the user callback routines have been called +  *  - Corrected HID descriptor in the Joystick Device demos - buttons should be placed outside the pointer collection +  *  - Fixed HID report parser collection paths invalid due to misplaced semicolon in the free path item search loop +  *  - Fixed HID host Class driver report send/receive report broken when issued through the control pipe +  *  - Fixed HOST_STATE_AS_GPIOR compile time option being ignored when in host mode (thanks to David Lyons) +  *  - Fixed LowLevel Keyboard demo not saving the issues report only after it has been sent to the host +  *  - Fixed Endpoint_Write_Control_Stream_* functions not sending a terminating IN when given data Length is zero +  * +  * +  *  \section Sec_ChangeLog090924 Version 090924 +  * +  *  <b>New:</b> +  *  - Added new host mode class drivers and matching demos to the library for rapid application development +  *  - Added flag to the HID report parser to indicate if a device has multiple reports +  *  - Added new EVENT_USB_Device_StartOfFrame() event, controlled by the new USB_Device_EnableSOFEvents() and +  *    USB_Device_DisableSOFEvents() macros to give bus-synchronized millisecond interrupts when in USB device mode +  *  - Added new Endpoint_SetEndpointDirection() macro for bidirectional endpoints +  *  - Added new AVRISP project, a LUFA powered clone of the Atmel AVRISP-MKII programmer +  *  - Added ShutDown() functions for all hardware peripheral drivers, so that peripherals can be turned off after use +  *  - Added new CDC_Device_Flush() command to the device mode CDC Class driver to flush Device->Host data +  *  - Added extra masks to the SPI driver, changed SPI_Init() so that the clock polarity and sample modes can be set +  *  - Added new callback to the HID report parser, so that the user application can filter only the items it is interested +  *    in to be stored into the HIDReportInfo structure to save RAM +  *  - Added support for the officially recommended external peripheral layout for the BUMBLEB board (thanks to Dave Fletcher) +  *  - Added new Pipe_IsFrozen() macro to determine if the currently selected pipe is frozen +  *  - Added new USB_GetHIDReportSize() function to the HID report parser to retrieve the size of a given report by its ID +  *  - Added new combined Mass Storage and Keyboard demo (thanks to Matthias Hullin) +  * +  *  <b>Changed:</b> +  *  - SetIdle requests to the HID device driver with a 0 idle period (send changes only) now only affect the requested +  *    HID interface within the device, not all HID interfaces +  *  - Added explicit attribute masks to the device mode demos' descriptors +  *  - Added return values to the CDC and MIDI class driver transmit functions +  *  - Optimized Endpoint_Read_Word_* and Pipe_Read_Word_* macros to reduce compiled size +  *  - Added non-null function parameter pointer restrictions to USB Class drivers to improve user code reliability +  *  - Added new "Common" section to the class drivers, to hold all mode-independent definitions for clarity +  *  - Moved SCSI command/sense constants into the Mass Storage Class driver, instead of the user-code +  *  - Altered the SCSI commands in the LowLevel Mass Storage Host to save on FLASH space by reducing function calls +  *  - Changed the parameters and behaviour of the USB_GetDeviceConfigDescriptor() function so that it now performs size checks +  *    and data validations internally, to simplify user code +  *  - Changed HIDParser to only zero out important values in the Parsed HID Report Item Information structure to save cycles +  *  - The HID report parser now always processed FEATURE items - HID_ENABLE_FEATURE_PROCESSING token now has no effect +  *  - The HID report parser now always ignores constant-data items, HID_INCLUDE_CONSTANT_DATA_ITEMS token now has no effect +  *  - The Benito Programmer project now has its own unique VID/PID pair allocated from the Atmel donated LUFA VID/PID pool +  *  - Add in new invalid event hook check targets to project makefiles to produce compilation errors when invalid event names +  *    are used in a project +  *  - The HID Report Parser now gives information on the total length of each report within a HID interface +  *  - The USE_NONSTANDARD_DESCRIPTOR_NAMES compile time token has been removed - there are now separate USB_Descriptor_* and +  *    USB_StdDescriptor_* structures for both the LUFA and standardized element naming conventions so both may be used +  * +  *  <b>Fixed:</b> +  *  - Fixed possible lockup in the CDC device class driver, when the host sends data that is a multiple of the +  *    endpoint's bank +  *  - Fixed swapped parameters in the HID state memory copy call while processing a HID PUSH item in the HID report parser +  *  - Fixed memory corruption HID report parser when too many COLLECTION or PUSH items were processed +  *  - Fixed HID report parser not resetting the FEATURE item count when a REPORT ID item is encountered +  *  - Fixed USBtoSerial demos not reading in UDR1 when the USART receives data but the USB interface is not enumerated, +  *    causing continuous USART receive interrupts +  *  - Fixed misspelled event name in the Class driver USBtoSerial demo, preventing correct operation +  *  - Fixed invalid data being returned when a GetStatus request is issued in Device mode with an unhandled data recipient +  *  - Added hardware USART receive interrupt and software buffering to the Benito project to ensure received data is not +  *    missed or corrupted +  *  - Fixed Device mode HID Class driver always sending IN packets, even when nothing to report +  *  - Fixed Device mode HID Class driver not explicitly initializing the ReportSize parameter to zero before calling callback +  *    routine, so that ignored callbacks don't cause incorrect data to be sent +  *  - Fixed StillImageHost not correctly freezing and unfreezing data pipes while waiting for a response block header +  *  - Fixed error in the PrinterHost demo preventing the full page data from being sent to the attached device (thanks to John Andrews) +  *  - Fixed CDC based demos and projects' INF driver files under 64 bit versions of Windows (thanks to Ronny Hanson, Thomas Bleeker) +  *  - Re-add in missing flip, flip-ee, dfu and dfu-ee targets to project makefiles (thanks to Opendous Inc.) +  *  - Fix allowable F_CPU values comment in project makefiles to more accurately reflect the allowable values on the USB AVRs +  *  - Fixed DFU and CDC class bootloaders on the series 2 USB AVRs, corrected invalid signatures, added support for the new +  *    ATMEGAxx2 series 2 variant AVRs to the DFU bootloader +  *  - Fixed Low Level USBtoSerial demo not storing received characters (thanks to Michael Cooper) +  *  - Fixed MIDI Device Class driver not sending/receiving MIDI packets of the correct size (thanks to Thomas Bleeker) +  * +  * +  *  \section Sec_ChangeLog090810 Version 090810 +  * +  *  <b>New:</b> +  *  - Added new device class drivers and matching demos to the library for rapid application development +  *  - Added new PrinterHost demo (thanks to John Andrews) +  *  - Added USB Missile Launcher project, submitted by Dave Fletcher +  *  - Added new Benito Arduino Programmer project +  *  - Added incomplete device and host mode demos for later enhancement +  *  - Updated MassStorage device block write routines to use ping-pong Dataflash buffering to increase throughput by around 30% +  *  - Error status LEDs shown when device endpoint configuration fails to complete in all demos and projects +  *  - Added new USB_Host_SetDeviceConfiguration() convenience function for easy configuration selection of devices while in USB +  *    host mode +  *  - Added new USB_Host_ClearPipeStall() convenience function to clear a stall condition on an attached device's endpoint +  *  - Added new USB_Host_GetDeviceDescriptor() convenience function to retrieve the attached device's Device descriptor +  *  - Added new Endpoint_ClearStatusStage() convenience function to assist with the status stages of control transfers +  *  - Added new USE_INTERNAL_SERIAL define for using the unique serial numbers in some AVR models as the USB device's serial number, +  *    added NO_INTERNAL_SERIAL compile time option to turn off new serial number reading code +  *  - Added new DATAFLASH_CHIP_MASK() macro to the Dataflash driver, which returns the Dataflash select mask for the given chip index +  *  - Added new HOST_STATE_WaitForDeviceRemoval host state machine state for non-blocking disabling of device communications until the +  *    device has been removed (for use when an error occurs or communications with the device have completed) +  *  - Added new FAST_STREAM_TRANSFERS compile time option for faster stream transfers via multiple bytes copied per stream loop +  *  - Added stdio stream demo code to the CDC device demos, to show how to create standard streams out of the virtual serial ports +  *  - Added new EEPROM and FLASH buffer versions of the Endpoint and Pipe stream functions +  *  - Added new USE_FLASH_DESCRIPTORS and FIXED_NUM_CONFIGURATIONS compile time options +  *  - Added support for the new ATMEGA32U2, ATMEGA16U2 and ATMEGA8U2 AVR models +  *  - Added new USB_DeviceState variable to keep track of the current Device mode USB state +  *  - Added new LEDs_ToggleLEDs() function to the LEDs driver +  *  - Added new Pipe_BoundEndpointNumber() and Pipe_IsEndpointBound() functions +  *  - Added new DEVICE_STATE_AS_GPIOR and HOST_STATE_AS_GPIOR compile time options +  *  - Added 404 Not Found errors to the webserver in the RNDIS demos to indicate invalid URLs +  * +  *  <b>Changed:</b> +  *  - Deprecated pseudo-scheduler and removed dynamic memory allocator from the library (first no longer needed and second unused) +  *  - The device-mode CALLBACK_USB_GetDescriptor() function now has an extra parameter so that the memory space in which the requested +  *    descriptor is located can be specified. This means that descriptors can now be located in multiple memory spaces within a device. +  *  - Removed vague USB_IsConnected global - test USB_DeviceState or USB_HostState explicitly to gain previous functionality +  *  - Removed USB_IsSuspended global - test USB_DeviceState against DEVICE_STATE_Suspended instead +  *  - Extended USB_GetDeviceConfigDescriptor() routine to require the configuration number within the device to fetch +  *  - Dataflash_WaitWhileBusy() now always ensures that the dataflash is ready for the next command immediately after returning, +  *    no need to call Dataflash_ToggleSelectedChipCS() afterwards +  *  - Low level API MIDI device demo no longer blocks if a note change event is sent while the endpoint is not ready +  *  - Pipe_GetErrorFlags() now returns additional error flags for overflow and underflow errors +  *  - Pipe stream functions now automatically set the correct pipe token, so that bidirectional pipes can be used +  *  - Pipe_ConfigurePipe() now automatically defaults IN pipes to accepting infinite IN requests, this can still be changed by calling +  *    the existing Pipe_SetFiniteINRequests() function +  *  - Changed F_USB entries in project makefiles to alias to F_CPU by default, as this is the most common case +  *  - Host mode demos now use sane terminal escape codes, so that text is always readable and events/program output is visually distinguished +  *    from one another using foreground colours +  *  - Internal per-device preprocessing conditions changed to per-device series rather than per-controller group for finer-grain +  *    internal control +  *  - Interrupts are no longer disabled during the processing of Control Requests on the default endpoint while in device mode +  *  - AudioOutput demos now always output to board LEDs, regardless of output mode (removed AUDIO_OUT_LEDS project option) +  *  - Removed SINGLE_DEVICE_CONFIGURATION compile time option in favor of the new FIXED_NUM_CONFIGURATIONS option so that the exact number +  *    of device configurations can be defined statically +  *  - Removed VBUS events, as they are already exposed to the user application via the regular device connection and disconnection events +  *  - Renamed and altered existing events to properly separate out Host and Device mode events +  *  - All demos switched over from GNU99 standards mode to C99 standards mode, to reduce the dependencies on GCC-only language extensions +  * +  *  <b>Fixed:</b> +  *  - Changed bootloaders to use FLASHEND rather than the existence of RAMPZ to determine if far FLASH pointers are needed to fix +  *    bootloaders on some of the USB AVR devices where avr-libc erroneously defines RAMPZ +  *  - Fixes to MassStorageHost for better device compatibility (increase command timeout, change MassStore_WaitForDataReceived() +  *    to only unfreeze and check one data pipe at a time) to prevent incorrect device enumerations and freezes while transferring data +  *  - Make Pipe_ConfigurePipe() mask the given endpoint number against PIPE_EPNUM_MASK to ensure the endpoint IN direction bit is +  *    cleared to prevent endpoint type corruption +  *  - Fixed issue opening CDC-ACM ports on hosts when the CDC device tries to send data before the host has set the line encoding +  *  - Fixed USB_OPT_MANUAL_PLL option being ignored during device disconnects on some models (thanks to Brian Dickman) +  *  - Fixed documentation mentioning Pipe_GetCurrentToken() function when correct function name is Pipe_GetPipeToken() +  *  - Fixed ADC driver for the ATMEGA32U4 and ATMEGA16U4 (thanks to Opendous Inc.) +  *  - Fixed CDCHost demo unfreezing the pipes at the point of configuration, rather than use +  *  - Fixed MassStorage demo not clearing the reset flag when a Mass Storage Reset is issued while not processing a command +  *  - Fixed USB_Host_SendControlRequest() not re-suspending the USB bus when initial device ready-wait fails +  *  - Fixed USB Pad regulator not being disabled on some AVR models when the USB_OPT_REG_DISABLED option is used +  *  - Fixed Host mode to Device mode UID change not causing a USB Disconnect event when a device was connected +  *  - Fixed Mouse/Keyboard demos not performing the correct arithmetic on the Idle period at the right times (thanks to Brian Dickman) +  *  - Fixed GenericHID failing HID class tests due to incorrect Logical Minimum and Logical Maximum values (thanks to Soren Greiner) +  *  - Fixed incorrect PIPE_EPNUM_MASK mask causing pipe failures on devices with endpoint addresses of 8 and above (thanks to John Andrews) +  *  - Fixed report data alignment issues in the MouseHostWithParser demo when X and Y movement data size is not a multiple of 8 bits +  *  - Fixed HID Report Descriptor Parser not correctly resetting internal states when a REPORT ID element is encountered +  *  - Fixed incorrect BUTTONS_BUTTON1 for the STK526 target +  *  - Fixed RNDIS demos freezing when more than one connection was attempted simultaneously, causing memory corruption +  *  - Fixed USBtoSerial demo receiving noise from the USART due to pull-up not being enabled +  * +  * +  *  \section Sec_ChangeLog090605 Version 090605 +  * +  *  - Fixed bug in RNDISEthernet and DualCDC demos not using the correct USB_ControlRequest structure for control request data +  *  - Fixed documentation showing incorrect USB mode support on the supported AVRs list +  *  - Fixed RNDISEthernet not working under Linux due to Linux requiring an "optional" RNDIS request which was unhandled +  *  - Fixed Mouse and Keyboard device demos not acting in accordance with the HID specification for idle periods (thanks to Brian Dickman) +  *  - Removed support for endpoint/pipe non-control interrupts; these did not act in the way users expected, and had many subtle issues +  *  - Fixed Device Mode not handling Set Feature and Clear Feature Chapter 9 requests that are addressed to the device (thanks to Brian Dickman) +  *  - Moved control endpoint interrupt handling into the library itself, enable via the new INTERRUPT_CONTROL_ENDPOINT token +  *  - Fixed CDCHost not clearing configured pipes and resetting configured pipes mask when a partially enumerated invalid CDC +  *    interface is skipped +  *  - Clarified the size of library tokens which accept integer values in the Compile Time Tokens page, values now use the smallest datatype +  *    inside the library that is able to hold their defined value to save space +  *  - Removed DESCRIPTOR_ADDRESS() macro as it was largely superfluous and only served to obfuscate code +  *  - Rewritten event system to remove all macros, to make user code clearer +  *  - Fixed incorrect ENDPOINT_EPNUM_MASK mask preventing endpoints above EP3 from being selected (thanks to Jonathan Oakley) +  *  - Removed STREAM_CALLBACK() macro - callbacks now use regular function definitions to clarify user code +  *  - Removed DESCRIPTOR_COMPARATOR() macro - comparators should now use regular function definitions to clarify user code +  *  - USB_IsConnected is now cleared before the USB_Disconnect() event is fired in response to VBUS being removed +  *  - Fixed incorrect PID value being used in the USBtoSerial project (thanks to Phill) +  *  - Deleted StdDescriptors.c, renamed USB_GetDescriptor() to CALLBACK_USB_GetDescriptor, moved ConfigDescriptor.c/.h from the +  *    LUFA/Drivers/USB/Class/ directory to LUFA/Drivers/USB/HighLevel/ in preparation for the new USB class APIs +  *  - Moved out each demos' functionality library files (e.g. Ring Buffer library) to /Lib directories for a better directory structure +  *  - Removed Tx interrupt from the USBtoSerial demo; now sends characters via polling to ensure more time for the Rx interrupt +  *  - Fixed possible enumeration errors from spin-loops which may fail to exit if the USB connection is severed before the exit condition +  *    becomes true +  * +  * +  *  \section Sec_ChangeLog090510 Version 090510 +  * +  *  - Added new GenericHIDHost demo +  *  - Corrections to the KeyboardHost and MouseHost demos' pipe handling to freeze and unfreeze the data pipes at the point of use +  *  - KeyboardHost, MouseHost and GenericHIDHost demos now save and restore the currently selected pipe inside the pipe ISR +  *  - Changed GenericHID device demo to use the LUFA scheduler, added INTERRUPT_DATA_ENDPOINT and INTERRUPT_CONTROL_ENDPOINT compile +  *    time options +  *  - All comments in the library, bootloaders, demos and projects have now been spell-checked and spelling mistakes/typos corrected +  *  - Added new PIMA_DATA_SIZE() define to the Still Image Host demo +  *  - Add call to MassStore_WaitForDataReceived() in MassStore_GetReturnedStatus() to ensure that the CSW has been received in the +  *    extended MSC timeout period before continuing, to prevent long processing delays from causing the MassStore_GetReturnedStatus() +  *    to early-abort (thanks to Dmitry Maksimov) +  *  - Move StdRequestType.h, StreamCallbacks.h, USBMode.h from the LowLevel USB driver directory to the HighLevel USB driver directory, +  *    where they are more suited +  *  - Removed all binary constants and replaced with decimal or hexadecimal constants so that unpatched GCC compilers can still build the +  *    code without having to be itself patched and recompiled first +  *  - Added preprocessor checks and documentation to the bootloaders giving information about missing SIGNATURE_x defines due to +  *    outdated avr-libc versions. +  *  - Added support to the CDCHost demo for devices with multiple CDC interfaces which are not the correct ACM type preceding the desired +  *    ACM CDC interface +  *  - Fixed GenericHID demo not starting USB and HID management tasks when not using interrupt driven modes (thanks to Carl Kjeldsen) +  *  - Fixed RNDISEthenet demo checking the incorrect message field for packet size constraints (thanks to Jonathan Oakley) +  *  - Fixed WriteNextReport code in the GenericHIDHost demo using incorrect parameter types and not selecting the correct endpoint +  *  - Adjusted sample CTC timer calculations in the AudioOutput and AudioInput demos to match the CTC calculations in the AVR datasheet, +  *    and to fix instances where rounding caused the endpoint to underflow (thanks to Robin Theunis) +  *  - The USB_Host_SendControlRequest() function no longer automatically selects the Control pipe (pipe 0), so that other control type +  *    pipes can be used with the function +  *  - The USB Host management task now saves and restores the currently selected pipe before and after the task completes +  *  - Fixed GenericHIDHost demo report write routine incorrect for control type requests (thanks to Andrei Krainev) +  *  - Removed Endpoint_ClearCurrentBank() and Pipe_ClearCurrentBank() in favor of new Endpoint_ClearIN(), Endpoint_ClearOUT(), +  *    Pipe_ClearIN() and Pipe_ClearOUT() macros (done to allow for the detection of packets of zero length) +  *  - Renamed *_ReadWriteAllowed() macros to *_IsReadWriteAllowed() to remain consistent with the rest of the LUFA API +  *  - Endpoint_IsSetupReceived() macro has been renamed to Endpoint_IsSETUPReceived(), Endpoint_ClearSetupReceived() macro has been +  *    renamed to Endpoint_ClearSETUP(), the Pipe_IsSetupSent() macro has been renamed to Pipe_IsSETUPSent() and the +  *    Pipe_ClearSetupSent() macro is no longer applicable and should be removed - changes made to compliment the new endpoint and pipe +  *    bank management API +  *  - Updated all demos, bootloaders and projects to use the new endpoint and pipe management APIs (thanks to Roman Thiel from Curetis AG) +  *  - Updated library Doxygen documentation, added groups, changed documentation macro functions to real functions for clarity +  *  - Removed old endpoint and pipe aliased read/write/discard routines which did not have an explicit endian specifier for clarity +  *  - Removed the ButtLoadTag.h header file, as no one used for its intended purpose anyway +  *  - Renamed the main Drivers/AT90USBXXX directory to Drivers/Peripheral, renamed the Serial_Stream driver to SerialStream +  *  - Fixed CDC and USBtoSerial demos freezing where buffers were full while still transmitting or receiving (thanks to Peter Hand) +  *  - Removed "Host_" section of the function names in ConfigDescriptor.h, as most of the routines can now be used in device mode on the +  *    device descriptor +  *  - Renamed functions in the HID parser to have a "USB_" prefix and the acronym "HID" in the name +  *  - Fixed incorrect HID interface class and subclass values in the Mouse and KeyboardMouse demos (thanks to Brian Dickman) +  *  - Capitalized the "Descriptor_Search" and "Descriptor_Search_Comp" prefixes of the values in the DSearch_Return_ErrorCodes_t and +  *    DSearch_Comp_Return_ErrorCodes_t enums +  *  - Removed "ERROR" from the enum names in the endpoint and pipe stream error code enums +  *  - Renamed the USB_PowerOnErrorCodes_t enum to USB_InitErrorCodes_t, renamed the POWERON_ERROR_NoUSBModeSpecified enum value to +  *    USB_INITERROR_NoUSBModeSpecified +  *  - Renamed USB_PowerOnFail event to USB_InitFailure +  *  - Renamed OTG.h header functions to be more consistent with the rest of the library API +  *  - Changed over all deprecated GCC structure tag initializers to the standardized C99 format (thanks to Mike Alexander) +  *  - USB_HostRequest renamed to USB_ControlRequest, entire control request header is now read into USB_ControlRequest in Device mode +  *    rather than having the library pass only partially read header data to the application +  *  - The USB_UnhandledControlPacket event has had its parameters removed, in favor of accessing the new USB_ControlRequest structure +  *  - The Endpoint control stream functions now correctly send a ZLP to the host when less data than requested is sent +  *  - Fixed USB_RemoteWakeupEnabled flag never being set (the REMOTE WAKEUP Set Feature request was not being handled) +  *  - Renamed the FEATURELESS_CONTROL_ONLY_DEVICE compile-time token to CONTROL_ONLY_DEVICE +  *  - Endpoint configuration is now refined to give better output when all configurations have static inputs - removed the now useless +  *    STATIC_ENDPOINT_CONFIGURATION compile time token +  *  - Fixed SPI driver init function not clearing SPI2X bit when not needed +  *  - Fixed PREVENT ALLOW MEDIUM REMOVAL command issuing in the MassStorageHost demo using incorrect parameters (thanks to Mike Alex) +  *  - Fixed MassStorageHost demo broken due to an incorrect if statement test in MassStore_GetReturnedStatus() +  *  - Fixed reversed signature byte ordering in the CDC bootloader (thanks to Johannes Raschke) +  *  - Changed PIPE_CONTROLPIPE_DEFAULT_SIZE from 8 to 64 to try to prevent problems with faulty devices which do not respect the given +  *    wLength value when reading in the device descriptor +  *  - Fixed missing semicolon in the ATAVRUSBRF01 LED board driver code (thanks to Morten Lund) +  *  - Changed LED board driver code to define dummy LED masks for the first four board LEDs, so that user code can be compiled for boards +  *    with less than four LEDs without code modifications (thanks to Morten Lund) +  *  - Changed HWB board driver to Buttons driver, to allow for the support of future boards with more than one mounted GPIO button +  *  - Serial driver now correctly calculates the baud register value when in double speed mode +  *  - Init function of the Serial driver is now static inline to product smaller code for the common-case of static init values +  * +  * +  *  \section Sec_ChangeLog090401 Version 090401 +  * +  *  - Fixed MagStripe project configuration descriptor containing an unused (blank) endpoint descriptor +  *  - Incorporated makefile changes by Denver Gingerich to retain compatibility with stock (non-WinAVR) AVR-GCC installations +  *  - Fixed makefile EEPROM programming targets programming FLASH data in addition to EEPROM data +  *  - LUFA devices now enumerate correctly with LUFA hosts +  *  - Fixed Configuration Descriptor search routine freezing when a comparator returned a failure +  *  - Removed HID report item serial dump in the MouseHostWithParser and KeyboardHostWithParser - useful only for debugging, and +  *    slowed down the enumeration of HID devices too much +  *  - Increased the number of bits per track which can be read in the MagStripe project to 8192 when compiled for the AT90USBXXX6/7 +  *  - Fixed KeyboardMouse demo discarding the wIndex value in the REQ_GetReport request +  *  - USBtoSerial demo now discards all Rx data when not connected to a USB host, rather than buffering characters for transmission +  *    next time the device is attached to a host. +  *  - Added new F_USB compile time constant to the library and makefiles, to give the raw input clock (used to feed the PLL before any +  *    clock prescaling is performed) frequency, so that the PLL prescale mask can be determined +  *  - Changed stream wait timeout counter to be 16-bit, so that very long timeout periods can be set for correct communications with +  *    badly designed hosts or devices which greatly exceed the USB specification limits +  *  - Mass Storage Host demo now uses a USB_STREAM_TIMEOUT_MS of two seconds to maintain compatibility with poorly designed devices +  *  - Function attribute ATTR_ALWAYSINLINE renamed to ATTR_ALWAYS_INLINE to match other function attribute macro naming conventions +  *  - Added ATTR_ALWAYS_INLINE attribute to several key inlined library components, to ensure they are inlined in all circumstances +  *  - Removed SetSystemClockPrescaler() macro, the clock_prescale_set() avr-libc macro has been corrected in recent avr-libc versions +  *  - Fixed incorrect/missing control status stage transfers on demos, bootloaders and applications (thanks to Nate Lawson) +  *  - The NO_CLEARSET_FEATURE_REQUEST compile time token has been renamed to FEATURELESS_CONTROL_ONLY_DEVICE, and its function expanded +  *    to also remove parts of the Get Status chapter 9 request to further reduce code usage +  *  - Makefile updated to include output giving the currently selected BOARD parameter value +  *  - Board Dataflash driver now allows for dataflash ICs which use different shifts for setting the current page/byte address (thanks +  *    to Kenneth Clubb) +  *  - Added DataflashManager_WriteBlocks_RAM() and DataflashManager_ReadBlocks_RAM() functions to the MassStorage demo, to allow for easy +  *    interfacing with a FAT library for dataflash file level access +  *  - Corrected CDC class bootloader to fix a few bugs, changed address counter to store x2 addresses for convenience +  *  - Fixed typos in the SPI driver SPI_SPEED_FCPU_DIV_64 and SPI_SPEED_FCPU_DIV_128 masks (thanks to Markus Zocholl) +  *  - Keyboard and Mouse device demos (normal, data interrupt and fully interrupt driven) combined into unified keyboard and mouse demos +  *  - Keyboard and Mouse host demos (normal and data interrupt driven) combined into unified keyboard and mouse demos +  *  - Removed AVRISP_Programmer project due to code quality concerns +  *  - Fixed CDC demo not sending an empty packet after each transfer to prevent the host from buffering incoming data +  *  - Fixed documentation typos and preprocessor checks relating to misspellings of the USE_RAM_DESCRIPTORS token (thanks to Ian Gregg) +  *  - Fixed USBTask.h not conditionally including HostChapter9.h only when USB_CAN_BE_HOST is defined (thanks to Ian Gregg) +  *  - Fixed incorrect ADC driver init register manipulation (thanks to Tobias) +  *  - Added new GenericHID device demo application +  *  - Fixed Still Image Host SImage_SendData() function not clearing the pipe bank after sending data +  * +  * +  *  \section Sec_ChangeLog090209 Version 090209 +  * +  *  - PWM timer mode in AudioOut demo changed to Fast PWM for speed +  *  - Updated Magstripe project to work with the latest hardware revision +  *  - Fixed library not responding to the BCERRI flag correctly in host mode, leading to device lockups +  *  - Fixed library handling Get Descriptor requests when not addressed as standard requests to the device or interface (thanks to +  *    Nate Lawson) +  *  - Fixed serious data corruption issue in MassStorage demo dataflash write routine +  *  - Added new NO_CLEARSET_FEATURE_REQUEST compile time token +  *  - USB task now restores previous global interrupt state after execution, rather than forcing global interrupts to be enabled +  *  - Fixed USB_DeviceEnumerationComplete event firing after each configuration change, rather than once after the initial configuration +  *  - Added ENDPOINT_DOUBLEBANK_SUPPORTED() macros to Endpoint.h, altered ENDPOINT_MAX_SIZE() to allow user to specify endpoint +  *  - ENDPOINT_MAX_ENDPOINTS changed to ENDPOINT_TOTAL_ENDPOINTS, PIPE_MAX_PIPES changed to PIPE_TOTAL_PIPES +  *  - Endpoint and Pipe non-control stream functions now ensure endpoint or pipe is ready before reading or writing +  *  - Changed Teensy bootloader to use a watchdog reset when exiting rather than a software jump +  *  - Fixed integer promotion error in MassStorage and MassStorageHost demos, corrupting read/write transfers +  *  - SPI_SendByte is now SPI_TransferByte, added new SPI_SendByte and SPI_ReceiveByte functions for fast one-way transfer +  *  - MassStorage demo changed to use new fast one-way SPI transfers to increase throughput +  *  - MassStorage handling of Mass Storage Reset class request improved +  *  - Altered MassStorage demo dataflash block read code for speed +  *  - Added USB_IsSuspended global flag +  *  - Simplified internal Dual Mode (OTG) USB library code to reduce code size +  *  - Extended stream timeout period to 100ms from 50ms +  *  - Mass Storage Host demo commands now all return an error code from the Pipe_Stream_RW_ErrorCodes_t enum +  *  - Added SubErrorCode parameter to the USB_DeviceEnumerationFailed event +  *  - VBUS drop interrupt now disabled during the manual-to-auto VBUS delivery handoff +  *  - Simplified low level backend so that device/host mode initialization uses the same code paths +  *  - Added workaround for faulty Mass Storage devices which do not implement the required GET_MAX_LUN request +  *  - Removed buggy Telnet application from the RNDIS demo +  *  - Moved Mass Storage class requests in the Mass Storage Host demo to wrapper functions in MassStoreCommands.c +  *  - Fixed incorrect SCSI command size value in the Request Sense command in MassStoreCommands.c +  *  - Added SetProtocol request to HID class non-parser Mouse and Keyboard demos to force devices to use the correct Boot Protocol +  *  - Added new "dfu" and "flip" programming targets to project makefiles +  *  - HID_PARSE_Sucessful enum member typo corrected to HID_PARSE_Successful +  *  - Changed COLLECTION item structures in the HID descriptor parser to include the collection's Usage Page value +  *  - Serial driver now sets Tx line as output, enables pull-up on Rx line +  *  - Fixed smaller USB AVRs raising multiple connection and disconnection events when NO_LIMITED_CONTROLLER_CONNECT is disabled +  *  - Added HOST_DEVICE_SETTLE_DELAY_MS to give the host delay after a device is connected before it is enumerated +  *  - Fixed KeyboardHostWithParser demo linking against the wrong global variables +  *  - Completed doxygen documentation of remaining library bootloaders, demos and projects +  *  - Fixed incorrect bootloader start address in the TeensyHID bootloader +  *  - Added HWB button whole-disk ASCII dump functionality to MassStoreHost demo +  *  - Replaced printf_P(PSTR("%c"), {Variable}) calls with putchar(<Variable>) for speed and size savings +  *  - Serial driver now accepts baud rates over 16-bits in size, added double speed flag option +  *  - Fixed incorrect callback abort return value in Pipe.c +  *  - Added new flip-ee and dfu-ee makefile targets (courtesy of Opendous Inc.) +  *  - Removed reboot-on-disconnect code from the TeensyHID bootloader, caused problems on some systems +  *  - Fixed AudioOutput and AudioInput demos looping on the endpoint data, rather than processing a sample at a time and returning +  *    each time the task runs to allow for other tasks to execute +  *  - Added support for the Atmel ATAVRUSBRF01 board +  *  - Added AVRISP Programmer Project, courtesy of Opendous Inc. +  *  - Fixed CDC Host demo not searching through both CDC interfaces for endpoints +  *  - Fixed incorrect Product String descriptor length in the DFU class bootloader +  * +  * +  *  \section Sec_ChangeLog081224 Version 081224 +  * +  *  - MyUSB name changed to LUFA, the Lightweight USB Framework for AVRs +  *  - Fixed Mass Storage Host demo's MassStore_SendCommand() delay in the incorrect place +  *  - Fixed USBtoSerial demo not calling ReconfigureUSART() after a change in the line encoding +  *  - Fixed infinite loop in host mode Host-to-Device control transfers with data stages +  *  - HID report parser now supports devices with multiple reports in one interface via Report IDs +  *  - Fixed RZUSBSTICK board LED driver header incorrect macro definition order causing compile errors +  *  - Calling USB_Init() when the USB interface is already configured now forces a complete interface reset +  *    and re-enumeration - fixes MyUSB DFU bootloader not switching to app code correctly when soft reset used +  *  - Fixed "No newline at end of file" warning when stream callbacks are enabled +  *  - DFU bootloader now uses fixed signature bytes per device, rather than reading them out dynamically for size +  *  - Added new FIXED_CONTROL_ENDPOINT_SIZE and USE_SINGLE_DEVICE_CONFIGURATION switches to statically define certain values to +  *    reduce compiled binary size +  *  - Added new NO_LIMITED_CONTROLLER_CONNECT switch to prevent the library from trying to determine bus connection +  *    state from the suspension and wake up events on the smaller USB AVRs +  *  - Added summary of all library compile time tokens to the documentation +  *  - Added overview of the LUFA scheduler to the documentation +  *  - Removed MANUAL_PLL_CONTROL compile time token, replaced with a mask for the USB_Init() Options parameter +  *  - CDC bootloader now uses the correct non-far or far versions of the pgm_* functions depending on if RAMPZ is defined +  *  - Doxygen documentation now contains documentation on all the projects, bootloaders and most demos included with the library +  *  - CDC bootloader now runs user application when USB disconnected rather than waiting for a hard reset +  *  - MouseHostWithParser and KeyboardHostWithParser now support multiple-report devices +  *  - RNDIS demo can now close connections correctly using the new TCP_APP_CLOSECONNECTION() macro - used in Webserver +  *  - Fixed the DFU bootloader, no longer freezes up when certain files are programmed into an AVR, made reading/writing faster +  *  - Fixed mouse/joystick up/down movements reversed - HID mouse X/Y coordinates use a left-handed coordinate system, not a normal +  *    right-handed system +  *  - Added stub code to the CDC and USBtoSerial demos showing how to read and set the RS-232 handshake lines - not currently used in +  *    the demos, but the example code and supporting defines are now in place +  *  - Interrupts are now disabled when processing a control request in device mode, to avoid exceeding the strict control request +  *    timing requirements. +  *  - All demos now use a central StatusUpdate() function rather than direct calls to the board LED functions, so that the demos can +  *    easily be altered to show different LED combinations (or do something else entirely) as the demo's status changes +  *  - Removed LED commands from the CDC bootloader, unused by most AVR910 programming software +  *  - Fixed RNDIS demo ICMP ping requests echoing back incorrect data +  *  - Added DHCP server code to RNDIS demo, allowing for hands-free auto configuration on any PC +  *  - Fixed DFU bootloader PID value for the ATMEGA16U4 AVR +  *  - Endpoint and Pipe configuration functions now return an error code indicating success or failure +  *  - USB Reset in device mode now resets and disables all device endpoints +  *  - Added intermediate states to the host mode state machine, reducing the USB task blocking time to no more than 1ms explicitly per +  *    invocation when in host mode +  *  - Added support for the ATMEGA32U6 microcontroller +  *  - Added STATIC_ENDPOINT_CONFIGURATION compile time option, enabled in the bootloaders to minimize space usage +  *  - Removed redundant code from the USB device GetStatus() chapter 9 processing routine +  *  - Added new TeensyHID bootloader, compatible with the Teensy HID protocol (http://www.pjrc.com/teensy/) +  *  - Versions are now numbered by release dates, rather than arbitrary major/minor revision numbers +  *  - USB_RemoteWakeupEnabled is now correctly set and cleared by SetFeature and ClearFeature requests from the host +  *  - Changed prototype of GetDescriptor, so that it now returns the descriptor size (or zero if the descriptor doesn't exist) +  *    rather than passing the size back to the caller through a parameter and returning a boolean +  * +  * +  *  \section Sec_ChangeLog153 Version 1.5.3 (081002) +  * +  *  - Fixed CDC bootloader using pgmspace macros for some descriptors inappropriately +  *  - Updated all Mouse and Keyboard device demos to include boot protocol support (now works in BIOS) +  *  - Renamed bootloader directories to remove spaces, which were causing build problems on several OSes +  *  - Removed serial number strings from all but the MassStore demo where it is required - users were not +  *    modifying the code to either omit the descriptor or use a unique serial per device causing problems +  *    when multiple units of the same device were plugged in at the same time +  *  - AudioOutput and AudioInput demos now correctly silence endpoints when not enabled by the host +  *  - Added KeyboardMouse demo (Keyboard and Mouse functionality combined into a single demo) +  *  - Added DriverStubs directory to house board level driver templates, to make MyUSB compatible custom board +  *    driver creation easier +  *  - Extended MassStorage demo to support multiple LUNs, 2 by default +  *  - Fixed incorrect device address mask, preventing the device from enumerating with addresses larger than 63 +  *  - Fixed incorrect data direction mask in the GetStatus standard request, preventing it from being handled +  *  - Fixed incorrect GetStatus standard request for endpoints, now returns the endpoint STALL status correctly +  *  - Added in new USB_RemoteWakeupEnabled and USB_CurrentlySelfPowered flags rather than using fixed values +  *  - Added DualCDC demo to demonstrate the use of Interface Association Descriptors +  *  - Added pipe NAK detection and clearing API +  *  - Added pipe status change (NAK, STALL, etc.) interrupt API +  *  - Fixed MassStorageHost demo so that it no longer freezes randomly when issuing several commands in a row +  *  - Host demos configuration descriptor routines now return a unique error code when the returned data does +  *    not have a valid configuration descriptor header +  *  - Added Endpoint_WaitUntilReady() and Pipe_WaitUntilReady() functions +  *  - Stream functions now have software timeouts, timeout period can be set by the USB_STREAM_TIMEOUT_MS token +  *  - All demos now pass the USB.org automated Chapter 9 device compliance tests +  *  - All HID demos now pass the USB.org automated HID compliance tests +  *  - Polling interval of the interrupt endpoint in the CDC based demos changed to 0xFF to fix problems on Linux systems +  *  - Changed stream functions to accept a new callback function, with NO_STREAM_CALLBACKS used to disable all callbacks +  *  - Mass Storage demo Dataflash management routines changed to use the endpoint stream functions +  *  - Added AVRStudio project files for each demo in addition to the existing Programmer's Notepad master project file +  *  - Re-added call to ReconfigureUSART() in USBtoSerial SetLineCoding request, so that baud rate changes +  *    are reflected in the hardware (change was previously lost) +  * +  * +  *  \section Sec_ChangeLog152 Version 1.5.2 (080731) +  * +  *  - Fixed SwapEndian_32() function in Common.h so that it now works correctly (wrong parameter types) +  *  - Updated RNDIS demo - notification endpoint is no longer blocking so that it works with faulty Linux RNDIS +  *    implementations (where the notification endpoint is ignored in favor of polling the control endpoint) +  *  - Fixed incorrect Vendor Description string return size in RNDIS demo for the OID_GEN_VENDOR_DESCRIPTION OID token +  *  - Added very basic TCP/IP stack and HTTP/TELNET servers to RNDIS demo +  *  - Fixed DFU bootloader exit causing programming software to complain about failed writes +  *  - Fixed DFU bootloader EEPROM programming mode wiping first flash page +  *  - Fixed Clear/Set Feature device standard request processing code (fixing MassStorage demo in the process) +  *  - Added support for the ATMEGA16U4 AVR microcontroller +  *  - Library license changed from LGPLv3 to MIT license +  * +  * +  *  \section Sec_ChangeLog151 Version 1.5.1 (080707) +  * +  *  - Changed host demos to enable the host function task on the firing of the USB_DeviceEnumerationComplete event +  *    rather than the USB_DeviceAttached event +  *  - HID Usage Stack now forcefully cleared after an IN/OUT/FEATURE item has been completely processed to remove +  *    any referenced but not created usages +  *  - Changed USB_INT_DisableAllInterrupts() and USB_INT_ClearAllInterrupts(), USB_Host_GetNextDescriptorOfType(), +  *    USB_Host_GetNextDescriptorOfTypeBefore(), USB_Host_GetNextDescriptorOfTypeAfter() to normal functions (from inline) +  *  - Fixed USBtoSerial demo not sending data, only receiving +  *  - Fixed main makefile to make all by default, fixed MagStripe directory case to prevent case-sensitive path problems +  *  - ConfigDescriptor functions made normal, instead of static inline +  *  - Pipe/Endpoint *_Ignore_* functions changed to *_Discard_*, old names still present as aliases +  *  - Fixed ENDPOINT_MAX_SIZE define to be correct on limited USB controller AVRs +  *  - Changed endpoint and pipe size translation routines to use previous IF/ELSE IF cascade code, new algorithmic +  *    approach was buggy and caused problems +  *  - Bootloaders now compile with -fno-inline-small-functions option to reduce code size +  *  - Audio demos now use correct endpoint sizes for full and limited controller USB AVRs, double banking in all cases +  *    to be in line with the specification (isochronous endpoints MUST be double banked) +  *  - Added Interface Association descriptor to StdDescriptors.h, based on the relevant USB2.0 ECN +  *  - Fixed MIDI demo, corrected Audio Streaming descriptor to follow the MIDI-specific AS structure +  *  - Fixed HID class demo descriptors so that the HID interface's protocol is 0x00 (required for non-boot protocol HID +  *    devices) to prevent problems on hosts expecting the boot protocol functions to be supported +  *  - Added read/write control stream functions to Endpoint.h +  *  - Fixed AudioOut demo not setting port pins to inputs on USB disconnect properly +  *  - Added RNDISEthernet demo application +  * +  * +  *  \section Sec_ChangeLog150 Version 1.5.0 (080610) +  * +  *  - Fixed MIDI demo, now correctly waits for the endpoint to be ready between multiple note messages +  *  - Added CDC Host demo application +  *  - Added KeyboardFullInt demo application +  *  - Endpoint and Pipe creation routines now mask endpoint/pipe size with the size mask, to remove transaction +  *    size bits not required for the routines (improves compatibility with devices) +  *  - Fixed AudioInput demo - now correctly sends sampled audio to the host PC +  *  - Fixed AudioOutput demo once more -- apparently Windows requires endpoint packets to be >=192 bytes +  *  - Shrunk round-robin scheduler code slightly via the use of struct pointers rather than array indexes +  *  - Fixed off-by-one error when determining if the Usage Stack is full inside the HID Report parser +  *  - Renamed Magstripe.h to MagstripeHW.h and moved driver out of the library and into the MagStripe demo folder +  *  - Added preprocessor checks to enable C linkage on the library components when used with a C++ compiler +  *  - Added Still Image Host demo application +  *  - The USB device task now restores the previously selected endpoint, allowing control requests to be transparently +  *    handled via interrupts while other endpoints are serviced through polling +  *  - Fixed device signature being sent in reverse order in the CDC bootloader +  *  - Host demos now have a separate ConfigDescriptor.c/.h file for configuration descriptor processing +  *  - HostWithParser demos now have a separate HIDReport.c/.h file for HID report processing and dumping +  *  - Removed non-mandatory commands from MassStorage demo to save space, fixed SENSE ResponseCode value +  *  - CDC demos now send empty packets after sending a full one to prevent buffering issues on the host +  *  - Updated demo descriptors to use VID/PID values donated by Atmel +  *  - Added DoxyGen documentation to the source files +  *  - Fixed Serial_IsCharReceived() definition, was previously reversed +  *  - Removed separate USB_Descriptor_Language_t descriptor, USB_Descriptor_String_t is used instead +  *  - Removed unused Device Qualifier descriptor structure +  *  - Renamed the USB_CreateEndpoints event to the more appropriate USB_ConfigurationChanged +  *  - Fixed MassStorageHost demo reading in the block data in reverse +  *  - Removed outdated typedefs in StdRequestType.h, superseded by the macro masks +  *  - Corrected OTG.h is now included when the AVR supports both Host and Device modes, for creating OTG products +  *  - USB_DeviceEnumerationComplete event is now also fired when in device mode and the host has finished its enumeration +  *  - Interrupt driven demos now properly restore previously selected endpoint when ISR is complete +  *  - The value of USB_HOST_TIMEOUT_MS can now be overridden in the user project makefile to a custom fixed timeout value +  *  - Renamed USB_Host_SOFGeneration_* macros to more friendly USB_Host_SuspendBus(), USB_Host_ResumeBus() +  *    and USB_Host_IsBusSuspended() +  *  - Renamed *_*_Is* macros to *_Is* to make all flag checking macros consistent, Pipe_SetInterruptFreq() is now +  *    Pipe_SetInterruptPeriod() to use the correct terminology +  *  - UnicodeString member of USB_Descriptor_String_t struct changed to an ordinary int array type, so that the GCC +  *    Unicode strings (prefixed with an L before the opening quotation mark) can be used instead of explicit arrays +  *    of ASCII characters +  *  - Fixed Endpoint/Pipes being configured incorrectly if the maximum endpoint/pipe size for the selected USB AVR +  *    model was given as the bank size +  *  - HID device demos now use a true raw array for the HID report descriptor rather than a struct wrapped array +  *  - Added VERSION_BCD() macro, fixed reported HID and USB version numbers in demo descriptors +  *  - Cleaned up GetDescriptor device chapter 9 handler function +  *  - Added GET_REPORT class specific request to HID demos to make them complaint to the HID class +  *  - Cleaned up setting of USB_IsInitialized and USB_IsConnected values to only when needed +  *  - Removed Atomic.c and ISRMacro.h; the library was already only compatible with recent avr-lib-c for other reasons +  *  - All demos and library functions now use USB standardized names for the USB data (bRequest, wLength, etc.) +  *  - Added USE_NONSTANDARD_DESCRIPTOR_NAMES token to switch back to the non-standard descriptor element names +  * +  * +  *  \section Sec_ChangeLog141 Version 1.4.1 (090519) +  * +  *  - Enhanced KeyboardWithParser demo, now prints out pressed alphanumeric characters like the standard demo +  *  - Fixed MassStorage demo, read/writes using non mode-10 commands now work correctly +  *  - Corrected version number in Version.h +  * +  * +  *  \section Sec_ChangeLog140 Version 1.4.0 (090505) +  * +  *  - Added HID Report Parser API to the library +  *  - Added Mouse and Keyboard host demo applications, using the new HID report parser engine +  *  - Added MouseFullInt demo, which demonstrates a fully interrupt (including control requests) mouse device +  *  - Fixed incorrect length value in the audio control descriptor of the AudioOutput and AudioInput demos +  *  - Added MIDI device demo application to the library +  *  - Fixed problem preventing USB devices from being resumed from a suspended state +  *  - Added new CDC class bootloader to the library, based on the AVR109 bootloader protocol +  *  - Added header to each demo application indicating the mode, class, subclass, standards used and supported speed +  *  - Functions expecting endpoint/pipe numbers are no longer automatically masked against ENDPOINT_EPNUM_MASK or +  *    PIPE_PIPENUM_MASK - this should be manually added to code which requires it +  *  - Fixed DFU class bootloader - corrected frequency of flash page writes, greatly reducing programming time +  *  - Renamed AVR_HOST_GetDeviceConfigDescriptor() to USB_Host_GetDeviceConfigDescriptor() and AVR_HOST_GetNextDescriptor() +  *    to USB_Host_GetNextDescriptor() +  *  - Added new USB_Host_GetNextDescriptorOfTypeBefore() and USB_Host_GetNextDescriptorOfTypeAfter() routines +  *  - Moved configuration descriptor routines to MyUSB/Drivers/USB/Class/, new accompanying ConfigDescriptors.c file +  *  - Added new configuration descriptor comparator API for more powerful descriptor parsing, updated host demos to use the +  *    new comparator API +  *  - Fixed MassStorageHost demo capacity printout, and changed data read/write mode from little-endian to the correct +  *    big-endian for SCSI devices +  *  - Fixed macro/function naming consistency; USB_HOST is now USB_Host, USB_DEV is now USB_Device +  *  - Added better error reporting to host demos +  *  - Added 10 microsecond delay after addressing devices in host mode, to prevent control stalls +  * +  * +  *  \section Sec_ChangeLog132 Version 1.3.2 (080401) +  * +  *  - Added call to ReconfigureUSART() in USBtoSerial SetLineCoding request, so that baud rate changes +  *    are reflected in the hardware +  *  - Fixed CDC and USBtoSerial demos - Stream commands do not work for control endpoints, and the +  *    GetLineCoding request had an incorrect RequestType mask preventing it from being processed +  *  - Improved reliability of the USBtoSerial demo, adding a busy wait while the buffer is full +  *  - Device control endpoint size is now determined from the device's descriptors rather than being fixed +  *  - Separated out SPI code into new SPI driver in AT90USBXXX driver directory +  *  - Bootloader now returns correct PID for the selected USB AVR model, not just the AT90USB128X PID +  *  - Added support for the RZUSBSTICK board +  *  - Bicolour driver removed in favor of generic LEDs driver +  *  - Added support for the ATMEGA32U4 AVR +  *  - Added MANUAL_PLL_CONTROL compile time option to prevent the USB library from manipulating the PLL +  * +  * +  *  \section Sec_ChangeLog131 Version 1.3.1 (080319) +  * +  *  - Fixed USB to Serial demo - class value in the descriptors was incorrect +  *  - Control endpoint size changed from 64 bytes to 8 bytes to save on USB FIFO RAM and to allow low +  *    speed mode devices to enumerate properly +  *  - USB to Serial demo data endpoints changed to dual-banked 16 byte to allow the demo to work +  *    on USB AVRs with limited USB FIFO RAM +  *  - Changed demo endpoint numbers to use endpoints 3 and 4 for double banking, to allow limited +  *    USB device controller AVRs (AT90USB162, AT90USB82) to function correctly +  *  - Updated Audio Out demo to use timer 1 for AVRs lacking a timer 3 for the PWM output +  *  - Fixed incorrect USB_DEV_OPT_HIGHSPEED entry in the Mass Storage device demo makefile +  *  - Optimized Mass Storage demo for a little extra transfer speed +  *  - Added LED indicators to the Keyboard demo for Caps Lock, Num Lock and Scroll Lock +  *  - Added Endpoint_Read_Stream, Endpoint_Write_Stream, Pipe_Read_Stream and Pipe_Write_Stream functions +  *    (including Big and Little Endian variants) +  *  - Made Dataflash functions inline for speed, removed now empty Dataflash.c driver file +  *  - Added new SetSystemClockPrescaler() macro (thanks to Joerg Wunsch) +  *  - Fixed Endpoint_ClearStall() to function correctly on full USB controller AVRs (AT90USBXXX6/7) +  *  - Endpoint_Setup_In_Clear() and Endpoint_Setup_Out_Clear() no longer set FIFOCON, in line with the +  *    directives in the datasheet +  *  - Fixed PLL prescaler defines for all AVR models and frequencies +  *  - Fixed ENDPOINT_INT_IN and ENDPOINT_INT_OUT definitions +  *  - Added interrupt driven keyboard and mouse device demos +  *  - Combined USB_Device_ClearFeature and USB_Device_SetFeature requests into a single routine for code +  *    size savings +  *  - Added missing Pipe_GetCurrentPipe() macro to Pipe.h +  * +  * +  *  \section Sec_ChangeLog130 Version 1.3.0 (080307) +  * +  *  - Unnecessary control endpoint config removed from device mode +  *  - Fixed device standard request interpreter accidentally processing some class-specific requests +  *  - Added USE_RAM_DESCRIPTORS and USE_EEPROM_DESCRIPTORS compile time options to instruct the library +  *    to use descriptors stored in RAM or EEPROM rather than flash memory +  *  - All demos now disable watchdog on startup, in case it has been enabled by fuses or the bootloader +  *  - USB_DEV_OPT_LOWSPEED option now works correctly +  *  - Added ability to set the USB options statically for a binary size reduction via the USE_STATIC_OPTIONS +  *    compile time define +  *  - USB_Init no longer takes a Mode parameter if compiled for a USB device with no host mode option, or +  *    if forced to a particular mode via the USB_HOST_ONLY or USB_DEVICE_ONLY compile time options +  *  - USB_Init no longer takes an Options parameter if options statically configured by USE_STATIC_OPTIONS +  *  - Endpoint_Ignore_* and Pipe_Ignore_* made smaller by making the dummy variable non-volatile so that the +  *    compiler can throw away the result more efficiently +  *  - Added in an optional GroupID value to each scheduler entry, so that groups of tasks can once again be +  *    controlled by the new Scheduler_SetGroupTaskMode() routine +  *  - Added support for AT90USB162 and AT90USB82 AVR models +  *  - Added support for the STK525 and STK526 boards +  *  - Added support for custom board drivers to be supplied by selecting the board type as BOARD_USER, and +  *    placing board drivers in {Application Directory}/Board/ +  *  - PLL is now stopped and USB clock is frozen when detached from host in device mode, to save power +  *  - Joystick defines are now in sync with the schematics - orientation will be rotated for the USBKEY +  *  - Fixed USB_DEV_IsUSBSuspended() - now checks the correct register +  *  - Fixed data transfers to devices when in host mode +  *  - Renamed USB_DEV_OPT_HIGHSPEED to USB_DEV_OPT_FULLSPEED and USB_HOST_IsDeviceHighSpeed() to +  *    USB_HOST_IsDeviceFullSpeed() to be in line with the official USB speed names (to avoid confusion with +  *    the real high speed mode, which is unavailable on the USB AVRs) +  * +  * +  *  \section Sec_ChangeLog120 Version 1.2.0 (080204) +  * +  *  - Added USB_DeviceEnumerationComplete event for host mode +  *  - Added new Scheduler_Init routine to prepare the scheduler, so that tasks can be started and +  *    stopped before the scheduler has been started (via Scheduler_Start) +  *  - Connection events in both Device and Host mode are now interrupt-driven, allowing the USB management +  *    task to be stopped when the USB is not connected to a host or device +  *  - All demos updated to stop the USB task when not in use via the appropriate USB events +  *  - Mass Storage Host demo application updated to function correctly with all USB flash disks +  *  - Mass Storage Host demo application now prints out the capacity and number of LUNs in the attached +  *    device, and prints the first block as hexadecimal numbers rather than ASCII characters +  *  - Endpoint and Pipe clearing routines now clear the Endpoint/Pipe interrupt and status flags +  *  - Shifted error handling code in the host enum state machine to a single block, to reduce code complexity +  *  - Added in DESCRIPTOR_TYPE, DESCRIPTOR_SIZE and DESCRIPTOR_CAST macros to make config descriptor processing +  *    clearer in USB hosts and DESCRIPTOR_ADDRESS for convenience in USB devices +  *  - Added in alloca macro to common.h, in case the user is using an old version of avr-lib-c missing the macro +  * +  * +  *  \section Sec_ChangeLog110 Version 1.1.0 (080125) +  * +  *  - Fixed DCONNI interrupt being enabled accidentally after a USB reset +  *  - Fixed DDISCI interrupt not being disabled when a device is not connected +  *  - Added workaround for powerless pull-up devices causing false disconnect interrupts +  *  - Added USB_DeviceEnumerationFailed event for Host mode +  *  - AVR_HOST_GetDeviceConfigDescriptor routine no longer modifies ConfigSizePtr if a valid buffer +  *    pointer is passed +  *  - Added ALLOCABLE_BYTES to DynAlloc, and added code to make the size of key storage variables +  *    dependent on size of memory parameters passed in via the user project's makefile +  *  - Fixed incorrect device reset routine being called in USBTask +  *  - Devices which do not connect within the standard 300mS are now supported +  *  - Removed incorrect ATTR_PURE from Scheduler_SetTaskMode(), which was preventing tasks from being +  *    started/stopped, as well as USB_InitTaskPointer(), which was breaking dual device/host USB projects +  *  - Changed scheduler to use the task name rather than IDs for setting the task mode, eliminating the +  *    need to have a task ID list +  *  - ID transition interrupt now raises the appropriate device/host disconnect event if device attached +  *  - Fixed double VBUS change (and VBUS -) event when detaching in device mode +  *  - Added ability to disable ANSI terminal codes by the defining of DISABLE_TERMINAL_CODES in makefile +  *  - Removed return from ConfigurePipe and ConfigureEndpoint functions - use Pipe_IsConfigured() and +  *    Endpoint_IsConfigured() after calling the config functions to determine success +  */ + diff --git a/lib/lufa/LUFA/DoxygenPages/CompileTimeTokens.txt b/lib/lufa/LUFA/DoxygenPages/CompileTimeTokens.txt new file mode 100644 index 0000000000..92adf0dccf --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/CompileTimeTokens.txt @@ -0,0 +1,223 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** \page Page_TokenSummary Summary of Compile Tokens + * + *  The following lists all the possible tokens which can be defined in a project makefile, and passed to the + *  compiler via the -D switch, to alter the LUFA library code. These tokens may alter the library behaviour, + *  or remove features unused by a given application in order to save flash space. + * + *  \note If the \c USE_LUFA_CONFIG_HEADER token is defined, the library will include a header file named \c LUFAConfig.h located + *        in the user directory where the below compile time tokens may be defined. This allows for an alternative to makefile + *        defined tokens for configuring the library. + * + *  \section Sec_TokenSummary_NonUSBTokens Non USB Related Tokens + *  This section describes compile tokens which affect non-USB sections of the LUFA library. + * + *  \li <b>DISABLE_TERMINAL_CODES</b> - (\ref Group_Terminal) - <i>All Architectures</i> \n + *      If an application contains ANSI terminal control codes listed in TerminalCodes.h, it might be desired to remove them + *      at compile time for use with a terminal which is non-ANSI control code aware, without modifying the source code. If + *      this token is defined, all ANSI control codes in the application code from the TerminalCodes.h header are removed from + *      the source code at compile time. + * + * + *  \section Sec_TokenSummary_USBClassTokens USB Class Driver Related Tokens + *  This section describes compile tokens which affect USB class-specific drivers in the LUFA library. + * + *  \li <b>HID_HOST_BOOT_PROTOCOL_ONLY</b> - (\ref Group_USBClassHIDHost) - <i>All Architectures</i> \n + *      By default, the USB HID Host class driver is designed to work with HID devices using either the Boot or Report HID + *      communication protocols. On devices where the Report protocol is not used (i.e. in applications where only basic + *      Mouse or Keyboard operation is desired, using boot compatible devices), the code responsible for the Report protocol + *      mode can be removed to save space in the compiled application by defining this token. When defined, it is still necessary + *      to explicitly put the attached device into Boot protocol mode via a call to \ref HID_Host_SetBootProtocol(). + * + *  \li <b>HID_STATETABLE_STACK_DEPTH</b>=<i>x</i> - (\ref Group_HIDParser) - <i>All Architectures</i> \n + *      HID reports may contain PUSH and POP elements, to store and retrieve the current HID state table onto a stack. This + *      allows for reports to save the state table before modifying it slightly for a data item, and then restore the previous + *      state table in a compact manner. This token may be defined to a non-zero 8-bit value to give the maximum depth of the state + *      table stack. If not defined, this defaults to the value indicated in the HID.h file documentation. + * + *  \li <b>HID_USAGE_STACK_DEPTH</b>=<i>x</i> - (\ref Group_HIDParser) - <i>All Architectures</i> \n + *      HID reports generally contain many USAGE elements, which are assigned to INPUT, OUTPUT and FEATURE items in succession + *      when multiple items are defined at once (via REPORT COUNT elements). This allows for several items to be defined with + *      different usages in a compact manner. This token may be defined to a non-zero 8-bit value to set the maximum depth of the + *      usage stack, indicating the maximum number of USAGE items which can be stored temporarily until the next INPUT, OUTPUT + *      and FEATURE item. If not defined, this defaults to the value indicated in the HID.h file documentation. + * + *  \li <b>HID_MAX_COLLECTIONS</b>=<i>x</i> - (\ref Group_HIDParser) - <i>All Architectures</i> \n + *      HID reports generally contain several COLLECTION elements, used to group related data items together. Collection information + *      is stored separately in the processed usage structure (and referred to by the data elements in the structure) to save space. + *      This token may be defined to a non-zero 8-bit value to set the maximum number of COLLECTION items which can be processed by the + *      parser into the resultant processed report structure. If not defined, this defaults to the value indicated in the HID.h file + *      documentation. + * + *  \li <b>HID_MAX_REPORTITEMS</b>=<i>x</i> - (\ref Group_HIDParser) - <i>All Architectures</i> \n + *      All HID reports contain one or more INPUT, OUTPUT and/or FEATURE items describing the data which can be sent to and from the HID + *      device. Each item has associated usages, bit offsets in the item reports and other associated data indicating the manner in which + *      the report data should be interpreted by the host. This token may be defined to a non-zero 8-bit value to set the maximum number of + *      data elements which can be stored in the processed HID report structure, including INPUT, OUTPUT and (if enabled) FEATURE items. + *      If a item has a multiple count (i.e. a REPORT COUNT of more than 1), each item in the report count is placed separately in the + *      processed HID report table. If not defined, this defaults to the value indicated in the HID.h file documentation. + * + *  \li <b>HID_MAX_REPORT_IDS</b>=<i>x</i> - (\ref Group_HIDParser) - <i>All Architectures</i> \n + *      HID reports may contain several report IDs, to logically distinguish grouped device data from one another - for example, a combination + *      keyboard and mouse might use report IDs to separate the keyboard reports from the mouse reports. In order to determine the size of each + *      report, and thus know how many bytes must be read or written, the size of each report (IN, OUT and FEATURE) must be calculated and + *      stored. This token may be defined to a non-zero 8-bit value to set the maximum number of report IDs in a device which can be processed + *      and their sizes calculated/stored into the resultant processed report structure. If not defined, this defaults to the value indicated in + *      the HID.h file documentation. + * + *  \li <b>NO_CLASS_DRIVER_AUTOFLUSH</b> - (\ref Group_USBClassDrivers) - <i>All Architectures</i> \n + *      Many of the device and host mode class drivers automatically flush any data waiting to be written to an interface, when the corresponding + *      USB management task is executed. This is usually desirable to ensure that any queued data is sent as soon as possible once and new data is + *      constructed in the main program loop. However, if flushing is to be controlled manually by the user application via the *_Flush() commands, + *      the compile time token may be defined in the application's makefile to disable automatic flushing during calls to the class driver USB + *      management tasks. + * + * + *  \section Sec_TokenSummary_USBTokens General USB Driver Related Tokens + *  This section describes compile tokens which affect USB driver stack as a whole in the LUFA library. + * + *  \li <b>ORDERED_EP_CONFIG</b> - (\ref Group_EndpointManagement , \ref Group_PipeManagement) - <i>AVR8, UC3</i> \n + *      The USB AVRs do not allow for Endpoints and Pipes to be configured out of order; they <i>must</i> be configured in an ascending order to + *      prevent data corruption issues. However, by default LUFA employs a workaround to allow for unordered Endpoint/Pipe initialization. This compile + *      time token may be used to restrict the initialization order to ascending indexes only in exchange for a smaller compiled binary size. Use + *      caution when applied to applications using the library USB Class drivers; the user application must ensure that all endpoints and pipes are + *      allocated sequentially. + * + *  \li <b>USE_STATIC_OPTIONS</b>=<i>x</i> - (\ref Group_USBManagement) - <i>All Architectures</i> \n + *      By default, the USB_Init() function accepts dynamic options at runtime to alter the library behaviour, including whether the USB pad + *      voltage regulator is enabled, and the device speed when in device mode. By defining this token to a mask comprised of the USB options + *      mask defines usually passed as the Options parameter to USB_Init(), the resulting compiled binary can be decreased in size by removing + *      the dynamic options code, and replacing it with the statically set options. When defined, the USB_Init() function no longer accepts an + *      Options parameter. + * + *  \li <b>USB_DEVICE_ONLY</b> - (\ref Group_USBManagement) - <i>All Architectures</i> \n + *      For the USB AVR models supporting both device and host USB modes, the USB_Init() function contains a Mode parameter which specifies the + *      mode the library should be initialized to. If only device mode is required, the code for USB host mode can be removed from the binary to + *      save space. When defined, the USB_Init() function no longer accepts a Mode parameter. This define is irrelevant on smaller USB AVRs which + *      do not support host mode. + * + *  \li <b>USB_HOST_ONLY</b> - (\ref Group_USBManagement) - <i>All Architectures</i> \n + *      Same as USB_DEVICE_ONLY, except the library is fixed to USB host mode rather than USB device mode. Not available on some USB AVR models. + * + *  \li <b>USB_STREAM_TIMEOUT_MS</b>=<i>x</i> - (\ref Group_USBManagement) - <i>All Architectures</i> \n + *      When endpoint and/or pipe stream functions are used, by default there is a timeout between each transfer which the connected device or host + *      must satisfy, or the stream function aborts the remaining data transfer. This token may be defined to a non-zero 16-bit value to set the timeout + *      period for stream transfers, specified in milliseconds. If not defined, the default value specified in LowLevel.h is used instead. + * + *  \li <b>NO_LIMITED_CONTROLLER_CONNECT</b> - (\ref Group_Events) - <i>AVR8 Only</i> \n + *      On the smaller USB AVRs, the USB controller lacks VBUS events to determine the physical connection state of the USB bus to a host. In lieu of + *      VBUS events, the library attempts to determine the connection state via the bus suspension and wake up events instead. This however may be + *      slightly inaccurate due to the possibility of the host suspending the bus while the device is still connected. If accurate connection status is + *      required, the VBUS line of the USB connector should be routed to an AVR pin to detect its level, so that the \ref USB_DeviceState global + *      can be accurately set and the \ref EVENT_USB_Device_Connect() and \ref EVENT_USB_Device_Disconnect() events manually raised by the user application. + *      When defined, this token disables the library's auto-detection of the connection state by the aforementioned suspension and wake up events. + * + *  \li <b>NO_SOF_EVENTS</b> - (\ref Group_Events) - <i>All Architectures</i> \n + *      By default, there exists a LUFA application event for the start of each USB frame while the USB bus is not suspended in either host or device mode. + *      This event can be selectively enabled or disabled by calling the appropriate device or host mode function. When this compile time token is defined, + *      the ability to receive USB Start of Frame events via the \ref EVENT_USB_Device_StartOfFrame() or \ref EVENT_USB_Host_StartOfFrame() events is removed, + *      reducing the compiled program's binary size. + * + * + *  \section Sec_TokenSummary_USBDeviceTokens USB Device Mode Driver Related Tokens + *  This section describes compile tokens which affect USB driver stack of the LUFA library when used in Device mode. + * + *  \li <b>USE_RAM_DESCRIPTORS</b> - (\ref Group_StdDescriptors) - <i>AVR8 Only</i> \n + *      Define this token to indicate to the USB driver that all device descriptors are stored in RAM, rather than being located in any one + *      of the AVR's memory spaces. RAM descriptors may be desirable in applications where the descriptors need to be modified at runtime. + * + *  \li <b>USE_FLASH_DESCRIPTORS</b> - (\ref Group_StdDescriptors) - <i>AVR8 Only</i> \n + *      Similar to USE_RAM_DESCRIPTORS, but all descriptors are stored in the AVR's FLASH memory rather than RAM. + * + *  \li <b>USE_EEPROM_DESCRIPTORS</b> - (\ref Group_StdDescriptors) - <i>AVR8 Only</i> \n + *      Similar to USE_RAM_DESCRIPTORS, but all descriptors are stored in the AVR's EEPROM memory rather than RAM. + * + *  \li <b>NO_INTERNAL_SERIAL</b> - (\ref Group_StdDescriptors) - <i>All Architectures</i> \n + *      Some AVR models contain a unique serial number which can be used as the device serial number, while in device mode. This allows + *      the host to uniquely identify the device regardless of if it is moved between USB ports on the same computer, allowing allocated + *      resources (such as drivers, COM Port number allocations) to be preserved. This is not needed in many apps, and so the code that + *      performs this task can be disabled by defining this option and passing it to the compiler via the -D switch. + * + *  \li <b>FIXED_CONTROL_ENDPOINT_SIZE</b>=<i>x</i> - (\ref Group_EndpointManagement) - <i>All Architectures</i> \n + *      By default, the library determines the size of the control endpoint (when in device mode) by reading the device descriptor. + *      Normally this reduces the amount of configuration required for the library, allows the value to change dynamically (if + *      descriptors are stored in EEPROM or RAM rather than flash memory) and reduces code maintenance. However, this token can be + *      defined to a non-zero value instead to give the size in bytes of the control endpoint, to reduce the size of the compiled + *      binary. + * + *  \li <b>DEVICE_STATE_AS_GPIOR</b> - (\ref Group_Device) - <i>AVR8 Only</i> \n + *      One of the most frequently used global variables in the stack is the USB_DeviceState global, which indicates the current state of + *      the Device State Machine. To reduce the amount of code and time required to access and modify this global in an application, this token + *      may be defined to a value between 0 and 2 to fix the state variable into one of the three general purpose IO registers inside the AVR + *      reserved for application use. When defined, the corresponding GPIOR register should not be used within the user application except + *      implicitly via the library APIs. + * + *  \li <b>FIXED_NUM_CONFIGURATIONS</b>=<i>x</i> - (\ref Group_Device) - <i>All Architectures</i> \n + *      By default, the library determines the number of configurations a USB device supports by reading the device descriptor. This reduces + *      the amount of configuration required to set up the library, and allows the value to change dynamically (if descriptors are stored in + *      EEPROM or RAM rather than flash memory) and reduces code maintenance. However, this value may be fixed via this token in the project + *      makefile to reduce the compiled size of the binary at the expense of flexibility. + * + *  \li <b>CONTROL_ONLY_DEVICE</b> - (\ref Group_Device) - <i>All Architectures</i> \n + *      In some limited USB device applications, there are no device endpoints other than the control endpoint; i.e. all device communication + *      is through control endpoint requests. Defining this token will remove several features related to the selection and control of device + *      endpoints internally, saving space. Generally, this is usually only useful in (some) bootloaders and is best avoided. + * + *  \li <b>MAX_ENDPOINT_INDEX</b> - (\ref Group_Device) - <i>XMEGA Only</i> \n + *      Defining this value to the highest index (not address - this excludes the direction flag) endpoint within the device will restrict the + *      number of FIFOs created internally for the endpoint buffers, reducing the total RAM usage. + * + *  \li <b>INTERRUPT_CONTROL_ENDPOINT</b> - (\ref Group_USBManagement) - <i>All Architectures</i> \n + *      Some applications prefer to not call the USB_USBTask() management task regularly while in device mode, as it can complicate code significantly. + *      Instead, when device mode is used this token can be passed to the library via the -D switch to allow the library to manage the USB control + *      endpoint entirely via USB controller interrupts asynchronously to the user application. When defined, USB_USBTask() does not need to be called + *      when in USB device mode. + * + *  \li <b>NO_DEVICE_REMOTE_WAKEUP</b> - (\ref Group_Device) - <i>All Architectures</i> \n + *      Many devices do not require the use of the Remote Wakeup features of USB, used to wake up the USB host when suspended. On these devices, + *      the code required to manage device Remote Wakeup can be disabled by defining this token and passing it to the library via the -D switch. + * + *  \li <b>NO_DEVICE_SELF_POWER</b> - (\ref Group_Device) - <i>All Architectures</i> \n + *      USB devices may be bus powered, self powered, or a combination of both. When a device can be both bus powered and self powered, the host may + *      query the device to determine the current power source, via \ref USB_Device_CurrentlySelfPowered. For solely bus powered devices, this global + *      and the code required to manage it may be disabled by passing this token to the library via the -D switch. + * + * + *  \section Sec_TokenSummary_USBHostTokens USB Host Mode Driver Related Tokens + * + *  This section describes compile tokens which affect USB driver stack of the LUFA library when used in Host mode. + * + *  \li <b>HOST_STATE_AS_GPIOR</b> - (\ref Group_Host) - <i>AVR8 Only</i> \n + *      One of the most frequently used global variables in the stack is the USB_HostState global, which indicates the current state of + *      the Host State Machine. To reduce the amount of code and time required to access and modify this global in an application, this token + *      may be defined to a value between 0 and 2 to fix the state variable into one of the three general purpose IO registers inside the AVR + *      reserved for application use. When defined, the corresponding GPIOR register should not be used within the user application except + *      implicitly via the library APIs. + * + *  \li <b>USB_HOST_TIMEOUT_MS</b>=<i>x</i> - (\ref Group_Host) - <i>All Architectures</i> \n + *      When a control transfer is initiated in host mode to an attached device, a timeout is used to abort the transfer if the attached + *      device fails to respond within the timeout period. This token may be defined to a non-zero 16-bit value to set the timeout period for + *      control transfers, specified in milliseconds. If not defined, the default value specified in Host.h is used instead. + * + *  \li <b>HOST_DEVICE_SETTLE_DELAY_MS</b>=<i>x</i> - (\ref Group_Host) - <i>All Architectures</i> \n + *      Some devices require a delay of up to 5 seconds after they are connected to VBUS before the enumeration process can be started, or + *      they will fail to enumerate correctly. By placing a delay before the enumeration process, it can be ensured that the bus has settled + *      back to a known idle state before communications occur with the device. This token may be defined to a 16-bit value to set the device + *      settle period, specified in milliseconds. If not defined, the default value specified in Host.h is used instead. + * + *  \li <b>INVERTED_VBUS_ENABLE_LINE</b> - (\ref Group_Host) - <i>All Architectures</i> \n + *      If enabled, this will indicate that the USB target VBUS line polarity is inverted; i.e. it should be pulled low to enable VBUS to the + *      target, and pulled high to stop the target VBUS generation. + *      \n + *      \attention On AVR8 architecture devices, this compile time option requires \c NO_AUTO_VBUS_MANAGEMENT to be set. + * + *  \li <b>NO_AUTO_VBUS_MANAGEMENT</b> - (\ref Group_Host) - <i>All Architectures</i> \n + *      Disables the automatic management of VBUS to the target, i.e. automatic shut down in the even of an overcurrent situation. When enabled, VBUS + *      is enabled while the USB controller is initialized in USB Host mode. + */ + diff --git a/lib/lufa/LUFA/DoxygenPages/CompilingApps.txt b/lib/lufa/LUFA/DoxygenPages/CompilingApps.txt new file mode 100644 index 0000000000..08f81d2ba2 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/CompilingApps.txt @@ -0,0 +1,46 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** \page Page_CompilingApps Compiling the Demos, Bootloaders and Projects + * + *  The following details how to compile the included LUFA demos, applications and bootloaders using AVR-GCC. + * + *  \section Sec_CompilingApps_Prerequisites Prerequisites + *  Before you can compile any of the LUFA library code or demos, you will need a recent distribution of avr-libc (1.6.2+) + *  and the AVR-GCC (4.2+) compiler. A standard "coreutils" package for your system is also required for command line + *  compilation of LUFA based applications. + * + *  \subsection SSec_CompilingApps_PreqWindows Windows Prerequisites + *  On Windows, you will need a copy of the latest Atmel Toolchain (<a>http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORWINDOWS.aspx</a>), + *  either downloaded and installed as a standalone package, or installed as part of Atmel Studio. You will need to ensure + *  that the "bin" directory of the toolchain is available in your system's <b>PATH</b> environment variable. + * + *  In addition, you will need to install a ported version of the ZSH or BASH *nix shells, and a standard set of *nix + *  utilities such as <i>cut</i>, <i>find</i> and <i>sed</i>. These can be found in the "basic" system package of the + *  of the MinGW installer (<a>http://www.mingw.org</a>). Once installed, add the "msys\1.0\bin" of the MinGW installation + *  folder is added to your system's <b>PATH</b> environment variable. + * + *  \subsection SSec_CompilingApps_PreqLinux Linux Prerequisites + *  On Linux systems you will need to install the latest Linux distribution of the standalone Atmel Toolchain from the + *  Atmel website (<a>http://www.atmel.com/tools/ATMELAVRTOOLCHAINFORLINUX.aspx</a>), or use the latest avr-libc and avr-gcc packages + *  for your chosen distribution's package manager. For full device support, the Atmel standalone Toolchain package is recommended. + * + *  \section Sec_CompilingApps_Compiling Compiling a LUFA Application + *  Compiling the LUFA demos, applications and/or bootloaders is very simple. LUFA comes with makefile scripts for + *  each individual demo, bootloader and project folder, as well as scripts in the Demos/, Bootloaders/, Projects/ + *  and the LUFA root directory. Compilation of projects can be started from any of the above directories, with a build + *  started from an upper directory in the directory structure executing build of all child directories under it. This + *  means that while a build inside a particular demo directory will build only that particular demo, a build started from + *  the /Demos/ directory will build all LUFA demo projects sequentially. + * + *  To build a project from the source via the command line, the command <b>"make all"</b> should be executed from the command + *  line in the directory of interest. To remove compiled files (including the binary output, all intermediately files and all + *  diagnostic output files), execute <b>"make clean"</b>. Once a "make all" has been run and no errors were encountered, the + *  resulting binary will be located in the generated ".HEX" file. If your project makes use of pre-initialized EEPROM + *  variables, the generated ".EEP" file will contain the project's EEPROM data. + * + *  \see \ref Page_BuildSystem for information on the LUFA build system. + */ diff --git a/lib/lufa/LUFA/DoxygenPages/ConfiguringApps.txt b/lib/lufa/LUFA/DoxygenPages/ConfiguringApps.txt new file mode 100644 index 0000000000..15b660e927 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/ConfiguringApps.txt @@ -0,0 +1,157 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** \page Page_ConfiguringApps Configuring the Demos, Bootloaders and Projects + * + *  If the target microcontroller model, architecture, clock speed, board or other settings are different from the current + *  settings, they must be changed and the project recompiled from the source code before being programmed into the microcontroller. + *  Most project configuration options are located in the <tt>makefile</tt> build script inside each LUFA application's folder, + *  however some demo or application-specific configuration settings are located in one or more of the source files of the project. + *  See each project's individual documentation for application-specific configuration values. + * + *  Each project "makefile" contains all the script and configuration data required to compile each project. When opened with + *  any regular basic text editor such as Notepad or WordPad (ensure that the save format is a pure ASCII text format) the + *  build configuration settings may be altered. + * + *  \see \ref Page_BuildSystem for information on the LUFA build system. + * + *  \section Sec_ConfiguringApps_AppMakefileParams The Default Application Makefile Template + * + *  Below is a copy of the default LUFA application makefile, which can be used as a template for each application. + * + *  \verbinclude makefile_template + * + *  Inside each makefile, a number of configuration variables are listed with the syntax "<VARIABLE NAME> = <VALUE>". For + *  each application, the important standard variables which should be altered are: + * + *    - <b>MCU</b>, the target processor model + *    - <b>ARCH</b>, the target microcontroller architecture + *    - <b>BOARD</b>, the target board hardware + *    - <b>F_CPU</b>, the target CPU master clock frequency, after any prescaling + *    - <b>F_USB</b>, the target raw input clock to the USB module of the processor + *    - <b>OPTIMIZATION</b>, the level of optimization to compile with + *    - <b>TARGET</b>, the name of the target output binary and other files + *    - <b>SRC</b>, the list of source files to compile/assemble/link + *    - <b>LUFA_PATH</b>, the path to the LUFA library core source code + *    - <b>CC_FLAGS</b>, the common command line flags to pass to the C/C++ compiler, assembler and linker + *    - <b>LD_FLAGS</b>, the command line flags to pass to the linker + * + *  These values should be changed to reflect the build hardware. + * + *  \subsection SSec_ConfiguringApps_MCU The MCU Parameter + *  This parameter indicates the target microcontroller model for the compiled application. This should be set to the model of the target + *  microcontroller (such as the AT90USB1287, or the ATMEGA32U4), in all lower-case (e.g. "at90usb1287"). Note that not all demos support all the + *  microcontroller models and architectures, as they may make use of peripherals or modes only present in some devices. + * + *  For supported processor models, see \ref Page_DeviceSupport. + * + *  \subsection SSec_ConfiguringApps_ARCH The ARCH Parameter + *  This parameter indicates the target microcontroller architecture the library is to be compiled for. Different microcontroller + *  architectures require different source files to be compiled into the final binary, and so this option must be set to the correct + *  architecture for the selected platform. + * + *  For supported processor architectures, see \ref Page_DeviceSupport. + * + *  \subsection SSec_ConfiguringApps_BOARD The BOARD Parameter + *  This parameter indicates the target board hardware for the compiled application. Some LUFA library drivers are board-specific, + *  such as the LED driver, and the library needs to know the layout of the target board. If you are using one of the board models listed + *  on the main library page, change this parameter to the board name in all UPPER-case. + * + *  If you are not using any board-specific drivers in the LUFA library, or you are using a custom board layout, change this to read + *  "USER" (no quotes) instead of a standard board name. If the USER board type is selected and the application makes use of one or more + *  board-specific hardware drivers inside the LUFA library, then the appropriate stub drives files should be copied from the \c /CodeTemplates/DriverStubs/ + *  directory into a /Board/ folder inside the application directory, and the stub driver completed with the appropriate code to drive the + *  custom board's hardware. + * + *  For boards with built in hardware driver support within the LUFA library, see \ref Page_DeviceSupport. + * + *  \subsection SSec_ConfiguringApps_F_CPU The F_CPU Parameter + *  This parameter indicates the target microcontroller's main CPU clock frequency, in Hz. This is used by many libraries (and applications) for + *  timing related purposes, and should reflect the actual CPU speed after any prescaling or adjustments are performed. + * + *  \subsection SSec_ConfiguringApps_F_USB The F_USB Parameter + *  This parameter indicates the raw input clock frequency to the USB module within the microcontroller in Hz. This may be very different on some platforms + *  to the main CPU clock or other peripheral/bus clocks. + * + *    \note On AVR8 platforms, this must be equal to \c 8000000 or \c 16000000. + * + *    \note On XMEGA platforms, this must be equal to a multiple of 6000000 from \c 6000000 to \c 48000000. + * + *    \note On UC3 platforms, this must be equal to a multiple of 12000000 from \c 12000000 to \c 48000000. + * + *  \subsection SSec_ConfiguringApps_OPTIMIZATION The OPTIMIZATION Parameter + *  This parameter indicates the level of optimization to use when compiling the application. This will allow you to compile with an optimization level + *  supported by GCC, from <tt>0</tt> (no optimization) to <tt>3</tt> (fastest runtime optimization) or <tt>s</tt> (smallest size). + * + *  \subsection SSec_ConfiguringApps_TARGET The TARGET Parameter + *  This parameter indicates the application target name, which is used as the base filename for the build binary and debugging files. This will be the + *  name of the output files once linked together into the final application, ready to load into the target. + * + *  \subsection SSec_ConfiguringApps_SRC The SRC Parameter + *  This parameter indicates the source files used to compile the application, as a list of C (<tt>*.c</tt>), C++ (<tt>*.cpp</tt>) and Assembly (<tt>*.S</tt>) files. Note that + *  all assembly files must end in a <b>capital</b> .S extension, as lowercase .s files are reserved for GCC intermediate files. + * + *  \subsection SSec_ConfiguringApps_LUFA_PATH The LUFA_PATH Parameter + *  As each LUFA program requires the LUFA library source code to compile correctly, the application must know where the LUFA library is located. This + *  value specifies the path to the LUFA library core. This path may be relative or absolute, however note than even under Windows based systems the + *  forward-slash (/) path separator must be used. + * + *  \subsection SSec_ConfiguringApps_CC_FLAGS The CC_FLAGS Parameter + *  This parameter lists the compiler flags passed to the C/C++ compiler, the assembler and the linker. These are used as-is directly to GCC and thus + *  must match GCC's command line options as given in the GCC manual. This variable may be used to define tokens directly on the command line, enable or + *  disable warnings, adjust the target-specific tuning parameters or other options. + * + *  \subsection SSec_ConfiguringApps_LD_FLAGS The LD_FLAGS Parameter + *  This parameter lists the linker flags passed exclusively to the linker. These are used as-is directly to GCC and thus must match GCC's command line + *  linker options as given in the GCC manual. This variable may be used to create or relocate custom data sections, or enable linker specific behaviors. + * + * + *  \section Sec_ExampleAppConfig Example Application Makefile Configurations + *  Below is an example makefile for an AVR8 based AT90USB1287 running at 8MHz, to compile a program called "MyApplication": + *  \verbatim +    MCU          = at90usb1287 +    ARCH         = AVR8 +    BOARD        = NONE +    F_CPU        = 8000000 +    F_USB        = $(F_CPU) +    OPTIMIZATION = s +    TARGET       = MyApplication +    SRC          = MyApplication.c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) +    LUFA_PATH    = ../../../../LUFA +    CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ +    LD_FLAGS     = +    \endverbatim + * + *  Below is an example makefile for an XMEGA based ATXMEGA128A1U running at 32MHz, to compile a program called "MyApplication": + *  \verbatim +    MCU          = atxmega128a1u +    ARCH         = XMEGA +    BOARD        = NONE +    F_CPU        = 32000000 +    F_USB        = 48000000 +    OPTIMIZATION = s +    TARGET       = MyApplication +    SRC          = MyApplication.c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) +    LUFA_PATH    = ../../../../LUFA +    CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ +    LD_FLAGS     = +    \endverbatim + * + *  Below is an example makefile for a UC3 based AT32UC3A0512 running at 50MHz, to compile a program called "MyApplication": + *  \verbatim +    MCU          = uc3a0512 +    ARCH         = UC3 +    BOARD        = NONE +    F_CPU        = 50000000 +    F_USB        = 48000000 +    OPTIMIZATION = s +    TARGET       = MyApplication +    SRC          = MyApplication.c Descriptors.c $(LUFA_SRC_USB) $(LUFA_SRC_USBCLASS) +    LUFA_PATH    = ../../../../LUFA +    CC_FLAGS     = -DUSE_LUFA_CONFIG_HEADER -IConfig/ +    LD_FLAGS     = +    \endverbatim + */ diff --git a/lib/lufa/LUFA/DoxygenPages/DevelopingWithLUFA.txt b/lib/lufa/LUFA/DoxygenPages/DevelopingWithLUFA.txt new file mode 100644 index 0000000000..31b58fa2af --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/DevelopingWithLUFA.txt @@ -0,0 +1,23 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** + *  \page Page_DevelopingWithLUFA Developing With LUFA + * + *  This section of the manual contains information on LUFA development, such as Getting Started information, + *  information on compile-time tuning of the library and other developer-related sections. + * + *  <b>Subsections:</b> + *  \li \subpage Page_BuildSystem - The LUFA Buildsystem + *  \li \subpage Page_TokenSummary - Summary of Compile Time Tokens + *  \li \subpage Page_Migration - Migrating from an Older LUFA Version + *  \li \subpage Page_VIDPID - Allocated USB VID and PID Values + *  \li \subpage Page_OSDrivers - Operating System Driver Information + *  \li \subpage Page_BuildLibrary - Building as a Linkable Library + *  \li \subpage Page_WritingBoardDrivers - How to Write Custom Board Drivers + *  \li \subpage Page_SoftwareBootloaderStart - How to jump to the bootloader in software + */ + diff --git a/lib/lufa/LUFA/DoxygenPages/DeviceSupport.txt b/lib/lufa/LUFA/DoxygenPages/DeviceSupport.txt new file mode 100644 index 0000000000..cff2cda4b9 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/DeviceSupport.txt @@ -0,0 +1,424 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** + *  \page Page_DeviceSupport Device and Hardware Support + * + *  <b>Atmel Microcontrollers:</b> + *  \li \subpage Page_AVR8Support - Atmel AVR8 Support + *  \li \subpage Page_UC3Support - Atmel AVR32 UC3 Support + *  \li \subpage Page_XMEGASupport - Atmel XMEGA Support + */ + +/** + *  \page Page_AVR8Support Atmel 8-Bit AVR (AVR8) Support + * + *  \section Sec_AVR8Support_Devices Supported Microcontroller Models + * + *  Currently supported AVR8 models: + * + *  <table> + *  <tr> + *   <th width="150px">Part</th> + *   <th width="150px">USB Device Mode</th> + *   <th width="150px">USB Host Mode</th> + *  </tr> + *  <tr> + *   <td>AT90USB82</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATMEGA8U2</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>AT90USB162</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATMEGA16U2</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATMEGA16U4</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATMEGA32U2</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATMEGA32U4</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>AT90USB646</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>AT90USB647</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT90USB1286</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>AT90USB1287</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  </table> + * + *  \section Sec_AVR8Support_Boards Supported Atmel Boards + *  Currently supported Atmel AVR8 boards (see \ref Group_BoardTypes): + *   - AT90USBKEY + *   - ATAVRUSBRF01 + *   - EVK527 + *   - RZUSBSTICK + *   - STK525 + *   - STK526 + *   - XPLAIN (Original green board, <i>not</i> the newer blue XPLAINED family boards) + *   - Xplained-MINI + * + *  \section Sec_AVR8Support_ThirdParty Supported Third Party Boards + *  Currently supported third-party boards (see \ref Group_BoardTypes for makefile \c BOARD constant names): + *   - Adafruit U4 Breakout Board + *   - Arduino Leonardo + *   - Arduino Micro + *   - Arduino Uno + *   - Arduino Yun + *   - Bitwizard Multio and Big-Multio + *   - Busware BUI + *   - Busware CUL V3 + *   - Busware TUL + *   - DorkbotPDX Duce + *   - Fletchtronics Bumble-B (using manufacturer recommended peripheral layout) + *   - Kernel Concepts USBFOO + *   - Linnix UDIP + *   - MattairTech JM-DB-U2 + *   - Maximus USB + *   - Micropendous Boards (Micropendous-32U2, Micropendous-1, Micropendous-2) + *   - Microsin AVR-USB162 + *   - Minimus USB + *   - Olimex AVR-USB-162, AVR-USB-32U4 and AVR-USB-T32U4 Boards + *   - Olimex AVR-ISP-MK2 + *   - Paranoid Studio's US2AX (V1, V2 and V3 hardware revisions) + *   - PJRC Teensy (1.x and 2.x versions) + *   - Pololu A-Star Micro + *   - Rikus' U2S + *   - Sparkfun U2 Breakout Board + *   - Stange ISP Programmer Board + *   - TCNISO Blackcat USB JTAG + *   - Tempusdictum Benito + *   - Tom's USBTINY-MKII (all revisions and versions) + *   - Custom User Boards (with Board Drivers if desired, see \ref Page_WritingBoardDrivers) + */ + +/** + *  \page Page_UC3Support Atmel 32-Bit UC3 AVR (UC3) + * + *  \warning The AVR32 UC3 device support is currently <b>experimental</b>, and is included for preview purposes only. + * + *  \section Sec_UC3Support_Devices Supported Microcontroller Models + * + *  Currently supported UC3 models: + * + *  <table> + *  <tr> + *   <th width="150px">Part</th> + *   <th width="150px">USB Device Mode</th> + *   <th width="150px">USB Host Mode</th> + *  </tr> + *  <tr> + *   <td>AT32UC3A364</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A364S</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A464</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A464S</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3B064</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3B164</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A0128</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A1128</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A3128</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A3128S</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A4128</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A4128S</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3B0128</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3B1128</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A0256</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A1256</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A3256</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A3256S</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A4256</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A4256S</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3B0256</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3B1256</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A0512</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3A1512</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3B0512</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>AT32UC3B1512</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  </table> + * + *  \section Sec_UC3Support_Boards Supported Atmel Boards + * + *  Currently supported Atmel UC3 boards (see \ref Group_BoardTypes): + *   - EVK1100 + *   - EVK1101 + *   - EVK1104 + *   - UC3-A3 Xplained + * + *  \section Sec_UC3Support_ThirdParty Supported Third Party Boards + * + *  Currently supported third-party boards (see \ref Group_BoardTypes for makefile \c BOARD constant names): + *   - Custom User Boards (with Board Drivers if desired, see \ref Page_WritingBoardDrivers) + */ + +/** + *  \page Page_XMEGASupport Atmel USB XMEGA AVR (XMEGA) + * + *  \warning The XMEGA device support is currently <b>experimental</b> (incomplete and/or non-functional), and is included for preview purposes only. + * + *  \section Sec_XMEGASupport_Devices Supported Microcontroller Models + * + *  Currently supported XMEGA models: + * + *  <table> + *  <tr> + *   <th width="150px">Part</th> + *   <th width="150px">USB Device Mode</th> + *   <th width="150px">USB Host Mode</th> + *  </tr> + *  <tr> + *   <td>ATXMEGA16A4U</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA32A4U</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA64A4U</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA128A4U</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA64A3U</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA128A3U</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA192A3U</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA256A3U</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA256A3BU</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA128A1U</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA64B3</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA128B3</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA64B1</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA128B1</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA64C3</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA128C3</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA192C3</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA256C3</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA384C3</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA16C4</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  <tr> + *   <td>ATXMEGA32C4</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#EE0000">No</td> + *  </tr> + *  </table> + * + *  \section Sec_XMEGASupport_Boards Supported Atmel Boards + *  Currently supported Atmel XMEGA boards (see \ref Group_BoardTypes): + *   - XMEGA A3BU Xplained + *   - XMEGA B1 Xplained + *   - XMEGA C3 Xplained + * + *  \section Sec_XMEGASupport_ThirdParty Supported Third Party Boards + *  Currently supported third-party boards (see \ref Group_BoardTypes for makefile \c BOARD constant names): + *   - Custom User Boards (with Board Drivers if desired, see \ref Page_WritingBoardDrivers) + */ + diff --git a/lib/lufa/LUFA/DoxygenPages/DirectorySummaries.txt b/lib/lufa/LUFA/DoxygenPages/DirectorySummaries.txt new file mode 100644 index 0000000000..87b863c28b --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/DirectorySummaries.txt @@ -0,0 +1,80 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** \dir Platform + *  \brief Platform specific drivers. + * + *  This folder contains platform specific drivers and defines for various supported architectures. These may or may + *  not be used in a LUFA application, and are provided for convenience purposes. + * + *  \dir Drivers + *  \brief Library hardware and software drivers. + * + *  This folder contains all the library hardware and software drivers for each supported board, architecture and + *  microcontroller model. + * + *  \dir Drivers/Misc + *  \brief Miscellaneous driver files. + * + *  This folder contains drivers for aspects other than the USB interface, board hardware or microcontroller peripherals. + * + *  \dir Drivers/Peripheral + *  \brief Microcontroller peripheral driver files. + * + *  This folder contains drivers for various low level microcontroller peripherals, usually located on the microcontroller + *  die within the same physical chip. + * + *  \dir Drivers/USB + *  \brief USB controller peripheral driver files. + * + *  This folder contains the complete LUFA USB stack and controller files, including the core driver and stack, as well + *  as the USB class driver implementations. + * + *  \dir Drivers/USB/Core + *  \brief Core USB driver files. + * + *  This folder contains the core USB stack and controller driver files, to correctly implement USB functionality on the + *  target architecture and microcontroller model. This + * + *  \dir Drivers/USB/Class + *  \brief USB Class helper driver files. + * + *  This folder contains drivers for implementing functionality of standardized USB classes. These are not used directly by the library, + *  but provide a standard and library-maintained way of implementing functionality from some of the defined USB classes without extensive + *  development effort. Is is recommended that these drivers be used where possible to reduce maintenance of user applications. + * + *  \dir Drivers/USB/Class/Device + *  \brief USB Device Class helper driver files. + * + *  Device mode drivers for the standard USB classes. + * + *  \dir Drivers/USB/Class/Host + *  \brief USB Host Class helper driver files. + * + *  Host mode drivers for the standard USB classes. + * + *  \dir Drivers/Board + *  \brief Board hardware driver files. + * + *  This folder contains drivers for interfacing with the physical hardware on supported commercial boards, primarily from + *  the Atmel corporation. Header files in this folder should be included in user applications requiring the functionality of + *  hardware placed on supported boards. + * + *  \dir CodeTemplates + *  \brief Code templates for use in LUFA powered applications. + * + *  This contains code templates for board drivers, sample LUFA project makefiles and other similar templates that can be copied into + *  a LUFA powered application and modified to speed up development. + * + *  \dir CodeTemplates/DriverStubs + *  \brief Driver stub header files for custom boards, to allow the LUFA board drivers to operate. + * + *  This contains stub files for the LUFA board drivers. If the LUFA board drivers are used with board hardware other than those + *  directly supported by the library, the BOARD parameter of the application's makefile can be set to "USER", and these stub files + *  copied to the "/Board/" directory of the application's folder. When fleshed out with working driver code for the custom board, + *  the corresponding LUFA board APIs will work correctly with the non-standard board hardware. + */ + diff --git a/lib/lufa/LUFA/DoxygenPages/Donating.txt b/lib/lufa/LUFA/DoxygenPages/Donating.txt new file mode 100644 index 0000000000..68228ac944 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/Donating.txt @@ -0,0 +1,25 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** + *  \page Page_Donating Donating to Support This Project + * + *  \image html Images/Author.jpg "Dean Camera, LUFA Developer" + * + *  I am a software developer working on LUFA in my spare time. The development and support of this library requires + *  much effort from myself, as I am the sole developer, maintainer and supporter. Please consider donating a small + *  amount to support this and my future Open Source projects - All donations are <i>greatly</i> appreciated. + * + *  Note that commercial entities can remove the attribution portion of the LUFA license by a one-time fee - see + *  \ref Page_LicenseInfo for more details (<b>Note: Please do NOT pay this in advance through the donation link below - + *  contact author for payment details.</b>). + * + *  \htmlonly + *    \image html "http://www.pledgie.com/campaigns/6927.png" + *  \endhtmlonly + *  <a href="http://www.lufa-lib.org/donate">Donate to this project via PayPal</a> - Thanks in Advance! + */ + diff --git a/lib/lufa/LUFA/DoxygenPages/FutureChanges.txt b/lib/lufa/LUFA/DoxygenPages/FutureChanges.txt new file mode 100644 index 0000000000..af11863743 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/FutureChanges.txt @@ -0,0 +1,47 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + + /** \page Page_FutureChanges Future Changes +  * +  *  Below is a list of future changes which are proposed for the LUFA library, but not yet started/complete. +  *  This gives an unordered list of future changes which may be available in future releases of the library. +  *  If you have an item to add to this list, please contact the library author via email, the LUFA mailing list, +  *  or post your suggestion as an enhancement request to the project bug tracker. +  * +  *  <b>Targeted for Future Releases:</b> +  *  - Code Features +  *      -# Add hub support when in Host mode for multiple devices +  *      -# Investigate virtual hubs when in device mode instead of composite devices +  *      -# Re-add interrupt Pipe/Endpoint support +  *      -# Update stream APIs to use DMA transfers on supported architectures +  *      -# Pull out third party libraries into a separate folder and reference them as required +  *      -# Add a LUFA_YIELD macro for integration into a third-party RTOS +  *      -# Abstract out Mass Storage byte send/receive to prevent low level API use in projects +  *      -# Fix HID report parser usage support for array types +  *      -# Make HOST_DEVICE_SETTLE_DELAY_MS a global variable that can be changed +  *      -# Add MANDATORY_EVENT_FUNCTIONS compile time option +  *      -# Add watchdog support to the library and apps/bootloaders +  *      -# Limit the maximum size of control transfers +  *  - Testing/Verification +  *      -# Re-run USBIF test suite on all classes to formally verify operation +  *      -# Implement automated functional testing of all demos +  *  - Documentation/Support +  *      -# Add detailed overviews of how each demo works +  *      -# Add board overviews +  *      -# Write LUFA tutorials +  *  - Demos/Projects +  *      -# Add class driver support for Test and Measurement class +  *      -# Add class driver support for EEM class +  *      -# Add class driver support for ECM class +  *      -# Add class driver generic HID report host demo +  *      -# Implement flow control for USB to Serial project +  *  - Ports +  *      -# Port all demos to multiple architectures +  *      -# Finish USB XMEGA port +  *      -# Add AVR32 UC3C, UC3D and UC3L support +  *      -# Other (commercial) C compilers +  */ + diff --git a/lib/lufa/LUFA/DoxygenPages/GettingStarted.txt b/lib/lufa/LUFA/DoxygenPages/GettingStarted.txt new file mode 100644 index 0000000000..9ceec1e04e --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/GettingStarted.txt @@ -0,0 +1,37 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** \page Page_GettingStarted Getting Started + * + *  Getting started with LUFA is easy; read the content below to get on your way to your first LUFA powered application. + * + *  \section Sec_DemosOverview The LUFA Demo Applications + * + *  Out of the box, LUFA contains a large number of pre-made class demos for you to test, experiment with and + *  ultimately build upon for your own projects. All the demos (where possible) come pre-configured to build and + *  run correctly on the AT90USB1287 AVR microcontroller, mounted on the Atmel USBKEY board and running at an 8MHz + *  master clock. This is due to two reasons; one, it is the hardware the author possesses, and two, it is the most + *  popular Atmel USB demonstration board to date. To learn how to reconfigure, recompile and program the included + *  LUFA applications using different settings, see the subsections below. + * + *  \section Sec_ClassOrLowLevel Class Driver and Low Level Demos + * + *  Most of the included demos in the /Demos/ folder come in both ClassDriver and LowLevel varieties. If you are new + *  to LUFA, it is highly recommended that you look at the ClassDriver versions first, which use the pre-made USB + *  Class Drivers (\ref Group_USBClassDrivers) to simplify the use of the standard USB classes in user applications. + *  These demos give a basic but easy to use interface to the USB class used in the demo application, such as HID or + *  CDC. + * + *  Those needing absolute control over the class implementation can look at the LowLevel demos, which implement the + *  required USB class directly in the demo application using the lowest level LUFA APIs. + * + * + *  <b>Subsections:</b> + *  \li \subpage Page_ConfiguringApps - How to Configure the Included Demos, Projects and Bootloaders + *  \li \subpage Page_CompilingApps - How to Compile the Included Demos, Projects and Bootloaders + *  \li \subpage Page_ProgrammingApps - How to Program an AVR with the Included Demos, Projects and Bootloaders + */ + diff --git a/lib/lufa/LUFA/DoxygenPages/Groups.txt b/lib/lufa/LUFA/DoxygenPages/Groups.txt new file mode 100644 index 0000000000..2dfa4209d4 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/Groups.txt @@ -0,0 +1,38 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** \defgroup Group_BoardDrivers Board Drivers + * + *  \brief Functions, macros, variables, enums and types related to the control of physical board hardware. + */ + +/** \defgroup Group_PeripheralDrivers On-chip Peripheral Drivers + * + *  \brief Functions, macros, variables, enums and types related to the control of AVR subsystems. + */ + +/** \defgroup Group_MiscDrivers Miscellaneous Drivers + * + *  \brief Miscellaneous driver Functions, macros, variables, enums and types. + */ + +/** \defgroup Group_PlatformDrivers_AVR8 AVR8 + *  \ingroup Group_PlatformDrivers + * + *  \brief Drivers relating to the AVR8 architecture platform, such as clock setup and interrupt management. + */ + +/** \defgroup Group_PlatformDrivers_XMEGA XMEGA + *  \ingroup Group_PlatformDrivers + * + *  \brief Drivers relating to the XMEGA architecture platform, such as clock setup and interrupt management. + */ + +/** \defgroup Group_PlatformDrivers_UC3 UC3 + *  \ingroup Group_PlatformDrivers + * + *  \brief Drivers relating to the UC3 architecture platform, such as clock setup and interrupt management. + */ diff --git a/lib/lufa/LUFA/DoxygenPages/Images/Author.jpg b/lib/lufa/LUFA/DoxygenPages/Images/Author.jpg Binary files differnew file mode 100644 index 0000000000..e8f5541a0e --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/Images/Author.jpg diff --git a/lib/lufa/LUFA/DoxygenPages/Images/LUFA.png b/lib/lufa/LUFA/DoxygenPages/Images/LUFA.png Binary files differnew file mode 100644 index 0000000000..54fa1a6643 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/Images/LUFA.png diff --git a/lib/lufa/LUFA/DoxygenPages/Images/LUFA_thumb.png b/lib/lufa/LUFA/DoxygenPages/Images/LUFA_thumb.png Binary files differnew file mode 100644 index 0000000000..efa5386778 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/Images/LUFA_thumb.png diff --git a/lib/lufa/LUFA/DoxygenPages/KnownIssues.txt b/lib/lufa/LUFA/DoxygenPages/KnownIssues.txt new file mode 100644 index 0000000000..183036c483 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/KnownIssues.txt @@ -0,0 +1,234 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + + /** \page Page_KnownIssues Known Issues +  *  The following are known issues present in each official LUFA release. This list should contain all known +  *  issues in the library. Most of these issues should be corrected in the future release - see +  *  \ref Page_FutureChanges for a list of planned changes in future releases. +  * +  *  \section Sec_KnownIssues170418 Version 170418 +  *  - AVR8 Architecture +  *    - No known issues. +  *  - UC3 Architecture +  *    \warning The UC3 device support is currently <b>experimental</b> (incomplete and/or non-functional), and is included for preview purposes only. \n +  * +  *    - No demos, bootloaders or projects have been ported for the UC3 devices in the current release, +  *      although the architecture is supported in the LUFA core library. +  *    - DMA transfers to and from the USB controller are not yet implemented for this release. +  *    - The UC3C, UC3D and UC3L sub-families of UC3 are not currently supported by the library due to their +  *      altered USB controller design. +  *    - The various \c *_CreateStream() functions for creating standard \c <stdio.h> compatible virtual file +  *      streams are not available on the UC3 architecture, due to a lack of suitable library support. +  *  - XMEGA Architecture +  *    \warning The XMEGA device support is currently <b>experimental</b> (incomplete and/or non-functional), and is included for preview purposes only. +  * +  *    - Endpoints of more than 64 bytes are not currently supported in this release. +  *    - Isochronous endpoints are not currently supported in this release. As a result, the audio class +  *      cannot be used on XMEGA devices. +  *    - Multiple-bank endpoints are not currently supported in this release. +  *    - Early silicon revisions of the ATXMEGA128A1U are incompatible with LUFA, due to their various errata +  *      relating to the USB controller. +  *  - Architecture Independent +  *    - The LUFA library is not watchdog aware, and thus timeouts are possible if short periods are used +  *      and a lengthy USB operation is initiated. +  *    - No LUFA provided driver INF files for Windows are signed, and thus may fail to install on systems where driver signing is enforced (e.g. Windows 8/10). +  *  - Build System +  *    - No known issues. +  *  - Atmel Studio Integration +  *    - Not all devices are listed in the "Supported Parts" screen when selecting a device. To select an alternative device, change the "Show Device" drop-down to "All Parts". +  *    - When switching boards after changing the device selection, a second conflicting \c BOARD symbol definition can be created that prevents successful compilation. To fix, open the project properties window (<i>Project->Project {name} Properties...</i> menu item), click the "Toolchain" tab, click "Symbols" under the "AVR/GNU C Compiler" section and remove the incorrect definition. +  * +  *  \section Sec_KnownIssues151115 Version 151115 +  *  - AVR8 Architecture +  *    - No known issues. +  *  - UC3 Architecture +  *    \warning The UC3 device support is currently <b>experimental</b> (incomplete and/or non-functional), and is included for preview purposes only. \n +  * +  *    - No demos, bootloaders or projects have been ported for the UC3 devices in the current release, +  *      although the architecture is supported in the LUFA core library. +  *    - DMA transfers to and from the USB controller are not yet implemented for this release. +  *    - The UC3C, UC3D and UC3L sub-families of UC3 are not currently supported by the library due to their +  *      altered USB controller design. +  *    - The various \c *_CreateStream() functions for creating standard \c <stdio.h> compatible virtual file +  *      streams are not available on the UC3 architecture, due to a lack of suitable library support. +  *  - XMEGA Architecture +  *    \warning The XMEGA device support is currently <b>experimental</b> (incomplete and/or non-functional), and is included for preview purposes only. +  * +  *    - Endpoints of more than 64 bytes are not currently supported in this release. +  *    - Isochronous endpoints are not currently supported in this release. As a result, the audio class +  *      cannot be used on XMEGA devices. +  *    - Multiple-bank endpoints are not currently supported in this release. +  *    - Early silicon revisions of the ATXMEGA128A1U are incompatible with LUFA, due to their various errata +  *      relating to the USB controller. +  *  - Architecture Independent +  *    - The LUFA library is not watchdog aware, and thus timeouts are possible if short periods are used +  *      and a lengthy USB operation is initiated. +  *    - No LUFA provided driver INF files for Windows are signed, and thus may fail to install on systems where driver signing is enforced (e.g. Windows 8). +  *  - Build System +  *    - No known issues. +  *  - Atmel Studio Integration +  *    - Not all devices are listed in the "Supported Parts" screen when selecting a device. To select an alternative device, change the "Show Device" drop-down to "All Parts". +  *    - When switching boards after changing the device selection, a second conflicting \c BOARD symbol definition can be created that prevents successful compilation. To fix, open the project properties window (<i>Project->Project {name} Properties...</i> menu item), click the "Toolchain" tab, click "Symbols" under the "AVR/GNU C Compiler" section and remove the incorrect definition. +  * +  *  \section Sec_KnownIssues140928 Version 140928 +  *  - AVR8 Architecture +  *    - No known issues. +  *  - UC3 Architecture +  *    \warning The UC3 device support is currently <b>experimental</b> (incomplete and/or non-functional), and is included for preview purposes only. \n +  * +  *    - No demos, bootloaders or projects have been ported for the UC3 devices in the current release, +  *      although the architecture is supported in the LUFA core library. +  *    - DMA transfers to and from the USB controller are not yet implemented for this release. +  *    - The UC3C, UC3D and UC3L sub-families of UC3 are not currently supported by the library due to their +  *      altered USB controller design. +  *    - The various \c *_CreateStream() functions for creating standard \c <stdio.h> compatible virtual file +  *      streams are not available on the UC3 architecture, due to a lack of suitable library support. +  *  - XMEGA Architecture +  *    \warning The XMEGA device support is currently <b>experimental</b> (incomplete and/or non-functional), and is included for preview purposes only. +  * +  *    - Endpoints of more than 64 bytes are not currently supported in this release. +  *    - Isochronous endpoints are not currently supported in this release. As a result, the audio class +  *      cannot be used on XMEGA devices. +  *    - Multiple-bank endpoints are not currently supported in this release. +  *    - Early silicon revisions of the ATXMEGA128A1U are incompatible with LUFA, due to their various errata +  *      relating to the USB controller. +  *  - Architecture Independent +  *    - The LUFA library is not watchdog aware, and thus timeouts are possible if short periods are used +  *      and a lengthy USB operation is initiated. +  *    - No LUFA provided driver INF files for Windows are signed, and thus may fail to install on systems where driver signing is enforced (e.g. Windows 8). +  *  - Build System +  *    - No known issues. +  *  - Atmel Studio Integration +  *    - Not all devices are listed in the "Supported Parts" screen when selecting a device. To select an alternative device, change the "Show Device" drop-down to "All Parts". +  *    - When switching boards after changing the device selection, a second conflicting \c BOARD symbol definition can be created that prevents successful compilation. To fix, open the project properties window (<i>Project->Project {name} Properties...</i> menu item), click the "Toolchain" tab, click "Symbols" under the "AVR/GNU C Compiler" section and remove the incorrect definition. +  * +  *  \section Sec_KnownIssues140302 Version 140302 +  *  - AVR8 Architecture +  *    - No known issues. +  *  - UC3 Architecture +  *    \warning The UC3 device support is currently <b>experimental</b> (incomplete and/or non-functional), and is included for preview purposes only. \n +  * +  *    - No demos, bootloaders or projects have been ported for the UC3 devices in the current release, +  *      although the architecture is supported in the LUFA core library. +  *    - DMA transfers to and from the USB controller are not yet implemented for this release. +  *    - The UC3C, UC3D and UC3L sub-families of UC3 are not currently supported by the library due to their +  *      altered USB controller design. +  *    - The various \c *_CreateStream() functions for creating standard \c <stdio.h> compatible virtual file +  *      streams are not available on the UC3 architecture, due to a lack of suitable library support. +  *  - XMEGA Architecture +  *    \warning The XMEGA device support is currently <b>experimental</b> (incomplete and/or non-functional), and is included for preview purposes only. +  * +  *    - Endpoints of more than 64 bytes are not currently supported in this release. +  *    - Isochronous endpoints are not currently supported in this release. As a result, the audio class +  *      cannot be used on XMEGA devices. +  *    - Multiple-bank endpoints are not currently supported in this release. +  *    - Early silicon revisions of the ATXMEGA128A1U are incompatible with LUFA, due to their various errata +  *      relating to the USB controller. +  *  - Architecture Independent +  *    - The LUFA library is not watchdog aware, and thus timeouts are possible if short periods are used +  *      and a lengthy USB operation is initiated. +  *    - No LUFA provided driver INF files for Windows are signed, and thus may fail to install on systems where driver signing is enforced (e.g. Windows 8). +  *  - Build System +  *    - No known issues. +  *  - Atmel Studio Integration +  *    - Not all devices are listed in the "Supported Parts" screen when selecting a device. To select an alternative device, change the "Show Device" drop-down to "All Parts". +  *    - When switching boards after changing the device selection, a second conflicting BOARD symbol definition can be created that prevents successful compilation. To fix, open the project properties window (<i>Project->Project {name} Properties...</i> menu item), click the Toolchain tab, click "Symbols" under the "AVR/GNU C Compiler" section and remove the incorrect definition. +  * +  *  \section Sec_KnownIssues130901 Version 130901 +  *  - AVR8 Architecture +  *    - No known issues. +  *  - UC3 Architecture +  *    \warning The UC3 device support is currently <b>experimental</b> (incomplete and/or non-functional), and is included for preview purposes only. \n +  * +  *    - No demos, bootloaders or projects have been ported for the UC3 devices in the current release, +  *      although the architecture is supported in the LUFA core library. +  *    - DMA transfers to and from the USB controller are not yet implemented for this release. +  *    - The UC3C, UC3D and UC3L sub-families of UC3 are not currently supported by the library due to their +  *      altered USB controller design. +  *    - The various \c *_CreateStream() functions for creating standard \c <stdio.h> compatible virtual file +  *      streams are not available on the UC3 architecture, due to a lack of suitable library support. +  *  - XMEGA Architecture +  *    \warning The XMEGA device support is currently <b>experimental</b> (incomplete and/or non-functional), and is included for preview purposes only. +  * +  *    - Endpoints of more than 64 bytes are not currently supported in this release. +  *    - Isochronous endpoints are not currently supported in this release. As a result, the audio class +  *      cannot be used on XMEGA devices. +  *    - Multiple-bank endpoints are not currently supported in this release. +  *    - Early silicon revisions of the ATXMEGA128A1U are incompatible with LUFA, due to their various errata +  *      relating to the USB controller. +  *  - Architecture Independent +  *    - The LUFA library is not watchdog aware, and thus timeouts are possible if short periods are used +  *      and a lengthy USB operation is initiated. +  *    - No LUFA provided driver INF files for Windows are signed, and thus may fail to install on systems where driver signing is enforced (e.g. Windows 8). +  *  - Build System +  *    - No known issues. +  *  - Atmel Studio Integration +  *    - Not all devices are listed in the "Supported Parts" screen when selecting a device. To select an alternative device, change the "Show Device" drop-down to "All Parts". +  *    - When switching boards after changing the device selection, a second conflicting BOARD symbol definition can be created that prevents successful compilation. To fix, open the project properties window (<i>Project->Project {name} Properties...</i> menu item), click the Toolchain tab, click "Symbols" under the "AVR/GNU C Compiler" section and remove the incorrect definition. +  * +  *  \section Sec_KnownIssues130303 Version 130303 +  *  - AVR8 Architecture +  *    - No known issues. +  *  - UC3 Architecture +  *    \warning The UC3 device support is currently <b>experimental</b> (incomplete and/or non-functional), and is included for preview purposes only. \n +  * +  *    - No demos, bootloaders or projects have been ported for the UC3 devices in the current release, +  *      although the architecture is supported in the LUFA core library. +  *    - DMA transfers to and from the USB controller are not yet implemented for this release. +  *    - The UC3C, UC3D and UC3L sub-families of UC3 are not currently supported by the library due to their +  *      altered USB controller design. +  *    - The various \c CreateStream() functions for creating standard \c <stdio.h> compatible virtual file +  *      streams are not available on the UC3 architecture, due to a lack of suitable library support. +  *  - XMEGA Architecture +  *    \warning The XMEGA device support is currently <b>experimental</b> (incomplete and/or non-functional), and is included for preview purposes only. +  * +  *    - No demos, bootloaders or projects have been ported for the XMEGA devices in the current release, +  *      although the architecture is supported in the LUFA core library. +  *    - Endpoints of more than 64 bytes are not currently supported in this release. +  *    - Isochronous endpoints are not currently supported in this release. As a result, the audio class +  *      cannot be used on XMEGA devices. +  *    - Multiple-bank endpoints are not currently supported in this release. +  *    - Early revisions of the ATXMEGA128A1U are incompatible with LUFA, due to their various errata +  *      relating to the USB controller. +  *  - Architecture Independent +  *    - The LUFA library is not watchdog aware, and thus timeouts are possible if short periods are used +  *      and a lengthy USB operation is initiated. +  *    - No LUFA provided driver INF files for Windows are signed, and thus may fail to install on systems where driver signing is enforced (e.g. Windows 8). +  *  - Build System +  *    - No known issues. +  * +  *  \section Sec_KnownIssues120730 Version 120730 +  *  - AVR8 Architecture +  *    - No known issues. +  *  - UC3 Architecture +  *    \warning The UC3 device support is currently <b>experimental</b> (incomplete and/or non-functional), and is included for preview purposes only. \n +  * +  *    - No demos, bootloaders or projects have been ported for the UC3 devices in the current release, +  *      although the architecture is supported in the LUFA core library. +  *    - DMA transfers to and from the USB controller are not yet implemented for this release. +  *    - The UC3C, UC3D and UC3L sub-families of UC3 are not currently supported by the library due to their +  *      altered USB controller design. +  *    - The various \c CreateStream() functions for creating standard \c <stdio.h> compatible virtual file +  *      streams are not available on the UC3 architecture, due to a lack of suitable library support. +  *  - XMEGA Architecture +  *    \warning The XMEGA device support is currently <b>experimental</b> (incomplete and/or non-functional), and is included for preview purposes only. +  * +  *    - No demos, bootloaders or projects have been ported for the XMEGA devices in the current release, +  *      although the architecture is supported in the LUFA core library. +  *    - Endpoints of more than 64 bytes are not currently supported in this release. +  *    - Isochronous endpoints are not currently supported in this release. As a result, the audio class +  *      cannot be used on XMEGA devices. +  *    - Multiple-bank endpoints are not currently supported in this release. +  *    - Early revisions of the ATXMEGA128A1U are incompatible with LUFA, due to their various errata +  *      relating to the USB controller. +  *  - Architecture Independent +  *    - The LUFA library is not watchdog aware, and thus timeouts are possible if short periods are used +  *      and a lengthy USB operation is initiated. +  *    - No LUFA provided driver INF files for Windows are signed, and thus may fail to install on systems where driver signing is enforced (e.g. Windows 8). +  *  - Build System +  *    - No known issues. +  */ + diff --git a/lib/lufa/LUFA/DoxygenPages/LUFAPoweredProjects.txt b/lib/lufa/LUFA/DoxygenPages/LUFAPoweredProjects.txt new file mode 100644 index 0000000000..fa94add496 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/LUFAPoweredProjects.txt @@ -0,0 +1,226 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** \page Page_LUFAPoweredProjects User Projects Powered by LUFA + * + *  LUFA is currently in use all around the world, in many applications both commercial and non-commercial. Below is a + *  list of known public LUFA powered projects, which all use the LUFA library in some way. Feel free to visit each project's + *  home page for more information on each project. + * + *  If you have a project that you would like to add to this list, please contact me via the details on the main page of this + *  documentation. + * + *  \section Sec_BoardsUsingLUFA AVR-USB Development Boards Using LUFA + * + *  The following is a list of known AVR USB development boards, which recommend using LUFA for the USB stack. Some of these + *  are open design, and all are available for purchase as completed development boards suitable for project development. + * + *  \li AVR-USB-162, a USBKEY-like development board for the AT90USB162: http://olimex.com/dev/avr-usb-162.html + *  \li Benito #7, a no-frills USB board: http://www.dorkbotpdx.org/wiki/benito + *  \li Duce, the successor to the Benito #7: http://dorkbotpdx.org/wiki/duce + *  \li JM-DB-U2, an ATMEGA32U2 development board: http://u2.mattair.net/index.html + *  \li Micropendous, an open design/source set of AVR USB development boards: http://micropendous.org/ + *  \li Microsin AVR-USB162 breakout board, a DIY AT90USB162 development board: http://microsin.ru/content/view/685/44/ + *  \li Minimus USB, a board specially designed for PSGroove: http://www.minimususb.com/ + *  \li Nanduino, a do-it-yourself AT90USB162 board: http://www.makestuff.eu/wordpress/?page_id=569 + *  \li Sparkfun ATMEGA8U2 breakout board: http://www.sparkfun.com/products/10277 + *  \li Teensy and Teensy++, two other AVR USB development boards: http://www.pjrc.com/teensy/index.html + *  \li U2DIL/U4DIL, a set of DIP layout USB AVR boards: http://www.reworld.eu/re/en/products/u2dil/ + *  \li USB2AX, a tiny USB to serial converter board: http://paranoidstudio.assembla.com/wiki/show/paranoidstudio/USB2AX + *  \li USBFOO 2, AT90USB162 based development board: http://shop.kernelconcepts.de/product_info.php?products_id=102 + * + *  \section Sec_LUFAProjects Projects Using LUFA (Hobbyist) + * + *  The following are known hobbyist projects using LUFA. Most are open source, and show off interesting ways that the LUFA library + *  can be incorporated into many different applications. + * + *  \li Accelerometer Game Joystick: http://www.crictor.co.il/he/episodes/joystick/ + *  \li Adjacent Reality Motion Tracker: http://www.adjacentreality.org/ + *  \li AD9833 based USB Function Generator: http://tuomasnylund.fi/drupal6/content/ad9833-based-usb-function-generator + *  \li AERY development platform for the AVR32 devices: http://www.aery32.com/ + *  \li AM Radio transmitter: http://amcinnes.info/2012/uc_am_xmit/ + *  \li Arcade Controller: http://fletchtronics.net/arcade-controller-made-petunia + *  \li Arcade Joystick: http://jamie.lentin.co.uk/embedded/arcade-joystick/ + *  \li AttoBasic AVR BASIC interpreter: http://cappels.org/dproj/AttoBasic_Home/AttoBasic_Home.html + *  \li AVR USB Modem, a 3G Wireless Modem host: http://code.google.com/p/avrusbmodem/ + *  \li Bicycle POV: http://www.code.google.com/p/bicycleledpov/ + *  \li Bluetooth Explorerbot: http://code.google.com/p/bluetooth-explorerbot/ + *  \li Bus Ninja, an AVR clone of the popular BusPirate project: http://blog.hodgepig.org/busninja/ + *  \li CAMTRIG, a remote Camera Trigger device: http://code.astraw.com/projects/motmot/camtrig + *  \li ChameleonMini, a smart card emulator: https://github.com/skuep/ChameleonMini + *  \li CD Driver Emulator Dongle for ISO Files: http://cdemu.blogspot.com/ + *  \li ChipWhisperer, a signal capture device: https://www.assembla.com/spaces/chipwhisperer/wiki/ChipWhisperer_Rev2_Capture_Hardware + *  \li ClockTamer, a configurable clock generator: http://code.google.com/p/clock-tamer/ + *  \li Collection of alternative Arduino Uno firmwares: http://hunt.net.nz/users/darran/ + *  \li Computer controlled LED matrix (Russian): http://we.easyelectronics.ru/AVR/nebolshoy-primer-s-lufa-hidapi.html + *  \li CULFW, a 868MHz RF packet encoder/decoder: http://www.koeniglich.de/culfw/culfw.html + *  \li Dashkey, a custom PC keyboard controller: http://geekhack.org/showwiki.php?title=Island:19096 + *  \li DIY PS3 controller emulator: https://code.google.com/p/diyps3controller/ + *  \li EMuSer, a USB-RS422 adapter for E-Mu samplers: http://www.emxp.net/EMuSer.htm + *  \li EQ Track, a telescope mount controller: http://sourceforge.net/projects/eqtrack/ + *  \li Estick JTAG, an ARM JTAG debugger: http://code.google.com/p/estick-jtag/ + *  \li "Fingerlicking Wingdinger" (WARNING: Bad language if no Javascript), a MIDI controller: http://noisybox.net/electronics/wingdinger/ + *  \li Flyatar, a real-time fly tracking system: https://github.com/peterpolidoro/Flyatar + *  \li FootJoy, a 22 button, 6-axis josystick with keyboard and mouse modes: https://bitbucket.org/sirbrialliance/foot-joy/ + *  \li Gamecube controller to USB adapter: https://www.facebook.com/media/set/?set=a.10150202447076304.310536.688776303&l=df53851c50 + *  \li Garmin GPS USB to NMEA standard serial sentence translator: http://github.com/nall/garmin-transmogrifier/tree/master + *  \li Geiger Counter with USB interface: http://www.hforsten.com/i-made-a-geiger-counter.html + *  \li Generic HID Device Creator: http://generichid.sourceforge.net/ + *  \li Generic HID Open Source Framework: http://www.waitingforfriday.com/index.php/USB_Generic_HID_Open_Source_Framework_for_Atmel_AVR_and_Windows + *  \li Ghetto Drum, a MIDI drum controller: http://noisybox.net/art/gdrum/ + *  \li GPS enabled lap timer for vehicles: http://www.assembla.com/code/ironlung/subversion/nodes/trunk/LapTimer + *  \li GSynth, an 8-bit sound synthesizer: https://github.com/gcielniak/GSynth + *  \li Gumbi, a Python library and USB GPIO controller: https://code.google.com/p/gumbi/ + *  \li Hardware Volume Control: https://github.com/davidk/hw-volume-control + *  \li Hiduino, a USB-MIDI replacement firmware for the Arduino Uno: http://code.google.com/p/hiduino/ + *  \li HoodLoader2, an Arduino Uno enhanced USB AVR coprocessor firmware: https://github.com/NicoHood/HoodLoader2 + *  \li IBM capacitive keybord replacement controller: http://downloads.cornall.co/ibm-capsense-usb-web/ibm-capsense-usb.html + *  \li Ikea RGB LED USB modification: http://slashhome.se/p/projects/id/ikea_dioder_usb/#project + *  \li IR electricity meter monitor: http://sourceforge.net/projects/irmetermon/ + *  \li IR Remote to Keyboard decoder: http://netzhansa.blogspot.com/2010/04/our-living-room-hi-fi-setup-needs-mp3.html + *  \li Jukebox panic button: http://thinkl33t.co.uk/the-panic-button + *  \li Kinesis replacement firmware: https://github.com/chrisandreae/kinesis-firmware + *  \li LED Panel controller: http://projects.peterpolidoro.net/caltech/panelscontroller/panelscontroller.htm + *  \li Linux Secure Storage Dongle: http://github.com/TomMD/teensy + *  \li LUFA powered DDR dance mat (French): http://logicien-parfait.fr/dokuwiki/doku.php?id=projet:ddr_repair + *  \li Macintosh SIMM ROM Programmer: https://code.google.com/p/mac-rom-simm-programmer/ + *  \li MakeTV Episode Dispenser: http://www.youtube.com/watch?v=BkWUi18hl3g + *  \li Mec64,a Commodore 64 keyboard: http://deskthority.net/workshop-f7/mec64-keyboard-t4522.html + *  \li MidiMonster, a USB-to-MIDI gateway board: http://www.dorkbotpdx.org/wiki/midimonster + *  \li MIDI Theremin: http://baldwisdom.com/usb-midi-controller-theremin-style-on-arduino-uno/ + *  \li MIDI interface hack of a toy Guitar: http://blog.x37v.info/2011/06/26/toy-guitar-hacked-midi-conroller + *  \li MiniBloq, a graphical Ardunio programming environment : http://minibloq.org/ + *  \li MiXley, a port of the Teacup 3D printer firmware for the USB AVRs: http://codaset.com/michielh/mixley + *  \li Mobo 4.3, a USB controlled all band (160-10m) HF SDR transceiver: http://sites.google.com/site/lofturj/mobo4_3 + *  \li Moco, a native Arduino Uno MIDI replacement firmware: http://web.mac.com/kuwatay/morecat_lab./MocoLUFA.html + *  \li Monash ECSE Smart Packet Radio Testbed: http://www.ecse.monash.edu.au/twiki/bin/view/WSRNLab/SmartPacketRadio + *  \li Motherboard BIOS flasher: http://www.coreboot.org/InSystemFlasher + *  \li Multi-button Joystick (French): http://logicien-parfait.fr/dokuwiki/doku.php?id=projet:joystick + *  \li Music Playing Alarm Clock (Tutorial): http://www.instructables.com/id/Music-Playing-Alarm-Clock/ + *  \li Nehebkau, Laptop Controlled Keyboard and Mouse: http://www.frank-zhao.com/cache/nehebkau.php + *  \li NeroJTAG, a JTAG dongle: https://github.com/makestuff/neroJtag + *  \li NES Controller USB modification: https://github.com/nfd/nes_adapter + *  \li Nikon wireless camera remote control (Norwegian): http://hekta.org/~hpe1119/ + *  \li Nintendo Four-Score, USB NES 4-player controller adapter: http://www.waitingforfriday.com/index.php/Nintendo_Four_Score_USB + *  \li Numpad keyboard: http://tuomasnylund.fi/drupal6/content/usb-cherry-mx-numpad + *  \li Opendous-JTAG, an open source ARM JTAG debugger: http://code.google.com/p/opendous-jtag/ + *  \li Openkubus, an open source hardware-based authentication dongle: http://code.google.com/p/openkubus/ + *  \li Orbee, a USB connected RGB Orb for notifications: http://www.franksworkshop.com.au/Electronics/Orbee/Orbee.htm + *  \li Password keyring: http://owlsan.blogspot.no/2014/06/keyring-project-version-10.html + *  \li Picade alternative firmware, a retro Arcade controller/cabinet: https://github.com/rktrlng/picade_lufa + *  \li PPM signal generator over USB: https://github.com/G33KatWork/USBPPM + *  \li Programmable keyboard controller: http://41j.com/blog/2011/10/a-programmable-keyboard-controller/ + *  \li Programmable XBOX controller: http://richard-burke.dyndns.org/wordpress/pan-galactic-gargantuan-gargle-brain-aka-xbox-360-usb-controller/ + *  \li Project Surface, a touch interface controller for Windows 8: https://code.google.com/p/project-surface/ + *  \li PSGroove, a Playstation 3 Homebrew dongle: http://github.com/psgroove + *  \li PS/2 to USB adapter: https://github.com/makestuff/p2ukbd + *  \li RaspiFace, an Arduino platform bridge for the Raspberry Pi: http://www.raspiface.com/ + *  \li Reflow oven controller: http://danstrother.com/2011/01/15/reflow-oven-controller/ + *  \li RFPirate, a RF experimentation platform: https://github.com/ebuller/RF-Pirate + *  \li RF Power Meter, based on the AD8307 log amp: https://sites.google.com/site/lofturj/ad8307-power-meter + *  \li RF Transceiver using the MRF49XA: http://alternet.us.com/?page_id=1494 + *  \li SD Card reader: http://elasticsheep.com/2010/04/teensy2-usb-mass-storage-with-an-sd-card/ + *  \li SDR1, a Software Defined Radio firmware: https://code.google.com/p/sdr-mk1/ + *  \li SEGA Megadrive/Genesis Development Cartridge: http://www.makestuff.eu/wordpress/?page_id=398 + *  \li Serial Line bus analyser: http://www.pjrc.com/teensy/projects/SerialAnalyzer.html + *  \li Simple USB LED Controller (SULC): https://github.com/scottbez1/sulc + *  \li SNES custom FLASH ROM: http://electrifiedfoolingmachine.co/?page_id=633 + *  \li Smartcard Detective: https://code.google.com/p/smartcarddetective/ + *  \li SmartportVHD Apple II Mass Storage adapter: http://pcedric3.free.fr/SmartportVHD/ + *  \li Single LED Matrix Display: http://guysoft.wordpress.com/2009/10/08/bumble-b/ + *  \li Simple USB LED Controller: https://github.com/scottbez1/sulc + *  \li Stripe Snoop, a Magnetic Card reader: http://www.ossguy.com/ss_usb/ + *  \li Stylophone, with USB MIDI connectivity: http://www.waitingforfriday.com/index.php/Stylophone_Studio_5 + *  \li Teensy SD Card .WAV file player: http://elasticsheep.com/2010/04/teensy2-usb-wav-player-part-1/ + *  \li Touch It (Fabulously), presumably art: http://touch.it.fa.bulo.us/ly/ + *  \li Touchscreen Input Device: http://capnstech.blogspot.com/2010/07/touchscreen-update.html + *  \li UDFS, a BBC Micro USB disk filing system: https://github.com/makestuff/udfs + *  \li Universal USB AVR Module: http://usbavr.bplaced.net/ + *  \li USB2AX, a USB to Dynamixel network adapter: http://paranoidstudio.assembla.com/wiki/show/paranoidstudio/USB2AX + *  \li USBPass, a USB password keeper: http://sroz.net/projects/usbpass/ + *  \li USB Business Card: http://www.limpkin.fr/index.php?post/2012/09/15/My-new-business-card + *  \li USB Function Generator: http://tuomasnylund.fi/drupal6/content/ad9833-based-usb-function-generator + *  \li USB Infrared Receiver/Transmitter: http://vaton4.web2001.cz/ + *  \li USB Interface for Playstation Portable Devices: http://forums.ps2dev.org/viewtopic.php?t=11001 + *  \li USB MIDI to DMX controller: http://github.com/hanshuebner/miDiMX + *  \li USB Mood Light: https://github.com/hsbp/usb_moodlight + *  \li USB powered Geiger Counter: http://uhrheber.wordpress.com/2011/04/28/a-usb-powered-geiger-counter-for-the-z2-and-other-computers/ + *  \li Userial, a USB to Serial converter with SPI, I2C and other protocols: http://www.tty1.net/userial/ + *  \li Wii Classic Controller to USB converter: https://github.com/crazyiop/wii-classic-2-usb + *  \li Wireless MIDI Guitar system: http://www.ise.pw.edu.pl/~wzab/wireless_guitar_system/ + *  \li XBOX 360 Startup Sound Changer: http://www.homebrew-connection.org/change-your-xbox-360-startup-sounds-yourself/ + *  \li Xnormidi, a C MIDI library: http://x37v.info/projects/xnormidi + *  \li XUM1541, a Commodore 64 floppy drive to USB adapter: http://www.root.org/~nate/c64/xum1541/ + *  \li Zeus, a touch screen computer for music manipulation: http://www.benbengler.com/developments_zeus.html + * + *  \section Sec_LUFACommercialProjects Projects Using LUFA (Commercial) + * + *  The following is a list of known commercial products using LUFA. Some of these are open source, although many are "black-box" + *  solutions with no source code given. Those companies which have purchased a Commercial License to LUFA (see \ref Page_LicenseInfo) + *  are not listed here unless specifically requested. + * + *  \li Alphasphere, a MIDI input sphere device for music creation: http://www.alphasphere.com/ + *  \li Arduino Uno and Leonardo, official Arduino boards: http://www.arduino.cc + *  \li ARPS Locator: http://la3t.hamradio.no/lab//?id=tracker_en + *  \li AsTeRICS assistive technologies project, HID actuator: http://www.asterics.eu + *  \li BitFury, a Bitcoin ASIC miner: https://github.com/aauer1/LUFA-BitFury/tree/master/Projects/BitfuryBTC + *  \li Ceberus, a MadCatz Xbox 360 arcade stick modifier: http://www.phreakmods.com/products/cerberus + *  \li CFFA3000, a CompactFlash interface for the Apple II: http://www.dreher.net/CFforAppleII + *  \li ChameleonMini, a RFID monitoring tool: https://github.com/emsec/ChameleonMini/wiki + *  \li Digital Survey Instruments Magnetometer and Pointer: http://www.digitalsurveyinstruments.com/ + *  \li FinchRobot, a robot designed for educational use: http://www.finchrobot.com/ + *  \li Flysight, a GPS logger for wingsuit pilots: http://flysight.ca/ + *  \li Goldilocks, an Arduino compatible clone: http://feilipu.me/2014/03/08/goldilocks-1284p-arduino-uno-clone/ + *  \li HummingBird Kit, a robotics learning platform: http://www.hummingbirdkit.com/ + *  \li LP1, an AVRISP-MKII Clone AVR Programmer: http://embeddedglow.com/items/LP1/LP1.php + *  \li Penguino, an Arduino Board With On-Board LUFA Powered Debugger/Programmer: http://wiki.icy.com.au/PenguinoAVR + *  \li PhatIO, a filesystem based I/O interface: http://www.phatio.com/ + *  \li PIR-1, an IR control interface for consumer electronics: http://www.promixis.com/pir-1.php + *  \li PIR-4, a USB Connected 4 port IR transmitter: http://promixis.com/pir-4.php + *  \li PortPilot, a USB device charger with power meter: http://portpilot.net/ + *  \li KeyGlove, an alternative input system: http://www.keyglove.net/ + *  \li Many of Busware's Products: http://www.busware.de/ + *  \li MIDIFighter, a USB-MIDI controller: http://www.midifighter.com/ + *  \li MIDI USB Arduino Shield: http://openpipe.cc/products/midi-usb-shield/ + *  \li Norduino, a wireless Arduino: http://norduino.robomotic.com/norduino-is-now-usb-hid/ + *  \li Olimex AVR-ISP-MK2, an AVRISP-MKII Clone AVR Programmer: https://www.olimex.com/dev/avr-isp-mk2.html + *  \li Retrode, a USB Games Console Cartridge Reader: http://www.retrode.org + *  \li RFI21.1EU UHF RFID reader: http://www.metra.cz/rfid/uhf-rfid-ctecky/rfi21-1eu-uhf-rfid-ctecka.htm + *  \li SmartCardDetective, a Smart Card analysis tool: http://www.smartcarddetective.com/ + *  \li TimelapsePlus, a digital camera time lapse tool: https://github.com/timelapseplus/TimelapsePlus-Firmware + *  \li USBTINY-MKII, an AVRISP-MKII Clone AVR Programmer: http://tom-itx.no-ip.biz:81/~webpage/boards/USBTiny_Mkii/USBTiny_Mkii_index.php + *  \li UDS18B20 USB Temperature sensor: http://toughlog.org/uds18b20/ + *  \li VMeter, a USB MIDI touch strip controller: http://www.vmeter.net/ + *  \li XMEGA Development Board, using LUFA as an On-Board Programmer: http://xmega.mattair.net/ + *  \li Zeptoprog, a multifunction AVR programmer: http://www.mattairtech.com/index.php/featured/zeptoprog.html + * + *  \section Sec_LUFAPublications Publications Mentioning LUFA + *  The following are published magazines which have either mentioned or featured the LUFA library. + * + *  \li Elektor Magazine, "My First AVR-USB" by Antoine Authier (feature), January 2010 Issue + *  \li Elektor Magazine, "USB is Cool/Sucks" by Jerry Jacobs and Chris Vossen (minor mention), January 2010 Issue + *  \li Elektor Magazine, "20 x Open Source" by Jens Nickel, March 2010 Issue + *  \li Circuit Cellar Magazine, "Advanced USB Design Debugging" by Collin O'Flynn, August 2010 Issue + *  \li "Some Assembly Required: Assembly Language Programming with the AVR Microcontroller" by Timothy S. Margush + *  \li Elektor Magazine, "Taming the Beast (2)" by Clemens Valens/Raymond Vermeulen, January 2014 Issue + * + *  \section Sec_LUFANotableMentions Other Notable Mentions of LUFA + *  The following are non-print but notable mentions of the LUFA library. + * + *  \li Adafruit "Ask an Engineer", 7th November 2010 + *  \li Arduino 2010 Keynote speech + *  \li The Amp Hour podcast blog #11 + *  \li Blackhat 2011 conference, "Exploiting USB Devices with Arduino" + * + *  \section Sec_PortsAndForks Non-Official LUFA Ports and Forks + *  The following are unofficial forks of the LUFA codebase, which implement different features such as support for + *  additional architectures. + * + *  \li NXP's official LPCOpen "LPCUSBLib" LUFA fork, for LPC devices: http://www.lpcware.com/ + *  \li Kevin Mehall's LUFA port to the NXP LPC13xx: https://github.com/kevinmehall/LUFA-LPC13xx + *  \li Mark Ding's port for the Silicon Labs SiM3U1xx: https://www.github.com/MarkDing/USB_CDC + *  \li Mark Ding's port for the Silicon Labs EFM32 Giant Gecko: https://github.com/MarkDing/lufa-efm32 + */ diff --git a/lib/lufa/LUFA/DoxygenPages/LibraryResources.txt b/lib/lufa/LUFA/DoxygenPages/LibraryResources.txt new file mode 100644 index 0000000000..f69d4344c1 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/LibraryResources.txt @@ -0,0 +1,33 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** + *  \page Page_Resources Library Resources + * + *  \section Sec_UnofficialResources Unofficial Resources + *  Unofficial Russian LUFA documentation translation: http://microsin.ru/Download.cnt/doc/LUFA/ \n + *  Tutorial for LUFA USB Control Transfers: http://www.avrbeginners.net/new/tutorials/usb-control-transfers-with-lufa/ + * + *  \section Sec_ProjectPages LUFA Related Webpages + *  Project Homepage: http://www.lufa-lib.org \n + *  Commercial Licenses: http://www.lufa-lib.org/license \n + *  Author's Website: http://www.fourwalledcubicle.com \n + *  Development Blog: http://www.fourwalledcubicle.com/blog \n + * + *  \section Sec_ProjectHelp Assistance With LUFA + *  Support Mailing List: http://www.lufa-lib.org/support \n + *  Author's Email: dean [at] fourwalledcubicle [dot] com \n + * + *  \section Sec_InDevelopment Latest In-Development Source Code + *  Issue Tracker: http://www.lufa-lib.org/tracker \n + *  Public GIT Repository: http://www.lufa-lib.org/git \n + *  Latest Repository Source Archive: http://www.lufa-lib.org/latest-archive \n + *  Commit RSS Feed: http://www.lufa-lib.org/rss \n + * + *  \section Sec_USBResources USB Resources + *  USB-IF Website: http://www.usb.org \n + */ + diff --git a/lib/lufa/LUFA/DoxygenPages/LicenseInfo.txt b/lib/lufa/LUFA/DoxygenPages/LicenseInfo.txt new file mode 100644 index 0000000000..86ed124bb2 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/LicenseInfo.txt @@ -0,0 +1,43 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** + *  \page Page_LicenseInfo Source Code License + * + *  The LUFA library is currently released under the MIT license, included below. + * + *  \section Sec_LicenseForHumans License Summary for Human Beings + *  Everyone is free to use LUFA without payment - even in commercial applications + *  where the product source code is not publicly disclosed. However, use of the + *  library must be in accordance with the library license conditions. + * + *  If you wish to use LUFA without payment, you <b>must</b> include a copy of the + *  full license text below with your product or project - on your website, and in + *  an accompanying manual or other materials for the product. As long as the entire + *  license text is made available and obvious to the users of your product, you + *  are free to incorporate the LUFA library into your product without special + *  additional licensing. + * + *  \section Sec_CommercialLicenses Commercial Licensing + *  In some instances the small requirement for public disclosure of LUFA within a + *  product is unwanted; in these instances a commercial license is offered up as an + *  alternative to the standard LUFA license. + * + *  Commercial entities can opt out of the public disclosure clause in this license + *  for a one-time US$1500 payment. This provides a non-exclusive modified MIT + *  licensed which allows for the free use of the LUFA library, bootloaders and + *  (where the sole copyright is attributed to Dean Camera) demos without public + *  disclosure within an organization, in addition to three free hours of consultation + *  with the library author, and priority support. + * + *  Please visit the Commercial License link on \ref Page_Resources for more information on + *  ordering a commercial license for your company. + * + *  \section Sec_LicenseText LUFA License Text + * + *  \verbinclude License.txt + */ + diff --git a/lib/lufa/LUFA/DoxygenPages/MainPage.txt b/lib/lufa/LUFA/DoxygenPages/MainPage.txt new file mode 100644 index 0000000000..e737c39b5a --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/MainPage.txt @@ -0,0 +1,52 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** + *  \mainpage + * + *  \image html Images/LUFA.png + *  <div align="center"><small><i>Logo design by <a href="http://www.studiomonsoon.com">Studio Monsoon Photography</a></i></small></div> + *  \n + *  <div align="center"><a href="http://www.lufa-lib.org">http://www.lufa-lib.org</a></div> + *  \n + * + *  <b>LUFA is donationware. For author and donation information, see \ref Page_Donating.</b> + * + *  LUFA is an open-source USB library for the USB-enabled AVR microcontrollers, released under the MIT license (see \ref Page_LicenseInfo). + *  It supports a large number of USB AVR models and boards (see \ref Page_DeviceSupport). It is designed to provide an easy to use, + *  feature rich framework for the development of USB peripherals and hosts. + * + *  LUFA focuses on the microcontroller side of USB development only; it includes no PC host USB driver development facilities - other projects + *  such as the Windows Driver Development Kit, Windows USB Device Mode Framework and libusb may be of interest for developing custom OS drivers. + *  While custom USB devices can be made with LUFA using such tools, the included demos all use the inbuilt OS drivers for each USB class for + *  simplicity. + * + *  The library is currently in a stable release, suitable for download and incorporation into user projects for + *  both host and device modes. For information about the project progression, see the blog link at \ref Page_Resources. + * + *  LUFA is written specifically for the free AVR-GCC compiler, and uses several GCC-only extensions to make the + *  library API more streamlined and robust. You can download AVR-GCC for free in a convenient windows package, + *  from the the WinAVR website (see \ref Page_Resources). + * + *  The only required AVR peripherals for LUFA is the USB controller itself and interrupts - LUFA does not require the use of the + *  microcontroller's timers or other hardware, leaving more hardware to the application developer. + * + *  Accompanying LUFA in the download package is a set of example demo applications, plus several Bootloaders of different classes + *  and open source LUFA powered projects. + * + *  <b>Subsections:</b> + *  \li \subpage Page_LicenseInfo - Project source license and commercial use information + *  \li \subpage Page_Donating - Donating to support this project + *  \li \subpage Page_DeviceSupport - Current Device and Hardware Support + *  \li \subpage Page_ChangeLog - Project Changelog + *  \li \subpage Page_KnownIssues - Known Issues + *  \li \subpage Page_FutureChanges - Planned Changes to the Library + *  \li \subpage Page_GettingStarted - Getting started with LUFA + *  \li \subpage Page_DevelopingWithLUFA - Developing with LUFA + *  \li \subpage Page_LUFAPoweredProjects - Other Projects Using LUFA + *  \li \subpage Page_Resources - LUFA and USB Related Resources + */ + diff --git a/lib/lufa/LUFA/DoxygenPages/MigrationInformation.txt b/lib/lufa/LUFA/DoxygenPages/MigrationInformation.txt new file mode 100644 index 0000000000..7efb312ea8 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/MigrationInformation.txt @@ -0,0 +1,717 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** \page Page_Migration Migrating from Older Versions + * + *  Below is migration information for updating existing projects based on previous versions of the LUFA library + *  to the next version released. It does not indicate all new additions to the library in each version change, only + *  areas relevant to making older projects compatible with the API changes of each new release. + * + *  \section Sec_Migration170418 Version 170418 + *  <b>Device Mode</b> + *   - The \c CALLBACK_USB_GetDescriptor() callback function into the user application's \c wIndex parameter is now \c uint16_t, not \c uint8_t. + * + *  \section Sec_Migration151115 Migrating from 140928 to 151115 + *  <b>Non-USB Library Components</b> + *    - The ATPROGRAM LUFA build system module now defaults to the Atmel ICE debugger tool, instead of the Atmel JTAG ICE3. + *    - The \c Serial_CreateStream() and \c Serial_CreateBlockingStream() functions now require a USART base pointer for XMEGA devices as the first parameter. + * + *  \section Sec_Migration140928 Migrating from 140302 to 140928 + *  <b>Device Mode</b> + *    - The device mode RNDIS class driver now requires a user-supplied buffer and buffer length to operate, rather + *      than allocating this buffer internally. + * + *  \section Sec_Migration140302 Migrating from 130901 to 140302 + *  <b>USB Core</b> + *    - The \c VERSION_BCD() macro has changed from accepting one floating point parameter to taking three distinct major/minor/revision integer parameters, as + *      some edge cases caused incorrect parsing of the input float into the final integer BCD encoded value. + * + *  <b>Non-USB Library Components</b> + *    - The \c ATTR_NEVER_INLINE macro, erroneously introduced in a previous release has been removed, as it duplicates the existing \c ATTR_NO_INLINE macro. + * + *  <b>Build System</b> + *    - The default configuration file for Doxygen is now "doxyfile" rather than "Doxygen.conf", to conform to the Doxygen project's own default file name. + *      Set \c DOXYGEN_CONF to override the new default file name. + * + *  \section Sec_Migration130901 Migrating from 130303 to 130901 + *  <b>Non-USB Library Components</b> + *    - The Board Dataflash \c Dataflash_Init() function now automatically configures the appropriate communication interface. + * + *  \section Sec_Migration130303 Migrating from 120730 to 130303 + *  <b>Device Mode</b> + *    - The \ref HID_KEYBOARD_LED_KANA macro was previously misspelled as \c HID_KEYBOARD_LED_KATANA, and had an incorrect value. User applications requiring this + *      constant should use the new name, and remove any workarounds for the previously incorrect macro definition. + *    - The \c HID_KEYBOARD_SC_EQUAL_SIGN macro has been renamed to \ref HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN, and the previous definition of + *      \c HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN has been renamed \ref HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN_AS400 to conform to the definitions in the HID specification. + * + *  <b>Host Mode</b> + *    - The \ref HID_KEYBOARD_LED_KANA macro was previously misspelled as \c HID_KEYBOARD_LED_KATANA, and had an incorrect value. User applications requiring this + *      constant should use the new name, and remove any workarounds for the previously incorrect macro definition. + *    - The \c HID_KEYBOARD_SC_EQUAL_SIGN macro has been renamed to \ref HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN, and the previous definition of + *      \c HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN has been renamed \ref HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN_AS400 to conform to the definitions in the HID specification. + * + *  \section Sec_Migration120730 Migrating from 120219 to 120730 + *  <b>Device Mode</b> + *    - The device mode Audio Class driver now requires an additional configuration parameter, the Audio Control interface index. Existing applications should + *      be adjusted to specify the additional configuration parameter. + *    - The HID_DESCRIPTOR_JOYSTICK() macro no longer takes a variable number of axis as a parameter, due to OS incompatibilities; this macro now uses a fixed + *      3 axis of data. User applications should update their calls to this macro and their report structures to suit a fixed 3-axis joystick report. If a user + *      application requires more than 3 axis' of data, a custom report descriptor will need to be constructed by hand. + *    - The \ref Endpoint_ConfigureEndpoint() function no longer takes in masks for the banks and direction; the number of banks is now an integer argument, and + *      the direction is obtained from the full endpoint address within the device. Applications calling Endpoint_ConfigureEndpoint() should update their API + *      call to use a full endpoint address (including ENDPOINT_DIR_IN or ENDPOINT_DIR_OUT direction in the MSB of the endpoint address) and an integer number + *      of banks. + *    - All endpoint functions now operate on full endpoint addresses within the device, rather than a directionless endpoint index. Applications should update + *      their API calls to use full endpoint addresses when required within the device. + *    - All device mode class drivers have been updated to use a new unified endpoint description structure for all endpoints; existing applications will need + *      to update their class driver struct instantiation to match the new scheme (see \ref USB_Endpoint_Table_t). + *    - The \c ENDPOINT_BANKS_SUPPORTED() and \c ENDPOINT_MAX_ENDPOINT_SIZE() macros have been removed, as these do not function correctly with the new addressing + *      scheme for the endpoint APIs. Please refer to the target device's datasheet for the maximum bank size of each endpoint. + *    - The MIDI class driver \ref MIDI_EventPacket_t event packet no longer contains separate \c CableIndex and \c Command entries; these have been combined + *      into a single \c Event element which can be constructed using the new macro \ref MIDI_EVENT(). Existing applications should use the new macro and structure + *      element name. + * + *  <b>Host Mode</b> + *    - The Android Accessory Host class driver property strings are now a array of \c char* rather than a struct of named pointers. Existing applications + *      should use C99 Designated Initializers with the property string indexes located in \ref AOA_Strings_t instead. + *    - The \ref Pipe_ConfigurePipe() function no longer takes in masks for the banks and token; the number of banks is now an integer argument, and the token + *      is now inferred from the full pipe address within the device, and the pipe type. Applications calling Pipe_ConfigurePipe() should update their API + *      call to use a full pipe address (including PIPE_DIR_IN or PIPE_DIR_OUT direction in the MSB of the pipe address) and an integer number of banks. + *    - All pipe functions now operate on full pipe addresses within the device, rather than a directionless pipe index. Applications should update their API + *      calls to use full pipe addresses when required within the device. + *    - All host mode class drivers have been updated to use a new unified pipe description structure for all pipes; existing applications will need to update + *      their class driver struct instantiation to match the new scheme (see \ref USB_Pipe_Table_t). + *    - The MIDI class driver \ref MIDI_EventPacket_t event packet no longer contains seperate \c CableIndex and \c Command entries; these have been combined + *      into a single \c Event element which can be constructed using the new macro \ref MIDI_EVENT(). Existing applications should use the new macro and structure + *      element name. + *    - The library "LUFA/Drivers/USB/Core/ConfigDescriptor.c" source file has been renamed "LUFA/Drivers/USB/Core/ConfigDescriptors.c" as this was clashing with + *      files in some low level host mode demo applications, preventing parallel project builds. If you are referencing the project source files directly instead + *      of using the makefile module names, you will need to adjust your project makefile. + * + *  \section Sec_Migration120219 Migrating from 111009 to 120219 + *  <b>USB Core</b> + *    - The HID_KEYBOARD_MODIFER_* macros in the HID class driver have been corrected to HID_KEYBOARD_MODIFIER_* (note the spelling of "modifier"). + *      Existing applications should switch over to the correctly spelled macro names. + *    - The names of the USB Device and USB Host class driver files have changed; a new "ClassDevice" and "ClassHost" postfix has been added to the + *      respective class driver files. Projects referencing the class driver source files by filename rather than the LUFA_SRC_USBCLASS makefile + *      variable should append these postfixes to the source file names. Projects including the USB class driver dispatch headers directly should either + *      switch to including the main USB driver header instead, or use the updated header filenames. + *    - The USB_CONFIG_ATTR_BUSPOWERED constant has been renamed to USB_CONFIG_ATTR_RESERVED, as this was misnamed. All devices must set this bit in + *      the Configuration descriptor's attributes field. As all devices are assumed to be bus-powered unless stated otherwise with the + *      USB_CONFIG_ATTR_SELFPOWERED flag a replacement constant for bus powered devices is not provided. + * + *  <b>Device Mode</b> + *    - The device mode Audio class driver now requires a new user application callback, \ref CALLBACK_Audio_Device_GetSetInterfaceProperty(). + *      Existing applications must implement this new callback, however if no audio entities are defined in the audio device's descriptors, + *      this function may be hard-coded to always return false for previous behaviour to be retained. + * + *  \section Sec_Migration111009 Migrating from 110528 to 111009 + *  <b>Non-USB Library Components</b> + *    - The \c JTAG_DEBUG_ASSERT() macro has been renamed \ref JTAG_ASSERT() to be consistent with \ref STDOUT_ASSERT(). + * + *  <b>USB Core</b> + *    - By default, unordered Endpoint and Pipe configuration is now allowed once again, via the previous workaround of + *      reconfiguring all Endpoints/Pipes in order each time a new Endpoint/Pipe is created. To minimize the compiled program + *      size, the new \c ORDERED_EP_CONFIG compile time option may be defined in the project makefile to restrict the ordering + *      in exchange for a smaller compiled binary size. + *    - The previous \c F_CLOCK symbol, required in the project makefile, has been renamed to \c F_USB. This is due to the previous name + *      being far too generic for use in future architecture ports, where multiple clock domains are used. + * + *  <b>Device Mode</b> + *    - The Endpoint stream functions now all require a \c BytesProcessed parameter instead of the previous callback parameter. + *      This should be set to \c NULL to retain previous behaviour of the functions, or point to a location where the number of bytes + *      processed in the current transaction can be stored. If the \c BytesProcessed parameter is non \c NULL, each time the endpoint + *      bank becomes full and the packet is sent, the routine will exit with the new \ref ENDPOINT_RWSTREAM_IncompleteTransfer + *      error code to allow the user application to determine when to send the next chunk of data. + *    - The \ref CDC_Device_SendString() function now expects a null terminated string instead of an explicit length. Existing code + *      should use the new \ref CDC_Device_SendData() function, or remove the length parameter from the function call. + *    - The \c Endpoint_ResetFIFO() function has been renamed to \ref Endpoint_ResetEndpoint(), to make the API function names more + *      consistent. Existing applications using the old function name should simply replace it with a call to the new function name. + *    - The \c Endpoint_*_Byte() functions have been renamed Endpoint_*_8() to ensure they are correct across all architectures. Existing + *      code using these functions should replace the previous function names with the new function names. + *    - The \c Endpoint_*_Word() functions have been renamed Endpoint_*_16() to ensure they are correct across all architectures. Existing + *      code using these functions should replace the previous function names with the new function names. + *    - The \c Endpoint_*_DWord() functions have been renamed Endpoint_*_32() to ensure they are correct across all architectures. Existing + *      code using these functions should replace the previous function names with the new function names. + *    - The Device mode RNDIS class driver no longer stores the incoming and outgoing packets in the class driver instance; the user is + *      now expected to manually define a storage location for the packet data. Packets must now be sent and received manually via a call + *      to \ref RNDIS_Device_ReadPacket() and/or \ref RNDIS_Device_SendPacket(). + *    - The definition of the Audio class \ref USB_Audio_Descriptor_Format_t has been altered, to remove the fixed singular + *      audio sample rate in the descriptor definition, and to rename the \c SampleFrequencyType to the more appropriate + *      \c TotalDiscreteSampleRates. Existing applications will need to add an array of \ref USB_Audio_SampleFreq_t elements + *      immediately following any \ref USB_Audio_Descriptor_Format_t descriptors, and insert the appropriate sampling rates + *      supported by the device, as well as rename the descriptor elements to match the updated element names. + *    - The device mode Audio class driver now requires a new user application callback, \ref CALLBACK_Audio_Device_GetSetEndpointProperty(). + *      Existing applications must implement this new callback, however if multiple sample rates or pitch control is not used, + *      this function may be hard-coded to always return false for previous behaviour to be retained. + *    - The \c USB_ConfigurationNumber, \c USB_RemoteWakeupEnabled and \c USB_CurrentlySelfPowered globals have been renamed to + *      \ref USB_Device_ConfigurationNumber, \ref USB_Device_RemoteWakeupEnabled and \ref USB_Device_CurrentlySelfPowered to clearly indicate + *      the USB mode they relate to. Existing applications using these variables should rename all references to the previous names. + *    - The \c ENDPOINT_DESCRIPTOR_DIR_IN and \c ENDPOINT_DESCRIPTOR_DIR_OUT macros have now been replaced by \ref ENDPOINT_DIR_IN and + *      \ref ENDPOINT_DIR_OUT to improve code clarity. + *    - The \ref HID_DESCRIPTOR_JOYSTICK() macro now takes an additional (first) parameter indicating the number of axis in the joystick. + * + *  <b>Host Mode</b> + *    - The Pipe stream functions now all require a \c BytesProcessed parameter instead of the previous callback parameter. + *      This should be set to \c NULL to retain previous behaviour of the functions, or point to a location where the number of bytes + *      processed in the current transaction can be stored. If the BytesProcessed parameter is non \c NULL, each time the pipe + *      bank becomes full and the packet is sent, the routine will exit with the new \ref PIPE_RWSTREAM_IncompleteTransfer + *      error code to allow the user application to determine when to send the next chunk of data. + *    - The \ref PRNT_Host_SendString() and \ref CDC_Host_SendString() functions now expect a null terminated string instead of an explicit + *      length. Existing code should use the new \ref PRNT_Host_SendData() and \ref CDC_Host_SendData() functions, or remove the + *      length parameter from the function call. + *    - The \c Pipe_ClearErrorFlags() function has been removed, as the pipe error flags are now automatically cleared when the + *      \ref Pipe_ClearError() function is called. + *    - The \c Pipe_*_Byte() functions have been renamed Pipe_*_8() to ensure they are correct across all architectures. Existing code using + *      these functions should replace the previous function names with the new function names. + *    - The \c Pipe_*_Word() functions have been renamed Pipe_*_16() to ensure they are correct across all architectures. Existing code using + *      these functions should replace the previous function names with the new function names. + *    - The \c Pipe_*_DWord() functions have been renamed Pipe_*_32() to ensure they are correct across all architectures. Existing code using + *      these functions should replace the previous function names with the new function names. + *    - The \c USB_Host_ClearPipeStall() function has been renamed to USB_Host_ClearEndpointStall(), as it operates on a full endpoint address + *      within the attached device and not a pipe within the host. Existing code using the old function name should update the function calls and + *      check for correct usage. + * + *  \section Sec_Migration101122 Migrating from 100807 to 101122 + *  <b>USB Core</b> + *    - A new USB driver source file, \c Drivers/USB/HighLevel/EndpointStream.c now exists. This source file should be added + *      to all project makefiles using the USB driver of LUFA, or the makefile should be updated to use the new module source + *      variables. + *    - A new USB driver source file, \c Drivers/USB/HighLevel/PipeStream.c now exists. This source file should be added to all + *      project makefiles using the USB driver of LUFA, or the makefile should be updated to use the new module source variables. + *    - The \c EVENT_USB_InitFailure() event has been removed, as the \ref USB_Init() function will no longer fail; if not USB mode is + *      specified, the controller will default to UID selection mode. + *    - The USB mode specifier constants have been moved into a new enum and renamed. Existing projects should use the equivalent + *      value in the new \ref USB_Modes_t enum. + *    - All class driver headers are now included as part of the standard \c LUFA/Drivers/USB/USB.h master dispatch header, and should + *      no longer be included separately. Class driver module source files must still be added as a separate module in the project's + *      makefile if used. + * + *  <b>Device Mode</b> + *    - Endpoints MUST be allocated in ascending order to ensure that bank corruption does not occur. Ensure that your user application + *      allocated endpoints in ascending order - or if your application uses the USB device mode class drivers, ensure that each instance's + *      endpoint indexes are not overlapped with other interface's endpoints. + *    - The signature for the \ref CALLBACK_USB_GetDescriptor() callback has changed, the \c void** \c const \c DescriptorAddress parameter is + *      now \c const \c void** \c const \c DescriptorAddress. Existing applications should update their callback signatures to match this, and + *      eliminate any casting of descriptor pointers to a non \c const pointer. + *    - The names of the class specific descriptor type defines in the USB Class drivers have changed - refer to the driver documentation + *      for each class driver for the new class specific descriptor type names. + *    - The \c ENDPOINT_DOUBLEBANK_SUPPORTED() macro is has been renamed \c ENDPOINT_BANKS_SUPPORTED() and now returns the total number of + *      banks supported by the given endpoint. Existing code should switch to the new naming scheme, and test that the return value of the + *      macro is equal to or greater than 2 to regain the previous functionality. + *    - The \c EVENT_USB_Device_UnhandledControlRequest() event is now named \ref EVENT_USB_Device_ControlRequest() and fires before (not after) + *      the internal library event handlers. Existing code should rename the event handlers in the user application to match the new event + *      name, and should ensure that the new execution order does not affect the application's operation. + * + *  <b>Host Mode</b> + *    - Pipes MUST be allocated in ascending order to ensure that bank corruption does not occur. Ensure that your user application + *      allocated pipes in ascending order - or if your application uses the USB host mode class drivers, ensure that each instance's + *      pipe indexes are not overlapped with other interface's pipes. + *    - The \c PRNT_Host_SendData() function has been renamed to \ref PRNT_Host_SendString(). Existing applications should simply + *      replace all references to the obsolete function name with the new function name. + *    - The names of the class specific descriptor type defines in the USB Class drivers have changed - refer to the driver documentation + *      for each class driver for the new class specific descriptor type names. + *    - The Still Image Host class' function prefix has been changed from \c SImage_ to  \c SI_, to remain consistent with the rest of the + *      driver's enums, type defines and constants. + * + *  \section Sec_Migration100807 Migrating from 100513 to 100807 + * + *  <b>Non-USB Library Components</b> + *    - The Dataflash board driver stub file has changed, as dataflash functions previously located in the internal + *      Dataflash driver of the library have now been moved to the individual board files. Existing drivers can + *      copy-paste the new functions from the board Dataflash stub driver. + * + *  <b>USB Core</b> + *    - A new USB driver source file, \c Drivers/USB/LowLevel/Device.c now exists. This source file should be added to all project + *      makefiles using the USB driver of LUFA, or the makefile should be updated to use the new module source variables. + *    - The \c Drivers/USB/LowLevel/DevChapter9.c source file has moved to \c Drivers/USB/HighLevel/DeviceStandardReq.c - this should + *      be updated in all project makefiles, or the makefile should be updated to use the new module source variables. + *    - The \c Drivers/USB/LowLevel/HostChapter9.h source file has moved to \c Drivers/USB/HighLevel/HostStandardReq.c - this should + *      be updated in all project makefiles, or the makefile should be updated to use the new module source variables. + *    - The \c Drivers/USB/LowLevel/LowLevel.c source file has moved to \c Drivers/LowLevel/USBController.c - this should be updated + *      in all project makefiles, or the makefile should be updated to use the new module source variables. + * + *  <b>Device Mode</b> + *    - The \c USB_Device_IsRemoteWakeupSent() macro has been removed, as the remote wakeup request is now fully handled by the + *      enhanced \ref USB_Device_SendRemoteWakeup() function. Existing code may now discard any checks to \c USB_Device_IsRemoteWakeupSent(). + *    - The \c USB_Device_IsUSBSuspended() macro has been removed, as it is obsolete. Existing code should compare \ref USB_DeviceState + *      to see if it the device is in the \ref DEVICE_STATE_Suspended state instead. + *    - The \ref CDC_Device_ReceiveByte() function has changed, and now returns a signed 16-bit integer, with -1 indicating no data was + *      received. This allows for more efficient coding, as a call to \ref CDC_Device_BytesReceived() is no longer needed if the exact + *      number of queued bytes received is not needed. + * + *  <b>Host Mode</b> + *    - The \ref CDC_Host_ReceiveByte() function has changed, and now returns a signed 16-bit integer, with -1 indicating no data was + *      received. This allows for more efficient coding, as a call to \ref CDC_Host_BytesReceived() is no longer needed if the exact + *      number of queued bytes received is not needed. + *    - The \ref CDC_Host_USBTask() now calls \ref CDC_Host_Flush() automatically, flushing any queued data to the attached device. Manual + *      flushing of the interface is no longer needed if the flushes should be in sync with calls to \ref CDC_Host_USBTask(). + * + *  \section Sec_Migration100513 Migrating from 100219 to 100513 + * + *  <b>Non-USB Library Components</b> + *    - The \ref TWI_StartTransmission() function now takes in a timeout period, expressed in milliseconds, within which the addressed + *      device must respond or the function will abort. + * + *  <b>Device Mode</b> + *    - The \ref USB_Init() function no longer calls \c sei() to enable global interrupts, as the user application may need + *      to perform other initialization before it is ready to handle global interrupts. The user application is now responsible + *      for enabling global interrupts before or shortly after calling \ref USB_Init() to ensure that the enumeration process + *      functions correctly. + *    - The \c USBInterrupt.c USB driver source file has been relocated from \c LUFA/Drivers/USB/HighLevel/ to \c LUFA/Drivers/USB/LowLevel. + *      Projects must update their makefile SRC values accordingly. + *    - The HID Device Class driver's function signature for the \ref CALLBACK_HID_Device_ProcessHIDReport() function has been changed, to + *      allow for a new \c ReportType parameter. This new parameter must be added in all user applications using the Device mode HID Class + *      Driver, but may be ignored unless Host-to-Device FEATURE HID reports are used. + * + *  <b>Host Mode</b> + *    - The \ref USB_Init() function no longer calls \c sei() to enable global interrupts, as the user application may need + *      to perform other initialization before it is ready to handle global interrupts. The user application is now responsible + *      for enabling global interrupts before or shortly after calling \ref USB_Init() to ensure that the enumeration process + *      functions correctly. + *    - The \c USBInterrupt.c USB driver source file has been relocated from \c LUFA/Drivers/USB/HighLevel/ to \c LUFA/Drivers/USB/LowLevel. + *      Projects must update their makefile \c SRC values accordingly. + *    - The HID Host Class driver's function signature for the \ref HID_Host_SendReportByID() function has been changed, to allow for a new + *      ReportType parameter. Existing calls to this function should substitute \c REPORT_ITEM_TYPE_Out as this parameter's value. + * + *  \section Sec_Migration100219 Migrating from 091223 to 100219 + * + *  <b>Non-USB Library Components</b> + *    - Due to some ADC channels not being identical to their ADC MUX selection masks for single-ended conversions on some AVR models, + *      the ADC driver now has explicit masks for each of the standard ADC channels (see \ref Group_ADC). These masks should be used + *      when calling the ADC functions to ensure proper operation across all AVR models. Note that the \ref ADC_SetupChannel() function + *      is an exception, and should always be called with a channel number rather than a channel mask. + * + *  <b>Host Mode</b> + *    - The MIDI Host Class driver send and receive routines now operate on packed events, where multiple MIDI events may be + *      packed into a single USB packet. This means that the sending of MIDI events will now be delayed until the MIDI send + *      pipe bank is full. To override this new behaviour and revert to the previous behaviour, the user application may manually + *      flush the queued event(s) to the device by calling \ref MIDI_Host_Flush(). + *    - The \ref Pipe_IsEndpointBound() function now takes the endpoint's direction into account, by checking if the MSB of the endpoint's address + *      is set to denote IN endpoints. If the previous functionality where the direction is to be discounted is required, mask the endpoint + *      address against the \ref PIPE_EPNUM_MASK token before calling \ref Pipe_IsEndpointBound(). + * + *  <b>Device Mode</b> + *    - The MIDI Device Class driver send and receive routines now operate on packed events, where multiple MIDI events may be + *      packed into a single USB packet. This means that the sending of MIDI events will now be delayed until the MIDI send + *      endpoint bank is full. To override this new behaviour and revert to the previous behaviour, the user application may manually + *      flush the queued event(s) to the host by calling \ref MIDI_Device_Flush(). + * + *  \section Sec_Migration091223 Migrating from 091122 to 091223 + * + *  <b>Host Mode</b> + *    - The Still Image Host Class driver \ref SI_Host_USBTask() and \ref SI_Host_ConfigurePipes() functions were misnamed, and are + *      now named \c SImage_Host_USBTask() and \c SImage_Host_ConfigurePipes() respectively. + *    - The \c HOST_SENDCONTROL_DeviceDisconnect enum value has been renamed to \ref HOST_SENDCONTROL_DeviceDisconnected to be in + *      line with the rest of the library error codes. + *    - The HID Parser item usages no longer contain separate minimum and maximum values, as this was a violation of the HID + *      specification. Instead, the values are distributed evenly across each item as its usage value, to ensure that all items + *      can be distinguished from one-another. + * + *  <b>Device Mode</b> + *    - The \ref CALLBACK_HID_Device_CreateHIDReport() HID Device Class driver callback now has a new \c ReportType parameter to + *      indicate the report type to generate. Existing applications may simply add and ignore this additional parameter. + * + *  \section Sec_Migration091122 Migrating from 090924 to 091122 + * + *  <b>Host Mode</b> + *    - The \c HID_PARSE_UsageStackOverflow HID parser error constant is now named \ref HID_PARSE_UsageListOverflow + *    - The \ref CALLBACK_HIDParser_FilterHIDReportItem() HID Parser callback now passes a complete \ref HID_ReportItem_t to the + *      user application, instead of just its attributes. + *    - The \c USB_GetDeviceConfigDescriptor() function was incorrectly named and is now called \ref USB_Host_GetDeviceConfigDescriptor(). + * + *  \section Sec_Migration090924 Migrating from 090810 to 090924 + * + *  <b>Non-USB Library Components</b> + *    - The \c ADC_Off() function has been renamed to \c ADC_ShutDown() to be consistent with the rest of the library. + *    - The \ref SPI_Init() routine's parameters have changed, so that the clock polarity and data sampling modes can be set. See + *      the \ref SPI_Init() function documentation for more details + *    - The \ref Dataflash_Init() routine no longer initializes the SPI bus - the SPI bus should be initialized manually via a + *      call to \ref SPI_Init() before using the Dataflash driver + * + *  <b>Host Mode</b> + *    - The \c USB_GetDeviceConfigDescriptor() function's parameters and behaviour has changed; the user is required to + *      preallocate the largest allowable buffer, and pass the size of the buffer to the function. This allows for a single + *      call to the function to retrieve, size check and validate the Configuration Descriptor rather than having the user + *      application perform these intermediary steps. + *    - The HID report parser now requires a mandatory callback in the user code, to filter only the items the application + *      is interested in into the processed HID report item structure to save RAM. See \ref CALLBACK_HIDParser_FilterHIDReportItem(). + *    - The HID report parser now always parses FEATURE and always ignores constant-data items - the \c HID_ENABLE_FEATURE_PROCESSING + *      and \c HID_INCLUDE_CONSTANT_DATA_ITEMS compile time tokens now have no effect. + *    - The \c USE_NONSTANDARD_DESCRIPTOR_NAMES compile time token has been removed - there are now separate \c USB_Descriptor_* + *      and \c USB_StdDescriptor_* structures for both the LUFA and standardized element naming conventions so that both may be used in + *      the one project. For existing projects using the standardized names, change all code to use the \c USB_StdDescriptor_* variants. + * + *  <b>Device Mode</b> + *    - The \c USE_NONSTANDARD_DESCRIPTOR_NAMES compile time token has been removed - there are now separate \c USB_Descriptor_* + *      and \c USB_StdDescriptor_* structures for both the LUFA and standardized element naming conventions so that both may be used in + *      the one project. For existing projects using the standardized names, change all code to use the \c USB_StdDescriptor_* variants. + * + *  \section Sec_Migration090810 Migrating from 090605 to 090810 + * + *  <b>All</b> + *    - The "Simple Scheduler" has been <i>deprecated</i>, as it was little more than an abstracted loop and caused much confusion. + *      User applications using the scheduler should switch to regular loops instead. The scheduler code will be removed in a future + *      release. + *    - The "Dynamic Memory Block Allocator" has been removed, as it was unused in (and unrelated to) the LUFA library and never + *      used in user applications. + * + *  <b>Non-USB Library Components</b> + *    - The \c ATTR_NOINLINE function attribute macro has been renamed to \ref ATTR_NO_INLINE to be in line with the rest of the function attribute + *      macro names. + * + *  <b>Library Demos</b> + *    - Most demos now have a corresponding Class Driver implementation, which uses the new internal library class drivers for the standard + *      USB classes. This allows for more rapid device and host development, and so should be used in preference to the low level APIs where + *      possible so that fixes to the class drivers propagate to all applications which use them automatically with each new LUFA release. + * + *  <b>Host Mode</b> + *    - The \c HIDParser.c module has moved from \c LUFA/Drivers/USB/Class/ to \c LUFA/Drivers/USB/Class/Host/. + *    - The \c USB_GetDeviceConfigDescriptor() function now requires the desired configuration index within the device as its first + *      parameter, to add support for multi-configuration devices. Existing code should use a configuration index of 1 to indicate the + *      first configuration descriptor within the device. + *    - The non-standard "Ready" host state has been removed. Existing \ref HOST_STATE_Configured code should be moved to the end of + *      the existing \ref HOST_STATE_Addressed state, and the existing HOST_STATE_Ready state code should be moved to the \ref HOST_STATE_Configured + *      state. + *    - The \c USB_IsConnected global has been removed, as it is too vague for general use. Test \ref USB_HostState explicitly to ensure the host is + *      in the desired state instead. + *    - The USB event names have been changed and their firing conditions changed to properly separate out Host mode events from Device mode + *      events. See the \ref Group_Events page for details on the new event names and firing conditions. + * + *  <b>Device Mode</b> + *    - The \ref CALLBACK_USB_GetDescriptor() function now takes an extra parameter to specify the descriptor's memory space so that + *      descriptors in mixed memory spaces can be used. The previous functionality can be returned by defining the \c USE_FLASH_DESCRIPTORS + *      token in the project makefile to fix all descriptors into FLASH space and remove the extra function parameter. + *    - The \c USB_IsSuspended global has been removed - test \ref USB_DeviceState against \ref DEVICE_STATE_Suspended instead. + *    - The \c USB_IsConnected global has been removed, as it is too vague for general use. Test \ref USB_DeviceState explicitly to ensure the device + *      is in the desired state instead. + *    - The VBUS events have been removed, as they are already exposed to the user via the \c USB_Connect and \c USB_Disconnect events. + *    - The USB event names have been changed and their firing conditions changed to properly separate out Host mode events from Device mode + *      events. See the \ref Group_Events page for details on the new event names and firing conditions. + * + *  \section Sec_Migration090605 Migrating from 090510 to 090605 + * + *  <b>Device Mode</b> + *    - Support for non-control data endpoint interrupts has been dropped due to many issues in the implementation. All existing + *      projects using interrupts on non-control endpoints should switch to polling. For control interrupts, the library can + *      manage the control endpoint via interrupts automatically by compiling with the \c INTERRUPT_CONTROL_ENDPOINT token defined. + *    - The \c DESCRIPTOR_ADDRESS() macro has been removed. User applications should use normal casts to obtain a descriptor's memory + *      address. + *    - The library events system has been rewritten, so that all macros have been removed to allow for clearer user code. See + *      \ref Group_Events for new API details. + *    - The \c STREAM_CALLBACK() macro has been removed. User applications should replace all instances of the macro with regular + *      function signatures of a function accepting no arguments and returning a \c uint8_t value. + *    - The \c Event_DeviceError() event no longer exists, as its sole caller (unlinked \c USB_GetDescriptor() function) now produces a + *      compilation error rather than a runtime error. The \c StdDescriptors.c file no longer exists as a result, and should be removed + *      from project makefiles. + *    - The \c USB_GetDescriptor() function has been renamed to \ref CALLBACK_USB_GetDescriptor() to be in line with the new \c CALLBACK_ + *      function prefixes for functions which <i>must</i> be implemented in the user application. + * + *  <b>Host Mode</b> + *    - Support for non-control data pipe interrupts has been dropped due to many issues in the implementation. All existing + *      projects using interrupts on non-control pipes should switch to polling. + *    - The library events system has been rewritten, so that all macros have been removed to allow for clearer user code. See + *      \ref Group_Events for new API details. + *    - The \c STREAM_CALLBACK() macro has been removed. User applications should replace all instances of the macro with regular + *      function signatures of a function accepting no arguments and returning a \c uint8_t value. + *    - The \c DESCRIPTOR_COMPARATOR() macro has been removed. User applications should replace all instances of the macro with + *      regular function signatures of a function accepting a void pointer to the descriptor to test, and returning a \c uint8_t value. + * + *  \section Sec_Migration090510 Migrating from 090401 to 090510 + * + *  <b>All</b> + *    - The \c ButtLoadTag.h header has been removed, as it was never used for its intended purpose. Projects should either remove all + *      \c BUTTLOADTAG() elements, or download and extract \c ButtLoadTag.h header from the ButtLoad project. + *    - The \c Drivers/AT90USBXXX/ directory has been renamed to \c Drivers/Peripheral/. + *    - The \c Serial_Stream driver has been renamed to \c SerialStream to remain consistent with the rest of the library naming scheme. + *    - The HWB driver has changed to the \c Buttons driver. See the board Buttons driver documentation for the new API. + * + *  <b>Dual Role Mode</b> + *    - The \c USB_PowerOnFail event has been renamed to \c USB_InitFailure. + *    - The functions in \c OTG.h have been renamed to remain more consistent with the library API. See the functions in \c OTG.h for more + *      details. + * + *  <b>Device Mode</b> + *    - The \c Endpoint_ClearCurrentBank() macro has been removed, and is now replaced with the \ref Endpoint_ClearIN(), \ref Endpoint_ClearOUT() + *      macros. See \c Endpoint.h documentation for more details on the new endpoint management macros. + *    - The \c Endpoint_ReadWriteAllowed() macro has been renamed to \ref Endpoint_IsReadWriteAllowed() to be more consistent with the rest of + *      the API naming scheme. + *    - The \c Endpoint_IsSetupINReady() and \c Endpoint_IsSetupOUTReceived() macros have been renamed to \ref Endpoint_IsINReady() and + *      \ref Endpoint_IsOUTReceived() respectively. + *    - The \c Endpoint_IsSetupReceived() macro has been renamed to \ref Endpoint_IsSETUPReceived(). + *    - The \c Endpoint_ClearSetupReceived() macro has been renamed to \ref Endpoint_ClearSETUP(). + *    - All endpoint read/write/discard aliases which did not have an explicitly endianness specifier (such as \c Endpoint_Read_Word()) have + *      been removed for clarity. Existing projects should use the \c _LE suffix on such calls to use the explicit Little Endian versions. + *    - The \c USB_UnhandledControlPacket event no longer has any parameters. User code should no longer attempt to read in the remainder of + *      the Control Request header as all Control Request header data is now preloaded by the library and made available in the + *      USB_ControlRequest structure. + *    - The \c FEATURELESS_CONTROL_ONLY_DEVICE token has been renamed to \c CONTROL_ONLY_DEVICE. + *    - The \c STATIC_ENDPOINT_CONFIGURATION is no longer applicable as the library will apply this optimization when appropriate automatically. + *    - The values of the \ref Endpoint_Stream_RW_ErrorCodes_t and \ref Endpoint_ControlStream_RW_ErrorCodes_t enums have had the \c ERROR_ portion + *      of their names removed. + * + *  <b>Host Mode</b> + *    - The \ref USB_Host_SendControlRequest() function no longer automatically selects the Control pipe (pipe 0) to allow it to be used on + *      other control type pipes. Care should be taken to ensure that the Control pipe is always selected before the function is called + *      in existing projects where the Control pipe is to be operated on. + *    - The USB Host management task now saves and restores the currently selected pipe before and after the task runs. Projects no longer + *      need to manage this manually when calling the USB management task. + *    - The \c Pipe_ClearCurrentBank() macro has been removed, and is now replaced with the Pipe_ClearIN(), Pipe_ClearOUT() macros. See + *      Pipe.h documentation for more details on the new pipe management macros. + *    - The \c Pipe_ReadWriteAllowed() macro has been renamed to \ref Pipe_IsReadWriteAllowed() to be more consistent with the rest of the API + *      naming scheme. + *    - The \c Pipe_IsSetupINReceived() and \c Pipe_IsOutReady() macros have been renamed to \ref Pipe_IsINReceived() and \ref Pipe_IsOUTReady() + *      respectively. + *    - The new \ref Pipe_ClearSETUP() macro should be used to send SETUP transactions, rather than the previous \c Pipe_ClearSetupOUT() macro. + *    - The \c Pipe_IsSetupSent() macro has been renamed to \ref Pipe_IsSETUPSent(). + *    - The \c Pipe_ClearSetupSent() macro is no longer applicable and should be removed. + *    - All pipe read/write/discard aliases which did not have an explicitly endianness specifier (such as \c Pipe_Read_Word()) have + *      been removed for clarity. Existing projects should use the \c _LE suffix on such calls to use the explicit Little Endian versions. + *    - The \c Host_IsResetBusDone() macro has been renamed to \c Host_IsBusResetComplete(). + *    - The \c Pipe_Ignore_Word() and \c Pipe_Ignore_DWord() functions have been renamed to \c Pipe_Discard_Word() and \c Pipe_Discard_DWord() + *      to remain consistent with the rest of the pipe API. + *    - It is no longer needed to manually include the headers from \c LUFA/Drivers/USB/Class, as they are now included along with the rest + *      of the USB headers when \c LUFA/Drivers/USB/USB.h is included. + *    - Functions in the \c ConfigDescriptor.h header file no longer have \c Host_ as part of their names. + *    - The \c ProcessHIDReport() has been renamed to \ref USB_ProcessHIDReport(), \c GetReportItemInfo() has been renamed to \ref USB_GetHIDReportItemInfo() + *      and \c SetReportItemInfo() has been renamed to \ref USB_GetHIDReportItemInfo(). + *    - The values of the \ref DSearch_Return_ErrorCodes_t and \ref DSearch_Comp_Return_ErrorCodes_t enums have had their respective \c Descriptor_Search + *      and \c Descriptor_Search_Comp prefixes changed to all caps. + *    - The \c USB_HostRequest global has been renamed to \ref USB_ControlRequest, and is used in Device mode also. The \c USB_Host_Request_Header_t + *      structure type has been renamed to \ref USB_Request_Header_t. + *    - The values of the \ref Pipe_Stream_RW_ErrorCodes_t enum have had the \c ERROR_ portion of their names removed. + * + *  \section Sec_Migration090401 Migrating from 090209 to 090401 + * + *  <b>All</b> + *    - LUFA projects must now give the raw input clock frequency (before any prescaling) as a compile time constant \c F_USB, + *      defined in the project makefile and passed to the compiler via the -D switch. + *    - The makefile EEPROM programming targets for FLIP and dfu-programmer no longer program in the FLASH data in addition to the + *      EEPROM data into the device. If both are to be programmed, both the EEPROM and FLASH programming targets must be called. + *    - As the avr-libc macro has been corrected in recent avr-libc distributions, the \c SetSystemClockPrescaler() macro has been removed. + *      Include \c <avr/power.h> and call \c clock_prescale_set(clock_div_1); instead on recent avr-libc distributions. + * + *  <b>Library Demos</b> + *    - The USBtoSerial demo now discards all data when not connected to a host, rather than buffering it for later transmission. + * + *  <b>Non-USB Library Components</b> + *    - The \c ATTR_ALWAYSINLINE function attribute macro has been renamed to \ref ATTR_ALWAYS_INLINE. + *    - Custom board Dataflash drivers now require the implementation of \ref Dataflash_SelectChipFromPage() and \ref Dataflash_SendAddressBytes(). + * + *  <b>Device Mode</b> + *    - The \c NO_CLEARSET_FEATURE_REQUEST compile time token has been renamed to \c FEATURELESS_CONTROL_ONLY_DEVICE, and its function expanded + *      to also remove parts of the Get Status chapter 9 request to further reduce code usage. On all applications currently using the + *      \c NO_CLEARSET_FEATURE_REQUEST compile time token, it can be replaced with the \c FEATURELESS_CONTROL_ONLY_DEVICE token with no further + *      modifications required. + * + *  \section Sec_Migration090209 Migrating from 081217 to 090209 + * + *  <b>Device Mode</b> + *    - The \c ENDPOINT_MAX_ENDPOINTS constant has been renamed to the more appropriate name of \c ENDPOINT_TOTAL_ENDPOINTS. + *    - The \c USB_STREAM_TIMEOUT_MS stream timeout default period has been extended to 100ms. This can be overridden in the user + *      makefile if desired to restore the previous 50ms timeout. + * + *  <b>Host Mode</b> + *    - The \c PIPE_MAX_ENDPOINTS constant has been renamed to the more appropriate name of \c PIPE_TOTAL_ENDPOINTS. + *    - The \c USB_STREAM_TIMEOUT_MS stream timeout default period has been extended to 100ms. This can be overridden in the user + *      makefile if desired to restore the previous 50ms timeout. + *    - The \c USB_DeviceEnumerationFailed event now contains a second \c SubErrorCode parameter, giving the error code of the function + *      which failed. + *    - The \c HID_PARSE_Sucessful enum member constant name has been corrected to \ref HID_PARSE_Successful. + * + *  <b>Non-USB Library Components</b> + *    - The previous \c SPI_SendByte() functionality is now located in \ref SPI_TransferByte(). \ref SPI_SendByte() now discards the return byte + *      for speed, to compliment the new \ref SPI_ReceiveByte() function. If bidirectional SPI transfers are required, calls to \ref SPI_SendByte() + *      should be changed to \ref SPI_TransferByte(). + *    - The serial driver now sets the Tx line as an output explicitly, and enables the pull-up of the Rx line. + *    - The \ref Serial_Init() and \c SerialStream_Init() functions now take a second \c DoubleSpeed parameter, which indicates if the USART + *      should be initialized in double speed mode - useful in some circumstances for attaining baud rates not usually possible at the given AVR + *      clock speed. + * + *  \section Sec_Migration171208 Migrating from V1.5.3 to 081217 + * + *  <b>All</b> + *    - The MyUSB project name has been changed to LUFA (Lightweight Framework for USB AVRs). All references to MyUSB, including macro names, + *      have been changed to LUFA. + * + *  <b>Library Demos</b> + *    - The ReconfigureUSART() routine in the USBtoSerial demo was not being called after new line encoding + *      parameters were set by the host. Projects built on the USBtoSerial code should update to the latest version. + *    - The HID Parser now supports multiple report (on a single endpoint) HID devices. The MouseHostWithParser and + *      KeyboardHostWithPaser demos use the updated API functions to function correctly on such devices. Projects + *      built on either "WithParser" demo should update to the latest code. + *    - The RNDIS demo TCP stack has been modified so that connections can be properly closed. It is still not + *      recommended that the MyUSB RNDIS demo TCP/IP stack be used for anything other than demonstration purposes, + *      as it is neither a full nor a standards compliant implementation. + * + *  <b>Non-USB Library Components</b> + *    - The Serial_IsCharReceived() macro has been changed to the correct spelling of Serial_IsCharReceived() in Serial.h. + * + *  <b>Device Mode</b> + *    - The MANUAL_PLL_CONTROL compile time token has been removed, and replaced with a USB_OPT_MANUAL_PLL mask + *      to be used in the Options parameter of the USB_Init() function. + *    - Calling USB_Init() now forces a complete USB interface reset and enumeration, even if the USB interface is + *      currently initialized. + *    - Interrupts are now disabled when processing control requests, to avoid problems with interrupts causing the library + *      or user request processing code to exceed the strict USB timing requirements on control transfers. + *    - The USB Reset event now resets and disables all device endpoints. If user code depends on endpoints remaining configured + *      after a Reset event, it should be altered to explicitly re-initialize all user endpoints. + *    - The prototype for the GetDescriptor function has been changed, as the return value was redundant. The function now + *      returns the size of the descriptor, rather than passing it back via a parameter, or returns NO_DESCRIPTOR if the specified + *      descriptor does not exist. + *    - The NO_DESCRIPTOR_STRING macro has been renamed NO_DESCRIPTOR, and is now also used as a possible return value for the + *      GetDescriptor function. + * + *  <b>Host Mode</b> + *    - The MANUAL_PLL_CONTROL compile time token has been removed, and replaced with a USB_OPT_MANUAL_PLL mask + *      to be used in the Options parameter of the USB_Init() function. + *    - The HID report parser now supports multiple Report IDs. The HID report parser GetReportItemInfo() and + *      SetReportItemInfo() routines now return a boolean, set if the requested report item was located in the + *      current report. If sending a report to a multi-report device, the first byte of the report is automatically + *      set to the report ID of the given report item. + *    - Calling USB_Init() now forces a complete USB interface reset and enumeration, even if the USB interface is + *      currently initialized. + * + *  \section Sec_Migration152 Migrating from V1.5.2 to V1.5.3 + * + *  <b>Library Demos</b> + *    - Previously, all demos contained a serial number string descriptor, filled with all zeros. A serial number + *      string is required in Mass Storage devices, or devices which are to retain settings when moved between + *      ports on a machine. As people were not changing the serial number value, this was causing conflicts and so + *      the serial number descriptor has been removed from all but the Mass Storage demo, which requires it. + *    - The AudioOut and AudioIn demos did not previously silence their endpoints when the host has deactivated + *      them. Projects built upon either demo should upgrade to the latest code. + *    - The FEATURE_ENDPOINT macro has been renamed FEATURE_ENDPOINT_HALT, and is now correctly documented. + *    - The MassStoreHost demo contained errors which caused it to lock up randomly on certain devices. Projects built + *      on the MassStoreDemo code should update to the latest version. + *    - The Interrupt type endpoint in the CDC based demos previously had a polling interval of 0x02, which caused + *      problems on some Linux systems. This has been changed to 0xFF, projects built on the CDC demos should upgrade + *      to the latest code. + *    - The HID keyboard and mouse demos were not previously boot mode compatible. To enable boot mode support, projects + *      built on the keyboard or mouse demos (or derivatives) should upgrade to the latest code. + *    - The Mass Storage demo was not previously standards compliant. Projects built on the Mass Storage demo should + *      upgrade to the latest code. + *    - The USART was not being reconfigured after the host sent new encoding settings in the USBtoSerial demo. This was + *      previously discovered and fixed, but the change was lost. Projects built on the USBtoSerial demo should update + *      to the latest code. + * + *  <b>Device Mode</b> + *    - The endpoint non-control stream functions now have a default timeout of 50ms between packets in the stream. + *      If this timeout is exceeded, the function returns the new ENDPOINT_RWSTREAM_ERROR_Timeout error value. The + *      timeout value can be overridden by defining the USB_STREAM_TIMEOUT_MS in the project makefile to the desired + *      timeout duration in ms. + *    - Rather than returning fixed values, the flags indicating if the device has Remote Wakeup currently enabled + *      and/or is self-powered are now accessed and set through the new USB_RemoteWakeupEnabled and + *      USB_CurrentlySelfPowered macros. See the DevChapter9.h documentation for more details. + *    - All endpoint stream functions now require an extra Callback function parameter. Existing code may be updated + *      to either supply NO_STREAM_CALLBACK as the extra parameter, or disable stream callbacks altogether by passing + *      the token NO_STREAM_CALLBACKS to the compiler using the -D switch. + * + *  <b>Host Mode</b> + *    - The pipe non-control stream functions now have a default timeout of 50ms between packets in the stream. + *      If this timeout is exceeded, the function returns the new PIPE_RWSTREAM_ERROR_Timeout error value. The + *      timeout value can be overridden by defining the USB_STREAM_TIMEOUT_MS in the project makefile to the desired + *      timeout duration in ms. + *    - CollectionPath_t has been renamed to HID_CollectionPath_t to be more in line with the other HID parser structures. + *    - All pipe stream functions now require an extra Callback function parameter. Existing code may be updated + *      to either supply NO_STREAM_CALLBACK as the extra parameter, or disable stream callbacks altogether by passing + *      the token NO_STREAM_CALLBACKS to the compiler using the -D switch. + * + *  \section Sec_Migration151 Migrating from V1.5.1 to V1.5.2 + * + *  <b>Library Demos</b> + *    - The RNDIS demo application has been updated so that it is functional on Linux under earlier implementations + *      of the RNDIS specification, which had non-standard behaviour. Projects built upon the demo should upgrade + *      to the latest code. + *    - The DFU class bootloader has had several bugs corrected in this release. It is recommended that where + *      possible any existing devices upgrade to the latest bootloader code. + * + *  \section Sec_Migration150 Migrating from V1.5.0 to V1.5.1 + * + *  <b>Library Demos</b> + *    - The USBtoSerial demo was broken in the 1.5.0 release, due to incorrect register polling in place of the + *      global "Transmitting" flag. The change has been reverted in this release. Projects built upon the demo + *      should upgrade to the latest code. + *    - The HID class demos did not implement the mandatory GetReport HID class request. Projects built upon the HID + *      demos should upgrade to the latest code. + *    - The HID class demos incorrectly reported themselves as boot-protocol enabled HID devices in their descriptors. + *      Projects built upon the HID demos should upgrade to the latest code. + *    - The MIDI device demo had incorrect AudioStreaming interface descriptors. Projects built upon the MIDI demo + *      should upgrade to the latest code. + *    - The AudioOut demo did not correctly tristate the speaker pins when USB was disconnected, wasting power. + *      Projects built upon the AudioOut demo should upgrade to the latest code. + * + *  \section Sec_Migration141 Migrating from V1.4.1 to V1.5.0 + * + *  <b>Library Demos</b> + *    - Previous versions of the library demos had incorrectly encoded BCD version numbers in the descriptors. To + *      avoid such mistakes in the future, the VERSION_BCD macro has been added to StdDescriptors.h. Existing + *      projects should at least manually correct the BCD version numbers, or preferably update the descriptors to + *      encode the version number in BCD format using the new macro. + *    - The mandatory GetReport class-specific request was accidentally omitted from previous versions of the demos + *      based on the Human Interface Device (HID) class. This has been corrected, and any user projects based on the + *      HID demos should also be updated accordingly. + *    - The CDC demos now correctly send an empty packet directly after a full packet, to end the transmission. + *      Failure to do this on projects which always or frequently send full packets will cause buffering issues on + *      the host OS. All CDC user projects are advised to update their transmission routines in the same manner as + *      the library CDC demos. + *    - The previous interrupt-driven Endpoint/Pipe demos did not properly save and restore the currently selected + *      Endpoint/Pipe when the ISR fired. This has been corrected - user projects based on the interrupt driven + *      demos should also update to properly save and restore the selected Endpoint/Pipe. + * + *  <b>Non-USB Library Components</b> + *    - The Atomic.h and ISRMacro.h header files in MyUSB/Common have been removed, as the library is now only + *      compatible with avr-libc library versions newer than the time before the functionality of the deleted + *      headers was available. + * + *  <b>Device Mode</b> + *    - The GetDescriptor function (see StdDescriptors.h) now has a new prototype, with altered parameter names and + *      functions. Existing projects will need to update the GetDescriptor implementation to reflect the new API. + *      The previously split Type and Index parameters are now passed as the original wValue parameter to the + *      function, to make way for the USB specification wIndex parameter which is <i>not</i> the same as the + *      previous Index parameter. + *    - The USB_UnhandledControlPacket event (see Events.h) now has new parameter names, to be in line with the + *      official USB specification. Existing code will need to be altered to use the new parameter names. + *    - The USB_CreateEndpoints event (see Events.h) has been renamed to USB_ConfigurationChanged, which is more + *      appropriate. It fires in an identical manner to the previously named event, thus the only change to be made + *      is the event name itself in the user project. + *    - The USB_Descriptor_Language_t structure no longer exists in StdDescriptors.h, as this was a + *      pseudo-descriptor modeled on the string descriptor. It is replaced by the true USB_Descriptor_String_t type + *      descriptor as indicated in the USB specification, thus all device code must be updated accordingly. + *    - The names of several Endpoint macros have been changed to be more consistent with the rest of the library, + *      with no implementation changes. This means that existing code can be altered to use the new macro names + *      with no other considerations required. See Endpoint.h for the new macro names. + *    - The previous version of the MassStorage demo had an incorrect value in the SCSI_Request_Sense_Response_t + *      structure named SenseData in SCSI.c which caused some problems with some hosts. User projects based on this + *      demo should correct the structure value to maintain compatibility across multiple OS platforms. + *    - By default, the descriptor structures use the official USB specification names for the elements. Previous + *      versions of the library used non-standard (but more verbose) names, which are still usable in the current + *      and future releases when the correct compile time option is enabled. See the StdDescriptors.h file + *      documentation for more details. + * + *  <b>Host Mode</b> + *    - The USB_Host_Request_Header_t structure in HostChapter9.h (used for issuing control requests) has had its + *      members renamed to the official USB specification names for requests. Existing code will need to be updated + *      to use the new names. + *    - The names of several Pipe macros have been changed to be more consistent with the rest of the library, + *      with no implementation changes. This means that existing code can be altered to use the new macro names + *      with no other considerations required. See Pipe.h for the new macro names. + *    - By default, the descriptor structures use the official USB specification names for the elements. Previous + *      versions of the library used non-standard (but more verbose) names, which are still usable in the current + *      and future releases when the correct compile time option is enabled. See the StdDescriptors.h file + *      documentation for more details. + *    - The names of the macros in Host.h for controlling the SOF generation have been renamed, see the Host.h + *      module documentation for the new macro names. + * + *  <b>Dual Role Mode</b> + *    - The OTG.h header file has been corrected so that the macros now perform their stated functions. Any existing + *      projects using custom headers to fix the broken OTG header should now be altered to once again use the OTG + *      header inside the library. + *    - The USB_DeviceEnumerationComplete event (see Events.h) now also fires in Device mode, when the host has + *      finished enumerating the device. Projects relying on the event only firing in Host mode should be updated + *      so that the event action only occurs when the USB_Mode global is set to USB_MODE_HOST. + */ + diff --git a/lib/lufa/LUFA/DoxygenPages/OSDrivers.txt b/lib/lufa/LUFA/DoxygenPages/OSDrivers.txt new file mode 100644 index 0000000000..4823c5b089 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/OSDrivers.txt @@ -0,0 +1,111 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** \page Page_OSDrivers Operating System Drivers + * + *  Most of the USB classes supported by LUFA are also supported natively in + *  most operating systems, without extra drivers being required. However, in + *  some cases, a driver file is required in order for the device to enumerate + *  and function correctly. + * + *  \section Sec_OSClassSupport Operating System USB Class Support + *  The table below lists the supported LUFA USB classes, and their associated + *  <i>native</i> support on modern operating systems. + * + *  <table> + *  <tr> + *   <th width="200px">USB Class</th> + *   <th width="150px">Android</th> + *   <th width="150px">Windows</th> + *   <th width="150px">Linux</th> + *   <th width="150px">OS X</th> + *  </tr> + *  <tr> + *   <td>Android Open Accessory</td> + *   <td>2.3.4+</td> + *   <td>N/A</td> + *   <td>N/A</td> + *   <td>N/A</td> + *  </tr> + *  <tr> + *   <td>Audio 1.0</td> + *   <td>N/A</td> + *   <td>XP+</td> + *   <td>2.6.?+</td> + *   <td>10.?+</td> + *  </tr> + *  <tr> + *   <td>CDC-ACM</td> + *   <td>N/A</td> + *   <td>XP+</td> + *   <td>2.6.?+</td> + *   <td>10.?+</td> + *  </tr> + *  <tr> + *   <td>HID</td> + *   <td>3.?+</td> + *   <td>XP+</td> + *   <td>2.6.?+</td> + *   <td>10.?+</td> + *  </tr> + *  <tr> + *   <td>MIDI</td> + *   <td>N/A</td> + *   <td>XP+</td> + *   <td>2.6.?+</td> + *   <td>10.?+</td> + *  </tr> + *  <tr> + *   <td>Mass Storage</td> + *   <td>N/A</td> + *   <td>XP+</td> + *   <td>2.6.?+</td> + *   <td>10.?+</td> + *  </tr> + *  <tr> + *   <td>Printer</td> + *   <td>N/A</td> + *   <td>XP+</td> + *   <td>2.6.?+</td> + *   <td>10.?+</td> + *  </tr> + *  <tr> + *   <td>RNDIS</td> + *   <td>N/A</td> + *   <td>XP+</td> + *   <td>2.6.?+</td> + *   <td>N/A</td> + *  </tr> + *  <tr> + *   <td>Still Image</td> + *   <td>N/A</td> + *   <td>XP+</td> + *   <td>2.6.?+</td> + *   <td>10.?+</td> + *  </tr> + *  </table> + * + *  \section Sec_WinINFTemplates Windows INF Drivers + *  Windows uses INF driver files to associate a USB device of a specific class, + *  VID/PID ID pair, Windows Compatibility ID or other characteristic to a kernel + *  driver. In most cases these files are build into the operating system, and + *  no special user action or driver files are required for a device using a + *  standard USB class to enumerate. However, for some classes, a specific INF + *  driver must be created and given to the operating system for the device to + *  enumerate. + * + *  Those USB classes requiring a custom INF driver file in Windows are listed + *  below, along with a basic INF template for each class. + * + *  \subsection SSec_WinINF_CDC Windows CDC INF Template + *  This template is required for all CDC-ACM devices on Windows XP or newer. + *  \verbinclude "WindowsINF/LUFA CDC-ACM.inf" + * + *  \subsection SSec_WinINF_RNDIS Windows RNDIS INF Template + *  This template is required for all RNDIS devices on Windows XP or newer. + *  \verbinclude "WindowsINF/LUFA RNDIS.inf" + */ + diff --git a/lib/lufa/LUFA/DoxygenPages/ProgrammingApps.txt b/lib/lufa/LUFA/DoxygenPages/ProgrammingApps.txt new file mode 100644 index 0000000000..653b4ad04b --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/ProgrammingApps.txt @@ -0,0 +1,27 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** \page Page_ProgrammingApps Programming an Application into a USB AVR + * + *  Once you have built an application, you will need a way to program in the resulting ".HEX" file (and, if your + *  application uses EEPROM variables with initial values, also a ".EEP" file) into your USB AVR. Normally, the + *  reprogramming of an AVR device must be performed using a special piece of programming hardware, through one of the + *  supported AVR programming protocols - ISP, HVSP, HVPP, JTAG, dW or PDI. This can be done through a custom programmer, + *  a third party programmer, or an official Atmel AVR tool - for more information, see the <a>atmel.com</a> website. + * + *  Alternatively, you can use the bootloader. From the Atmel factory, each USB AVR comes preloaded with the Atmel + *  DFU (Device Firmware Update) class bootloader, a small piece of AVR firmware which allows the remainder of the + *  AVR to be programmed through a non-standard interface such as the serial USART port, SPI, or (in this case) USB. + *  Bootloaders have the advantage of not requiring any special hardware for programming, and cannot usually be erased + *  or broken without an external programming device. They have disadvantages however; they cannot change the fuses of + *  the AVR (special configuration settings that control the operation of the chip itself) and a small portion of the + *  AVR's FLASH program memory must be reserved to contain the bootloader firmware, and thus cannot be used by the + *  loaded application. + * + *  If you wish to use the DFU bootloader to program in your application, refer to your DFU programmer's documentation. + *  Atmel provides a free utility called FLIP which is USB AVR compatible, and an open source (Linux compatible) + *  alternative exists called "dfu-programmer". + */ diff --git a/lib/lufa/LUFA/DoxygenPages/SoftwareBootloaderJump.txt b/lib/lufa/LUFA/DoxygenPages/SoftwareBootloaderJump.txt new file mode 100644 index 0000000000..f8c2523d7b --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/SoftwareBootloaderJump.txt @@ -0,0 +1,71 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** + *  \page Page_SoftwareBootloaderStart Entering the Bootloader via Software + * + *  A common requirement of many applications is the ability to jump to the programmed bootloader of a chip + *  on demand, via the code's firmware (i.e. not as a result of any physical user interaction with the + *  hardware). This might be required because the device does not have any physical user input, or simply + *  just to streamline the device upgrade process on the host PC. + * + *  The following C code snippets may be used to enter the bootloader upon request by the user application. + *  By using the watchdog to physically reset the controller, it is ensured that all system hardware is + *  completely reset to their defaults before the bootloader is run. This is important; since bootloaders + *  are written to occupy a very limited space, they usually make assumptions about the register states based + *  on the default values after a hard-reset of the chip. + * + *  \section Sec_SoftareBootAVR8 AVR8 Architecture + *  The following software bootloader jump code is written for the AVR8 architecture. + * + *  \code + *  #include <avr/wdt.h> + *  #include <avr/io.h> + *  #include <util/delay.h> + * + *  #include <LUFA/Common/Common.h> + *  #include <LUFA/Drivers/USB/USB.h> + * + *  uint32_t Boot_Key ATTR_NO_INIT; + * + *  #define MAGIC_BOOT_KEY            0xBADCAFE5 + *  #define BOOTLOADER_START_ADDRESS  ((FLASH_SIZE_BYTES - BOOTLOADER_SEC_SIZE_BYTES) >> 1) + * + *  void Bootloader_Jump_Check(void) ATTR_INIT_SECTION(3); + *  void Bootloader_Jump_Check(void) + *  { + *      // If the reset source was the bootloader and the key is correct, clear it and jump to the bootloader + *      if ((MCUSR & (1 << WDRF)) && (Boot_Key == MAGIC_BOOT_KEY)) + *      { + *          Boot_Key = 0; + *          ((void (*)(void))BOOTLOADER_START_ADDRESS)(); + *      } + *  } + * + *  void Jump_To_Bootloader(void) + *  { + *      // If USB is used, detach from the bus and reset it + *      USB_Disable(); + * + *      // Disable all interrupts + *      cli(); + * + *      // Wait two seconds for the USB detachment to register on the host + *      Delay_MS(2000); + * + *      // Set the bootloader key to the magic value and force a reset + *      Boot_Key = MAGIC_BOOT_KEY; + *      wdt_enable(WDTO_250MS); + *      for (;;); + *  } + *  \endcode + * + *  Note that the bootloader magic key can be any arbitrary value. The <em>FLASH_SIZE_BYTES</em> and + *  <em>BOOTLOADER_SEC_SIZE_BYTES</em> tokens should be replaced with the total flash size of the AVR + *  in bytes, and the allocated size of the bootloader section for the target AVR. + * + */ + diff --git a/lib/lufa/LUFA/DoxygenPages/Style/Footer.htm b/lib/lufa/LUFA/DoxygenPages/Style/Footer.htm new file mode 100644 index 0000000000..a72c5bdd24 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/Style/Footer.htm @@ -0,0 +1,35 @@ +<!--BEGIN GENERATE_TREEVIEW--> +	<div id="nav-path" class="navpath"><!-- id is needed for treeview function! --> +		<ul> +			<li class="footer" style="float:left !important;"> +				$generatedby +				<a href="http://www.doxygen.org/index.html"> +					<img class="footer" src="$relpath$doxygen.png" alt="doxygen"/> +				</a> +				$doxygenversion +			</li> + +			<li class="footer"> +				<a href="http://www.lufa-lib.org" title="LUFA Project Page">LUFA Project Page</a> | <a href="http://www.lufa-lib.org/support" title="LUFA Support List">Support Mailing List</a> | <a href="http://www.lufa-lib.org/donate" title="Donate to Support LUFA">Donate</a> | <a href="http://www.fourwalledcubicle.com" title="Four Walled Cubicle Website">Four Walled Cubicle</a> - LUFA, the Lightweight USB Framework for AVRs +			</li> +		</ul> +	</div> +<!--END GENERATE_TREEVIEW--> +<!--BEGIN !GENERATE_TREEVIEW--> +		<hr class="footer"/> +		<div class="footer"> +			<span style="float: left;"> +				$generatedby +				<a href="http://www.doxygen.org/index.html"> +					<img class="footer" src="$relpath$doxygen.png" alt="doxygen"/> +				</a> +				$doxygenversion +			</span> + +			<span style="margin-right: 20px; float: right;"> +				<a href="http://www.lufa-lib.org" title="LUFA Project Page">LUFA Project Page</a> | <a href="http://www.lufa-lib.org/support" title="LUFA Support List">Support Mailing List</a> | <a href="http://www.lufa-lib.org/donate" title="Donate to Support LUFA">Donate</a> | <a href="http://www.fourwalledcubicle.com" title="Four Walled Cubicle Website">Four Walled Cubicle</a> - LUFA, the Lightweight USB Framework for AVRs +			</span> +		</div> +<!--END !GENERATE_TREEVIEW--> +	</body> +</html>
\ No newline at end of file diff --git a/lib/lufa/LUFA/DoxygenPages/Style/Style.css b/lib/lufa/LUFA/DoxygenPages/Style/Style.css new file mode 100644 index 0000000000..933215546f --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/Style/Style.css @@ -0,0 +1,93 @@ +/* ============================= */ +/*    Page Header Formattings    */ +/* ============================= */ +#titlearea { +	background-color:#E1E7F4; +	background-image:url('nav_f.png'); +	background-repeat:repeat-x; +	color:#20335A; +	font-weight:bold; +	text-shadow:0 1px 1px rgba(255, 255, 255, 0.9); +} + +#projectlogo { +	padding-left: 10px; +} + +/* ============================= */ +/*    General Text Formattings   */ +/* ============================= */ +body,table,div,p,dl { +	font-family:Lucida Grande, Verdana, Geneva, Arial, sans-serif; +	font-size:13px; +	line-height:1.3; +} + +div.header, div.contents p { +	padding-left:12px; +} + +/* ============================= */ +/* API Documentation Formattings */ +/* ============================= */ +div.contents table.memberdecls, .paramname { +	font-family:Consolas, Monaco, courier, sans-serif; +	font-size:105%; +	padding-right:20px; +} + +/* ============================= */ +/*    HTML Heading Formattings   */ +/* ============================= */ +h1, h2, h3, h4 { +	font-family:Lucida Grande, Verdana, Geneva, Arial, sans-serif; +} + +h1 { +	font-size:25px; +	margin-bottom:10px; +} + +h2 { +	color:#42657B; +	font-size:17px; +} + +h3 { +	font-size:15px; +} + +h4 { +	font-size:13px; +} + +/* ============================= */ +/*    Code Snippet Formattings   */ +/* ============================= */ +span.keyword { +	color:#008000; +} + +span.keywordtype { +	color:#604020; +} + +span.keywordflow { +	color:#e08000; +} + +span.comment { +	color:#008000; +} + +span.preprocessor { +	color:#806020; +} + +span.stringliteral { +	color:#002080; +} + +span.charliteral { +	color:#008080; +} diff --git a/lib/lufa/LUFA/DoxygenPages/VIDAndPIDValues.txt b/lib/lufa/LUFA/DoxygenPages/VIDAndPIDValues.txt new file mode 100644 index 0000000000..8b17220445 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/VIDAndPIDValues.txt @@ -0,0 +1,199 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** \page Page_VIDPID VID and PID values + * + *  \section Sec_VIDPID_Allocations VID and PID Allocations + *  The LUFA library uses VID/PID combinations generously donated by Atmel. The following VID/PID combinations + *  are used within the LUFA demos, and thus may be re-used by derivations of each demo. Free PID values may be + *  used by future LUFA demo projects. + * + *  <b>These VID/PID values should not be used in commercial designs under any circumstances.</b> Private projects + *  may use the following values freely, but must accept any collisions due to other LUFA derived private projects + *  sharing identical values. It is suggested that private projects using interfaces compatible with existing + *  demos share the same VID/PID value. + * + *  <table> + *   <tr> + *    <th>VID</th> + *    <th>PID</th> + *    <th>Usage</th> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2040</td> + *    <td>Test VID/PID (See \ref Sec_Test_VIDPID)</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2041</td> + *    <td>Mouse Demo Application</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2042</td> + *    <td>Keyboard Demo Application</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2043</td> + *    <td>Joystick Demo Application</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2044</td> + *    <td>CDC Demo Application</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2045</td> + *    <td>Mass Storage Demo Application</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2046</td> + *    <td>Audio Output Demo Application</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2047</td> + *    <td>Audio Input Demo Application</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2048</td> + *    <td>MIDI Demo Application</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2049</td> + *    <td>MagStripe Project</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x204A</td> + *    <td>CDC Class Bootloader</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x204B</td> + *    <td>USB to Serial Demo Application</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x204C</td> + *    <td>RNDIS Demo Application</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x204D</td> + *    <td>Combined Keyboard and Mouse Demo Application</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x204E</td> + *    <td>Dual CDC Demo Application</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td> + *     0x204F + *    </td> + *    <td>Generic HID Demo Application</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2060</td> + *    <td>Benito Programmer Project</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2061</td> + *    <td>Combined Mass Storage and Keyboard Demo</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2062</td> + *    <td>Combined CDC and Mouse Demo</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2063</td> + *    <td>Mass Storage/HID Interface Datalogger Project</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2064</td> + *    <td>Interfaceless Control-Only LUFA Devices</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2065</td> + *    <td>Test and Measurement Demo</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td> + *     0x2066 + *    </td> + *    <td>Multiple Report Keyboard/Mouse HID Demo</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2067</td> + *    <td>HID Class Bootloader</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x2068</td> + *    <td>Virtual Serial/Mass Storage Demo</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td> + *     0x2069 + *    </td> + *    <td>Webserver Project</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x206A</td> + *    <td>Media Control Project</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x206B</td> + *    <td>Printer Class Bootloader</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x206C</td> + *    <td>Bulk Vendor Demo Application</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x206D</td> + *    <td>Dual MIDI Demo Application</td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x206E</td> + *    <td><i>Currently Unallocated</i></td> + *   </tr> + *   <tr> + *    <td>0x03EB</td> + *    <td>0x206F</td> + *    <td><i>Currently Unallocated</i></td> + *   </tr> + *  </table> + * + *  \section Sec_Test_VIDPID The Test VID/PID Combination + *  For use in testing of LUFA powered devices during development only, by non-commercial entities. + *  All devices must accept collisions on this VID/PID range (from other in-development LUFA devices) + *  to be resolved by using a unique release number in the Device Descriptor. No devices using this + *  VID/PID combination may be released to the general public. + */ + diff --git a/lib/lufa/LUFA/DoxygenPages/WritingBoardDrivers.txt b/lib/lufa/LUFA/DoxygenPages/WritingBoardDrivers.txt new file mode 100644 index 0000000000..b2ff07e666 --- /dev/null +++ b/lib/lufa/LUFA/DoxygenPages/WritingBoardDrivers.txt @@ -0,0 +1,47 @@ +/** \file + * + *  This file contains special DoxyGen information for the generation of the main page and other special + *  documentation pages. It is not a project source file. + */ + +/** \page Page_WritingBoardDrivers Writing LUFA Board Drivers + * + *  LUFA ships with several basic pre-made board drivers, to control hardware present on the supported board + *  hardware - such as Dataflash ICs, LEDs, Joysticks, or other hardware peripherals. When compiling an application + *  which makes use of one or more board drivers located in <i>LUFA/Drivers/Board</i>, you must also indicate which + *  board hardware you are using in your project makefile. This is done by defining the <tt>BOARD</tt> macro using + *  the <tt>-D</tt> switch passed to the compiler, with a constant of <tt>BOARD_{Name}</tt>. For example, + *  <tt>-DBOARD=BOARD_USBKEY</tt> instructs the compiler to use the USBKEY board hardware drivers. + * + *  If your application does not use <i>any</i> board level drivers, you can omit the definition of the <tt>BOARD</tt> + *  macro. However, some users may wish to write their own custom board hardware drivers which are to remain compatible + *  with the LUFA hardware API. To do this, the <tt>BOARD</tt> macro should be defined to the value <tt>BOARD_USER</tt>. + *  This indicates that the board level drivers should be located in a folder named "Board" located inside the + *  application's folder. + * + *  When used, the driver stub files located in the <tt>LUFA/CodeTemplates/DriverStubs</tt> folder should be copied to + *  the user application's <tt>Board/</tt> directory, and filled out to include the values and code needed to control + *  the custom board hardware. Once done, the existing LUFA board level APIs (accessed in the regular + *  <tt>LUFA/Drivers/Board/</tt> folder) will redirect to the user board drivers, maintaining code compatibility and + *  allowing for a different board to be selected through the project makefile with no code changes. + * + *  \section Sec_BoardTemplates Board Driver Templates + * + *  The templates for each board driver are reproduced below. + * + *  \subsection SSec_BoardTemplates_Board Template for USER <Board/Board.h> + *  \include "DriverStubs/Board.h" + * + *  \subsection SSec_BoardTemplates_Buttons Template for USER <Board/Buttons.h> + *  \include "DriverStubs/Buttons.h" + * + *  \subsection SSec_BoardTemplates_Dataflash Template for USER <Board/Dataflash.h> + *  \include "DriverStubs/Dataflash.h" + * + *  \subsection SSec_BoardTemplates_Joystick Template for USER <Board/Joystick.h> + *  \include "DriverStubs/Joystick.h" + * + *  \subsection SSec_BoardTemplates_LEDs Template for USER <Board/LEDs.h> + *  \include "DriverStubs/LEDs.h" + */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/ADAFRUITU4/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/ADAFRUITU4/Board.h new file mode 100644 index 0000000000..a640ddcc2f --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/ADAFRUITU4/Board.h @@ -0,0 +1,78 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Adafruit U4 Breakout board. + *  \copydetails Group_BoardInfo_ADAFRUITU4 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_ADAFRUITU4 ADAFRUITU4 + *  \brief Board specific information header for the Adafruit U4 Breakout board. + * + *  Board specific information header for the Adafruit U4 Breakout board (http://ladyada.net/products/atmega32u4breakout). + * + *  @{ + */ + +#ifndef __BOARD_ADAFRUITU4_H__ +#define __BOARD_ADAFRUITU4_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h new file mode 100644 index 0000000000..be7180c052 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/ADAFRUITU4/LEDs.h @@ -0,0 +1,135 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTE.6</td></tr> + *  </table> + * + *  @{ + */ + +#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_Disable(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) +			{ +				PINE   = 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/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Board.h new file mode 100644 index 0000000000..11e6e0e676 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Atmel ATAVRUSBRF01. + *  \copydetails Group_BoardInfo_ATAVRUSBRF01 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_ATAVRUSBRF01 ATAVRUSBRF01 + *  \brief Board specific information header for the Atmel ATAVRUSBRF01. + * + *  Board specific information header for the Atmel ATAVRUSBRF01. + * + *  @{ + */ + +#ifndef __BOARD_ATAVRUSBRF01_H__ +#define __BOARD_ATAVRUSBRF01_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h new file mode 100644 index 0000000000..7d5a48bb9a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Atmel ATAVRUSBRF01. + *  \copydetails Group_Buttons_ATAVRUSBRF01 + * + *  \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_ATAVRUSBRF01 ATAVRUSBRF01 + *  \brief Board specific Buttons driver header for the Atmel ATAVRUSBRF01. + * + *  Board specific Buttons driver header for the Atmel ATAVRUSBRF01. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_ATAVRUSBRF01_H__ +#define __BUTTONS_ATAVRUSBRF01_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h new file mode 100644 index 0000000000..cd7bff7885 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h @@ -0,0 +1,139 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Atmel ATAVRUSBRF01. + *  \copydetails Group_LEDs_ATAVRUSBRF01 + * + *  \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_ATAVRUSBRF01 ATAVRUSBRF01 + *  \brief Board specific LED driver header for the Atmel ATAVRUSBRF01. + * + *  Board specific LED driver header for the Atmel ATAVRUSBRF01. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>RX LED</td><td>High</td><td>PORTD.0</td></tr> + *    <tr><td>LEDS_LED2</td><td>Red</td><td>TX LED</td><td>High</td><td>PORTD.1</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_ATAVRUSBRF01_H__ +#define __LEDS_ATAVRUSBRF01_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 the second LED on the board. */ +			#define LEDS_LED2        (1 << 1) + +			/** 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_Disable(void) +			{ +				DDRD  &= ~LEDS_ALL_LEDS; +				PORTD &= ~LEDS_ALL_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTD |= (LEDMask & LEDS_ALL_LEDS); +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTD &= ~(LEDMask & LEDS_ALL_LEDS); +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTD = (PORTD & ~LEDS_ALL_LEDS) | (LEDMask & LEDS_ALL_LEDS); +			} + +			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) +			{ +				PIND  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/Board.h new file mode 100644 index 0000000000..9f5b291aa3 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Tempusdictum Benito. + *  \copydetails Group_BoardInfo_BENITO + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_BENITO BENITO + *  \brief Board specific information header for the Tempusdictum Benito. + * + *  Board specific information header for the Tempusdictum Benito (http://dorkbotpdx.org/wiki/benito). + * + *  @{ + */ + +#ifndef __BOARD_BENITO_H__ +#define __BOARD_BENITO_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/Buttons.h new file mode 100644 index 0000000000..5e9128eb34 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Tempusdictum Benito. + *  \copydetails Group_Buttons_BENITO + * + *  \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_BENITO BENITO + *  \brief Board specific Buttons driver header for the Tempusdictum Benito. + * + *  Board specific Buttons driver header for the Tempusdictum Benito (http://dorkbotpdx.org/wiki/benito). + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_BENITO_H__ +#define __BUTTONS_BENITO_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/LEDs.h new file mode 100644 index 0000000000..f968d7ce89 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BENITO/LEDs.h @@ -0,0 +1,139 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Tempusdictum Benito. + *  \copydetails Group_LEDs_BENITO + * + *  \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_BENITO BENITO + *  \brief Board specific LED driver header for the Tempusdictum Benito. + * + *  Board specific LED driver header for the Tempusdictum Benito (http://dorkbotpdx.org/wiki/benito). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>TX LED</td><td>Low</td><td>PORTC.7</td></tr> + *    <tr><td>LEDS_LED2</td><td>Red</td><td>RX LED</td><td>Low</td><td>PORTC.6</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_BENITO_H__ +#define __LEDS_BENITO_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 << 7) + +			/** 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 none of the board LEDs. */ +			#define LEDS_NO_LEDS     0 + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void LEDs_Init(void) +			{ +				DDRC  |= LEDS_ALL_LEDS; +				PORTC |= LEDS_ALL_LEDS; +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRC  &= ~LEDS_ALL_LEDS; +				PORTC &= ~LEDS_ALL_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTC &= ~LEDMask; +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTC |= LEDMask; +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTC = ((PORTC | LEDS_ALL_LEDS) & ~LEDMask); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTC = ((PORTC | LEDMask) & ~ActiveMask); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PINC  = LEDMask; +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return (~PORTC & LEDS_ALL_LEDS); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BIGMULTIO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BIGMULTIO/Board.h new file mode 100644 index 0000000000..02ebe0941c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BIGMULTIO/Board.h @@ -0,0 +1,78 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Bitwizard Big-Multio. + *  \copydetails Group_BoardInfo_BIGMULTIO + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_BIGMULTIO BIGMULTIO + *  \brief Board specific information header for the Bitwizard Big-Multio. + * + *  Board specific information header for the Bitwizard Big-Multio (http://www.bitwizard.nl/wiki/index.php/Usbbigmultio). + * + *  @{ + */ + +#ifndef __BOARD_BIGMULTIO_H__ +#define __BOARD_BIGMULTIO_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BIGMULTIO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BIGMULTIO/LEDs.h new file mode 100644 index 0000000000..93048f5640 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BIGMULTIO/LEDs.h @@ -0,0 +1,161 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Bitwizard Big-Multio. + *  \copydetails Group_LEDs_BIGMULTIO + * + *  \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_BIGMULTIO BIGMULTIO + *  \brief Board specific LED driver header for the Bitwizard Big-Multio. + * + *  Board specific LED driver header for the Bitwizard Big-Multio (http://www.bitwizard.nl/wiki/index.php/Usbbigmultio). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Unknown</td><td>LED0</td><td>High</td><td>PORTF.6</td></tr> + *    <tr><td>LEDS_LED2</td><td>Unknown</td><td>LED1</td><td>High</td><td>PORTF.7</td></tr> + *    <tr><td>LEDS_LED3</td><td>Unknown</td><td>LED2</td><td>High</td><td>PORTE.2</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_BIGMULTIO_H__ +#define __LEDS_BIGMULTIO_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_PORTF_LEDS       (LEDS_LED1 | LEDS_LED2) +			#define LEDS_PORTE_LEDS       LEDS_LED3 +	#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 the second LED on the board. */ +			#define LEDS_LED3        (1 << 2) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3) + +			/** LED mask for none of the board LEDs. */ +			#define LEDS_NO_LEDS     0 + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void LEDs_Init(void) +			{ +				DDRF  |=  LEDS_PORTF_LEDS; +				DDRE  |=  LEDS_PORTE_LEDS; + +				PORTF &= ~LEDS_PORTF_LEDS; +				PORTE &= ~LEDS_PORTE_LEDS; +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRF  &= ~LEDS_PORTF_LEDS; +				DDRE  &= ~LEDS_PORTE_LEDS; + +				PORTF &= ~LEDS_PORTF_LEDS; +				PORTE &= ~LEDS_PORTE_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTF |= (LEDMask & LEDS_PORTF_LEDS); +				PORTE |= (LEDMask & LEDS_PORTE_LEDS); +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTF &= ~(LEDMask & LEDS_PORTF_LEDS); +				PORTE &= ~(LEDMask & LEDS_PORTE_LEDS); +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTF = (PORTF & ~LEDS_PORTF_LEDS) | (LEDMask & LEDS_PORTF_LEDS); +				PORTE = (PORTE & ~LEDS_PORTE_LEDS) | (LEDMask & LEDS_PORTE_LEDS); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTF = (PORTF & ~(LEDMask & LEDS_PORTF_LEDS)) | (ActiveMask & LEDS_PORTF_LEDS); +				PORTE = (PORTE & ~(LEDMask & LEDS_PORTE_LEDS)) | (ActiveMask & LEDS_PORTE_LEDS); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PINF  = (LEDMask & LEDS_PORTF_LEDS); +				PINE  = (LEDMask & LEDS_PORTE_LEDS); +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return ((PORTF & LEDS_PORTF_LEDS) | (PORTE & LEDS_PORTE_LEDS)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BLACKCAT/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BLACKCAT/Board.h new file mode 100644 index 0000000000..a9aef6e9eb --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BLACKCAT/Board.h @@ -0,0 +1,78 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the BLACKCAT USB JTAG. + *  \copydetails Group_BoardInfo_BLACKCAT + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_BLACKCAT BLACKCAT + *  \brief Board specific information header for the BLACKCAT USB JTAG. + * + *  Board specific information header for the TCNISO Blackcat USB JTAG (http://www.embeddedcomputers.net/products/BlackcatUSB). + * + *  @{ + */ + +#ifndef __BOARD_BLACKCAT_H__ +#define __BOARD_BLACKCAT_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h new file mode 100644 index 0000000000..5a7c4f2332 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BLACKCAT/LEDs.h @@ -0,0 +1,139 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Unknown</td><td>LED0</td><td>High</td><td>PORTD.6</td></tr> + *    <tr><td>LEDS_LED2</td><td>Unknown</td><td>LED1</td><td>High</td><td>PORTD.3</td></tr> + *  </table> + * + *  @{ + */ + +#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_Disable(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) +			{ +				PIND  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/BUI/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BUI/Board.h new file mode 100644 index 0000000000..87102b60f7 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BUI/Board.h @@ -0,0 +1,78 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Busware BUI. + *  \copydetails Group_BoardInfo_BUI + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_BUI BUI + *  \brief Board specific information header for the Busware BUI. + * + *  Board specific information header for the Busware BUI (http://www.busware.de/tiki-index.php?page=BUI). + * + *  @{ + */ + +#ifndef __BOARD_BUI_H__ +#define __BOARD_BUI_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BUI/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BUI/LEDs.h new file mode 100644 index 0000000000..d982bcd67d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BUI/LEDs.h @@ -0,0 +1,143 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Busware BUI. + *  \copydetails Group_LEDs_BUI + * + *  \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_BUI BUI + *  \brief Board specific LED driver header for the Busware BUI. + * + *  Board specific LED driver header for the Busware BUI (http://www.busware.de/tiki-index.php?page=BUI). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Red</td><td>RGB LED</td><td>High</td><td>PORTC.2</td></tr> + *    <tr><td>LEDS_LED2</td><td>Green</td><td>RGB LED</td><td>High</td><td>PORTC.3</td></tr> + *    <tr><td>LEDS_LED3</td><td>Blue</td><td>RGB LED</td><td>High</td><td>PORTC.4</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_BUI_H__ +#define __LEDS_BUI_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 << 2) + +			/** LED mask for the second LED on the board. */ +			#define LEDS_LED2        (1 << 3) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        (1 << 4) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3) + +			/** LED mask for none of the board LEDs. */ +			#define LEDS_NO_LEDS     0 + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void LEDs_Init(void) +			{ +				DDRC  |=  LEDS_ALL_LEDS; +				PORTC &= ~LEDS_ALL_LEDS; +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRC  &= ~LEDS_ALL_LEDS; +				PORTC &= ~LEDS_ALL_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTC |= LEDMask; +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTC &= ~LEDMask; +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTC = (PORTC & ~LEDS_ALL_LEDS) | LEDMask; +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTC = (PORTC & ~LEDMask) | ActiveMask; +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PINC  = LEDMask; +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return (PORTC & LEDS_ALL_LEDS); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Board.h new file mode 100644 index 0000000000..5af60abe1b --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Board.h @@ -0,0 +1,86 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Fletchtronics BUMBLEB. + *  \copydetails Group_BoardInfo_BUMBLEB + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_BUMBLEB BUMBLEB + *  \brief Board specific information header for the Fletchtronics BUMBLEB. + * + *  Board specific information header for the Fletchtronics BUMBLEB (http://fletchtronics.net/bumble-b). + * + *  @{ + */ + +#ifndef __BOARD_BUMBLEB_H__ +#define __BOARD_BUMBLEB_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../Joystick.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has a hardware Joystick mounted. */ +			#define BOARD_HAS_JOYSTICK + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Buttons.h new file mode 100644 index 0000000000..812cf79246 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Buttons.h @@ -0,0 +1,105 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Fletchtronics BUMBLEB. + *  \copydetails Group_Buttons_BUMBLEB + * + *  \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_BUMBLEB BUMBLEB + *  \brief Board specific Buttons driver header for the Fletchtronics BUMBLEB. + * + *  Board specific buttons driver header for the Fletchtronics BUMBLEB (http://fletchtronics.net/bumble-b). The BUMBLEB + *  third-party board does not include any on-board peripherals, but does have an officially recommended external peripheral + *  layout for buttons, LEDs and a Joystick. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_BUMBLEB_H__ +#define __BUTTONS_BUMBLEB_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Joystick.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Joystick.h new file mode 100644 index 0000000000..259c674d6e --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/Joystick.h @@ -0,0 +1,123 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific joystick driver header for the Fletchtronics BUMBLEB. + *  \copydetails Group_Joystick_BUMBLEB + * + *  \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_BUMBLEB BUMBLEB + *  \brief Board specific joystick driver header for the Fletchtronics BUMBLEB. + * + *  Board specific joystick driver header for the Fletchtronics BUMBLEB (http://fletchtronics.net/bumble-b). The BUMBLEB + *  third-party board does not include any on-board peripherals, but does have an officially recommended external peripheral + *  layout for buttons, LEDs and a Joystick. + * + *  <table> + *    <tr><th>Left Port Pin</th><th>Up Port Pin</th><th>Right Port Pin</th><th>Down Port Pin</th><th>Press Port Pin</th></tr> + *    <tr><td>PORTD.2</td><td>PORTD.3</td><td>PORTD.0</td><td>PORTD.1</td><td>PORTD.4</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __JOYSTICK_BUMBLEB_H__ +#define __JOYSTICK_BUMBLEB_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_MASK                 ((1 << 0) | (1 << 1) | (1 << 2) | (1 << 3) | (1 << 4)) +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Mask for the joystick being pushed in the left direction. */ +			#define JOY_LEFT                  (1 << 2) + +			/** Mask for the joystick being pushed in the upward direction. */ +			#define JOY_UP                    (1 << 3) + +			/** Mask for the joystick being pushed in the right direction. */ +			#define JOY_RIGHT                 (1 << 0) + +			/** Mask for the joystick being pushed in the downward direction. */ +			#define JOY_DOWN                  (1 << 1) + +			/** Mask for the joystick being pushed inward. */ +			#define JOY_PRESS                 (1 << 4) + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void Joystick_Init(void) +			{ +				DDRD  &= ~JOY_MASK; +				PORTD |=  JOY_MASK; +			} + +			static inline void Joystick_Disable(void) +			{ +				DDRD  &= ~JOY_MASK; +				PORTD &= ~JOY_MASK; +			} + +			static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Joystick_GetStatus(void) +			{ +				return (uint8_t)(~PIND & JOY_MASK); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/LEDs.h new file mode 100644 index 0000000000..bb070db970 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/BUMBLEB/LEDs.h @@ -0,0 +1,149 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Fletchtronics BUMBLEB. + *  \copydetails Group_LEDs_BUMBLEB + * + *  \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_BUMBLEB BUMBLEB + *  \brief Board specific LED driver header for the Fletchtronics BUMBLEB. + * + *  Board specific LED driver header for the Fletchtronics BUMBLEB (http://fletchtronics.net/bumble-b). The BUMBLEB + *  third-party board does not include any on-board peripherals, but does have an officially recommended external + *  peripheral layout for buttons, LEDs and a Joystick. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>N/A</td><td>User Supplied</td><td>High</td><td>PORTB.4</td></tr> + *    <tr><td>LEDS_LED2</td><td>N/A</td><td>User Supplied</td><td>High</td><td>PORTB.5</td></tr> + *    <tr><td>LEDS_LED3</td><td>N/A</td><td>User Supplied</td><td>High</td><td>PORTB.6</td></tr> + *    <tr><td>LEDS_LED4</td><td>N/A</td><td>User Supplied</td><td>High</td><td>PORTB.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_BUMBLEB_H__ +#define __LEDS_BUMBLEB_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 the second LED on the board. */ +			#define LEDS_LED2        (1 << 5) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        (1 << 6) + +			/** LED mask for the fourth LED on the board. */ +			#define LEDS_LED4        (1 << 7) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4) + +			/** 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_Disable(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) +			{ +				PINB  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/Board.h new file mode 100644 index 0000000000..88679d1b84 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Busware CUL V3. + *  \copydetails Group_BoardInfo_CULV3 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_CULV3 CULV3 + *  \brief Board specific information header for the Busware CUL V3. + * + *  Board specific information header for the Busware CUL V3 (http://busware.de/tiki-index.php?page=CUL). + * + *  @{ + */ + +#ifndef __BOARD_CULV3_H__ +#define __BOARD_CULV3_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/Buttons.h new file mode 100644 index 0000000000..21b6e1c08b --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Busware CULV3. + *  \copydetails Group_LEDs_CULV3 + * + *  \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/LEDs.h. + */ + +/** \ingroup Group_Buttons + *  \defgroup Group_Buttons_CULV3 CULV3 + *  \brief Board specific Buttons driver header for the Busware CULV3. + * + *  Board specific Buttons driver header for the Busware CUL V3 (http://busware.de/tiki-index.php?page=CUL). + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_CULV3_H__ +#define __BUTTONS_CULV3_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/LEDs.h new file mode 100644 index 0000000000..da3ebf85f9 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/CULV3/LEDs.h @@ -0,0 +1,135 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Busware CUL V3. + *  \copydetails Group_LEDs_CULV3 + * + *  \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_CULV3 CULV3 + *  \brief Board specific LED driver header for the Busware CUL V3. + * + *  Board specific LED driver header for the Busware CUL V3 (http://busware.de/tiki-index.php?page=CUL). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>General Indicator</td><td>High</td><td>PORTE.6</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_CULV3_H__ +#define __LEDS_CULV3_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_Disable(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) +			{ +				PINE  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/DUCE/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/DUCE/Board.h new file mode 100644 index 0000000000..8521ec9bd6 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/DUCE/Board.h @@ -0,0 +1,78 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the DorkbotPDX Duce. + *  \copydetails Group_BoardInfo_DUCE + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_DUCE DUCE + *  \brief Board specific information header for the DorkbotPDX Duce. + * + *  Board specific information header for the DorkbotPDX Duce (http://dorkbotpdx.org/wiki/duce). + * + *  @{ + */ + +#ifndef __BOARD_DUCE_H__ +#define __BOARD_DUCE_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/DUCE/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/DUCE/LEDs.h new file mode 100644 index 0000000000..ad866b96d8 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/DUCE/LEDs.h @@ -0,0 +1,147 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the DorkbotPDX Duce. + *  \copydetails Group_LEDs_DUCE + * + *  \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_DUCE DUCE + *  \brief Board specific LED driver header for the DorkbotPDX Duce. + * + *  Board specific LED driver header for the DorkbotPDX Duce (http://dorkbotpdx.org/wiki/duce). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Red</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTC.4</td></tr> + *    <tr><td>LEDS_LED2</td><td>Green</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTC.5</td></tr> + *    <tr><td>LEDS_LED3</td><td>Red</td><td>Bicolor Indicator 2</td><td>High</td><td>PORTC.6</td></tr> + *    <tr><td>LEDS_LED4</td><td>Green</td><td>Bicolor Indicator 2</td><td>High</td><td>PORTC.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_DUCE_H__ +#define __LEDS_DUCE_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 the second LED on the board. */ +			#define LEDS_LED2        (1 << 5) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        (1 << 6) + +			/** LED mask for the fourth LED on the board. */ +			#define LEDS_LED4        (1 << 7) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4) + +			/** LED mask for none of the board LEDs. */ +			#define LEDS_NO_LEDS     0 + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void LEDs_Init(void) +			{ +				DDRC  |=  LEDS_ALL_LEDS; +				PORTC &= ~LEDS_ALL_LEDS; +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRC  &= ~LEDS_ALL_LEDS; +				PORTC &= ~LEDS_ALL_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTC |= LEDMask; +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTC &= ~LEDMask; +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTC = ((PORTC & ~LEDS_ALL_LEDS) | LEDMask); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTC = ((PORTC & ~LEDMask) | ActiveMask); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PINC  = LEDMask; +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return (PORTC & LEDS_ALL_LEDS); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Board.h new file mode 100644 index 0000000000..01b6b93ff0 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Board.h @@ -0,0 +1,90 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Atmel EVK527. + *  \copydetails Group_BoardInfo_EVK527 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_EVK527 EVK527 + *  \brief Board specific information header for the Atmel EVK527. + * + *  Board specific information header for the Atmel EVK527. + * + *  @{ + */ + +#ifndef __BOARD_EVK527_H__ +#define __BOARD_EVK527_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../Dataflash.h" +		#include "../../Joystick.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has a hardware Dataflash mounted. */ +			#define BOARD_HAS_DATAFLASH + +			/** Indicates the board has a hardware Joystick mounted. */ +			#define BOARD_HAS_JOYSTICK + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Buttons.h new file mode 100644 index 0000000000..3094fbe0e0 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Atmel EVK527. + *  \copydetails Group_Buttons_EVK527 + * + *  \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_EVK527 EVK527 + *  \brief Board specific Buttons driver header for the Atmel EVK527. + * + *  Board specific Buttons driver header for the Atmel EVK527. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_EVK527_H__ +#define __BUTTONS_EVK527_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Dataflash.h new file mode 100644 index 0000000000..2ec973e233 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Dataflash.h @@ -0,0 +1,222 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Dataflash driver header for the Atmel EVK527. + *  \copydetails Group_Dataflash_EVK527 + * + *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver + *        dispatch header located in LUFA/Drivers/Board/Dataflash.h. + */ + +/** \ingroup Group_Dataflash + *  \defgroup Group_Dataflash_EVK527 EVK527 + *  \brief Board specific Dataflash driver header for the Atmel EVK527. + * + *  Board specific Dataflash driver header for the Atmel EVK527. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr> + *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB321C (4MB)</td><td>PORTE.6</td><td>SPI0</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __DATAFLASH_EVK527_H__ +#define __DATAFLASH_EVK527_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../../Misc/AT45DB321C.h" +		#include "../../../Peripheral/SPI.h" + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_DATAFLASH_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead. +		#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#define DATAFLASH_CHIPCS_MASK                DATAFLASH_CHIP1 +			#define DATAFLASH_CHIPCS_DDR                 DDRE +			#define DATAFLASH_CHIPCS_PORT                PORTE +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */ +			#define DATAFLASH_TOTALCHIPS                 1 + +			/** Mask for no dataflash chip selected. */ +			#define DATAFLASH_NO_CHIP                    0 + +			/** Mask for the first dataflash chip selected. */ +			#define DATAFLASH_CHIP1                      (1 << 6) + +			/** Internal main memory page size for the board's dataflash IC. */ +			#define DATAFLASH_PAGE_SIZE                  512 + +			/** Total number of pages inside the board's dataflash IC. */ +			#define DATAFLASH_PAGES                      8192 + +		/* Inline Functions: */ +			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC. +			 *  The appropriate SPI interface will be automatically configured. +			 */ +			static inline void Dataflash_Init(void) +			{ +				DATAFLASH_CHIPCS_DDR  |= DATAFLASH_CHIPCS_MASK; +				DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK; + +				SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | SPI_SAMPLE_TRAILING | SPI_MODE_MASTER); +			} + +			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) +			{ +				return SPI_TransferByte(Byte); +			} + +			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 */ +			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SendByte(const uint8_t Byte) +			{ +				SPI_SendByte(Byte); +			} + +			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash. +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_ReceiveByte(void) +			{ +				return SPI_ReceiveByte(); +			} + +			/** Determines the currently selected dataflash chip. +			 * +			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected +			 *          or a DATAFLASH_CHIPn mask (where n is the chip number). +			 */ +			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_GetSelectedChip(void) +			{ +				return (~DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK); +			} + +			/** Selects the given dataflash chip. +			 * +			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is +			 *              the chip number). +			 */ +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) +			{ +				DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT | DATAFLASH_CHIPCS_MASK) & ~ChipMask); +			} + +			/** Deselects the current dataflash chip, so that no dataflash is selected. */ +			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_DeselectChip(void) +			{ +				Dataflash_SelectChip(DATAFLASH_NO_CHIP); +			} + +			/** Selects a dataflash IC from the given page number, which should range from 0 to +			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one +			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside +			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs +			 *  are deselected. +			 * +			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from +			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). +			 */ +			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress) +			{ +				Dataflash_DeselectChip(); + +				if (PageAddress >= DATAFLASH_PAGES) +				  return; + +				Dataflash_SelectChip(DATAFLASH_CHIP1); +			} + +			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive +			 *  a new command. +			 */ +			static inline void Dataflash_ToggleSelectedChipCS(void) +			{ +				uint8_t SelectedChipMask = Dataflash_GetSelectedChip(); + +				Dataflash_DeselectChip(); +				Dataflash_SelectChip(SelectedChipMask); +			} + +			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main +			 *  memory page program or main memory to buffer transfer. +			 */ +			static inline void Dataflash_WaitWhileBusy(void) +			{ +				Dataflash_ToggleSelectedChipCS(); +				Dataflash_SendByte(DF_CMD_GETSTATUS); +				while (!(Dataflash_ReceiveByte() & DF_STATUS_READY)); +				Dataflash_ToggleSelectedChipCS(); +			} + +			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with +			 *  dataflash commands which require a complete 24-bit address. +			 * +			 *  \param[in] PageAddress  Page address within the selected dataflash IC +			 *  \param[in] BufferByte   Address within the dataflash's buffer +			 */ +			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, +			                                              const uint16_t BufferByte) +			{ +				Dataflash_SendByte(PageAddress >> 5); +				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8)); +				Dataflash_SendByte(BufferByte); +			} + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Joystick.h b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Joystick.h new file mode 100644 index 0000000000..909fa02c58 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/Joystick.h @@ -0,0 +1,130 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific joystick driver header for the Atmel EVK527. + *  \copydetails Group_Joystick_EVK527 + * + *  \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_EVK527 EVK527 + *  \brief Board specific joystick driver header for the Atmel EVK527. + * + *  Board specific joystick driver header for the Atmel EVK527. + * + *  <table> + *    <tr><th>Left Port Pin</th><th>Up Port Pin</th><th>Right Port Pin</th><th>Down Port Pin</th><th>Press Port Pin</th></tr> + *    <tr><td>PORTF.4</td><td>PORTF.5</td><td>PORTF.7</td><td>PORTC.6</td><td>PORTF.6</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __JOYSTICK_EVK527_H__ +#define __JOYSTICK_EVK527_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_FMASK                 ((1 << 4) | (1 << 5) | (1 << 6) | (1 << 7)) +			#define JOY_CMASK                 (1 << 6) + +			#define JOY_PORTC_MASK_SHIFT      3 +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Mask for the joystick being pushed in the left direction. */ +			#define JOY_LEFT                  (1 << 4) + +			/** Mask for the joystick being pushed in the right direction. */ +			#define JOY_RIGHT                 (1 << 7) + +			/** Mask for the joystick being pushed in the upward direction. */ +			#define JOY_UP                    (1 << 5) + +			/** Mask for the joystick being pushed in the downward direction. */ +			#define JOY_DOWN                 ((1 << 6) >> JOY_PORTC_MASK_SHIFT) + +			/** Mask for the joystick being pushed inward. */ +			#define JOY_PRESS                 (1 << 6) + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void Joystick_Init(void) +			{ +				DDRF  &= ~JOY_FMASK; +				DDRC  &= ~JOY_CMASK; + +				PORTF |=  JOY_FMASK; +				PORTC |=  JOY_CMASK; +			} + +			static inline void Joystick_Disable(void) +			{ +				DDRF  &= ~JOY_FMASK; +				DDRC  &= ~JOY_CMASK; + +				PORTF &= ~JOY_FMASK; +				PORTC &= ~JOY_CMASK; +			} + +			static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Joystick_GetStatus(void) +			{ +				return (((uint8_t)~PINF & JOY_FMASK) | (((uint8_t)~PINC & JOY_CMASK) >> JOY_PORTC_MASK_SHIFT)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/LEDs.h new file mode 100644 index 0000000000..a10b8229e0 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/EVK527/LEDs.h @@ -0,0 +1,143 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Atmel EVK527. + *  \copydetails Group_LEDs_EVK527 + * + *  \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_EVK527 EVK527 + *  \brief Board specific LED driver header for the Atmel EVK527. + * + *  Board specific LED driver header for the Atmel EVK527. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.5</td></tr> + *    <tr><td>LEDS_LED2</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.6</td></tr> + *    <tr><td>LEDS_LED3</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_EVK527_H__ +#define __LEDS_EVK527_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 the third LED on the board. */ +			#define LEDS_LED3        (1 << 7) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3) + +			/** 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_Disable(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) +			{ +				PIND  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/Board.h new file mode 100644 index 0000000000..0e46a578b8 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Mattairtech JM-DB-U2. + *  \copydetails Group_BoardInfo_JMDBU2 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_JMDBU2 JMDBU2 + *  \brief Board specific information header for the Mattairtech JM-DB-U2. + * + *  Board specific information header for the Mattairtech JM-DB-U2 (http://u2.mattair.net/index.html). + * + *  @{ + */ + +#ifndef __BOARD_JMDBU2_H__ +#define __BOARD_JMDBU2_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/Buttons.h new file mode 100644 index 0000000000..8da45e402e --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Mattairtech JM-DB-U2. + *  \copydetails Group_Buttons_JMDBU2 + * + *  \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_JMDBU2 JMDBU2 + *  \brief Board specific Buttons driver header for the Mattairtech JM-DB-U2. + * + *  Board specific Buttons driver header for the Mattairtech JM-DB-U2 (http://u2.mattair.net/index.html). + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_JMDBU2_H__ +#define __BUTTONS_JMDBU2_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/LEDs.h new file mode 100644 index 0000000000..bd2c191a5a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/JMDBU2/LEDs.h @@ -0,0 +1,135 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Mattairtech JM-DB-U2. + *  \copydetails Group_LEDs_JMDBU2 + * + *  \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_JMDBU2 JMDBU2 + *  \brief Board specific LED driver header for the Mattairtech JM-DB-U2. + * + *  Board specific LED driver header for the Mattairtech JM-DB-U2 (http://u2.mattair.net/index.html). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.4</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_JMDBU2_H__ +#define __LEDS_JMDBU2_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_Disable(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) +			{ +				PIND  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/LEONARDO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/LEONARDO/Board.h new file mode 100644 index 0000000000..400bb11c4a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/LEONARDO/Board.h @@ -0,0 +1,78 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Arduino Leonardo board. + *  \copydetails Group_BoardInfo_LEONARDO + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_LEONARDO LEONARDO + *  \brief Board specific information header for the Arduino Leonardo board. + * + *  Board specific information header for the Arduino Leonardo board (http://arduino.cc/en/Main/arduinoBoardLeonardo). + * + *  @{ + */ + +#ifndef __BOARD_LEONARDO_H__ +#define __BOARD_LEONARDO_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/LEONARDO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/LEONARDO/LEDs.h new file mode 100644 index 0000000000..6f26cc1820 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/LEONARDO/LEDs.h @@ -0,0 +1,169 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Arduino Leonardo board. + *  \copydetails Group_LEDs_LEONARDO + * + *  \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_LEONARDO LEONARDO + *  \brief Board specific LED driver header for the Arduino Leonardo board. + * + *  Board specific LED driver header for the Arduino Leonardo board (http://arduino.cc/en/Main/arduinoBoardLeonardo). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>RX</td><td>Low</td><td>PORTB.0</td></tr> + *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>TX</td><td>Low</td><td>PORTD.5</td></tr> + *    <tr><td>LEDS_LED3</td><td>Yellow</td><td>General Indicator</td><td>High</td><td>PORTC.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_LEONARDO_H__ +#define __LEDS_LEONARDO_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_PORTB_LEDS       (LEDS_LED1) +			#define LEDS_PORTD_LEDS       (LEDS_LED2) +			#define LEDS_PORTC_LEDS       (LEDS_LED3) +	#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 the second LED on the board. */ +			#define LEDS_LED2        (1 << 5) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        (1 << 7) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3) + +			/** 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_PORTB_LEDS; +				PORTB |=  LEDS_PORTB_LEDS; +				DDRD  |=  LEDS_PORTD_LEDS; +				PORTD |=  LEDS_PORTD_LEDS; +				DDRC  |=  LEDS_PORTC_LEDS; +				PORTC &= ~LEDS_PORTC_LEDS; +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRB  &= ~LEDS_PORTB_LEDS; +				PORTB &= ~LEDS_PORTB_LEDS; +				DDRD  &= ~LEDS_PORTD_LEDS; +				PORTD &= ~LEDS_PORTD_LEDS; +				DDRC  &= ~LEDS_PORTC_LEDS; +				PORTC &= ~LEDS_PORTC_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTB &= ~(LEDMask & LEDS_PORTB_LEDS); +				PORTD &= ~(LEDMask & LEDS_PORTD_LEDS); +				PORTC |=  (LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTB |=  (LEDMask & LEDS_PORTB_LEDS); +				PORTD |=  (LEDMask & LEDS_PORTD_LEDS); +				PORTC &= ~(LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTB = ((PORTB |  LEDS_PORTB_LEDS) & ~(LEDMask & LEDS_PORTB_LEDS)); +				PORTD = ((PORTD |  LEDS_PORTD_LEDS) & ~(LEDMask & LEDS_PORTD_LEDS)); +				PORTC = ((PORTC & ~LEDS_PORTC_LEDS) |  (LEDMask & LEDS_PORTC_LEDS)); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTB = ((PORTB |  (LEDMask & LEDS_PORTB_LEDS)) & ~(ActiveMask & LEDS_PORTB_LEDS)); +				PORTD = ((PORTD |  (LEDMask & LEDS_PORTD_LEDS)) & ~(ActiveMask & LEDS_PORTD_LEDS)); +				PORTC = ((PORTC & ~(LEDMask & LEDS_PORTC_LEDS)) |  (ActiveMask & LEDS_PORTC_LEDS)); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PINB  = (LEDMask & LEDS_PORTB_LEDS); +				PIND  = (LEDMask & LEDS_PORTD_LEDS); +				PINC  = (LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return ((~PORTB & LEDS_PORTB_LEDS) | (~PORTD & LEDS_PORTD_LEDS) | (PORTC & LEDS_PORTC_LEDS)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MAXIMUS/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MAXIMUS/Board.h new file mode 100644 index 0000000000..7de7501e43 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MAXIMUS/Board.h @@ -0,0 +1,78 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Maximus board. + *  \copydetails Group_BoardInfo_MAXIMUS + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_MAXIMUS MAXIMUS + *  \brief Board specific information header for the Maximus board. + * + *  Board specific information header for the Maximus (http://www.avrusb.com/). + * + *  @{ + */ + +#ifndef __BOARD_MAXIMUS_H__ +#define __BOARD_MAXIMUS_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h new file mode 100644 index 0000000000..aba85abd46 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MAXIMUS/LEDs.h @@ -0,0 +1,139 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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/). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>LG</td><td>High</td><td>PORTB.6</td></tr> + *    <tr><td>LEDS_LED2</td><td>Red</td><td>LR</td><td>High</td><td>PORTB.7</td></tr> + *  </table> + * + *  @{ + */ + +#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_Disable(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) +			{ +				PINB  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/MICRO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICRO/Board.h new file mode 100644 index 0000000000..279dc3aafe --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICRO/Board.h @@ -0,0 +1,78 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Arduino Micro board. + *  \copydetails Group_BoardInfo_MICRO + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_MICRO MICRO + *  \brief Board specific information header for the Arduino Micro board. + * + *  Board specific information header for the Arduino Micro board (http://arduino.cc/en/Main/arduinoBoardMicro). + * + *  @{ + */ + +#ifndef __BOARD_MICRO_H__ +#define __BOARD_MICRO_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MICRO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICRO/LEDs.h new file mode 100644 index 0000000000..445e1a3347 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICRO/LEDs.h @@ -0,0 +1,169 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Arduino Micro board. + *  \copydetails Group_LEDs_MICRO + * + *  \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_MICRO MICRO + *  \brief Board specific LED driver header for the Arduino Micro board. + * + *  Board specific LED driver header for the Arduino Micro board (http://arduino.cc/en/Main/arduinoBoardMicro). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>RX</td><td>High</td><td>PORTB.0</td></tr> + *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>TX</td><td>High</td><td>PORTD.5</td></tr> + *    <tr><td>LEDS_LED3</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTC.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_MICRO_H__ +#define __LEDS_MICRO_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_PORTB_LEDS       (LEDS_LED1) +			#define LEDS_PORTD_LEDS       (LEDS_LED2) +			#define LEDS_PORTC_LEDS       (LEDS_LED3) +	#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 the second LED on the board. */ +			#define LEDS_LED2        (1 << 5) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        (1 << 7) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3) + +			/** 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_PORTB_LEDS; +				PORTB &= ~LEDS_PORTB_LEDS; +				DDRD  |=  LEDS_PORTD_LEDS; +				PORTD &= ~LEDS_PORTD_LEDS; +				DDRC  |=  LEDS_PORTC_LEDS; +				PORTC &= ~LEDS_PORTC_LEDS; +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRB  &= ~LEDS_PORTB_LEDS; +				PORTB &= ~LEDS_PORTB_LEDS; +				DDRD  &= ~LEDS_PORTD_LEDS; +				PORTD &= ~LEDS_PORTD_LEDS; +				DDRC  &= ~LEDS_PORTC_LEDS; +				PORTC &= ~LEDS_PORTC_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTB |=  (LEDMask & LEDS_PORTB_LEDS); +				PORTD |=  (LEDMask & LEDS_PORTD_LEDS); +				PORTC |=  (LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTB &= ~(LEDMask & LEDS_PORTB_LEDS); +				PORTD &= ~(LEDMask & LEDS_PORTD_LEDS); +				PORTC &= ~(LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTB = ((PORTB & ~LEDS_PORTB_LEDS) | (LEDMask & LEDS_PORTB_LEDS)); +				PORTD = ((PORTD & ~LEDS_PORTD_LEDS) | (LEDMask & LEDS_PORTD_LEDS)); +				PORTC = ((PORTC & ~LEDS_PORTC_LEDS) | (LEDMask & LEDS_PORTC_LEDS)); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTB = ((PORTB & ~(LEDMask & LEDS_PORTB_LEDS)) | (ActiveMask & LEDS_PORTB_LEDS)); +				PORTD = ((PORTD & ~(LEDMask & LEDS_PORTD_LEDS)) | (ActiveMask & LEDS_PORTD_LEDS)); +				PORTC = ((PORTC & ~(LEDMask & LEDS_PORTC_LEDS)) | (ActiveMask & LEDS_PORTC_LEDS)); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PORTB ^= (LEDMask & LEDS_PORTB_LEDS); +				PORTD ^= (LEDMask & LEDS_PORTD_LEDS); +				PORTC ^= (LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return ((PORTB & LEDS_PORTB_LEDS) | (PORTD & LEDS_PORTD_LEDS) | (PORTC & LEDS_PORTC_LEDS)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Board.h new file mode 100644 index 0000000000..1ae3d6f200 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Board.h @@ -0,0 +1,149 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Micropendous series boards. + *  \copydetails Group_BoardInfo_MICROPENDOUS_32U2 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_MICROPENDOUS_A MICROPENDOUS_A + *  \brief Board specific information header for the Micropendous A (https://code.google.com/p/micropendous/wiki/MicropendousA). + * + *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_MICROPENDOUS_1 MICROPENDOUS_1 + *  \brief Board specific information header for the Micropendous 1 (https://code.google.com/p/micropendous/wiki/Micropendous1). + * + *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_MICROPENDOUS_2 MICROPENDOUS_2 + *  \brief Board specific information header for the Micropendous 2 (https://code.google.com/p/micropendous/wiki/Micropendous2). + * + *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_MICROPENDOUS_3 MICROPENDOUS_3 + *  \brief Board specific information header for the Micropendous 3 (https://code.google.com/p/micropendous/wiki/Micropendous3). + * + *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_MICROPENDOUS_4 MICROPENDOUS_4 + *  \brief Board specific information header for the Micropendous 4 (https://code.google.com/p/micropendous/wiki/Micropendous4). + * + *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_MICROPENDOUS_DIP MICROPENDOUS_DIP + *  \brief Board specific information header for the Micropendous DIP (https://code.google.com/p/micropendous/wiki/MicropendousDIP). + * + *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_MICROPENDOUS_REV1 MICROPENDOUS_REV1 + *  \brief Board specific information header for the Micropendous Arduino-like Revision 1 (https://code.google.com/p/micropendous/wiki/Micropendous). + * + *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_MICROPENDOUS_REV2 MICROPENDOUS_REV2 + *  \brief Board specific information header for the Micropendous Arduino-like Revision 2 (https://code.google.com/p/micropendous/wiki/Micropendous). + * + *  See \ref Group_BoardInfo_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_MICROPENDOUS_32U2 MICROPENDOUS_32U2 + *  \brief Board specific information header for the Micropendous series boards. + * + *  Board specific information header for the Micropendous series boards (https://code.google.com/p/micropendous). + * + *  @{ + */ + +#ifndef __BOARD_MICROPENDOUS_H__ +#define __BOARD_MICROPENDOUS_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			#if ((BOARD == BOARD_MICROPENDOUS_32U2) || (BOARD == BOARD_MICROPENDOUS_A) || \ +			     (BOARD == BOARD_MICROPENDOUS_1)    || (BOARD == BOARD_MICROPENDOUS_2) || \ +			     (BOARD == BOARD_MICROPENDOUS_3)    || (BOARD == BOARD_MICROPENDOUS_4) || \ +			     (BOARD == BOARD_MICROPENDOUS_REV1) || (BOARD == BOARD_MICROPENDOUS_REV2) || \ +			     (BOARD == BOARD_MICROPENDOUS_DIP) || defined(__DOXYGEN__)) +				#include "../../Buttons.h" + +				/** Indicates the board has hardware Buttons mounted. */ +				#define BOARD_HAS_BUTTONS +			#endif + +			#if ((BOARD == BOARD_MICROPENDOUS_REV1) || (BOARD == BOARD_MICROPENDOUS_REV2) || \ +			     (BOARD == BOARD_MICROPENDOUS_32U2) || defined(__DOXYGEN__)) +				#include "../../LEDs.h" + +				/** Indicates the board has hardware LEDs mounted. */ +				#define BOARD_HAS_LEDS +			#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h new file mode 100644 index 0000000000..c40ac1fe7c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/Buttons.h @@ -0,0 +1,205 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Micropendous series boards. + *  \copydetails Group_Buttons_MICROPENDOUS_32U2 + * + *  \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_MICROPENDOUS_A MICROPENDOUS_A + *  \brief Board specific Button driver header for the Micropendous A (https://code.google.com/p/micropendous/wiki/MicropendousA). + * + *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_Buttons + *  \defgroup Group_Buttons_MICROPENDOUS_1 MICROPENDOUS_1 + *  \brief Board specific Button driver header for the Micropendous 1 (https://code.google.com/p/micropendous/wiki/Micropendous1). + * + *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_Buttons + *  \defgroup Group_Buttons_MICROPENDOUS_2 MICROPENDOUS_2 + *  \brief Board specific Button driver header for the Micropendous 2 (https://code.google.com/p/micropendous/wiki/Micropendous2). + * + *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_Buttons + *  \defgroup Group_Buttons_MICROPENDOUS_3 MICROPENDOUS_3 + *  \brief Board specific Button driver header for the Micropendous 3 (https://code.google.com/p/micropendous/wiki/Micropendous3). + * + *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_Buttons + *  \defgroup Group_Buttons_MICROPENDOUS_4 MICROPENDOUS_4 + *  \brief Board specific Button driver header for the Micropendous 4 (https://code.google.com/p/micropendous/wiki/Micropendous4). + * + *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_Buttons + *  \defgroup Group_Buttons_MICROPENDOUS_DIP MICROPENDOUS_DIP + *  \brief Board specific Button driver header for the Micropendous DIP (https://code.google.com/p/micropendous/wiki/MicropendousDIP). + * + *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_Buttons + *  \defgroup Group_Buttons_MICROPENDOUS_REV1 MICROPENDOUS_REV1 + *  \brief Board specific Button driver header for the Micropendous Arduino-like Revision 1 (https://code.google.com/p/micropendous/wiki/Micropendous). + * + *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_Buttons + *  \defgroup Group_Buttons_MICROPENDOUS_REV2 MICROPENDOUS_REV2 + *  \brief Board specific Button driver header for the Micropendous Arduino-like Revision 2 (https://code.google.com/p/micropendous/wiki/Micropendous). + * + *  See \ref Group_Buttons_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_Buttons + *  \defgroup Group_Buttons_MICROPENDOUS_32U2 MICROPENDOUS_32U2 + *  \brief Board specific Buttons driver header for the Micropendous 32U2. + * + *  \note There are multiple supported Micropendous boards, compile with <code>BOARD = MICROPENDOUS_{VERSION}</code>. + * + *  Board specific Buttons driver header for the Micropendous 32U2 (https://code.google.com/p/micropendous/wiki/Micropendous_32U2). + * + *  <b>BOARD_MICROPENDOUS_1 and BOARD_MICROPENDOUS_32U2</b>: + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr> + *  </table> + * + *  <b>Other Revisions</b>: + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_MICROPENDOUS_H__ +#define __BUTTONS_MICROPENDOUS_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__) +		#if (BOARD == BOARD_MICROPENDOUS_32U2) +			#define _BOARD_BUTTON1_MASK             (1 << 7) +			#define _BOARD_BUTTON_PORTLETTER        D +		#elif (BOARD == BOARD_MICROPENDOUS_A) +			#define _BOARD_BUTTON1_MASK             (1 << 2) +			#define _BOARD_BUTTON_PORTLETTER        E +		#elif (BOARD == BOARD_MICROPENDOUS_1) +			#define _BOARD_BUTTON1_MASK             (1 << 7) +			#define _BOARD_BUTTON_PORTLETTER        D +		#elif (BOARD == BOARD_MICROPENDOUS_2) +			#define _BOARD_BUTTON1_MASK             (1 << 2) +			#define _BOARD_BUTTON_PORTLETTER        E +		#elif (BOARD == BOARD_MICROPENDOUS_3) +			#define _BOARD_BUTTON1_MASK             (1 << 2) +			#define _BOARD_BUTTON_PORTLETTER        E +		#elif (BOARD == BOARD_MICROPENDOUS_4) +			#define _BOARD_BUTTON1_MASK             (1 << 2) +			#define _BOARD_BUTTON_PORTLETTER        E +		#elif (BOARD == BOARD_MICROPENDOUS_DIP) +			#define _BOARD_BUTTON1_MASK             (1 << 2) +			#define _BOARD_BUTTON_PORTLETTER        E +		#elif (BOARD == BOARD_MICROPENDOUS_REV1) +			#define _BOARD_BUTTON1_MASK             (1 << 2) +			#define _BOARD_BUTTON_PORTLETTER        E +		#elif (BOARD == BOARD_MICROPENDOUS_REV2) +			#define _BOARD_BUTTON1_MASK             (1 << 2) +			#define _BOARD_BUTTON_PORTLETTER        E +		#endif + +		#define _BOARD_BUTTON_PORT                  CONCAT_EXPANDED(PORT, _BOARD_BUTTON_PORTLETTER) +		#define _BOARD_BUTTON_PIN                   CONCAT_EXPANDED(PIN,  _BOARD_BUTTON_PORTLETTER) +		#define _BOARD_BUTTON_DDR                   CONCAT_EXPANDED(DDR,  _BOARD_BUTTON_PORTLETTER) +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Button mask for the first button on the board. */ +			#define BUTTONS_BUTTON1     _BOARD_BUTTON1_MASK + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void Buttons_Init(void) +			{ +				_BOARD_BUTTON_DDR  &= ~BUTTONS_BUTTON1; +				_BOARD_BUTTON_PORT |=  BUTTONS_BUTTON1; +			} + +			static inline void Buttons_Disable(void) +			{ +				_BOARD_BUTTON_DDR  &= ~BUTTONS_BUTTON1; +				_BOARD_BUTTON_PORT &= ~BUTTONS_BUTTON1; +			} + +			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Buttons_GetStatus(void) +			{ +				return ((_BOARD_BUTTON_PIN & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h new file mode 100644 index 0000000000..2ab89eb5b1 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROPENDOUS/LEDs.h @@ -0,0 +1,174 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Micropendous series boards. + *  \copydetails Group_LEDs_MICROPENDOUS_32U2 + * + *  \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_MICROPENDOUS_REV1 MICROPENDOUS_REV1 + *  \brief Board specific LED driver header for the Micropendous Arduino-like Revision 1 (https://code.google.com/p/micropendous/wiki/Micropendous). + * + *  See \ref Group_LEDs_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_LEDs + *  \defgroup Group_LEDs_MICROPENDOUS_REV2 MICROPENDOUS_REV2 + *  \brief Board specific LED driver header for the Micropendous Arduino-like Revision 2 (https://code.google.com/p/micropendous/wiki/Micropendous). + * + *  See \ref Group_LEDs_MICROPENDOUS_32U2 for more details. + */ + +/** \ingroup Group_LEDs + *  \defgroup Group_LEDs_MICROPENDOUS_32U2 MICROPENDOUS_32U2 + *  \brief Board specific LED driver header for the Micropendous-32U2. + * + *  Board specific LED driver header for the Micropendous 32U2 (https://code.google.com/p/micropendous/wiki/Micropendous_32U2). + * + *  <b>BOARD_MICROPENDOUS_32U2</b>: + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.6</td></tr> + *  </table> + * + *  <b>Other Revisions</b>: + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTB.1</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_MICROPENDOUS_H__ +#define __LEDS_MICROPENDOUS_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__) +		#if (BOARD == BOARD_MICROPENDOUS_32U2) +			#define _BOARD_LED1_MASK                (1 << 6) +			#define _BOARD_LED_PORTLETTER           D +		#elif (BOARD == BOARD_MICROPENDOUS_REV1) +			#define _BOARD_LED1_MASK                (1 << 1) +			#define _BOARD_LED_PORTLETTER           B +		#elif (BOARD == BOARD_MICROPENDOUS_REV2) +			#define _BOARD_LED1_MASK                (1 << 1) +			#define _BOARD_LED_PORTLETTER           B +		#endif + +		#define _BOARD_LED_PORT                     CONCAT_EXPANDED(PORT, _BOARD_LED_PORTLETTER) +		#define _BOARD_LED_PIN                      CONCAT_EXPANDED(PIN,  _BOARD_LED_PORTLETTER) +		#define _BOARD_LED_DDR                      CONCAT_EXPANDED(DDR,  _BOARD_LED_PORTLETTER) +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** LED mask for the first LED on the board. */ +			#define LEDS_LED1        _BOARD_LED1_MASK + +			/** 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) +			{ +				_BOARD_LED_DDR  |=  LEDS_ALL_LEDS; +				_BOARD_LED_PORT &= ~LEDS_ALL_LEDS; +			} + +			static inline void LEDs_Disable(void) +			{ +				_BOARD_LED_DDR  &= ~LEDS_ALL_LEDS; +				_BOARD_LED_PORT &= ~LEDS_ALL_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				_BOARD_LED_PORT |= LEDMask; +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				_BOARD_LED_PORT &= ~LEDMask; +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				_BOARD_LED_PORT = ((_BOARD_LED_PORT & ~LEDS_ALL_LEDS) | LEDMask); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				_BOARD_LED_PORT = ((_BOARD_LED_PORT & ~LEDMask) | ActiveMask); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				_BOARD_LED_PIN  = LEDMask; +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return (_BOARD_LED_PORT & LEDS_ALL_LEDS); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/Board.h new file mode 100644 index 0000000000..1e503c3c8a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Microsin AVR-USB162 board. + *  \copydetails Group_BoardInfo_MICROSIN162 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_MICROSIN162 MICROSIN162 + *  \brief Board specific information header for the Microsin AVR-USB162 board. + * + *  Board specific information header for the Microsin AVR-USB162 board (http://microsin.ru/content/view/685/44/). + * + *  @{ + */ + +#ifndef __BOARD_MICROSIN162_H__ +#define __BOARD_MICROSIN162_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h new file mode 100644 index 0000000000..1c90fab1e9 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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/). + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h new file mode 100644 index 0000000000..690ce7df8d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MICROSIN162/LEDs.h @@ -0,0 +1,135 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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/). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTD.4</td></tr> + *  </table> + * + *  @{ + */ + +#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_Disable(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) +			{ +				PIND  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/Board.h new file mode 100644 index 0000000000..53bc2daf57 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the MINIMUS. + *  \copydetails Group_BoardInfo_MINIMUS + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_MINIMUS MINIMUS + *  \brief Board specific information header for the MINIMUS. + * + *  Board specific information header for the MINIMUS. + * + *  @{ + */ + +#ifndef __BOARD_MINIMUS_H__ +#define __BOARD_MINIMUS_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h new file mode 100644 index 0000000000..f83924c52e --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h new file mode 100644 index 0000000000..5569323081 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MINIMUS/LEDs.h @@ -0,0 +1,139 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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/). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Blue</td><td>General Indicator</td><td>Low</td><td>PORTD.5</td></tr> + *    <tr><td>LEDS_LED2</td><td>Red</td><td>General Indicator</td><td>Low</td><td>PORTD.6</td></tr> + *  </table> + * + *  @{ + */ + +#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     0 + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void LEDs_Init(void) +			{ +				DDRD  |= LEDS_ALL_LEDS; +				PORTD |= LEDS_ALL_LEDS; +			} + +			static inline void LEDs_Disable(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) +			{ +				PIND  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/MULTIO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MULTIO/Board.h new file mode 100644 index 0000000000..d701dc31b2 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MULTIO/Board.h @@ -0,0 +1,78 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Bitwizard Multio. + *  \copydetails Group_BoardInfo_MULTIO + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_MULTIO MULTIO + *  \brief Board specific information header for the Bitwizard Multio. + * + *  Board specific information header for the Bitwizard Multio (http://www.bitwizard.nl/wiki/index.php/USB-multio). + * + *  @{ + */ + +#ifndef __BOARD_MULTIO_H__ +#define __BOARD_MULTIO_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/MULTIO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/MULTIO/LEDs.h new file mode 100644 index 0000000000..9d3bf6a49f --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/MULTIO/LEDs.h @@ -0,0 +1,161 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Bitwizard Multio. + *  \copydetails Group_LEDs_MULTIO + * + *  \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_MULTIO MULTIO + *  \brief Board specific LED driver header for the Bitwizard Multio. + * + *  Board specific LED driver header for the Bitwizard Multio (http://www.bitwizard.nl/wiki/index.php/USB-multio). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.0</td></tr> + *    <tr><td>LEDS_LED2</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTC.2</td></tr> + *    <tr><td>LEDS_LED3</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_MULTIO_H__ +#define __LEDS_MULTIO_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_PORTD_LEDS       (LEDS_LED1 | LEDS_LED3) +			#define LEDS_PORTC_LEDS       LEDS_LED2 +	#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 the second LED on the board. */ +			#define LEDS_LED2        (1 << 2) + +			/** LED mask for the second LED on the board. */ +			#define LEDS_LED3        (1 << 7) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3) + +			/** 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_PORTD_LEDS; +				DDRC  |=  LEDS_PORTC_LEDS; + +				PORTD &= ~LEDS_PORTD_LEDS; +				PORTC &= ~LEDS_PORTC_LEDS; +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRD  &= ~LEDS_PORTD_LEDS; +				DDRC  &= ~LEDS_PORTC_LEDS; + +				PORTD &= ~LEDS_PORTD_LEDS; +				PORTC &= ~LEDS_PORTC_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTD |= (LEDMask & LEDS_PORTD_LEDS); +				PORTC |= (LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTD &= ~(LEDMask & LEDS_PORTD_LEDS); +				PORTC &= ~(LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTD = (PORTD & ~LEDS_PORTD_LEDS) | (LEDMask & LEDS_PORTD_LEDS); +				PORTC = (PORTC & ~LEDS_PORTC_LEDS) | (LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTD = (PORTD & ~(LEDMask & LEDS_PORTD_LEDS)) | (ActiveMask & LEDS_PORTD_LEDS); +				PORTC = (PORTC & ~(LEDMask & LEDS_PORTC_LEDS)) | (ActiveMask & LEDS_PORTC_LEDS); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PIND  = (LEDMask & LEDS_PORTD_LEDS); +				PINC  = (LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return ((PORTD & LEDS_PORTD_LEDS) | (PORTC & LEDS_PORTC_LEDS)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/Board.h new file mode 100644 index 0000000000..64c657758a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Olimex AVR-USB-162 Development Board. + *  \copydetails Group_BoardInfo_OLIMEX162 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_OLIMEX162 OLIMEX162 + *  \brief Board specific information header for the Olimex AVR-USB-162 Development Board. + * + *  Board specific information header for the Olimex AVR-USB-162 Development Board (http://www.olimex.com/dev/avr-usb-162.html). + * + *  @{ + */ + +#ifndef __BOARD_OLIMEX162_H__ +#define __BOARD_OLIMEX162_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/Buttons.h new file mode 100644 index 0000000000..f8ed8714d5 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Olimex AVR-USB-162 Development Board. + *  \copydetails Group_Buttons_OLIMEX162 + * + *  \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_OLIMEX162 OLIMEX162 + *  \brief Board specific Buttons driver header for the Olimex AVR-USB-162 Development Board. + * + *  Board specific Buttons driver header for the Olimex AVR-USB-162 Development Board (http://www.olimex.com/dev/avr-usb-162.html). + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_OLIMEX162_H__ +#define __BUTTONS_OLIMEX162_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/LEDs.h new file mode 100644 index 0000000000..52d82ef96a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX162/LEDs.h @@ -0,0 +1,135 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Olimex AVR-USB-162. + *  \copydetails Group_LEDs_OLIMEX162 + * + *  \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_OLIMEX162 OLIMEX162 + *  \brief Board specific LED driver header for the Olimex AVR-USB-162. + * + *  Board specific LED driver header for the Olimex AVR-USB-162 (http://www.olimex.com/dev/avr-usb-162.html). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>General Indicator</td><td>High</td><td>PORTD.4</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_OLIMEX162_H__ +#define __LEDS_OLIMEX162_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_Disable(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) +			{ +				PIND  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Board.h new file mode 100644 index 0000000000..f063b9f9e7 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Olimex AVR-USB-32U4 Development Board. + *  \copydetails Group_BoardInfo_OLIMEX32U4 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_OLIMEX32U4 OLIMEX32U4 + *  \brief Board specific information header for the Olimex AVR-USB-32U4 Development Board. + * + *  Board specific information header for the Olimex AVR-USB-32U4 Development Board (http://www.olimex.com/dev/olimexino-32u4.html). + * + *  @{ + */ + +#ifndef __BOARD_OLIMEX32U4_H__ +#define __BOARD_OLIMEX32U4_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Buttons.h new file mode 100644 index 0000000000..fecc637043 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Olimex AVR-USB-32U4 Development Board. + *  \copydetails Group_Buttons_OLIMEX32U4 + * + *  \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_OLIMEX32U4 OLIMEX32U4 + *  \brief Board specific Buttons driver header for the Olimex AVR-USB-32U4 Development Board. + * + *  Board specific Buttons driver header for the Olimex AVR-USB-32U4 Development Board (http://www.olimex.com/dev/olimexino-32u4.html). + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_OLIMEX32U4_H__ +#define __BUTTONS_OLIMEX32U4_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/LEDs.h new file mode 100644 index 0000000000..51eeaceab5 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEX32U4/LEDs.h @@ -0,0 +1,179 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Olimex AVR-USB-32U4. + *  \copydetails Group_LEDs_OLIMEX32U4 + * + *  \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_OLIMEX32U4 OLIMEX32U4 + *  \brief Board specific LED driver header for the Olimex AVR-USB-32U4. + * + *  Board specific LED driver header for the Olimex AVR-USB-32U4 (http://www.olimex.com/dev/olimexino-32u4.html). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>TX</td><td>High</td><td>PORTD.5</td></tr> + *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>RX</td><td>High</td><td>PORTB.0</td></tr> + *    <tr><td>LEDS_LED3</td><td>Green</td><td>General Indicator (Default Unconnected)</td><td>High</td><td>PORTE.6</td></tr> + *    <tr><td>LEDS_LED4</td><td>Yellow</td><td>General Indicator (Default Unconnected)</td><td>High</td><td>PORTB.5</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_OLIMEX32U4_H__ +#define __LEDS_OLIMEX32U4_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_PORTB_LEDS       (LEDS_LED2 | LEDS_LED4) +			#define LEDS_PORTD_LEDS       (LEDS_LED1) +			#define LEDS_PORTE_LEDS       (LEDS_LED3) + +			#define LEDS_PORTD_MASK_SHIFT 1 +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** LED mask for the first LED on the board. */ +			#define LEDS_LED1        ((1 << 5) >> LEDS_PORTD_MASK_SHIFT) + +			/** LED mask for the second LED on the board. */ +			#define LEDS_LED2        (1 << 0) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        (1 << 6) + +			/** LED mask for the fourth LED on the board. */ +			#define LEDS_LED4        (1 << 5) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4) + +			/** 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_PORTB_LEDS; +				PORTB &= ~LEDS_PORTB_LEDS; +				DDRD  |=  (LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT); +				PORTD &= ~(LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT); +				DDRE  |=  LEDS_PORTE_LEDS; +				PORTE &= ~LEDS_PORTE_LEDS; +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRB  &= ~LEDS_PORTB_LEDS; +				PORTB &= ~LEDS_PORTB_LEDS; +				DDRD  &= ~(LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT); +				PORTD &= ~(LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT); +				DDRE  &= ~LEDS_PORTE_LEDS; +				PORTE &= ~LEDS_PORTE_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTB |= (LEDMask & LEDS_PORTB_LEDS); +				PORTD |= ((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT); +				PORTE |= (LEDMask & LEDS_PORTE_LEDS); +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTB &= ~(LEDMask & LEDS_PORTB_LEDS); +				PORTD &= ~((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT); +				PORTE &= ~(LEDMask & LEDS_PORTE_LEDS); +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTB = ((PORTB & ~LEDS_PORTB_LEDS) | (LEDMask & LEDS_PORTB_LEDS)); +				PORTD = ((PORTD & ~(LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT)) | +				         ((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT)); +				PORTE = ((PORTE & ~LEDS_PORTE_LEDS) | (LEDMask & LEDS_PORTE_LEDS)); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTB = ((PORTB & ~(LEDMask & LEDS_PORTB_LEDS)) | (ActiveMask & LEDS_PORTB_LEDS)); +				PORTD = ((PORTD & ~((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT)) | +				         ((ActiveMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT)); +				PORTE = ((PORTE & ~(LEDMask & LEDS_PORTE_LEDS)) | (ActiveMask & LEDS_PORTE_LEDS)); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PINB  = (LEDMask & LEDS_PORTB_LEDS); +				PIND  = ((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT); +				PINE  = (LEDMask & LEDS_PORTE_LEDS); +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return ((PORTB & LEDS_PORTB_LEDS) | +				        ((PORTD & (LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT)) >> LEDS_PORTD_MASK_SHIFT) | +				        (PORTE & LEDS_PORTE_LEDS)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Board.h new file mode 100644 index 0000000000..52129fb739 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Olimex AVR-ISP-MK2 Development Board. + *  \copydetails Group_BoardInfo_OLIMEXISPMK2 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_OLIMEXISPMK2 OLIMEXISPMK2 + *  \brief Board specific information header for the Olimex AVR-ISP-MK2 Development Board. + * + *  Board specific information header for the Olimex AVR-ISP-MK2 Development Board (https://www.olimex.com/dev/avr-isp-mk2.html). + * + *  @{ + */ + +#ifndef __BOARD_OLIMEXISPMK2_H__ +#define __BOARD_OLIMEXISPMK2_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h new file mode 100644 index 0000000000..3240dda075 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Olimex AVR-ISP-MK2 Development Board. + *  \copydetails Group_Buttons_OLIMEXISPMK2 + * + *  \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_OLIMEXISPMK2 OLIMEXISPMK2 + *  \brief Board specific Buttons driver header for the Olimex AVR-ISP-MK2. + * + *  Board specific Buttons driver header for the Olimex AVR-ISP-MK2 Development Board (https://www.olimex.com/dev/avr-isp-mk2.html). + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_OLIMEXISPMK2_H__ +#define __BUTTONS_OLIMEXISPMK2_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h new file mode 100644 index 0000000000..6bf924d36f --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h @@ -0,0 +1,143 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Olimex AVR-ISP-MK2 Development Board. + *  \copydetails Group_LEDs_OLIMEXISPMK2 + * + *  \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_OLIMEXISPMK2 OLIMEXISPMK2 + *  \brief Board specific LED driver header for the Olimex AVR-ISP-MK2. + * + *  Board specific LED driver header for the Olimex AVR-ISP-MK2 Development Board (https://www.olimex.com/dev/avr-isp-mk2.html). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>Target Power</td><td>High</td><td>PORTB.5</td></tr> + *    <tr><td>LEDS_LED2</td><td>Red</td><td>Activity</td><td>High</td><td>PORTB.6</td></tr> + *    <tr><td>LEDS_LED3</td><td>Green</td><td>Ready</td><td>High</td><td>PORTB.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_OLIMEXISPMK2_H__ +#define __LEDS_OLIMEXISPMK2_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 the third LED on the board. */ +			#define LEDS_LED3        (1 << 7) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3) + +			/** 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_Disable(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) +			{ +				PINB  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Board.h new file mode 100644 index 0000000000..9b0b28cca2 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Olimex AVR-USB-T32U4 Development Board. + *  \copydetails Group_BoardInfo_OLIMEXT32U4 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_OLIMEXT32U4 OLIMEXT32U4 + *  \brief Board specific information header for the Olimex AVR-USB-T32U4 Development Board. + * + *  Board specific information header for the Olimex AVR-USB-T32U4 Development Board (http://www.olimex.com/dev/avr-t32u4.html). + * + *  @{ + */ + +#ifndef __BOARD_OLIMEXT32U4_H__ +#define __BOARD_OLIMEXT32U4_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h new file mode 100644 index 0000000000..5db1c59b28 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Olimex AVR-USB-T32U4 Development Board. + *  \copydetails Group_Buttons_OLIMEXT32U4 + * + *  \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_OLIMEXT32U4 OLIMEXT32U4 + *  \brief Board specific Buttons driver header for the Olimex AVR-USB-32U4 Development Board. + * + *  Board specific Buttons driver header for the Olimex AVR-USB-T32U4 Development Board (http://www.olimex.com/dev/avr-t32u4.html). + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_OLIMEXT32U4_H__ +#define __BUTTONS_OLIMEXT32U4_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h new file mode 100644 index 0000000000..96cf3ed692 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h @@ -0,0 +1,169 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Olimex AVR-USB-T32U4. + *  \copydetails Group_LEDs_OLIMEXT32U4 + * + *  \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_OLIMEXT32U4 OLIMEXT32U4 + *  \brief Board specific LED driver header for the Olimex AVR-USB-T32U4. + * + *  Board specific LED driver header for the Olimex AVR-USB-T32U4 (http://www.olimex.com/dev/avr-t32u4.html). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>RX</td><td>High</td><td>PORTB.0</td></tr> + *    <tr><td>LEDS_LED2</td><td>Green</td><td>TX</td><td>High</td><td>PORTD.5</td></tr> + *    <tr><td>LEDS_LED3</td><td>N/A</td><td>General Indicator (Not Mounted)</td><td>High</td><td>PORTE.6</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_OLIMEXT32U4_H__ +#define __LEDS_OLIMEXT32U4_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_PORTB_LEDS       (LEDS_LED1) +			#define LEDS_PORTD_LEDS       (LEDS_LED2) +			#define LEDS_PORTE_LEDS       (LEDS_LED3) +	#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 the second LED on the board. */ +			#define LEDS_LED2        (1 << 5) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        (1 << 6) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3) + +			/** 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_PORTB_LEDS; +				PORTB &= ~LEDS_PORTB_LEDS; +				DDRD  |=  LEDS_PORTD_LEDS; +				PORTD &= ~LEDS_PORTD_LEDS; +				DDRE  |=  LEDS_PORTE_LEDS; +				PORTE &= ~LEDS_PORTE_LEDS; +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRB  &= ~LEDS_PORTB_LEDS; +				PORTB &= ~LEDS_PORTB_LEDS; +				DDRD  &= ~LEDS_PORTD_LEDS; +				PORTD &= ~LEDS_PORTD_LEDS; +				DDRE  &= ~LEDS_PORTE_LEDS; +				PORTE &= ~LEDS_PORTE_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTB |= (LEDMask & LEDS_PORTB_LEDS); +				PORTD |= (LEDMask & LEDS_PORTD_LEDS); +				PORTE |= (LEDMask & LEDS_PORTE_LEDS); +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTB &= ~(LEDMask & LEDS_PORTB_LEDS); +				PORTD &= ~(LEDMask & LEDS_PORTD_LEDS); +				PORTE &= ~(LEDMask & LEDS_PORTE_LEDS); +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTB = ((PORTB & ~LEDS_PORTB_LEDS) | (LEDMask & LEDS_PORTB_LEDS)); +				PORTD = ((PORTD & ~LEDS_PORTD_LEDS) | (LEDMask & LEDS_PORTD_LEDS)); +				PORTE = ((PORTE & ~LEDS_PORTE_LEDS) | (LEDMask & LEDS_PORTE_LEDS)); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTB = ((PORTB & ~(LEDMask & LEDS_PORTB_LEDS)) | (ActiveMask & LEDS_PORTB_LEDS)); +				PORTD = ((PORTD & ~(LEDMask & LEDS_PORTD_LEDS)) | (ActiveMask & LEDS_PORTD_LEDS)); +				PORTE = ((PORTE & ~(LEDMask & LEDS_PORTE_LEDS)) | (ActiveMask & LEDS_PORTE_LEDS)); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PINB  = (LEDMask & LEDS_PORTB_LEDS); +				PIND  = (LEDMask & LEDS_PORTD_LEDS); +				PINE  = (LEDMask & LEDS_PORTE_LEDS); +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return ((PORTB & LEDS_PORTB_LEDS) | (PORTD & LEDS_PORTD_LEDS) | (PORTE & LEDS_PORTE_LEDS)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/POLOLUMICRO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/POLOLUMICRO/Board.h new file mode 100644 index 0000000000..bf68e392cd --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/POLOLUMICRO/Board.h @@ -0,0 +1,79 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the "Pololu A-Star Micro" board. + *  \copydetails Group_BoardInfo_POLOLUMICRO + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_POLOLUMICRO POLOLUMICRO + *  \brief Board specific information header for the "Pololu A-Star Micro" board. + * + *  Board specific information header: + * https://www.pololu.com/docs/0J61 -> https://www.pololu.com/docs/0J61/3.1 + * + *  @{ + */ + +#ifndef __BOARD_POLOLUMICRO_H__ +#define __BOARD_POLOLUMICRO_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/POLOLUMICRO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/POLOLUMICRO/LEDs.h new file mode 100644 index 0000000000..454a9e2b01 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/POLOLUMICRO/LEDs.h @@ -0,0 +1,154 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Pololu A-Star Micro board. + *  \copydetails Group_LEDs_MICRO + * + *  \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_MICRO MICRO + *  \brief Board specific LED driver header for the Pololu A-Star Micro board. + * + *  Board specific LED driver header for the Pololu A-Star Micro board https://www.pololu.com/docs/0J61/3.1 + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>General Indicator</td><td>High</td><td>PORTC.7</td></tr> + *    <tr><td>LEDS_LED2</td><td>Green</td><td>Bootloader, USB-activity</td><td>Low</td><td>PORTD.5</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_MICRO_H__ +#define __LEDS_MICRO_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_PORTC_LEDS       (LEDS_LED1) +			#define LEDS_PORTD_LEDS       (LEDS_LED2) +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** LED mask for the first LED on the board. */ +			#define LEDS_LED1        (1 << 7) + +			/** LED mask for the second LED on the board. */ +			#define LEDS_LED2        (1 << 5) + +			/** 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_PORTD_LEDS; +				PORTD &= ~LEDS_PORTD_LEDS; +				DDRC  |=  LEDS_PORTC_LEDS; +				PORTC &= ~LEDS_PORTC_LEDS; +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRD  &= ~LEDS_PORTD_LEDS; +				PORTD &= ~LEDS_PORTD_LEDS; +				DDRC  &= ~LEDS_PORTC_LEDS; +				PORTC &= ~LEDS_PORTC_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTD |=  (LEDMask & LEDS_PORTD_LEDS); +				PORTC |=  (LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTD &= ~(LEDMask & LEDS_PORTD_LEDS); +				PORTC &= ~(LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTD = ((PORTD & ~LEDS_PORTD_LEDS) | (LEDMask & LEDS_PORTD_LEDS)); +				PORTC = ((PORTC & ~LEDS_PORTC_LEDS) | (LEDMask & LEDS_PORTC_LEDS)); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTD = ((PORTD & ~(LEDMask & LEDS_PORTD_LEDS)) | (ActiveMask & LEDS_PORTD_LEDS)); +				PORTC = ((PORTC & ~(LEDMask & LEDS_PORTC_LEDS)) | (ActiveMask & LEDS_PORTC_LEDS)); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PORTD ^= (LEDMask & LEDS_PORTD_LEDS); +				PORTC ^= (LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return ((PORTD & LEDS_PORTD_LEDS) | (PORTC & LEDS_PORTC_LEDS)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/QMK/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/QMK/Board.h new file mode 100644 index 0000000000..b0d5ac447d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/QMK/Board.h @@ -0,0 +1,65 @@ +/* +Copyright 2017 Jack Humbert + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +/** \file + *  \brief General driver header for QMK-powered keyboards. + *  \copydetails Group_BoardInfo_QMK + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_QMK QMK + *  \brief General driver header for QMK-powered keyboards. + * + *  General driver header for QMK-powered keyboards (http://qmk.fm). + * + *  @{ + */ + +#ifndef __BOARD_QMK_H__ +#define __BOARD_QMK_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/QMK/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/QMK/LEDs.h new file mode 100644 index 0000000000..9fc696be97 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/QMK/LEDs.h @@ -0,0 +1,194 @@ +/* +Copyright 2017 Jack Humbert + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program.  If not, see <http://www.gnu.org/licenses/>. +*/ + +/** \file + *  \brief General driver header for QMK-powered keyboards. + *  \copydetails Group_LEDs_QMK + * + *  \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_QMK QMK + *  \brief General driver header for QMK-powered keyboards. + * + *  General driver header for QMK-powered keyboards (http://qmk.fm). + * + *  <b>QMK</b>: + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORT(QMK_LED).6</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_QMK_H__ +#define __LEDS_QMK_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 + +        #define B0 0x30 +        #define B1 0x31 +        #define B2 0x32 +        #define B3 0x33 +        #define B4 0x34 +        #define B5 0x35 +        #define B6 0x36 +        #define B7 0x37 +        #define C0 0x60 +        #define C1 0x61 +        #define C2 0x62 +        #define C3 0x63 +        #define C4 0x64 +        #define C5 0x65 +        #define C6 0x66 +        #define C7 0x67 +        #define D0 0x90 +        #define D1 0x91 +        #define D2 0x92 +        #define D3 0x93 +        #define D4 0x94 +        #define D5 0x95 +        #define D6 0x96 +        #define D7 0x97 +        #define E0 0xC0 +        #define E1 0xC1 +        #define E2 0xC2 +        #define E3 0xC3 +        #define E4 0xC4 +        #define E5 0xC5 +        #define E6 0xC6 +        #define E7 0xC7 +        #define F0 0xF0 +        #define F1 0xF1 +        #define F2 0xF2 +        #define F3 0xF3 +        #define F4 0xF4 +        #define F5 0xF5 +        #define F6 0xF6 +        #define F7 0xF7 +        #define A0 0x00 +        #define A1 0x01 +        #define A2 0x02 +        #define A3 0x03 +        #define A4 0x04 +        #define A5 0x05 +        #define A6 0x06 +        #define A7 0x07 + +        #define QMK_ESC_COL F1 +        #define QMK_ESC_ROW D5 +        #define QMK_LED     E6 +        #define QMK_SPEAKER C6 + +        #define DDR(pin) _SFR_IO8(((pin) >> 4) + 1) +        #define PORT(pin) _SFR_IO8(((pin) >> 4) + 2) +        #define PIN(pin) _SFR_IO8((pin) >> 4) +        #define NUM(pin) _BV((pin) & 0xF) + +    /* Public Interface - May be used in end-application: */ +        /* Macros: */ +            /** LED mask for the first LED on the board. */ +            #define LEDS_LED1        NUM(QMK_LED) +            #define LEDS_LED2        NUM(QMK_SPEAKER) + +            /** 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) +            { +                DDR(QMK_LED)  |= LEDS_LED1; +                PORT(QMK_LED) |= LEDS_LED1; + +                DDR(QMK_SPEAKER)  |= LEDS_LED2; +                PORT(QMK_SPEAKER) |= LEDS_LED2; +            } + +            static inline void LEDs_Disable(void) +            { +                DDR(QMK_LED)  &= ~LEDS_LED1; +                PORT(QMK_LED) &= ~LEDS_LED2; + +                DDR(QMK_SPEAKER)  &= ~LEDS_LED1; +                PORT(QMK_SPEAKER) &= ~LEDS_LED2; +            } + +            static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +            { +                PORT(QMK_LED) &= (LEDS_LED1 & ~LEDMask); +                PORT(QMK_SPEAKER) &= (LEDS_LED2 & ~LEDMask); +            } + +            static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +            { +                PORT(QMK_LED) |=  (LEDS_LED1 & LEDMask); +                PORT(QMK_SPEAKER) |=  (LEDS_LED2 & LEDMask); +            } + +            static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +            { +                PORT(QMK_LED) = ((PORT(QMK_LED) | LEDS_LED1) & ~LEDMask); +                PORT(QMK_SPEAKER) = ((PORT(QMK_SPEAKER) | LEDS_LED2) & ~LEDMask); +            } + +            static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +                                               const uint8_t ActiveMask) +            { +                PORT(QMK_LED) = ((PORT(QMK_LED) | (LEDS_LED1 & LEDMask)) & ~ActiveMask); +                PORT(QMK_SPEAKER) = ((PORT(QMK_SPEAKER) | (LEDS_LED1 & LEDMask)) & ~ActiveMask); +            } + +            static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +            { +                PIN(QMK_LED)  = (LEDS_LED1 & LEDMask); +                PIN(QMK_SPEAKER)  = (LEDS_LED2 & LEDMask); +            } + +            static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +            static inline uint8_t LEDs_GetLEDs(void) +            { +                return (~PORT(QMK_LED) & LEDS_LED1) | (~(PORT(QMK_SPEAKER) & LEDS_LED2)); +            } +        #endif + +    /* Disable C linkage for C++ Compilers: */ +        #if defined(__cplusplus) +            } +        #endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/RZUSBSTICK/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/RZUSBSTICK/Board.h new file mode 100644 index 0000000000..83219b9420 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/RZUSBSTICK/Board.h @@ -0,0 +1,78 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Atmel RZUSBSTICK. + *  \copydetails Group_BoardInfo_RZUSBSTICK + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_RZUSBSTICK RZUSBSTICK + *  \brief Board specific information header for the Atmel RZUSBSTICK. + * + *  Board specific information header for the Atmel RZUSBSTICK. + * + *  @{ + */ + +#ifndef __BOARD_RZUSBSTICK_H__ +#define __BOARD_RZUSBSTICK_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/RZUSBSTICK/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/RZUSBSTICK/LEDs.h new file mode 100644 index 0000000000..25bdae1ae8 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/RZUSBSTICK/LEDs.h @@ -0,0 +1,175 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Atmel RZUSBSTICK. + *  \copydetails Group_LEDs_RZUSBSTICK + * + *  \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_RZUSBSTICK RZUSBSTICK + *  \brief Board specific LED driver header for the Atmel RZUSBSTICK. + * + *  Board specific LED driver header for the Atmel RZUSBSTICK. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Blue</td><td>General Indicator</td><td>High</td><td>PORTD.7</td></tr> + *    <tr><td>LEDS_LED1</td><td>Red</td><td>General Indicator</td><td>Low</td><td>PORTD.5</td></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTE.6</td></tr> + *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>General Indicator</td><td>Low</td><td>PORTE.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_RZUSBSTICK_H__ +#define __LEDS_RZUSBSTICK_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_PORTD_LEDS       (LEDS_LED1 | LEDS_LED2) +			#define LEDS_PORTE_LEDS       (LEDS_LED3 | LEDS_LED4) + +			#define LEDS_PORTE_MASK_SHIFT 4 +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** LED mask for the first LED on the board. */ +			#define LEDS_LED1        (1 << 7) + +			/** LED mask for the second LED on the board. */ +			#define LEDS_LED2        (1 << 5) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        ((1 << 6) >> LEDS_PORTE_MASK_SHIFT) + +			/** LED mask for the fourth LED on the board. */ +			#define LEDS_LED4        ((1 << 7) >> LEDS_PORTE_MASK_SHIFT) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4) + +			/** 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_PORTD_LEDS; +				PORTD &= ~LEDS_LED1; +				PORTD |=  LEDS_LED2; + +				DDRE  |=  (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT); +				PORTE |=  (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT); +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRD  &= ~LEDS_PORTD_LEDS; +				PORTD &= ~LEDS_PORTD_LEDS; + +				DDRE  &= ~(LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT); +				PORTE &= ~(LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT); +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTD |=  (LEDMask & LEDS_LED1); +				PORTD &= ~(LEDMask & LEDS_LED2); +				PORTE &= ~((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT); +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTD &= ~(LEDMask & LEDS_LED1); +				PORTD |=  (LEDMask & LEDS_LED2); +				PORTE |=  ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT); +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTD = (((PORTD & ~LEDS_LED1) |  (LEDMask & LEDS_LED1)) | +				         ((PORTD |  LEDS_LED2) & ~(LEDMask & LEDS_LED2))); +				PORTE = ((PORTE | (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT)) & +				        ~((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT)); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTD = (((PORTD & ~(LEDMask & LEDS_LED1)) |  (ActiveMask & LEDS_LED1)) | +				         ((PORTD |  (LEDMask & LEDS_LED2)) & ~(ActiveMask & LEDS_LED2))); +				PORTE = ((PORTE | ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT)) & +				        ~((ActiveMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT)); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PIND  = (LEDMask & LEDS_PORTD_LEDS); +				PINE  = ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT); +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return (((PORTD & LEDS_LED1) | (~PORTD & LEDS_LED2)) | +				        ((~PORTE & (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT)) >> LEDS_PORTE_MASK_SHIFT)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/Board.h new file mode 100644 index 0000000000..7803ecdef4 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/Board.h @@ -0,0 +1,78 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Sparkfun ATMEGA8U2 breakout board. + *  \copydetails Group_BoardInfo_SPARKFUN8U2 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_SPARKFUN8U2 SPARKFUN8U2 + *  \brief Board specific information header for the Sparkfun ATMEGA8U2 breakout board. + * + *  Board specific information header for the Sparkfun ATMEGA8U2 breakout board (http://www.sparkfun.com/products/10277). + * + *  @{ + */ + +#ifndef __BOARD_SPARKFUN8U2_H__ +#define __BOARD_SPARKFUN8U2_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h new file mode 100644 index 0000000000..70ca608240 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h @@ -0,0 +1,135 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTB.4</td></tr> + *  </table> + * + *  @{ + */ + +#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_Disable(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) +			{ +				PINB  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/Board.h new file mode 100644 index 0000000000..45472f139f --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Dimex Stange-ISP board. + *  \copydetails Group_BoardInfo_STANGE_ISP + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_STANGE_ISP STANGE_ISP + *  \brief Board specific information header for the Dimex Stange-ISP board. + * + *  Board specific information header for the Dimex Stange-ISP board (http://www.diamex.de/dxshop/USB-ISP-Programmer-fuer-Atmel-AVR). + * + *  @{ + */ + +#ifndef __BOARD_STANGE_ISP_H__ +#define __BOARD_STANGE_ISP_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/Buttons.h new file mode 100644 index 0000000000..2607622bd1 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author 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 button driver header for the Dimex Stange-ISP board. + *  \copydetails Group_Buttons_STANGE_ISP + * + *  \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_STANGE_ISP STANGE_ISP + *  \brief Board specific Buttons driver header for the Dimex Stange-ISP. + * + *  Board specific Buttons driver header for the Dimex Stange-ISP board (http://www.diamex.de/dxshop/USB-ISP-Programmer-fuer-Atmel-AVR). + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_STANGE_ISP_H__ +#define __BUTTONS_STANGE_ISP_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/LEDs.h new file mode 100644 index 0000000000..97a7e37220 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STANGE_ISP/LEDs.h @@ -0,0 +1,138 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author 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 Dimex Stange-ISP board. + *  \copydetails Group_LEDs_STANGE_ISP + * + *  \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_STANGE_ISP STANGE_ISP + *  \brief Board specific LED driver header for the Dimex Stange-ISP board. + * + *  Board specific LED driver header for the Dimex Stange-ISP board (http://www.diamex.de/dxshop/USB-ISP-Programmer-fuer-Atmel-AVR). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTD.0</td></tr> + *    <tr><td>LEDS_LED2</td><td>Red</td><td>General Indicator</td><td>Low</td><td>PORTD.1</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_STANGE_ISP_LEDS_H__ +#define __LEDS_STANGE_ISP_LEDS_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 the second LED on the board. */ +			#define LEDS_LED2        (1 << 1) + +			/** 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_Disable(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) +			{ +				PIND  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Board.h new file mode 100644 index 0000000000..a6831a7bbd --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Board.h @@ -0,0 +1,90 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Atmel STK525. + *  \copydetails Group_BoardInfo_STK525 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_STK525 STK525 + *  \brief Board specific information header for the Atmel STK525. + * + *  Board specific information header for the Atmel STK525. + * + *  @{ + */ + +#ifndef __BOARD_STK525_H__ +#define __BOARD_STK525_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../Dataflash.h" +		#include "../../Joystick.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has a hardware Dataflash mounted. */ +			#define BOARD_HAS_DATAFLASH + +			/** Indicates the board has a hardware Joystick mounted. */ +			#define BOARD_HAS_JOYSTICK + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Buttons.h new file mode 100644 index 0000000000..5770d070d0 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Atmel STK525. + *  \copydetails Group_Buttons_STK525 + * + *  \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_STK525 STK525 + *  \brief Board specific Buttons driver header for the Atmel STK525. + * + *  Board specific Buttons driver header for the Atmel STK525. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_STK525_H__ +#define __BUTTONS_STK525_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Dataflash.h new file mode 100644 index 0000000000..b0b2855f6c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Dataflash.h @@ -0,0 +1,222 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Dataflash driver header for the Atmel STK525. + *  \copydetails Group_Dataflash_STK525 + * + *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver + *        dispatch header located in LUFA/Drivers/Board/Dataflash.h. + */ + +/** \ingroup Group_Dataflash + *  \defgroup Group_Dataflash_STK525 STK525 + *  \brief Board specific Dataflash driver header for the Atmel STK525. + * + *  Board specific Dataflash driver header for the Atmel STK525. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr> + *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB321C (4MB)</td><td>PORTB.4</td><td>SPI0</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __DATAFLASH_STK525_H__ +#define __DATAFLASH_STK525_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../../Misc/AT45DB321C.h" +		#include "../../../Peripheral/SPI.h" + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_DATAFLASH_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead. +		#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#define DATAFLASH_CHIPCS_MASK                DATAFLASH_CHIP1 +			#define DATAFLASH_CHIPCS_DDR                 DDRB +			#define DATAFLASH_CHIPCS_PORT                PORTB +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */ +			#define DATAFLASH_TOTALCHIPS                 1 + +			/** Mask for no dataflash chip selected. */ +			#define DATAFLASH_NO_CHIP                    0 + +			/** Mask for the first dataflash chip selected. */ +			#define DATAFLASH_CHIP1                      (1 << 4) + +			/** Internal main memory page size for the board's dataflash IC. */ +			#define DATAFLASH_PAGE_SIZE                  512 + +			/** Total number of pages inside the board's dataflash IC. */ +			#define DATAFLASH_PAGES                      8192 + +		/* Inline Functions: */ +			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC. +			 *  The appropriate SPI interface will be automatically configured. +			 */ +			static inline void Dataflash_Init(void) +			{ +				DATAFLASH_CHIPCS_DDR  |= DATAFLASH_CHIPCS_MASK; +				DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK; + +				SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | SPI_SAMPLE_TRAILING | SPI_MODE_MASTER); +			} + +			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) +			{ +				return SPI_TransferByte(Byte); +			} + +			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 */ +			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SendByte(const uint8_t Byte) +			{ +				SPI_SendByte(Byte); +			} + +			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash. +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_ReceiveByte(void) +			{ +				return SPI_ReceiveByte(); +			} + +			/** Determines the currently selected dataflash chip. +			 * +			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected +			 *          or a DATAFLASH_CHIPn mask (where n is the chip number). +			 */ +			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_GetSelectedChip(void) +			{ +				return (~DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK); +			} + +			/** Selects the given dataflash chip. +			 * +			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is +			 *              the chip number). +			 */ +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) +			{ +				DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT | DATAFLASH_CHIPCS_MASK) & ~ChipMask); +			} + +			/** Deselects the current dataflash chip, so that no dataflash is selected. */ +			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_DeselectChip(void) +			{ +				Dataflash_SelectChip(DATAFLASH_NO_CHIP); +			} + +			/** Selects a dataflash IC from the given page number, which should range from 0 to +			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one +			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside +			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs +			 *  are deselected. +			 * +			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from +			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). +			 */ +			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress) +			{ +				Dataflash_DeselectChip(); + +				if (PageAddress >= DATAFLASH_PAGES) +				  return; + +				Dataflash_SelectChip(DATAFLASH_CHIP1); +			} + +			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive +			 *  a new command. +			 */ +			static inline void Dataflash_ToggleSelectedChipCS(void) +			{ +				uint8_t SelectedChipMask = Dataflash_GetSelectedChip(); + +				Dataflash_DeselectChip(); +				Dataflash_SelectChip(SelectedChipMask); +			} + +			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main +			 *  memory page program or main memory to buffer transfer. +			 */ +			static inline void Dataflash_WaitWhileBusy(void) +			{ +				Dataflash_ToggleSelectedChipCS(); +				Dataflash_SendByte(DF_CMD_GETSTATUS); +				while (!(Dataflash_ReceiveByte() & DF_STATUS_READY)); +				Dataflash_ToggleSelectedChipCS(); +			} + +			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with +			 *  dataflash commands which require a complete 24-bit address. +			 * +			 *  \param[in] PageAddress  Page address within the selected dataflash IC +			 *  \param[in] BufferByte   Address within the dataflash's buffer +			 */ +			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, +			                                              const uint16_t BufferByte) +			{ +				Dataflash_SendByte(PageAddress >> 6); +				Dataflash_SendByte((PageAddress << 2) | (BufferByte >> 8)); +				Dataflash_SendByte(BufferByte); +			} + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Joystick.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Joystick.h new file mode 100644 index 0000000000..0224a723e7 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/Joystick.h @@ -0,0 +1,130 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific joystick driver header for the Atmel STK525. + *  \copydetails Group_Joystick_STK525 + * + *  \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_STK525 STK525 + *  \brief Board specific joystick driver header for the Atmel STK525. + * + *  Board specific joystick driver header for the Atmel STK525. + * + *  <table> + *    <tr><th>Left Port Pin</th><th>Up Port Pin</th><th>Right Port Pin</th><th>Down Port Pin</th><th>Press Port Pin</th></tr> + *    <tr><td>PORTB.6</td><td>PORTB.7</td><td>PORTE.4</td><td>PORTE.5</td><td>PORTB.5</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __JOYSTICK_STK525_H__ +#define __JOYSTICK_STK525_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_BMASK                 ((1 << 5) | (1 << 6) | (1 << 7)) +			#define JOY_EMASK                 ((1 << 4) | (1 << 5)) + +			#define JOY_PORTE_MASK_SHIFT      1 +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Mask for the joystick being pushed in the left direction. */ +			#define JOY_LEFT                  (1 << 6) + +			/** Mask for the joystick being pushed in the right direction. */ +			#define JOY_RIGHT                ((1 << 4) >> JOY_PORTE_MASK_SHIFT) + +			/** Mask for the joystick being pushed in the upward direction. */ +			#define JOY_UP                    (1 << 7) + +			/** Mask for the joystick being pushed in the downward direction. */ +			#define JOY_DOWN                 ((1 << 5) >> JOY_PORTE_MASK_SHIFT) + +			/** Mask for the joystick being pushed inward. */ +			#define JOY_PRESS                 (1 << 5) + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void Joystick_Init(void) +			{ +				DDRB  &= ~JOY_BMASK; +				DDRE  &= ~JOY_EMASK; + +				PORTB |=  JOY_BMASK; +				PORTE |=  JOY_EMASK; +			} + +			static inline void Joystick_Disable(void) +			{ +				DDRB  &= ~JOY_BMASK; +				DDRE  &= ~JOY_EMASK; + +				PORTB &= ~JOY_BMASK; +				PORTE &= ~JOY_EMASK; +			} + +			static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Joystick_GetStatus(void) +			{ +				return (((uint8_t)~PINB & JOY_BMASK) | (((uint8_t)~PINE & JOY_EMASK) >> JOY_PORTE_MASK_SHIFT)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/LEDs.h new file mode 100644 index 0000000000..e4138166d2 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK525/LEDs.h @@ -0,0 +1,147 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Atmel STK525. + *  \copydetails Group_LEDs_STK525 + * + *  \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_STK525 STK525 + *  \brief Board specific LED driver header for the Atmel STK525. + * + *  Board specific LED driver header for the Atmel STK525. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.4</td></tr> + *    <tr><td>LEDS_LED2</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.5</td></tr> + *    <tr><td>LEDS_LED3</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.6</td></tr> + *    <tr><td>LEDS_LED4</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_STK525_H__ +#define __LEDS_STK525_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 the second LED on the board. */ +			#define LEDS_LED2        (1 << 5) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        (1 << 7) + +			/** LED mask for the fourth LED on the board. */ +			#define LEDS_LED4        (1 << 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 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_Disable(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) +			{ +				PIND  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Board.h new file mode 100644 index 0000000000..1c4ee85c15 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Board.h @@ -0,0 +1,90 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Atmel STK526. + *  \copydetails Group_BoardInfo_STK526 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_STK526 STK526 + *  \brief Board specific information header for the Atmel STK526. + * + *  Board specific information header for the Atmel STK526. + * + *  @{ + */ + +#ifndef __BOARD_STK526_H__ +#define __BOARD_STK526_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../Dataflash.h" +		#include "../../Joystick.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has a hardware Dataflash mounted. */ +			#define BOARD_HAS_DATAFLASH + +			/** Indicates the board has a hardware Joystick mounted. */ +			#define BOARD_HAS_JOYSTICK + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Buttons.h new file mode 100644 index 0000000000..168adaa9bf --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Atmel STK526. + *  \copydetails Group_Buttons_STK526 + * + *  \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_STK526 STK526 + *  \brief Board specific Buttons driver header for the Atmel STK526. + * + *  Board specific Buttons driver header for the Atmel STK526. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_STK526_H__ +#define __BUTTONS_STK526_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Dataflash.h new file mode 100644 index 0000000000..82b311bbc2 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Dataflash.h @@ -0,0 +1,222 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Dataflash driver header for the Atmel STK525. + *  \copydetails Group_Dataflash_STK526 + * + *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver + *        dispatch header located in LUFA/Drivers/Board/Dataflash.h. + */ + +/** \ingroup Group_Dataflash + *  \defgroup Group_Dataflash_STK526 STK526 + *  \brief Board specific Dataflash driver header for the Atmel STK525. + * + *  Board specific Dataflash driver header for the Atmel STK525. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr> + *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB642D (8MB)</td><td>PORTC.2</td><td>SPI0</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __DATAFLASH_STK526_H__ +#define __DATAFLASH_STK526_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../../Misc/AT45DB642D.h" +		#include "../../../Peripheral/SPI.h" + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_DATAFLASH_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead. +		#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#define DATAFLASH_CHIPCS_MASK                DATAFLASH_CHIP1 +			#define DATAFLASH_CHIPCS_DDR                 DDRC +			#define DATAFLASH_CHIPCS_PORT                PORTC +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */ +			#define DATAFLASH_TOTALCHIPS                 1 + +			/** Mask for no dataflash chip selected. */ +			#define DATAFLASH_NO_CHIP                    0 + +			/** Mask for the first dataflash chip selected. */ +			#define DATAFLASH_CHIP1                      (1 << 2) + +			/** Internal main memory page size for the board's dataflash IC. */ +			#define DATAFLASH_PAGE_SIZE                  1024 + +			/** Total number of pages inside the board's dataflash IC. */ +			#define DATAFLASH_PAGES                      8192 + +		/* Inline Functions: */ +			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC. +			 *  The appropriate SPI interface will be automatically configured. +			 */ +			static inline void Dataflash_Init(void) +			{ +				DATAFLASH_CHIPCS_DDR  |= DATAFLASH_CHIPCS_MASK; +				DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK; + +				SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | SPI_SAMPLE_TRAILING | SPI_MODE_MASTER); +			} + +			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) +			{ +				return SPI_TransferByte(Byte); +			} + +			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 */ +			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SendByte(const uint8_t Byte) +			{ +				SPI_SendByte(Byte); +			} + +			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash. +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_ReceiveByte(void) +			{ +				return SPI_ReceiveByte(); +			} + +			/** Determines the currently selected dataflash chip. +			 * +			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected +			 *          or a DATAFLASH_CHIPn mask (where n is the chip number). +			 */ +			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_GetSelectedChip(void) +			{ +				return (~DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK); +			} + +			/** Selects the given dataflash chip. +			 * +			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is +			 *              the chip number). +			 */ +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) +			{ +				DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT | DATAFLASH_CHIPCS_MASK) & ~ChipMask); +			} + +			/** Deselects the current dataflash chip, so that no dataflash is selected. */ +			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_DeselectChip(void) +			{ +				Dataflash_SelectChip(DATAFLASH_NO_CHIP); +			} + +			/** Selects a dataflash IC from the given page number, which should range from 0 to +			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one +			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside +			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs +			 *  are deselected. +			 * +			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from +			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). +			 */ +			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress) +			{ +				Dataflash_DeselectChip(); + +				if (PageAddress >= DATAFLASH_PAGES) +				  return; + +				Dataflash_SelectChip(DATAFLASH_CHIP1); +			} + +			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive +			 *  a new command. +			 */ +			static inline void Dataflash_ToggleSelectedChipCS(void) +			{ +				uint8_t SelectedChipMask = Dataflash_GetSelectedChip(); + +				Dataflash_DeselectChip(); +				Dataflash_SelectChip(SelectedChipMask); +			} + +			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main +			 *  memory page program or main memory to buffer transfer. +			 */ +			static inline void Dataflash_WaitWhileBusy(void) +			{ +				Dataflash_ToggleSelectedChipCS(); +				Dataflash_SendByte(DF_CMD_GETSTATUS); +				while (!(Dataflash_ReceiveByte() & DF_STATUS_READY)); +				Dataflash_ToggleSelectedChipCS(); +			} + +			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with +			 *  dataflash commands which require a complete 24-bit address. +			 * +			 *  \param[in] PageAddress  Page address within the selected dataflash IC +			 *  \param[in] BufferByte   Address within the dataflash's buffer +			 */ +			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, +			                                              const uint16_t BufferByte) +			{ +				Dataflash_SendByte(PageAddress >> 5); +				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8)); +				Dataflash_SendByte(BufferByte); +			} + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Joystick.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Joystick.h new file mode 100644 index 0000000000..c7d816c83d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/Joystick.h @@ -0,0 +1,123 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific joystick driver header for the Atmel STK526. + *  \copydetails Group_Joystick_STK526 + * + *  \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_STK526 STK526 + *  \brief Board specific joystick driver header for the Atmel STK526. + * + *  Board specific joystick driver header for the Atmel STK526. + * + *  <table> + *    <tr><th>Left Port Pin</th><th>Up Port Pin</th><th>Right Port Pin</th><th>Down Port Pin</th><th>Press Port Pin</th></tr> + *    <tr><td>PORTB.4</td><td>PORTB.5</td><td>PORTB.6</td><td>PORTB.7</td><td>PORTB.0</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __JOYSTICK_STK526_H__ +#define __JOYSTICK_STK526_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_BMASK                 ((1 << 0) | (1 << 4) | (1 << 5) | (1 << 6) | (1 << 7)) +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Mask for the joystick being pushed in the left direction. */ +			#define JOY_LEFT                  (1 << 4) + +			/** Mask for the joystick being pushed in the right direction. */ +			#define JOY_RIGHT                 (1 << 6) + +			/** Mask for the joystick being pushed in the upward direction. */ +			#define JOY_UP                    (1 << 5) + +			/** Mask for the joystick being pushed in the downward direction. */ +			#define JOY_DOWN                  (1 << 7) + +			/** Mask for the joystick being pushed inward. */ +			#define JOY_PRESS                 (1 << 0) + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void Joystick_Init(void) +			{ +				DDRB  &= ~JOY_BMASK; + +				PORTB |=  JOY_BMASK; +			} + +			static inline void Joystick_Disable(void) +			{ +				DDRB  &= ~JOY_BMASK; + +				PORTB &= ~JOY_BMASK; +			} + +			static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Joystick_GetStatus(void) +			{ +				return ((uint8_t)~PINB & JOY_BMASK); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/LEDs.h new file mode 100644 index 0000000000..fc561e7336 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/STK526/LEDs.h @@ -0,0 +1,147 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Atmel STK526. + *  \copydetails Group_LEDs_STK526 + * + *  \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_STK526 STK526 + *  \brief Board specific LED driver header for the Atmel STK526. + * + *  Board specific LED driver header for the Atmel STK526. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.1</td></tr> + *    <tr><td>LEDS_LED2</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.0</td></tr> + *    <tr><td>LEDS_LED3</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.5</td></tr> + *    <tr><td>LEDS_LED4</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.4</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_STK526_H__ +#define __LEDS_STK526_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 << 1) + +			/** LED mask for the second LED on the board. */ +			#define LEDS_LED2        (1 << 0) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        (1 << 5) + +			/** LED mask for the fourth LED on the board. */ +			#define LEDS_LED4        (1 << 4) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4) + +			/** 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_Disable(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) +			{ +				PIND  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/TEENSY/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/TEENSY/Board.h new file mode 100644 index 0000000000..15237b625a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/TEENSY/Board.h @@ -0,0 +1,85 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the PJRC Teensy 1.x/2.x boards. + *  \copydetails Group_BoardInfo_TEENSY + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_TEENSY2 TEENSY2 + *  \brief Board specific information header for the PJRC Teensy 2 boards. + * + *  See \ref Group_BoardInfo_TEENSY for more details. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_TEENSY TEENSY + *  \brief Board specific information header for the PJRC Teensy 1.x/2.x boards. + * + *  Board specific information header for the PJRC Teensy boards (http://www.pjrc.com/teensy/index.html). + * + *  @{ + */ + +#ifndef __BOARD_TEENSY_H__ +#define __BOARD_TEENSY_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/TEENSY/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/TEENSY/LEDs.h new file mode 100644 index 0000000000..ed7fbf0946 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/TEENSY/LEDs.h @@ -0,0 +1,176 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the PJRC Teensy 1.x/2.x boards. + *  \copydetails Group_LEDs_TEENSY + * + *  \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_TEENSY2 TEENSY2 + *  \brief Board specific LED driver header for the PJRC Teensy 2 boards. + * + *  See \ref Group_LEDs_TEENSY for more details. + */ + +/** \ingroup Group_LEDs + *  \defgroup Group_LEDs_TEENSY TEENSY + *  \brief Board specific LED driver header for the PJRC Teensy 1.x/2.x boards. + * + *  \note For version 2 Teensy boards, compile with <code>BOARD = TEENSY2</code>. + * + *  Board specific LED driver header for the PJRC Teensy boards (http://www.pjrc.com/teensy/index.html). + * + *  <b>TEENSY</b>: + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.6</td></tr> + *  </table> + * + *  <b>TEENSY2</b>: + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTD.6</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_TEENSY_H__ +#define __LEDS_TEENSY_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 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; + +				#if (BOARD == BOARD_TEENSY2) +				PORTD &= ~LEDS_ALL_LEDS; +				#else +				PORTD |=  LEDS_ALL_LEDS; +				#endif +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRD  &= ~LEDS_ALL_LEDS; +				PORTD &= ~LEDS_ALL_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				#if (BOARD == BOARD_TEENSY2) +				PORTD |=  LEDMask; +				#else +				PORTD &= ~LEDMask; +				#endif +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				#if (BOARD == BOARD_TEENSY2) +				PORTD &= ~LEDMask; +				#else +				PORTD |=  LEDMask; +				#endif +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				#if (BOARD == BOARD_TEENSY2) +				PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask); +				#else +				PORTD = ((PORTD | LEDS_ALL_LEDS) & ~LEDMask); +				#endif +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				#if (BOARD == BOARD_TEENSY2) +				PORTD = ((PORTD & ~LEDMask) | ActiveMask); +				#else +				PORTD = ((PORTD | LEDMask) & ~ActiveMask); +				#endif +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PIND  = LEDMask; +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				#if (BOARD == BOARD_TEENSY2) +				return (PORTD & LEDS_ALL_LEDS); +				#else +				return (~PORTD & LEDS_ALL_LEDS); +				#endif +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/Board.h new file mode 100644 index 0000000000..066e6c3ed7 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the TUL. + *  \copydetails Group_BoardInfo_TUL + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_TUL TUL + *  \brief Board specific information header for the TUL. + * + *  Board specific information header for the Busware TUL (http://www.busware.de/tiki-index.php?page=TUL). + * + *  @{ + */ + +#ifndef __BOARD_TUL_H__ +#define __BOARD_TUL_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/Buttons.h new file mode 100644 index 0000000000..af6b2ae611 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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). + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr> + *  </table> + * + *  @{ + */ + +#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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/LEDs.h new file mode 100644 index 0000000000..9417b67638 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/TUL/LEDs.h @@ -0,0 +1,135 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTF.0</td></tr> + *  </table> + * + *  @{ + */ + +#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_Disable(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) +			{ +				PINF  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/Board.h new file mode 100644 index 0000000000..6ea238028c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the U2S. + *  \copydetails Group_BoardInfo_U2S + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_U2S U2S + *  \brief Board specific information header for the U2S. + * + *  Board specific information header for the U2S (http://sites.google.com/site/megau2s/). + * + *  @{ + */ + +#ifndef __BOARD_U2S__ +#define __BOARD_U2S__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has a hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has a hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/Buttons.h new file mode 100644 index 0000000000..ea5c1af4fd --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the U2S. + *  \copydetails Group_Buttons_U2S + * + *  \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_U2S U2S + *  \brief Board specific Buttons driver header for the U2S. + * + *  Board specific Buttons driver header for the U2S (http://sites.google.com/site/megau2s/). + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTC.4</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_U2S__ +#define __BUTTONS_U2S__ + +	/* 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 << 4) + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void Buttons_Init(void) +			{ +				DDRC  &= ~BUTTONS_BUTTON1; +				PORTC |=  BUTTONS_BUTTON1; +			} + +			static inline void Buttons_Disable(void) +			{ +				DDRC  &= ~BUTTONS_BUTTON1; +				PORTC &= ~BUTTONS_BUTTON1; +			} + +			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Buttons_GetStatus(void) +			{ +				return ((PINC & BUTTONS_BUTTON1) ^ BUTTONS_BUTTON1); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/LEDs.h new file mode 100644 index 0000000000..942fdc0e6c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/U2S/LEDs.h @@ -0,0 +1,135 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the U2S. + *  \copydetails Group_LEDs_U2S + * + *  \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_U2S U2S + *  \brief Board specific LED driver header for the U2S. + * + *  Board specific LED driver header for the U2S (http://sites.google.com/site/megau2s/). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Red</td><td>General Indicator</td><td>Low</td><td>PORTC.2</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_U2S__ +#define __LEDS_U2S__ + +	/* 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 << 2) + +			/** 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) +			{ +				DDRC  |= LEDS_ALL_LEDS; +				PORTC |= LEDS_ALL_LEDS; +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRC  &= ~LEDS_ALL_LEDS; +				PORTC &= ~LEDS_ALL_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTC &= ~LEDMask; +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTC |= LEDMask; +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTC = ((PORTC | LEDS_ALL_LEDS) & ~LEDMask); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTC = ((PORTC | LEDMask) & ~ActiveMask); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PINC  = LEDMask; +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return (~PORTC & LEDS_ALL_LEDS); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/Board.h new file mode 100644 index 0000000000..c8b6e77656 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the UDIP. + *  \copydetails Group_BoardInfo_UDIP + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_UDIP UDIP + *  \brief Board specific information header for the UDIP. + * + *  Board specific information header for the Linnix UDIP (http://linnix.com/udip/). + * + *  @{ + */ + +#ifndef __BOARD_UDIP_H__ +#define __BOARD_UDIP_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/Buttons.h new file mode 100644 index 0000000000..f579b29b75 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the UDIP. + *  \copydetails Group_Buttons_UDIP + * + *  \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_UDIP UDIP + *  \brief Board specific Buttons driver header for the UDIP. + * + *  Board specific Buttons driver header for the Linnix UDIP (http://linnix.com/udip/). + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_UDIP_H__ +#define __BUTTONS_UDIP_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/LEDs.h new file mode 100644 index 0000000000..1bf839823a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/UDIP/LEDs.h @@ -0,0 +1,163 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Linnix UDIP. + *  \copydetails Group_LEDs_UDIP + * + *  \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_UDIP UDIP + *  \brief Board specific LED driver header for the Linnix UDIP. + * + *  Board specific LED driver header for the Linnix UDIP (http://linnix.com/udip/). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTB.6</td></tr> + *    <tr><td>LEDS_LED2</td><td>Red</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTB.5</td></tr> + *    <tr><td>LEDS_LED3</td><td>Green</td><td>Bicolor Indicator 2</td><td>High</td><td>PORTD.5</td></tr> + *    <tr><td>LEDS_LED4</td><td>Red</td><td>Bicolor Indicator 2</td><td>High</td><td>PORTD.4</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_UDIP_H__ +#define __LEDS_UDIP_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_PORTB_LEDS       (LEDS_LED1 | LEDS_LED2) +			#define LEDS_PORTD_LEDS       (LEDS_LED3 | LEDS_LED4) + +			#define LEDS_PORTD_MASK_SHIFT 1 +	#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 << 5) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        ((1 << 5) >> LEDS_PORTD_MASK_SHIFT) + +			/** LED mask for the fourth LED on the board. */ +			#define LEDS_LED4        ((1 << 4) >> LEDS_PORTD_MASK_SHIFT) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4) + +			/** 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_PORTB_LEDS; +				DDRD |= (LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT); +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRB &= ~LEDS_PORTB_LEDS; +				DDRD &= ~(LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT); +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTB |= (LEDMask & LEDS_PORTB_LEDS); +				PORTD |= ((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT); +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTB &= ~(LEDMask & LEDS_PORTB_LEDS); +				PORTD &= ~((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT); +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTB = (PORTB & ~LEDS_PORTB_LEDS) | (LEDMask & LEDS_PORTB_LEDS); +				PORTD = (PORTD & ~(LEDS_PORTD_LEDS << LEDS_PORTD_MASK_SHIFT)) | +				        ((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTB = (PORTB & ~(LEDMask & LEDS_PORTB_LEDS)) | (ActiveMask & LEDS_PORTB_LEDS); +				PORTD = (PORTD & ~((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT)) | +				        ((ActiveMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PINB  = (LEDMask & LEDS_PORTB_LEDS); +				PIND  = ((LEDMask & LEDS_PORTD_LEDS) << LEDS_PORTD_MASK_SHIFT); +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return ((PORTB & LEDS_PORTB_LEDS) | ((PORTD & LEDS_PORTD_LEDS) >> LEDS_PORTD_MASK_SHIFT)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/UNO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/UNO/Board.h new file mode 100644 index 0000000000..9277a3824c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/UNO/Board.h @@ -0,0 +1,84 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Arduino Uno. + *  \copydetails Group_BoardInfo_UNO + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_UNO UNO + *  \brief Board specific information header for the Arduino Uno. + * + *  Board specific information header for the Arduino Uno (http://arduino.cc/en/Main/ArduinoBoardUno). + * + *  @{ + */ + +#ifndef __BOARD_UNO_H__ +#define __BOARD_UNO_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +			/** Pin that can reset the main MCU. */ +			#define AVR_RESET_LINE_PORT  PORTD +			#define AVR_RESET_LINE_DDR   DDRD +			#define AVR_RESET_LINE_PIN   PIND +			#define AVR_RESET_LINE_MASK  (1 << PD7) + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/UNO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/UNO/LEDs.h new file mode 100644 index 0000000000..17526f3c56 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/UNO/LEDs.h @@ -0,0 +1,145 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Arduino Uno. + *  \copydetails Group_LEDs_UNO + * + *  \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_UNO UNO + *  \brief Board specific LED driver header for the Arduino Uno. + * + *  Board specific LED driver header for the Arduino Uno (http://arduino.cc/en/Main/ArduinoBoardUno). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>RX</td><td>Low</td><td>PORTD.5</td></tr> + *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>TX</td><td>Low</td><td>PORTD.4</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_UNO_H__ +#define __LEDS_UNO_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 << 4) + +			/** 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 + +			/** LED mask for the library LED driver, to indicate TX activity. */ +			#define LEDMASK_TX       LEDS_LED1 + +			/** LED mask for the library LED driver, to indicate RX activity. */ +			#define LEDMASK_RX       LEDS_LED2 + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void LEDs_Init(void) +			{ +				DDRD  |= LEDS_ALL_LEDS; +				PORTD |= LEDS_ALL_LEDS; +			} + +			static inline void LEDs_Disable(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) +			{ +				PIND  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/Board.h new file mode 100644 index 0000000000..c6fcd43ff5 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/Board.h @@ -0,0 +1,105 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Xevelabs USB2AX. + *  \copydetails Group_BoardInfo_USB2AX + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_USB2AX_V31 USB2AX_V31 + *  \brief Board specific information header for the Xevelabs USB2AX revision 3.1. + * + *  See \ref Group_BoardInfo_USB2AX for more details. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_USB2AX_V3 USB2AX_V3 + *  \brief Board specific information header for the Xevelabs USB2AX revision 3. + * + *  See \ref Group_BoardInfo_USB2AX for more details. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_USB2AX USB2AX + *  \brief Board specific information header for the Xevelabs USB2AX. + * + *  Board specific information header for the Xevelabs USB2AX (http://paranoidstudio.assembla.com/wiki/show/paranoidstudio/USB2AX). + * + *  @{ + */ + +#ifndef __BOARD_USB2AX_H__ +#define __BOARD_USB2AX_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			#if (BOARD == BOARD_USB2AX) || (BOARD == BOARD_USB2AX_V3) || \ +			    defined(__DOXYGEN__) +				#include "../../Buttons.h" + +				/** Indicates the board has hardware Buttons mounted. */ +				#define BOARD_HAS_BUTTONS +			#endif + +			#if ((BOARD == BOARD_USB2AX) || (BOARD == BOARD_USB2AX_V3) || \ +			     (BOARD == BOARD_USB2AX_V31) || defined(__DOXYGEN__)) +				#include "../../LEDs.h" + +				/** Indicates the board has hardware LEDs mounted. */ +				#define BOARD_HAS_LEDS +			#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/Buttons.h new file mode 100644 index 0000000000..df6ef64ba3 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/Buttons.h @@ -0,0 +1,120 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Xevelabs USB2AX. + *  \copydetails Group_Buttons_USB2AX + * + *  \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_USB2AX_V31 USB2AX_V31 + *  \brief Board specific Button driver header for the Xevelabs USB2AX revision 3.1. + * + *  See \ref Group_Buttons_USB2AX for more details. + */ + +/** \ingroup Group_Buttons + *  \defgroup Group_Buttons_USB2AX_V3 USB2AX_V3 + *  \brief Board specific Button driver header for the Xevelabs USB2AX revision 3. + * + *  See \ref Group_Buttons_USB2AX for more details. + */ + +/** \ingroup Group_Buttons + *  \defgroup Group_Buttons_USB2AX USB2AX + *  \brief Board specific Buttons driver header for the Xevelabs USB2AX revisions 1 and 2. + * + *  \note For version 3 USB2AX boards, compile with <code>BOARD = USB2AX_V3</code> and for version 3.1, with <code>BOARD = USB2AX_V31</code>. + * + *  Board specific Buttons driver header for the Paranoid Studio USB2AX (http://paranoidstudio.assembla.com/wiki/show/paranoidstudio/USB2AX). + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_USB2AX_H__ +#define __BUTTONS_USB2AX_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/LEDs.h new file mode 100644 index 0000000000..b4ed1ca09c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USB2AX/LEDs.h @@ -0,0 +1,218 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Xevelabs USB2AX. + *  \copydetails Group_LEDs_USB2AX + * + *  \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_USB2AX_V31 USB2AX_V31 + *  \brief Board specific LED driver header for the Xevelabs USB2AX revision 3.1. + * + *  See \ref Group_LEDs_USB2AX for more details. + */ + +/** \ingroup Group_LEDs + *  \defgroup Group_LEDs_USB2AX_V3 USB2AX_V3 + *  \brief Board specific LED driver header for the Xevelabs USB2AX revision 3. + * + *  See \ref Group_LEDs_USB2AX for more details. + */ + +/** \ingroup Group_LEDs + *  \defgroup Group_LEDs_USB2AX USB2AX + *  \brief Board specific LED driver header for the Xevelabs USB2AX revisions 1 and 2. + * + *  \note For version 3 USB2AX boards, compile with <code>BOARD = USB2AX_V3</code> and for version 3.1, with <code>BOARD = USB2AX_V31</code>. + * + *  Board specific LED driver header for the Xevelabs USB2AX (http://paranoidstudio.assembla.com/wiki/show/paranoidstudio/USB2AX). + * + *  <b>USB2AX</b>: + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTC.6</td></tr> + *  </table> + * + *  <b>USB2AX_V3</b>: + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.1</td></tr> + *  </table> + * + *  <b>USB2AX_V31</b>: + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>High</td><td>PORTD.5</td></tr> + *    <tr><td>LEDS_LED2</td><td>Red</td><td>General Indicator</td><td>High</td><td>PORTD.6</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_USB2AX_H__ +#define __LEDS_USB2AX_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: */ +			#if (BOARD == BOARD_USB2AX_V31) +                #define USB2AX_LEDS_LED1   (1 << 5) +                #define USB2AX_LEDS_LED2   (1 << 6) +            #elif (BOARD == BOARD_USB2AX_V3) +				#define USB2AX_LEDS_LED1   (1 << 1) +                #define USB2AX_LEDS_LED2   0 +			#else +				#define USB2AX_LEDS_LED1   (1 << 6) +                #define USB2AX_LEDS_LED2   0 +			#endif +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** LED mask for the first LED on the board. */ +			#define LEDS_LED1        USB2AX_LEDS_LED1 + +			/** LED mask for the second LED on the board. */ +			#define LEDS_LED2        USB2AX_LEDS_LED2 + +			/** 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) +			{ +				#if (BOARD == BOARD_USB2AX) +				DDRC  |=  LEDS_ALL_LEDS; +				PORTC &= ~LEDS_ALL_LEDS; +				#else +				DDRD  |=  LEDS_ALL_LEDS; +				PORTD &= ~LEDS_ALL_LEDS; +				#endif +			} + +			static inline void LEDs_Disable(void) +			{ +				#if (BOARD == BOARD_USB2AX) +				DDRC  &= ~LEDS_ALL_LEDS; +				PORTC &= ~LEDS_ALL_LEDS; +				#else +				DDRD  &= ~LEDS_ALL_LEDS; +				PORTD &= ~LEDS_ALL_LEDS; +				#endif +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				#if (BOARD == BOARD_USB2AX) +				PORTC |= LEDMask; +				#else +				PORTD |= LEDMask; +				#endif +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				#if (BOARD == BOARD_USB2AX) +				PORTC &= ~LEDMask; +				#else +				PORTD &= ~LEDMask; +				#endif +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				#if (BOARD == BOARD_USB2AX) +				PORTC = ((PORTC & ~LEDS_ALL_LEDS) | LEDMask); +				#else +				PORTD = ((PORTD & ~LEDS_ALL_LEDS) | LEDMask); +				#endif +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				#if (BOARD == BOARD_USB2AX) +				PORTC = ((PORTC & ~LEDMask) | ActiveMask); +				#else +				PORTD = ((PORTD & ~LEDMask) | ActiveMask); +				#endif +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				#if (BOARD == BOARD_USB2AX) +				PINC  = LEDMask; +				#else +				PIND  = LEDMask; +				#endif +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				#if (BOARD == BOARD_USB2AX) +				return (PORTC & LEDS_ALL_LEDS); +				#else +				return (PORTD & LEDS_ALL_LEDS); +				#endif +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/Board.h new file mode 100644 index 0000000000..fa01b5bab0 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Kernel Concepts USBFOO. + *  \copydetails Group_BoardInfo_USBFOO + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_USBFOO USBFOO + *  \brief Board specific information header for the Kernel Concepts USBFOO. + * + *  Board specific information header for the Kernel Concepts USBFOO (http://shop.kernelconcepts.de/product_info.php?products_id=102). + * + *  @{ + */ + +#ifndef __BOARD_USBFOO_H__ +#define __BOARD_USBFOO_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/Buttons.h new file mode 100644 index 0000000000..9c2476cc29 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Kernel Concepts USBFOO. + *  \copydetails Group_Buttons_USBFOO + * + *  \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_USBFOO USBFOO + *  \brief Board specific Buttons driver header for the Kernel Concepts USBFOO. + * + *  Board specific Buttons driver header for the Kernel Concepts USBFOO (http://shop.kernelconcepts.de/product_info.php?products_id=102). + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_USBFOO_H__ +#define __BUTTONS_USBFOO_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/LEDs.h new file mode 100644 index 0000000000..9c5b8bc353 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBFOO/LEDs.h @@ -0,0 +1,135 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Kernel Concepts USBFOO. + *  \copydetails Group_LEDs_USBFOO + * + *  \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_USBFOO USBFOO + *  \brief Board specific LED driver header for the Kernel Concepts USBFOO. + * + *  Board specific LED driver header for the Kernel Concepts USBFOO (http://shop.kernelconcepts.de/product_info.php?products_id=102). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTD.4</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_USBFOO_H__ +#define __LEDS_USBFOO_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_Disable(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) +			{ +				PIND  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Board.h new file mode 100644 index 0000000000..920681d036 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Board.h @@ -0,0 +1,90 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Atmel USBKEY. + *  \copydetails Group_BoardInfo_USBKEY + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_USBKEY USBKEY + *  \brief Board specific information header for the Atmel USBKEY. + * + *  Board specific information header for the Atmel USBKEY. + * + *  @{ + */ + +#ifndef __BOARD_USBKEY_H__ +#define __BOARD_USBKEY_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../Dataflash.h" +		#include "../../Joystick.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has a hardware Dataflash mounted. */ +			#define BOARD_HAS_DATAFLASH + +			/** Indicates the board has a hardware Joystick mounted. */ +			#define BOARD_HAS_JOYSTICK + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Buttons.h new file mode 100644 index 0000000000..068fd0b723 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Atmel USBKEY. + *  \copydetails Group_Buttons_USBKEY + * + *  \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_USBKEY USBKEY + *  \brief Board specific Buttons driver header for the Atmel USBKEY. + * + *  Board specific Buttons driver header for the Atmel USBKEY. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTE.2</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_USBKEY_H__ +#define __BUTTONS_USBKEY_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Dataflash.h new file mode 100644 index 0000000000..77be220118 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Dataflash.h @@ -0,0 +1,237 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Dataflash driver header for the Atmel USBKEY. + *  \copydetails Group_Dataflash_USBKEY + * + *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver + *        dispatch header located in LUFA/Drivers/Board/Dataflash.h. + */ + +/** \ingroup Group_Dataflash + *  \defgroup Group_Dataflash_USBKEY USBKEY + *  \brief Board specific Dataflash driver header for the Atmel USBKEY. + * + *  Board specific Dataflash driver header for the Atmel USBKEY board. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr> + *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB642D (8MB)</td><td>PORTE.0</td><td>SPI0</td></tr> + *    <tr><td>DATAFLASH_CHIP2</td><td>AT45DB642D (8MB)</td><td>PORTE.1</td><td>SPI0</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __DATAFLASH_USBKEY_H__ +#define __DATAFLASH_USBKEY_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../../Misc/AT45DB642D.h" +		#include "../../../Peripheral/SPI.h" + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_DATAFLASH_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead. +		#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#define DATAFLASH_CHIPCS_MASK                (DATAFLASH_CHIP1 | DATAFLASH_CHIP2) +			#define DATAFLASH_CHIPCS_DDR                 DDRE +			#define DATAFLASH_CHIPCS_PORT                PORTE +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */ +			#define DATAFLASH_TOTALCHIPS                 2 + +			/** Mask for no dataflash chip selected. */ +			#define DATAFLASH_NO_CHIP                    0 + +			/** Mask for the first dataflash chip selected. */ +			#define DATAFLASH_CHIP1                      (1 << 0) + +			/** Mask for the second dataflash chip selected. */ +			#define DATAFLASH_CHIP2                      (1 << 1) + +			/** Internal main memory page size for the board's dataflash ICs. */ +			#define DATAFLASH_PAGE_SIZE                  1024 + +			/** Total number of pages inside each of the board's dataflash ICs. */ +			#define DATAFLASH_PAGES                      8192 + +		/* Inline Functions: */ +			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC. +			 *  The appropriate SPI interface will be automatically configured. +			 */ +			static inline void Dataflash_Init(void) +			{ +				DATAFLASH_CHIPCS_DDR  |= DATAFLASH_CHIPCS_MASK; +				DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK; + +				SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | SPI_SAMPLE_TRAILING | SPI_MODE_MASTER); +			} + +			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) +			{ +				return SPI_TransferByte(Byte); +			} + +			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 */ +			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SendByte(const uint8_t Byte) +			{ +				SPI_SendByte(Byte); +			} + +			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash. +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_ReceiveByte(void) +			{ +				return SPI_ReceiveByte(); +			} + +			/** Determines the currently selected dataflash chip. +			 * +			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected +			 *          or a DATAFLASH_CHIPn mask (where n is the chip number). +			 */ +			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_GetSelectedChip(void) +			{ +				return (~DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK); +			} + +			/** Selects the given dataflash chip. +			 * +			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is +			 *              the chip number). +			 */ +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) +			{ +				DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT | DATAFLASH_CHIPCS_MASK) & ~ChipMask); +			} + +			/** Deselects the current dataflash chip, so that no dataflash is selected. */ +			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_DeselectChip(void) +			{ +				Dataflash_SelectChip(DATAFLASH_NO_CHIP); +			} + +			/** Selects a dataflash IC from the given page number, which should range from 0 to +			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one +			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside +			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs +			 *  are deselected. +			 * +			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from +			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). +			 */ +			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress) +			{ +				Dataflash_DeselectChip(); + +				if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS)) +				  return; + +				#if (DATAFLASH_TOTALCHIPS == 2) +					if (PageAddress & 0x01) +					  Dataflash_SelectChip(DATAFLASH_CHIP2); +					else +					  Dataflash_SelectChip(DATAFLASH_CHIP1); +				#else +					Dataflash_SelectChip(DATAFLASH_CHIP1); +				#endif +			} + +			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive +			 *  a new command. +			 */ +			static inline void Dataflash_ToggleSelectedChipCS(void) +			{ +				uint8_t SelectedChipMask = Dataflash_GetSelectedChip(); + +				Dataflash_DeselectChip(); +				Dataflash_SelectChip(SelectedChipMask); +			} + +			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main +			 *  memory page program or main memory to buffer transfer. +			 */ +			static inline void Dataflash_WaitWhileBusy(void) +			{ +				Dataflash_ToggleSelectedChipCS(); +				Dataflash_SendByte(DF_CMD_GETSTATUS); +				while (!(Dataflash_ReceiveByte() & DF_STATUS_READY)); +				Dataflash_ToggleSelectedChipCS(); +			} + +			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with +			 *  dataflash commands which require a complete 24-bit address. +			 * +			 *  \param[in] PageAddress  Page address within the selected dataflash IC +			 *  \param[in] BufferByte   Address within the dataflash's buffer +			 */ +			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, +			                                              const uint16_t BufferByte) +			{ +				#if (DATAFLASH_TOTALCHIPS == 2) +					PageAddress >>= 1; +				#endif + +				Dataflash_SendByte(PageAddress >> 5); +				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8)); +				Dataflash_SendByte(BufferByte); +			} + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Joystick.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Joystick.h new file mode 100644 index 0000000000..7410364445 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/Joystick.h @@ -0,0 +1,130 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific joystick driver header for the Atmel USBKEY. + *  \copydetails Group_Joystick_USBKEY + * + *  \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_USBKEY USBKEY + *  \brief Board specific joystick driver header for the Atmel USBKEY. + * + *  Board specific joystick driver header for the Atmel USBKEY. + * + *  <table> + *    <tr><th>Left Port Pin</th><th>Up Port Pin</th><th>Right Port Pin</th><th>Down Port Pin</th><th>Press Port Pin</th></tr> + *    <tr><td>PORTB.6</td><td>PORTB.7</td><td>PORTE.4</td><td>PORTE.5</td><td>PORTB.5</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __JOYSTICK_USBKEY_H__ +#define __JOYSTICK_USBKEY_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_BMASK                 ((1 << 5) | (1 << 6) | (1 << 7)) +			#define JOY_EMASK                 ((1 << 4) | (1 << 5)) + +			#define JOY_PORTE_MASK_SHIFT      1 +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Mask for the joystick being pushed in the left direction. */ +			#define JOY_LEFT                  (1 << 6) + +			/** Mask for the joystick being pushed in the right direction. */ +			#define JOY_RIGHT                ((1 << 4) >> JOY_PORTE_MASK_SHIFT) + +			/** Mask for the joystick being pushed in the upward direction. */ +			#define JOY_UP                    (1 << 7) + +			/** Mask for the joystick being pushed in the downward direction. */ +			#define JOY_DOWN                 ((1 << 5) >> JOY_PORTE_MASK_SHIFT) + +			/** Mask for the joystick being pushed inward. */ +			#define JOY_PRESS                 (1 << 5) + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void Joystick_Init(void) +			{ +				DDRB  &= ~JOY_BMASK; +				DDRE  &= ~JOY_EMASK; + +				PORTB |=  JOY_BMASK; +				PORTE |=  JOY_EMASK; +			} + +			static inline void Joystick_Disable(void) +			{ +				DDRB  &= ~JOY_BMASK; +				DDRE  &= ~JOY_EMASK; + +				PORTB &= ~JOY_BMASK; +				PORTE &= ~JOY_EMASK; +			} + +			static inline uint8_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Joystick_GetStatus(void) +			{ +				return (((uint8_t)~PINB & JOY_BMASK) | (((uint8_t)~PINE & JOY_EMASK) >> JOY_PORTE_MASK_SHIFT)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/LEDs.h new file mode 100644 index 0000000000..18ff756c8a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBKEY/LEDs.h @@ -0,0 +1,147 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Atmel USBKEY. + *  \copydetails Group_LEDs_USBKEY + * + *  \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_USBKEY USBKEY + *  \brief Board specific LED driver header for the Atmel USBKEY. + * + *  Board specific LED driver header for the Atmel USBKEY. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Red</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTD.4</td></tr> + *    <tr><td>LEDS_LED2</td><td>Green</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTD.5</td></tr> + *    <tr><td>LEDS_LED3</td><td>Red</td><td>Bicolor Indicator 2</td><td>High</td><td>PORTD.6</td></tr> + *    <tr><td>LEDS_LED4</td><td>Green</td><td>Bicolor Indicator 2</td><td>High</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_USBKEY_H__ +#define __LEDS_USBKEY_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 the second LED on the board. */ +			#define LEDS_LED2        (1 << 5) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        (1 << 7) + +			/** LED mask for the fourth LED on the board. */ +			#define LEDS_LED4        (1 << 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 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_Disable(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) +			{ +				PIND  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/Board.h new file mode 100644 index 0000000000..5501bf6be7 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for Tom's USBTINY MKII. + *  \copydetails Group_BoardInfo_USBTINYMKII + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_USBTINYMKII USBTINYMKII + *  \brief Board specific information header for Tom's USBTINY MKII. + * + *  Board specific information header for Tom's USBTINY MKII (http://tom-itx.dyndns.org:81/~webpage/). + * + *  @{ + */ + +#ifndef __BOARD_USBTINYMKII_H__ +#define __BOARD_USBTINYMKII_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/Buttons.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/Buttons.h new file mode 100644 index 0000000000..e87f611d5c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/Buttons.h @@ -0,0 +1,103 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for Tom's USBTINY MKII. + *  \copydetails Group_Buttons_USBTINYMKII + * + *  \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_USBTINYMKII USBTINYMKII + *  \brief Board specific Buttons driver header for Tom's USBTINY MKII. + * + *  Board specific Buttons driver header for Tom's USBTINY MKII (http://tom-itx.dyndns.org:81/~webpage/). + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>HWB Button</td><td>Low</td><td>PORTD.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_USBTINYMKII_H__ +#define __BUTTONS_USBTINYMKII_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 void Buttons_Disable(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/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/LEDs.h new file mode 100644 index 0000000000..288f5505fa --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/USBTINYMKII/LEDs.h @@ -0,0 +1,143 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for Tom's USBTINY MKII. + *  \copydetails Group_LEDs_USBTINYMKII + * + *  \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_USBTINYMKII USBTINYMKII + *  \brief Board specific LED driver header for Tom's USBTINY MKII. + * + *  Board specific LED driver header for Tom's USBTINY MKII (http://tom-itx.dyndns.org:81/~webpage/). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Red</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTB.6</td></tr> + *    <tr><td>LEDS_LED2</td><td>Green</td><td>Bicolor Indicator 1</td><td>High</td><td>PORTB.7</td></tr> + *    <tr><td>LEDS_LED3</td><td>Red</td><td>Target Power</td><td>High</td><td>PORTB.5</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_USBTINYMKII_H__ +#define __LEDS_USBTINYMKII_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 the third LED on the board. */ +			#define LEDS_LED3        (1 << 5) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3) + +			/** 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_Disable(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) +			{ +				PINB  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/Board.h new file mode 100644 index 0000000000..713e065697 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/Board.h @@ -0,0 +1,89 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the original Atmel XPLAIN. + *  \copydetails Group_BoardInfo_XPLAIN + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_XPLAIN_REV1 XPLAIN_REV1 + *  \brief Board specific information header for the original Atmel XPLAIN, revision 1. + * + *  See \ref Group_BoardInfo_XPLAIN for more details. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_XPLAIN XPLAIN + *  \brief Board specific information header for the original Atmel XPLAIN. + * + *  Board specific information header for the original Atmel XPLAIN. + * + *  @{ + */ + +#ifndef __BOARD_XPLAIN_H__ +#define __BOARD_XPLAIN_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Dataflash.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has a hardware Dataflash mounted. */ +			#define BOARD_HAS_DATAFLASH + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/Dataflash.h new file mode 100644 index 0000000000..ed6a48c6a9 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/Dataflash.h @@ -0,0 +1,245 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Dataflash driver header for the original Atmel XPLAIN. + *  \copydetails Group_Dataflash_XPLAIN + * + *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver + *        dispatch header located in LUFA/Drivers/Board/Dataflash.h. + */ + +/** \ingroup Group_Dataflash + *  \defgroup Group_Dataflash_XPLAIN_REV1 XPLAIN_REV1 + *  \brief Board specific Dataflash driver header for the original Atmel XPLAIN, revision 1. + * + *  See \ref Group_Dataflash_XPLAIN for more details. + */ + +/** \ingroup Group_Dataflash + *  \defgroup Group_Dataflash_XPLAIN XPLAIN + *  \brief Board specific Dataflash driver header for the original Atmel XPLAIN. + * + *  \note For the first revision XPLAIN board, compile with <code>BOARD = BOARD_XPLAIN_REV1</code>. + * + *  Board specific Dataflash driver header for the Atmel XPLAIN. + * + *  <b>Revision 1 Boards</b>: + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr> + *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB041D (512KB)</td><td>PORTB.5</td><td>SPI0</td></tr> + *  </table> + * + *  <b>Other Board Revisions</b>: + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr> + *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB642D (8MB)</td><td>PORTB.5</td><td>SPI0</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __DATAFLASH_XPLAIN_H__ +#define __DATAFLASH_XPLAIN_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" + +		#include "../../../Misc/AT45DB642D.h" +		#include "../../../Peripheral/SPI.h" + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_DATAFLASH_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead. +		#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#define DATAFLASH_CHIPCS_MASK                DATAFLASH_CHIP1 +			#define DATAFLASH_CHIPCS_DDR                 DDRB +			#define DATAFLASH_CHIPCS_PORT                PORTB +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */ +			#define DATAFLASH_TOTALCHIPS                 1 + +			/** Mask for no dataflash chip selected. */ +			#define DATAFLASH_NO_CHIP                    0 + +			/** Mask for the first dataflash chip selected. */ +			#define DATAFLASH_CHIP1                      (1 << 5) + +			#if ((BOARD != BOARD_XPLAIN_REV1) || defined(__DOXYGEN__)) +				/** Internal main memory page size for the board's dataflash ICs. */ +				#define DATAFLASH_PAGE_SIZE              1024 + +				/** Total number of pages inside each of the board's dataflash ICs. */ +				#define DATAFLASH_PAGES                  8192 +			#else +				#define DATAFLASH_PAGE_SIZE              256 + +				#define DATAFLASH_PAGES                  2048 +			#endif + +		/* Inline Functions: */ +			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC. +			 *  The appropriate SPI interface will be automatically configured. +			 */ +			static inline void Dataflash_Init(void) +			{ +				DATAFLASH_CHIPCS_DDR  |= DATAFLASH_CHIPCS_MASK; +				DATAFLASH_CHIPCS_PORT |= DATAFLASH_CHIPCS_MASK; + +				SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | SPI_SAMPLE_TRAILING | SPI_MODE_MASTER); +			} + +			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) +			{ +				return SPI_TransferByte(Byte); +			} + +			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 */ +			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SendByte(const uint8_t Byte) +			{ +				SPI_SendByte(Byte); +			} + +			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash. +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_ReceiveByte(void) +			{ +				return SPI_ReceiveByte(); +			} + +			/** Determines the currently selected dataflash chip. +			 * +			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected +			 *          or a DATAFLASH_CHIPn mask (where n is the chip number). +			 */ +			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_GetSelectedChip(void) +			{ +				return (~DATAFLASH_CHIPCS_PORT & DATAFLASH_CHIPCS_MASK); +			} + +			/** Selects the given dataflash chip. +			 * +			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is +			 *              the chip number). +			 */ +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) +			{ +				DATAFLASH_CHIPCS_PORT = ((DATAFLASH_CHIPCS_PORT | DATAFLASH_CHIPCS_MASK) & ~ChipMask); +			} + +			/** Deselects the current dataflash chip, so that no dataflash is selected. */ +			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_DeselectChip(void) +			{ +				Dataflash_SelectChip(DATAFLASH_NO_CHIP); +			} + +			/** Selects a dataflash IC from the given page number, which should range from 0 to +			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one +			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside +			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs +			 *  are deselected. +			 * +			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from +			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). +			 */ +			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress) +			{ +				Dataflash_DeselectChip(); + +				if (PageAddress >= DATAFLASH_PAGES) +				  return; + +				Dataflash_SelectChip(DATAFLASH_CHIP1); +			} + +			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive +			 *  a new command. +			 */ +			static inline void Dataflash_ToggleSelectedChipCS(void) +			{ +				uint8_t SelectedChipMask = Dataflash_GetSelectedChip(); + +				Dataflash_DeselectChip(); +				Dataflash_SelectChip(SelectedChipMask); +			} + +			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main +			 *  memory page program or main memory to buffer transfer. +			 */ +			static inline void Dataflash_WaitWhileBusy(void) +			{ +				Dataflash_ToggleSelectedChipCS(); +				Dataflash_SendByte(DF_CMD_GETSTATUS); +				while (!(Dataflash_ReceiveByte() & DF_STATUS_READY)); +				Dataflash_ToggleSelectedChipCS(); +			} + +			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with +			 *  dataflash commands which require a complete 24-bit address. +			 * +			 *  \param[in] PageAddress  Page address within the selected dataflash IC +			 *  \param[in] BufferByte   Address within the dataflash's buffer +			 */ +			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, +			                                              const uint16_t BufferByte) +			{ +				Dataflash_SendByte(PageAddress >> 5); +				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8)); +				Dataflash_SendByte(BufferByte); +			} + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/LEDs.h new file mode 100644 index 0000000000..9da3fade53 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAIN/LEDs.h @@ -0,0 +1,142 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the original Atmel XPLAIN. + *  \copydetails Group_LEDs_XPLAIN + * + *  \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_XPLAIN_REV1 XPLAIN_REV1 + *  \brief Board specific LED driver header for the original Atmel XPLAIN, revision 1. + * + *  See \ref Group_LEDs_XPLAIN for more details. + */ + +/** \ingroup Group_LEDs + *  \defgroup Group_LEDs_XPLAIN XPLAIN + *  \brief Board specific LED driver header for the original Atmel XPLAIN. + * + *  Board specific LED driver header for the Atmel XPLAIN. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTB.6</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_XPLAIN_H__ +#define __LEDS_XPLAIN_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 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_Disable(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) +			{ +				PINB  = 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/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/Board.h new file mode 100644 index 0000000000..2253e33ea3 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/Board.h @@ -0,0 +1,78 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Atmel Xplained-MINI series kits. + *  \copydetails Group_BoardInfo_XPLAINED_MINI + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_XPLAINED_MINI XPLAINED_MINI + *  \brief Board specific information header for the Atmel Xplained-MINI series kits. + * + *  Board specific information header for the Atmel Xplained-MINI series kits. + * + *  @{ + */ + +#ifndef __BOARD_XPLAINED_MINI_H__ +#define __BOARD_XPLAINED_MINI_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/LEDs.h new file mode 100644 index 0000000000..5c8f1967b0 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/XPLAINED_MINI/LEDs.h @@ -0,0 +1,135 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Atmel Xplained-MINI series kits.. + *  \copydetails Group_LEDs_XPLAINED_MINI + * + *  \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_XPLAINED_MINI XPLAINED_MINI + *  \brief Board specific LED driver header for the Atmel Xplained-MINI series kits. + * + *  Board specific LED driver header for the Atmel Xplained-MINI series kits. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>General Indicator</td><td>Low</td><td>PORTC.6</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_XPLAINED_MINI_H__ +#define __LEDS_XPLAINED_MINI_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 none of the board LEDs. */ +			#define LEDS_NO_LEDS     0 + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void LEDs_Init(void) +			{ +				DDRC  |= LEDS_ALL_LEDS; +				PORTC |= LEDS_ALL_LEDS; +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRC  &= ~LEDS_ALL_LEDS; +				PORTC &= ~LEDS_ALL_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTC &= ~LEDMask; +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTC |= LEDMask; +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTC = ((PORTC | LEDS_ALL_LEDS) & ~LEDMask); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTC = ((PORTC | LEDMask) & ~ActiveMask); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PINC  = LEDMask; +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return (~PORTC & LEDS_ALL_LEDS); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/YUN/Board.h b/lib/lufa/LUFA/Drivers/Board/AVR8/YUN/Board.h new file mode 100644 index 0000000000..035f66a52b --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/YUN/Board.h @@ -0,0 +1,78 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Arduino Yun board. + *  \copydetails Group_BoardInfo_YUN + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_YUN YUN + *  \brief Board specific information header for the Arduino Yun board. + * + *  Board specific information header for the Arduino Yun board (http://arduino.cc/en/Main/arduinoBoardYun). + * + *  @{ + */ + +#ifndef __BOARD_YUN_H__ +#define __BOARD_YUN_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/AVR8/YUN/LEDs.h b/lib/lufa/LUFA/Drivers/Board/AVR8/YUN/LEDs.h new file mode 100644 index 0000000000..d06acd7e32 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/AVR8/YUN/LEDs.h @@ -0,0 +1,169 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Arduino Yun board. + *  \copydetails Group_LEDs_YUN + * + *  \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_YUN YUN + *  \brief Board specific LED driver header for the Arduino Yun board. + * + *  Board specific LED driver header for the Arduino Yun board (http://arduino.cc/en/Main/arduinoBoardYun). + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>RX</td><td>Low</td><td>PORTB.0</td></tr> + *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>TX</td><td>Low</td><td>PORTD.5</td></tr> + *    <tr><td>LEDS_LED3</td><td>Red</td><td>General Indicator</td><td>High</td><td>PORTC.7</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_YUN_H__ +#define __LEDS_YUN_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_PORTB_LEDS       (LEDS_LED1) +			#define LEDS_PORTD_LEDS       (LEDS_LED2) +			#define LEDS_PORTC_LEDS       (LEDS_LED3) +	#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 the second LED on the board. */ +			#define LEDS_LED2        (1 << 5) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        (1 << 7) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3) + +			/** 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_PORTB_LEDS; +				PORTB |=  LEDS_PORTB_LEDS; +				DDRD  |=  LEDS_PORTD_LEDS; +				PORTD |=  LEDS_PORTD_LEDS; +				DDRC  |=  LEDS_PORTC_LEDS; +				PORTC &= ~LEDS_PORTC_LEDS; +			} + +			static inline void LEDs_Disable(void) +			{ +				DDRB  &= ~LEDS_PORTB_LEDS; +				PORTB &= ~LEDS_PORTB_LEDS; +				DDRD  &= ~LEDS_PORTD_LEDS; +				PORTD &= ~LEDS_PORTD_LEDS; +				DDRC  &= ~LEDS_PORTC_LEDS; +				PORTC &= ~LEDS_PORTC_LEDS; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTB &= ~(LEDMask & LEDS_PORTB_LEDS); +				PORTD &= ~(LEDMask & LEDS_PORTD_LEDS); +				PORTC |=  (LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTB |=  (LEDMask & LEDS_PORTB_LEDS); +				PORTD |=  (LEDMask & LEDS_PORTD_LEDS); +				PORTC &= ~(LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTB = ((PORTB |  LEDS_PORTB_LEDS) & ~(LEDMask & LEDS_PORTB_LEDS)); +				PORTD = ((PORTD |  LEDS_PORTD_LEDS) & ~(LEDMask & LEDS_PORTD_LEDS)); +				PORTC = ((PORTC & ~LEDS_PORTC_LEDS) |  (LEDMask & LEDS_PORTC_LEDS)); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTB = ((PORTB |  (LEDMask & LEDS_PORTB_LEDS)) & ~(ActiveMask & LEDS_PORTB_LEDS)); +				PORTD = ((PORTD |  (LEDMask & LEDS_PORTD_LEDS)) & ~(ActiveMask & LEDS_PORTD_LEDS)); +				PORTC = ((PORTC & ~(LEDMask & LEDS_PORTC_LEDS)) |  (ActiveMask & LEDS_PORTC_LEDS)); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PINB  = (LEDMask & LEDS_PORTB_LEDS); +				PIND  = (LEDMask & LEDS_PORTD_LEDS); +				PINC  = (LEDMask & LEDS_PORTC_LEDS); +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return ((~PORTB & LEDS_PORTB_LEDS) | (~PORTD & LEDS_PORTD_LEDS) | (PORTC & LEDS_PORTC_LEDS)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/Board.h b/lib/lufa/LUFA/Drivers/Board/Board.h new file mode 100644 index 0000000000..3b28e6cca3 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/Board.h @@ -0,0 +1,173 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board hardware information driver. + * + *  This file is the master dispatch header file for the board-specific information driver, to give information + *  on the hardware contained on a specific board. + * + *  User code should include this file, which will in turn include the correct board driver header file for the + *  currently selected board. + * + *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/Board.h file in the user project + *  directory. + * + *  For possible \c BOARD makefile values, see \ref Group_BoardTypes. + */ + +/** \ingroup Group_BoardDrivers + *  \defgroup Group_BoardInfo Board Information Driver - LUFA/Drivers/Board/Board.h + *  \brief Board hardware information driver. + * + *  \section Sec_BoardInfo_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - None + * + *  @{ + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +	/* Macros: */ +		#define __INCLUDE_FROM_BOARD_H + +	/* Includes: */ +		#include "../../Common/Common.h" + +		#if (BOARD == BOARD_USBKEY) +			#include "AVR8/USBKEY/Board.h" +		#elif (BOARD == BOARD_STK525) +			#include "AVR8/STK525/Board.h" +		#elif (BOARD == BOARD_STK526) +			#include "AVR8/STK526/Board.h" +		#elif (BOARD == BOARD_RZUSBSTICK) +			#include "AVR8/RZUSBSTICK/Board.h" +		#elif (BOARD == BOARD_ATAVRUSBRF01) +			#include "AVR8/ATAVRUSBRF01/Board.h" +		#elif ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1)) +			#include "AVR8/XPLAIN/Board.h" +		#elif (BOARD == BOARD_BUMBLEB) +			#include "AVR8/BUMBLEB/Board.h" +		#elif (BOARD == BOARD_EVK527) +			#include "AVR8/EVK527/Board.h" +		#elif ((BOARD == BOARD_TEENSY) || (BOARD == BOARD_TEENSY2)) +			#include "AVR8/TEENSY/Board.h" +		#elif ((BOARD == BOARD_QMK)) +			#include "AVR8/QMK/Board.h" +		#elif (BOARD == BOARD_USBTINYMKII) +			#include "AVR8/USBTINYMKII/Board.h" +		#elif (BOARD == BOARD_BENITO) +			#include "AVR8/BENITO/Board.h" +		#elif (BOARD == BOARD_JMDBU2) +			#include "AVR8/JMDBU2/Board.h" +		#elif (BOARD == BOARD_OLIMEX162) +			#include "AVR8/OLIMEX162/Board.h" +		#elif (BOARD == BOARD_USBFOO) +			#include "AVR8/USBFOO/Board.h" +		#elif (BOARD == BOARD_UDIP) +			#include "AVR8/UDIP/Board.h" +		#elif (BOARD == BOARD_BUI) +			#include "AVR8/BUI/Board.h" +		#elif (BOARD == BOARD_UNO) +			#include "AVR8/UNO/Board.h" +		#elif (BOARD == BOARD_CULV3) +			#include "AVR8/CULV3/Board.h" +		#elif (BOARD == BOARD_BLACKCAT) +			#include "AVR8/BLACKCAT/Board.h" +		#elif (BOARD == BOARD_MAXIMUS) +			#include "AVR8/MAXIMUS/Board.h" +		#elif (BOARD == BOARD_MINIMUS) +			#include "AVR8/MINIMUS/Board.h" +		#elif (BOARD == BOARD_ADAFRUITU4) +			#include "AVR8/ADAFRUITU4/Board.h" +		#elif (BOARD == BOARD_MICROSIN162) +			#include "AVR8/MICROSIN162/Board.h" +		#elif (BOARD == BOARD_SPARKFUN8U2) +			#include "AVR8/SPARKFUN8U2/Board.h" +		#elif (BOARD == BOARD_EVK1101) +			#include "UC3/EVK1101/Board.h" +		#elif (BOARD == BOARD_TUL) +			#include "AVR8/TUL/Board.h" +		#elif (BOARD == BOARD_EVK1100) +			#include "UC3/EVK1100/Board.h" +		#elif (BOARD == BOARD_EVK1104) +			#include "UC3/EVK1104/Board.h" +		#elif (BOARD == BOARD_A3BU_XPLAINED) +			#include "XMEGA/A3BU_XPLAINED/Board.h" +		#elif ((BOARD == BOARD_USB2AX) || (BOARD == BOARD_USB2AX_V3) || (BOARD == BOARD_USB2AX_V31)) +			#include "AVR8/USB2AX/Board.h" +		#elif ((BOARD == BOARD_MICROPENDOUS_REV1) || (BOARD == BOARD_MICROPENDOUS_REV2) || \ +		       (BOARD == BOARD_MICROPENDOUS_32U2) || (BOARD == BOARD_MICROPENDOUS_A) || \ +		       (BOARD == BOARD_MICROPENDOUS_1)    || (BOARD == BOARD_MICROPENDOUS_2) || \ +		       (BOARD == BOARD_MICROPENDOUS_3)    || (BOARD == BOARD_MICROPENDOUS_4) || \ +		       (BOARD == BOARD_MICROPENDOUS_DIP)) +			#include "AVR8/MICROPENDOUS/Board.h" +		#elif (BOARD == BOARD_B1_XPLAINED) +			#include "XMEGA/B1_XPLAINED/Board.h" +		#elif (BOARD == BOARD_MULTIO) +			#include "AVR8/MULTIO/Board.h" +		#elif (BOARD == BOARD_BIGMULTIO) +			#include "AVR8/BIGMULTIO/Board.h" +		#elif (BOARD == BOARD_DUCE) +			#include "AVR8/DUCE/Board.h" +		#elif (BOARD == BOARD_OLIMEX32U4) +			#include "AVR8/OLIMEX32U4/Board.h" +		#elif (BOARD == BOARD_OLIMEXT32U4) +			#include "AVR8/OLIMEXT32U4/Board.h" +		#elif (BOARD == BOARD_OLIMEXISPMK2) +			#include "AVR8/OLIMEXISPMK2/Board.h" +		#elif (BOARD == BOARD_LEONARDO) +			#include "AVR8/LEONARDO/Board.h" +		#elif (BOARD == BOARD_UC3A3_XPLAINED) +			#include "UC3/UC3A3_XPLAINED/Board.h" +		#elif (BOARD == BOARD_STANGE_ISP) +			#include "AVR8/STANGE_ISP/Board.h" +		#elif (BOARD == BOARD_C3_XPLAINED) +			#include "XMEGA/C3_XPLAINED/Board.h" +		#elif (BOARD == BOARD_U2S) +			#include "AVR8/U2S/Board.h" +		#elif (BOARD == BOARD_YUN) +			#include "AVR8/YUN/Board.h" +		#elif (BOARD == BOARD_MICRO) +			#include "AVR8/MICRO/Board.h" +		#elif (BOARD == BOARD_POLOLUMICRO) +			#include "AVR8/POLOLUMICRO/Board.h" +		#elif (BOARD == BOARD_XPLAINED_MINI) +			#include "AVR8/XPLAINED_MINI/Board.h" +		#else +			#include "Board/Board.h" +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/Buttons.h b/lib/lufa/LUFA/Drivers/Board/Buttons.h new file mode 100644 index 0000000000..00ebe8c15d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/Buttons.h @@ -0,0 +1,189 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Digital button board hardware driver. + * + *  This file is the master dispatch header file for the board-specific Buttons driver, for boards containing + *  physical pushbuttons connected to the microcontroller's GPIO pins. + * + *  User code should include this file, which will in turn include the correct Button driver header file for the + *  currently selected board. + * + *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/Buttons.h file in the user project + *  directory. + * + *  For possible \c BOARD makefile values, see \ref Group_BoardTypes. + */ + +/** \ingroup Group_BoardDrivers + *  \defgroup Group_Buttons Buttons Driver - LUFA/Drivers/Board/Buttons.h + *  \brief Digital button board hardware driver. + * + *  \section Sec_Buttons_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - None + * + *  \section Sec_Buttons_ModDescription Module Description + *  Hardware buttons driver. This provides an easy to use driver for the hardware buttons present on many boards. + *  It provides a way to easily configure and check the status of all the buttons on the board so that appropriate + *  actions can be taken. + * + *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/Buttons.h file in the user project + *  directory. Otherwise, it will include the appropriate built-in board driver header file. + * + *  For possible \c BOARD makefile values, see \ref Group_BoardTypes. + * + *  \section Sec_Buttons_ExampleUsage Example Usage + *  The following snippet is an example of how this module may be used within a typical + *  application. + * + *  \code + *      // Initialize the button driver before first use + *      Buttons_Init(); + * + *      printf("Waiting for button press...\r\n"); + * + *      // Loop until a board button has been pressed + *      uint8_t ButtonPress; + *      while (!(ButtonPress = Buttons_GetStatus())) {}; + * + *      // Display which button was pressed (assuming two board buttons) + *      printf("Button pressed: %s\r\n", (ButtonPress == BUTTONS_BUTTON1) ? "Button 1" : "Button 2"); + *  \endcode + * + *  @{ + */ + +#ifndef __BUTTONS_H__ +#define __BUTTONS_H__ + +	/* Macros: */ +		#define __INCLUDE_FROM_BUTTONS_H + +	/* Includes: */ +		#include "../../Common/Common.h" + +		#if (BOARD == BOARD_NONE) +			#define BUTTONS_BUTTON1  0 +			static inline void       Buttons_Init(void) {} +			static inline void       Buttons_Disable(void) {} +			static inline uint_reg_t Buttons_GetStatus(void) { return 0; } +		#elif (BOARD == BOARD_USBKEY) +			#include "AVR8/USBKEY/Buttons.h" +		#elif (BOARD == BOARD_STK525) +			#include "AVR8/STK525/Buttons.h" +		#elif (BOARD == BOARD_STK526) +			#include "AVR8/STK526/Buttons.h" +		#elif (BOARD == BOARD_ATAVRUSBRF01) +			#include "AVR8/ATAVRUSBRF01/Buttons.h" +		#elif (BOARD == BOARD_BUMBLEB) +			#include "AVR8/BUMBLEB/Buttons.h" +		#elif (BOARD == BOARD_EVK527) +			#include "AVR8/EVK527/Buttons.h" +		#elif (BOARD == BOARD_USBTINYMKII) +			#include "AVR8/USBTINYMKII/Buttons.h" +		#elif (BOARD == BOARD_BENITO) +			#include "AVR8/BENITO/Buttons.h" +		#elif (BOARD == BOARD_JMDBU2) +			#include "AVR8/JMDBU2/Buttons.h" +		#elif (BOARD == BOARD_OLIMEX162) +			#include "AVR8/OLIMEX162/Buttons.h" +		#elif (BOARD == BOARD_USBFOO) +			#include "AVR8/USBFOO/Buttons.h" +		#elif (BOARD == BOARD_UDIP) +			#include "AVR8/UDIP/Buttons.h" +		#elif (BOARD == BOARD_CULV3) +			#include "AVR8/CULV3/Buttons.h" +		#elif (BOARD == BOARD_MINIMUS) +			#include "AVR8/MINIMUS/Buttons.h" +		#elif (BOARD == BOARD_MICROSIN162) +			#include "AVR8/MICROSIN162/Buttons.h" +		#elif (BOARD == BOARD_EVK1101) +			#include "UC3/EVK1101/Buttons.h" +		#elif (BOARD == BOARD_TUL) +			#include "AVR8/TUL/Buttons.h" +		#elif (BOARD == BOARD_EVK1100) +			#include "UC3/EVK1100/Buttons.h" +		#elif (BOARD == BOARD_EVK1104) +			#include "UC3/EVK1104/Buttons.h" +		#elif (BOARD == BOARD_A3BU_XPLAINED) +			#include "XMEGA/A3BU_XPLAINED/Buttons.h" +		#elif ((BOARD == BOARD_USB2AX) || (BOARD == BOARD_USB2AX_V3)) +			#include "AVR8/USB2AX/Buttons.h" +		#elif ((BOARD == BOARD_MICROPENDOUS_32U2) || (BOARD == BOARD_MICROPENDOUS_A) || \ +		       (BOARD == BOARD_MICROPENDOUS_1)    || (BOARD == BOARD_MICROPENDOUS_2) || \ +		       (BOARD == BOARD_MICROPENDOUS_3)    || (BOARD == BOARD_MICROPENDOUS_4) || \ +		       (BOARD == BOARD_MICROPENDOUS_REV1) || (BOARD == BOARD_MICROPENDOUS_REV2) || \ +		       (BOARD == BOARD_MICROPENDOUS_DIP)) +			#include "AVR8/MICROPENDOUS/Buttons.h" +		#elif (BOARD == BOARD_B1_XPLAINED) +			#include "XMEGA/B1_XPLAINED/Buttons.h" +		#elif (BOARD == BOARD_OLIMEX32U4) +			#include "AVR8/OLIMEX32U4/Buttons.h" +		#elif (BOARD == BOARD_OLIMEXT32U4) +			#include "AVR8/OLIMEXT32U4/Buttons.h" +		#elif (BOARD == BOARD_OLIMEXISPMK2) +			#include "AVR8/OLIMEXISPMK2/Buttons.h" +		#elif (BOARD == BOARD_UC3A3_XPLAINED) +			#include "UC3/UC3A3_XPLAINED/Buttons.h" +		#elif (BOARD == BOARD_STANGE_ISP) +			#include "AVR8/STANGE_ISP/Buttons.h" +		#elif (BOARD == BOARD_C3_XPLAINED) +			#include "XMEGA/C3_XPLAINED/Buttons.h" +		#elif (BOARD == BOARD_U2S) +			#include "AVR8/U2S/Buttons.h" +		#else +			#include "Board/Buttons.h" +		#endif + +	/* Pseudo-Functions for Doxygen: */ +	#if defined(__DOXYGEN__) +		/** Initializes the buttons driver, so that the current button position can be read. This sets the appropriate +		 *  I/O pins to an inputs with pull-ups enabled. +		 * +		 *  This must be called before any Button driver functions are used. +		 */ +		static inline void Buttons_Init(void); + +		/** Disables the buttons driver, releasing the I/O pins back to their default high-impedance input mode. */ +		static inline void Buttons_Disable(void); + +		/** Returns a mask indicating which board buttons are currently pressed. +		 * +		 *  \return Mask of \c BUTTONS_BUTTON* constants indicating which board buttons are currently pressed. +		 */ +		static inline uint_reg_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT; +	#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/Dataflash.h new file mode 100644 index 0000000000..b634dccaa6 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/Dataflash.h @@ -0,0 +1,264 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Master include file for the board dataflash IC driver. + *  \brief Atmel Dataflash storage IC board hardware driver. + * + *  This file is the master dispatch header file for the board-specific Atmel dataflash driver, for boards containing + *  Atmel Dataflash ICs for external non-volatile storage. + * + *  User code should include this file, which will in turn include the correct dataflash driver header file for + *  the currently selected board. + * + *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/Dataflash.h file in the user project + *  directory. + * + *  For possible \c BOARD makefile values, see \ref Group_BoardTypes. + */ + +/** \ingroup Group_BoardDrivers + *  \defgroup Group_Dataflash Dataflash Driver - LUFA/Drivers/Board/Dataflash.h + *  \brief Atmel Dataflash storage IC board hardware driver. + * + *  \section Sec_Dataflash_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - None + * + *  \section Sec_Dataflash_ModDescription Module Description + *  Dataflash driver. This module provides an easy to use interface for the Dataflash ICs located on many boards, + *  for the storage of large amounts of data into the Dataflash's non-volatile memory. + * + *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/Dataflash.h file in the user project + *  directory. Otherwise, it will include the appropriate built-in board driver header file. + * + *  For possible \c BOARD makefile values, see \ref Group_BoardTypes. + * + *  \section Sec_Dataflash_ExampleUsage Example Usage + *  The following snippet is an example of how this module may be used within a typical + *  application. + * + *  \code + *      // Initialize the board Dataflash driver before first use + *      Dataflash_Init(); + * + *      uint8_t WriteBuffer[DATAFLASH_PAGE_SIZE]; + *      uint8_t ReadBuffer[DATAFLASH_PAGE_SIZE]; + * + *      // Fill page write buffer with a repeating pattern + *      for (uint16_t i = 0; i < DATAFLASH_PAGE_SIZE; i++) + *        WriteBuffer[i] = (i & 0xFF); + * + *      // Must select the chip of interest first before operating on it + *      Dataflash_SelectChip(DATAFLASH_CHIP1); + * + *      // Write to the Dataflash's first internal memory buffer + *      printf("Writing data to first dataflash buffer:\r\n"); + *      Dataflash_SendByte(DF_CMD_BUFF1WRITE); + *      Dataflash_SendAddressBytes(0, 0); + * + *      for (uint16_t i = 0; i < DATAFLASH_PAGE_SIZE; i++) + *        Dataflash_SendByte(WriteBuffer[i]); + * + *      // Commit the Dataflash's first memory buffer to the non-volatile FLASH memory + *      printf("Committing page to non-volatile memory page index 5:\r\n"); + *      Dataflash_SendByte(DF_CMD_BUFF1TOMAINMEMWITHERASE); + *      Dataflash_SendAddressBytes(5, 0); + *      Dataflash_WaitWhileBusy(); + * + *      // Read the page from non-volatile FLASH memory into the Dataflash's second memory buffer + *      printf("Reading data into second dataflash buffer:\r\n"); + *      Dataflash_SendByte(DF_CMD_MAINMEMTOBUFF2); + *      Dataflash_SendAddressBytes(5, 0); + *      Dataflash_WaitWhileBusy(); + * + *      // Read the Dataflash's second internal memory buffer + *      Dataflash_SendByte(DF_CMD_BUFF2READ); + *      Dataflash_SendAddressBytes(0, 0); + * + *      for (uint16_t i = 0; i < DATAFLASH_PAGE_SIZE; i++) + *        ReadBuffer[i] = Dataflash_ReceiveByte(); + * + *      // Deselect the chip after use + *      Dataflash_DeselectChip(); + *  \endcode + * + *  @{ + */ + +#ifndef __DATAFLASH_H__ +#define __DATAFLASH_H__ + +	/* Macros: */ +		#define __INCLUDE_FROM_DATAFLASH_H + +	/* Includes: */ +		#include "../../Common/Common.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Retrieves the Dataflash chip select mask for the given Dataflash chip index. +			 * +			 *  \attention This macro will only work correctly on chip index numbers that are compile-time +			 *             constants defined by the preprocessor. +			 * +			 *  \param[in] index  Index of the dataflash chip mask to retrieve. +			 * +			 *  \return Mask for the given Dataflash chip's /CS pin +			 */ +			#define DATAFLASH_CHIP_MASK(index)      CONCAT_EXPANDED(DATAFLASH_CHIP, index) + +		/* Inline Functions: */ +			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC. +			 * +			 *  \note The microcontroller's physical interface driver connected to the Dataflash IC must be initialized before +			 *        any of the dataflash commands are used. This is usually a SPI hardware port, but on some devices/boards may +			 *        be a USART operating in SPI Master mode. +			 */ +			static inline void Dataflash_Init(void); + +			/** Determines the currently selected dataflash chip. +			 * +			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected +			 *  or a \c DATAFLASH_CHIPn mask (where n is the chip number). +			 */ +			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; + +			/** Selects the given dataflash chip. +			 * +			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is +			 *              the chip number). +			 */ +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE; + +			/** Deselects the current dataflash chip, so that no dataflash is selected. */ +			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE; + +			/** Selects a dataflash IC from the given page number, which should range from 0 to +			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one +			 *  dataflash IC, this will select \ref DATAFLASH_CHIP1. If the given page number is outside +			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs +			 *  are deselected. +			 * +			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from +			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). +			 */ +			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress); + +			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive +			 *  a new command. +			 */ +			static inline void Dataflash_ToggleSelectedChipCS(void); + +			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main +			 *  memory page program or main memory to buffer transfer. +			 */ +			static inline void Dataflash_WaitWhileBusy(void); + +			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with +			 *  dataflash commands which require a complete 24-bit address. +			 * +			 *  \param[in] PageAddress  Page address within the selected dataflash IC +			 *  \param[in] BufferByte   Address within the dataflash's buffer +			 */ +			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, +			                                              const uint16_t BufferByte); + +			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; + +			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 */ +			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; + +			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash. +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; + +		/* Includes: */ +			#if (BOARD == BOARD_NONE) +				#define DATAFLASH_TOTALCHIPS  0 +				#define DATAFLASH_NO_CHIP     0 +				#define DATAFLASH_CHIP1       0 +				#define DATAFLASH_PAGE_SIZE   0 +				#define DATAFLASH_PAGES       0 +				static inline void    Dataflash_Init(void) {}; +				static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) { return 0; }; +				static inline void    Dataflash_SendByte(const uint8_t Byte) {}; +				static inline uint8_t Dataflash_ReceiveByte(void) { return 0; }; +				static inline uint8_t Dataflash_GetSelectedChip(void) { return 0; }; +				static inline void    Dataflash_SelectChip(const uint8_t ChipMask) {}; +				static inline void    Dataflash_DeselectChip(void) {}; +				static inline void    Dataflash_SelectChipFromPage(const uint16_t PageAddress) {}; +				static inline void    Dataflash_ToggleSelectedChipCS(void) {}; +				static inline void    Dataflash_WaitWhileBusy(void) {}; +				static inline void    Dataflash_SendAddressBytes(uint16_t PageAddress, +				                                                 const uint16_t BufferByte) {}; +			#elif (BOARD == BOARD_USBKEY) +				#include "AVR8/USBKEY/Dataflash.h" +			#elif (BOARD == BOARD_STK525) +				#include "AVR8/STK525/Dataflash.h" +			#elif (BOARD == BOARD_STK526) +				#include "AVR8/STK526/Dataflash.h" +			#elif ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1)) +				#include "AVR8/XPLAIN/Dataflash.h" +			#elif (BOARD == BOARD_EVK527) +				#include "AVR8/EVK527/Dataflash.h" +			#elif (BOARD == BOARD_A3BU_XPLAINED) +				#include "XMEGA/A3BU_XPLAINED/Dataflash.h" +			#elif (BOARD == BOARD_B1_XPLAINED) +				#include "XMEGA/B1_XPLAINED/Dataflash.h" +			#else +				#include "Board/Dataflash.h" +			#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/Joystick.h b/lib/lufa/LUFA/Drivers/Board/Joystick.h new file mode 100644 index 0000000000..0d0fe89344 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/Joystick.h @@ -0,0 +1,152 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Digital joystick board hardware driver. + * + *  This file is the master dispatch header file for the board-specific Joystick driver, for boards containing a + *  digital joystick. + * + *  User code should include this file, which will in turn include the correct joystick driver header file for the + *  currently selected board. + * + *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/Joystick.h file in the user project + *  directory. + * + *  For possible \c BOARD makefile values, see \ref Group_BoardTypes. + */ + +/** \ingroup Group_BoardDrivers + *  \defgroup Group_Joystick Joystick Driver - LUFA/Drivers/Board/Joystick.h + *  \brief Digital joystick board hardware driver. + * + *  \section Sec_Joystick_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - None + * + *  \section Sec_Joystick_ModDescription Module Description + *  Hardware Joystick driver. This module provides an easy to use interface to control the hardware digital Joystick + *  located on many boards. + * + *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/Joystick.h file in the user project + *  directory. Otherwise, it will include the appropriate built-in board driver header file. + * + *  For possible \c BOARD makefile values, see \ref Group_BoardTypes. + * + *  \section Sec_Joystick_ExampleUsage Example Usage + *  The following snippet is an example of how this module may be used within a typical + *  application. + * + *  \code + *      // Initialize the board Joystick driver before first use + *      Joystick_Init(); + * + *      printf("Waiting for joystick movement...\r\n"); + * + *      // Loop until a the joystick has been moved + *      uint8_t JoystickMovement; + *      while (!(JoystickMovement = Joystick_GetStatus())) {}; + * + *      // Display which direction the joystick was moved in + *      printf("Joystick moved:\r\n"); + * + *      if (JoystickMovement & (JOY_UP | JOY_DOWN)) + *        printf("%s ", (JoystickMovement & JOY_UP) ? "Up" : "Down"); + * + *      if (JoystickMovement & (JOY_LEFT | JOY_RIGHT)) + *        printf("%s ", (JoystickMovement & JOY_LEFT) ? "Left" : "Right"); + * + *      if (JoystickMovement & JOY_PRESS) + *        printf("Pressed"); + *  \endcode + * + *  @{ + */ + +#ifndef __JOYSTICK_H__ +#define __JOYSTICK_H__ + +	/* Macros: */ +		#define __INCLUDE_FROM_JOYSTICK_H + +	/* Includes: */ +		#include "../../Common/Common.h" + +		#if (BOARD == BOARD_NONE) +			#define JOY_UP           0 +			#define JOY_DOWN         0 +			#define JOY_LEFT         0 +			#define JOY_RIGHT        0 +			#define JOY_PRESS        0 +			static inline void       Joystick_Init(void) {} +			static inline void       Joystick_Disable(void) {} +			static inline uint_reg_t Joystick_GetStatus(void) { return 0; } +		#elif (BOARD == BOARD_USBKEY) +			#include "AVR8/USBKEY/Joystick.h" +		#elif (BOARD == BOARD_STK525) +			#include "AVR8/STK525/Joystick.h" +		#elif (BOARD == BOARD_STK526) +			#include "AVR8/STK526/Joystick.h" +		#elif (BOARD == BOARD_BUMBLEB) +			#include "AVR8/BUMBLEB/Joystick.h" +		#elif (BOARD == BOARD_EVK527) +			#include "AVR8/EVK527/Joystick.h" +		#elif (BOARD == BOARD_EVK1101) +			#include "UC3/EVK1101/Joystick.h" +		#elif (BOARD == BOARD_EVK1100) +			#include "UC3/EVK1100/Joystick.h" +		#else +			#include "Board/Joystick.h" +		#endif + +	/* Pseudo-Functions for Doxygen: */ +	#if defined(__DOXYGEN__) +		/** Initializes the joystick driver so that the joystick position can be read. This sets the appropriate +		 *  I/O pins to inputs with their pull-ups enabled. +		 * +		 *  This must be called before any Joystick driver functions are used. +		 */ +		static inline void Joystick_Init(void); + +		/** Disables the joystick driver, releasing the I/O pins back to their default high-impedance input mode. */ +		static inline void Joystick_Disable(void); + +		/** Returns the current status of the joystick, as a mask indicating the direction the joystick is +		 *  currently facing in (multiple bits can be set). +		 * +		 *  \return Mask of \c JOYSTICK_* constants indicating the current joystick direction(s). +		 */ +		static inline uint_reg_t Joystick_GetStatus(void) ATTR_WARN_UNUSED_RESULT; +	#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/LEDs.h b/lib/lufa/LUFA/Drivers/Board/LEDs.h new file mode 100644 index 0000000000..74abb37238 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/LEDs.h @@ -0,0 +1,304 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief LED board hardware driver. + * + *  This file is the master dispatch header file for the board-specific LED driver, for boards containing user + *  controllable LEDs. + * + *  User code should include this file, which will in turn include the correct LED driver header file for the + *  currently selected board. + * + *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/LEDs.h file in the user project + *  directory. + * + *  For possible \c BOARD makefile values, see \ref Group_BoardTypes. + */ + +/** \ingroup Group_BoardDrivers + *  \defgroup Group_LEDs LEDs Driver - LUFA/Drivers/Board/LEDs.h + *  \brief LED board hardware driver. + * + *  \section Sec_LEDs_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - None + * + *  \section Sec_LEDs_ModDescription Module Description + *  Hardware LEDs driver. This provides an easy to use driver for the hardware LEDs present on many boards. It + *  provides an interface to configure, test and change the status of all the board LEDs. + * + *  If the \c BOARD value is set to \c BOARD_USER, this will include the \c /Board/LEDs.h file in the user project + *  directory. Otherwise, it will include the appropriate built-in board driver header file. If the BOARD value + *  is set to \c BOARD_NONE, this driver is silently disabled. + * + *  For possible \c BOARD makefile values, see \ref Group_BoardTypes. + * + *  \note To make code as compatible as possible, it is assumed that all boards carry a minimum of four LEDs. If + *        a board contains less than four LEDs, the remaining LED masks are defined to 0 so as to have no effect. + *        If other behavior is desired, either alias the remaining LED masks to existing LED masks via the -D + *        switch in the project makefile, or alias them to nothing in the makefile to cause compilation errors when + *        a non-existing LED is referenced in application code. Note that this means that it is possible to make + *        compatible code for a board with no LEDs by making a board LED driver (see \ref Page_WritingBoardDrivers) + *        which contains only stub functions and defines no LEDs. + * + *  \section Sec_LEDs_ExampleUsage Example Usage + *  The following snippet is an example of how this module may be used within a typical + *  application. + * + *  \code + *      // Initialize the board LED driver before first use + *      LEDs_Init(); + * + *      // Turn on each of the four LEDs in turn + *      LEDs_SetAllLEDs(LEDS_LED1); + *      Delay_MS(500); + *      LEDs_SetAllLEDs(LEDS_LED2); + *      Delay_MS(500); + *      LEDs_SetAllLEDs(LEDS_LED3); + *      Delay_MS(500); + *      LEDs_SetAllLEDs(LEDS_LED4); + *      Delay_MS(500); + * + *      // Turn on all LEDs + *      LEDs_SetAllLEDs(LEDS_ALL_LEDS); + *      Delay_MS(1000); + * + *      // Turn on LED 1, turn off LED 2, leaving LEDs 3 and 4 in their current state + *      LEDs_ChangeLEDs((LEDS_LED1 | LEDS_LED2), LEDS_LED1); + *  \endcode + * + *  @{ + */ + +#ifndef __LEDS_H__ +#define __LEDS_H__ + +	/* Macros: */ +		#define __INCLUDE_FROM_LEDS_H + +	/* Includes: */ +		#include "../../Common/Common.h" + +		#if (BOARD == BOARD_NONE) +			static inline void       LEDs_Init(void) {} +			static inline void       LEDs_Disable(void) {} +			static inline void       LEDs_TurnOnLEDs(const uint_reg_t LEDMask) {} +			static inline void       LEDs_TurnOffLEDs(const uint_reg_t LEDMask) {} +			static inline void       LEDs_SetAllLEDs(const uint_reg_t LEDMask) {} +			static inline void       LEDs_ChangeLEDs(const uint_reg_t LEDMask, const uint_reg_t ActiveMask) {} +			static inline void       LEDs_ToggleLEDs(const uint_reg_t LEDMask) {} +			static inline uint_reg_t LEDs_GetLEDs(void) { return 0; } +		#elif (BOARD == BOARD_USBKEY) +			#include "AVR8/USBKEY/LEDs.h" +		#elif (BOARD == BOARD_STK525) +			#include "AVR8/STK525/LEDs.h" +		#elif (BOARD == BOARD_STK526) +			#include "AVR8/STK526/LEDs.h" +		#elif (BOARD == BOARD_RZUSBSTICK) +			#include "AVR8/RZUSBSTICK/LEDs.h" +		#elif (BOARD == BOARD_ATAVRUSBRF01) +			#include "AVR8/ATAVRUSBRF01/LEDs.h" +		#elif ((BOARD == BOARD_XPLAIN) || (BOARD == BOARD_XPLAIN_REV1)) +			#include "AVR8/XPLAIN/LEDs.h" +		#elif (BOARD == BOARD_BUMBLEB) +			#include "AVR8/BUMBLEB/LEDs.h" +		#elif (BOARD == BOARD_EVK527) +			#include "AVR8/EVK527/LEDs.h" +		#elif ((BOARD == BOARD_TEENSY) || (BOARD == BOARD_TEENSY2)) +			#include "AVR8/TEENSY/LEDs.h" +		#elif ((BOARD == BOARD_QMK)) +			#include "AVR8/QMK/LEDs.h" +		#elif (BOARD == BOARD_USBTINYMKII) +			#include "AVR8/USBTINYMKII/LEDs.h" +		#elif (BOARD == BOARD_BENITO) +			#include "AVR8/BENITO/LEDs.h" +		#elif (BOARD == BOARD_JMDBU2) +			#include "AVR8/JMDBU2/LEDs.h" +		#elif (BOARD == BOARD_OLIMEX162) +			#include "AVR8/OLIMEX162/LEDs.h" +		#elif (BOARD == BOARD_USBFOO) +			#include "AVR8/USBFOO/LEDs.h" +		#elif (BOARD == BOARD_UDIP) +			#include "AVR8/UDIP/LEDs.h" +		#elif (BOARD == BOARD_BUI) +			#include "AVR8/BUI/LEDs.h" +		#elif (BOARD == BOARD_UNO) +			#include "AVR8/UNO/LEDs.h" +		#elif (BOARD == BOARD_CULV3) +			#include "AVR8/CULV3/LEDs.h" +		#elif (BOARD == BOARD_BLACKCAT) +			#include "AVR8/BLACKCAT/LEDs.h" +		#elif (BOARD == BOARD_MAXIMUS) +			#include "AVR8/MAXIMUS/LEDs.h" +		#elif (BOARD == BOARD_MINIMUS) +			#include "AVR8/MINIMUS/LEDs.h" +		#elif (BOARD == BOARD_ADAFRUITU4) +			#include "AVR8/ADAFRUITU4/LEDs.h" +		#elif (BOARD == BOARD_MICROSIN162) +			#include "AVR8/MICROSIN162/LEDs.h" +		#elif (BOARD == BOARD_SPARKFUN8U2) +			#include "AVR8/SPARKFUN8U2/LEDs.h" +		#elif (BOARD == BOARD_EVK1101) +			#include "UC3/EVK1101/LEDs.h" +		#elif (BOARD == BOARD_TUL) +			#include "AVR8/TUL/LEDs.h" +		#elif (BOARD == BOARD_EVK1100) +			#include "UC3/EVK1100/LEDs.h" +		#elif (BOARD == BOARD_EVK1104) +			#include "UC3/EVK1104/LEDs.h" +		#elif (BOARD == BOARD_A3BU_XPLAINED) +			#include "XMEGA/A3BU_XPLAINED/LEDs.h" +		#elif ((BOARD == BOARD_USB2AX) || (BOARD == BOARD_USB2AX_V3) || (BOARD == BOARD_USB2AX_V31)) +			#include "AVR8/USB2AX/LEDs.h" +		#elif ((BOARD == BOARD_MICROPENDOUS_REV1) || (BOARD == BOARD_MICROPENDOUS_REV2) || \ +		       (BOARD == BOARD_MICROPENDOUS_32U2)) +			#include "AVR8/MICROPENDOUS/LEDs.h" +		#elif (BOARD == BOARD_B1_XPLAINED) +			#include "XMEGA/B1_XPLAINED/LEDs.h" +		#elif (BOARD == BOARD_MULTIO) +			#include "AVR8/MULTIO/LEDs.h" +		#elif (BOARD == BOARD_BIGMULTIO) +			#include "AVR8/BIGMULTIO/LEDs.h" +		#elif (BOARD == BOARD_DUCE) +			#include "AVR8/DUCE/LEDs.h" +		#elif (BOARD == BOARD_OLIMEX32U4) +			#include "AVR8/OLIMEX32U4/LEDs.h" +		#elif (BOARD == BOARD_OLIMEXT32U4) +			#include "AVR8/OLIMEXT32U4/LEDs.h" +		#elif (BOARD == BOARD_OLIMEXISPMK2) +			#include "AVR8/OLIMEXISPMK2/LEDs.h" +		#elif (BOARD == BOARD_LEONARDO) +			#include "AVR8/LEONARDO/LEDs.h" +		#elif (BOARD == BOARD_UC3A3_XPLAINED) +			#include "UC3/UC3A3_XPLAINED/LEDs.h" +		#elif (BOARD == BOARD_STANGE_ISP) +			#include "AVR8/STANGE_ISP/LEDs.h" +		#elif (BOARD == BOARD_C3_XPLAINED) +			#include "XMEGA/C3_XPLAINED/LEDs.h" +		#elif (BOARD == BOARD_U2S) +			#include "AVR8/U2S/LEDs.h" +		#elif (BOARD == BOARD_YUN) +			#include "AVR8/YUN/LEDs.h" +		#elif (BOARD == BOARD_MICRO) +			#include "AVR8/MICRO/LEDs.h" +		#elif (BOARD == BOARD_POLOLUMICRO) +			#include "AVR8/POLOLUMICRO/LEDs.h" +		#elif (BOARD == BOARD_XPLAINED_MINI) +			#include "AVR8/XPLAINED_MINI/LEDs.h" +		#else +			#include "Board/LEDs.h" +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__DOXYGEN__) +			#if !defined(LEDS_NO_LEDS) +				#define LEDS_NO_LEDS   0 +			#endif + +			#if !defined(LEDS_ALL_LEDS) +				#define LEDS_ALL_LEDS  (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4) +			#endif + +			#if !defined(LEDS_LED1) +				#define LEDS_LED1      0 +			#endif + +			#if !defined(LEDS_LED2) +				#define LEDS_LED2      0 +			#endif + +			#if !defined(LEDS_LED3) +				#define LEDS_LED3      0 +			#endif + +			#if !defined(LEDS_LED4) +				#define LEDS_LED4      0 +			#endif +		#endif + +	/* Pseudo-Functions for Doxygen: */ +	#if defined(__DOXYGEN__) +		/** Initializes the board LED driver so that the LEDs can be controlled. This sets the appropriate port +		 *  I/O pins as outputs, and sets the LEDs to default to off. +		 * +		 *  This must be called before any LED driver functions are used. +		 */ +		static inline void LEDs_Init(void); + +		/** Disables the board LED driver, releasing the I/O pins back to their default high-impedance input mode. */ +		static inline void LEDs_Disable(void); + +		/** Turns on the LEDs specified in the given LED mask. +		 * +		 *  \param[in] LEDMask  Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file). +		 */ +		static inline void LEDs_TurnOnLEDs(const uint_reg_t LEDMask); + +		/** Turns off the LEDs specified in the given LED mask. +		 * +		 *  \param[in] LEDMask  Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file). +		 */ +		static inline void LEDs_TurnOffLEDs(const uint_reg_t LEDMask); + +		/** Turns off all LEDs not specified in the given LED mask, and turns on all the LEDs in the given LED +		 *  mask. +		 * +		 *  \param[in] LEDMask  Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file). +		 */ +		static inline void LEDs_SetAllLEDs(const uint_reg_t LEDMask); + +		/** Turns off all LEDs in the LED mask that are not set in the active mask, and turns on all the LEDs +		 *  specified in both the LED and active masks. +		 * +		 *  \param[in] LEDMask     Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file). +		 *  \param[in] ActiveMask  Mask of whether the LEDs in the LED mask should be turned on or off. +		 */ +		static inline void LEDs_ChangeLEDs(const uint_reg_t LEDMask, +		                                   const uint_reg_t ActiveMask); + +		/** Toggles all LEDs in the LED mask, leaving all others in their current states. +		 * +		 *  \param[in] LEDMask  Mask of the board LEDs to manipulate (see board-specific LEDs.h driver file). +		 */ +		static inline void LEDs_ToggleLEDs(const uint_reg_t LEDMask); + +		/** Returns the status of all the board LEDs; set LED masks in the return value indicate that the +		 *  corresponding LED is on. +		 * +		 *  \return Mask of \c LEDS_LED* constants indicating which of the board LEDs are currently turned on. +		 */ +		static inline uint_reg_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +	#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/Temperature.c b/lib/lufa/LUFA/Drivers/Board/Temperature.c new file mode 100644 index 0000000000..2fb1976272 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/Temperature.c @@ -0,0 +1,66 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_TEMPERATURE_C +#include "Temperature.h" + +#if defined(TEMPERATURE_SENSOR_DRIVER_COMPATIBLE) + +static const uint16_t PROGMEM Temperature_Lookup[TEMP_TABLE_SIZE] = +{ +	0x3B4, 0x3B0, 0x3AB, 0x3A6, 0x3A0, 0x39A, 0x394, 0x38E, 0x388, 0x381, 0x37A, 0x373, +	0x36B, 0x363, 0x35B, 0x353, 0x34A, 0x341, 0x338, 0x32F, 0x325, 0x31B, 0x311, 0x307, +	0x2FC, 0x2F1, 0x2E6, 0x2DB, 0x2D0, 0x2C4, 0x2B8, 0x2AC, 0x2A0, 0x294, 0x288, 0x27C, +	0x26F, 0x263, 0x256, 0x24A, 0x23D, 0x231, 0x225, 0x218, 0x20C, 0x200, 0x1F3, 0x1E7, +	0x1DB, 0x1CF, 0x1C4, 0x1B8, 0x1AC, 0x1A1, 0x196, 0x18B, 0x180, 0x176, 0x16B, 0x161, +	0x157, 0x14D, 0x144, 0x13A, 0x131, 0x128, 0x11F, 0x117, 0x10F, 0x106, 0x0FE, 0x0F7, +	0x0EF, 0x0E8, 0x0E1, 0x0DA, 0x0D3, 0x0CD, 0x0C7, 0x0C0, 0x0BA, 0x0B5, 0x0AF, 0x0AA, +	0x0A4, 0x09F, 0x09A, 0x096, 0x091, 0x08C, 0x088, 0x084, 0x080, 0x07C, 0x078, 0x074, +	0x071, 0x06D, 0x06A, 0x067, 0x064, 0x061, 0x05E, 0x05B, 0x058, 0x055, 0x053, 0x050, +	0x04E, 0x04C, 0x049, 0x047, 0x045, 0x043, 0x041, 0x03F, 0x03D, 0x03C, 0x03A, 0x038 +}; + +int8_t Temperature_GetTemperature(void) +{ +	uint16_t Temp_ADC = ADC_GetChannelReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | TEMP_ADC_CHANNEL_MASK); + +	if (Temp_ADC > pgm_read_word(&Temperature_Lookup[0])) +	  return TEMP_MIN_TEMP; + +	for (uint16_t Index = 0; Index < TEMP_TABLE_SIZE; Index++) +	{ +		if (Temp_ADC > pgm_read_word(&Temperature_Lookup[Index])) +		  return (Index + TEMP_TABLE_OFFSET_DEGREES); +	} + +	return TEMP_MAX_TEMP; +} + +#endif diff --git a/lib/lufa/LUFA/Drivers/Board/Temperature.h b/lib/lufa/LUFA/Drivers/Board/Temperature.h new file mode 100644 index 0000000000..f381cc92d9 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/Temperature.h @@ -0,0 +1,147 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief NTC Temperature Sensor board hardware driver. + * + *  Master include file for the board temperature sensor driver, for the USB boards which contain a temperature sensor. + */ + +/** \ingroup Group_BoardDrivers + *  \defgroup Group_Temperature Temperature Sensor Driver - LUFA/Drivers/Board/Temperature.h + *  \brief NTC Temperature Sensor board hardware driver. + * + *  \section Sec_Temperature_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/Board/Temperature.c <i>(Makefile source module name: LUFA_SRC_TEMPERATURE)</i> + * + *  \section Sec_Temperature_ModDescription Module Description + *  Temperature sensor driver. This provides an easy to use interface for the hardware temperature sensor located + *  on many boards. It provides an interface to configure the sensor and appropriate ADC channel, plus read out the + *  current temperature in degrees C. It is designed for and will only work with the temperature sensor located on the + *  official Atmel USB AVR boards, as each sensor has different characteristics. + * + *  \section Sec_Temperature_ExampleUsage Example Usage + *  The following snippet is an example of how this module may be used within a typical + *  application. + * + *  \code + *      // Initialize the ADC and board temperature sensor drivers before first use + *      ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_128); + *      Temperature_Init(); + * + *      // Display converted temperature in degrees Celsius + *      printf("Current Temperature: %d Degrees\r\n", Temperature_GetTemperature()); + *  \endcode + * + *  @{ + */ + +#ifndef __TEMPERATURE_H__ +#define __TEMPERATURE_H__ + +	/* Includes: */ +		#include "../../Common/Common.h" + +	/* Preprocessor Checks: */ +		#if ((BOARD == BOARD_USBKEY) || (BOARD == BOARD_STK525) || \ +		     (BOARD == BOARD_STK526) || (BOARD == BOARD_EVK527)) +			#define TEMPERATURE_SENSOR_DRIVER_COMPATIBLE +		#endif + +		#if !defined(__INCLUDE_FROM_TEMPERATURE_C) && !defined(TEMPERATURE_SENSOR_DRIVER_COMPATIBLE) +			#error The selected board does not contain a compatible temperature sensor. +		#endif + +	#if defined(TEMPERATURE_SENSOR_DRIVER_COMPATIBLE) + +	/* Includes: */ +		#include "../Peripheral/ADC.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** ADC channel number for the temperature sensor. */ +			#define TEMP_ADC_CHANNEL       0 + +			/** ADC channel MUX mask for the temperature sensor. */ +			#define TEMP_ADC_CHANNEL_MASK  ADC_CHANNEL0 + +			/** Size of the temperature sensor lookup table, in lookup values */ +			#define TEMP_TABLE_SIZE        120 + +			/** Minimum returnable temperature from the \ref Temperature_GetTemperature() function. */ +			#define TEMP_MIN_TEMP          TEMP_TABLE_OFFSET_DEGREES + +			/** Maximum returnable temperature from the \ref Temperature_GetTemperature() function. */ +			#define TEMP_MAX_TEMP          ((TEMP_TABLE_SIZE - 1) + TEMP_TABLE_OFFSET_DEGREES) + +		/* Inline Functions: */ +			/** Initializes the temperature sensor driver, including setting up the appropriate ADC channel. +			 *  This must be called before any other temperature sensor routines. +			 * +			 *  \pre The ADC itself (not the ADC channel) must be configured separately before calling the +			 *       temperature sensor functions. +			 */ +			static inline void Temperature_Init(void) ATTR_ALWAYS_INLINE; +			static inline void Temperature_Init(void) +			{ +				ADC_SetupChannel(TEMP_ADC_CHANNEL); +			} + +		/* Function Prototypes: */ +			/** Performs a complete ADC on the temperature sensor channel, and converts the result into a +			 *  valid temperature between \ref TEMP_MIN_TEMP and \ref TEMP_MAX_TEMP in degrees Celsius. +			 * +			 *  \return Signed temperature value in degrees Celsius. +			 */ +			int8_t Temperature_GetTemperature(void) ATTR_WARN_UNUSED_RESULT; + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#define TEMP_TABLE_OFFSET_DEGREES   -21 +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +	#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Board.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Board.h new file mode 100644 index 0000000000..bd68cf5774 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Board.h @@ -0,0 +1,86 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Atmel EVK1100. + *  \copydetails Group_BoardInfo_EVK1100 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_EVK1100 EVK1100 + *  \brief Board specific information header for the Atmel Atmel EVK1100. + * + *  Board specific information header for the Atmel Atmel EVK1100. + * + *  @{ + */ + +#ifndef __BOARD_EVK1100_H__ +#define __BOARD_EVK1100_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../Joystick.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has a hardware Joystick mounted. */ +			#define BOARD_HAS_JOYSTICK + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Buttons.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Buttons.h new file mode 100644 index 0000000000..a2bd15d285 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Buttons.h @@ -0,0 +1,117 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>SW0 Button</td><td>Low</td><td>GPIO88</td></tr> + *    <tr><td>BUTTONS_BUTTON2</td><td>SW1 Button</td><td>Low</td><td>GPIO85</td></tr> + *    <tr><td>BUTTONS_BUTTON3</td><td>SW2 Button</td><td>Low</td><td>GPIO82</td></tr> + *  </table> + * + *  @{ + */ + +#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 void Buttons_Disable(void) +			{ +				AVR32_GPIO.port[BUTTONS_PORT].gperc = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2); +				AVR32_GPIO.port[BUTTONS_PORT].puerc = (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/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Joystick.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Joystick.h new file mode 100644 index 0000000000..7117bc519d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/Joystick.h @@ -0,0 +1,122 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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. + * + *  <table> + *    <tr><th>Left Port Pin</th><th>Up Port Pin</th><th>Right Port Pin</th><th>Down Port Pin</th><th>Press Port Pin</th></tr> + *    <tr><td>GPIO25</td><td>GPIO26</td><td>GPIO28</td><td>GPIO27</td><td>GPIO20</td></tr> + *  </table> + * + *  @{ + */ + +#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 void Joystick_Disable(void) +			{ +				AVR32_GPIO.port[JOY_PORT].gperc = JOY_MASK; +				AVR32_GPIO.port[JOY_PORT].gperc = 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/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/LEDs.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/LEDs.h new file mode 100644 index 0000000000..ca6a37f3ed --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1100/LEDs.h @@ -0,0 +1,173 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>LED0 LED</td><td>Low</td><td>GPIO51</td></tr> + *    <tr><td>LEDS_LED2</td><td>Green</td><td>LED1 LED</td><td>Low</td><td>GPIO52</td></tr> + *    <tr><td>LEDS_LED3</td><td>Green</td><td>LED2 LED</td><td>Low</td><td>GPIO53</td></tr> + *    <tr><td>LEDS_LED4</td><td>Green</td><td>LED3 LED</td><td>Low</td><td>GPIO54</td></tr> + *    <tr><td>LEDS_LED5</td><td>Green</td><td>LED4 LED</td><td>Low</td><td>GPIO59</td></tr> + *    <tr><td>LEDS_LED6</td><td>Green</td><td>LED5 LED</td><td>Low</td><td>GPIO60</td></tr> + *    <tr><td>LEDS_LED7</td><td>Green</td><td>LED6 LED</td><td>Low</td><td>GPIO61</td></tr> + *    <tr><td>LEDS_LED8</td><td>Green</td><td>LED7 LED</td><td>Low</td><td>GPIO62</td></tr> + *  </table> + * + *  @{ + */ + +#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_Disable(void) +			{ +				AVR32_GPIO.port[LEDS_PORT].gperc = LEDS_ALL_LEDS; +				AVR32_GPIO.port[LEDS_PORT].oderc = LEDS_ALL_LEDS; +				AVR32_GPIO.port[LEDS_PORT].ovrc  = 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/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Board.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Board.h new file mode 100644 index 0000000000..46d79f00a4 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Board.h @@ -0,0 +1,86 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Atmel EVK1101. + *  \copydetails Group_BoardInfo_EVK1101 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_EVK1101 EVK1101 + *  \brief Board specific information header for the Atmel Atmel EVK1101. + * + *  Board specific information header for the Atmel Atmel EVK1101. + * + *  @{ + */ + +#ifndef __BOARD_EVK1101_H__ +#define __BOARD_EVK1101_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../Joystick.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has a hardware Joystick mounted. */ +			#define BOARD_HAS_JOYSTICK + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Buttons.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Buttons.h new file mode 100644 index 0000000000..41bf42c668 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Buttons.h @@ -0,0 +1,113 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>SW0 Button</td><td>Low</td><td>GPIO34</td></tr> + *    <tr><td>BUTTONS_BUTTON2</td><td>SW1 Button</td><td>Low</td><td>GPIO35</td></tr> + *  </table> + * + *  @{ + */ + +#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 void Buttons_Disable(void) +			{ +				AVR32_GPIO.port[BUTTONS_PORT].gperc = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2); +				AVR32_GPIO.port[BUTTONS_PORT].puerc = (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[BUTTONS_PORT].pvr & (BUTTONS_BUTTON1 | BUTTONS_BUTTON2))); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Joystick.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Joystick.h new file mode 100644 index 0000000000..1351213017 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/Joystick.h @@ -0,0 +1,131 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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. + * + *  <table> + *    <tr><th>Left Port Pin</th><th>Up Port Pin</th><th>Right Port Pin</th><th>Down Port Pin</th><th>Press Port Pin</th></tr> + *    <tr><td>GPIO38</td><td>GPIO39</td><td>GPIO41</td><td>GPIO40</td><td>GPIO13</td></tr> + *  </table> + * + *  @{ + */ + +#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 void Joystick_Disable(void) +			{ +				AVR32_GPIO.port[JOY_MOVE_PORT].gperc  = JOY_MOVE_MASK; +				AVR32_GPIO.port[JOY_PRESS_PORT].gperc = JOY_PRESS_MASK; + +				AVR32_GPIO.port[JOY_MOVE_PORT].puerc  = JOY_MOVE_MASK; +				AVR32_GPIO.port[JOY_PRESS_PORT].puerc = 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/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/LEDs.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/LEDs.h new file mode 100644 index 0000000000..71d45d2ad3 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1101/LEDs.h @@ -0,0 +1,156 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>LED0 LED</td><td>Low</td><td>GPIO7</td></tr> + *    <tr><td>LEDS_LED2</td><td>Green</td><td>LED1 LED</td><td>Low</td><td>GPIO8</td></tr> + *    <tr><td>LEDS_LED3</td><td>Green</td><td>LED2 LED</td><td>Low</td><td>GPIO21</td></tr> + *    <tr><td>LEDS_LED4</td><td>Green</td><td>LED3 LED</td><td>Low</td><td>GPIO22</td></tr> + *  </table> + * + *  @{ + */ + +#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_Disable(void) +			{ +				AVR32_GPIO.port[LEDS_PORT].gperc = LEDS_ALL_LEDS; +				AVR32_GPIO.port[LEDS_PORT].oderc = LEDS_ALL_LEDS; +				AVR32_GPIO.port[LEDS_PORT].ovrc  = 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/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/Board.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/Board.h new file mode 100644 index 0000000000..0c8b762d71 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Atmel EVK1104. + *  \copydetails Group_BoardInfo_EVK1104 + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_EVK1104 EVK1104 + *  \brief Board specific information header for the Atmel Atmel EVK1104. + * + *  Board specific information header for the Atmel Atmel EVK1104. + * + *  @{ + */ + +#ifndef __BOARD_EVK1104_H__ +#define __BOARD_EVK1104_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/Buttons.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/Buttons.h new file mode 100644 index 0000000000..d12fda5739 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/Buttons.h @@ -0,0 +1,109 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>SW0 Button</td><td>Low</td><td>GPIO42</td></tr> + *  </table> + * + *  @{ + */ + +#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 void Buttons_Disable(void) +			{ +				AVR32_GPIO.port[BUTTONS_PORT].gperc = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2); +				AVR32_GPIO.port[BUTTONS_PORT].puerc = (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/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/LEDs.h b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/LEDs.h new file mode 100644 index 0000000000..793ea86dea --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/UC3/EVK1104/LEDs.h @@ -0,0 +1,174 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Green</td><td>LED0 LED</td><td>Low</td><td>GPIO67</td></tr> + *    <tr><td>LEDS_LED2</td><td>Green</td><td>LED1 LED</td><td>Low</td><td>GPIO101</td></tr> + *    <tr><td>LEDS_LED3</td><td>Green</td><td>LED2 LED</td><td>Low</td><td>GPIO102</td></tr> + *    <tr><td>LEDS_LED4</td><td>Green</td><td>LED3 LED</td><td>Low</td><td>GPIO105</td></tr> + *  </table> + * + *  @{ + */ + +#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_Disable(void) +			{ +				AVR32_GPIO.port[2].gperc = LEDS_LEDMASK2; +				AVR32_GPIO.port[2].oderc = LEDS_LEDMASK2; +				AVR32_GPIO.port[2].ovrc  = LEDS_LEDMASK2; + +				AVR32_GPIO.port[3].gperc = LEDS_LEDMASK3; +				AVR32_GPIO.port[3].oderc = LEDS_LEDMASK3; +				AVR32_GPIO.port[3].ovrc  = 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/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Board.h b/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Board.h new file mode 100644 index 0000000000..94abc3e49d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Board.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Atmel UC3-A3 Xplained. + *  \copydetails Group_BoardInfo_UC3_A3_XPLAINED + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_UC3_A3_XPLAINED UC3_A3_XPLAINED + *  \brief Board specific information header for the Atmel UC3-A3 Xplained. + * + *  Board specific information header for the Atmel UC3-A3 Xplained. + * + *  @{ + */ + +#ifndef __BOARD_UC3_A3_XPLAINED_H__ +#define __BOARD_UC3_A3_XPLAINED_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h b/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h new file mode 100644 index 0000000000..879373e0ed --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h @@ -0,0 +1,109 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Atmel UC3-A3 Xplained. + *  \copydetails Group_Buttons_UC3A3_XPLAINED + * + *  \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_UC3A3_XPLAINED UC3A3_XPLAINED + *  \brief Board specific Buttons driver header for the Atmel UC3-A3 Xplained. + * + *  Board specific Buttons driver header for the Atmel UC3-A3 Xplained. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>SW0 Button</td><td>Low</td><td>GPIO32</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_UC3A3_XPLAINED_H__ +#define __BUTTONS_UC3A3_XPLAINED_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 << 0) + +		/* 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 void Buttons_Disable(void) +			{ +				AVR32_GPIO.port[BUTTONS_PORT].gperc = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2); +				AVR32_GPIO.port[BUTTONS_PORT].puerc = (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/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h b/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h new file mode 100644 index 0000000000..cbd2bde32d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h @@ -0,0 +1,182 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Atmel UC3-A3 Xplained. + *  \copydetails Group_LEDs_UC3A3_XPLAINED + * + *  \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_UC3A3_XPLAINED UC3A3_XPLAINED + *  \brief Board specific LED driver header for the Atmel UC3-A3 Xplained. + * + *  Board specific LED driver header for the Atmel UC3-A3 Xplained. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>LED0 LED</td><td>Low</td><td>GPIO35</td></tr> + *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>LED1 LED</td><td>Low</td><td>GPIO73</td></tr> + *    <tr><td>LEDS_LED3</td><td>Yellow</td><td>LED2 LED</td><td>Low</td><td>GPIO34</td></tr> + *    <tr><td>LEDS_LED4</td><td>Yellow</td><td>LED3 LED</td><td>Low</td><td>GPIO38</td></tr> + *    <tr><td>LEDS_LED5</td><td>Green</td><td>Status</td><td>Low</td><td>GPIO50</td></tr> + *    <tr><td>LEDS_LED6</td><td>Red</td><td>Power</td><td>High</td><td>GPIO49</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_UC3A3_XPLAINED_H__ +#define __LEDS_UC3A3_XPLAINED_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_LEDMASK1   ((1UL << 3) | (1UL << 2) | (1UL << 6) | (1UL << 18) | (1UL << 17)) +			#define LEDS_LEDMASK3    (1UL << 9) +	#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 << 9) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        (1UL << 2) + +			/** LED mask for the fourth LED on the board. */ +			#define LEDS_LED4        (1UL << 6) + +			/** LED mask for the fifth LED on the board. */ +			#define LEDS_LED5        (1UL << 18) + +			/** LED mask for the sixth LED on the board. */ +			#define LEDS_LED6        (1UL << 17) + +			/** 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) + +			/** 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[1].gpers = LEDS_LEDMASK1; +				AVR32_GPIO.port[1].oders = LEDS_LEDMASK1; +				AVR32_GPIO.port[1].ovrs  = LEDS_LEDMASK1; + +				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_Disable(void) +			{ +				AVR32_GPIO.port[1].gperc = LEDS_LEDMASK1; +				AVR32_GPIO.port[1].oderc = LEDS_LEDMASK1; +				AVR32_GPIO.port[1].ovrc  = LEDS_LEDMASK1; + +				AVR32_GPIO.port[3].gperc = LEDS_LEDMASK3; +				AVR32_GPIO.port[3].oderc = LEDS_LEDMASK3; +				AVR32_GPIO.port[3].ovrc  = LEDS_LEDMASK3; +			} + +			static inline void LEDs_TurnOnLEDs(const uint32_t LEDMask) +			{ +				AVR32_GPIO.port[1].ovrc  = (LEDMask & LEDS_LEDMASK1); +				AVR32_GPIO.port[3].ovrc  = (LEDMask & LEDS_LEDMASK3); +			} + +			static inline void LEDs_TurnOffLEDs(const uint32_t LEDMask) +			{ +				AVR32_GPIO.port[1].ovrs  = (LEDMask & LEDS_LEDMASK1); +				AVR32_GPIO.port[3].ovrs  = (LEDMask & LEDS_LEDMASK3); +			} + +			static inline void LEDs_SetAllLEDs(const uint32_t LEDMask) +			{ +				AVR32_GPIO.port[1].ovrs  = LEDS_LEDMASK1; +				AVR32_GPIO.port[1].ovrc  = (LEDMask & LEDS_LEDMASK1); + +				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[1].ovrs  = (LEDMask    & LEDS_LEDMASK1); +				AVR32_GPIO.port[1].ovrc  = (ActiveMask & LEDS_LEDMASK1); + +				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[1].ovrt  = (LEDMask & LEDS_LEDMASK1); +				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[1].ovr & LEDS_LEDMASK1) | (~AVR32_GPIO.port[3].ovr & LEDS_LEDMASK3)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h new file mode 100644 index 0000000000..2bc2377c2d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h @@ -0,0 +1,86 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Atmel XMEGA A3BU Xplained. + *  \copydetails Group_BoardInfo_A3BU_XPLAINED + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_A3BU_XPLAINED A3BU_XPLAINED + *  \brief Board specific information header for the Atmel XMEGA A3BU Xplained. + * + *  Board specific information header for the Atmel XMEGA A3BU Xplained. + * + *  @{ + */ + +#ifndef __BOARD_A3BU_XPLAINED_H__ +#define __BOARD_A3BU_XPLAINED_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../Dataflash.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has a hardware Dataflash mounted. */ +			#define BOARD_HAS_DATAFLASH + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h new file mode 100644 index 0000000000..901869d35e --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h @@ -0,0 +1,119 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Atmel XMEGA A3BU Xplained. + *  \copydetails Group_Buttons_A3BU_XPLAINED + * + *  \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_A3BU_XPLAINED A3BU_XPLAINED + *  \brief Board specific Buttons driver header for the Atmel XMEGA A3BU Xplained. + * + *  Board specific Buttons driver header for the Atmel XMEGA A3BU Xplained. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>SW0 Button</td><td>Low</td><td>PORTE.5</td></tr> + *    <tr><td>BUTTONS_BUTTON2</td><td>SW1 Button</td><td>Low</td><td>PORTF.1</td></tr> + *    <tr><td>BUTTONS_BUTTON3</td><td>SW2 Button</td><td>Low</td><td>PORTF.2</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_A3BU_XPLAINED_H__ +#define __BUTTONS_A3BU_XPLAINED_H__ + +	/* Includes: */ +		#include <avr/io.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 << 5) + +			/** Button mask for the second button on the board. */ +			#define BUTTONS_BUTTON2          (1 << 1) + +			/** Button mask for the third button on the board. */ +			#define BUTTONS_BUTTON3          (1 << 2) + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void Buttons_Init(void) +			{ +				PORTE.OUTCLR   = BUTTONS_BUTTON1; +				PORTE.PIN5CTRL = (PORT_OPC_PULLUP_gc | PORT_INVEN_bm); + +				PORTF.OUTCLR   = (BUTTONS_BUTTON2 | BUTTONS_BUTTON3); +				PORTF.PIN1CTRL = (PORT_OPC_PULLUP_gc | PORT_INVEN_bm); +				PORTF.PIN2CTRL = (PORT_OPC_PULLUP_gc | PORT_INVEN_bm); +			} + +			static inline void Buttons_Disable(void) +			{ +				PORTE.OUTCLR   = BUTTONS_BUTTON1; +				PORTE.PIN5CTRL = 0; + +				PORTF.OUTCLR   = (BUTTONS_BUTTON2 | BUTTONS_BUTTON3); +				PORTF.PIN1CTRL = 0; +				PORTF.PIN2CTRL = 0; +			} + +			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Buttons_GetStatus(void) +			{ +				return ((PORTE_IN & BUTTONS_BUTTON1) | (PORTF_IN & (BUTTONS_BUTTON2 | BUTTONS_BUTTON3))); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h new file mode 100644 index 0000000000..b48473890b --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h @@ -0,0 +1,228 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Dataflash driver header for the Atmel XMEGA A3BU Xplained. + *  \copydetails Group_Dataflash_A3BU_XPLAINED + * + *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver + *        dispatch header located in LUFA/Drivers/Board/Dataflash.h. + */ + +/** \ingroup Group_Dataflash + *  \defgroup Group_Dataflash_A3BU_XPLAINED A3BU_XPLAINED + *  \brief Board specific Dataflash driver header for the Atmel XMEGA A3BU Xplained. + * + *  Board specific Dataflash driver header for the Atmel XMEGA A3BU Xplained board. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr> + *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB642D (8MB)</td><td>PORTF.4</td><td>USARTD0 (In SPI Mode)</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __DATAFLASH_A3BU_XPLAINED_H__ +#define __DATAFLASH_A3BU_XPLAINED_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../../Misc/AT45DB642D.h" +		#include "../../../Peripheral/SerialSPI.h" + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_DATAFLASH_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead. +		#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#define DATAFLASH_CHIPCS_MASK                DATAFLASH_CHIP1 +			#define DATAFLASH_CHIPCS_PORT                PORTF +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */ +			#define DATAFLASH_TOTALCHIPS                 1 + +			/** Mask for no dataflash chip selected. */ +			#define DATAFLASH_NO_CHIP                    0 + +			/** Mask for the first dataflash chip selected. */ +			#define DATAFLASH_CHIP1                      (1 << 4) + +			/** Internal main memory page size for the board's dataflash ICs. */ +			#define DATAFLASH_PAGE_SIZE                  1024 + +			/** Total number of pages inside each of the board's dataflash ICs. */ +			#define DATAFLASH_PAGES                      8192 + +		/* Inline Functions: */ +			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC. +			 *  The appropriate SPI interface will be automatically configured. +			 */ +			static inline void Dataflash_Init(void) +			{ +				DATAFLASH_CHIPCS_PORT.DIRSET   = DATAFLASH_CHIPCS_MASK; + +				PORTCFG.MPCMASK                = DATAFLASH_CHIPCS_MASK; +				DATAFLASH_CHIPCS_PORT.PIN0CTRL = PORT_INVEN_bm; + +				SerialSPI_Init(&USARTD0, (USART_SPI_SCK_LEAD_RISING | USART_SPI_SAMPLE_LEADING | USART_SPI_ORDER_MSB_FIRST), (F_CPU / 2)); + +				PORTD.DIRSET   = PIN3_bm | PIN1_bm; +				PORTD.DIRCLR   = PIN2_bm; +				PORTC.PIN2CTRL = PORT_OPC_PULLUP_gc; +			} + +			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) +			{ +				return SerialSPI_TransferByte(&USARTD0, Byte); +			} + +			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 */ +			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SendByte(const uint8_t Byte) +			{ +				SerialSPI_SendByte(&USARTD0, Byte); +			} + +			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash. +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_ReceiveByte(void) +			{ +				return SerialSPI_ReceiveByte(&USARTD0); +			} + +			/** Determines the currently selected dataflash chip. +			 * +			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected +			 *          or a DATAFLASH_CHIPn mask (where n is the chip number). +			 */ +			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_GetSelectedChip(void) +			{ +				return (DATAFLASH_CHIPCS_PORT.OUT & DATAFLASH_CHIPCS_MASK); +			} + +			/** Selects the given dataflash chip. +			 * +			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is +			 *              the chip number). +			 */ +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) +			{ +				DATAFLASH_CHIPCS_PORT.OUTCLR = DATAFLASH_CHIPCS_MASK; +				DATAFLASH_CHIPCS_PORT.OUTSET = ChipMask; +			} + +			/** Deselects the current dataflash chip, so that no dataflash is selected. */ +			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_DeselectChip(void) +			{ +				Dataflash_SelectChip(DATAFLASH_NO_CHIP); +			} + +			/** Selects a dataflash IC from the given page number, which should range from 0 to +			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one +			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside +			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs +			 *  are deselected. +			 * +			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from +			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). +			 */ +			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress) +			{ +				Dataflash_DeselectChip(); + +				if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS)) +				  return; + +				Dataflash_SelectChip(DATAFLASH_CHIP1); +			} + +			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive +			 *  a new command. +			 */ +			static inline void Dataflash_ToggleSelectedChipCS(void) +			{ +				uint8_t SelectedChipMask = Dataflash_GetSelectedChip(); + +				Dataflash_DeselectChip(); +				Dataflash_SelectChip(SelectedChipMask); +			} + +			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main +			 *  memory page program or main memory to buffer transfer. +			 */ +			static inline void Dataflash_WaitWhileBusy(void) +			{ +				Dataflash_ToggleSelectedChipCS(); +				Dataflash_SendByte(DF_CMD_GETSTATUS); +				while (!(Dataflash_ReceiveByte() & DF_STATUS_READY)); +				Dataflash_ToggleSelectedChipCS(); +			} + +			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with +			 *  dataflash commands which require a complete 24-bit address. +			 * +			 *  \param[in] PageAddress  Page address within the selected dataflash IC +			 *  \param[in] BufferByte   Address within the dataflash's buffer +			 */ +			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, +			                                              const uint16_t BufferByte) +			{ +				Dataflash_SendByte(PageAddress >> 5); +				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8)); +				Dataflash_SendByte(BufferByte); +			} + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h new file mode 100644 index 0000000000..a0c5b3af4b --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h @@ -0,0 +1,181 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Atmel XMEGA A3BU Xplained. + *  \copydetails Group_LEDs_A3BU_XPLAINED + * + *  \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_A3BU_XPLAINED A3BU_XPLAINED + *  \brief Board specific LED driver header for the Atmel XMEGA A3BU Xplained. + * + *  Board specific LED driver header for the Atmel XMEGA A3BU Xplained. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>LED0 LED</td><td>Low</td><td>PORTR.0</td></tr> + *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>LED1 LED</td><td>Low</td><td>PORTR.1</td></tr> + *    <tr><td>LEDS_LED3</td><td>Red</td><td>Status Bicolour Red LED</td><td>Low</td><td>PORTD.4</td></tr> + *    <tr><td>LEDS_LED4</td><td>Green</td><td>Status Bicolour Green LED</td><td>High</td><td>PORTD.5</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_A3BU_XPLAINED_H__ +#define __LEDS_A3BU_XPLAINED_H__ + +	/* Includes: */ +		#include <avr/io.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_PORTR_LEDS       (LEDS_LED1 | LEDS_LED2) +			#define LEDS_PORTD_LEDS       (LEDS_LED3 | LEDS_LED4) +	#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 the second LED on the board. */ +			#define LEDS_LED2        (1 << 1) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        (1 << 4) + +			/** LED mask for the fourth LED on the board. */ +			#define LEDS_LED4        (1 << 5) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4) + +			/** LED mask for none of the board LEDs. */ +			#define LEDS_NO_LEDS     0 + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void LEDs_Init(void) +			{ +				PORTR.DIRSET    = LEDS_PORTR_LEDS; +				PORTR.OUTCLR    = LEDS_PORTR_LEDS; + +				PORTCFG.MPCMASK = LEDS_PORTR_LEDS; +				PORTR.PIN0CTRL  = PORT_INVEN_bm; + +				PORTD.DIRSET    = LEDS_PORTD_LEDS; +				PORTD.OUTCLR    = LEDS_PORTD_LEDS; + +				PORTD.PIN4CTRL  = PORT_INVEN_bm; +			} + +			static inline void LEDs_Disable(void) +			{ +				PORTR.DIRCLR    = LEDS_PORTR_LEDS; +				PORTR.OUTCLR    = LEDS_PORTR_LEDS; + +				PORTCFG.MPCMASK = 0; +				PORTR.PIN0CTRL  = LEDS_PORTR_LEDS; + +				PORTD.DIRCLR    = LEDS_PORTD_LEDS; +				PORTD.OUTCLR    = LEDS_PORTD_LEDS; + +				PORTD.PIN4CTRL  = 0; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTR_OUTSET = LEDMask & LEDS_PORTR_LEDS; +				PORTD_OUTSET = LEDMask & LEDS_PORTD_LEDS; +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTR_OUTCLR = LEDMask & LEDS_PORTR_LEDS; +				PORTD_OUTCLR = LEDMask & LEDS_PORTD_LEDS; +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTR_OUTCLR = LEDS_PORTR_LEDS; +				PORTD_OUTCLR = LEDS_PORTD_LEDS; + +				PORTR_OUTSET = (LEDMask & LEDS_PORTR_LEDS); +				PORTD_OUTSET = (LEDMask & LEDS_PORTD_LEDS); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTR_OUTCLR = (LEDMask & LEDS_PORTR_LEDS); +				PORTD_OUTCLR = (LEDMask & LEDS_PORTD_LEDS); + +				PORTR_OUTSET = (ActiveMask & LEDS_PORTR_LEDS); +				PORTD_OUTSET = (ActiveMask & LEDS_PORTD_LEDS); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PORTR_OUTTGL = (LEDMask & LEDS_PORTR_LEDS); +				PORTD_OUTTGL = (LEDMask & LEDS_PORTD_LEDS); +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return ((PORTR_OUT & LEDS_PORTR_LEDS) | (PORTD_OUT & LEDS_PORTD_LEDS)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Board.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Board.h new file mode 100644 index 0000000000..b133b9ae3a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Board.h @@ -0,0 +1,86 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Atmel XMEGA B1 Xplained. + *  \copydetails Group_BoardInfo_B1_XPLAINED + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_B1_XPLAINED B1_XPLAINED + *  \brief Board specific information header for the Atmel XMEGA B1 Xplained. + * + *  Board specific information header for the Atmel XMEGA B1 Xplained. + * + *  @{ + */ + +#ifndef __BOARD_B1_XPLAINED_H__ +#define __BOARD_B1_XPLAINED_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../Dataflash.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has a hardware Dataflash mounted. */ +			#define BOARD_HAS_DATAFLASH + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h new file mode 100644 index 0000000000..01c7c084a6 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h @@ -0,0 +1,119 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Atmel XMEGA B1 Xplained. + *  \copydetails Group_Buttons_B1_XPLAINED + * + *  \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_B1_XPLAINED B1_XPLAINED + *  \brief Board specific Buttons driver header for the Atmel XMEGA B1 Xplained. + * + *  Board specific Buttons driver header for the Atmel XMEGA B1 Xplained. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>Touch CS0 Button</td><td>Low</td><td>PORTE.0</td></tr> + *    <tr><td>BUTTONS_BUTTON2</td><td>Touch CS1 Button</td><td>Low</td><td>PORTE.1</td></tr> + *    <tr><td>BUTTONS_BUTTON3</td><td>Touch CS2 Button</td><td>Low</td><td>PORTE.2</td></tr> + *    <tr><td>BUTTONS_BUTTON4</td><td>Touch CS3 Button</td><td>Low</td><td>PORTE.3</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_B1_XPLAINED_H__ +#define __BUTTONS_B1_XPLAINED_H__ + +	/* Includes: */ +		#include <avr/io.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 << 0) + +			/** Button mask for the second button on the board. */ +			#define BUTTONS_BUTTON2          (1 << 1) + +			/** Button mask for the third button on the board. */ +			#define BUTTONS_BUTTON3          (1 << 2) + +			/** Button mask for the fourth button on the board. */ +			#define BUTTONS_BUTTON4          (1 << 3) + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void Buttons_Init(void) +			{ +				PORTE.OUTSET    = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2 | BUTTONS_BUTTON3 | BUTTONS_BUTTON4); + +				PORTCFG.MPCMASK = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2 | BUTTONS_BUTTON3 | BUTTONS_BUTTON4); +				PORTE.PIN0CTRL  = (PORT_INVEN_bm | PORT_OPC_PULLUP_gc); +			} + +			static inline void Buttons_Disable(void) +			{ +				PORTE.OUTCLR    = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2 | BUTTONS_BUTTON3 | BUTTONS_BUTTON4); + +				PORTCFG.MPCMASK = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2 | BUTTONS_BUTTON3 | BUTTONS_BUTTON4); +				PORTE.PIN0CTRL  = 0; +			} + +			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Buttons_GetStatus(void) +			{ +				return (PORTE_IN & (BUTTONS_BUTTON1 | BUTTONS_BUTTON2 | BUTTONS_BUTTON3 | BUTTONS_BUTTON4)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h new file mode 100644 index 0000000000..71402661cd --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h @@ -0,0 +1,229 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Dataflash driver header for the Atmel XMEGA B1 Xplained. + *  \copydetails Group_Dataflash_B1_XPLAINED + * + *  \note This file should not be included directly. It is automatically included as needed by the dataflash driver + *        dispatch header located in LUFA/Drivers/Board/Dataflash.h. + */ + +/** \ingroup Group_Dataflash + *  \defgroup Group_Dataflash_B1_XPLAINED B1_XPLAINED + *  \brief Board specific Dataflash driver header for the Atmel XMEGA B1 Xplained. + * + *  Board specific Dataflash driver header for the Atmel XMEGA B1 Xplained board. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Select Pin</th><th>SPI Port</th></tr> + *    <tr><td>DATAFLASH_CHIP1</td><td>AT45DB642D (8MB)</td><td>PORTD.2</td><td>USARTC0 (In SPI Mode, Remapped)</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __DATAFLASH_B1_XPLAINED_H__ +#define __DATAFLASH_B1_XPLAINED_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../../Misc/AT45DB642D.h" +		#include "../../../Peripheral/SerialSPI.h" + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_DATAFLASH_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Dataflash.h instead. +		#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#define DATAFLASH_CHIPCS_MASK                DATAFLASH_CHIP1 +			#define DATAFLASH_CHIPCS_PORT                PORTD +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Constant indicating the total number of dataflash ICs mounted on the selected board. */ +			#define DATAFLASH_TOTALCHIPS                 1 + +			/** Mask for no dataflash chip selected. */ +			#define DATAFLASH_NO_CHIP                    0 + +			/** Mask for the first dataflash chip selected. */ +			#define DATAFLASH_CHIP1                      (1 << 2) + +			/** Internal main memory page size for the board's dataflash ICs. */ +			#define DATAFLASH_PAGE_SIZE                  1024 + +			/** Total number of pages inside each of the board's dataflash ICs. */ +			#define DATAFLASH_PAGES                      8192 + +		/* Inline Functions: */ +			/** Initializes the dataflash driver so that commands and data may be sent to an attached dataflash IC. +			 *  The appropriate SPI interface will be automatically configured. +			 */ +			static inline void Dataflash_Init(void) +			{ +				DATAFLASH_CHIPCS_PORT.DIRSET   = DATAFLASH_CHIPCS_MASK; + +				PORTCFG.MPCMASK                = DATAFLASH_CHIPCS_MASK; +				DATAFLASH_CHIPCS_PORT.PIN0CTRL = PORT_INVEN_bm; + +				SerialSPI_Init(&USARTC0, (USART_SPI_SCK_LEAD_RISING | USART_SPI_SAMPLE_LEADING | USART_SPI_ORDER_MSB_FIRST), (F_CPU / 2)); + +				PORTC.REMAP   |= PORT_USART0_bm; +				PORTC.DIRSET   = PIN7_bm | PIN5_bm; +				PORTC.DIRCLR   = PIN6_bm; +				PORTC.PIN6CTRL = PORT_OPC_PULLUP_gc; +			} + +			/** Sends a byte to the currently selected dataflash IC, and returns a byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline uint8_t Dataflash_TransferByte(const uint8_t Byte) +			{ +				return SerialSPI_TransferByte(&USARTC0, Byte); +			} + +			/** Sends a byte to the currently selected dataflash IC, and ignores the next byte from the dataflash. +			 * +			 *  \param[in] Byte  Byte of data to send to the dataflash +			 */ +			static inline void Dataflash_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SendByte(const uint8_t Byte) +			{ +				SerialSPI_SendByte(&USARTC0, Byte); +			} + +			/** Sends a dummy byte to the currently selected dataflash IC, and returns the next byte from the dataflash. +			 * +			 *  \return Last response byte from the dataflash +			 */ +			static inline uint8_t Dataflash_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_ReceiveByte(void) +			{ +				return SerialSPI_ReceiveByte(&USARTC0); +			} + +			/** Determines the currently selected dataflash chip. +			 * +			 *  \return Mask of the currently selected Dataflash chip, either \ref DATAFLASH_NO_CHIP if no chip is selected +			 *          or a DATAFLASH_CHIPn mask (where n is the chip number). +			 */ +			static inline uint8_t Dataflash_GetSelectedChip(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Dataflash_GetSelectedChip(void) +			{ +				return (DATAFLASH_CHIPCS_PORT.OUT & DATAFLASH_CHIPCS_MASK); +			} + +			/** Selects the given dataflash chip. +			 * +			 *  \param[in]  ChipMask  Mask of the Dataflash IC to select, in the form of a \c DATAFLASH_CHIPn mask (where n is +			 *              the chip number). +			 */ +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_SelectChip(const uint8_t ChipMask) +			{ +				DATAFLASH_CHIPCS_PORT.OUTCLR = DATAFLASH_CHIPCS_MASK; +				DATAFLASH_CHIPCS_PORT.OUTSET = (ChipMask & DATAFLASH_CHIPCS_MASK); +			} + +			/** Deselects the current dataflash chip, so that no dataflash is selected. */ +			static inline void Dataflash_DeselectChip(void) ATTR_ALWAYS_INLINE; +			static inline void Dataflash_DeselectChip(void) +			{ +				Dataflash_SelectChip(DATAFLASH_NO_CHIP); +			} + +			/** Selects a dataflash IC from the given page number, which should range from 0 to +			 *  ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). For boards containing only one +			 *  dataflash IC, this will select DATAFLASH_CHIP1. If the given page number is outside +			 *  the total number of pages contained in the boards dataflash ICs, all dataflash ICs +			 *  are deselected. +			 * +			 *  \param[in] PageAddress  Address of the page to manipulate, ranging from +			 *                          0 to ((DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS) - 1). +			 */ +			static inline void Dataflash_SelectChipFromPage(const uint16_t PageAddress) +			{ +				Dataflash_DeselectChip(); + +				if (PageAddress >= (DATAFLASH_PAGES * DATAFLASH_TOTALCHIPS)) +				  return; + +				Dataflash_SelectChip(DATAFLASH_CHIP1); +			} + +			/** Toggles the select line of the currently selected dataflash IC, so that it is ready to receive +			 *  a new command. +			 */ +			static inline void Dataflash_ToggleSelectedChipCS(void) +			{ +				uint8_t SelectedChipMask = Dataflash_GetSelectedChip(); + +				Dataflash_DeselectChip(); +				Dataflash_SelectChip(SelectedChipMask); +			} + +			/** Spin-loops while the currently selected dataflash is busy executing a command, such as a main +			 *  memory page program or main memory to buffer transfer. +			 */ +			static inline void Dataflash_WaitWhileBusy(void) +			{ +				Dataflash_ToggleSelectedChipCS(); +				Dataflash_SendByte(DF_CMD_GETSTATUS); +				while (!(Dataflash_ReceiveByte() & DF_STATUS_READY)); +				Dataflash_ToggleSelectedChipCS(); +			} + +			/** Sends a set of page and buffer address bytes to the currently selected dataflash IC, for use with +			 *  dataflash commands which require a complete 24-bit address. +			 * +			 *  \param[in] PageAddress  Page address within the selected dataflash IC +			 *  \param[in] BufferByte   Address within the dataflash's buffer +			 */ +			static inline void Dataflash_SendAddressBytes(uint16_t PageAddress, +			                                              const uint16_t BufferByte) +			{ +				Dataflash_SendByte(PageAddress >> 5); +				Dataflash_SendByte((PageAddress << 3) | (BufferByte >> 8)); +				Dataflash_SendByte(BufferByte); +			} + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h new file mode 100644 index 0000000000..078532ac4f --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h @@ -0,0 +1,183 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Atmel XMEGA B1 Xplained. + *  \copydetails Group_LEDs_B1_XPLAINED + * + *  \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_B1_XPLAINED B1_XPLAINED + *  \brief Board specific LED driver header for the Atmel XMEGA B1 Xplained. + * + *  Board specific LED driver header for the Atmel XMEGA B1 Xplained. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>LED0 LED</td><td>High</td><td>PORTB.4</td></tr> + *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>LED1 LED</td><td>High</td><td>PORTB.5</td></tr> + *    <tr><td>LEDS_LED3</td><td>Yellow</td><td>LED2 LED</td><td>High</td><td>PORTB.6</td></tr> + *    <tr><td>LEDS_LED4</td><td>Yellow</td><td>LED3 LED</td><td>High</td><td>PORTB.7</td></tr> + *    <tr><td>LEDS_LED5</td><td>Green</td><td>USB LED</td><td>Low</td><td>PORTE.4</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_B1_XPLAINED_H__ +#define __LEDS_B1_XPLAINED_H__ + +	/* Includes: */ +		#include <avr/io.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_PORTB_LEDS        (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4) +			#define LEDS_PORTE_LEDS        LEDS_LED5 + +			#define LEDS_PORTE_MASK_SHIFT  1 +	#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 the second LED on the board. */ +			#define LEDS_LED2        (1 << 5) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        (1 << 6) + +			/** LED mask for the fourth LED on the board. */ +			#define LEDS_LED4        (1 << 7) + +			/** LED mask for the fifth LED on the board. */ +			#define LEDS_LED5       ((1 << 4) >> LEDS_PORTE_MASK_SHIFT) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4 | LEDS_LED5) + +			/** LED mask for none of the board LEDs. */ +			#define LEDS_NO_LEDS     0 + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void LEDs_Init(void) +			{ +				PORTB.DIRSET    = LEDS_PORTB_LEDS; +				PORTB.OUTCLR    = LEDS_PORTB_LEDS; + +				PORTCFG.MPCMASK = LEDS_PORTB_LEDS; +				PORTB.PIN0CTRL  = PORT_INVEN_bm; + +				PORTE.DIRSET    = (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT); +				PORTE.OUTCLR    = (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT); +			} + +			static inline void LEDs_Disable(void) +			{ +				PORTB.DIRCLR    = LEDS_PORTB_LEDS; +				PORTB.OUTCLR    = LEDS_PORTB_LEDS; + +				PORTCFG.MPCMASK = 0; +				PORTB.PIN0CTRL  = LEDS_PORTB_LEDS; + +				PORTE.DIRCLR    = (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT); +				PORTE.OUTCLR    = (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT); +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTB_OUTSET = (LEDMask & LEDS_PORTB_LEDS); +				PORTE_OUTSET = ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT); +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTB_OUTCLR = (LEDMask & LEDS_PORTB_LEDS); +				PORTE_OUTCLR = ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT); +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTB_OUTCLR = LEDS_PORTB_LEDS; +				PORTE_OUTCLR = (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT); + +				PORTB_OUTSET = (LEDMask & LEDS_PORTB_LEDS); +				PORTE_OUTSET = ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTB_OUTCLR =  (LEDMask & LEDS_PORTB_LEDS); +				PORTE_OUTCLR = ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT); + +				PORTB_OUTSET =  (ActiveMask & LEDS_PORTB_LEDS); +				PORTE_OUTSET = ((ActiveMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PORTB_OUTTGL = (LEDMask & LEDS_PORTB_LEDS); +				PORTE_OUTTGL = ((LEDMask & LEDS_PORTE_LEDS) << LEDS_PORTE_MASK_SHIFT); +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return ((PORTB_OUT & LEDS_PORTB_LEDS) | (PORTE_OUT & (LEDS_PORTE_LEDS << LEDS_PORTE_MASK_SHIFT))); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Board.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Board.h new file mode 100644 index 0000000000..e48bd5836f --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Board.h @@ -0,0 +1,83 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific information header for the Atmel XMEGA C3 Xplained. + *  \copydetails Group_BoardInfo_C3_XPLAINED + * + *  \note This file should not be included directly. It is automatically included as needed by the Board driver + *        dispatch header located in LUFA/Drivers/Board/Board.h. + */ + +/** \ingroup Group_BoardInfo + *  \defgroup Group_BoardInfo_C3_XPLAINED C3_XPLAINED + *  \brief Board specific information header for the Atmel XMEGA C3 Xplained. + * + *  Board specific information header for the Atmel XMEGA C3 Xplained. + * + *  @{ + */ + +#ifndef __BOARD_C3_XPLAINED_H__ +#define __BOARD_C3_XPLAINED_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../../Buttons.h" +		#include "../../Dataflash.h" +		#include "../../LEDs.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_BOARD_H) +			#error Do not include this file directly. Include LUFA/Drivers/Board/Board.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Indicates the board has hardware Buttons mounted. */ +			#define BOARD_HAS_BUTTONS + +			/** Indicates the board has hardware LEDs mounted. */ +			#define BOARD_HAS_LEDS + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h new file mode 100644 index 0000000000..1a8c1fc7e9 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h @@ -0,0 +1,109 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific Buttons driver header for the Atmel XMEGA C3 Xplained. + *  \copydetails Group_Buttons_C3_XPLAINED + * + *  \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_C3_XPLAINED C3_XPLAINED + *  \brief Board specific Buttons driver header for the Atmel XMEGA C3 Xplained. + * + *  Board specific Buttons driver header for the Atmel XMEGA C3 Xplained. + * + *  <table> + *    <tr><th>Name</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>BUTTONS_BUTTON1</td><td>SW0 Button</td><td>Low</td><td>PORTF.1</td></tr> + *    <tr><td>BUTTONS_BUTTON2</td><td>SW1 Button</td><td>Low</td><td>PORTF.2</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __BUTTONS_C3_XPLAINED_H__ +#define __BUTTONS_C3_XPLAINED_H__ + +	/* Includes: */ +		#include <avr/io.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 << 1) + +			/** Button mask for the second button on the board. */ +			#define BUTTONS_BUTTON2          (1 << 2) + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void Buttons_Init(void) +			{ +				PORTF.OUTCLR   = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2); +				PORTF.PIN1CTRL = (PORT_OPC_PULLUP_gc | PORT_INVEN_bm); +				PORTF.PIN2CTRL = (PORT_OPC_PULLUP_gc | PORT_INVEN_bm); +			} + +			static inline void Buttons_Disable(void) +			{ +				PORTF.OUTCLR   = (BUTTONS_BUTTON1 | BUTTONS_BUTTON2); +				PORTF.PIN1CTRL = 0; +				PORTF.PIN2CTRL = 0; +			} + +			static inline uint8_t Buttons_GetStatus(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t Buttons_GetStatus(void) +			{ +				return (PORTF_IN & (BUTTONS_BUTTON1 | BUTTONS_BUTTON2)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h b/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h new file mode 100644 index 0000000000..f701c883e1 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h @@ -0,0 +1,181 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Board specific LED driver header for the Atmel XMEGA C3 Xplained. + *  \copydetails Group_LEDs_C3_XPLAINED + * + *  \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_C3_XPLAINED C3_XPLAINED + *  \brief Board specific LED driver header for the Atmel XMEGA C3 Xplained. + * + *  Board specific LED driver header for the Atmel XMEGA C3 Xplained. + * + *  <table> + *    <tr><th>Name</th><th>Color</th><th>Info</th><th>Active Level</th><th>Port Pin</th></tr> + *    <tr><td>LEDS_LED1</td><td>Yellow</td><td>LED0 LED</td><td>Low</td><td>PORTR.0</td></tr> + *    <tr><td>LEDS_LED2</td><td>Yellow</td><td>LED1 LED</td><td>Low</td><td>PORTR.1</td></tr> + *    <tr><td>LEDS_LED3</td><td>Red</td><td>Status Bicolour Red LED</td><td>Low</td><td>PORTD.4</td></tr> + *    <tr><td>LEDS_LED4</td><td>Green</td><td>Status Bicolour Green LED</td><td>High</td><td>PORTD.5</td></tr> + *  </table> + * + *  @{ + */ + +#ifndef __LEDS_C3_XPLAINED_H__ +#define __LEDS_C3_XPLAINED_H__ + +	/* Includes: */ +		#include <avr/io.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_PORTR_LEDS       (LEDS_LED1 | LEDS_LED2) +			#define LEDS_PORTD_LEDS       (LEDS_LED3 | LEDS_LED4) +	#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 the second LED on the board. */ +			#define LEDS_LED2        (1 << 1) + +			/** LED mask for the third LED on the board. */ +			#define LEDS_LED3        (1 << 4) + +			/** LED mask for the fourth LED on the board. */ +			#define LEDS_LED4        (1 << 5) + +			/** LED mask for all the LEDs on the board. */ +			#define LEDS_ALL_LEDS    (LEDS_LED1 | LEDS_LED2 | LEDS_LED3 | LEDS_LED4) + +			/** LED mask for none of the board LEDs. */ +			#define LEDS_NO_LEDS     0 + +		/* Inline Functions: */ +		#if !defined(__DOXYGEN__) +			static inline void LEDs_Init(void) +			{ +				PORTR.DIRSET    = LEDS_PORTR_LEDS; +				PORTR.OUTCLR    = LEDS_PORTR_LEDS; + +				PORTCFG.MPCMASK = LEDS_PORTR_LEDS; +				PORTR.PIN0CTRL  = PORT_INVEN_bm; + +				PORTD.DIRSET    = LEDS_PORTD_LEDS; +				PORTD.OUTCLR    = LEDS_PORTD_LEDS; + +				PORTD.PIN4CTRL  = PORT_INVEN_bm; +			} + +			static inline void LEDs_Disable(void) +			{ +				PORTR.DIRCLR    = LEDS_PORTR_LEDS; +				PORTR.OUTCLR    = LEDS_PORTR_LEDS; + +				PORTCFG.MPCMASK = 0; +				PORTR.PIN0CTRL  = LEDS_PORTR_LEDS; + +				PORTD.DIRCLR    = LEDS_PORTD_LEDS; +				PORTD.OUTCLR    = LEDS_PORTD_LEDS; + +				PORTD.PIN4CTRL  = 0; +			} + +			static inline void LEDs_TurnOnLEDs(const uint8_t LEDMask) +			{ +				PORTR_OUTSET = LEDMask & LEDS_PORTR_LEDS; +				PORTD_OUTSET = LEDMask & LEDS_PORTD_LEDS; +			} + +			static inline void LEDs_TurnOffLEDs(const uint8_t LEDMask) +			{ +				PORTR_OUTCLR = LEDMask & LEDS_PORTR_LEDS; +				PORTD_OUTCLR = LEDMask & LEDS_PORTD_LEDS; +			} + +			static inline void LEDs_SetAllLEDs(const uint8_t LEDMask) +			{ +				PORTR_OUTCLR = LEDS_PORTR_LEDS; +				PORTD_OUTCLR = LEDS_PORTD_LEDS; + +				PORTR_OUTSET = (LEDMask & LEDS_PORTR_LEDS); +				PORTD_OUTSET = (LEDMask & LEDS_PORTD_LEDS); +			} + +			static inline void LEDs_ChangeLEDs(const uint8_t LEDMask, +			                                   const uint8_t ActiveMask) +			{ +				PORTR_OUTCLR = (LEDMask & LEDS_PORTR_LEDS); +				PORTD_OUTCLR = (LEDMask & LEDS_PORTD_LEDS); + +				PORTR_OUTSET = (ActiveMask & LEDS_PORTR_LEDS); +				PORTD_OUTSET = (ActiveMask & LEDS_PORTD_LEDS); +			} + +			static inline void LEDs_ToggleLEDs(const uint8_t LEDMask) +			{ +				PORTR_OUTTGL = (LEDMask & LEDS_PORTR_LEDS); +				PORTD_OUTTGL = (LEDMask & LEDS_PORTD_LEDS); +			} + +			static inline uint8_t LEDs_GetLEDs(void) ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t LEDs_GetLEDs(void) +			{ +				return ((PORTR_OUT & LEDS_PORTR_LEDS) | (PORTD_OUT & LEDS_PORTD_LEDS)); +			} +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Misc/AT45DB321C.h b/lib/lufa/LUFA/Drivers/Misc/AT45DB321C.h new file mode 100644 index 0000000000..e354ca47be --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Misc/AT45DB321C.h @@ -0,0 +1,100 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Command constants for the Atmel AT45DB321C Dataflash. + *  \copydetails Group_AT45DB321C + */ + +/** \ingroup Group_MiscDrivers + *  \defgroup Group_AT45DB321C Atmel AT45DB321C Dataflash Commands - LUFA/Drivers/Misc/AT45DB321C.h + *  \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) +			//@} + +			/** \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 +			//@} + +			/** Manufacturer code for Atmel Corporation, returned by Atmel Dataflash ICs in response to the \c DF_CMD_READMANUFACTURERDEVICEINFO command. */ +			#define DF_MANUFACTURER_ATMEL                   0x1F + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Misc/AT45DB642D.h b/lib/lufa/LUFA/Drivers/Misc/AT45DB642D.h new file mode 100644 index 0000000000..76a7a5cb6c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Misc/AT45DB642D.h @@ -0,0 +1,116 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Command constants for the Atmel AT45DB642D Dataflash. + *  \copydetails Group_AT45DB642D + */ + +/** \ingroup Group_MiscDrivers + *  \defgroup Group_AT45DB642D Atmel AT45DB642D Dataflash Commands - LUFA/Drivers/Misc/AT45DB642D.h + *  \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) +			//@} + +			/** \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_BINARYPAGESIZEMODEON             ((char[]){0x3D, 0x2A, 0x80, 0xA6}) +			#define DF_CMD_BINARYPAGESIZEMODEON_BYTE1       0x3D +			#define DF_CMD_BINARYPAGESIZEMODEON_BYTE2       0x2A +			#define DF_CMD_BINARYPAGESIZEMODEON_BYTE3       0x80 +			#define DF_CMD_BINARYPAGESIZEMODEON_BYTE4       0xA6 + +			#define DF_CMD_READMANUFACTURERDEVICEINFO       0x9F +			//@} + +			/** Manufacturer code for Atmel Corporation, returned by Atmel Dataflash ICs in response to the \c DF_CMD_READMANUFACTURERDEVICEINFO command. */ +			#define DF_MANUFACTURER_ATMEL                   0x1F + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Misc/RingBuffer.h b/lib/lufa/LUFA/Drivers/Misc/RingBuffer.h new file mode 100644 index 0000000000..0e76a0779a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Misc/RingBuffer.h @@ -0,0 +1,308 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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_RingBuff_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - None + * + *  \section Sec_RingBuff_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_RingBuff_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. */ +			uint16_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, \c 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, \c 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. +		 * +		 *  \warning 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. +		 * +		 *  \warning 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/lib/lufa/LUFA/Drivers/Misc/TerminalCodes.h b/lib/lufa/LUFA/Drivers/Misc/TerminalCodes.h new file mode 100644 index 0000000000..b12a247ed1 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Misc/TerminalCodes.h @@ -0,0 +1,231 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief ANSI terminal special escape code macros. + * + *  ANSI terminal compatible escape sequences. These escape sequences are designed to be concatenated with existing + *  strings to modify their display on a compatible terminal application. + */ + +/** \ingroup Group_MiscDrivers + *  \defgroup Group_Terminal ANSI Terminal Escape Codes - LUFA/Drivers/Misc/TerminalCodes.h + *  \brief ANSI terminal special escape code macros. + * + *  \section Sec_Terminal_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - None + * + *  \section Sec_Terminal_ModDescription Module Description + *  Escape code macros for ANSI compliant text terminals. + * + *  \note If desired, the macro \c DISABLE_TERMINAL_CODES can be defined in the project makefile and passed to the GCC + *        compiler via the -D switch to disable the terminal codes without modifying the source, for use with non + *        compatible terminals (any terminal codes then equate to empty strings). + * + *  \section Sec_Terminal_ExampleUsage Example Usage + *  The following snippet is an example of how this module may be used within a typical + *  application. + * + *  \code + *      printf("Normal String, " + *             ESC_BOLD_ON "Bold String, " + *             ESC_UNDERLINE_ON "Bold and Underlined String" + *             ESC_RESET ESC_FG_BLUE ESC_BG_YELLOW "Normal Blue-on-Yellow String"); + *  \endcode + * + *  @{ + */ + +#ifndef __TERMINALCODES_H__ +#define __TERMINALCODES_H__ + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			#if !defined(DISABLE_TERMINAL_CODES) +				/** Creates an ANSI escape sequence with the specified payload. +				 * +				 *  \param[in] EscapeSeq  Payload to encode as an ANSI escape sequence, a \c ESC_* mask. +				 */ +				#define ANSI_ESCAPE_SEQUENCE(EscapeSeq)  "\33[" EscapeSeq +			#else +				#define ANSI_ESCAPE_SEQUENCE(EscapeSeq) +			#endif + +			/** \name Text Display Modifier Control Sequences */ +			//@{ +			/** Turns on bold so that any following text is printed to the terminal in bold. */ +			#define ESC_BOLD_ON                     ANSI_ESCAPE_SEQUENCE("1m") + +			/** Turns on italics so that any following text is printed to the terminal in italics. */ +			#define ESC_ITALICS_ON                  ANSI_ESCAPE_SEQUENCE("3m") + +			/** Turns on underline so that any following text is printed to the terminal underlined. */ +			#define ESC_UNDERLINE_ON                ANSI_ESCAPE_SEQUENCE("4m") + +			/** Turns on inverse so that any following text is printed to the terminal in inverted colours. */ +			#define ESC_INVERSE_ON                  ANSI_ESCAPE_SEQUENCE("7m") + +			/** Turns on strike-through so that any following text is printed to the terminal with a line through the +			 *  center. +			 */ +			#define ESC_STRIKETHROUGH_ON            ANSI_ESCAPE_SEQUENCE("9m") + +			/** Turns off bold so that any following text is printed to the terminal in non bold. */ +			#define ESC_BOLD_OFF                    ANSI_ESCAPE_SEQUENCE("22m") + +			/** Turns off italics so that any following text is printed to the terminal in non italics. */ +			#define ESC_ITALICS_OFF                 ANSI_ESCAPE_SEQUENCE("23m") + +			/** Turns off underline so that any following text is printed to the terminal non underlined. */ +			#define ESC_UNDERLINE_OFF               ANSI_ESCAPE_SEQUENCE("24m") + +			/** Turns off inverse so that any following text is printed to the terminal in non inverted colours. */ +			#define ESC_INVERSE_OFF                 ANSI_ESCAPE_SEQUENCE("27m") + +			/** Turns off strike-through so that any following text is printed to the terminal without a line through +			 *  the center. +			 */ +			#define ESC_STRIKETHROUGH_OFF           ANSI_ESCAPE_SEQUENCE("29m") +			//@} + +			/** \name Text Colour Control Sequences */ +			//@{ +			/** Sets the foreground (text) colour to black. */ +			#define ESC_FG_BLACK                    ANSI_ESCAPE_SEQUENCE("30m") + +			/** Sets the foreground (text) colour to red. */ +			#define ESC_FG_RED                      ANSI_ESCAPE_SEQUENCE("31m") + +			/** Sets the foreground (text) colour to green. */ +			#define ESC_FG_GREEN                    ANSI_ESCAPE_SEQUENCE("32m") + +			/** Sets the foreground (text) colour to yellow. */ +			#define ESC_FG_YELLOW                   ANSI_ESCAPE_SEQUENCE("33m") + +			/** Sets the foreground (text) colour to blue. */ +			#define ESC_FG_BLUE                     ANSI_ESCAPE_SEQUENCE("34m") + +			/** Sets the foreground (text) colour to magenta. */ +			#define ESC_FG_MAGENTA                  ANSI_ESCAPE_SEQUENCE("35m") + +			/** Sets the foreground (text) colour to cyan. */ +			#define ESC_FG_CYAN                     ANSI_ESCAPE_SEQUENCE("36m") + +			/** Sets the foreground (text) colour to white. */ +			#define ESC_FG_WHITE                    ANSI_ESCAPE_SEQUENCE("37m") + +			/** Sets the foreground (text) colour to the terminal's default. */ +			#define ESC_FG_DEFAULT                  ANSI_ESCAPE_SEQUENCE("39m") + +			/** Sets the text background colour to black. */ +			#define ESC_BG_BLACK                    ANSI_ESCAPE_SEQUENCE("40m") + +			/** Sets the text background colour to red. */ +			#define ESC_BG_RED                      ANSI_ESCAPE_SEQUENCE("41m") + +			/** Sets the text background colour to green. */ +			#define ESC_BG_GREEN                    ANSI_ESCAPE_SEQUENCE("42m") + +			/** Sets the text background colour to yellow. */ +			#define ESC_BG_YELLOW                   ANSI_ESCAPE_SEQUENCE("43m") + +			/** Sets the text background colour to blue. */ +			#define ESC_BG_BLUE                     ANSI_ESCAPE_SEQUENCE("44m") + +			/** Sets the text background colour to magenta. */ +			#define ESC_BG_MAGENTA                  ANSI_ESCAPE_SEQUENCE("45m") + +			/** Sets the text background colour to cyan. */ +			#define ESC_BG_CYAN                     ANSI_ESCAPE_SEQUENCE("46m") + +			/** Sets the text background colour to white. */ +			#define ESC_BG_WHITE                    ANSI_ESCAPE_SEQUENCE("47m") + +			/** Sets the text background colour to the terminal's default. */ +			#define ESC_BG_DEFAULT                  ANSI_ESCAPE_SEQUENCE("49m") +			//@} + +			/** \name Cursor Positioning Control Sequences */ +			//@{ +			/** Saves the current cursor position so that it may be restored with \ref ESC_CURSOR_POS_RESTORE. */ +			#define ESC_CURSOR_POS_SAVE             ANSI_ESCAPE_SEQUENCE("s") + +			/** Restores the cursor position to the last position saved with \ref ESC_CURSOR_POS_SAVE. */ +			#define ESC_CURSOR_POS_RESTORE          ANSI_ESCAPE_SEQUENCE("u") + +			/** Sets the cursor position to the given line and column. +			 * +			 *  \param[in] Line    Line number to position the cursor at. +			 *  \param[in] Column  Column number to position the cursor at. +			 */ +			#define ESC_CURSOR_POS(Line, Column)    ANSI_ESCAPE_SEQUENCE(#Line ";" #Column "H") + +			/** Moves the cursor up the given number of lines. +			 * +			 *  \param[in] Lines  Number of lines to move the cursor position +			 */ +			#define ESC_CURSOR_UP(Lines)            ANSI_ESCAPE_SEQUENCE(#Lines "A") + +			/** Moves the cursor down the given number of lines. +			 * +			 *  \param[in] Lines  Number of lines to move the cursor position +			 */ +			#define ESC_CURSOR_DOWN(Lines)          ANSI_ESCAPE_SEQUENCE(#Lines "B") + +			/** Moves the cursor to the right the given number of columns. +			 * +			 *  \param[in] Columns  Number of columns to move the cursor position +			 */ +			#define ESC_CURSOR_FORWARD(Columns)     ANSI_ESCAPE_SEQUENCE(#Columns "C") + +			/** Moves the cursor to the left the given number of columns. +			 * +			 *  \param[in] Columns  Number of columns to move the cursor position +			 */ +			#define ESC_CURSOR_BACKWARD(Columns)    ANSI_ESCAPE_SEQUENCE(#Columns "D") +			//@} + +			/** \name Miscellaneous Control Sequences */ +			//@{ +			/** Resets any escape sequence modifiers back to their defaults. */ +			#define ESC_RESET                       ANSI_ESCAPE_SEQUENCE("0m") + +			/** Erases the entire display, returning the cursor to the top left. */ +			#define ESC_ERASE_DISPLAY               ANSI_ESCAPE_SEQUENCE("2J") + +			/** Erases the current line, returning the cursor to the far left. */ +			#define ESC_ERASE_LINE                  ANSI_ESCAPE_SEQUENCE("K") +			//@} + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Peripheral/ADC.h b/lib/lufa/LUFA/Drivers/Peripheral/ADC.h new file mode 100644 index 0000000000..a0182b3c77 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/ADC.h @@ -0,0 +1,75 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Hardware Analogue-to-Digital converter driver. + * + *  This file is the master dispatch header file for the device-specific ADC driver, for microcontrollers + *  containing an ADC. + * + *  User code should include this file, which will in turn include the correct ADC driver header file for the + *  currently selected architecture and microcontroller model. + */ + +/** \ingroup Group_PeripheralDrivers + *  \defgroup Group_ADC ADC Driver - LUFA/Drivers/Peripheral/ADC.h + *  \brief Hardware Analogue-to-Digital converter driver. + * + *  \section Sec_ADC_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - None + * + *  \section Sec_ADC_ModDescription Module Description + *  Hardware ADC driver. This module provides an easy to use driver for the hardware ADC + *  present on many microcontrollers, for the conversion of analogue signals into the + *  digital domain. + * + *  \note The exact API for this driver may vary depending on the target used - see + *        individual target module documentation for the API specific to your target processor. + */ + +#ifndef __ADC_H__ +#define __ADC_H__ + +	/* Macros: */ +		#define __INCLUDE_FROM_ADC_H + +	/* Includes: */ +		#include "../../Common/Common.h" + +	/* Includes: */ +		#if (ARCH == ARCH_AVR8) +			#include "AVR8/ADC_AVR8.h" +		#else +			#error The ADC peripheral driver is not currently available for your selected architecture. +		#endif + +#endif + diff --git a/lib/lufa/LUFA/Drivers/Peripheral/AVR8/ADC_AVR8.h b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/ADC_AVR8.h new file mode 100644 index 0000000000..a2b7eded3d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/ADC_AVR8.h @@ -0,0 +1,446 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief ADC Peripheral Driver (AVR8) + * + *  On-chip Analogue-to-Digital converter (ADC) driver for supported U4, U6 and U7 model AVRs that contain an ADC + *  peripheral internally. + * + *  \note This file should not be included directly. It is automatically included as needed by the ADC driver + *        dispatch header located in LUFA/Drivers/Peripheral/ADC.h. + */ + +/** \ingroup Group_ADC + *  \defgroup Group_ADC_AVR8 ADC Peripheral Driver (AVR8) + * + *  \section Sec_ADC_AVR8_ModDescription Module Description + *  On-chip Analogue-to-Digital converter (ADC) driver for supported U4, U6 and U7 model AVRs that contain an ADC + *  peripheral internally. + * + *  \note This file should not be included directly. It is automatically included as needed by the ADC driver + *        dispatch header located in LUFA/Drivers/Peripheral/ADC.h. + * + *  \section Sec_ADC_AVR8_ExampleUsage Example Usage + *  The following snippet is an example of how this module may be used within a typical + *  application. + * + *  \code + *      // Initialize the ADC driver before first use + *      ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_32); + * + *      // Must setup the ADC channel to read beforehand + *      ADC_SetupChannel(1); + * + *      // Perform a single conversion of the ADC channel 1 + *      ADC_GetChannelReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | ADC_CHANNEL1); + *      printf("Conversion Result: %d\r\n", ADC_GetResult()); + * + *      // Start reading ADC channel 1 in free running (continuous conversion) mode + *      ADC_StartReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | ADC_CHANNEL1); + *      for (;;) + *      { + *           while (!(ADC_IsReadingComplete())) {}; + *           printf("Conversion Result: %d\r\n", ADC_GetResult()); + *      } + *  \endcode + * + *  @{ + */ + +#ifndef __ADC_AVR8_H__ +#define __ADC_AVR8_H__ + +	/* Includes: */ +		#include "../../../Common/Common.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_ADC_H) +			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/ADC.h instead. +		#endif + +		#if !(defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \ +		      defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \ +			  defined(__AVR_ATmega16U4__)  || defined(__AVR_ATmega32U4__)) +			#error The ADC peripheral driver is not currently available for your selected microcontroller model. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** \name ADC Reference Configuration Masks */ +			//@{ +			/** Reference mask, for using the voltage present at the AVR's AREF pin for the ADC reference. */ +			#define ADC_REFERENCE_AREF              0 + +			/** Reference mask, for using the voltage present at the AVR's AVCC pin for the ADC reference. */ +			#define ADC_REFERENCE_AVCC              (1 << REFS0) + +			/** Reference mask, for using the internally generated 2.56V reference voltage as the ADC reference. */ +			#define ADC_REFERENCE_INT2560MV         ((1 << REFS1) | (1 << REFS0)) +			//@} + +			/** \name ADC Result Adjustment Configuration Masks */ +			//@{ +			/** Left-adjusts the 10-bit ADC result, so that the upper 8 bits of the value returned by the +			 *  \ref ADC_GetResult() macro contain the 8 most significant bits of the result. +			 */ +			#define ADC_LEFT_ADJUSTED               (1 << ADLAR) + +			/** Right-adjusts the 10-bit ADC result, so that the lower 8 bits of the value returned by the +			 *  \ref ADC_GetResult() macro contain the 8 least significant bits of the result. +			 */ +			#define ADC_RIGHT_ADJUSTED              (0 << ADLAR) +			//@} + +			/** \name ADC Mode Configuration Masks */ +			//@{ +			/** Sets the ADC mode to free running, so that conversions take place continuously as fast as the ADC +			 *  is capable of at the given input clock speed. +			 */ +			#define ADC_FREE_RUNNING                (1 << ADATE) + +			/** Sets the ADC mode to single conversion, so that only a single conversion will take place before +			 *  the ADC returns to idle. +			 */ +			#define ADC_SINGLE_CONVERSION           (0 << ADATE) +			//@} + +			/** \name ADC Prescaler Configuration Masks */ +			//@{ +			/** Sets the ADC input clock to prescale by a factor of 2 the AVR's system clock. */ +			#define ADC_PRESCALE_2                  (1 << ADPS0) + +			/** Sets the ADC input clock to prescale by a factor of 4 the AVR's system clock. */ +			#define ADC_PRESCALE_4                  (1 << ADPS1) + +			/** Sets the ADC input clock to prescale by a factor of 8 the AVR's system clock. */ +			#define ADC_PRESCALE_8                  ((1 << ADPS0) | (1 << ADPS1)) + +			/** Sets the ADC input clock to prescale by a factor of 16 the AVR's system clock. */ +			#define ADC_PRESCALE_16                 (1 << ADPS2) + +			/** Sets the ADC input clock to prescale by a factor of 32 the AVR's system clock. */ +			#define ADC_PRESCALE_32                 ((1 << ADPS2) | (1 << ADPS0)) + +			/** Sets the ADC input clock to prescale by a factor of 64 the AVR's system clock. */ +			#define ADC_PRESCALE_64                 ((1 << ADPS2) | (1 << ADPS1)) + +			/** Sets the ADC input clock to prescale by a factor of 128 the AVR's system clock. */ +			#define ADC_PRESCALE_128                ((1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0)) +			//@} + +			/** \name ADC MUX Masks */ +			//@{ +			/** MUX mask define for the ADC0 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */ +			#define ADC_CHANNEL0                    (0x00 << MUX0) + +			/** MUX mask define for the ADC1 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */ +			#define ADC_CHANNEL1                    (0x01 << MUX0) + +			#if (!(defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)) || defined(__DOXYGEN__)) +				/** MUX mask define for the ADC2 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). +				 * +				 *  \note Not available on all AVR models. +				 */ +				#define ADC_CHANNEL2                (0x02 << MUX0) + +				/** MUX mask define for the ADC3 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). +				 * +				 *  \note Not available on all AVR models. +				 */ +				#define ADC_CHANNEL3                (0x03 << MUX0) +			#endif + +			/** MUX mask define for the ADC4 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */ +			#define ADC_CHANNEL4                    (0x04 << MUX0) + +			/** MUX mask define for the ADC5 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */ +			#define ADC_CHANNEL5                    (0x05 << MUX0) + +			/** MUX mask define for the ADC6 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */ +			#define ADC_CHANNEL6                    (0x06 << MUX0) + +			/** MUX mask define for the ADC7 channel of the ADC. See \ref ADC_StartReading and \ref ADC_GetChannelReading. */ +			#define ADC_CHANNEL7                    (0x07 << MUX0) + +			#if (defined(__AVR_ATmega16U4__)  || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__)) +				/** MUX mask define for the ADC8 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). +				 * +				 *  \note Not available on all AVR models. +				 */ +				#define ADC_CHANNEL8                ((1 << 8) | (0x00 << MUX0)) + +				/** MUX mask define for the ADC9 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). +				 * +				 *  \note Not available on all AVR models. +				 */ +				#define ADC_CHANNEL9                ((1 << 8) | (0x01 << MUX0)) + +				/** MUX mask define for the ADC10 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). +				 * +				 *  \note Not available on all AVR models. +				 */ +				#define ADC_CHANNEL10               ((1 << 8) | (0x02 << MUX0)) + +				/** MUX mask define for the ADC11 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). +				 * +				 *  \note Not available on all AVR models. +				 */ +				#define ADC_CHANNEL11               ((1 << 8) | (0x03 << MUX0)) + +				/** MUX mask define for the ADC12 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). +				 * +				 *  \note Not available on all AVR models. +				 */ +				#define ADC_CHANNEL12               ((1 << 8) | (0x04 << MUX0)) + +				/** MUX mask define for the ADC13 channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). +				 * +				 *  \note Not available on all AVR models. +				 */ +				#define ADC_CHANNEL13               ((1 << 8) | (0x05 << MUX0)) + +				/** MUX mask define for the internal temperature sensor channel of the ADC. See \ref ADC_StartReading() and +				 *  \ref ADC_GetChannelReading(). +				 * +				 *  \note Not available on all AVR models. +				 */ +				#define ADC_INT_TEMP_SENS           ((1 << 8) | (0x07 << MUX0)) +			#endif + +			/** MUX mask define for the internal 1.1V band-gap channel of the ADC. See \ref ADC_StartReading() and \ref ADC_GetChannelReading(). */ +			#define ADC_1100MV_BANDGAP              (0x1E << MUX0) + +			/** Retrieves the ADC MUX mask for the given ADC channel number. +			 * +			 *  \attention This macro will only work correctly on channel numbers that are compile-time +			 *             constants defined by the preprocessor. +			 * +			 *  \param[in] Channel  Index of the ADC channel whose MUX mask is to be retrieved. +			 */ +			#define ADC_GET_CHANNEL_MASK(Channel)   CONCAT_EXPANDED(ADC_CHANNEL, Channel) +			//@} + +		/* Inline Functions: */ +			/** Configures the given ADC channel, ready for ADC conversions. This function sets the +			 *  associated port pin as an input and disables the digital portion of the I/O to reduce +			 *  power consumption. +			 * +			 *  \note This must only be called for ADC channels with are connected to a physical port +			 *        pin of the AVR, denoted by its special alternative function ADCx. +			 * +			 *  \warning The channel number must be specified as an integer, and <b>not</b> a \c ADC_CHANNEL* mask. +			 * +			 *  \param[in] ChannelIndex  ADC channel number to set up for conversions. +			 */ +			static inline void ADC_SetupChannel(const uint8_t ChannelIndex) +			{ +				#if (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \ +					 defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__)) +				DDRF  &= ~(1 << ChannelIndex); +				DIDR0 |=  (1 << ChannelIndex); +				#elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)) +				if (ChannelIndex < 8) +				{ +					DDRF  &= ~(1 << ChannelIndex); +					DIDR0 |=  (1 << ChannelIndex); +				} +				else if (ChannelIndex == 8) +				{ +					DDRD  &= ~(1 << 4); +					DIDR2 |=  (1 << 0); +				} +				else if (ChannelIndex < 11) +				{ +					DDRD  &= ~(1 << (ChannelIndex - 3)); +					DIDR2 |=  (1 << (ChannelIndex - 8)); +				} +				else +				{ +					DDRB  &= ~(1 << (ChannelIndex - 7)); +					DIDR2 |=  (1 << (ChannelIndex - 8)); +				} +				#endif +			} + +			/** De-configures the given ADC channel, re-enabling digital I/O mode instead of analog. This +			 *  function sets the associated port pin as an input and re-enabled the digital portion of +			 *  the I/O. +			 * +			 *  \note This must only be called for ADC channels with are connected to a physical port +			 *        pin of the AVR, denoted by its special alternative function ADCx. +			 * +			 *  \warning The channel number must be specified as an integer, and <b>not</b> a \c ADC_CHANNEL* mask. +			 * +			 *  \param[in] ChannelIndex  ADC channel number to set up for conversions. +			 */ +			static inline void ADC_DisableChannel(const uint8_t ChannelIndex) +			{ +				#if (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \ +					 defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__)) +				DDRF  &= ~(1 << ChannelIndex); +				DIDR0 &= ~(1 << ChannelIndex); +				#elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)) +				if (ChannelIndex < 8) +				{ +					DDRF  &= ~(1 << ChannelIndex); +					DIDR0 &= ~(1 << ChannelIndex); +				} +				else if (ChannelIndex == 8) +				{ +					DDRD  &= ~(1 << 4); +					DIDR2 &= ~(1 << 0); +				} +				else if (ChannelIndex < 11) +				{ +					DDRD  &= ~(1 << (ChannelIndex - 3)); +					DIDR2 &= ~(1 << (ChannelIndex - 8)); +				} +				else +				{ +					DDRB  &= ~(1 << (ChannelIndex - 7)); +					DIDR2 &= ~(1 << (ChannelIndex - 8)); +				} +				#endif +			} + +			/** Starts the reading of the given channel, but does not wait until the conversion has completed. +			 *  Once executed, the conversion status can be determined via the \ref ADC_IsReadingComplete() macro and +			 *  the result read via the \ref ADC_GetResult() macro. +			 * +			 *  If the ADC has been initialized in free running mode, calling this function once will begin the repeated +			 *  conversions. If the ADC is in single conversion mode (or the channel to convert from is to be changed), +			 *  this function must be called each time a conversion is to take place. +			 * +			 *  \param[in] MUXMask  ADC channel mask, reference mask and adjustment mask. +			 */ +			static inline void ADC_StartReading(const uint16_t MUXMask) +			{ +				ADMUX = MUXMask; + +				#if (defined(__AVR_ATmega16U4__)  || defined(__AVR_ATmega32U4__) || defined(__DOXYGEN__)) +				if (MUXMask & (1 << 8)) +				  ADCSRB |=  (1 << MUX5); +				else +				  ADCSRB &= ~(1 << MUX5); +				#endif + +				ADCSRA |= (1 << ADSC); +			} + +			/** Indicates if the current ADC conversion is completed, or still in progress. +			 * +			 *  \return Boolean \c false if the reading is still taking place, or true if the conversion is +			 *          complete and ready to be read out with \ref ADC_GetResult(). +			 */ +			static inline bool ADC_IsReadingComplete(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool ADC_IsReadingComplete(void) +			{ +				return ((ADCSRA & (1 << ADIF)) ? true : false); +			} + +			/** Retrieves the conversion value of the last completed ADC conversion and clears the reading +			 *  completion flag. +			 * +			 *  \return The result of the last ADC conversion as an unsigned value. +			 */ +			static inline uint16_t ADC_GetResult(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline uint16_t ADC_GetResult(void) +			{ +				ADCSRA |= (1 << ADIF); +				return ADC; +			} + +			/** Performs a complete single reading from channel, including a polling spin-loop to wait for the +			 *  conversion to complete, and the returning of the converted value. +			 * +			 *  \note For free running mode, the automated conversions should be initialized with a single call +			 *        to \ref ADC_StartReading() to select the channel and begin the automated conversions, and +			 *        the results read directly from the \ref ADC_GetResult() instead to reduce overhead. +			 * +			 *  \param[in] MUXMask  Mask comprising of an ADC channel mask, reference mask and adjustment mask. +			 * +			 *  \return Converted ADC result for the given ADC channel. +			 */ +			static inline uint16_t ADC_GetChannelReading(const uint16_t MUXMask) ATTR_WARN_UNUSED_RESULT; +			static inline uint16_t ADC_GetChannelReading(const uint16_t MUXMask) +			{ +				ADC_StartReading(MUXMask); + +				while (!(ADC_IsReadingComplete())); + +				return ADC_GetResult(); +			} + +			/** Initializes the ADC, ready for conversions. This must be called before any other ADC operations. +			 *  The "mode" parameter should be a mask comprised of a conversion mode (free running or single) and +			 *  prescaler masks. +			 * +			 *  \param[in] Mode  Mask of ADC prescale and mode settings. +			 */ +			static inline void ADC_Init(const uint8_t Mode) ATTR_ALWAYS_INLINE; +			static inline void ADC_Init(const uint8_t Mode) +			{ +				ADCSRA = ((1 << ADEN) | Mode); +			} + +			/** Turns off the ADC. If this is called, any further ADC operations will require a call to +			 *  \ref ADC_Init() before the ADC can be used again. +			 */ +			static inline void ADC_Disable(void) ATTR_ALWAYS_INLINE; +			static inline void ADC_Disable(void) +			{ +				ADCSRA = 0; +			} + +			/** Indicates if the ADC is currently enabled. +			 * +			 *  \return Boolean \c true if the ADC subsystem is currently enabled, \c false otherwise. +			 */ +			static inline bool ADC_GetStatus(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool ADC_GetStatus(void) +			{ +				return ((ADCSRA & (1 << ADEN)) ? true : false); +			} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h new file mode 100644 index 0000000000..7244f4a954 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/SPI_AVR8.h @@ -0,0 +1,258 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief SPI Peripheral Driver (AVR8) + * + *  On-chip SPI driver for the 8-bit AVR microcontrollers. + * + *  \note This file should not be included directly. It is automatically included as needed by the SPI driver + *        dispatch header located in LUFA/Drivers/Peripheral/SPI.h. + */ + +/** \ingroup Group_SPI + *  \defgroup Group_SPI_AVR8 SPI Peripheral Driver (AVR8) + * + *  \section Sec_SPI_AVR8_ModDescription Module Description + *  Driver for the hardware SPI port available on most 8-bit AVR microcontroller models. This + *  module provides an easy to use driver for the setup and transfer of data over the + *  AVR's SPI port. + * + *  \note This file should not be included directly. It is automatically included as needed by the SPI driver + *        dispatch header located in LUFA/Drivers/Peripheral/SPI.h. + * + *  \section Sec_SPI_AVR8_ExampleUsage Example Usage + *  The following snippet is an example of how this module may be used within a typical + *  application. + * + *  \code + *      // Initialize the SPI driver before first use + *      SPI_Init(SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | + *               SPI_SAMPLE_TRAILING | SPI_MODE_MASTER); + * + *      // Send several bytes, ignoring the returned data + *      SPI_SendByte(0x01); + *      SPI_SendByte(0x02); + *      SPI_SendByte(0x03); + * + *      // Receive several bytes, sending a dummy 0x00 byte each time + *      uint8_t Byte1 = SPI_ReceiveByte(); + *      uint8_t Byte2 = SPI_ReceiveByte(); + *      uint8_t Byte3 = SPI_ReceiveByte(); + * + *      // Send a byte, and store the received byte from the same transaction + *      uint8_t ResponseByte = SPI_TransferByte(0xDC); + *  \endcode + * + *  @{ + */ + +#ifndef __SPI_AVR8_H__ +#define __SPI_AVR8_H__ + +	/* Includes: */ +		#include "../../../Common/Common.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_SPI_H) +			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/SPI.h instead. +		#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#define SPI_USE_DOUBLESPEED            (1 << SPE) +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** \name SPI Prescaler Configuration Masks */ +			//@{ +			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 2. */ +			#define SPI_SPEED_FCPU_DIV_2           SPI_USE_DOUBLESPEED + +			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 4. */ +			#define SPI_SPEED_FCPU_DIV_4           0 + +			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 8. */ +			#define SPI_SPEED_FCPU_DIV_8           (SPI_USE_DOUBLESPEED | (1 << SPR0)) + +			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 16. */ +			#define SPI_SPEED_FCPU_DIV_16          (1 << SPR0) + +			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 32. */ +			#define SPI_SPEED_FCPU_DIV_32          (SPI_USE_DOUBLESPEED | (1 << SPR1)) + +			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 64. */ +			#define SPI_SPEED_FCPU_DIV_64          (SPI_USE_DOUBLESPEED | (1 << SPR1) | (1 << SPR0)) + +			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 128. */ +			#define SPI_SPEED_FCPU_DIV_128         ((1 << SPR1) | (1 << SPR0)) +			//@} + +			/** \name SPI SCK Polarity Configuration Masks */ +			//@{ +			/** SPI clock polarity mask for \ref SPI_Init(). Indicates that the SCK should lead on the rising edge. */ +			#define SPI_SCK_LEAD_RISING            (0 << CPOL) + +			/** SPI clock polarity mask for \ref SPI_Init(). Indicates that the SCK should lead on the falling edge. */ +			#define SPI_SCK_LEAD_FALLING           (1 << CPOL) +			//@} + +			/** \name SPI Sample Edge Configuration Masks */ +			//@{ +			/** SPI data sample mode mask for \ref SPI_Init(). Indicates that the data should sampled on the leading edge. */ +			#define SPI_SAMPLE_LEADING             (0 << CPHA) + +			/** SPI data sample mode mask for \ref SPI_Init(). Indicates that the data should be sampled on the trailing edge. */ +			#define SPI_SAMPLE_TRAILING            (1 << CPHA) +			//@} + +			/** \name SPI Data Ordering Configuration Masks */ +			//@{ +			/** SPI data order mask for \ref SPI_Init(). Indicates that data should be shifted out MSB first. */ +			#define SPI_ORDER_MSB_FIRST            (0 << DORD) + +			/** SPI data order mask for \ref SPI_Init(). Indicates that data should be shifted out LSB first. */ +			#define SPI_ORDER_LSB_FIRST            (1 << DORD) +			//@} + +			/** \name SPI Mode Configuration Masks */ +			//@{ +			/** SPI mode mask for \ref SPI_Init(). Indicates that the SPI interface should be initialized into slave mode. */ +			#define SPI_MODE_SLAVE                 (0 << MSTR) + +			/** SPI mode mask for \ref SPI_Init(). Indicates that the SPI interface should be initialized into master mode. */ +			#define SPI_MODE_MASTER                (1 << MSTR) +			//@} + +		/* Inline Functions: */ +			/** Initializes the SPI subsystem, ready for transfers. Must be called before calling any other +			 *  SPI routines. +			 * +			 *  \param[in] SPIOptions  SPI Options, a mask consisting of one of each of the \c SPI_SPEED_*, +			 *                         \c SPI_SCK_*, \c SPI_SAMPLE_*, \c SPI_ORDER_* and \c SPI_MODE_* masks. +			 */ +			static inline void SPI_Init(const uint8_t SPIOptions); +			static inline void SPI_Init(const uint8_t SPIOptions) +			{ +				/* Prevent high rise times on PB.0 (/SS) from forcing a change to SPI slave mode */ +				DDRB  |= (1 << 0); +				PORTB |= (1 << 0); + +				DDRB  |=  ((1 << 1) | (1 << 2)); +				DDRB  &= ~(1 << 3); +				PORTB |=  (1 << 3); + +				if (SPIOptions & SPI_USE_DOUBLESPEED) +				  SPSR |= (1 << SPI2X); +				else +				  SPSR &= ~(1 << SPI2X); + +				/* Switch /SS to input mode after configuration to allow for forced mode changes */ +				DDRB &= ~(1 << 0); + +				SPCR  = ((1 << SPE) | SPIOptions); +			} + +			/** Turns off the SPI driver, disabling and returning used hardware to their default configuration. */ +			static inline void SPI_Disable(void); +			static inline void SPI_Disable(void) +			{ +				DDRB  &= ~((1 << 1) | (1 << 2)); +				PORTB &= ~((1 << 0) | (1 << 3)); + +				SPCR   = 0; +				SPSR   = 0; +			} + +			/** Retrieves the currently selected SPI mode, once the SPI interface has been configured. +			 * +			 *  \return \ref SPI_MODE_MASTER if the interface is currently in SPI Master mode, \ref SPI_MODE_SLAVE otherwise +			 */ +			static inline uint8_t SPI_GetCurrentMode(void) ATTR_ALWAYS_INLINE; +			static inline uint8_t SPI_GetCurrentMode(void) +			{ +				return (SPCR & SPI_MODE_MASTER); +			} + +			/** Sends and receives a byte through the SPI interface, blocking until the transfer is complete. +			 * +			 *  \param[in] Byte  Byte to send through the SPI interface. +			 * +			 *  \return Response byte from the attached SPI device. +			 */ +			static inline uint8_t SPI_TransferByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline uint8_t SPI_TransferByte(const uint8_t Byte) +			{ +				SPDR = Byte; +				while (!(SPSR & (1 << SPIF))); +				return SPDR; +			} + +			/** Sends a byte through the SPI interface, blocking until the transfer is complete. The response +			 *  byte sent to from the attached SPI device is ignored. +			 * +			 *  \param[in] Byte  Byte to send through the SPI interface. +			 */ +			static inline void SPI_SendByte(const uint8_t Byte) ATTR_ALWAYS_INLINE; +			static inline void SPI_SendByte(const uint8_t Byte) +			{ +				SPDR = Byte; +				while (!(SPSR & (1 << SPIF))); +			} + +			/** Sends a dummy byte through the SPI interface, blocking until the transfer is complete. The response +			 *  byte from the attached SPI device is returned. +			 * +			 *  \return The response byte from the attached SPI device. +			 */ +			static inline uint8_t SPI_ReceiveByte(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint8_t SPI_ReceiveByte(void) +			{ +				SPDR = 0x00; +				while (!(SPSR & (1 << SPIF))); +				return SPDR; +			} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Peripheral/AVR8/SerialSPI_AVR8.h b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/SerialSPI_AVR8.h new file mode 100644 index 0000000000..052780e733 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/SerialSPI_AVR8.h @@ -0,0 +1,208 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Master SPI Mode Serial USART Peripheral Driver (XMEGA) + * + *  On-chip Master SPI mode USART driver for the XMEGA AVR microcontrollers. + * + *  \note This file should not be included directly. It is automatically included as needed by the SPI Master + *        Mode USART driver dispatch header located in LUFA/Drivers/Peripheral/Serial.h. + */ + +/** \ingroup Group_SerialSPI + *  \defgroup Group_SerialSPI_AVR8 Master SPI Mode Serial USART Peripheral Driver (AVR8) + * + *  \section Sec_SerialSPI_AVR8_ModDescription Module Description + *  On-chip serial USART driver for the 8-bit AVR8 microcontrollers. + * + *  \note This file should not be included directly. It is automatically included as needed by the SPI Master + *        driver dispatch header located in LUFA/Drivers/Peripheral/SerialSPI.h. + * + *  \section Sec_SerialSPI_AVR8_ExampleUsage Example Usage + *  The following snippet is an example of how this module may be used within a typical + *  application. + * + *  \code + *      // Initialize the Master SPI mode USART driver before first use, with 1Mbit baud + *      SerialSPI_Init((USART_SPI_SCK_LEAD_RISING | USART_SPI_SAMPLE_LEADING | USART_SPI_ORDER_MSB_FIRST), 1000000); + * + *      // Send several bytes, ignoring the returned data + *      SerialSPI_SendByte(0x01); + *      SerialSPI_SendByte(0x02); + *      SerialSPI_SendByte(0x03); + * + *      // Receive several bytes, sending a dummy 0x00 byte each time + *      uint8_t Byte1 = SerialSPI_ReceiveByte(); + *      uint8_t Byte2 = SerialSPI_ReceiveByte(); + *      uint8_t Byte3 = SerialSPI_ReceiveByte(); + * + *      // Send a byte, and store the received byte from the same transaction + *      uint8_t ResponseByte = SerialSPI_TransferByte(0xDC); + *  \endcode + * + *  @{ + */ + +#ifndef __SERIAL_SPI_AVR8_H__ +#define __SERIAL_SPI_AVR8_H__ + +	/* Includes: */ +		#include "../../../Common/Common.h" + +		#include <stdio.h> + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_SERIAL_SPI_H) +			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/Serial.h instead. +		#endif + +	/* Private Interface - For use in library only: */ +		#if !defined(__DOXYGEN__) +			#define SERIAL_SPI_UBBRVAL(Baud)             ((Baud < (F_CPU / 2)) ? ((F_CPU / (2 * Baud)) - 1) : 0) + +			/* Master USART SPI mode flag definitions missing in the AVR8 toolchain */ +			#if !defined(UCPHA1) +				#define UCPHA1                           1 +			#endif +			#if !defined(UDORD1) +				#define UDORD1                           2 +			#endif +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** \name SPI SCK Polarity Configuration Masks */ +			//@{ +			/** SPI clock polarity mask for \ref SPI_Init(). Indicates that the SCK should lead on the rising edge. */ +			#define USART_SPI_SCK_LEAD_RISING            (0 << UCPOL1) + +			/** SPI clock polarity mask for \ref SPI_Init(). Indicates that the SCK should lead on the falling edge. */ +			#define USART_SPI_SCK_LEAD_FALLING           (1 << UCPOL1) +			//@} + +			/** \name SPI Sample Edge Configuration Masks */ +			//@{ +			/** SPI data sample mode mask for \ref SerialSPI_Init(). Indicates that the data should sampled on the leading edge. */ +			#define USART_SPI_SAMPLE_LEADING             (0 << UCPHA1) + +			/** SPI data sample mode mask for \ref SerialSPI_Init(). Indicates that the data should be sampled on the trailing edge. */ +			#define USART_SPI_SAMPLE_TRAILING            (1 << UCPHA1) +			//@} + +			/** \name SPI Data Ordering Configuration Masks */ +			//@{ +			/** SPI data order mask for \ref SerialSPI_Init(). Indicates that data should be shifted out MSB first. */ +			#define USART_SPI_ORDER_MSB_FIRST            (0 << UDORD1) + +			/** SPI data order mask for \ref SerialSPI_Init(). Indicates that data should be shifted out LSB first. */ +			#define USART_SPI_ORDER_LSB_FIRST            (1 << UDORD1) +			//@} + +		/* Inline Functions: */ +			/** Initialize the USART module in Master SPI mode. +			 * +			 *  \param[in]     SPIOptions   USART SPI Options, a mask consisting of one of each of the \c USART_SPI_SCK_*, +			 *                              \c USART_SPI_SAMPLE_* and \c USART_SPI_ORDER_* masks. +			 *  \param[in]     BaudRate     SPI baud rate, in bits per second. +			 */ +			static inline void SerialSPI_Init(const uint8_t SPIOptions, +			                                  const uint32_t BaudRate) +			{ +				DDRD  |= ((1 << 3) | (1 << 5)); +				PORTD |= (1 << 2); + +				UCSR1C = ((1 << UMSEL11) | (1 << UMSEL10) | SPIOptions); +				UCSR1B = ((1 << TXEN1)  | (1 << RXEN1)); + +				UBRR1  = SERIAL_SPI_UBBRVAL(BaudRate); +			} + +			/** Turns off the USART driver, disabling and returning used hardware to their default configuration. */ +			static inline void SerialSPI_Disable(void) +			{ +				UCSR1B = 0; +				UCSR1A = 0; +				UCSR1C = 0; + +				UBRR1  = 0; + +				DDRD  &= ~((1 << 3) | (1 << 5)); +				PORTD &= ~(1 << 2); +			} + +			/** Sends and receives a byte through the USART SPI interface, blocking until the transfer is complete. +			 * +			 *  \param[in] DataByte  Byte to send through the USART SPI interface. +			 * +			 *  \return Response byte from the attached SPI device. +			 */ +			static inline uint8_t SerialSPI_TransferByte(const uint8_t DataByte) +			{ +				UDR1 = DataByte; +				while (!(UCSR1A & (1 << TXC1))); +				UCSR1A = (1 << TXC1); +				return UDR1; +			} + +			/** Sends a byte through the USART SPI interface, blocking until the transfer is complete. The response +			 *  byte sent to from the attached SPI device is ignored. +			 * +			 *  \param[in] DataByte  Byte to send through the USART SPI interface. +			 */ +			static inline void SerialSPI_SendByte(const uint8_t DataByte) +			{ +				SerialSPI_TransferByte(DataByte); +			} + +			/** Sends a dummy byte through the USART SPI interface, blocking until the transfer is complete. The response +			 *  byte from the attached SPI device is returned. +			 * +			 *  \return The response byte from the attached SPI device. +			 */ +			static inline uint8_t SerialSPI_ReceiveByte(void) +			{ +				return SerialSPI_TransferByte(0); +			} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.c b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.c new file mode 100644 index 0000000000..779a80c48c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.c @@ -0,0 +1,121 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../Common/Common.h" +#if (ARCH == ARCH_AVR8) + +#define  __INCLUDE_FROM_SERIAL_C +#include "../Serial.h" + +FILE USARTSerialStream; + +int Serial_putchar(char DataByte, +                   FILE *Stream) +{ +	(void)Stream; + +	Serial_SendByte(DataByte); +	return 0; +} + +int Serial_getchar(FILE *Stream) +{ +	(void)Stream; + +	if (!(Serial_IsCharReceived())) +	  return _FDEV_EOF; + +	return Serial_ReceiveByte(); +} + +int Serial_getchar_Blocking(FILE *Stream) +{ +	(void)Stream; + +	while (!(Serial_IsCharReceived())); +	return Serial_ReceiveByte(); +} + +void Serial_SendString_P(const char* FlashStringPtr) +{ +	uint8_t CurrByte; + +	while ((CurrByte = pgm_read_byte(FlashStringPtr)) != 0x00) +	{ +		Serial_SendByte(CurrByte); +		FlashStringPtr++; +	} +} + +void Serial_SendString(const char* StringPtr) +{ +	uint8_t CurrByte; + +	while ((CurrByte = *StringPtr) != 0x00) +	{ +		Serial_SendByte(CurrByte); +		StringPtr++; +	} +} + +void Serial_SendData(const void* Buffer, +                     uint16_t Length) +{ +	uint8_t* CurrByte = (uint8_t*)Buffer; + +	while (Length--) +	  Serial_SendByte(*(CurrByte++)); +} + +void Serial_CreateStream(FILE* Stream) +{ +	if (!(Stream)) +	{ +		Stream = &USARTSerialStream; +		stdin  = Stream; +		stdout = Stream; +	} + +	*Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar, _FDEV_SETUP_RW); +} + +void Serial_CreateBlockingStream(FILE* Stream) +{ +	if (!(Stream)) +	{ +		Stream = &USARTSerialStream; +		stdin  = Stream; +		stdout = Stream; +	} + +	*Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar_Blocking, _FDEV_SETUP_RW); +} + +#endif diff --git a/lib/lufa/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.h b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.h new file mode 100644 index 0000000000..b3e7ee36a4 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/Serial_AVR8.h @@ -0,0 +1,271 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Serial USART Peripheral Driver (AVR8) + * + *  On-chip serial USART driver for the 8-bit AVR microcontrollers. + * + *  \note This file should not be included directly. It is automatically included as needed by the USART driver + *        dispatch header located in LUFA/Drivers/Peripheral/Serial.h. + */ + +/** \ingroup Group_Serial + *  \defgroup Group_Serial_AVR8 Serial USART Peripheral Driver (AVR8) + * + *  \section Sec_Serial_AVR8_ModDescription Module Description + *  On-chip serial USART driver for the 8-bit AVR microcontrollers. + * + *  \note This file should not be included directly. It is automatically included as needed by the USART driver + *        dispatch header located in LUFA/Drivers/Peripheral/Serial.h. + * + *  \section Sec_Serial_AVR8_ExampleUsage Example Usage + *  The following snippet is an example of how this module may be used within a typical + *  application. + * + *  \code + *      // Initialize the serial USART driver before first use, with 9600 baud (and no double-speed mode) + *      Serial_Init(9600, false); + * + *      // Send a string through the USART + *      Serial_SendString("Test String\r\n"); + * + *      // Send a raw byte through the USART + *      Serial_SendByte(0xDC); + * + *      // Receive a byte through the USART (or -1 if no data received) + *      int16_t DataByte = Serial_ReceiveByte(); + *  \endcode + * + *  @{ + */ + +#ifndef __SERIAL_AVR8_H__ +#define __SERIAL_AVR8_H__ + +	/* Includes: */ +		#include "../../../Common/Common.h" +		#include "../../Misc/TerminalCodes.h" + +		#include <stdio.h> + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_SERIAL_H) && !defined(__INCLUDE_FROM_SERIAL_C) +			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/Serial.h instead. +		#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* External Variables: */ +			extern FILE USARTSerialStream; + +		/* Function Prototypes: */ +			int Serial_putchar(char DataByte, +			                   FILE *Stream); +			int Serial_getchar(FILE *Stream); +			int Serial_getchar_Blocking(FILE *Stream); +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Macro for calculating the baud value from a given baud rate when the \c U2X (double speed) bit is +			 *  not set. +			 * +			 *  \param[in] Baud  Target serial UART baud rate. +			 * +			 *  \return Closest UBRR register value for the given UART frequency. +			 */ +			#define SERIAL_UBBRVAL(Baud)    ((((F_CPU / 16) + (Baud / 2)) / (Baud)) - 1) + +			/** Macro for calculating the baud value from a given baud rate when the \c U2X (double speed) bit is +			 *  set. +			 * +			 *  \param[in] Baud  Target serial UART baud rate. +			 * +			 *  \return Closest UBRR register value for the given UART frequency. +			 */ +			#define SERIAL_2X_UBBRVAL(Baud) ((((F_CPU / 8) + (Baud / 2)) / (Baud)) - 1) + +		/* Function Prototypes: */ +			/** Transmits a given NUL terminated string located in program space (FLASH) through the USART. +			 * +			 *  \param[in] FlashStringPtr  Pointer to a string located in program space. +			 */ +			void Serial_SendString_P(const char* FlashStringPtr) ATTR_NON_NULL_PTR_ARG(1); + +			/** Transmits a given NUL terminated string located in SRAM memory through the USART. +			 * +			 *  \param[in] StringPtr  Pointer to a string located in SRAM space. +			 */ +			void Serial_SendString(const char* StringPtr) ATTR_NON_NULL_PTR_ARG(1); + +			/** Transmits a given buffer located in SRAM memory through the USART. +			 * +			 *  \param[in] Buffer  Pointer to a buffer containing the data to send. +			 *  \param[in] Length  Length of the data to send, in bytes. +			 */ +			void Serial_SendData(const void* Buffer, uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** Creates a standard character stream from the USART so that it can be used with all the regular functions +			 *  in the avr-libc \c <stdio.h> library that accept a \c FILE stream as a destination (e.g. \c fprintf). The created +			 *  stream is bidirectional and can be used for both input and output functions. +			 * +			 *  Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single +			 *  fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may +			 *  be used when the read data is processed byte-per-bye (via \c getc()) or when the user application will implement its own +			 *  line buffering. +			 * +			 *  \param[in,out] Stream  Pointer to a FILE structure where the created stream should be placed, if \c NULL, \c stdout +			 *                         and \c stdin will be configured to use the USART. +			 * +			 *  \pre The USART must first be configured via a call to \ref Serial_Init() before the stream is used. +			 */ +			void Serial_CreateStream(FILE* Stream); + +			/** Identical to \ref Serial_CreateStream(), except that reads are blocking until the calling stream function terminates +			 *  the transfer. +			 * +			 *  \param[in,out] Stream  Pointer to a FILE structure where the created stream should be placed, if \c NULL, \c stdout +			 *                         and \c stdin will be configured to use the USART. +			 * +			 *  \pre The USART must first be configured via a call to \ref Serial_Init() before the stream is used. +			 */ +			void Serial_CreateBlockingStream(FILE* Stream); + +		/* Inline Functions: */ +			/** Initializes the USART, ready for serial data transmission and reception. This initializes the interface to +			 *  standard 8-bit, no parity, 1 stop bit settings suitable for most applications. +			 * +			 *  \param[in] BaudRate     Serial baud rate, in bits per second. This should be the target baud rate regardless of the +			 *                          \c DoubleSpeed parameter's value. +			 *  \param[in] DoubleSpeed  Enables double speed mode when set, halving the sample time to double the baud rate. +			 */ +			static inline void Serial_Init(const uint32_t BaudRate, +			                               const bool DoubleSpeed); +			static inline void Serial_Init(const uint32_t BaudRate, +			                               const bool DoubleSpeed) +			{ +				UBRR1  = (DoubleSpeed ? SERIAL_2X_UBBRVAL(BaudRate) : SERIAL_UBBRVAL(BaudRate)); + +				UCSR1C = ((1 << UCSZ11) | (1 << UCSZ10)); +				UCSR1A = (DoubleSpeed ? (1 << U2X1) : 0); +				UCSR1B = ((1 << TXEN1)  | (1 << RXEN1)); + +				DDRD  |= (1 << 3); +				PORTD |= (1 << 2); +			} + +			/** Turns off the USART driver, disabling and returning used hardware to their default configuration. */ +			static inline void Serial_Disable(void); +			static inline void Serial_Disable(void) +			{ +				UCSR1B = 0; +				UCSR1A = 0; +				UCSR1C = 0; + +				UBRR1  = 0; + +				DDRD  &= ~(1 << 3); +				PORTD &= ~(1 << 2); +			} + +			/** Indicates whether a character has been received through the USART. +			 * +			 *  \return Boolean \c true if a character has been received, \c false otherwise. +			 */ +			static inline bool Serial_IsCharReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool Serial_IsCharReceived(void) +			{ +				return ((UCSR1A & (1 << RXC1)) ? true : false); +			} + +			/** Indicates whether there is hardware buffer space for a new transmit on the USART. This +			 *  function can be used to determine if a call to \ref Serial_SendByte() will block in advance. +			 * +			 *  \return Boolean \c true if a character can be queued for transmission immediately, \c false otherwise. +			 */ +			static inline bool Serial_IsSendReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool Serial_IsSendReady(void) +			{ +				return ((UCSR1A & (1 << UDRE1)) ? true : false); +			} + +			/** Indicates whether the hardware USART transmit buffer is completely empty, indicating all +			 *  pending transmissions have completed. +			 * +			 *  \return Boolean \c true if no characters are buffered for transmission, \c false otherwise. +			 */ +			static inline bool Serial_IsSendComplete(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool Serial_IsSendComplete(void) +			{ +				return ((UCSR1A & (1 << TXC1)) ? true : false); +			} + +			/** Transmits a given byte through the USART. +			 * +			 *  \note If no buffer space is available in the hardware USART, this function will block. To check if +			 *        space is available before calling this function, see \ref Serial_IsSendReady(). +			 * +			 *  \param[in] DataByte  Byte to transmit through the USART. +			 */ +			static inline void Serial_SendByte(const char DataByte) ATTR_ALWAYS_INLINE; +			static inline void Serial_SendByte(const char DataByte) +			{ +				while (!(Serial_IsSendReady())); +				UDR1 = DataByte; +			} + +			/** Receives the next byte from the USART. +			 * +			 *  \return Next byte received from the USART, or a negative value if no byte has been received. +			 */ +			static inline int16_t Serial_ReceiveByte(void) ATTR_ALWAYS_INLINE; +			static inline int16_t Serial_ReceiveByte(void) +			{ +				if (!(Serial_IsCharReceived())) +				  return -1; + +				return UDR1; +			} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c new file mode 100644 index 0000000000..eb08687be3 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.c @@ -0,0 +1,209 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../Common/Common.h" +#if (ARCH == ARCH_AVR8) && defined(TWCR) + +#define  __INCLUDE_FROM_TWI_C +#include "../TWI.h" + +uint8_t TWI_StartTransmission(const uint8_t SlaveAddress, +                              const uint8_t TimeoutMS) +{ +	for (;;) +	{ +		bool     BusCaptured = false; +		uint16_t TimeoutRemaining; + +		TWCR = ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN)); + +		TimeoutRemaining = (TimeoutMS * 100); +		while (TimeoutRemaining && !(BusCaptured)) +		{ +			if (TWCR & (1 << TWINT)) +			{ +				switch (TWSR & TW_STATUS_MASK) +				{ +					case TW_START: +					case TW_REP_START: +						BusCaptured = true; +						break; +					case TW_MT_ARB_LOST: +						TWCR = ((1 << TWINT) | (1 << TWSTA) | (1 << TWEN)); +						continue; +					default: +						TWCR = (1 << TWEN); +						return TWI_ERROR_BusFault; +				} +			} + +			_delay_us(10); +			TimeoutRemaining--; +		} + +		if (!(TimeoutRemaining)) +		{ +			TWCR = (1 << TWEN); +			return TWI_ERROR_BusCaptureTimeout; +		} + +		TWDR = SlaveAddress; +		TWCR = ((1 << TWINT) | (1 << TWEN)); + +		TimeoutRemaining = (TimeoutMS * 100); +		while (TimeoutRemaining) +		{ +			if (TWCR & (1 << TWINT)) +			  break; + +			_delay_us(10); +			TimeoutRemaining--; +		} + +		if (!(TimeoutRemaining)) +		  return TWI_ERROR_SlaveResponseTimeout; + +		switch (TWSR & TW_STATUS_MASK) +		{ +			case TW_MT_SLA_ACK: +			case TW_MR_SLA_ACK: +				return TWI_ERROR_NoError; +			default: +				TWCR = ((1 << TWINT) | (1 << TWSTO) | (1 << TWEN)); +				return TWI_ERROR_SlaveNotReady; +		} +	} +} + +bool TWI_SendByte(const uint8_t Byte) +{ +	TWDR = Byte; +	TWCR = ((1 << TWINT) | (1 << TWEN)); +	while (!(TWCR & (1 << TWINT))); + +	return ((TWSR & TW_STATUS_MASK) == TW_MT_DATA_ACK); +} + +bool TWI_ReceiveByte(uint8_t* const Byte, +					 const bool LastByte) +{ +	uint8_t TWCRMask; + +	if (LastByte) +	  TWCRMask = ((1 << TWINT) | (1 << TWEN)); +	else +	  TWCRMask = ((1 << TWINT) | (1 << TWEN) | (1 << TWEA)); + +	TWCR = TWCRMask; +	while (!(TWCR & (1 << TWINT))); +	*Byte = TWDR; + +	uint8_t Status = (TWSR & TW_STATUS_MASK); + +	return ((LastByte) ? (Status == TW_MR_DATA_NACK) : (Status == TW_MR_DATA_ACK)); +} + +uint8_t TWI_ReadPacket(const uint8_t SlaveAddress, +                       const uint8_t TimeoutMS, +                       const uint8_t* InternalAddress, +                       uint8_t InternalAddressLen, +                       uint8_t* Buffer, +                       uint16_t Length) +{ +	uint8_t ErrorCode; + +	if ((ErrorCode = TWI_StartTransmission((SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_WRITE, +	                                       TimeoutMS)) == TWI_ERROR_NoError) +	{ +		while (InternalAddressLen--) +		{ +			if (!(TWI_SendByte(*(InternalAddress++)))) +			{ +				ErrorCode = TWI_ERROR_SlaveNAK; +				break; +			} +		} + +		if ((ErrorCode = TWI_StartTransmission((SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_READ, +											   TimeoutMS)) == TWI_ERROR_NoError) +		{ +			while (Length--) +			{ +				if (!(TWI_ReceiveByte(Buffer++, (Length == 0)))) +				{ +					ErrorCode = TWI_ERROR_SlaveNAK; +					break; +				} +			} + +			TWI_StopTransmission(); +		} +	} + +	return ErrorCode; +} + +uint8_t TWI_WritePacket(const uint8_t SlaveAddress, +                        const uint8_t TimeoutMS, +                        const uint8_t* InternalAddress, +                        uint8_t InternalAddressLen, +                        const uint8_t* Buffer, +                        uint16_t Length) +{ +	uint8_t ErrorCode; + +	if ((ErrorCode = TWI_StartTransmission((SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_WRITE, +	                                       TimeoutMS)) == TWI_ERROR_NoError) +	{ +		while (InternalAddressLen--) +		{ +			if (!(TWI_SendByte(*(InternalAddress++)))) +			{ +				ErrorCode = TWI_ERROR_SlaveNAK; +				break; +			} +		} + +		while (Length--) +		{ +			if (!(TWI_SendByte(*(Buffer++)))) +			{ +				ErrorCode = TWI_ERROR_SlaveNAK; +				break; +			} +		} + +		TWI_StopTransmission(); +	} + +	return ErrorCode; +} + +#endif diff --git a/lib/lufa/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h new file mode 100644 index 0000000000..a8b845a5d7 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/AVR8/TWI_AVR8.h @@ -0,0 +1,305 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief TWI Peripheral Driver (AVR8) + * + *  On-chip TWI driver for the 8-bit AVR microcontrollers. + * + *  \note This file should not be included directly. It is automatically included as needed by the TWI driver + *        dispatch header located in LUFA/Drivers/Peripheral/TWI.h. + */ + +/** \ingroup Group_TWI + *  \defgroup Group_TWI_AVR8 TWI Peripheral Driver (AVR8) + * + *  \section Sec_TWI_AVR8_ModDescription Module Description + *  Master mode TWI driver for the 8-bit AVR microcontrollers which contain a hardware TWI module. + * + *  \note This file should not be included directly. It is automatically included as needed by the TWI driver + *        dispatch header located in LUFA/Drivers/Peripheral/TWI.h. + * + *  \section Sec_TWI_AVR8_ExampleUsage Example Usage + *  The following snippet is an example of how this module may be used within a typical + *  application. + * + *  <b>Low Level API Example:</b> + *  \code + *      // Initialize the TWI driver before first use at 200KHz + *      TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 200000)); + * + *      // Start a write session to device at device address 0xA0, internal address 0xDC with a 10ms timeout + *      if (TWI_StartTransmission(0xA0 | TWI_ADDRESS_WRITE, 10) == TWI_ERROR_NoError) + *      { + *          TWI_SendByte(0xDC); + * + *          TWI_SendByte(0x01); + *          TWI_SendByte(0x02); + *          TWI_SendByte(0x03); + * + *          // Must stop transmission afterwards to release the bus + *          TWI_StopTransmission(); + *      } + * + *      // Start a read session to device at address 0xA0, internal address 0xDC with a 10ms timeout + *      if (TWI_StartTransmission(0xA0 | TWI_ADDRESS_WRITE, 10) == TWI_ERROR_NoError) + *      { + *          TWI_SendByte(0xDC); + *          TWI_StopTransmission(); + * + *          if (TWI_StartTransmission(0xA0 | TWI_ADDRESS_READ, 10) == TWI_ERROR_NoError) + *          { + *              uint8_t Byte1, Byte2, Byte3; + * + *              // Read three bytes, acknowledge after the third byte is received + *              TWI_ReceiveByte(&Byte1, false); + *              TWI_ReceiveByte(&Byte2, false); + *              TWI_ReceiveByte(&Byte3, true); + * + *              // Must stop transmission afterwards to release the bus + *              TWI_StopTransmission(); + *          } + *      } + *  \endcode + * + *  <b>High Level API Example:</b> + *  \code + *      // Initialize the TWI driver before first use at 200KHz + *      TWI_Init(TWI_BIT_PRESCALE_1, TWI_BITLENGTH_FROM_FREQ(1, 200000)); + * + *      // Start a write session to device at device address 0xA0, internal address 0xDC with a 10ms timeout + *      uint8_t InternalWriteAddress = 0xDC; + *      uint8_t WritePacket[3] = {0x01, 0x02, 0x03}; + * + *      TWI_WritePacket(0xA0, 10, &InternalWriteAddress, sizeof(InternalWriteAddress), + *                      &WritePacket, sizeof(WritePacket); + * + *      // Start a read session to device at address 0xA0, internal address 0xDC with a 10ms timeout + *      uint8_t InternalReadAddress = 0xDC; + *      uint8_t ReadPacket[3]; + * + *      TWI_ReadPacket(0xA0, 10, &InternalReadAddress, sizeof(InternalReadAddress), + *                     &ReadPacket, sizeof(ReadPacket); + *  \endcode + * + *  @{ + */ + +#ifndef __TWI_AVR8_H__ +#define __TWI_AVR8_H__ + +	/* Includes: */ +		#include "../../../Common/Common.h" + +		#include <stdio.h> +		#include <util/twi.h> + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_TWI_H) && !defined(__INCLUDE_FROM_TWI_C) +			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/TWI.h instead. +		#endif + +		#if !(defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB646__) || \ +		      defined(__AVR_AT90USB1287__) || defined(__AVR_AT90USB647__) || \ +			  defined(__AVR_ATmega16U4__)  || defined(__AVR_ATmega32U4__)) +			#error The TWI peripheral driver is not currently available for your selected microcontroller model. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** TWI slave device address mask for a read session. Mask with a slave device base address to obtain +			 *  the correct TWI bus address for the slave device when reading data from it. +			 */ +			#define TWI_ADDRESS_READ         0x01 + +			/** TWI slave device address mask for a write session. Mask with a slave device base address to obtain +			 *  the correct TWI bus address for the slave device when writing data to it. +			 */ +			#define TWI_ADDRESS_WRITE        0x00 + +			/** Mask to retrieve the base address for a TWI device, which can then be ORed with \ref TWI_ADDRESS_READ +			 *  or \ref TWI_ADDRESS_WRITE to obtain the device's read and write address respectively. +			 */ +			#define TWI_DEVICE_ADDRESS_MASK  0xFE + +			/** Bit length prescaler for \ref TWI_Init(). This mask multiplies the TWI bit length prescaler by 1. */ +			#define TWI_BIT_PRESCALE_1       ((0 << TWPS1) | (0 << TWPS0)) + +			/** Bit length prescaler for \ref TWI_Init(). This mask multiplies the TWI bit length prescaler by 4. */ +			#define TWI_BIT_PRESCALE_4       ((0 << TWPS1) | (1 << TWPS0)) + +			/** Bit length prescaler for \ref TWI_Init(). This mask multiplies the TWI bit length prescaler by 16. */ +			#define TWI_BIT_PRESCALE_16      ((1 << TWPS1) | (0 << TWPS0)) + +			/** Bit length prescaler for \ref TWI_Init(). This mask multiplies the TWI bit length prescaler by 64. */ +			#define TWI_BIT_PRESCALE_64      ((1 << TWPS1) | (1 << TWPS0)) + +			/** Calculates the length of each bit on the TWI bus for a given target frequency. This may be used with +			 *  the \ref TWI_Init() function to convert a bus frequency to a number of clocks for the \c BitLength +			 *  parameter. +			 * +			 *  \param[in] Prescale   Prescaler set on the TWI bus. +			 *  \param[in] Frequency  Desired TWI bus frequency in Hz. +			 * +			 *  \return Bit length in clocks for the given TWI bus frequency at the given prescaler value. +			 */ +			#define TWI_BITLENGTH_FROM_FREQ(Prescale, Frequency) ((((F_CPU / (Prescale)) / (Frequency)) - 16) / 2) + +		/* Enums: */ +			/** Enum for the possible return codes of the TWI transfer start routine and other dependant TWI functions. */ +			enum TWI_ErrorCodes_t +			{ +				TWI_ERROR_NoError              = 0, /**< Indicates that the command completed successfully. */ +				TWI_ERROR_BusFault             = 1, /**< A TWI bus fault occurred while attempting to capture the bus. */ +				TWI_ERROR_BusCaptureTimeout    = 2, /**< A timeout occurred whilst waiting for the bus to be ready. */ +				TWI_ERROR_SlaveResponseTimeout = 3, /**< No ACK received at the nominated slave address within the timeout period. */ +				TWI_ERROR_SlaveNotReady        = 4, /**< Slave NAKed the TWI bus START condition. */ +				TWI_ERROR_SlaveNAK             = 5, /**< Slave NAKed whilst attempting to send data to the device. */ +			}; + +		/* Inline Functions: */ +			/** Initializes the TWI hardware into master mode, ready for data transmission and reception. This must be +			 *  before any other TWI operations. +			 * +			 *  The generated SCL frequency will be according to the formula <pre>F_CPU / (16 + 2 * BitLength + 4 ^ Prescale)</pre>. +			 * +			 *  \attention The value of the \c BitLength parameter should not be set below 10 or invalid bus conditions may +			 *             occur, as indicated in the AVR8 microcontroller datasheet. +			 * +			 *  \param[in] Prescale   Prescaler to use when determining the bus frequency, a \c TWI_BIT_PRESCALE_* value. +			 *  \param[in] BitLength  Length of the bits sent on the bus. +			 */ +			static inline void TWI_Init(const uint8_t Prescale, +			                            const uint8_t BitLength) ATTR_ALWAYS_INLINE; +			static inline void TWI_Init(const uint8_t Prescale, +			                            const uint8_t BitLength) +			{ +				TWCR |= (1 << TWEN); +				TWSR  = Prescale; +				TWBR  = BitLength; +			} + +			/** Turns off the TWI driver hardware. If this is called, any further TWI operations will require a call to +			 *  \ref TWI_Init() before the TWI can be used again. +			 */ +			static inline void TWI_Disable(void) ATTR_ALWAYS_INLINE; +			static inline void TWI_Disable(void) +			{ +				TWCR &= ~(1 << TWEN); +			} + +			/** Sends a TWI STOP onto the TWI bus, terminating communication with the currently addressed device. */ +			static inline void TWI_StopTransmission(void) ATTR_ALWAYS_INLINE; +			static inline void TWI_StopTransmission(void) +			{ +				TWCR = ((1 << TWINT) | (1 << TWSTO) | (1 << TWEN)); +			} + +		/* Function Prototypes: */ +			/** Begins a master mode TWI bus communication with the given slave device address. +			 * +			 *  \param[in] SlaveAddress  Address of the slave TWI device to communicate with. +			 *  \param[in] TimeoutMS     Timeout period within which the slave must respond, in milliseconds. +			 * +			 *  \return A value from the \ref TWI_ErrorCodes_t enum. +			 */ +			uint8_t TWI_StartTransmission(const uint8_t SlaveAddress, +			                              const uint8_t TimeoutMS); + +			/** Sends a byte to the currently addressed device on the TWI bus. +			 * +			 *  \param[in] Byte  Byte to send to the currently addressed device +			 * +			 *  \return Boolean \c true if the recipient ACKed the byte, \c false otherwise +			 */ +			bool TWI_SendByte(const uint8_t Byte); + +			/** Receives a byte from the currently addressed device on the TWI bus. +			 * +			 *  \param[in] Byte      Location where the read byte is to be stored. +			 *  \param[in] LastByte  Indicates if the byte should be ACKed if false, NAKed if true. +			 * +			 *  \return Boolean \c true if the byte reception successfully completed, \c false otherwise. +			 */ +			bool TWI_ReceiveByte(uint8_t* const Byte, +			                     const bool LastByte) ATTR_NON_NULL_PTR_ARG(1); + +			/** High level function to perform a complete packet transfer over the TWI bus to the specified +			 *  device. +			 * +			 *  \param[in] SlaveAddress        Base address of the TWI slave device to communicate with. +			 *  \param[in] TimeoutMS           Timeout for bus capture and slave START ACK, in milliseconds. +			 *  \param[in] InternalAddress     Pointer to a location where the internal slave read start address is stored. +			 *  \param[in] InternalAddressLen  Size of the internal device address, in bytes. +			 *  \param[in] Buffer              Pointer to a buffer where the read packet data is to be stored. +			 *  \param[in] Length              Size of the packet to read, in bytes. +			 * +			 *  \return A value from the \ref TWI_ErrorCodes_t enum. +			 */ +			uint8_t TWI_ReadPacket(const uint8_t SlaveAddress, +			                       const uint8_t TimeoutMS, +			                       const uint8_t* InternalAddress, +			                       uint8_t InternalAddressLen, +			                       uint8_t* Buffer, +			                       uint16_t Length) ATTR_NON_NULL_PTR_ARG(3); + +			/** High level function to perform a complete packet transfer over the TWI bus from the specified +			 *  device. +			 * +			 *  \param[in] SlaveAddress        Base address of the TWI slave device to communicate with +			 *  \param[in] TimeoutMS           Timeout for bus capture and slave START ACK, in milliseconds +			 *  \param[in] InternalAddress     Pointer to a location where the internal slave write start address is stored +			 *  \param[in] InternalAddressLen  Size of the internal device address, in bytes +			 *  \param[in] Buffer              Pointer to a buffer where the packet data to send is stored +			 *  \param[in] Length              Size of the packet to send, in bytes +			 * +			 *  \return A value from the \ref TWI_ErrorCodes_t enum. +			 */ +			uint8_t TWI_WritePacket(const uint8_t SlaveAddress, +			                        const uint8_t TimeoutMS, +			                        const uint8_t* InternalAddress, +			                        uint8_t InternalAddressLen, +			                        const uint8_t* Buffer, +			                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(3); + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Peripheral/SPI.h b/lib/lufa/LUFA/Drivers/Peripheral/SPI.h new file mode 100644 index 0000000000..f0cd177e00 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/SPI.h @@ -0,0 +1,76 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Hardware Serial Peripheral Interface driver. + * + *  This file is the master dispatch header file for the device-specific SPI driver, for microcontrollers + *  containing a hardware SPI. + * + *  User code should include this file, which will in turn include the correct SPI driver header file for the + *  currently selected architecture and microcontroller model. + */ + +/** \ingroup Group_PeripheralDrivers + *  \defgroup Group_SPI SPI Driver - LUFA/Drivers/Peripheral/SPI.h + *  \brief Hardware Serial Peripheral Interface driver. + * + *  \section Sec_SPI_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - None + * + *  \section Sec_SPI_ModDescription Module Description + *  Hardware SPI driver. This module provides an easy to use driver for the setup and transfer of data over + *  the selected architecture and microcontroller model's SPI port. + * + *  \note The exact API for this driver may vary depending on the target used - see + *        individual target module documentation for the API specific to your target processor. + */ + +#ifndef __SPI_H__ +#define __SPI_H__ + +	/* Macros: */ +		#define __INCLUDE_FROM_SPI_H + +	/* Includes: */ +		#include "../../Common/Common.h" + +	/* Includes: */ +		#if (ARCH == ARCH_AVR8) +			#include "AVR8/SPI_AVR8.h" +		#elif (ARCH == ARCH_XMEGA) +			#include "XMEGA/SPI_XMEGA.h" +		#else +			#error The SPI peripheral driver is not currently available for your selected architecture. +		#endif + +#endif + diff --git a/lib/lufa/LUFA/Drivers/Peripheral/Serial.h b/lib/lufa/LUFA/Drivers/Peripheral/Serial.h new file mode 100644 index 0000000000..0c537bcd34 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/Serial.h @@ -0,0 +1,76 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Hardware Serial USART driver. + * + *  This file is the master dispatch header file for the device-specific USART driver, for microcontrollers + *  containing a hardware USART. + * + *  User code should include this file, which will in turn include the correct ADC driver header file for the + *  currently selected architecture and microcontroller model. + */ + +/** \ingroup Group_PeripheralDrivers + *  \defgroup Group_Serial Serial USART Driver - LUFA/Drivers/Peripheral/Serial.h + *  \brief Hardware Serial USART driver. + * + *  \section Sec_Serial_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/Peripheral/<i>ARCH</i>/Serial_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_SERIAL)</i> + * + *  \section Sec_Serial_ModDescription Module Description + *  Hardware serial USART driver. This module provides an easy to use driver for the setup and transfer + *  of data over the selected architecture and microcontroller model's USART port. + * + *  \note The exact API for this driver may vary depending on the target used - see + *        individual target module documentation for the API specific to your target processor. + */ + +#ifndef __SERIAL_H__ +#define __SERIAL_H__ + +	/* Macros: */ +		#define __INCLUDE_FROM_SERIAL_H + +	/* Includes: */ +		#include "../../Common/Common.h" + +	/* Includes: */ +		#if (ARCH == ARCH_AVR8) +			#include "AVR8/Serial_AVR8.h" +		#elif (ARCH == ARCH_XMEGA) +			#include "XMEGA/Serial_XMEGA.h" +		#else +			#error The Serial peripheral driver is not currently available for your selected architecture. +		#endif + +#endif + diff --git a/lib/lufa/LUFA/Drivers/Peripheral/SerialSPI.h b/lib/lufa/LUFA/Drivers/Peripheral/SerialSPI.h new file mode 100644 index 0000000000..dbab9dbf03 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/SerialSPI.h @@ -0,0 +1,76 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Hardware SPI Master Mode Serial USART driver. + * + *  This file is the master dispatch header file for the device-specific SPI Master Mode USART driver, for + *  microcontrollers containing a hardware USART capable of operating in a Master SPI mode. + * + *  User code should include this file, which will in turn include the correct ADC driver header file for the + *  currently selected architecture and microcontroller model. + */ + +/** \ingroup Group_PeripheralDrivers + *  \defgroup Group_SerialSPI Master SPI Mode Serial USART Driver - LUFA/Drivers/Peripheral/SerialSPI.h + *  \brief Hardware SPI Master Mode Serial USART driver. + * + *  \section Sec_SerialSPI_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - None + * + *  \section Sec_SerialSPI_ModDescription Module Description + *  Hardware SPI Master Mode serial USART driver. This module provides an easy to use driver for the setup and transfer + *  of data over the selected architecture and microcontroller model's USART port, using a SPI framing format. + * + *  \note The exact API for this driver may vary depending on the target used - see + *        individual target module documentation for the API specific to your target processor. + */ + +#ifndef __SERIAL_SPI_H__ +#define __SERIAL_SPI_H__ + +	/* Macros: */ +		#define __INCLUDE_FROM_SERIAL_SPI_H + +	/* Includes: */ +		#include "../../Common/Common.h" + +	/* Includes: */ +		#if (ARCH == ARCH_AVR8) +			#include "AVR8/SerialSPI_AVR8.h" +		#elif (ARCH == ARCH_XMEGA) +			#include "XMEGA/SerialSPI_XMEGA.h" +		#else +			#error The Serial SPI Master Mode peripheral driver is not currently available for your selected architecture. +		#endif + +#endif + diff --git a/lib/lufa/LUFA/Drivers/Peripheral/TWI.h b/lib/lufa/LUFA/Drivers/Peripheral/TWI.h new file mode 100644 index 0000000000..24483d8e13 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/TWI.h @@ -0,0 +1,76 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Hardware Two Wire Interface (I2C) driver. + * + *  This file is the master dispatch header file for the device-specific SPI driver, for microcontrollers + *  containing a hardware TWI. + * + *  User code should include this file, which will in turn include the correct TWI driver header file for the + *  currently selected architecture and microcontroller model. + */ + +/** \ingroup Group_PeripheralDrivers + *  \defgroup Group_TWI TWI Driver - LUFA/Drivers/Peripheral/TWI.h + *  \brief Hardware Two Wire Interface (I2C) driver. + * + *  \section Sec_TWI_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/Peripheral/<i>ARCH</i>/TWI_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_TWI)</i> + * + *  \section Sec_TWI_ModDescription Module Description + *  Hardware TWI driver. This module provides an easy to use driver for the setup and transfer of data over + *  the selected architecture and microcontroller model's TWI bus port. + * + *  \note The exact API for this driver may vary depending on the target used - see + *        individual target module documentation for the API specific to your target processor. + */ + +#ifndef __TWI_H__ +#define __TWI_H__ + +	/* Macros: */ +		#define __INCLUDE_FROM_TWI_H + +	/* Includes: */ +		#include "../../Common/Common.h" + +	/* Includes: */ +		#if (ARCH == ARCH_AVR8) +			#include "AVR8/TWI_AVR8.h" +		#elif (ARCH == ARCH_XMEGA) +			#include "XMEGA/TWI_XMEGA.h" +		#else +			#error The TWI peripheral driver is not currently available for your selected architecture. +		#endif + +#endif + diff --git a/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/SPI_XMEGA.h b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/SPI_XMEGA.h new file mode 100644 index 0000000000..7797df11a9 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/SPI_XMEGA.h @@ -0,0 +1,251 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief SPI Peripheral Driver (XMEGA) + * + *  On-chip SPI driver for the XMEGA microcontrollers. + * + *  \note This file should not be included directly. It is automatically included as needed by the SPI driver + *        dispatch header located in LUFA/Drivers/Peripheral/SPI.h. + */ + +/** \ingroup Group_SPI + *  \defgroup Group_SPI_XMEGA SPI Peripheral Driver (XMEGA) + * + *  \section Sec_SPI_XMEGA_ModDescription Module Description + *  Driver for the hardware SPI port(s) available on XMEGA AVR microcontroller models. This + *  module provides an easy to use driver for the setup and transfer of data over the AVR's + *  SPI ports. + * + *  \note This file should not be included directly. It is automatically included as needed by the SPI driver + *        dispatch header located in LUFA/Drivers/Peripheral/SPI.h. + * + *  \code + *      // Initialize the SPI driver before first use + *      SPI_Init(&SPIC, + *               SPI_SPEED_FCPU_DIV_2 | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_FALLING | + *               SPI_SAMPLE_TRAILING | SPI_MODE_MASTER); + * + *      // Send several bytes, ignoring the returned data + *      SPI_SendByte(&SPIC, 0x01); + *      SPI_SendByte(&SPIC, 0x02); + *      SPI_SendByte(&SPIC, 0x03); + * + *      // Receive several bytes, sending a dummy 0x00 byte each time + *      uint8_t Byte1 = SPI_ReceiveByte(&SPIC); + *      uint8_t Byte2 = SPI_ReceiveByte(&SPIC); + *      uint8_t Byte3 = SPI_ReceiveByte(&SPIC); + * + *      // Send a byte, and store the received byte from the same transaction + *      uint8_t ResponseByte = SPI_TransferByte(&SPIC, 0xDC); + *  \endcode + * + *  @{ + */ + +#ifndef __SPI_XMEGA_H__ +#define __SPI_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_SPI_H) +			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/SPI.h instead. +		#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#define SPI_USE_DOUBLESPEED            SPI_CLK2X_bm +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** \name SPI Prescaler Configuration Masks */ +			//@{ +			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 2. */ +			#define SPI_SPEED_FCPU_DIV_2           SPI_USE_DOUBLESPEED + +			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 4. */ +			#define SPI_SPEED_FCPU_DIV_4           0 + +			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 8. */ +			#define SPI_SPEED_FCPU_DIV_8           (SPI_USE_DOUBLESPEED | (1 << SPI_PRESCALER_gp)) + +			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 16. */ +			#define SPI_SPEED_FCPU_DIV_16          (1 << SPI_PRESCALER_gp) + +			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 32. */ +			#define SPI_SPEED_FCPU_DIV_32          (SPI_USE_DOUBLESPEED | (2 << SPI_PRESCALER_gp)) + +			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 64. */ +			#define SPI_SPEED_FCPU_DIV_64          (2 << SPI_PRESCALER_gp) + +			/** SPI prescaler mask for \ref SPI_Init(). Divides the system clock by a factor of 128. */ +			#define SPI_SPEED_FCPU_DIV_128         (3 << SPI_PRESCALER_gp) +			//@} + +			/** \name SPI SCK Polarity Configuration Masks */ +			//@{ +			/** SPI clock polarity mask for \ref SPI_Init(). Indicates that the SCK should lead on the rising edge. */ +			#define SPI_SCK_LEAD_RISING            0 + +			/** SPI clock polarity mask for \ref SPI_Init(). Indicates that the SCK should lead on the falling edge. */ +			#define SPI_SCK_LEAD_FALLING           SPI_MODE1_bm +			//@} + +			/** \name SPI Sample Edge Configuration Masks */ +			//@{ +			/** SPI data sample mode mask for \ref SPI_Init(). Indicates that the data should sampled on the leading edge. */ +			#define SPI_SAMPLE_LEADING             0 + +			/** SPI data sample mode mask for \ref SPI_Init(). Indicates that the data should be sampled on the trailing edge. */ +			#define SPI_SAMPLE_TRAILING            SPI_MODE0_bm +			//@} + +			/** \name SPI Data Ordering Configuration Masks */ +			//@{ +			/** SPI data order mask for \ref SPI_Init(). Indicates that data should be shifted out MSB first. */ +			#define SPI_ORDER_MSB_FIRST            0 + +			/** SPI data order mask for \ref SPI_Init(). Indicates that data should be shifted out LSB first. */ +			#define SPI_ORDER_LSB_FIRST            SPI_DORD_bm +			//@} + +			/** \name SPI Mode Configuration Masks */ +			//@{ +			/** SPI mode mask for \ref SPI_Init(). Indicates that the SPI interface should be initialized into slave mode. */ +			#define SPI_MODE_SLAVE                 0 + +			/** SPI mode mask for \ref SPI_Init(). Indicates that the SPI interface should be initialized into master mode. */ +			#define SPI_MODE_MASTER                SPI_MASTER_bm +			//@} + +		/* Inline Functions: */ +			/** Initializes the SPI subsystem, ready for transfers. Must be called before calling any other +			 *  SPI routines. +			 * +			 *  \param[in,out] SPI         Pointer to the base of the SPI peripheral within the device. +			 *  \param[in]     SPIOptions  SPI Options, a mask consisting of one of each of the \c SPI_SPEED_*, +			 *                             \c SPI_SCK_*, \c SPI_SAMPLE_*, \c SPI_ORDER_* and \c SPI_MODE_* masks. +			 */ +			static inline void SPI_Init(SPI_t* const SPI, +			                            const uint8_t SPIOptions) ATTR_NON_NULL_PTR_ARG(1); +			static inline void SPI_Init(SPI_t* const SPI, +			                            const uint8_t SPIOptions) +			{ +				SPI->CTRL = (SPIOptions | SPI_ENABLE_bm); +			} + +			/** Turns off the SPI driver, disabling and returning used hardware to their default configuration. +			 * +			 *  \param[in,out] SPI   Pointer to the base of the SPI peripheral within the device. +			 */ +			static inline void SPI_Disable(SPI_t* const SPI) ATTR_NON_NULL_PTR_ARG(1); +			static inline void SPI_Disable(SPI_t* const SPI) +			{ +				SPI->CTRL &= ~SPI_ENABLE_bm; +			} + +			/** Retrieves the currently selected SPI mode, once the SPI interface has been configured. +			 * +			 *  \param[in,out] SPI  Pointer to the base of the SPI peripheral within the device. +			 * +			 *  \return \ref SPI_MODE_MASTER if the interface is currently in SPI Master mode, \ref SPI_MODE_SLAVE otherwise +			 */ +			static inline uint8_t SPI_GetCurrentMode(SPI_t* const SPI) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1); +			static inline uint8_t SPI_GetCurrentMode(SPI_t* const SPI) +			{ +				return (SPI->CTRL & SPI_MASTER_bm); +			} + +			/** Sends and receives a byte through the SPI interface, blocking until the transfer is complete. +			 * +			 *  \param[in,out] SPI   Pointer to the base of the SPI peripheral within the device. +			 *  \param[in]     Byte  Byte to send through the SPI interface. +			 * +			 *  \return Response byte from the attached SPI device. +			 */ +			static inline uint8_t SPI_TransferByte(SPI_t* const SPI, +			                                       const uint8_t Byte) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1); +			static inline uint8_t SPI_TransferByte(SPI_t* const SPI, +			                                       const uint8_t Byte) +			{ +				SPI->DATA = Byte; +				while (!(SPI->STATUS & SPI_IF_bm)); +				return SPI->DATA; +			} + +			/** Sends a byte through the SPI interface, blocking until the transfer is complete. The response +			 *  byte sent to from the attached SPI device is ignored. +			 * +			 *  \param[in,out] SPI   Pointer to the base of the SPI peripheral within the device. +			 *  \param[in]     Byte  Byte to send through the SPI interface. +			 */ +			static inline void SPI_SendByte(SPI_t* const SPI, +			                                const uint8_t Byte) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1); +			static inline void SPI_SendByte(SPI_t* const SPI, +			                                const uint8_t Byte) +			{ +				SPI->DATA = Byte; +				while (!(SPI->STATUS & SPI_IF_bm)); +			} + +			/** Sends a dummy byte through the SPI interface, blocking until the transfer is complete. The response +			 *  byte from the attached SPI device is returned. +			 * +			 *  \param[in,out] SPI  Pointer to the base of the SPI peripheral within the device. +			 * +			 *  \return The response byte from the attached SPI device. +			 */ +			static inline uint8_t SPI_ReceiveByte(SPI_t* const SPI) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +			static inline uint8_t SPI_ReceiveByte(SPI_t* const SPI) +			{ +				SPI->DATA = 0; +				while (!(SPI->STATUS & SPI_IF_bm)); +				return SPI->DATA; +			} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h new file mode 100644 index 0000000000..ca3235083c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h @@ -0,0 +1,212 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Master SPI Mode Serial USART Peripheral Driver (XMEGA) + * + *  On-chip Master SPI mode USART driver for the XMEGA AVR microcontrollers. + * + *  \note This file should not be included directly. It is automatically included as needed by the SPI Master + *        Mode USART driver dispatch header located in LUFA/Drivers/Peripheral/Serial.h. + */ + +/** \ingroup Group_SerialSPI + *  \defgroup Group_SerialSPI_XMEGA Master SPI Mode Serial USART Peripheral Driver (XMEGA) + * + *  \section Sec_SerialSPI_XMEGA_ModDescription Module Description + *  On-chip serial USART driver for the XMEGA AVR microcontrollers. + * + *  \note This file should not be included directly. It is automatically included as needed by the ADC driver + *        dispatch header located in LUFA/Drivers/Peripheral/SerialSPI.h. + * + *  \section Sec_SerialSPI_XMEGA_ExampleUsage Example Usage + *  The following snippet is an example of how this module may be used within a typical + *  application. + * + *  \code + *      // Initialize the Master SPI mode USART driver before first use, with 1Mbit baud + *      SerialSPI_Init(&USARTD0, (USART_SPI_SCK_LEAD_RISING | USART_SPI_SAMPLE_LEADING | USART_SPI_ORDER_MSB_FIRST), 1000000); + * + *      // Send several bytes, ignoring the returned data + *      SerialSPI_SendByte(&USARTD0, 0x01); + *      SerialSPI_SendByte(&USARTD0, 0x02); + *      SerialSPI_SendByte(&USARTD0, 0x03); + * + *      // Receive several bytes, sending a dummy 0x00 byte each time + *      uint8_t Byte1 = SerialSPI_ReceiveByte(&USARTD); + *      uint8_t Byte2 = SerialSPI_ReceiveByte(&USARTD); + *      uint8_t Byte3 = SerialSPI_ReceiveByte(&USARTD); + * + *      // Send a byte, and store the received byte from the same transaction + *      uint8_t ResponseByte = SerialSPI_TransferByte(&USARTD0, 0xDC); + *  \endcode + * + *  @{ + */ + +#ifndef __SERIAL_SPI_XMEGA_H__ +#define __SERIAL_SPI_XMEGA_H__ + +	/* Includes: */ +		#include "../../../Common/Common.h" + +		#include <stdio.h> + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_SERIAL_SPI_H) +			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/Serial.h instead. +		#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +			#define SERIAL_SPI_UBBRVAL(Baud)       ((Baud < (F_CPU / 2)) ? ((F_CPU / (2 * Baud)) - 1) : 0) +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** \name SPI SCK Polarity Configuration Masks */ +			//@{ +			/** SPI clock polarity mask for \ref SerialSPI_Init(). Indicates that the SCK should lead on the rising edge. */ +			#define USART_SPI_SCK_LEAD_RISING      0 +			//@} + +			/** \name SPI Sample Edge Configuration Masks */ +			//@{ +			/** SPI data sample mode mask for \ref SerialSPI_Init(). Indicates that the data should sampled on the leading edge. */ +			#define USART_SPI_SAMPLE_LEADING       0 + +			/** SPI data sample mode mask for \ref SerialSPI_Init(). Indicates that the data should be sampled on the trailing edge. */ +			#define USART_SPI_SAMPLE_TRAILING      (1 << 1) +			//@} + +			/** \name SPI Data Ordering Configuration Masks */ +			//@{ +			/** SPI data order mask for \ref SerialSPI_Init(). Indicates that data should be shifted out MSB first. */ +			#define USART_SPI_ORDER_MSB_FIRST      0 + +			/** SPI data order mask for \ref SerialSPI_Init(). Indicates that data should be shifted out LSB first. */ +			#define USART_SPI_ORDER_LSB_FIRST      (1 << 2) +			//@} + +		/* Inline Functions: */ +			/** Initialize the USART module in Master SPI mode. +			 * +			 *  \param[in,out] USART        Pointer to the base of the USART peripheral within the device. +			 *  \param[in]     SPIOptions   USART SPI Options, a mask consisting of one of each of the \c USART_SPI_SCK_*, +			 *                              \c USART_SPI_SAMPLE_* and \c USART_SPI_ORDER_* masks. +			 *  \param[in]     BaudRate     SPI baud rate, in bits per second. +			 */ +			static inline void SerialSPI_Init(USART_t* const USART, +			                                  const uint8_t SPIOptions, +			                                  const uint32_t BaudRate) ATTR_NON_NULL_PTR_ARG(1); +			static inline void SerialSPI_Init(USART_t* const USART, +			                                  const uint8_t SPIOptions, +			                                  const uint32_t BaudRate) +			{ +				uint16_t BaudValue = SERIAL_SPI_UBBRVAL(BaudRate); + +				USART->BAUDCTRLB = (BaudValue >> 8); +				USART->BAUDCTRLA = (BaudValue & 0xFF); + +				USART->CTRLC = (USART_CMODE_MSPI_gc | SPIOptions); +				USART->CTRLB = (USART_RXEN_bm | USART_TXEN_bm); +			} + +			/** Turns off the USART driver, disabling and returning used hardware to their default configuration. +			 * +			 *  \param[in,out] USART  Pointer to the base of the USART peripheral within the device. +			 */ +			static inline void SerialSPI_Disable(USART_t* const USART) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1); +			static inline void SerialSPI_Disable(USART_t* const USART) +			{ +				USART->CTRLA = 0; +				USART->CTRLB = 0; +				USART->CTRLC = 0; +			} + +			/** Sends and receives a byte through the USART SPI interface, blocking until the transfer is complete. +			 * +			 *  \param[in,out] USART     Pointer to the base of the USART peripheral within the device. +			 *  \param[in]     DataByte  Byte to send through the USART SPI interface. +			 * +			 *  \return Response byte from the attached SPI device. +			 */ +			static inline uint8_t SerialSPI_TransferByte(USART_t* const USART, +			                                             const uint8_t DataByte) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1); +			static inline uint8_t SerialSPI_TransferByte(USART_t* const USART, +			                                             const uint8_t DataByte) +			{ +				USART->DATA   = DataByte; +				while (!(USART->STATUS & USART_TXCIF_bm)); +				USART->STATUS = USART_TXCIF_bm; +				return USART->DATA; +			} + +			/** Sends a byte through the USART SPI interface, blocking until the transfer is complete. The response +			 *  byte sent to from the attached SPI device is ignored. +			 * +			 *  \param[in,out] USART     Pointer to the base of the USART peripheral within the device. +			 *  \param[in]     DataByte  Byte to send through the USART SPI interface. +			 */ +			static inline void SerialSPI_SendByte(USART_t* const USART, +			                                      const uint8_t DataByte) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1); +			static inline void SerialSPI_SendByte(USART_t* const USART, +			                                      const uint8_t DataByte) +			{ +				SerialSPI_TransferByte(USART, DataByte); +			} + +			/** Sends a dummy byte through the USART SPI interface, blocking until the transfer is complete. The response +			 *  byte from the attached SPI device is returned. +			 * +			 *  \param[in,out] USART  Pointer to the base of the USART peripheral within the device. +			 * +			 *  \return The response byte from the attached SPI device. +			 */ +			static inline uint8_t SerialSPI_ReceiveByte(USART_t* const USART) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +			static inline uint8_t SerialSPI_ReceiveByte(USART_t* const USART) +			{ +				return SerialSPI_TransferByte(USART, 0); +			} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.c b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.c new file mode 100644 index 0000000000..9ecda47d2d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.c @@ -0,0 +1,126 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../Common/Common.h" +#if (ARCH == ARCH_XMEGA) + +#define  __INCLUDE_FROM_SERIAL_C +#include "../Serial.h" + +FILE USARTSerialStream; + +int Serial_putchar(char DataByte, +                   FILE *Stream) +{ +	USART_t* USART = fdev_get_udata(Stream); + +	Serial_SendByte(USART, DataByte); +	return 0; +} + +int Serial_getchar(FILE *Stream) +{ +	USART_t* USART = fdev_get_udata(Stream); + +	if (!(Serial_IsCharReceived(USART))) +	  return _FDEV_EOF; + +	return Serial_ReceiveByte(USART); +} + +int Serial_getchar_Blocking(FILE *Stream) +{ +	USART_t* USART = fdev_get_udata(Stream); + +	while (!(Serial_IsCharReceived(USART))); +	return Serial_ReceiveByte(USART); +} + +void Serial_SendString_P(USART_t* const USART, +                         const char* FlashStringPtr) +{ +	uint8_t CurrByte; + +	while ((CurrByte = pgm_read_byte(FlashStringPtr)) != 0x00) +	{ +		Serial_SendByte(USART, CurrByte); +		FlashStringPtr++; +	} +} + +void Serial_SendString(USART_t* const USART, +                       const char* StringPtr) +{ +	uint8_t CurrByte; + +	while ((CurrByte = *StringPtr) != 0x00) +	{ +		Serial_SendByte(USART, CurrByte); +		StringPtr++; +	} +} + +void Serial_SendData(USART_t* const USART, +                     const void* Buffer, +                     uint16_t Length) +{ +	uint8_t* CurrByte = (uint8_t*)Buffer; + +	while (Length--) +	  Serial_SendByte(USART, *(CurrByte++)); +} + +void Serial_CreateStream(USART_t* USART, FILE* Stream) +{ +	if (!(Stream)) +	{ +		Stream = &USARTSerialStream; +		stdin  = Stream; +		stdout = Stream; +    } + +    *Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar, _FDEV_SETUP_RW); +    fdev_set_udata(Stream, USART); +} + +void Serial_CreateBlockingStream(USART_t* USART, FILE* Stream) +{ +	if (!(Stream)) +	{ +		Stream = &USARTSerialStream; +		stdin  = Stream; +		stdout = Stream; +	} + +    *Stream = (FILE)FDEV_SETUP_STREAM(Serial_putchar, Serial_getchar_Blocking, _FDEV_SETUP_RW); +    fdev_set_udata(Stream, USART); +} + +#endif diff --git a/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.h b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.h new file mode 100644 index 0000000000..36f507d43e --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/Serial_XMEGA.h @@ -0,0 +1,289 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Serial USART Peripheral Driver (XMEGA) + * + *  On-chip serial USART driver for the XMEGA AVR microcontrollers. + * + *  \note This file should not be included directly. It is automatically included as needed by the USART driver + *        dispatch header located in LUFA/Drivers/Peripheral/Serial.h. + */ + +/** \ingroup Group_Serial + *  \defgroup Group_Serial_XMEGA Serial USART Peripheral Driver (XMEGA) + * + *  \section Sec_Serial_XMEGA_ModDescription Module Description + *  On-chip serial USART driver for the XMEGA AVR microcontrollers. + * + *  \note This file should not be included directly. It is automatically included as needed by the USART driver + *        dispatch header located in LUFA/Drivers/Peripheral/Serial.h. + * + *  \section Sec_Serial_XMEGA_ExampleUsage Example Usage + *  The following snippet is an example of how this module may be used within a typical + *  application. + * + *  \code + *      // Initialize the serial USART driver before first use, with 9600 baud (and no double-speed mode) + *      Serial_Init(&USARTD0, 9600, false); + * + *      // Send a string through the USART + *      Serial_TxString(&USARTD0, "Test String\r\n"); + * + *      // Receive a byte through the USART + *      uint8_t DataByte = Serial_RxByte(&USARTD0); + *  \endcode + * + *  @{ + */ + +#ifndef __SERIAL_XMEGA_H__ +#define __SERIAL_XMEGA_H__ + +	/* Includes: */ +		#include "../../../Common/Common.h" +		#include "../../Misc/TerminalCodes.h" + +		#include <stdio.h> + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_SERIAL_H) && !defined(__INCLUDE_FROM_SERIAL_C) +			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/Serial.h instead. +		#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* External Variables: */ +			extern FILE USARTSerialStream; + +		/* Function Prototypes: */ +			int Serial_putchar(char DataByte, +			                   FILE *Stream); +			int Serial_getchar(FILE *Stream); +			int Serial_getchar_Blocking(FILE *Stream); +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Macro for calculating the baud value from a given baud rate when the \c U2X (double speed) bit is +			 *  not set. +			 * +			 *  \param[in] Baud  Target serial UART baud rate. +			 * +			 *  \return Closest UBRR register value for the given UART frequency. +			 */ +			#define SERIAL_UBBRVAL(Baud)    ((((F_CPU / 16) + (Baud / 2)) / (Baud)) - 1) + +			/** Macro for calculating the baud value from a given baud rate when the \c U2X (double speed) bit is +			 *  set. +			 * +			 *  \param[in] Baud  Target serial UART baud rate. +			 * +			 *  \return Closest UBRR register value for the given UART frequency. +			 */ +			#define SERIAL_2X_UBBRVAL(Baud) ((((F_CPU / 8) + (Baud / 2)) / (Baud)) - 1) + +		/* Function Prototypes: */ +			/** Transmits a given string located in program space (FLASH) through the USART. +			 * +			 *  \param[in,out] USART           Pointer to the base of the USART peripheral within the device. +			 *  \param[in]     FlashStringPtr  Pointer to a string located in program space. +			 */ +			void Serial_SendString_P(USART_t* const USART, +			                         const char* FlashStringPtr) ATTR_NON_NULL_PTR_ARG(1); + +			/** Transmits a given string located in SRAM memory through the USART. +			 * +			 *  \param[in,out] USART      Pointer to the base of the USART peripheral within the device. +			 *  \param[in]     StringPtr  Pointer to a string located in SRAM space. +			 */ +			void Serial_SendString(USART_t* const USART, +			                       const char* StringPtr) ATTR_NON_NULL_PTR_ARG(1); + +			/** Transmits a given buffer located in SRAM memory through the USART. +			 * +			 *  \param[in,out] USART   Pointer to the base of the USART peripheral within the device. +			 *  \param[in]     Buffer  Pointer to a buffer containing the data to send. +			 *  \param[in]     Length  Length of the data to send, in bytes. +			 */ +			void Serial_SendData(USART_t* const USART, +			                     const void* Buffer, +			                     uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** Creates a standard character stream from the USART so that it can be used with all the regular functions +			 *  in the avr-libc \c <stdio.h> library that accept a \c FILE stream as a destination (e.g. \c fprintf). The created +			 *  stream is bidirectional and can be used for both input and output functions. +			 * +			 *  Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single +			 *  fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may +			 *  be used when the read data is processed byte-per-bye (via \c getc()) or when the user application will implement its own +			 *  line buffering. +			 * +			 *  \param[in,out] USART   Pointer to the base of the USART peripheral within the device. +			 *  \param[in,out] Stream  Pointer to a FILE structure where the created stream should be placed, if \c NULL, \c stdout +			 *                         and \c stdin will be configured to use the USART. +			 * +			 *  \pre The USART must first be configured via a call to \ref Serial_Init() before the stream is used. +			 */ +			void Serial_CreateStream(USART_t* USART, FILE* Stream); + +            /** Identical to \ref Serial_CreateStream(), except that reads are blocking until the calling stream function terminates +			 *  the transfer. +			 * +			 *  \param[in,out] USART   Pointer to the base of the USART peripheral within the device. +			 *  \param[in,out] Stream  Pointer to a FILE structure where the created stream should be placed, if \c NULL, \c stdout +			 *                         and \c stdin will be configured to use the USART. +			 * +			 *  \pre The USART must first be configured via a call to \ref Serial_Init() before the stream is used. +			 */ +			void Serial_CreateBlockingStream(USART_t* USART, FILE* Stream); + +		/* Inline Functions: */ +			/** Initializes the USART, ready for serial data transmission and reception. This initializes the interface to +			 *  standard 8-bit, no parity, 1 stop bit settings suitable for most applications. +			 * +			 *  \param[in,out] USART        Pointer to the base of the USART peripheral within the device. +			 *  \param[in]     BaudRate     Serial baud rate, in bits per second. This should be the target baud rate regardless of +			 *                              the \c DoubleSpeed parameter's value. +			 *  \param[in]     DoubleSpeed  Enables double speed mode when set, halving the sample time to double the baud rate. +			 */ +			static inline void Serial_Init(USART_t* const USART, +			                               const uint32_t BaudRate, +			                               const bool DoubleSpeed) ATTR_NON_NULL_PTR_ARG(1); +			static inline void Serial_Init(USART_t* const USART, +			                               const uint32_t BaudRate, +			                               const bool DoubleSpeed) +			{ +				uint16_t BaudValue = (DoubleSpeed ? SERIAL_2X_UBBRVAL(BaudRate) : SERIAL_UBBRVAL(BaudRate)); + +				USART->BAUDCTRLB = (BaudValue >> 8); +				USART->BAUDCTRLA = (BaudValue & 0xFF); + +				USART->CTRLC = (USART_CMODE_ASYNCHRONOUS_gc | USART_PMODE_DISABLED_gc | USART_CHSIZE_8BIT_gc); +				USART->CTRLB = (USART_RXEN_bm | USART_TXEN_bm | (DoubleSpeed ? USART_CLK2X_bm : 0)); +			} + +			/** Turns off the USART driver, disabling and returning used hardware to their default configuration. +			 * +			 *  \param[in,out] USART  Pointer to the base of the USART peripheral within the device. +			 */ +			static inline void Serial_Disable(USART_t* const USART) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1); +			static inline void Serial_Disable(USART_t* const USART) +			{ +				USART->CTRLA = 0; +				USART->CTRLB = 0; +				USART->CTRLC = 0; +			} + +			/** Indicates whether a character has been received through the USART. +			 * +			 *  \param[in,out] USART  Pointer to the base of the USART peripheral within the device. +			 * +			 *  \return Boolean \c true if a character has been received, \c false otherwise. +			 */ +			static inline bool Serial_IsCharReceived(USART_t* const USART) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +			static inline bool Serial_IsCharReceived(USART_t* const USART) +			{ +				return ((USART->STATUS & USART_RXCIF_bm) ? true : false); +			} + +			/** Indicates whether there is hardware buffer space for a new transmit on the USART. This +			 *  function can be used to determine if a call to \ref Serial_SendByte() will block in advance. +			 * +			 *  \param[in,out] USART  Pointer to the base of the USART peripheral within the device. +			 * +			 *  \return Boolean \c true if a character can be queued for transmission immediately, \c false otherwise. +			 */ +			static inline bool Serial_IsSendReady(USART_t* const USART) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +			static inline bool Serial_IsSendReady(USART_t* const USART) +			{ +				return (USART->STATUS & USART_DREIF_bm) ? true : false; +			} + +			/** Indicates whether the hardware USART transmit buffer is completely empty, indicating all +			 *  pending transmissions have completed. +			 * +			 *  \param[in,out] USART  Pointer to the base of the USART peripheral within the device. +			 * +			 *  \return Boolean \c true if no characters are buffered for transmission, \c false otherwise. +			 */ +			static inline bool Serial_IsSendComplete(USART_t* const USART) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +			static inline bool Serial_IsSendComplete(USART_t* const USART) +			{ +				return (USART->STATUS & USART_TXCIF_bm) ? true : false; +			} + +			/** Transmits a given byte through the USART. +			 * +			 *  \note If no buffer space is available in the hardware USART, this function will block. To check if +			 *        space is available before calling this function, see \ref Serial_IsSendReady(). +			 * +			 *  \param[in,out] USART     Pointer to the base of the USART peripheral within the device. +			 *  \param[in]     DataByte  Byte to transmit through the USART. +			 */ +			static inline void Serial_SendByte(USART_t* const USART, +			                                   const char DataByte) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1); +			static inline void Serial_SendByte(USART_t* const USART, +			                                   const char DataByte) +			{ +				while (!(Serial_IsSendReady(USART))); +				USART->DATA = DataByte; +			} + +			/** Receives the next byte from the USART. +			 * +			 *  \param[in,out] USART  Pointer to the base of the USART peripheral within the device. +			 * +			 *  \return Next byte received from the USART, or a negative value if no byte has been received. +			 */ +			static inline int16_t Serial_ReceiveByte(USART_t* const USART) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1); +			static inline int16_t Serial_ReceiveByte(USART_t* const USART) +			{ +				if (!(Serial_IsCharReceived(USART))) +				  return -1; + +				USART->STATUS = USART_RXCIF_bm; +				return USART->DATA; +			} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.c b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.c new file mode 100644 index 0000000000..92cc643b9e --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.c @@ -0,0 +1,185 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../Common/Common.h" +#if (ARCH == ARCH_XMEGA) + +#define  __INCLUDE_FROM_TWI_C +#include "../TWI.h" + +uint8_t TWI_StartTransmission(TWI_t* const TWI, +                              const uint8_t SlaveAddress, +                              const uint8_t TimeoutMS) +{ +	uint16_t TimeoutRemaining; + +	TWI->MASTER.ADDR = SlaveAddress; + +	TimeoutRemaining = (TimeoutMS * 100); +	while (TimeoutRemaining) +	{ +		uint8_t status = TWI->MASTER.STATUS; + +		if ((status & (TWI_MASTER_WIF_bm | TWI_MASTER_ARBLOST_bm)) == (TWI_MASTER_WIF_bm | TWI_MASTER_ARBLOST_bm)) +		{ +			TWI->MASTER.ADDR = SlaveAddress; +		} +		else if ((status & (TWI_MASTER_WIF_bm | TWI_MASTER_RXACK_bm)) == (TWI_MASTER_WIF_bm | TWI_MASTER_RXACK_bm)) +		{ +			TWI_StopTransmission(TWI); +			return TWI_ERROR_SlaveResponseTimeout; +		} +		else if (status & (TWI_MASTER_WIF_bm | TWI_MASTER_RIF_bm)) +		{ +			return TWI_ERROR_NoError; +		} + +		_delay_us(10); +		TimeoutRemaining--; +	} + +	if (!(TimeoutRemaining)) { +		if (TWI->MASTER.STATUS & TWI_MASTER_CLKHOLD_bm) { +			TWI_StopTransmission(TWI); +		} +	} + +	return TWI_ERROR_BusCaptureTimeout; +} + +bool TWI_SendByte(TWI_t* const TWI, +                  const uint8_t Byte) +{ +	TWI->MASTER.DATA = Byte; + +	while (!(TWI->MASTER.STATUS & TWI_MASTER_WIF_bm)); + +	return (TWI->MASTER.STATUS & TWI_MASTER_WIF_bm) && !(TWI->MASTER.STATUS & TWI_MASTER_RXACK_bm); +} + +bool TWI_ReceiveByte(TWI_t* const TWI, +                     uint8_t* const Byte, +                     const bool LastByte) +{ +	if ((TWI->MASTER.STATUS & (TWI_MASTER_BUSERR_bm | TWI_MASTER_ARBLOST_bm)) == (TWI_MASTER_BUSERR_bm | TWI_MASTER_ARBLOST_bm)) { +		return false; +	} + +	while (!(TWI->MASTER.STATUS & TWI_MASTER_RIF_bm)); + +	*Byte = TWI->MASTER.DATA; + +	if (LastByte) +	  TWI->MASTER.CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc; +	else +	  TWI->MASTER.CTRLC = TWI_MASTER_CMD_RECVTRANS_gc; + +	return true; +} + +uint8_t TWI_ReadPacket(TWI_t* const TWI, +                       const uint8_t SlaveAddress, +                       const uint8_t TimeoutMS, +                       const uint8_t* InternalAddress, +                       uint8_t InternalAddressLen, +                       uint8_t* Buffer, +                       uint16_t Length) +{ +	uint8_t ErrorCode; + +	if ((ErrorCode = TWI_StartTransmission(TWI, (SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_WRITE, +	                                       TimeoutMS)) == TWI_ERROR_NoError) +	{ +		while (InternalAddressLen--) +		{ +			if (!(TWI_SendByte(TWI, *(InternalAddress++)))) +			{ +				ErrorCode = TWI_ERROR_SlaveNAK; +				break; +			} +		} + +		if ((ErrorCode = TWI_StartTransmission(TWI, (SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_READ, +		                                       TimeoutMS)) == TWI_ERROR_NoError) +		{ +			while (Length--) +			{ +				if (!(TWI_ReceiveByte(TWI, Buffer++, (Length == 0)))) +				{ +					ErrorCode = TWI_ERROR_SlaveNAK; +					break; +				} +			} +		} + +		TWI_StopTransmission(TWI); +	} + +	return ErrorCode; +} + +uint8_t TWI_WritePacket(TWI_t* const TWI, +                        const uint8_t SlaveAddress, +                        const uint8_t TimeoutMS, +                        const uint8_t* InternalAddress, +                        uint8_t InternalAddressLen, +                        const uint8_t* Buffer, +                        uint16_t Length) +{ +	uint8_t ErrorCode; + +	if ((ErrorCode = TWI_StartTransmission(TWI, (SlaveAddress & TWI_DEVICE_ADDRESS_MASK) | TWI_ADDRESS_WRITE, +	                                       TimeoutMS)) == TWI_ERROR_NoError) +	{ +		while (InternalAddressLen--) +		{ +			if (!(TWI_SendByte(TWI, *(InternalAddress++)))) +			{ +				ErrorCode = TWI_ERROR_SlaveNAK; +				break; +			} +		} + +		while (Length--) +		{ +			if (!(TWI_SendByte(TWI, *(Buffer++)))) +			{ +				ErrorCode = TWI_ERROR_SlaveNAK; +				break; +			} +		} + +		TWI_StopTransmission(TWI); +	} + +	return ErrorCode; +} + +#endif diff --git a/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.h b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.h new file mode 100644 index 0000000000..94ada73719 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/Peripheral/XMEGA/TWI_XMEGA.h @@ -0,0 +1,302 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief TWI Peripheral Driver (XMEGA) + * + *  On-chip TWI driver for the XMEGA Family of AVR microcontrollers. + * + *  \note This file should not be included directly. It is automatically included as needed by the TWI driver + *        dispatch header located in LUFA/Drivers/Peripheral/TWI.h. + */ + +/** \ingroup Group_TWI + *  \defgroup Group_TWI_XMEGA TWI Peripheral Driver (XMEGA) + * + *  \section Sec_TWI_XMEGA_ModDescription Module Description + *  Master mode TWI driver for the 8-bit AVR microcontrollers which contain a hardware TWI module. + * + *  \note This file should not be included directly. It is automatically included as needed by the TWI driver + *        dispatch header located in LUFA/Drivers/Peripheral/TWI.h. + * + *  \section Sec_TWI_XMEGA_ExampleUsage Example Usage + *  The following snippet is an example of how this module may be used within a typical + *  application. + * + *  <b>Low Level API Example:</b> + *  \code + *      // Initialize the TWI driver before first use at 200KHz + *      TWI_Init(&TWIC, TWI_BAUD_FROM_FREQ(200000)); + * + *      // Start a write session to device at device address 0xA0, internal address 0xDC with a 10ms timeout + *      if (TWI_StartTransmission(&TWIC, 0xA0 | TWI_ADDRESS_WRITE, 10) == TWI_ERROR_NoError) + *      { + *          TWI_SendByte(&TWIC, 0xDC); + * + *          TWI_SendByte(&TWIC, 0x01); + *          TWI_SendByte(&TWIC, 0x02); + *          TWI_SendByte(&TWIC, 0x03); + * + *          // Must stop transmission afterwards to release the bus + *          TWI_StopTransmission(&TWIC); + *      } + * + *      // Start a read session to device at address 0xA0, internal address 0xDC with a 10ms timeout + *      if (TWI_StartTransmission(&TWIC, 0xA0 | TWI_ADDRESS_WRITE, 10) == TWI_ERROR_NoError) + *      { + *          TWI_SendByte(&TWIC, 0xDC); + *          TWI_StopTransmission(&TWIC); + * + *          if (TWI_StartTransmission(&TWIC, 0xA0 | TWI_ADDRESS_READ, 10) == TWI_ERROR_NoError) + *          { + *              uint8_t Byte1, Byte2, Byte3; + * + *              // Read three bytes, acknowledge after the third byte is received + *              TWI_ReceiveByte(&TWIC, &Byte1, false); + *              TWI_ReceiveByte(&TWIC, &Byte2, false); + *              TWI_ReceiveByte(&TWIC, &Byte3, true); + * + *              // Must stop transmission afterwards to release the bus + *              TWI_StopTransmission(&TWIC); + *          } + *      } + *  \endcode + * + *  <b>High Level API Example:</b> + *  \code + *      // Initialize the TWI driver before first use at 200KHz + *      TWI_Init(&TWIC, TWI_BAUD_FROM_FREQ(200000)); + * + *      // Start a write session to device at device address 0xA0, internal address 0xDC with a 10ms timeout + *      uint8_t InternalWriteAddress = 0xDC; + *      uint8_t WritePacket[3] = {0x01, 0x02, 0x03}; + * + *      TWI_WritePacket(&TWIC, 0xA0, 10, &InternalWriteAddress, sizeof(InternalWriteAddress), + *                      &WritePacket, sizeof(WritePacket); + * + *      // Start a read session to device at address 0xA0, internal address 0xDC with a 10ms timeout + *      uint8_t InternalReadAddress = 0xDC; + *      uint8_t ReadPacket[3]; + * + *      TWI_ReadPacket(&TWIC, 0xA0, 10, &InternalReadAddress, sizeof(InternalReadAddress), + *                     &ReadPacket, sizeof(ReadPacket); + *  \endcode + * + *  @{ + */ + +#ifndef __TWI_XMEGA_H__ +#define __TWI_XMEGA_H__ + +	/* Includes: */ +		#include "../../../Common/Common.h" + +		#include <stdio.h> + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_TWI_H) && !defined(__INCLUDE_FROM_TWI_C) +			#error Do not include this file directly. Include LUFA/Drivers/Peripheral/TWI.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** TWI slave device address mask for a read session. Mask with a slave device base address to obtain +			 *  the correct TWI bus address for the slave device when reading data from it. +			 */ +			#define TWI_ADDRESS_READ         0x01 + +			/** TWI slave device address mask for a write session. Mask with a slave device base address to obtain +			 *  the correct TWI bus address for the slave device when writing data to it. +			 */ +			#define TWI_ADDRESS_WRITE        0x00 + +			/** Mask to retrieve the base address for a TWI device, which can then be ORed with \ref TWI_ADDRESS_READ +			 *  or \ref TWI_ADDRESS_WRITE to obtain the device's read and write address respectively. +			 */ +			#define TWI_DEVICE_ADDRESS_MASK  0xFE + +			/** Calculates the length of each bit on the TWI bus for a given target frequency. This may be used with +			 *  the \ref TWI_Init() function to convert a bus frequency to a number of clocks for the \c BitLength +			 *  parameter. +			 * +			 *  \param[in] Frequency  Desired TWI bus frequency in Hz. +			 * +			 *  \return Bit length in clocks for the given TWI bus frequency at the given prescaler value. +			 */ +			#define TWI_BAUD_FROM_FREQ(Frequency) ((F_CPU / (2 * Frequency)) - 5) + +		/* Enums: */ +			/** Enum for the possible return codes of the TWI transfer start routine and other dependant TWI functions. */ +			enum TWI_ErrorCodes_t +			{ +				TWI_ERROR_NoError              = 0, /**< Indicates that the command completed successfully. */ +				TWI_ERROR_BusFault             = 1, /**< A TWI bus fault occurred while attempting to capture the bus. */ +				TWI_ERROR_BusCaptureTimeout    = 2, /**< A timeout occurred whilst waiting for the bus to be ready. */ +				TWI_ERROR_SlaveResponseTimeout = 3, /**< No ACK received at the nominated slave address within the timeout period. */ +				TWI_ERROR_SlaveNotReady        = 4, /**< Slave NAKed the TWI bus START condition. */ +				TWI_ERROR_SlaveNAK             = 5, /**< Slave NAKed whilst attempting to send data to the device. */ +			}; + +		/* Inline Functions: */ +			/** Initializes the TWI hardware into master mode, ready for data transmission and reception. This must be +			 *  before any other TWI operations. +			 * +			 *  The generated SCL frequency will be according to the formula <pre>F_CPU / (2 * (5 + (BAUD)))</pre>. +			 * +			 *  \attention The value of the \c BitLength parameter should not be set below 10 or invalid bus conditions may +			 *             occur, as indicated in the XMEGA microcontroller datasheet. +			 * +			 *  \param[in] TWI   Pointer to the base of the TWI peripheral within the device. +			 *  \param[in] Baud  Value of the BAUD register of the TWI Master. +			 */ +			static inline void TWI_Init(TWI_t* const TWI, +			                            const uint8_t Baud) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1); +			static inline void TWI_Init(TWI_t* const TWI, +			                            const uint8_t Baud) +			{ +				TWI->CTRL          = 0x00; +				TWI->MASTER.BAUD   = Baud; +				TWI->MASTER.CTRLA  = TWI_MASTER_ENABLE_bm; +				TWI->MASTER.CTRLB  = 0; +				TWI->MASTER.STATUS = TWI_MASTER_BUSSTATE_IDLE_gc; +			} + +			/** Turns off the TWI driver hardware. If this is called, any further TWI operations will require a call to +			 *  \ref TWI_Init() before the TWI can be used again. +	   		 * +			 *  \param[in] TWI  Pointer to the base of the TWI peripheral within the device. +			 */ +			static inline void TWI_Disable(TWI_t* const TWI) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1); +			static inline void TWI_Disable(TWI_t* const TWI) +			{ +				TWI->MASTER.CTRLA &= ~TWI_MASTER_ENABLE_bm; +			} + +			/** Sends a TWI STOP onto the TWI bus, terminating communication with the currently addressed device. +			 * +			 *  \param[in] TWI  Pointer to the base of the TWI peripheral within the device. +			 */ +			static inline void TWI_StopTransmission(TWI_t* const TWI) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1); +			static inline void TWI_StopTransmission(TWI_t* const TWI) +			{ +				TWI->MASTER.CTRLC = TWI_MASTER_ACKACT_bm | TWI_MASTER_CMD_STOP_gc; +			} + +		/* Function Prototypes: */ +			/** Begins a master mode TWI bus communication with the given slave device address. +			 * +			 *  \param[in] TWI           Pointer to the base of the TWI peripheral within the device. +			 *  \param[in] SlaveAddress  Address of the slave TWI device to communicate with. +			 *  \param[in] TimeoutMS     Timeout period within which the slave must respond, in milliseconds. +			 * +			 *  \return A value from the \ref TWI_ErrorCodes_t enum. +			 */ +			uint8_t TWI_StartTransmission(TWI_t* const TWI, +			                              const uint8_t SlaveAddress, +			                              const uint8_t TimeoutMS) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a byte to the currently addressed device on the TWI bus. +			 * +			 *  \param[in] TWI   Pointer to the base of the TWI peripheral within the device. +			 *  \param[in] Byte  Byte to send to the currently addressed device +			 * +			 *  \return Boolean \c true if the recipient ACKed the byte, \c false otherwise +			 */ +			bool TWI_SendByte(TWI_t* const TWI, +			                  const uint8_t Byte) ATTR_NON_NULL_PTR_ARG(1); + +			/** Receives a byte from the currently addressed device on the TWI bus. +			 * +			 *  \param[in] TWI       Pointer to the base of the TWI peripheral within the device. +			 *  \param[in] Byte      Location where the read byte is to be stored. +			 *  \param[in] LastByte  Indicates if the byte should be ACKed if false, NAKed if true. +			 * +			 *  \return Boolean \c true if the byte reception successfully completed, \c false otherwise. +			 */ +			bool TWI_ReceiveByte(TWI_t* const TWI, +			                     uint8_t* const Byte, +			                     const bool LastByte) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** High level function to perform a complete packet transfer over the TWI bus to the specified +			 *  device. +			 * +			 *  \param[in] TWI                 Pointer to the base of the TWI peripheral within the device. +			 *  \param[in] SlaveAddress        Base address of the TWI slave device to communicate with. +			 *  \param[in] TimeoutMS           Timeout for bus capture and slave START ACK, in milliseconds. +			 *  \param[in] InternalAddress     Pointer to a location where the internal slave read start address is stored. +			 *  \param[in] InternalAddressLen  Size of the internal device address, in bytes. +			 *  \param[in] Buffer              Pointer to a buffer where the read packet data is to be stored. +			 *  \param[in] Length              Size of the packet to read, in bytes. +			 * +			 *  \return A value from the \ref TWI_ErrorCodes_t enum. +			 */ +			uint8_t TWI_ReadPacket(TWI_t* const TWI, +			                       const uint8_t SlaveAddress, +			                       const uint8_t TimeoutMS, +			                       const uint8_t* InternalAddress, +			                       uint8_t InternalAddressLen, +			                       uint8_t* Buffer, +			                       uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(4); + +			/** High level function to perform a complete packet transfer over the TWI bus from the specified +			 *  device. +			 * +			 *  \param[in] TWI                 Pointer to the base of the TWI peripheral within the device. +			 *  \param[in] SlaveAddress        Base address of the TWI slave device to communicate with +			 *  \param[in] TimeoutMS           Timeout for bus capture and slave START ACK, in milliseconds +			 *  \param[in] InternalAddress     Pointer to a location where the internal slave write start address is stored +			 *  \param[in] InternalAddressLen  Size of the internal device address, in bytes +			 *  \param[in] Buffer              Pointer to a buffer where the packet data to send is stored +			 *  \param[in] Length              Size of the packet to send, in bytes +			 * +			 *  \return A value from the \ref TWI_ErrorCodes_t enum. +			 */ +			uint8_t TWI_WritePacket(TWI_t* const TWI, +			                        const uint8_t SlaveAddress, +			                        const uint8_t TimeoutMS, +			                        const uint8_t* InternalAddress, +			                        uint8_t InternalAddressLen, +			                        const uint8_t* Buffer, +			                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(4); + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/AndroidAccessoryClass.h b/lib/lufa/LUFA/Drivers/USB/Class/AndroidAccessoryClass.h new file mode 100644 index 0000000000..f1c0109ea0 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/AndroidAccessoryClass.h @@ -0,0 +1,77 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Master include file for the library USB Android Open Accessory Class driver. + * + *  Master include file for the library USB Android Open Accessory Class driver, for both host and device modes, where available. + * + *  This file should be included in all user projects making use of this optional class driver, instead of + *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories. + */ + +/** \ingroup Group_USBClassDrivers + *  \defgroup Group_USBClassAOA Android Open Accessory Class Driver + *  \brief USB class driver for the Google Android Open Accessory class standard. + * + *  \section Sec_USBClassAOA_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassAOA_ModDescription Module Description + *  Android Open Accessory Class Driver module. This module contains an internal implementation of the USB Android Open Accessory + *  Class, for Host USB mode. User applications can use this class driver instead of implementing the Android Open Accessory Class + *  manually via the low-level LUFA APIs. + * + *  This module is designed to simplify the user code by exposing only the required interface needed to interface with + *  Host using the USB Android Open Accessory Class. + * + *  @{ + */ + +#ifndef _AOA_CLASS_H_ +#define _AOA_CLASS_H_ + +	/* Macros: */ +		#define __INCLUDE_FROM_USB_DRIVER +		#define __INCLUDE_FROM_AOA_DRIVER + +	/* Includes: */ +		#include "../Core/USBMode.h" + +		#if defined(USB_CAN_BE_HOST) +			#include "Host/AndroidAccessoryClassHost.h" +		#endif + +#endif + +/** @} */ + + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/AudioClass.h b/lib/lufa/LUFA/Drivers/USB/Class/AudioClass.h new file mode 100644 index 0000000000..d6ced05dc6 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/AudioClass.h @@ -0,0 +1,81 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Master include file for the library USB Audio 1.0 Class driver. + * + *  Master include file for the library USB Audio 1.0 Class driver, for both host and device modes, where available. + * + *  This file should be included in all user projects making use of this optional class driver, instead of + *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories. + */ + +/** \ingroup Group_USBClassDrivers + *  \defgroup Group_USBClassAudio Audio 1.0 Class Driver + *  \brief USB class driver for the USB-IF Audio 1.0 class standard. + * + *  \section Sec_USBClassAudio_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Device/AudioClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + *    - LUFA/Drivers/USB/Class/Host/AudioClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassAudio_ModDescription Module Description + *  Audio 1.0 Class Driver module. This module contains an internal implementation of the USB Audio 1.0 Class, for both + *  Device and Host USB modes. User applications can use this class driver instead of implementing the Audio 1.0 class + *  manually via the low-level LUFA APIs. + * + *  This module is designed to simplify the user code by exposing only the required interface needed to interface with + *  Hosts or Devices using the USB Audio 1.0 Class. + * + *  @{ + */ + +#ifndef _AUDIO_CLASS_H_ +#define _AUDIO_CLASS_H_ + +	/* Macros: */ +		#define __INCLUDE_FROM_USB_DRIVER +		#define __INCLUDE_FROM_AUDIO_DRIVER + +	/* Includes: */ +		#include "../Core/USBMode.h" + +		#if defined(USB_CAN_BE_DEVICE) +			#include "Device/AudioClassDevice.h" +		#endif + +		#if defined(USB_CAN_BE_HOST) +			#include "Host/AudioClassHost.h" +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/CDCClass.h b/lib/lufa/LUFA/Drivers/USB/Class/CDCClass.h new file mode 100644 index 0000000000..30b3ee237d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/CDCClass.h @@ -0,0 +1,81 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Master include file for the library USB CDC-ACM Class driver. + * + *  Master include file for the library USB CDC Class driver, for both host and device modes, where available. + * + *  This file should be included in all user projects making use of this optional class driver, instead of + *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories. + */ + +/** \ingroup Group_USBClassDrivers + *  \defgroup Group_USBClassCDC CDC-ACM (Virtual Serial) Class Driver + *  \brief USB class driver for the USB-IF CDC-ACM (Virtual Serial) class standard. + * + *  \section Sec_USBClassCDC_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Device/CDCClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + *    - LUFA/Drivers/USB/Class/Host/CDCClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassCDC_ModDescription Module Description + *  CDC Class Driver module. This module contains an internal implementation of the USB CDC-ACM class Virtual Serial + *  Ports, for both Device and Host USB modes. User applications can use this class driver instead of implementing the + *  CDC class manually via the low-level LUFA APIs. + * + *  This module is designed to simplify the user code by exposing only the required interface needed to interface with + *  Hosts or Devices using the USB CDC Class. + * + *  @{ + */ + +#ifndef _CDC_CLASS_H_ +#define _CDC_CLASS_H_ + +	/* Macros: */ +		#define __INCLUDE_FROM_USB_DRIVER +		#define __INCLUDE_FROM_CDC_DRIVER + +	/* Includes: */ +		#include "../Core/USBMode.h" + +		#if defined(USB_CAN_BE_DEVICE) +			#include "Device/CDCClassDevice.h" +		#endif + +		#if defined(USB_CAN_BE_HOST) +			#include "Host/CDCClassHost.h" +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/AndroidAccessoryClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/AndroidAccessoryClassCommon.h new file mode 100644 index 0000000000..fdf8671fc9 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/AndroidAccessoryClassCommon.h @@ -0,0 +1,129 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Common definitions and declarations for the library USB Android Open Accessory Class driver. + * + *  Common definitions and declarations for the library USB Android Open Accessory Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassAOA + *  \defgroup Group_USBClassAOACommon  Common Class Definitions + * + *  \section Sec_USBClassAOACommon_ModDescription Module Description + *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB + *  Android Open Accessory Class. + * + *  @{ + */ + +#ifndef _AOA_CLASS_COMMON_H_ +#define _AOA_CLASS_COMMON_H_ + +	/* Includes: */ +		#include "../../Core/StdDescriptors.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_AOA_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Macros: */ +		/** Product ID value in a Device Descriptor to indicate an Android device in Open Accessory mode. */ +		#define ANDROID_ACCESSORY_PRODUCT_ID        0x2D00 + +		/** Product ID value in a Device Descriptor to indicate an Android device in Open Accessory and Android Debug mode. */ +		#define ANDROID_ACCESSORY_ADB_PRODUCT_ID    0x2D01 + +	/* Enums: */ +		/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the +		 *  Android Open Accessory class. +		 */ +		enum AOA_Descriptor_ClassSubclassProtocol_t +		{ +			AOA_CSCP_AOADataClass    = 0xFF, /**< Descriptor Class value indicating that the device or interface +			                                  *   belongs to the AOA data class. +			                                  */ +			AOA_CSCP_AOADataSubclass = 0xFF, /**< Descriptor Subclass value indicating that the device or interface +			                                  *   belongs to AOA data subclass. +			                                  */ +			AOA_CSCP_AOADataProtocol = 0x00, /**< Descriptor Protocol value indicating that the device or interface +			                                  *   belongs to the AOA data class protocol. +			                                  */ +		}; + +		/** Enum for the Android Open Accessory class specific control requests that can be issued by the USB bus host. */ +		enum AOA_ClassRequests_t +		{ +			AOA_REQ_GetAccessoryProtocol    = 0x33, /**< Android Open Accessory control request to retrieve the device's supported Accessory Protocol version. */ +			AOA_REQ_SendString              = 0x34, /**< Android Open Accessory control request to set an accessory property string in the device. */ +			AOA_REQ_StartAccessoryMode      = 0x35, /**< Android Open Accessory control request to switch the device into Accessory mode. */ +		}; + +		/** Enum for the possible Android Open Accessory property string indexes. */ +		enum AOA_Strings_t +		{ +			AOA_STRING_Manufacturer         = 0, /**< Index of the Manufacturer property string. */ +			AOA_STRING_Model                = 1, /**< Index of the Model Name property string. */ +			AOA_STRING_Description          = 2, /**< Index of the Description property string. */ +			AOA_STRING_Version              = 3, /**< Index of the Version Number property string. */ +			AOA_STRING_URI                  = 4, /**< Index of the URI Information property string. */ +			AOA_STRING_Serial               = 5, /**< Index of the Serial Number property string. */ + +			#if !defined(__DOXYGEN__) +			AOA_STRING_TOTAL_STRINGS +			#endif +		}; + +		/** Enum for the possible Android Open Accessory protocol versions. */ +		enum AOA_Protocols_t +		{ +			AOA_PROTOCOL_AccessoryV1        = 0x0001, /**< Android Open Accessory version 1. */ +			AOA_PROTOCOL_AccessoryV2        = 0x0002, /**< Android Open Accessory version 2. */ +		}; + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/AudioClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/AudioClassCommon.h new file mode 100644 index 0000000000..46ecd08587 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/AudioClassCommon.h @@ -0,0 +1,780 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Common definitions and declarations for the library USB Audio 1.0 Class driver. + * + *  Common definitions and declarations for the library USB Audio 1.0 Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassAudio + *  \defgroup Group_USBClassAudioCommon  Common Class Definitions + * + *  \section Sec_USBClassAudioCommon_ModDescription Module Description + *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB + *  Audio 1.0 Class. + * + *  @{ + */ + +#ifndef _AUDIO_CLASS_COMMON_H_ +#define _AUDIO_CLASS_COMMON_H_ + +	/* Includes: */ +		#include "../../Core/StdDescriptors.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_AUDIO_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Macros: */ +		/** \name Audio Channel Masks */ +		//@{ +		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_CHANNEL_LEFT_FRONT           (1 << 0) + +		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_CHANNEL_RIGHT_FRONT          (1 << 1) + +		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_CHANNEL_CENTER_FRONT         (1 << 2) + +		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_CHANNEL_LOW_FREQ_ENHANCE     (1 << 3) + +		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_CHANNEL_LEFT_SURROUND        (1 << 4) + +		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_CHANNEL_RIGHT_SURROUND       (1 << 5) + +		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_CHANNEL_LEFT_OF_CENTER       (1 << 6) + +		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_CHANNEL_RIGHT_OF_CENTER      (1 << 7) + +		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_CHANNEL_SURROUND             (1 << 8) + +		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_CHANNEL_SIDE_LEFT            (1 << 9) + +		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_CHANNEL_SIDE_RIGHT           (1 << 10) + +		/** Supported channel mask for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_CHANNEL_TOP                  (1 << 11) +		//@} + +		/** \name Audio Feature Masks */ +		//@{ +		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */ +		#define AUDIO_FEATURE_MUTE                 (1 << 0) + +		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */ +		#define AUDIO_FEATURE_VOLUME               (1 << 1) + +		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */ +		#define AUDIO_FEATURE_BASS                 (1 << 2) + +		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */ +		#define AUDIO_FEATURE_MID                  (1 << 3) + +		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */ +		#define AUDIO_FEATURE_TREBLE               (1 << 4) + +		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */ +		#define AUDIO_FEATURE_GRAPHIC_EQUALIZER    (1 << 5) + +		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */ +		#define AUDIO_FEATURE_AUTOMATIC_GAIN       (1 << 6) + +		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */ +		#define AUDIO_FEATURE_DELAY                (1 << 7) + +		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */ +		#define AUDIO_FEATURE_BASS_BOOST           (1 << 8) + +		/** Supported feature mask for an Audio class feature unit descriptor. See the Audio class specification for more details. */ +		#define AUDIO_FEATURE_BASS_LOUDNESS        (1 << 9) +		//@} + +		/** \name Audio Terminal Types */ +		//@{ +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_UNDEFINED           0x0100 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_STREAMING           0x0101 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_VENDOR              0x01FF + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_IN_UNDEFINED        0x0200 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_IN_MIC              0x0201 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_IN_DESKTOP_MIC      0x0202 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_IN_PERSONAL_MIC     0x0203 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_IN_OMNIDIR_MIC      0x0204 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_IN_MIC_ARRAY        0x0205 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_IN_PROCESSING_MIC   0x0206 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_IN_OUT_UNDEFINED    0x0300 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_OUT_SPEAKER         0x0301 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_OUT_HEADPHONES      0x0302 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_OUT_HEAD_MOUNTED    0x0303 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_OUT_DESKTOP         0x0304 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_OUT_ROOM            0x0305 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_OUT_COMMUNICATION   0x0306 + +		/** Terminal type constant for an Audio class terminal descriptor. See the Audio class specification for more details. */ +		#define AUDIO_TERMINAL_OUT_LOWFREQ         0x0307 +		//@} + +		/** Convenience macro to fill a 24-bit \ref USB_Audio_SampleFreq_t structure with the given sample rate as a 24-bit number. +		 * +		 *  \param[in] freq  Required audio sampling frequency in HZ +		 */ +		#define AUDIO_SAMPLE_FREQ(freq)           {.Byte1 = ((uint32_t)freq & 0xFF), .Byte2 = (((uint32_t)freq >> 8) & 0xFF), .Byte3 = (((uint32_t)freq >> 16) & 0xFF)} + +		/** Mask for the attributes parameter of an Audio class-specific Endpoint descriptor, indicating that the endpoint +		 *  accepts only filled endpoint packets of audio samples. +		 */ +		#define AUDIO_EP_FULL_PACKETS_ONLY        (1 << 7) + +		/** Mask for the attributes parameter of an Audio class-specific Endpoint descriptor, indicating that the endpoint +		 *  will accept partially filled endpoint packets of audio samples. +		 */ +		#define AUDIO_EP_ACCEPTS_SMALL_PACKETS    (0 << 7) + +		/** Mask for the attributes parameter of an Audio class-specific Endpoint descriptor, indicating that the endpoint +		 *  allows for sampling frequency adjustments to be made via control requests directed at the endpoint. +		 */ +		#define AUDIO_EP_SAMPLE_FREQ_CONTROL      (1 << 0) + +		/** Mask for the attributes parameter of an Audio class-specific Endpoint descriptor, indicating that the endpoint +		 *  allows for pitch adjustments to be made via control requests directed at the endpoint. +		 */ +		#define AUDIO_EP_PITCH_CONTROL            (1 << 1) + +	/* Enums: */ +		/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the Audio +		 *  device class. +		 */ +		enum Audio_Descriptor_ClassSubclassProtocol_t +		{ +			AUDIO_CSCP_AudioClass                     = 0x01, /**< Descriptor Class value indicating that the device or +			                                                   *   interface belongs to the USB Audio 1.0 class. +			                                                   */ +			AUDIO_CSCP_ControlSubclass                = 0x01, /**< Descriptor Subclass value indicating that the device or +			                                                   *   interface belongs to the Audio Control subclass. +			                                                   */ +			AUDIO_CSCP_ControlProtocol                = 0x00, /**< Descriptor Protocol value indicating that the device or +			                                                   *   interface belongs to the Audio Control protocol. +			                                                   */ +			AUDIO_CSCP_AudioStreamingSubclass         = 0x02, /**< Descriptor Subclass value indicating that the device or +			                                                   *   interface belongs to the MIDI Streaming subclass. +			                                                   */ +			AUDIO_CSCP_MIDIStreamingSubclass          = 0x03, /**< Descriptor Subclass value indicating that the device or +			                                                   *   interface belongs to the Audio streaming subclass. +			                                                   */ +			AUDIO_CSCP_StreamingProtocol              = 0x00, /**< Descriptor Protocol value indicating that the device or +			                                                   *   interface belongs to the Streaming Audio protocol. +			                                                   */ +		}; + +		/** Audio class specific interface description subtypes, for the Audio Control interface. */ +		enum Audio_CSInterface_AC_SubTypes_t +		{ +			AUDIO_DSUBTYPE_CSInterface_Header         = 0x01, /**< Audio class specific control interface header. */ +			AUDIO_DSUBTYPE_CSInterface_InputTerminal  = 0x02, /**< Audio class specific control interface Input Terminal. */ +			AUDIO_DSUBTYPE_CSInterface_OutputTerminal = 0x03, /**< Audio class specific control interface Output Terminal. */ +			AUDIO_DSUBTYPE_CSInterface_Mixer          = 0x04, /**< Audio class specific control interface Mixer Unit. */ +			AUDIO_DSUBTYPE_CSInterface_Selector       = 0x05, /**< Audio class specific control interface Selector Unit. */ +			AUDIO_DSUBTYPE_CSInterface_Feature        = 0x06, /**< Audio class specific control interface Feature Unit. */ +			AUDIO_DSUBTYPE_CSInterface_Processing     = 0x07, /**< Audio class specific control interface Processing Unit. */ +			AUDIO_DSUBTYPE_CSInterface_Extension      = 0x08, /**< Audio class specific control interface Extension Unit. */ +		}; + +		/** Audio class specific interface description subtypes, for the Audio Streaming interface. */ +		enum Audio_CSInterface_AS_SubTypes_t +		{ +			AUDIO_DSUBTYPE_CSInterface_General        = 0x01, /**< Audio class specific streaming interface general descriptor. */ +			AUDIO_DSUBTYPE_CSInterface_FormatType     = 0x02, /**< Audio class specific streaming interface format type descriptor. */ +			AUDIO_DSUBTYPE_CSInterface_FormatSpecific = 0x03, /**< Audio class specific streaming interface format information descriptor. */ +		}; + +		/** Audio class specific endpoint description subtypes, for the Audio Streaming interface. */ +		enum Audio_CSEndpoint_SubTypes_t +		{ +			AUDIO_DSUBTYPE_CSEndpoint_General         = 0x01, /**< Audio class specific endpoint general descriptor. */ +		}; + +		/** Enum for the Audio class specific control requests that can be issued by the USB bus host. */ +		enum Audio_ClassRequests_t +		{ +			AUDIO_REQ_SetCurrent    = 0x01, /**< Audio class-specific request to set the current value of a parameter within the device. */ +			AUDIO_REQ_SetMinimum    = 0x02, /**< Audio class-specific request to set the minimum value of a parameter within the device. */ +			AUDIO_REQ_SetMaximum    = 0x03, /**< Audio class-specific request to set the maximum value of a parameter within the device. */ +			AUDIO_REQ_SetResolution = 0x04, /**< Audio class-specific request to set the resolution value of a parameter within the device. */ +			AUDIO_REQ_SetMemory     = 0x05, /**< Audio class-specific request to set the memory value of a parameter within the device. */ +			AUDIO_REQ_GetCurrent    = 0x81, /**< Audio class-specific request to get the current value of a parameter within the device. */ +			AUDIO_REQ_GetMinimum    = 0x82, /**< Audio class-specific request to get the minimum value of a parameter within the device. */ +			AUDIO_REQ_GetMaximum    = 0x83, /**< Audio class-specific request to get the maximum value of a parameter within the device. */ +			AUDIO_REQ_GetResolution = 0x84, /**< Audio class-specific request to get the resolution value of a parameter within the device. */ +			AUDIO_REQ_GetMemory     = 0x85, /**< Audio class-specific request to get the memory value of a parameter within the device. */ +			AUDIO_REQ_GetStatus     = 0xFF, /**< Audio class-specific request to get the device status. */ +		}; + +		/** Enum for Audio class specific Endpoint control modifiers which can be set and retrieved by a USB host, if the corresponding +		 *  endpoint control is indicated to be supported in the Endpoint's Audio-class specific endpoint descriptor. +		 */ +		enum Audio_EndpointControls_t +		{ +			AUDIO_EPCONTROL_SamplingFreq = 0x01, /**< Sampling frequency adjustment of the endpoint. */ +			AUDIO_EPCONTROL_Pitch        = 0x02, /**< Pitch adjustment of the endpoint. */ +		}; + +	/* Type Defines: */ +		/** \brief Audio class-specific Input Terminal Descriptor (LUFA naming conventions). +		 * +		 *  Type define for an Audio class-specific input terminal descriptor. This indicates to the host that the device +		 *  contains an input audio source, either from a physical terminal on the device, or a logical terminal (for example, +		 *  a USB endpoint). See the USB Audio specification for more details. +		 * +		 *  \see \ref USB_Audio_StdDescriptor_InputTerminal_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ +			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors, +			                                  *   must be \ref AUDIO_DSUBTYPE_CSInterface_InputTerminal. +			                                  */ + +			uint8_t                 TerminalID; /**< ID value of this terminal unit - must be a unique value within the device. */ +			uint16_t                TerminalType; /**< Type of terminal, a \c TERMINAL_* mask. */ +			uint8_t                 AssociatedOutputTerminal; /**< ID of associated output terminal, for physically grouped terminals +			                                                   *   such as the speaker and microphone of a phone handset. +			                                                   */ +			uint8_t                 TotalChannels; /**< Total number of separate audio channels within this interface (right, left, etc.) */ +			uint16_t                ChannelConfig; /**< \c CHANNEL_* masks indicating what channel layout is supported by this terminal. */ + +			uint8_t                 ChannelStrIndex; /**< Index of a string descriptor describing this channel within the device. */ +			uint8_t                 TerminalStrIndex; /**< Index of a string descriptor describing this descriptor within the device. */ +		} ATTR_PACKED USB_Audio_Descriptor_InputTerminal_t; + +		/** \brief Audio class-specific Input Terminal Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for an Audio class-specific input terminal descriptor. This indicates to the host that the device +		 *  contains an input audio source, either from a physical terminal on the device, or a logical terminal (for example, +		 *  a USB endpoint). See the USB Audio specification for more details. +		 * +		 *  \see \ref USB_Audio_Descriptor_InputTerminal_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t  bLength; /**< Size of the descriptor, in bytes. */ +			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +			                           *   given by the specific class. +			                           */ + +			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors, +			                              *   must be \ref AUDIO_DSUBTYPE_CSInterface_InputTerminal. +			                              */ +			uint8_t  bTerminalID; /**< ID value of this terminal unit - must be a unique value within the device. */ +			uint16_t wTerminalType; /**< Type of terminal, a \c TERMINAL_* mask. */ +			uint8_t  bAssocTerminal; /**< ID of associated output terminal, for physically grouped terminals +			                          *   such as the speaker and microphone of a phone handset. +			                          */ +			uint8_t  bNrChannels; /**< Total number of separate audio channels within this interface (right, left, etc.) */ +			uint16_t wChannelConfig; /**< \c CHANNEL_* masks indicating what channel layout is supported by this terminal. */ + +			uint8_t  iChannelNames; /**< Index of a string descriptor describing this channel within the device. */ +			uint8_t  iTerminal; /**< Index of a string descriptor describing this descriptor within the device. */ +		} ATTR_PACKED USB_Audio_StdDescriptor_InputTerminal_t; + +		/** \brief Audio class-specific Output Terminal Descriptor (LUFA naming conventions). +		 * +		 *  Type define for an Audio class-specific output terminal descriptor. This indicates to the host that the device +		 *  contains an output audio sink, either to a physical terminal on the device, or a logical terminal (for example, +		 *  a USB endpoint). See the USB Audio specification for more details. +		 * +		 *  \see \ref USB_Audio_StdDescriptor_OutputTerminal_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ +			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors, +			                                  *   must be \ref AUDIO_DSUBTYPE_CSInterface_OutputTerminal. +			                                  */ + +			uint8_t                 TerminalID; /**< ID value of this terminal unit - must be a unique value within the device. */ +			uint16_t                TerminalType; /**< Type of terminal, a \c TERMINAL_* mask. */ +			uint8_t                 AssociatedInputTerminal; /**< ID of associated input terminal, for physically grouped terminals +			                                                    *   such as the speaker and microphone of a phone handset. +			                                                    */ +			uint8_t                 SourceID; /**< ID value of the unit this terminal's audio is sourced from. */ + +			uint8_t                 TerminalStrIndex; /**< Index of a string descriptor describing this descriptor within the device. */ +		} ATTR_PACKED USB_Audio_Descriptor_OutputTerminal_t; + +		/** \brief Audio class-specific Output Terminal Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for an Audio class-specific output terminal descriptor. This indicates to the host that the device +		 *  contains an output audio sink, either to a physical terminal on the device, or a logical terminal (for example, +		 *  a USB endpoint). See the USB Audio specification for more details. +		 * +		 *  \see \ref USB_Audio_Descriptor_OutputTerminal_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t  bLength; /**< Size of the descriptor, in bytes. */ +			uint8_t  bDescriptorType; /**< Sub type value used to distinguish between audio class-specific descriptors, +			                           *   must be \ref AUDIO_DSUBTYPE_CSInterface_OutputTerminal. +			                           */ + +			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors, +			                              *   a value from the \ref Audio_CSInterface_AC_SubTypes_t enum. +			                              */ +			uint8_t  bTerminalID; /**< ID value of this terminal unit - must be a unique value within the device. */ +			uint16_t wTerminalType; /**< Type of terminal, a \c TERMINAL_* mask. */ +			uint8_t  bAssocTerminal; /**< ID of associated input terminal, for physically grouped terminals +			                          *   such as the speaker and microphone of a phone handset. +			                          */ +			uint8_t  bSourceID; /**< ID value of the unit this terminal's audio is sourced from. */ + +			uint8_t  iTerminal; /**< Index of a string descriptor describing this descriptor within the device. */ +		} ATTR_PACKED USB_Audio_StdDescriptor_OutputTerminal_t; + +		/** \brief Audio class-specific Interface Descriptor (LUFA naming conventions). +		 * +		 *  Type define for an Audio class-specific interface descriptor. This follows a regular interface descriptor to +		 *  supply extra information about the audio device's layout to the host. See the USB Audio specification for more +		 *  details. +		 * +		 *  \see \ref USB_Audio_StdDescriptor_Interface_AC_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ +			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors, +			                                  *   a value from the \ref Audio_CSInterface_AS_SubTypes_t enum. +			                                  */ + +			uint16_t                ACSpecification; /**< Binary Coded Decimal value, indicating the supported Audio Class specification version. +			                                          * +			                                          *   \see \ref VERSION_BCD() utility macro. +			                                          */ +			uint16_t                TotalLength; /**< Total length of the Audio class-specific descriptors, including this descriptor. */ + +			uint8_t                 InCollection; /**< Total number of Audio Streaming interfaces linked to this Audio Control interface (must be 1). */ +			uint8_t                 InterfaceNumber; /**< Interface number of the associated Audio Streaming interface. */ +		} ATTR_PACKED USB_Audio_Descriptor_Interface_AC_t; + +		/** \brief Audio class-specific Interface Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for an Audio class-specific interface descriptor. This follows a regular interface descriptor to +		 *  supply extra information about the audio device's layout to the host. See the USB Audio specification for more +		 *  details. +		 * +		 *  \see \ref USB_Audio_Descriptor_Interface_AC_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t  bLength; /**< Size of the descriptor, in bytes. */ +			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +			                           *   given by the specific class. +			                           */ + +			uint8_t  bDescriptorSubtype;/**< Sub type value used to distinguish between audio class-specific descriptors, +			                             *   a value from the \ref Audio_CSInterface_AS_SubTypes_t enum. +			                             */ + +			uint16_t bcdADC; /**< Binary coded decimal value, indicating the supported Audio Class specification version. +			                  * +			                  *   \see \ref VERSION_BCD() utility macro. +			                  */ +			uint16_t wTotalLength; /**< Total length of the Audio class-specific descriptors, including this descriptor. */ + +			uint8_t  bInCollection; /**< Total number of Audio Streaming interfaces linked to this Audio Control interface (must be 1). */ +			uint8_t  bInterfaceNumbers; /**< Interface number of the associated Audio Streaming interface. */ +		} ATTR_PACKED USB_Audio_StdDescriptor_Interface_AC_t; + +		/** \brief Audio class-specific Feature Unit Descriptor (LUFA naming conventions). +		 * +		 *  Type define for an Audio class-specific Feature Unit descriptor. This indicates to the host what features +		 *  are present in the device's audio stream for basic control, such as per-channel volume. See the USB Audio +		 *  specification for more details. +		 * +		 *  \see \ref USB_Audio_StdDescriptor_FeatureUnit_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ +			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors, +			                                  *   must be \ref AUDIO_DSUBTYPE_CSInterface_Feature. +			                                  */ + +			uint8_t                 UnitID; /**< ID value of this feature unit - must be a unique value within the device. */ +			uint8_t                 SourceID; /**< Source ID value of the audio source input into this feature unit. */ + +			uint8_t                 ControlSize; /**< Size of each element in the \c ChannelControls array. */ +			uint8_t                 ChannelControls[3]; /**< Feature masks for the control channel, and each separate audio channel. */ + +			uint8_t                 FeatureUnitStrIndex; /**< Index of a string descriptor describing this descriptor within the device. */ +		} ATTR_PACKED USB_Audio_Descriptor_FeatureUnit_t; + +		/** \brief Audio class-specific Feature Unit Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for an Audio class-specific Feature Unit descriptor. This indicates to the host what features +		 *  are present in the device's audio stream for basic control, such as per-channel volume. See the USB Audio +		 *  specification for more details. +		 * +		 *  \see \ref USB_Audio_Descriptor_FeatureUnit_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t bLength; /**< Size of the descriptor, in bytes. */ +			uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +			                          *   given by the specific class. +			                          */ + +			uint8_t bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors, +			                             *   must be \ref AUDIO_DSUBTYPE_CSInterface_Feature. +			                             */ + +			uint8_t bUnitID; /**< ID value of this feature unit - must be a unique value within the device. */ +			uint8_t bSourceID; /**< Source ID value of the audio source input into this feature unit. */ + +			uint8_t bControlSize; /**< Size of each element in the \c ChannelControls array. */ +			uint8_t bmaControls[3]; /**< Feature masks for the control channel, and each separate audio channel. */ + +			uint8_t iFeature; /**< Index of a string descriptor describing this descriptor within the device. */ +		} ATTR_PACKED USB_Audio_StdDescriptor_FeatureUnit_t; + +		/** \brief Audio class-specific Streaming Audio Interface Descriptor (LUFA naming conventions). +		 * +		 *  Type define for an Audio class-specific streaming interface descriptor. This indicates to the host +		 *  how audio streams within the device are formatted. See the USB Audio specification for more details. +		 * +		 *  \see \ref USB_Audio_StdDescriptor_Interface_AS_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ +			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors, +			                                  *   a value from the \ref Audio_CSInterface_AS_SubTypes_t enum. +			                                  */ + +			uint8_t                 TerminalLink; /**< ID value of the output terminal this descriptor is describing. */ + +			uint8_t                 FrameDelay; /**< Delay in frames resulting from the complete sample processing from input to output. */ +			uint16_t                AudioFormat; /**< Format of the audio stream, see Audio Device Formats specification. */ +		} ATTR_PACKED USB_Audio_Descriptor_Interface_AS_t; + +		/** \brief Audio class-specific Streaming Audio Interface Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for an Audio class-specific streaming interface descriptor. This indicates to the host +		 *  how audio streams within the device are formatted. See the USB Audio specification for more details. +		 * +		 *  \see \ref USB_Audio_Descriptor_Interface_AS_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t  bLength; /**< Size of the descriptor, in bytes. */ +			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +			                           *   given by the specific class. +			                           */ + +			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors, +			                              *   a value from the \ref Audio_CSInterface_AS_SubTypes_t enum. +			                              */ + +			uint8_t  bTerminalLink; /**< ID value of the output terminal this descriptor is describing. */ + +			uint8_t  bDelay; /**< Delay in frames resulting from the complete sample processing from input to output. */ +			uint16_t wFormatTag; /**< Format of the audio stream, see Audio Device Formats specification. */ +		} ATTR_PACKED USB_Audio_StdDescriptor_Interface_AS_t; + +		/** \brief Audio class-specific Format Descriptor (LUFA naming conventions). +		 * +		 *  Type define for an Audio class-specific audio format descriptor. This is used to give the host full details +		 *  about the number of channels, the sample resolution, acceptable sample frequencies and encoding method used +		 *  in the device's audio streams. See the USB Audio specification for more details. +		 * +		 *  \attention This descriptor <b>must</b> be followed by one or more \ref USB_Audio_SampleFreq_t elements containing +		 *             the continuous or discrete sample frequencies. +		 * +		 *  \see \ref USB_Audio_StdDescriptor_Format_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ +			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors, +			                                  *   must be \ref AUDIO_DSUBTYPE_CSInterface_FormatType. +			                                  */ + +			uint8_t                 FormatType; /**< Format of the audio stream, see Audio Device Formats specification. */ +			uint8_t                 Channels; /**< Total number of discrete channels in the stream. */ + +			uint8_t                 SubFrameSize; /**< Size in bytes of each channel's sample data in the stream. */ +			uint8_t                 BitResolution; /**< Bits of resolution of each channel's samples in the stream. */ + +			uint8_t                 TotalDiscreteSampleRates; /**< Total number of discrete sample frequencies supported by the device. When +			                                                   *   zero, this must be followed by the lower and upper continuous sampling +			                                                   *   frequencies supported by the device; otherwise, this must be followed +			                                                   *   by the given number of discrete sampling frequencies supported. +			                                                   */ +		} ATTR_PACKED USB_Audio_Descriptor_Format_t; + +		/** \brief 24-Bit Audio Frequency Structure. +		 * +		 *  Type define for a 24-bit audio sample frequency structure. As GCC does not contain a built in 24-bit datatype, +		 *  this this structure is used to build up the value instead. Fill this structure with the \ref AUDIO_SAMPLE_FREQ() macro. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t Byte1; /**< Lowest 8 bits of the 24-bit value. */ +			uint8_t Byte2; /**< Middle 8 bits of the 24-bit value. */ +			uint8_t Byte3; /**< Upper 8 bits of the 24-bit value. */ +		} ATTR_PACKED USB_Audio_SampleFreq_t; + +		/** \brief Audio class-specific Format Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for an Audio class-specific audio format descriptor. This is used to give the host full details +		 *  about the number of channels, the sample resolution, acceptable sample frequencies and encoding method used +		 *  in the device's audio streams. See the USB Audio specification for more details. +		 * +		 *  \attention This descriptor <b>must</b> be followed by one or more 24-bit integer elements containing the continuous +		 *             or discrete sample frequencies. +		 * +		 *  \see \ref USB_Audio_Descriptor_Format_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t bLength; /**< Size of the descriptor, in bytes. */ +			uint8_t bDescriptorType; /**< Sub type value used to distinguish between audio class-specific descriptors, +			                          *   must be \ref AUDIO_DSUBTYPE_CSInterface_FormatType. +			                          */ + +			uint8_t bDescriptorSubtype;/**< Sub type value used to distinguish between audio class-specific descriptors, +			                            *   a value from the \ref Audio_CSInterface_AS_SubTypes_t enum. +			                            */ + +			uint8_t bFormatType; /**< Format of the audio stream, see Audio Device Formats specification. */ +			uint8_t bNrChannels; /**< Total number of discrete channels in the stream. */ + +			uint8_t bSubFrameSize; /**< Size in bytes of each channel's sample data in the stream. */ +			uint8_t bBitResolution; /**< Bits of resolution of each channel's samples in the stream. */ + +			uint8_t bSampleFrequencyType; /**< Total number of sample frequencies supported by the device. When +			                               *   zero, this must be followed by the lower and upper continuous sampling +			                               *   frequencies supported by the device; otherwise, this must be followed +			                               *   by the given number of discrete sampling frequencies supported. +			                               */ +		} ATTR_PACKED USB_Audio_StdDescriptor_Format_t; + +		/** \brief Audio class-specific Streaming Endpoint Descriptor (LUFA naming conventions). +		 * +		 *  Type define for an Audio class-specific endpoint descriptor. This contains a regular endpoint +		 *  descriptor with a few Audio-class-specific extensions. See the USB Audio specification for more details. +		 * +		 *  \see \ref USB_Audio_StdDescriptor_StreamEndpoint_Std_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Endpoint_t Endpoint; /**< Standard endpoint descriptor describing the audio endpoint. */ + +			uint8_t                   Refresh; /**< Always set to zero for Audio class devices. */ +			uint8_t                   SyncEndpointNumber; /**< Endpoint address to send synchronization information to, if needed (zero otherwise). */ +		} ATTR_PACKED USB_Audio_Descriptor_StreamEndpoint_Std_t; + +		/** \brief Audio class-specific Streaming Endpoint Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for an Audio class-specific endpoint descriptor. This contains a regular endpoint +		 *  descriptor with a few Audio-class-specific extensions. See the USB Audio specification for more details. +		 * +		 *  \see \ref USB_Audio_Descriptor_StreamEndpoint_Std_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t  bLength; /**< Size of the descriptor, in bytes. */ +			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a +			                           *   value given by the specific class. +			                           */ +			uint8_t  bEndpointAddress; /**< Logical address of the endpoint within the device for the current +			                            *   configuration, including direction mask. +			                            */ +			uint8_t  bmAttributes; /**< Endpoint attributes, comprised of a mask of the endpoint type (\c EP_TYPE_*) +			                        *   and attributes (\c ENDPOINT_ATTR_*) masks. +			                        */ +			uint16_t wMaxPacketSize; /**< Size of the endpoint bank, in bytes. This indicates the maximum packet size +			                          *   that the endpoint can receive at a time. +			                          */ +			uint8_t  bInterval; /**< Polling interval in milliseconds for the endpoint if it is an INTERRUPT or +			                     *   ISOCHRONOUS type. +			                     */ + +			uint8_t  bRefresh; /**< Always set to zero for Audio class devices. */ +			uint8_t  bSynchAddress; /**< Endpoint address to send synchronization information to, if needed (zero otherwise). */ +		} ATTR_PACKED USB_Audio_StdDescriptor_StreamEndpoint_Std_t; + +		/** \brief Audio class-specific Extended Endpoint Descriptor (LUFA naming conventions). +		 * +		 *  Type define for an Audio class-specific extended endpoint descriptor. This contains extra information +		 *  on the usage of endpoints used to stream audio in and out of the USB Audio device, and follows an Audio +		 *  class-specific extended endpoint descriptor. See the USB Audio specification for more details. +		 * +		 *  \see \ref USB_Audio_StdDescriptor_StreamEndpoint_Spc_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ +			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors, +			                                  *   a value from the \ref Audio_CSEndpoint_SubTypes_t enum. +			                                  */ + +			uint8_t                 Attributes; /**< Audio class-specific endpoint attributes, such as \ref AUDIO_EP_FULL_PACKETS_ONLY. */ + +			uint8_t                 LockDelayUnits; /**< Units used for the LockDelay field, see Audio class specification. */ +			uint16_t                LockDelay; /**< Time required to internally lock endpoint's internal clock recovery circuitry. */ +		} ATTR_PACKED USB_Audio_Descriptor_StreamEndpoint_Spc_t; + +		/** \brief Audio class-specific Extended Endpoint Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for an Audio class-specific extended endpoint descriptor. This contains extra information +		 *  on the usage of endpoints used to stream audio in and out of the USB Audio device, and follows an Audio +		 *  class-specific extended endpoint descriptor. See the USB Audio specification for more details. +		 * +		 *  \see \ref USB_Audio_Descriptor_StreamEndpoint_Spc_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t  bLength; /**< Size of the descriptor, in bytes. */ +			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +			                           *   given by the specific class. +			                           */ + +			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors, +			                              *   a value from the \ref Audio_CSEndpoint_SubTypes_t enum. +			                              */ + +			uint8_t  bmAttributes; /**< Audio class-specific endpoint attributes, such as \ref AUDIO_EP_FULL_PACKETS_ONLY. */ + +			uint8_t  bLockDelayUnits; /**< Units used for the LockDelay field, see Audio class specification. */ +			uint16_t wLockDelay; /**< Time required to internally lock endpoint's internal clock recovery circuitry. */ +		} ATTR_PACKED USB_Audio_StdDescriptor_StreamEndpoint_Spc_t; + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h new file mode 100644 index 0000000000..1ad49eca14 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/CDCClassCommon.h @@ -0,0 +1,391 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Common definitions and declarations for the library USB CDC Class driver. + * + *  Common definitions and declarations for the library USB CDC Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassCDC + *  \defgroup Group_USBClassCDCCommon  Common Class Definitions + * + *  \section Sec_USBClassCDCCommon_ModDescription Module Description + *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB + *  CDC Class. + * + *  @{ + */ + +#ifndef _CDC_CLASS_COMMON_H_ +#define _CDC_CLASS_COMMON_H_ + +	/* Includes: */ +		#include "../../Core/StdDescriptors.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_CDC_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Macros: */ +		/** \name Virtual Control Line Masks */ +		//@{ +		/** Mask for the DTR handshake line for use with the \ref CDC_REQ_SetControlLineState class-specific request +		 *  from the host, to indicate that the DTR line state should be high. +		 */ +		#define CDC_CONTROL_LINE_OUT_DTR         (1 << 0) + +		/** Mask for the RTS handshake line for use with the \ref CDC_REQ_SetControlLineState class-specific request +		 *  from the host, to indicate that the RTS line state should be high. +		 */ +		#define CDC_CONTROL_LINE_OUT_RTS         (1 << 1) + +		/** Mask for the DCD handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification +		 *  from the device to the host, to indicate that the DCD line state is currently high. +		 */ +		#define CDC_CONTROL_LINE_IN_DCD          (1 << 0) + +		/** Mask for the DSR handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification +		 *  from the device to the host, to indicate that the DSR line state is currently high. +		 */ +		#define CDC_CONTROL_LINE_IN_DSR          (1 << 1) + +		/** Mask for the BREAK handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification +		 *  from the device to the host, to indicate that the BREAK line state is currently high. +		 */ +		#define CDC_CONTROL_LINE_IN_BREAK        (1 << 2) + +		/** Mask for the RING handshake line for use with the \ref CDC_NOTIF_SerialState class-specific notification +		 *  from the device to the host, to indicate that the RING line state is currently high. +		 */ +		#define CDC_CONTROL_LINE_IN_RING         (1 << 3) + +		/** Mask for use with the \ref CDC_NOTIF_SerialState class-specific notification from the device to the host, +		 *  to indicate that a framing error has occurred on the virtual serial port. +		 */ +		#define CDC_CONTROL_LINE_IN_FRAMEERROR   (1 << 4) + +		/** Mask for use with the \ref CDC_NOTIF_SerialState class-specific notification from the device to the host, +		 *  to indicate that a parity error has occurred on the virtual serial port. +		 */ +		#define CDC_CONTROL_LINE_IN_PARITYERROR  (1 << 5) + +		/** Mask for use with the \ref CDC_NOTIF_SerialState class-specific notification from the device to the host, +		 *  to indicate that a data overrun error has occurred on the virtual serial port. +		 */ +		#define CDC_CONTROL_LINE_IN_OVERRUNERROR (1 << 6) +		//@} + +		/** Macro to define a CDC class-specific functional descriptor. CDC functional descriptors have a +		 *  uniform structure but variable sized data payloads, thus cannot be represented accurately by +		 *  a single \c typedef \c struct. A macro is used instead so that functional descriptors can be created +		 *  easily by specifying the size of the payload. This allows \c sizeof() to work correctly. +		 * +		 *  \param[in] DataSize  Size in bytes of the CDC functional descriptor's data payload. +		 */ +		#define CDC_FUNCTIONAL_DESCRIPTOR(DataSize)        \ +		     struct                                        \ +		     {                                             \ +		          USB_Descriptor_Header_t Header;          \ +			      uint8_t                 SubType;         \ +		          uint8_t                 Data[DataSize];  \ +		     } + +	/* Enums: */ +		/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the CDC +		 *  device class. +		 */ +		enum CDC_Descriptor_ClassSubclassProtocol_t +		{ +			CDC_CSCP_CDCClass               = 0x02, /**< Descriptor Class value indicating that the device or interface +			                                         *   belongs to the CDC class. +			                                         */ +			CDC_CSCP_NoSpecificSubclass     = 0x00, /**< Descriptor Subclass value indicating that the device or interface +			                                         *   belongs to no specific subclass of the CDC class. +			                                         */ +			CDC_CSCP_ACMSubclass            = 0x02, /**< Descriptor Subclass value indicating that the device or interface +			                                         *   belongs to the Abstract Control Model CDC subclass. +			                                         */ +			CDC_CSCP_ATCommandProtocol      = 0x01, /**< Descriptor Protocol value indicating that the device or interface +			                                         *   belongs to the AT Command protocol of the CDC class. +			                                         */ +			CDC_CSCP_NoSpecificProtocol     = 0x00, /**< Descriptor Protocol value indicating that the device or interface +			                                         *   belongs to no specific protocol of the CDC class. +			                                         */ +			CDC_CSCP_VendorSpecificProtocol = 0xFF, /**< Descriptor Protocol value indicating that the device or interface +			                                         *   belongs to a vendor-specific protocol of the CDC class. +			                                         */ +			CDC_CSCP_CDCDataClass           = 0x0A, /**< Descriptor Class value indicating that the device or interface +			                                         *   belongs to the CDC Data class. +			                                         */ +			CDC_CSCP_NoDataSubclass         = 0x00, /**< Descriptor Subclass value indicating that the device or interface +			                                         *   belongs to no specific subclass of the CDC data class. +			                                         */ +			CDC_CSCP_NoDataProtocol         = 0x00, /**< Descriptor Protocol value indicating that the device or interface +			                                         *   belongs to no specific protocol of the CDC data class. +			                                         */ +		}; + +		/** Enum for the CDC class specific control requests that can be issued by the USB bus host. */ +		enum CDC_ClassRequests_t +		{ +			CDC_REQ_SendEncapsulatedCommand = 0x00, /**< CDC class-specific request to send an encapsulated command to the device. */ +			CDC_REQ_GetEncapsulatedResponse = 0x01, /**< CDC class-specific request to retrieve an encapsulated command response from the device. */ +			CDC_REQ_SetLineEncoding         = 0x20, /**< CDC class-specific request to set the current virtual serial port configuration settings. */ +			CDC_REQ_GetLineEncoding         = 0x21, /**< CDC class-specific request to get the current virtual serial port configuration settings. */ +			CDC_REQ_SetControlLineState     = 0x22, /**< CDC class-specific request to set the current virtual serial port handshake line states. */ +			CDC_REQ_SendBreak               = 0x23, /**< CDC class-specific request to send a break to the receiver via the carrier channel. */ +		}; + +		/** Enum for the CDC class specific notification requests that can be issued by a CDC device to a host. */ +		enum CDC_ClassNotifications_t +		{ +			CDC_NOTIF_SerialState = 0x20, /**< Notification type constant for a change in the virtual serial port +			                               *   handshake line states, for use with a \ref USB_Request_Header_t +			                               *   notification structure when sent to the host via the CDC notification +			                               *   endpoint. +			                               */ +		}; + +		/** Enum for the CDC class specific interface descriptor subtypes. */ +		enum CDC_DescriptorSubtypes_t +		{ +			CDC_DSUBTYPE_CSInterface_Header           = 0x00, /**< CDC class-specific Header functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_CallManagement   = 0x01, /**< CDC class-specific Call Management functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_ACM              = 0x02, /**< CDC class-specific Abstract Control Model functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_DirectLine       = 0x03, /**< CDC class-specific Direct Line functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_TelephoneRinger  = 0x04, /**< CDC class-specific Telephone Ringer functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_TelephoneCall    = 0x05, /**< CDC class-specific Telephone Call functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_Union            = 0x06, /**< CDC class-specific Union functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_CountrySelection = 0x07, /**< CDC class-specific Country Selection functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_TelephoneOpModes = 0x08, /**< CDC class-specific Telephone Operation Modes functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_USBTerminal      = 0x09, /**< CDC class-specific USB Terminal functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_NetworkChannel   = 0x0A, /**< CDC class-specific Network Channel functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_ProtocolUnit     = 0x0B, /**< CDC class-specific Protocol Unit functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_ExtensionUnit    = 0x0C, /**< CDC class-specific Extension Unit functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_MultiChannel     = 0x0D, /**< CDC class-specific Multi-Channel Management functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_CAPI             = 0x0E, /**< CDC class-specific Common ISDN API functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_Ethernet         = 0x0F, /**< CDC class-specific Ethernet functional descriptor. */ +			CDC_DSUBTYPE_CSInterface_ATM              = 0x10, /**< CDC class-specific Asynchronous Transfer Mode functional descriptor. */ +		}; + +		/** Enum for the possible line encoding formats of a virtual serial port. */ +		enum CDC_LineEncodingFormats_t +		{ +			CDC_LINEENCODING_OneStopBit          = 0, /**< Each frame contains one stop bit. */ +			CDC_LINEENCODING_OneAndAHalfStopBits = 1, /**< Each frame contains one and a half stop bits. */ +			CDC_LINEENCODING_TwoStopBits         = 2, /**< Each frame contains two stop bits. */ +		}; + +		/** Enum for the possible line encoding parity settings of a virtual serial port. */ +		enum CDC_LineEncodingParity_t +		{ +			CDC_PARITY_None  = 0, /**< No parity bit mode on each frame. */ +			CDC_PARITY_Odd   = 1, /**< Odd parity bit mode on each frame. */ +			CDC_PARITY_Even  = 2, /**< Even parity bit mode on each frame. */ +			CDC_PARITY_Mark  = 3, /**< Mark parity bit mode on each frame. */ +			CDC_PARITY_Space = 4, /**< Space parity bit mode on each frame. */ +		}; + +	/* Type Defines: */ +		/** \brief CDC class-specific Functional Header Descriptor (LUFA naming conventions). +		 * +		 *  Type define for a CDC class-specific functional header descriptor. This indicates to the host that the device +		 *  contains one or more CDC functional data descriptors, which give the CDC interface's capabilities and configuration. +		 *  See the CDC class specification for more details. +		 * +		 *  \see \ref USB_CDC_StdDescriptor_FunctionalHeader_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ +			uint8_t                 Subtype; /**< Sub type value used to distinguish between CDC class-specific descriptors, +			                                  *   must be \ref CDC_DSUBTYPE_CSInterface_Header. +			                                  */ +			uint16_t                CDCSpecification; /**< Version number of the CDC specification implemented by the device, +			                                           *   encoded in BCD format. +			                                           * +			                                           *   \see \ref VERSION_BCD() utility macro. +			                                           */ +		} ATTR_PACKED USB_CDC_Descriptor_FunctionalHeader_t; + +		/** \brief CDC class-specific Functional Header Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for a CDC class-specific functional header descriptor. This indicates to the host that the device +		 *  contains one or more CDC functional data descriptors, which give the CDC interface's capabilities and configuration. +		 *  See the CDC class specification for more details. +		 * +		 *  \see \ref USB_CDC_Descriptor_FunctionalHeader_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t  bFunctionLength; /**< Size of the descriptor, in bytes. */ +			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +			                           *   given by the specific class. +			                           */ +			uint8_t  bDescriptorSubType; /**< Sub type value used to distinguish between CDC class-specific descriptors, +			                              *   must be \ref CDC_DSUBTYPE_CSInterface_Header. +			                              */ +			uint16_t bcdCDC; /**< Version number of the CDC specification implemented by the device, encoded in BCD format. +			                  * +			                  *   \see \ref VERSION_BCD() utility macro. +			                  */ +		} ATTR_PACKED USB_CDC_StdDescriptor_FunctionalHeader_t; + +		/** \brief CDC class-specific Functional ACM Descriptor (LUFA naming conventions). +		 * +		 *  Type define for a CDC class-specific functional ACM descriptor. This indicates to the host that the CDC interface +		 *  supports the CDC ACM subclass of the CDC specification. See the CDC class specification for more details. +		 * +		 *  \see \ref USB_CDC_StdDescriptor_FunctionalACM_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ +			uint8_t                 Subtype; /**< Sub type value used to distinguish between CDC class-specific descriptors, +			                                  *   must be \ref CDC_DSUBTYPE_CSInterface_ACM. +			                                  */ +			uint8_t                 Capabilities; /**< Capabilities of the ACM interface, given as a bit mask. For most devices, +			                                       *   this should be set to a fixed value of \c 0x06 - for other capabilities, refer +			                                       *   to the CDC ACM specification. +			                                       */ +		} ATTR_PACKED USB_CDC_Descriptor_FunctionalACM_t; + +		/** \brief CDC class-specific Functional ACM Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for a CDC class-specific functional ACM descriptor. This indicates to the host that the CDC interface +		 *  supports the CDC ACM subclass of the CDC specification. See the CDC class specification for more details. +		 * +		 *  \see \ref USB_CDC_Descriptor_FunctionalACM_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t bFunctionLength; /**< Size of the descriptor, in bytes. */ +			uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +			                          *   given by the specific class. +			                          */ +			uint8_t bDescriptorSubType; /**< Sub type value used to distinguish between CDC class-specific descriptors, +			                             *   must be \ref CDC_DSUBTYPE_CSInterface_ACM. +			                             */ +			uint8_t bmCapabilities; /**< Capabilities of the ACM interface, given as a bit mask. For most devices, +			                         *   this should be set to a fixed value of 0x06 - for other capabilities, refer +			                         *   to the CDC ACM specification. +			                         */ +		} ATTR_PACKED USB_CDC_StdDescriptor_FunctionalACM_t; + +		/** \brief CDC class-specific Functional Union Descriptor (LUFA naming conventions). +		 * +		 *  Type define for a CDC class-specific functional Union descriptor. This indicates to the host that specific +		 *  CDC control and data interfaces are related. See the CDC class specification for more details. +		 * +		 *  \see \ref USB_CDC_StdDescriptor_FunctionalUnion_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ +			uint8_t                 Subtype; /**< Sub type value used to distinguish between CDC class-specific descriptors, +			                                  *   must be \ref CDC_DSUBTYPE_CSInterface_Union. +			                                  */ +			uint8_t                 MasterInterfaceNumber; /**< Interface number of the CDC Control interface. */ +			uint8_t                 SlaveInterfaceNumber; /**< Interface number of the CDC Data interface. */ +		} ATTR_PACKED USB_CDC_Descriptor_FunctionalUnion_t; + +		/** \brief CDC class-specific Functional Union Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for a CDC class-specific functional Union descriptor. This indicates to the host that specific +		 *  CDC control and data interfaces are related. See the CDC class specification for more details. +		 * +		 *  \see \ref USB_CDC_Descriptor_FunctionalUnion_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t bFunctionLength; /**< Size of the descriptor, in bytes. */ +			uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +			                          *   given by the specific class. +			                          */ +			uint8_t bDescriptorSubType; /**< Sub type value used to distinguish between CDC class-specific descriptors, +			                             *   must be \ref CDC_DSUBTYPE_CSInterface_Union. +			                             */ +			uint8_t bMasterInterface; /**< Interface number of the CDC Control interface. */ +			uint8_t bSlaveInterface0; /**< Interface number of the CDC Data interface. */ +		} ATTR_PACKED USB_CDC_StdDescriptor_FunctionalUnion_t; + +		/** \brief CDC Virtual Serial Port Line Encoding Settings Structure. +		 * +		 *  Type define for a CDC Line Encoding structure, used to hold the various encoding parameters for a virtual +		 *  serial port. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint32_t BaudRateBPS; /**< Baud rate of the virtual serial port, in bits per second. */ +			uint8_t  CharFormat; /**< Character format of the virtual serial port, a value from the +								  *   \ref CDC_LineEncodingFormats_t enum. +								  */ +			uint8_t  ParityType; /**< Parity setting of the virtual serial port, a value from the +								  *   \ref CDC_LineEncodingParity_t enum. +								  */ +			uint8_t  DataBits; /**< Bits of data per character of the virtual serial port. */ +		} ATTR_PACKED CDC_LineEncoding_t; + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h new file mode 100644 index 0000000000..6e700a9b1e --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDClassCommon.h @@ -0,0 +1,681 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Common definitions and declarations for the library USB HID Class driver. + * + *  Common definitions and declarations for the library USB HID Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassHID + *  \defgroup Group_USBClassHIDCommon  Common Class Definitions + * + *  \section Sec_USBClassHIDCommon_ModDescription Module Description + *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB + *  HID Class. + * + *  @{ + */ + +#ifndef _HID_CLASS_COMMON_H_ +#define _HID_CLASS_COMMON_H_ + +	/* Includes: */ +		#include "../../Core/StdDescriptors.h" +		#include "HIDParser.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_HID_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Macros: */ +		/** \name Keyboard Standard Report Modifier Masks */ +		//@{ +		/** Constant for a keyboard report modifier byte, indicating that the keyboard's left control key is currently pressed. */ +		#define HID_KEYBOARD_MODIFIER_LEFTCTRL                    (1 << 0) + +		/** Constant for a keyboard report modifier byte, indicating that the keyboard's left shift key is currently pressed. */ +		#define HID_KEYBOARD_MODIFIER_LEFTSHIFT                   (1 << 1) + +		/** Constant for a keyboard report modifier byte, indicating that the keyboard's left alt key is currently pressed. */ +		#define HID_KEYBOARD_MODIFIER_LEFTALT                     (1 << 2) + +		/** Constant for a keyboard report modifier byte, indicating that the keyboard's left GUI key is currently pressed. */ +		#define HID_KEYBOARD_MODIFIER_LEFTGUI                     (1 << 3) + +		/** Constant for a keyboard report modifier byte, indicating that the keyboard's right control key is currently pressed. */ +		#define HID_KEYBOARD_MODIFIER_RIGHTCTRL                   (1 << 4) + +		/** Constant for a keyboard report modifier byte, indicating that the keyboard's right shift key is currently pressed. */ +		#define HID_KEYBOARD_MODIFIER_RIGHTSHIFT                  (1 << 5) + +		/** Constant for a keyboard report modifier byte, indicating that the keyboard's right alt key is currently pressed. */ +		#define HID_KEYBOARD_MODIFIER_RIGHTALT                    (1 << 6) + +		/** Constant for a keyboard report modifier byte, indicating that the keyboard's right GUI key is currently pressed. */ +		#define HID_KEYBOARD_MODIFIER_RIGHTGUI                    (1 << 7) +		//@} + +		/** \name Keyboard Standard Report LED Masks */ +		//@{ +		/** Constant for a keyboard output report LED byte, indicating that the host's NUM LOCK mode is currently set. */ +		#define HID_KEYBOARD_LED_NUMLOCK                          (1 << 0) + +		/** Constant for a keyboard output report LED byte, indicating that the host's CAPS LOCK mode is currently set. */ +		#define HID_KEYBOARD_LED_CAPSLOCK                         (1 << 1) + +		/** Constant for a keyboard output report LED byte, indicating that the host's SCROLL LOCK mode is currently set. */ +		#define HID_KEYBOARD_LED_SCROLLLOCK                       (1 << 2) + +		/** Constant for a keyboard output report LED byte, indicating that the host's COMPOSE mode is currently set. */ +		#define HID_KEYBOARD_LED_COMPOSE                          (1 << 3) + +		/** Constant for a keyboard output report LED byte, indicating that the host's KANA mode is currently set. */ +		#define HID_KEYBOARD_LED_KANA                             (1 << 4) +		//@} + +		/** \name Keyboard Standard Report Key Scan-codes */ +		//@{ +		#define HID_KEYBOARD_SC_ERROR_ROLLOVER                    0x01 +		#define HID_KEYBOARD_SC_POST_FAIL                         0x02 +		#define HID_KEYBOARD_SC_ERROR_UNDEFINED                   0x03 +		#define HID_KEYBOARD_SC_A                                 0x04 +		#define HID_KEYBOARD_SC_B                                 0x05 +		#define HID_KEYBOARD_SC_C                                 0x06 +		#define HID_KEYBOARD_SC_D                                 0x07 +		#define HID_KEYBOARD_SC_E                                 0x08 +		#define HID_KEYBOARD_SC_F                                 0x09 +		#define HID_KEYBOARD_SC_G                                 0x0A +		#define HID_KEYBOARD_SC_H                                 0x0B +		#define HID_KEYBOARD_SC_I                                 0x0C +		#define HID_KEYBOARD_SC_J                                 0x0D +		#define HID_KEYBOARD_SC_K                                 0x0E +		#define HID_KEYBOARD_SC_L                                 0x0F +		#define HID_KEYBOARD_SC_M                                 0x10 +		#define HID_KEYBOARD_SC_N                                 0x11 +		#define HID_KEYBOARD_SC_O                                 0x12 +		#define HID_KEYBOARD_SC_P                                 0x13 +		#define HID_KEYBOARD_SC_Q                                 0x14 +		#define HID_KEYBOARD_SC_R                                 0x15 +		#define HID_KEYBOARD_SC_S                                 0x16 +		#define HID_KEYBOARD_SC_T                                 0x17 +		#define HID_KEYBOARD_SC_U                                 0x18 +		#define HID_KEYBOARD_SC_V                                 0x19 +		#define HID_KEYBOARD_SC_W                                 0x1A +		#define HID_KEYBOARD_SC_X                                 0x1B +		#define HID_KEYBOARD_SC_Y                                 0x1C +		#define HID_KEYBOARD_SC_Z                                 0x1D +		#define HID_KEYBOARD_SC_1_AND_EXCLAMATION                 0x1E +		#define HID_KEYBOARD_SC_2_AND_AT                          0x1F +		#define HID_KEYBOARD_SC_3_AND_HASHMARK                    0x20 +		#define HID_KEYBOARD_SC_4_AND_DOLLAR                      0x21 +		#define HID_KEYBOARD_SC_5_AND_PERCENTAGE                  0x22 +		#define HID_KEYBOARD_SC_6_AND_CARET                       0x23 +		#define HID_KEYBOARD_SC_7_AND_AMPERSAND                   0x24 +		#define HID_KEYBOARD_SC_8_AND_ASTERISK                    0x25 +		#define HID_KEYBOARD_SC_9_AND_OPENING_PARENTHESIS         0x26 +		#define HID_KEYBOARD_SC_0_AND_CLOSING_PARENTHESIS         0x27 +		#define HID_KEYBOARD_SC_ENTER                             0x28 +		#define HID_KEYBOARD_SC_ESCAPE                            0x29 +		#define HID_KEYBOARD_SC_BACKSPACE                         0x2A +		#define HID_KEYBOARD_SC_TAB                               0x2B +		#define HID_KEYBOARD_SC_SPACE                             0x2C +		#define HID_KEYBOARD_SC_MINUS_AND_UNDERSCORE              0x2D +		#define HID_KEYBOARD_SC_EQUAL_AND_PLUS                    0x2E +		#define HID_KEYBOARD_SC_OPENING_BRACKET_AND_OPENING_BRACE 0x2F +		#define HID_KEYBOARD_SC_CLOSING_BRACKET_AND_CLOSING_BRACE 0x30 +		#define HID_KEYBOARD_SC_BACKSLASH_AND_PIPE                0x31 +		#define HID_KEYBOARD_SC_NON_US_HASHMARK_AND_TILDE         0x32 +		#define HID_KEYBOARD_SC_SEMICOLON_AND_COLON               0x33 +		#define HID_KEYBOARD_SC_APOSTROPHE_AND_QUOTE              0x34 +		#define HID_KEYBOARD_SC_GRAVE_ACCENT_AND_TILDE            0x35 +		#define HID_KEYBOARD_SC_COMMA_AND_LESS_THAN_SIGN          0x36 +		#define HID_KEYBOARD_SC_DOT_AND_GREATER_THAN_SIGN         0x37 +		#define HID_KEYBOARD_SC_SLASH_AND_QUESTION_MARK           0x38 +		#define HID_KEYBOARD_SC_CAPS_LOCK                         0x39 +		#define HID_KEYBOARD_SC_F1                                0x3A +		#define HID_KEYBOARD_SC_F2                                0x3B +		#define HID_KEYBOARD_SC_F3                                0x3C +		#define HID_KEYBOARD_SC_F4                                0x3D +		#define HID_KEYBOARD_SC_F5                                0x3E +		#define HID_KEYBOARD_SC_F6                                0x3F +		#define HID_KEYBOARD_SC_F7                                0x40 +		#define HID_KEYBOARD_SC_F8                                0x41 +		#define HID_KEYBOARD_SC_F9                                0x42 +		#define HID_KEYBOARD_SC_F10                               0x43 +		#define HID_KEYBOARD_SC_F11                               0x44 +		#define HID_KEYBOARD_SC_F12                               0x45 +		#define HID_KEYBOARD_SC_PRINT_SCREEN                      0x46 +		#define HID_KEYBOARD_SC_SCROLL_LOCK                       0x47 +		#define HID_KEYBOARD_SC_PAUSE                             0x48 +		#define HID_KEYBOARD_SC_INSERT                            0x49 +		#define HID_KEYBOARD_SC_HOME                              0x4A +		#define HID_KEYBOARD_SC_PAGE_UP                           0x4B +		#define HID_KEYBOARD_SC_DELETE                            0x4C +		#define HID_KEYBOARD_SC_END                               0x4D +		#define HID_KEYBOARD_SC_PAGE_DOWN                         0x4E +		#define HID_KEYBOARD_SC_RIGHT_ARROW                       0x4F +		#define HID_KEYBOARD_SC_LEFT_ARROW                        0x50 +		#define HID_KEYBOARD_SC_DOWN_ARROW                        0x51 +		#define HID_KEYBOARD_SC_UP_ARROW                          0x52 +		#define HID_KEYBOARD_SC_NUM_LOCK                          0x53 +		#define HID_KEYBOARD_SC_KEYPAD_SLASH                      0x54 +		#define HID_KEYBOARD_SC_KEYPAD_ASTERISK                   0x55 +		#define HID_KEYBOARD_SC_KEYPAD_MINUS                      0x56 +		#define HID_KEYBOARD_SC_KEYPAD_PLUS                       0x57 +		#define HID_KEYBOARD_SC_KEYPAD_ENTER                      0x58 +		#define HID_KEYBOARD_SC_KEYPAD_1_AND_END                  0x59 +		#define HID_KEYBOARD_SC_KEYPAD_2_AND_DOWN_ARROW           0x5A +		#define HID_KEYBOARD_SC_KEYPAD_3_AND_PAGE_DOWN            0x5B +		#define HID_KEYBOARD_SC_KEYPAD_4_AND_LEFT_ARROW           0x5C +		#define HID_KEYBOARD_SC_KEYPAD_5                          0x5D +		#define HID_KEYBOARD_SC_KEYPAD_6_AND_RIGHT_ARROW          0x5E +		#define HID_KEYBOARD_SC_KEYPAD_7_AND_HOME                 0x5F +		#define HID_KEYBOARD_SC_KEYPAD_8_AND_UP_ARROW             0x60 +		#define HID_KEYBOARD_SC_KEYPAD_9_AND_PAGE_UP              0x61 +		#define HID_KEYBOARD_SC_KEYPAD_0_AND_INSERT               0x62 +		#define HID_KEYBOARD_SC_KEYPAD_DOT_AND_DELETE             0x63 +		#define HID_KEYBOARD_SC_NON_US_BACKSLASH_AND_PIPE         0x64 +		#define HID_KEYBOARD_SC_APPLICATION                       0x65 +		#define HID_KEYBOARD_SC_POWER                             0x66 +		#define HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN                 0x67 +		#define HID_KEYBOARD_SC_F13                               0x68 +		#define HID_KEYBOARD_SC_F14                               0x69 +		#define HID_KEYBOARD_SC_F15                               0x6A +		#define HID_KEYBOARD_SC_F16                               0x6B +		#define HID_KEYBOARD_SC_F17                               0x6C +		#define HID_KEYBOARD_SC_F18                               0x6D +		#define HID_KEYBOARD_SC_F19                               0x6E +		#define HID_KEYBOARD_SC_F20                               0x6F +		#define HID_KEYBOARD_SC_F21                               0x70 +		#define HID_KEYBOARD_SC_F22                               0x71 +		#define HID_KEYBOARD_SC_F23                               0x72 +		#define HID_KEYBOARD_SC_F24                               0x73 +		#define HID_KEYBOARD_SC_EXECUTE                           0x74 +		#define HID_KEYBOARD_SC_HELP                              0x75 +		#define HID_KEYBOARD_SC_MENU                              0x76 +		#define HID_KEYBOARD_SC_SELECT                            0x77 +		#define HID_KEYBOARD_SC_STOP                              0x78 +		#define HID_KEYBOARD_SC_AGAIN                             0x79 +		#define HID_KEYBOARD_SC_UNDO                              0x7A +		#define HID_KEYBOARD_SC_CUT                               0x7B +		#define HID_KEYBOARD_SC_COPY                              0x7C +		#define HID_KEYBOARD_SC_PASTE                             0x7D +		#define HID_KEYBOARD_SC_FIND                              0x7E +		#define HID_KEYBOARD_SC_MUTE                              0x7F +		#define HID_KEYBOARD_SC_VOLUME_UP                         0x80 +		#define HID_KEYBOARD_SC_VOLUME_DOWN                       0x81 +		#define HID_KEYBOARD_SC_LOCKING_CAPS_LOCK                 0x82 +		#define HID_KEYBOARD_SC_LOCKING_NUM_LOCK                  0x83 +		#define HID_KEYBOARD_SC_LOCKING_SCROLL_LOCK               0x84 +		#define HID_KEYBOARD_SC_KEYPAD_COMMA                      0x85 +		#define HID_KEYBOARD_SC_KEYPAD_EQUAL_SIGN_AS400           0x86 +		#define HID_KEYBOARD_SC_INTERNATIONAL1                    0x87 +		#define HID_KEYBOARD_SC_INTERNATIONAL2                    0x88 +		#define HID_KEYBOARD_SC_INTERNATIONAL3                    0x89 +		#define HID_KEYBOARD_SC_INTERNATIONAL4                    0x8A +		#define HID_KEYBOARD_SC_INTERNATIONAL5                    0x8B +		#define HID_KEYBOARD_SC_INTERNATIONAL6                    0x8C +		#define HID_KEYBOARD_SC_INTERNATIONAL7                    0x8D +		#define HID_KEYBOARD_SC_INTERNATIONAL8                    0x8E +		#define HID_KEYBOARD_SC_INTERNATIONAL9                    0x8F +		#define HID_KEYBOARD_SC_LANG1                             0x90 +		#define HID_KEYBOARD_SC_LANG2                             0x91 +		#define HID_KEYBOARD_SC_LANG3                             0x92 +		#define HID_KEYBOARD_SC_LANG4                             0x93 +		#define HID_KEYBOARD_SC_LANG5                             0x94 +		#define HID_KEYBOARD_SC_LANG6                             0x95 +		#define HID_KEYBOARD_SC_LANG7                             0x96 +		#define HID_KEYBOARD_SC_LANG8                             0x97 +		#define HID_KEYBOARD_SC_LANG9                             0x98 +		#define HID_KEYBOARD_SC_ALTERNATE_ERASE                   0x99 +		#define HID_KEYBOARD_SC_SYSREQ                            0x9A +		#define HID_KEYBOARD_SC_CANCEL                            0x9B +		#define HID_KEYBOARD_SC_CLEAR                             0x9C +		#define HID_KEYBOARD_SC_PRIOR                             0x9D +		#define HID_KEYBOARD_SC_RETURN                            0x9E +		#define HID_KEYBOARD_SC_SEPARATOR                         0x9F +		#define HID_KEYBOARD_SC_OUT                               0xA0 +		#define HID_KEYBOARD_SC_OPER                              0xA1 +		#define HID_KEYBOARD_SC_CLEAR_AND_AGAIN                   0xA2 +		#define HID_KEYBOARD_SC_CRSEL_AND_PROPS                   0xA3 +		#define HID_KEYBOARD_SC_EXSEL                             0xA4 +		#define HID_KEYBOARD_SC_KEYPAD_00                         0xB0 +		#define HID_KEYBOARD_SC_KEYPAD_000                        0xB1 +		#define HID_KEYBOARD_SC_THOUSANDS_SEPARATOR               0xB2 +		#define HID_KEYBOARD_SC_DECIMAL_SEPARATOR                 0xB3 +		#define HID_KEYBOARD_SC_CURRENCY_UNIT                     0xB4 +		#define HID_KEYBOARD_SC_CURRENCY_SUB_UNIT                 0xB5 +		#define HID_KEYBOARD_SC_KEYPAD_OPENING_PARENTHESIS        0xB6 +		#define HID_KEYBOARD_SC_KEYPAD_CLOSING_PARENTHESIS        0xB7 +		#define HID_KEYBOARD_SC_KEYPAD_OPENING_BRACE              0xB8 +		#define HID_KEYBOARD_SC_KEYPAD_CLOSING_BRACE              0xB9 +		#define HID_KEYBOARD_SC_KEYPAD_TAB                        0xBA +		#define HID_KEYBOARD_SC_KEYPAD_BACKSPACE                  0xBB +		#define HID_KEYBOARD_SC_KEYPAD_A                          0xBC +		#define HID_KEYBOARD_SC_KEYPAD_B                          0xBD +		#define HID_KEYBOARD_SC_KEYPAD_C                          0xBE +		#define HID_KEYBOARD_SC_KEYPAD_D                          0xBF +		#define HID_KEYBOARD_SC_KEYPAD_E                          0xC0 +		#define HID_KEYBOARD_SC_KEYPAD_F                          0xC1 +		#define HID_KEYBOARD_SC_KEYPAD_XOR                        0xC2 +		#define HID_KEYBOARD_SC_KEYPAD_CARET                      0xC3 +		#define HID_KEYBOARD_SC_KEYPAD_PERCENTAGE                 0xC4 +		#define HID_KEYBOARD_SC_KEYPAD_LESS_THAN_SIGN             0xC5 +		#define HID_KEYBOARD_SC_KEYPAD_GREATER_THAN_SIGN          0xC6 +		#define HID_KEYBOARD_SC_KEYPAD_AMP                        0xC7 +		#define HID_KEYBOARD_SC_KEYPAD_AMP_AMP                    0xC8 +		#define HID_KEYBOARD_SC_KEYPAD_PIPE                       0xC9 +		#define HID_KEYBOARD_SC_KEYPAD_PIPE_PIPE                  0xCA +		#define HID_KEYBOARD_SC_KEYPAD_COLON                      0xCB +		#define HID_KEYBOARD_SC_KEYPAD_HASHMARK                   0xCC +		#define HID_KEYBOARD_SC_KEYPAD_SPACE                      0xCD +		#define HID_KEYBOARD_SC_KEYPAD_AT                         0xCE +		#define HID_KEYBOARD_SC_KEYPAD_EXCLAMATION_SIGN           0xCF +		#define HID_KEYBOARD_SC_KEYPAD_MEMORY_STORE               0xD0 +		#define HID_KEYBOARD_SC_KEYPAD_MEMORY_RECALL              0xD1 +		#define HID_KEYBOARD_SC_KEYPAD_MEMORY_CLEAR               0xD2 +		#define HID_KEYBOARD_SC_KEYPAD_MEMORY_ADD                 0xD3 +		#define HID_KEYBOARD_SC_KEYPAD_MEMORY_SUBTRACT            0xD4 +		#define HID_KEYBOARD_SC_KEYPAD_MEMORY_MULTIPLY            0xD5 +		#define HID_KEYBOARD_SC_KEYPAD_MEMORY_DIVIDE              0xD6 +		#define HID_KEYBOARD_SC_KEYPAD_PLUS_AND_MINUS             0xD7 +		#define HID_KEYBOARD_SC_KEYPAD_CLEAR                      0xD8 +		#define HID_KEYBOARD_SC_KEYPAD_CLEAR_ENTRY                0xD9 +		#define HID_KEYBOARD_SC_KEYPAD_BINARY                     0xDA +		#define HID_KEYBOARD_SC_KEYPAD_OCTAL                      0xDB +		#define HID_KEYBOARD_SC_KEYPAD_DECIMAL                    0xDC +		#define HID_KEYBOARD_SC_KEYPAD_HEXADECIMAL                0xDD +		#define HID_KEYBOARD_SC_LEFT_CONTROL                      0xE0 +		#define HID_KEYBOARD_SC_LEFT_SHIFT                        0xE1 +		#define HID_KEYBOARD_SC_LEFT_ALT                          0xE2 +		#define HID_KEYBOARD_SC_LEFT_GUI                          0xE3 +		#define HID_KEYBOARD_SC_RIGHT_CONTROL                     0xE4 +		#define HID_KEYBOARD_SC_RIGHT_SHIFT                       0xE5 +		#define HID_KEYBOARD_SC_RIGHT_ALT                         0xE6 +		#define HID_KEYBOARD_SC_RIGHT_GUI                         0xE7 +		#define HID_KEYBOARD_SC_MEDIA_PLAY                        0xE8 +		#define HID_KEYBOARD_SC_MEDIA_STOP                        0xE9 +		#define HID_KEYBOARD_SC_MEDIA_PREVIOUS_TRACK              0xEA +		#define HID_KEYBOARD_SC_MEDIA_NEXT_TRACK                  0xEB +		#define HID_KEYBOARD_SC_MEDIA_EJECT                       0xEC +		#define HID_KEYBOARD_SC_MEDIA_VOLUME_UP                   0xED +		#define HID_KEYBOARD_SC_MEDIA_VOLUME_DOWN                 0xEE +		#define HID_KEYBOARD_SC_MEDIA_MUTE                        0xEF +		#define HID_KEYBOARD_SC_MEDIA_WWW                         0xF0 +		#define HID_KEYBOARD_SC_MEDIA_BACKWARD                    0xF1 +		#define HID_KEYBOARD_SC_MEDIA_FORWARD                     0xF2 +		#define HID_KEYBOARD_SC_MEDIA_CANCEL                      0xF3 +		#define HID_KEYBOARD_SC_MEDIA_SEARCH                      0xF4 +		#define HID_KEYBOARD_SC_MEDIA_SLEEP                       0xF8 +		#define HID_KEYBOARD_SC_MEDIA_LOCK                        0xF9 +		#define HID_KEYBOARD_SC_MEDIA_RELOAD                      0xFA +		#define HID_KEYBOARD_SC_MEDIA_CALCULATOR                  0xFB +		//@} + +		/** \name Common HID Device Report Descriptors */ +		//@{ +		/** \hideinitializer +		 *  A list of HID report item array elements that describe a typical HID USB Joystick. The resulting report +		 *  descriptor is structured according to the following layout: +		 * +		 *  \code +		 *  struct +		 *  { +		 *      intA_t X; // Signed X axis value +		 *      intA_t Y; // Signed Y axis value +		 *      intA_t Z; // Signed Z axis value +		 *      uintB_t Buttons; // Pressed buttons bitmask +		 *  } Joystick_Report; +		 *  \endcode +		 * +		 *  Where \c uintA_t is a type large enough to hold the ranges of the signed \c MinAxisVal and \c MaxAxisVal values, +		 *  and \c intB_t is a type large enough to hold one bit per button. +		 * +		 *  \param[in] MinAxisVal      Minimum logical axis value (16-bit). +		 *  \param[in] MaxAxisVal      Maximum logical axis value (16-bit). +		 *  \param[in] MinPhysicalVal  Minimum physical axis value, for movement resolution calculations (16-bit). +		 *  \param[in] MaxPhysicalVal  Maximum physical axis value, for movement resolution calculations (16-bit). +		 *  \param[in] Buttons         Total number of buttons in the device (8-bit). +		 */ +		#define HID_DESCRIPTOR_JOYSTICK(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons) \ +			HID_RI_USAGE_PAGE(8, 0x01),                     \ +			HID_RI_USAGE(8, 0x04),                          \ +			HID_RI_COLLECTION(8, 0x01),                     \ +				HID_RI_USAGE(8, 0x01),                      \ +				HID_RI_COLLECTION(8, 0x00),                 \ +					HID_RI_USAGE(8, 0x30),                  \ +					HID_RI_USAGE(8, 0x31),                  \ +					HID_RI_USAGE(8, 0x32),                  \ +					HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \ +					HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \ +					HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \ +					HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \ +					HID_RI_REPORT_COUNT(8, 3),              \ +					HID_RI_REPORT_SIZE(8, (((MinAxisVal >= -128) && (MaxAxisVal <= 127)) ? 8 : 16)), \ +					HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ +				HID_RI_END_COLLECTION(0),                   \ +				HID_RI_USAGE_PAGE(8, 0x09),                 \ +				HID_RI_USAGE_MINIMUM(8, 0x01),              \ +				HID_RI_USAGE_MAXIMUM(8, Buttons),           \ +				HID_RI_LOGICAL_MINIMUM(8, 0x00),            \ +				HID_RI_LOGICAL_MAXIMUM(8, 0x01),            \ +				HID_RI_REPORT_SIZE(8, 0x01),                \ +				HID_RI_REPORT_COUNT(8, Buttons),            \ +				HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ +				HID_RI_REPORT_SIZE(8, (Buttons % 8) ? (8 - (Buttons % 8)) : 0), \ +				HID_RI_REPORT_COUNT(8, 0x01),               \ +				HID_RI_INPUT(8, HID_IOF_CONSTANT),          \ +			HID_RI_END_COLLECTION(0) + +		/** \hideinitializer +		 *  A list of HID report item array elements that describe a typical HID USB keyboard. The resulting report descriptor +		 *  is compatible with \ref USB_KeyboardReport_Data_t when \c MaxKeys is equal to 6. For other values, the report will +		 *  be structured according to the following layout: +		 * +		 *  \code +		 *  struct +		 *  { +		 *      uint8_t Modifier; // Keyboard modifier byte indicating pressed modifier keys (\c HID_KEYBOARD_MODIFER_* masks) +		 *      uint8_t Reserved; // Reserved for OEM use, always set to 0. +		 *      uint8_t KeyCode[MaxKeys]; // Length determined by the number of keys that can be reported +		 *  } Keyboard_Report; +		 *  \endcode +		 * +		 *  \param[in] MaxKeys  Number of simultaneous keys that can be reported at the one time (8-bit). +		 */ +		#define HID_DESCRIPTOR_KEYBOARD(MaxKeys)            \ +			HID_RI_USAGE_PAGE(8, 0x01),                     \ +			HID_RI_USAGE(8, 0x06),                          \ +			HID_RI_COLLECTION(8, 0x01),                     \ +				HID_RI_USAGE_PAGE(8, 0x07),                 \ +				HID_RI_USAGE_MINIMUM(8, 0xE0),              \ +				HID_RI_USAGE_MAXIMUM(8, 0xE7),              \ +				HID_RI_LOGICAL_MINIMUM(8, 0x00),            \ +				HID_RI_LOGICAL_MAXIMUM(8, 0x01),            \ +				HID_RI_REPORT_SIZE(8, 0x01),                \ +				HID_RI_REPORT_COUNT(8, 0x08),               \ +				HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ +				HID_RI_REPORT_COUNT(8, 0x01),               \ +				HID_RI_REPORT_SIZE(8, 0x08),                \ +				HID_RI_INPUT(8, HID_IOF_CONSTANT),          \ +				HID_RI_USAGE_PAGE(8, 0x08),                 \ +				HID_RI_USAGE_MINIMUM(8, 0x01),              \ +				HID_RI_USAGE_MAXIMUM(8, 0x05),              \ +				HID_RI_REPORT_COUNT(8, 0x05),               \ +				HID_RI_REPORT_SIZE(8, 0x01),                \ +				HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \ +				HID_RI_REPORT_COUNT(8, 0x01),               \ +				HID_RI_REPORT_SIZE(8, 0x03),                \ +				HID_RI_OUTPUT(8, HID_IOF_CONSTANT),         \ +				HID_RI_LOGICAL_MINIMUM(8, 0x00),            \ +				HID_RI_LOGICAL_MAXIMUM(16, 0xFF),           \ +				HID_RI_USAGE_PAGE(8, 0x07),                 \ +				HID_RI_USAGE_MINIMUM(8, 0x00),              \ +				HID_RI_USAGE_MAXIMUM(8, 0xFF),              \ +				HID_RI_REPORT_COUNT(8, MaxKeys),            \ +				HID_RI_REPORT_SIZE(8, 0x08),                \ +				HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE), \ +			HID_RI_END_COLLECTION(0) + +		/** \hideinitializer +		 *  A list of HID report item array elements that describe a typical HID USB mouse. The resulting report descriptor +		 *  is compatible with \ref USB_MouseReport_Data_t if the \c MinAxisVal and \c MaxAxisVal values fit within a \c int8_t range +		 *  and the number of Buttons is less than 8. For other values, the report is structured according to the following layout: +		 * +		 *  \code +		 *  struct +		 *  { +		 *      uintA_t Buttons; // Pressed buttons bitmask +		 *      intB_t X; // X axis value +		 *      intB_t Y; // Y axis value +		 *  } Mouse_Report; +		 *  \endcode +		 * +		 *  Where \c intA_t is a type large enough to hold one bit per button, and \c intB_t is a type large enough to hold the +		 *  ranges of the signed \c MinAxisVal and \c MaxAxisVal values. +		 * +		 *  \param[in] MinAxisVal      Minimum X/Y logical axis value (16-bit). +		 *  \param[in] MaxAxisVal      Maximum X/Y logical axis value (16-bit). +		 *  \param[in] MinPhysicalVal  Minimum X/Y physical axis value, for movement resolution calculations (16-bit). +		 *  \param[in] MaxPhysicalVal  Maximum X/Y physical axis value, for movement resolution calculations (16-bit). +		 *  \param[in] Buttons         Total number of buttons in the device (8-bit). +		 *  \param[in] AbsoluteCoords  Boolean \c true to use absolute X/Y coordinates (e.g. touchscreen). +		 */ +		#define HID_DESCRIPTOR_MOUSE(MinAxisVal, MaxAxisVal, MinPhysicalVal, MaxPhysicalVal, Buttons, AbsoluteCoords) \ +			HID_RI_USAGE_PAGE(8, 0x01),                     \ +			HID_RI_USAGE(8, 0x02),                          \ +			HID_RI_COLLECTION(8, 0x01),                     \ +				HID_RI_USAGE(8, 0x01),                      \ +				HID_RI_COLLECTION(8, 0x00),                 \ +					HID_RI_USAGE_PAGE(8, 0x09),             \ +					HID_RI_USAGE_MINIMUM(8, 0x01),          \ +					HID_RI_USAGE_MAXIMUM(8, Buttons),       \ +					HID_RI_LOGICAL_MINIMUM(8, 0x00),        \ +					HID_RI_LOGICAL_MAXIMUM(8, 0x01),        \ +					HID_RI_REPORT_COUNT(8, Buttons),        \ +					HID_RI_REPORT_SIZE(8, 0x01),            \ +					HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ +					HID_RI_REPORT_COUNT(8, 0x01),           \ +					HID_RI_REPORT_SIZE(8, (Buttons % 8) ? (8 - (Buttons % 8)) : 0), \ +					HID_RI_INPUT(8, HID_IOF_CONSTANT),      \ +					HID_RI_USAGE_PAGE(8, 0x01),             \ +					HID_RI_USAGE(8, 0x30),                  \ +					HID_RI_USAGE(8, 0x31),                  \ +					HID_RI_LOGICAL_MINIMUM(16, MinAxisVal), \ +					HID_RI_LOGICAL_MAXIMUM(16, MaxAxisVal), \ +					HID_RI_PHYSICAL_MINIMUM(16, MinPhysicalVal), \ +					HID_RI_PHYSICAL_MAXIMUM(16, MaxPhysicalVal), \ +					HID_RI_REPORT_COUNT(8, 0x02),           \ +					HID_RI_REPORT_SIZE(8, (((MinAxisVal >= -128) && (MaxAxisVal <= 127)) ? 8 : 16)), \ +					HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | (AbsoluteCoords ? HID_IOF_ABSOLUTE : HID_IOF_RELATIVE)), \ +				HID_RI_END_COLLECTION(0),                   \ +			HID_RI_END_COLLECTION(0) + +		/** \hideinitializer +		 *  A list of HID report item array elements that describe a typical Vendor Defined byte array HID report descriptor, +		 *  used for transporting arbitrary data between the USB host and device via HID reports. The resulting report should be +		 *  a \c uint8_t byte array of the specified length in both Device to Host (IN) and Host to Device (OUT) directions. +		 * +		 *  \param[in] VendorPageNum    Vendor Defined HID Usage Page index, ranging from 0x00 to 0xFF. +		 *  \param[in] CollectionUsage  Vendor Usage for the encompassing report IN and OUT collection, ranging from 0x00 to 0xFF. +		 *  \param[in] DataINUsage      Vendor Usage for the IN report data, ranging from 0x00 to 0xFF. +		 *  \param[in] DataOUTUsage     Vendor Usage for the OUT report data, ranging from 0x00 to 0xFF. +		 *  \param[in] NumBytes         Length of the data IN and OUT reports. +		 */ +		#define HID_DESCRIPTOR_VENDOR(VendorPageNum, CollectionUsage, DataINUsage, DataOUTUsage, NumBytes) \ +			HID_RI_USAGE_PAGE(16, (0xFF00 | VendorPageNum)), \ +			HID_RI_USAGE(8, CollectionUsage),           \ +			HID_RI_COLLECTION(8, 0x01),                 \ +				HID_RI_USAGE(8, DataINUsage),           \ +				HID_RI_LOGICAL_MINIMUM(8, 0x00),        \ +				HID_RI_LOGICAL_MAXIMUM(8, 0xFF),        \ +				HID_RI_REPORT_SIZE(8, 0x08),            \ +				HID_RI_REPORT_COUNT(8, NumBytes),       \ +				HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE), \ +				HID_RI_USAGE(8, DataOUTUsage),          \ +				HID_RI_LOGICAL_MINIMUM(8, 0x00),        \ +				HID_RI_LOGICAL_MAXIMUM(8, 0xFF),        \ +				HID_RI_REPORT_SIZE(8, 0x08),            \ +				HID_RI_REPORT_COUNT(8, NumBytes),       \ +				HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE), \ +			HID_RI_END_COLLECTION(0) +		//@} + +	/* Type Defines: */ +		/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the HID +		 *  device class. +		 */ +		enum HID_Descriptor_ClassSubclassProtocol_t +		{ +			HID_CSCP_HIDClass             = 0x03, /**< Descriptor Class value indicating that the device or interface +			                                       *   belongs to the HID class. +			                                       */ +			HID_CSCP_NonBootSubclass      = 0x00, /**< Descriptor Subclass value indicating that the device or interface +			                                       *   does not implement a HID boot protocol. +			                                       */ +			HID_CSCP_BootSubclass         = 0x01, /**< Descriptor Subclass value indicating that the device or interface +			                                       *   implements a HID boot protocol. +			                                       */ +			HID_CSCP_NonBootProtocol      = 0x00, /**< Descriptor Protocol value indicating that the device or interface +			                                       *   does not belong to a HID boot protocol. +			                                       */ +			HID_CSCP_KeyboardBootProtocol = 0x01, /**< Descriptor Protocol value indicating that the device or interface +			                                       *   belongs to the Keyboard HID boot protocol. +			                                       */ +			HID_CSCP_MouseBootProtocol    = 0x02, /**< Descriptor Protocol value indicating that the device or interface +			                                       *   belongs to the Mouse HID boot protocol. +			                                       */ +		}; + +		/** Enum for the HID class specific control requests that can be issued by the USB bus host. */ +		enum HID_ClassRequests_t +		{ +			HID_REQ_GetReport       = 0x01, /**< HID class-specific Request to get the current HID report from the device. */ +			HID_REQ_GetIdle         = 0x02, /**< HID class-specific Request to get the current device idle count. */ +			HID_REQ_GetProtocol     = 0x03, /**< HID class-specific Request to get the current HID report protocol mode. */ +			HID_REQ_SetReport       = 0x09, /**< HID class-specific Request to set the current HID report to the device. */ +			HID_REQ_SetIdle         = 0x0A, /**< HID class-specific Request to set the device's idle count. */ +			HID_REQ_SetProtocol     = 0x0B, /**< HID class-specific Request to set the current HID report protocol mode. */ +		}; + +		/** Enum for the HID class specific descriptor types. */ +		enum HID_DescriptorTypes_t +		{ +			HID_DTYPE_HID           = 0x21, /**< Descriptor header type value, to indicate a HID class HID descriptor. */ +			HID_DTYPE_Report        = 0x22, /**< Descriptor header type value, to indicate a HID class HID report descriptor. */ +		}; + +		/** Enum for the different types of HID reports. */ +		enum HID_ReportItemTypes_t +		{ +			HID_REPORT_ITEM_In      = 0, /**< Indicates that the item is an IN report type. */ +			HID_REPORT_ITEM_Out     = 1, /**< Indicates that the item is an OUT report type. */ +			HID_REPORT_ITEM_Feature = 2, /**< Indicates that the item is a FEATURE report type. */ +		}; + +		/** \brief HID class-specific HID Descriptor (LUFA naming conventions). +		 * +		 *  Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID +		 *  specification for details on the structure elements. +		 * +		 *  \see \ref USB_HID_StdDescriptor_HID_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ + +			uint16_t                HIDSpec; /**< BCD encoded version that the HID descriptor and device complies to. +			                                  * +			                                  *   \see \ref VERSION_BCD() utility macro. +			                                  */ +			uint8_t                 CountryCode; /**< Country code of the localized device, or zero if universal. */ + +			uint8_t                 TotalReportDescriptors; /**< Total number of HID report descriptors for the interface. */ + +			uint8_t                 HIDReportType; /**< Type of HID report, set to \ref HID_DTYPE_Report. */ +			uint16_t                HIDReportLength; /**< Length of the associated HID report descriptor, in bytes. */ +		} ATTR_PACKED USB_HID_Descriptor_HID_t; + +		/** \brief HID class-specific HID Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID +		 *  specification for details on the structure elements. +		 * +		 *  \see \ref USB_HID_Descriptor_HID_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t  bLength; /**< Size of the descriptor, in bytes. */ +			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +			                           *   given by the specific class. +			                           */ + +			uint16_t bcdHID; /**< BCD encoded version that the HID descriptor and device complies to. +			                  * +			                  *   \see \ref VERSION_BCD() utility macro. +			                  */ +			uint8_t  bCountryCode; /**< Country code of the localized device, or zero if universal. */ + +			uint8_t  bNumDescriptors; /**< Total number of HID report descriptors for the interface. */ + +			uint8_t  bDescriptorType2; /**< Type of HID report, set to \ref HID_DTYPE_Report. */ +			uint16_t wDescriptorLength; /**< Length of the associated HID report descriptor, in bytes. */ +		} ATTR_PACKED USB_HID_StdDescriptor_HID_t; + +		/** \brief Standard HID Boot Protocol Mouse Report. +		 * +		 *  Type define for a standard Boot Protocol Mouse report +		 */ +		typedef struct +		{ +			uint8_t Button; /**< Button mask for currently pressed buttons in the mouse. */ +			int8_t  X; /**< Current delta X movement of the mouse. */ +			int8_t  Y; /**< Current delta Y movement on the mouse. */ +		} ATTR_PACKED USB_MouseReport_Data_t; + +		/** \brief Standard HID Boot Protocol Keyboard Report. +		 * +		 *  Type define for a standard Boot Protocol Keyboard report +		 */ +		typedef struct +		{ +			uint8_t Modifier; /**< Keyboard modifier byte, indicating pressed modifier keys (a combination of +			                   *   \c HID_KEYBOARD_MODIFER_* masks). +			                   */ +			uint8_t Reserved; /**< Reserved for OEM use, always set to 0. */ +			uint8_t KeyCode[6]; /**< Key codes of the currently pressed keys. */ +		} ATTR_PACKED USB_KeyboardReport_Data_t; + +		/** Type define for the data type used to store HID report descriptor elements. */ +		typedef uint8_t USB_Descriptor_HIDReport_Datatype_t; + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDParser.c b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDParser.c new file mode 100644 index 0000000000..62f10c4e22 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDParser.c @@ -0,0 +1,389 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#define  __INCLUDE_FROM_HID_DRIVER +#include "HIDParser.h" + +uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, +                             uint16_t ReportSize, +                             HID_ReportInfo_t* const ParserData) +{ +	HID_StateTable_t      StateTable[HID_STATETABLE_STACK_DEPTH]; +	HID_StateTable_t*     CurrStateTable     = &StateTable[0]; +	HID_CollectionPath_t* CurrCollectionPath = NULL; +	HID_ReportSizeInfo_t* CurrReportIDInfo   = &ParserData->ReportIDSizes[0]; +	uint16_t              UsageList[HID_USAGE_STACK_DEPTH]; +	uint8_t               UsageListSize      = 0; +	HID_MinMax_t          UsageMinMax        = {0, 0}; + +	memset(ParserData,       0x00, sizeof(HID_ReportInfo_t)); +	memset(CurrStateTable,   0x00, sizeof(HID_StateTable_t)); +	memset(CurrReportIDInfo, 0x00, sizeof(HID_ReportSizeInfo_t)); + +	ParserData->TotalDeviceReports = 1; + +	while (ReportSize) +	{ +		uint8_t  HIDReportItem  = *ReportData; +		uint32_t ReportItemData; + +		ReportData++; +		ReportSize--; + +		switch (HIDReportItem & HID_RI_DATA_SIZE_MASK) +		{ +			case HID_RI_DATA_BITS_32: +				ReportItemData  = (((uint32_t)ReportData[3] << 24) | ((uint32_t)ReportData[2] << 16) | +			                       ((uint16_t)ReportData[1] << 8)  | ReportData[0]); +				ReportSize     -= 4; +				ReportData     += 4; +				break; + +			case HID_RI_DATA_BITS_16: +				ReportItemData  = (((uint16_t)ReportData[1] << 8) | (ReportData[0])); +				ReportSize     -= 2; +				ReportData     += 2; +				break; + +			case HID_RI_DATA_BITS_8: +				ReportItemData  = ReportData[0]; +				ReportSize     -= 1; +				ReportData     += 1; +				break; + +			default: +				ReportItemData  = 0; +				break; +		} + +		switch (HIDReportItem & (HID_RI_TYPE_MASK | HID_RI_TAG_MASK)) +		{ +			case HID_RI_PUSH(0): +				if (CurrStateTable == &StateTable[HID_STATETABLE_STACK_DEPTH - 1]) +				  return HID_PARSE_HIDStackOverflow; + +				memcpy((CurrStateTable + 1), +				       CurrStateTable, +				       sizeof(HID_ReportItem_t)); + +				CurrStateTable++; +				break; + +			case HID_RI_POP(0): +				if (CurrStateTable == &StateTable[0]) +				  return HID_PARSE_HIDStackUnderflow; + +				CurrStateTable--; +				break; + +			case HID_RI_USAGE_PAGE(0): +				if ((HIDReportItem & HID_RI_DATA_SIZE_MASK) == HID_RI_DATA_BITS_32) +				  CurrStateTable->Attributes.Usage.Page = (ReportItemData >> 16); + +				CurrStateTable->Attributes.Usage.Page       = ReportItemData; +				break; + +			case HID_RI_LOGICAL_MINIMUM(0): +				CurrStateTable->Attributes.Logical.Minimum  = ReportItemData; +				break; + +			case HID_RI_LOGICAL_MAXIMUM(0): +				CurrStateTable->Attributes.Logical.Maximum  = ReportItemData; +				break; + +			case HID_RI_PHYSICAL_MINIMUM(0): +				CurrStateTable->Attributes.Physical.Minimum = ReportItemData; +				break; + +			case HID_RI_PHYSICAL_MAXIMUM(0): +				CurrStateTable->Attributes.Physical.Maximum = ReportItemData; +				break; + +			case HID_RI_UNIT_EXPONENT(0): +				CurrStateTable->Attributes.Unit.Exponent    = ReportItemData; +				break; + +			case HID_RI_UNIT(0): +				CurrStateTable->Attributes.Unit.Type        = ReportItemData; +				break; + +			case HID_RI_REPORT_SIZE(0): +				CurrStateTable->Attributes.BitSize          = ReportItemData; +				break; + +			case HID_RI_REPORT_COUNT(0): +				CurrStateTable->ReportCount                 = ReportItemData; +				break; + +			case HID_RI_REPORT_ID(0): +				CurrStateTable->ReportID                    = ReportItemData; + +				if (ParserData->UsingReportIDs) +				{ +					CurrReportIDInfo = NULL; + +					for (uint8_t i = 0; i < ParserData->TotalDeviceReports; i++) +					{ +						if (ParserData->ReportIDSizes[i].ReportID == CurrStateTable->ReportID) +						{ +							CurrReportIDInfo = &ParserData->ReportIDSizes[i]; +							break; +						} +					} + +					if (CurrReportIDInfo == NULL) +					{ +						if (ParserData->TotalDeviceReports == HID_MAX_REPORT_IDS) +						  return HID_PARSE_InsufficientReportIDItems; + +						CurrReportIDInfo = &ParserData->ReportIDSizes[ParserData->TotalDeviceReports++]; +						memset(CurrReportIDInfo, 0x00, sizeof(HID_ReportSizeInfo_t)); +					} +				} + +				ParserData->UsingReportIDs = true; + +				CurrReportIDInfo->ReportID = CurrStateTable->ReportID; +				break; + +			case HID_RI_USAGE(0): +				if (UsageListSize == HID_USAGE_STACK_DEPTH) +				  return HID_PARSE_UsageListOverflow; + +				UsageList[UsageListSize++] = ReportItemData; +				break; + +			case HID_RI_USAGE_MINIMUM(0): +				UsageMinMax.Minimum = ReportItemData; +				break; + +			case HID_RI_USAGE_MAXIMUM(0): +				UsageMinMax.Maximum = ReportItemData; +				break; + +			case HID_RI_COLLECTION(0): +				if (CurrCollectionPath == NULL) +				{ +					CurrCollectionPath = &ParserData->CollectionPaths[0]; +				} +				else +				{ +					HID_CollectionPath_t* ParentCollectionPath = CurrCollectionPath; + +					CurrCollectionPath = &ParserData->CollectionPaths[1]; + +					while (CurrCollectionPath->Parent != NULL) +					{ +						if (CurrCollectionPath == &ParserData->CollectionPaths[HID_MAX_COLLECTIONS - 1]) +						  return HID_PARSE_InsufficientCollectionPaths; + +						CurrCollectionPath++; +					} + +					CurrCollectionPath->Parent = ParentCollectionPath; +				} + +				CurrCollectionPath->Type       = ReportItemData; +				CurrCollectionPath->Usage.Page = CurrStateTable->Attributes.Usage.Page; + +				if (UsageListSize) +				{ +					CurrCollectionPath->Usage.Usage = UsageList[0]; + +					for (uint8_t i = 1; i < UsageListSize; i++) +					  UsageList[i - 1] = UsageList[i]; + +					UsageListSize--; +				} +				else if (UsageMinMax.Minimum <= UsageMinMax.Maximum) +				{ +					CurrCollectionPath->Usage.Usage = UsageMinMax.Minimum++; +				} + +				break; + +			case HID_RI_END_COLLECTION(0): +				if (CurrCollectionPath == NULL) +				  return HID_PARSE_UnexpectedEndCollection; + +				CurrCollectionPath = CurrCollectionPath->Parent; +				break; + +			case HID_RI_INPUT(0): +			case HID_RI_OUTPUT(0): +			case HID_RI_FEATURE(0): +				for (uint8_t ReportItemNum = 0; ReportItemNum < CurrStateTable->ReportCount; ReportItemNum++) +				{ +					HID_ReportItem_t NewReportItem; + +					memcpy(&NewReportItem.Attributes, +					       &CurrStateTable->Attributes, +					       sizeof(HID_ReportItem_Attributes_t)); + +					NewReportItem.ItemFlags      = ReportItemData; +					NewReportItem.CollectionPath = CurrCollectionPath; +					NewReportItem.ReportID       = CurrStateTable->ReportID; + +					if (UsageListSize) +					{ +						NewReportItem.Attributes.Usage.Usage = UsageList[0]; + +						for (uint8_t i = 1; i < UsageListSize; i++) +						  UsageList[i - 1] = UsageList[i]; + +						UsageListSize--; +					} +					else if (UsageMinMax.Minimum <= UsageMinMax.Maximum) +					{ +						NewReportItem.Attributes.Usage.Usage = UsageMinMax.Minimum++; +					} + +					uint8_t ItemTypeTag = (HIDReportItem & (HID_RI_TYPE_MASK | HID_RI_TAG_MASK)); + +					if (ItemTypeTag == HID_RI_INPUT(0)) +					  NewReportItem.ItemType = HID_REPORT_ITEM_In; +					else if (ItemTypeTag == HID_RI_OUTPUT(0)) +					  NewReportItem.ItemType = HID_REPORT_ITEM_Out; +					else +					  NewReportItem.ItemType = HID_REPORT_ITEM_Feature; + +					NewReportItem.BitOffset = CurrReportIDInfo->ReportSizeBits[NewReportItem.ItemType]; + +					CurrReportIDInfo->ReportSizeBits[NewReportItem.ItemType] += CurrStateTable->Attributes.BitSize; + +					ParserData->LargestReportSizeBits = MAX(ParserData->LargestReportSizeBits, CurrReportIDInfo->ReportSizeBits[NewReportItem.ItemType]); + +					if (ParserData->TotalReportItems == HID_MAX_REPORTITEMS) +					  return HID_PARSE_InsufficientReportItems; + +					memcpy(&ParserData->ReportItems[ParserData->TotalReportItems], +					       &NewReportItem, sizeof(HID_ReportItem_t)); + +					if (!(ReportItemData & HID_IOF_CONSTANT) && CALLBACK_HIDParser_FilterHIDReportItem(&NewReportItem)) +					  ParserData->TotalReportItems++; +				} + +				break; + +			default: +				break; +		} + +		if ((HIDReportItem & HID_RI_TYPE_MASK) == HID_RI_TYPE_MAIN) +		{ +			UsageMinMax.Minimum = 0; +			UsageMinMax.Maximum = 0; +			UsageListSize       = 0; +		} +	} + +	if (!(ParserData->TotalReportItems)) +	  return HID_PARSE_NoUnfilteredReportItems; + +	return HID_PARSE_Successful; +} + +bool USB_GetHIDReportItemInfo(const uint8_t* ReportData, +                              HID_ReportItem_t* const ReportItem) +{ +	if (ReportItem == NULL) +	  return false; + +	uint16_t DataBitsRem  = ReportItem->Attributes.BitSize; +	uint16_t CurrentBit   = ReportItem->BitOffset; +	uint32_t BitMask      = (1 << 0); + +	if (ReportItem->ReportID) +	{ +		if (ReportItem->ReportID != ReportData[0]) +		  return false; + +		ReportData++; +	} + +	ReportItem->PreviousValue = ReportItem->Value; +	ReportItem->Value = 0; + +	while (DataBitsRem--) +	{ +		if (ReportData[CurrentBit / 8] & (1 << (CurrentBit % 8))) +		  ReportItem->Value |= BitMask; + +		CurrentBit++; +		BitMask <<= 1; +	} + +	return true; +} + +void USB_SetHIDReportItemInfo(uint8_t* ReportData, +                              HID_ReportItem_t* const ReportItem) +{ +	if (ReportItem == NULL) +	  return; + +	uint16_t DataBitsRem  = ReportItem->Attributes.BitSize; +	uint16_t CurrentBit   = ReportItem->BitOffset; +	uint32_t BitMask      = (1 << 0); + +	if (ReportItem->ReportID) +	{ +		ReportData[0] = ReportItem->ReportID; +		ReportData++; +	} + +	ReportItem->PreviousValue = ReportItem->Value; + +	while (DataBitsRem--) +	{ +		if (ReportItem->Value & BitMask) +		  ReportData[CurrentBit / 8] |= (1 << (CurrentBit % 8)); + +		CurrentBit++; +		BitMask <<= 1; +	} +} + +uint16_t USB_GetHIDReportSize(HID_ReportInfo_t* const ParserData, +                              const uint8_t ReportID, +                              const uint8_t ReportType) +{ +	for (uint8_t i = 0; i < HID_MAX_REPORT_IDS; i++) +	{ +		uint16_t ReportSizeBits = ParserData->ReportIDSizes[i].ReportSizeBits[ReportType]; + +		if (ParserData->ReportIDSizes[i].ReportID == ReportID) +		  return (ReportSizeBits / 8) + ((ReportSizeBits % 8) ? 1 : 0); +	} + +	return 0; +} + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDParser.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDParser.h new file mode 100644 index 0000000000..023316d7ea --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDParser.h @@ -0,0 +1,364 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Human Interface Device (HID) Class report descriptor parser. + * + *  This file allows for the easy parsing of complex HID report descriptors, which describes the data that + *  a HID device transmits to the host. It also provides an easy API for extracting and processing the data + *  elements inside a HID report sent from an attached HID device. + */ + +/** \ingroup Group_USB + *  \defgroup Group_HIDParser HID Report Parser + *  \brief USB Human Interface Device (HID) Class report descriptor parser. + * + *  \section Sec_HIDParser_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Host/HIDParser.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + * + *  \section Sec_HIDParser_ModDescription Module Description + *  Human Interface Device (HID) class report descriptor parser. This module implements a parser than is + *  capable of processing a complete HID report descriptor, and outputting a flat structure containing the + *  contents of the report in an a more friendly format. The parsed data may then be further processed and used + *  within an application to process sent and received HID reports to and from an attached HID device. + * + *  A HID report descriptor consists of a set of HID report items, which describe the function and layout + *  of data exchanged between a HID device and a host, including both the physical encoding of each item + *  (such as a button, key press or joystick axis) in the sent and received data packets - known as "reports" - + *  as well as other information about each item such as the usages, data range, physical location and other + *  characteristics. In this way a HID device can retain a high degree of flexibility in its capabilities, as it + *  is not forced to comply with a given report layout or feature-set. + * + *  This module also contains routines for the processing of data in an actual HID report, using the parsed report + *  descriptor data as a guide for the encoding. + * + *  @{ + */ + +#ifndef __HIDPARSER_H__ +#define __HIDPARSER_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" + +		#include "HIDReportData.h" +		#include "HIDClassCommon.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Macros: */ +		#if !defined(HID_STATETABLE_STACK_DEPTH) || defined(__DOXYGEN__) +			/** Constant indicating the maximum stack depth of the state table. A larger state table +			 *  allows for more PUSH/POP report items to be nested, but consumes more memory. By default +			 *  this is set to 2 levels (allowing non-nested PUSH items) but this can be overridden by +			 *  defining \c HID_STATETABLE_STACK_DEPTH to another value in the user project makefile, passing the +			 *  define to the compiler using the -D compiler switch. +			 */ +			#define HID_STATETABLE_STACK_DEPTH    2 +		#endif + +		#if !defined(HID_USAGE_STACK_DEPTH) || defined(__DOXYGEN__) +			/** Constant indicating the maximum stack depth of the usage table. A larger usage table +			 *  allows for more USAGE items to be indicated sequentially for REPORT COUNT entries of more than +			 *  one, but requires more stack space. By default this is set to 8 levels (allowing for a report +			 *  item with a count of 8) but this can be overridden by defining \c HID_USAGE_STACK_DEPTH to another +			 *  value in the user project makefile, passing the define to the compiler using the -D compiler +			 *  switch. +			 */ +			#define HID_USAGE_STACK_DEPTH         8 +		#endif + +		#if !defined(HID_MAX_COLLECTIONS) || defined(__DOXYGEN__) +			/** Constant indicating the maximum number of COLLECTION items (nested or unnested) that can be +			 *  processed in the report item descriptor. A large value allows for more COLLECTION items to be +			 *  processed, but consumes more memory. By default this is set to 10 collections, but this can be +			 *  overridden by defining \c HID_MAX_COLLECTIONS to another value in the user project makefile, passing +			 *  the define to the compiler using the -D compiler switch. +			 */ +			#define HID_MAX_COLLECTIONS           10 +		#endif + +		#if !defined(HID_MAX_REPORTITEMS) || defined(__DOXYGEN__) +			/** Constant indicating the maximum number of report items (IN, OUT or FEATURE) that can be processed +			 *  in the report item descriptor and stored in the user HID Report Info structure. A large value allows +			 *  for more report items to be stored, but consumes more memory. By default this is set to 20 items, +			 *  but this can be overridden by defining \c HID_MAX_REPORTITEMS to another value in the user project +			 *  makefile, and passing the define to the compiler using the -D compiler switch. +			 */ +			#define HID_MAX_REPORTITEMS           20 +		#endif + +		#if !defined(HID_MAX_REPORT_IDS) || defined(__DOXYGEN__) +			/** Constant indicating the maximum number of unique report IDs that can be processed in the report item +			 *  descriptor for the report size information array in the user HID Report Info structure. A large value +			 *  allows for more report ID report sizes to be stored, but consumes more memory. By default this is set +			 *  to 10 items, but this can be overridden by defining \c HID_MAX_REPORT_IDS to another value in the user project +			 *  makefile, and passing the define to the compiler using the -D compiler switch. Note that IN, OUT and FEATURE +			 *  items sharing the same report ID consume only one size item in the array. +			 */ +			#define HID_MAX_REPORT_IDS            10 +		#endif + +		/** Returns the value a given HID report item (once its value has been fetched via \ref USB_GetHIDReportItemInfo()) +		 *  left-aligned to the given data type. This allows for signed data to be interpreted correctly, by shifting the data +		 *  leftwards until the data's sign bit is in the correct position. +		 * +		 *  \param[in] ReportItem  HID Report Item whose retrieved value is to be aligned. +		 *  \param[in] Type        Data type to align the HID report item's value to. +		 * +		 *  \return Left-aligned data of the given report item's pre-retrieved value for the given datatype. +		 */ +		#define HID_ALIGN_DATA(ReportItem, Type) ((Type)(ReportItem->Value << ((8 * sizeof(Type)) - ReportItem->Attributes.BitSize))) + +	/* Public Interface - May be used in end-application: */ +		/* Enums: */ +			/** Enum for the possible error codes in the return value of the \ref USB_ProcessHIDReport() function. */ +			enum HID_Parse_ErrorCodes_t +			{ +				HID_PARSE_Successful                  = 0, /**< Successful parse of the HID report descriptor, no error. */ +				HID_PARSE_HIDStackOverflow            = 1, /**< More than \ref HID_STATETABLE_STACK_DEPTH nested PUSHes in the report. */ +				HID_PARSE_HIDStackUnderflow           = 2, /**< A POP was found when the state table stack was empty. */ +				HID_PARSE_InsufficientReportItems     = 3, /**< More than \ref HID_MAX_REPORTITEMS report items in the report. */ +				HID_PARSE_UnexpectedEndCollection     = 4, /**< An END COLLECTION item found without matching COLLECTION item. */ +				HID_PARSE_InsufficientCollectionPaths = 5, /**< More than \ref HID_MAX_COLLECTIONS collections in the report. */ +				HID_PARSE_UsageListOverflow           = 6, /**< More than \ref HID_USAGE_STACK_DEPTH usages listed in a row. */ +				HID_PARSE_InsufficientReportIDItems   = 7, /**< More than \ref HID_MAX_REPORT_IDS report IDs in the device. */ +				HID_PARSE_NoUnfilteredReportItems     = 8, /**< All report items from the device were filtered by the filtering callback routine. */ +			}; + +		/* Type Defines: */ +			/** \brief HID Parser Report Item Min/Max Structure. +			 * +			 *  Type define for an attribute with both minimum and maximum values (e.g. Logical Min/Max). +			 */ +			typedef struct +			{ +				uint32_t Minimum; /**< Minimum value for the attribute. */ +				uint32_t Maximum; /**< Maximum value for the attribute. */ +			} HID_MinMax_t; + +			/** \brief HID Parser Report Item Unit Structure. +			 * +			 *  Type define for the Unit attributes of a report item. +			 */ +			typedef struct +			{ +				uint32_t Type;     /**< Unit type (refer to HID specifications for details). */ +				uint8_t  Exponent; /**< Unit exponent (refer to HID specifications for details). */ +			} HID_Unit_t; + +			/** \brief HID Parser Report Item Usage Structure. +			 * +			 *  Type define for the Usage attributes of a report item. +			 */ +			typedef struct +			{ +				uint16_t Page;  /**< Usage page of the report item. */ +				uint16_t Usage; /**< Usage of the report item. */ +			} HID_Usage_t; + +			/** \brief HID Parser Report Item Collection Path Structure. +			 * +			 *  Type define for a COLLECTION object. Contains the collection attributes and a reference to the +			 *  parent collection if any. +			 */ +			typedef struct HID_CollectionPath +			{ +				uint8_t                    Type;   /**< Collection type (e.g. "Generic Desktop"). */ +				HID_Usage_t                Usage;  /**< Collection usage. */ +				struct HID_CollectionPath* Parent; /**< Reference to parent collection, or \c NULL if root collection. */ +			} HID_CollectionPath_t; + +			/** \brief HID Parser Report Item Attributes Structure. +			 * +			 *  Type define for all the data attributes of a report item, except flags. +			 */ +			typedef struct +			{ +				uint8_t      BitSize;  /**< Size in bits of the report item's data. */ + +				HID_Usage_t  Usage;    /**< Usage of the report item. */ +				HID_Unit_t   Unit;     /**< Unit type and exponent of the report item. */ +				HID_MinMax_t Logical;  /**< Logical minimum and maximum of the report item. */ +				HID_MinMax_t Physical; /**< Physical minimum and maximum of the report item. */ +			} HID_ReportItem_Attributes_t; + +			/** \brief HID Parser Report Item Details Structure. +			 * +			 *  Type define for a report item (IN, OUT or FEATURE) layout attributes and other details. +			 */ +			typedef struct +			{ +				uint16_t                    BitOffset;      /**< Bit offset in the IN, OUT or FEATURE report of the item. */ +				uint8_t                     ItemType;       /**< Report item type, a value in \ref HID_ReportItemTypes_t. */ +				uint16_t                    ItemFlags;      /**< Item data flags, a mask of \c HID_IOF_* constants. */ +				uint8_t                     ReportID;       /**< Report ID this item belongs to, or 0x00 if device has only one report */ +				HID_CollectionPath_t*       CollectionPath; /**< Collection path of the item. */ + +				HID_ReportItem_Attributes_t Attributes;     /**< Report item attributes. */ + +				uint32_t                    Value;          /**< Current value of the report item - use \ref HID_ALIGN_DATA() when processing +				                                             *   a retrieved value so that it is aligned to a specific type. +				                                             */ +				uint32_t                    PreviousValue;  /**< Previous value of the report item. */ +			} HID_ReportItem_t; + +			/** \brief HID Parser Report Size Structure. +			 * +			 *  Type define for a report item size information structure, to retain the size of a device's reports by ID. +			 */ +			typedef struct +			{ +				uint8_t  ReportID; /**< Report ID of the report within the HID interface. */ +				uint16_t ReportSizeBits[3]; /**< Total number of bits in each report type for the given Report ID, +				                             *   indexed by the \ref HID_ReportItemTypes_t enum. +				                             */ +			} HID_ReportSizeInfo_t; + +			/** \brief HID Parser State Structure. +			 * +			 *  Type define for a complete processed HID report, including all report item data and collections. +			 */ +			typedef struct +			{ +				uint8_t              TotalReportItems; /**< Total number of report items stored in the \c ReportItems array. */ +				HID_ReportItem_t     ReportItems[HID_MAX_REPORTITEMS]; /**< Report items array, including all IN, OUT +			                                                            *   and FEATURE items. +				                                                        */ +				HID_CollectionPath_t CollectionPaths[HID_MAX_COLLECTIONS]; /**< All collection items, referenced +				                                                            *   by the report items. +				                                                            */ +				uint8_t              TotalDeviceReports; /**< Number of reports within the HID interface */ +				HID_ReportSizeInfo_t ReportIDSizes[HID_MAX_REPORT_IDS]; /**< Report sizes for each report in the interface */ +				uint16_t             LargestReportSizeBits; /**< Largest report that the attached device will generate, in bits */ +				bool                 UsingReportIDs; /**< Indicates if the device has at least one REPORT ID +				                                      *   element in its HID report descriptor. +				                                      */ +			} HID_ReportInfo_t; + +		/* Function Prototypes: */ +			/** Function to process a given HID report returned from an attached device, and store it into a given +			 *  \ref HID_ReportInfo_t structure. +			 * +			 *  \param[in]  ReportData  Buffer containing the device's HID report table. +			 *  \param[in]  ReportSize  Size in bytes of the HID report table. +			 *  \param[out] ParserData  Pointer to a \ref HID_ReportInfo_t instance for the parser output. +			 * +			 *  \return A value in the \ref HID_Parse_ErrorCodes_t enum. +			 */ +			uint8_t USB_ProcessHIDReport(const uint8_t* ReportData, +			                             uint16_t ReportSize, +			                             HID_ReportInfo_t* const ParserData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); + +			/** Extracts the given report item's value out of the given HID report and places it into the Value +			 *  member of the report item's \ref HID_ReportItem_t structure. +			 * +			 *  When called on a report with an item that exists in that report, this copies the report item's \c Value +			 *  to its \c PreviousValue element for easy checking to see if an item's value has changed before processing +			 *  a report. If the given item does not exist in the report, the function does not modify the report item's +			 *  data. +			 * +			 *  \param[in]     ReportData  Buffer containing an IN or FEATURE report from an attached device. +			 *  \param[in,out] ReportItem  Pointer to the report item of interest in a \ref HID_ReportInfo_t ReportItem array. +			 * +			 *  \returns Boolean \c true if the item to retrieve was located in the given report, \c false otherwise. +			 */ +			bool USB_GetHIDReportItemInfo(const uint8_t* ReportData, +			                              HID_ReportItem_t* const ReportItem) ATTR_NON_NULL_PTR_ARG(1); + +			/** Retrieves the given report item's value out of the \c Value member of the report item's +			 *  \ref HID_ReportItem_t structure and places it into the correct position in the HID report +			 *  buffer. The report buffer is assumed to have the appropriate bits cleared before calling +			 *  this function (i.e., the buffer should be explicitly cleared before report values are added). +			 * +			 *  When called, this copies the report item's \c Value element to its \c PreviousValue element for easy +			 *  checking to see if an item's value has changed before sending a report. +			 * +			 *  If the device has multiple HID reports, the first byte in the report is set to the report ID of the given item. +			 * +			 *  \param[out] ReportData  Buffer holding the current OUT or FEATURE report data. +			 *  \param[in]  ReportItem  Pointer to the report item of interest in a \ref HID_ReportInfo_t ReportItem array. +			 */ +			void USB_SetHIDReportItemInfo(uint8_t* ReportData, +			                              HID_ReportItem_t* const ReportItem) ATTR_NON_NULL_PTR_ARG(1); + +			/** Retrieves the size of a given HID report in bytes from its Report ID. +			 * +			 *  \param[in] ParserData  Pointer to a \ref HID_ReportInfo_t instance containing the parser output. +			 *  \param[in] ReportID    Report ID of the report whose size is to be determined. +			 *  \param[in] ReportType  Type of the report whose size is to be determined, a value from the +			 *                         \ref HID_ReportItemTypes_t enum. +			 * +			 *  \return Size of the report in bytes, or \c 0 if the report does not exist. +			 */ +			uint16_t USB_GetHIDReportSize(HID_ReportInfo_t* const ParserData, +			                              const uint8_t ReportID, +			                              const uint8_t ReportType) ATTR_CONST ATTR_NON_NULL_PTR_ARG(1); + +			/** Callback routine for the HID Report Parser. This callback <b>must</b> be implemented by the user code when +			 *  the parser is used, to determine what report IN, OUT and FEATURE item's information is stored into the user +			 *  \ref HID_ReportInfo_t structure. This can be used to filter only those items the application will be using, so that +			 *  no RAM is wasted storing the attributes for report items which will never be referenced by the application. +			 * +			 *  Report item pointers passed to this callback function may be cached by the user application for later use +			 *  when processing report items. This provides faster report processing in the user application than would +			 *  a search of the entire parsed report item table for each received or sent report. +			 * +			 *  \param[in] CurrentItem  Pointer to the current report item for user checking. +			 * +			 *  \return Boolean \c true if the item should be stored into the \ref HID_ReportInfo_t structure, \c false if +			 *          it should be ignored. +			 */ +			bool CALLBACK_HIDParser_FilterHIDReportItem(HID_ReportItem_t* const CurrentItem); + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Type Defines: */ +			typedef struct +			{ +				 HID_ReportItem_Attributes_t Attributes; +				 uint8_t                     ReportCount; +				 uint8_t                     ReportID; +			} HID_StateTable_t; +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDReportData.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDReportData.h new file mode 100644 index 0000000000..fe1c4df943 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/HIDReportData.h @@ -0,0 +1,126 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Constants for HID report item attributes. + * + *  HID report item constants for report item attributes. Refer to the HID specification for + *  details on each flag's meaning when applied to an IN, OUT or FEATURE item. + */ + +/** \ingroup Group_HIDParser + *  \defgroup Group_HIDReportItemConst HID Report Descriptor Item Constants + * + *  General HID constant definitions for HID Report Descriptor elements. + * + *  @{ + */ + +#ifndef __HIDREPORTDATA_H__ +#define __HIDREPORTDATA_H__ + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#define HID_RI_DATA_SIZE_MASK                   0x03 +			#define HID_RI_TYPE_MASK                        0x0C +			#define HID_RI_TAG_MASK                         0xF0 + +			#define HID_RI_TYPE_MAIN                        0x00 +			#define HID_RI_TYPE_GLOBAL                      0x04 +			#define HID_RI_TYPE_LOCAL                       0x08 + +			#define HID_RI_DATA_BITS_0                      0x00 +			#define HID_RI_DATA_BITS_8                      0x01 +			#define HID_RI_DATA_BITS_16                     0x02 +			#define HID_RI_DATA_BITS_32                     0x03 +			#define HID_RI_DATA_BITS(DataBits)              CONCAT_EXPANDED(HID_RI_DATA_BITS_, DataBits) + +			#define _HID_RI_ENCODE_0(Data) +			#define _HID_RI_ENCODE_8(Data)                  , (Data & 0xFF) +			#define _HID_RI_ENCODE_16(Data)                 _HID_RI_ENCODE_8(Data)  _HID_RI_ENCODE_8(Data >> 8) +			#define _HID_RI_ENCODE_32(Data)                 _HID_RI_ENCODE_16(Data) _HID_RI_ENCODE_16(Data >> 16) +			#define _HID_RI_ENCODE(DataBits, ...)           CONCAT_EXPANDED(_HID_RI_ENCODE_, DataBits(__VA_ARGS__)) + +			#define _HID_RI_ENTRY(Type, Tag, DataBits, ...) (Type | Tag | HID_RI_DATA_BITS(DataBits)) _HID_RI_ENCODE(DataBits, (__VA_ARGS__)) +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +		/** \name HID Input, Output and Feature Report Descriptor Item Flags */ +		//@{ +			#define HID_IOF_CONSTANT                        (1 << 0) +			#define HID_IOF_DATA                            (0 << 0) +			#define HID_IOF_VARIABLE                        (1 << 1) +			#define HID_IOF_ARRAY                           (0 << 1) +			#define HID_IOF_RELATIVE                        (1 << 2) +			#define HID_IOF_ABSOLUTE                        (0 << 2) +			#define HID_IOF_WRAP                            (1 << 3) +			#define HID_IOF_NO_WRAP                         (0 << 3) +			#define HID_IOF_NON_LINEAR                      (1 << 4) +			#define HID_IOF_LINEAR                          (0 << 4) +			#define HID_IOF_NO_PREFERRED_STATE              (1 << 5) +			#define HID_IOF_PREFERRED_STATE                 (0 << 5) +			#define HID_IOF_NULLSTATE                       (1 << 6) +			#define HID_IOF_NO_NULL_POSITION                (0 << 6) +			#define HID_IOF_VOLATILE                        (1 << 7) +			#define HID_IOF_NON_VOLATILE                    (0 << 7) +			#define HID_IOF_BUFFERED_BYTES                  (1 << 8) +			#define HID_IOF_BITFIELD                        (0 << 8) +		//@} + +		/** \name HID Report Descriptor Item Macros */ +		//@{ +			#define HID_RI_INPUT(DataBits, ...)             _HID_RI_ENTRY(HID_RI_TYPE_MAIN  , 0x80, DataBits, __VA_ARGS__) +			#define HID_RI_OUTPUT(DataBits, ...)            _HID_RI_ENTRY(HID_RI_TYPE_MAIN  , 0x90, DataBits, __VA_ARGS__) +			#define HID_RI_COLLECTION(DataBits, ...)        _HID_RI_ENTRY(HID_RI_TYPE_MAIN  , 0xA0, DataBits, __VA_ARGS__) +			#define HID_RI_FEATURE(DataBits, ...)           _HID_RI_ENTRY(HID_RI_TYPE_MAIN  , 0xB0, DataBits, __VA_ARGS__) +			#define HID_RI_END_COLLECTION(DataBits, ...)    _HID_RI_ENTRY(HID_RI_TYPE_MAIN  , 0xC0, DataBits, __VA_ARGS__) +			#define HID_RI_USAGE_PAGE(DataBits, ...)        _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x00, DataBits, __VA_ARGS__) +			#define HID_RI_LOGICAL_MINIMUM(DataBits, ...)   _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x10, DataBits, __VA_ARGS__) +			#define HID_RI_LOGICAL_MAXIMUM(DataBits, ...)   _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x20, DataBits, __VA_ARGS__) +			#define HID_RI_PHYSICAL_MINIMUM(DataBits, ...)  _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x30, DataBits, __VA_ARGS__) +			#define HID_RI_PHYSICAL_MAXIMUM(DataBits, ...)  _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x40, DataBits, __VA_ARGS__) +			#define HID_RI_UNIT_EXPONENT(DataBits, ...)     _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x50, DataBits, __VA_ARGS__) +			#define HID_RI_UNIT(DataBits, ...)              _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x60, DataBits, __VA_ARGS__) +			#define HID_RI_REPORT_SIZE(DataBits, ...)       _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x70, DataBits, __VA_ARGS__) +			#define HID_RI_REPORT_ID(DataBits, ...)         _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x80, DataBits, __VA_ARGS__) +			#define HID_RI_REPORT_COUNT(DataBits, ...)      _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0x90, DataBits, __VA_ARGS__) +			#define HID_RI_PUSH(DataBits, ...)              _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0xA0, DataBits, __VA_ARGS__) +			#define HID_RI_POP(DataBits, ...)               _HID_RI_ENTRY(HID_RI_TYPE_GLOBAL, 0xB0, DataBits, __VA_ARGS__) +			#define HID_RI_USAGE(DataBits, ...)             _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x00, DataBits, __VA_ARGS__) +			#define HID_RI_USAGE_MINIMUM(DataBits, ...)     _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x10, DataBits, __VA_ARGS__) +			#define HID_RI_USAGE_MAXIMUM(DataBits, ...)     _HID_RI_ENTRY(HID_RI_TYPE_LOCAL , 0x20, DataBits, __VA_ARGS__) +		//@} + +/** @} */ + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/MIDIClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/MIDIClassCommon.h new file mode 100644 index 0000000000..b6414bc06b --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/MIDIClassCommon.h @@ -0,0 +1,363 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Common definitions and declarations for the library USB MIDI Class driver. + * + *  Common definitions and declarations for the library USB MIDI Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassMIDI + *  \defgroup Group_USBClassMIDICommon  Common Class Definitions + * + *  \section Sec_USBClassMIDICommon_ModDescription Module Description + *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB + *  MIDI Class. + * + *  @{ + */ + +#ifndef _MIDI_CLASS_COMMON_H_ +#define _MIDI_CLASS_COMMON_H_ + +	/* Macros: */ +		#define __INCLUDE_FROM_AUDIO_DRIVER + +	/* Includes: */ +		#include "../../Core/StdDescriptors.h" +		#include "AudioClassCommon.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_MIDI_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Macros: */ +		/** \name MIDI Command Values +		 *  See http://www.midi.org/techspecs/midimessages.php for more information. +		 */ +		//@{ +		/** MIDI command for System Exclusive (SysEx) single event that has one byte of data total. */ +		#define MIDI_COMMAND_SYSEX_1BYTE           MIDI_COMMAND_SYSEX_END_1BYTE + +		/** MIDI command for System Exclusive (SysEx) single event that has two bytes of data total. */ +		#define MIDI_COMMAND_SYSEX_2BYTE           0x20 + +		/** MIDI command for System Exclusive (SysEx) single event that has three bytes of data total. */ +		#define MIDI_COMMAND_SYSEX_3BYTE           0x30 + +		/** MIDI command for System Exclusive (SysEx) stream event that has at least four bytes of data total. */ +		#define MIDI_COMMAND_SYSEX_START_3BYTE     0x40 + +		/** MIDI command for System Exclusive (SysEx) stream event terminator with one remaining data byte. */ +		#define MIDI_COMMAND_SYSEX_END_1BYTE       0x50 + +		/** MIDI command for System Exclusive (SysEx) stream event terminator with two remaining data bytes. */ +		#define MIDI_COMMAND_SYSEX_END_2BYTE       0x60 + +		/** MIDI command for System Exclusive (SysEx) stream event terminator with three remaining data bytes. */ +		#define MIDI_COMMAND_SYSEX_END_3BYTE       0x70 + +		/** MIDI command for a note off (deactivation) event. */ +		#define MIDI_COMMAND_NOTE_OFF              0x80 + +		/** MIDI command for a note on (activation) event. */ +		#define MIDI_COMMAND_NOTE_ON               0x90 + +		/** MIDI command for a note pressure change event. */ +		#define MIDI_COMMAND_NOTE_PRESSURE         0xA0 + +		/** MIDI command for a control change event. */ +		#define MIDI_COMMAND_CONTROL_CHANGE        0xB0 + +		/** MIDI command for a control change event. */ +		#define MIDI_COMMAND_PROGRAM_CHANGE        0xC0 + +		/** MIDI command for a channel pressure change event. */ +		#define MIDI_COMMAND_CHANNEL_PRESSURE      0xD0 + +		/** MIDI command for a pitch change event. */ +		#define MIDI_COMMAND_PITCH_WHEEL_CHANGE    0xE0 +		//@} + +		/** Standard key press velocity value used for all note events. */ +		#define MIDI_STANDARD_VELOCITY             64 + +		/** Convenience macro. MIDI channels are numbered from 1-10 (natural numbers) however the logical channel +		 *  addresses are zero-indexed. This converts a natural MIDI channel number into the logical channel address. +		 * +		 *  \param[in] channel  MIDI channel number to address. +		 * +		 *  \return Constructed MIDI channel ID. +		 */ +		#define MIDI_CHANNEL(channel)              ((channel) - 1) + +		/** Constructs a MIDI event ID from a given MIDI command and a virtual MIDI cable index. This can then be +		 *  used to create and decode \ref MIDI_EventPacket_t MIDI event packets. +		 * +		 *  \param[in] virtualcable  Index of the virtual MIDI cable the event relates to +		 *  \param[in] command       MIDI command to send through the virtual MIDI cable +		 * +		 *  \return Constructed MIDI event ID. +		 */ +		#define MIDI_EVENT(virtualcable, command)  (((virtualcable) << 4) | ((command) >> 4)) + +	/* Enums: */ +		/** Enum for the possible MIDI jack types in a MIDI device jack descriptor. */ +		enum MIDI_JackTypes_t +		{ +			MIDI_JACKTYPE_Embedded = 0x01, /**< MIDI class descriptor jack type value for an embedded (logical) MIDI input or output jack. */ +			MIDI_JACKTYPE_External = 0x02, /**< MIDI class descriptor jack type value for an external (physical) MIDI input or output jack. */ +		}; + +	/* Type Defines: */ +		/** \brief MIDI class-specific Streaming Interface Descriptor (LUFA naming conventions). +		 * +		 *  Type define for an Audio class-specific MIDI streaming interface descriptor. This indicates to the host +		 *  how MIDI the specification compliance of the device and the total length of the Audio class-specific descriptors. +		 *  See the USB Audio specification for more details. +		 * +		 *  \see \ref USB_MIDI_StdDescriptor_AudioInterface_AS_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ +			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */ + +			uint16_t                AudioSpecification; /**< Binary coded decimal value, indicating the supported Audio Class +			                                             *   specification version. +			                                             * +			                                             *   \see \ref VERSION_BCD() utility macro. +			                                             */ +			uint16_t                TotalLength; /**< Total length of the Audio class-specific descriptors, including this descriptor. */ +		} ATTR_PACKED USB_MIDI_Descriptor_AudioInterface_AS_t; + +		/** \brief MIDI class-specific Streaming Interface Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for an Audio class-specific MIDI streaming interface descriptor. This indicates to the host +		 *  how MIDI the specification compliance of the device and the total length of the Audio class-specific descriptors. +		 *  See the USB Audio specification for more details. +		 * +		 *  \see \ref USB_MIDI_Descriptor_AudioInterface_AS_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t  bLength; /**< Size of the descriptor, in bytes. */ +			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +			                           *   given by the specific class. +			                           */ + +			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */ + +			uint16_t bcdMSC; /**< Binary coded decimal value, indicating the supported MIDI Class specification version. +			                  * +			                  *   \see \ref VERSION_BCD() utility macro. +			                  */ +			uint16_t wTotalLength; /**< Total length of the Audio class-specific descriptors, including this descriptor. */ +		} ATTR_PACKED USB_MIDI_StdDescriptor_AudioInterface_AS_t; + +		/** \brief MIDI class-specific Input Jack Descriptor (LUFA naming conventions). +		 * +		 *  Type define for an Audio class-specific MIDI IN jack. This gives information to the host on a MIDI input, either +		 *  a physical input jack, or a logical jack (receiving input data internally, or from the host via an endpoint). +		 * +		 *  \see \ref USB_MIDI_StdDescriptor_InputJack_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Header_t Header; /**< Regular descriptor header containing the descriptor's type and length. */ +			uint8_t                 Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */ + +			uint8_t                 JackType; /**< Type of jack, one of the \c JACKTYPE_* mask values. */ +			uint8_t                 JackID; /**< ID value of this jack - must be a unique value within the device. */ + +			uint8_t                 JackStrIndex; /**< Index of a string descriptor describing this descriptor within the device. */ +		} ATTR_PACKED USB_MIDI_Descriptor_InputJack_t; + +		/** \brief MIDI class-specific Input Jack Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for an Audio class-specific MIDI IN jack. This gives information to the host on a MIDI input, either +		 *  a physical input jack, or a logical jack (receiving input data internally, or from the host via an endpoint). +		 * +		 *  \see \ref USB_MIDI_Descriptor_InputJack_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t  bLength; /**< Size of the descriptor, in bytes. */ +			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +			                           *   given by the specific class. +			                           */ + +			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */ + +			uint8_t  bJackType; /**< Type of jack, one of the \c JACKTYPE_* mask values. */ +			uint8_t  bJackID; /**< ID value of this jack - must be a unique value within the device. */ + +			uint8_t  iJack; /**< Index of a string descriptor describing this descriptor within the device. */ +		} ATTR_PACKED USB_MIDI_StdDescriptor_InputJack_t; + +		/** \brief MIDI class-specific Output Jack Descriptor (LUFA naming conventions). +		 * +		 *  Type define for an Audio class-specific MIDI OUT jack. This gives information to the host on a MIDI output, either +		 *  a physical output jack, or a logical jack (sending output data internally, or to the host via an endpoint). +		 * +		 *  \see \ref USB_MIDI_StdDescriptor_OutputJack_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Header_t   Header; /**< Regular descriptor header containing the descriptor's type and length. */ +			uint8_t                   Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */ + +			uint8_t                   JackType; /**< Type of jack, one of the \c JACKTYPE_* mask values. */ +			uint8_t                   JackID; /**< ID value of this jack - must be a unique value within the device. */ + +			uint8_t                   NumberOfPins; /**< Number of output channels within the jack, either physical or logical. */ +			uint8_t                   SourceJackID[1]; /**< ID of each output pin's source data jack. */ +			uint8_t                   SourcePinID[1]; /**< Pin number in the input jack of each output pin's source data. */ + +			uint8_t                   JackStrIndex; /**< Index of a string descriptor describing this descriptor within the device. */ +		} ATTR_PACKED USB_MIDI_Descriptor_OutputJack_t; + +		/** \brief MIDI class-specific Output Jack Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for an Audio class-specific MIDI OUT jack. This gives information to the host on a MIDI output, either +		 *  a physical output jack, or a logical jack (sending output data internally, or to the host via an endpoint). +		 * +		 *  \see \ref USB_MIDI_Descriptor_OutputJack_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t  bLength; /**< Size of the descriptor, in bytes. */ +			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +			                           *   given by the specific class. +			                           */ + +			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */ + +			uint8_t  bJackType; /**< Type of jack, one of the \c JACKTYPE_* mask values. */ +			uint8_t  bJackID; /**< ID value of this jack - must be a unique value within the device. */ + +			uint8_t  bNrInputPins; /**< Number of output channels within the jack, either physical or logical. */ +			uint8_t  baSourceID[1]; /**< ID of each output pin's source data jack. */ +			uint8_t  baSourcePin[1]; /**< Pin number in the input jack of each output pin's source data. */ + +			uint8_t  iJack; /**< Index of a string descriptor describing this descriptor within the device. */ +		} ATTR_PACKED USB_MIDI_StdDescriptor_OutputJack_t; + +		/** \brief Audio class-specific Jack Endpoint Descriptor (LUFA naming conventions). +		 * +		 *  Type define for an Audio class-specific extended MIDI jack endpoint descriptor. This contains extra information +		 *  on the usage of MIDI endpoints used to stream MIDI events in and out of the USB Audio device, and follows an Audio +		 *  class-specific extended MIDI endpoint descriptor. See the USB Audio specification for more details. +		 * +		 *  \see \ref USB_MIDI_StdDescriptor_Jack_Endpoint_t for the version of this type with standard element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			USB_Descriptor_Header_t   Header; /**< Regular descriptor header containing the descriptor's type and length. */ +			uint8_t                   Subtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */ + +			uint8_t                   TotalEmbeddedJacks; /**< Total number of jacks inside this endpoint. */ +			uint8_t                   AssociatedJackID[1]; /**< IDs of each jack inside the endpoint. */ +		} ATTR_PACKED USB_MIDI_Descriptor_Jack_Endpoint_t; + +		/** \brief Audio class-specific Jack Endpoint Descriptor (USB-IF naming conventions). +		 * +		 *  Type define for an Audio class-specific extended MIDI jack endpoint descriptor. This contains extra information +		 *  on the usage of MIDI endpoints used to stream MIDI events in and out of the USB Audio device, and follows an Audio +		 *  class-specific extended MIDI endpoint descriptor. See the USB Audio specification for more details. +		 * +		 *  \see \ref USB_MIDI_Descriptor_Jack_Endpoint_t for the version of this type with non-standard LUFA specific +		 *       element names. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t  bLength; /**< Size of the descriptor, in bytes. */ +			uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +			                           *   given by the specific class. +			                           */ + +			uint8_t  bDescriptorSubtype; /**< Sub type value used to distinguish between audio class-specific descriptors. */ + +			uint8_t  bNumEmbMIDIJack; /**< Total number of jacks inside this endpoint. */ +			uint8_t  bAssocJackID[1]; /**< IDs of each jack inside the endpoint. */ +		} ATTR_PACKED USB_MIDI_StdDescriptor_Jack_Endpoint_t; + +		/** \brief MIDI Class Driver Event Packet. +		 * +		 *  Type define for a USB MIDI event packet, used to encapsulate sent and received MIDI messages from a USB MIDI interface. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint8_t  Event; /**< MIDI event type, constructed with the \ref MIDI_EVENT() macro. */ + +			uint8_t  Data1; /**< First byte of data in the MIDI event. */ +			uint8_t  Data2; /**< Second byte of data in the MIDI event. */ +			uint8_t  Data3; /**< Third byte of data in the MIDI event. */ +		} ATTR_PACKED MIDI_EventPacket_t; + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/MassStorageClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/MassStorageClassCommon.h new file mode 100644 index 0000000000..d2ea37a82a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/MassStorageClassCommon.h @@ -0,0 +1,368 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Common definitions and declarations for the library USB Mass Storage Class driver. + * + *  Common definitions and declarations for the library USB Mass Storage Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassMS + *  \defgroup Group_USBClassMSCommon  Common Class Definitions + * + *  \section Sec_USBClassMSCommon_ModDescription Module Description + *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB + *  Mass Storage Class. + * + *  @{ + */ + +#ifndef _MS_CLASS_COMMON_H_ +#define _MS_CLASS_COMMON_H_ + +	/* Includes: */ +		#include "../../Core/StdDescriptors.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_MS_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Macros: */ +		/** Magic signature for a Command Block Wrapper used in the Mass Storage Bulk-Only transport protocol. */ +		#define MS_CBW_SIGNATURE                               0x43425355UL + +		/** Magic signature for a Command Status Wrapper used in the Mass Storage Bulk-Only transport protocol. */ +		#define MS_CSW_SIGNATURE                               0x53425355UL + +		/** Mask for a Command Block Wrapper's flags attribute to specify a command with data sent from host-to-device. */ +		#define MS_COMMAND_DIR_DATA_OUT                        (0 << 7) + +		/** Mask for a Command Block Wrapper's flags attribute to specify a command with data sent from device-to-host. */ +		#define MS_COMMAND_DIR_DATA_IN                         (1 << 7) + +		/** \name SCSI Commands*/ +		//@{ +		/** SCSI Command Code for an INQUIRY command. */ +		#define SCSI_CMD_INQUIRY                               0x12 + +		/** SCSI Command Code for a REQUEST SENSE command. */ +		#define SCSI_CMD_REQUEST_SENSE                         0x03 + +		/** SCSI Command Code for a TEST UNIT READY command. */ +		#define SCSI_CMD_TEST_UNIT_READY                       0x00 + +		/** SCSI Command Code for a READ CAPACITY (10) command. */ +		#define SCSI_CMD_READ_CAPACITY_10                      0x25 + +		/** SCSI Command Code for a START STOP UNIT command. */ +		#define SCSI_CMD_START_STOP_UNIT                       0x1B + +		/** SCSI Command Code for a SEND DIAGNOSTIC command. */ +		#define SCSI_CMD_SEND_DIAGNOSTIC                       0x1D + +		/** SCSI Command Code for a PREVENT ALLOW MEDIUM REMOVAL command. */ +		#define SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL          0x1E + +		/** SCSI Command Code for a WRITE (10) command. */ +		#define SCSI_CMD_WRITE_10                              0x2A + +		/** SCSI Command Code for a READ (10) command. */ +		#define SCSI_CMD_READ_10                               0x28 + +		/** SCSI Command Code for a WRITE (6) command. */ +		#define SCSI_CMD_WRITE_6                               0x0A + +		/** SCSI Command Code for a READ (6) command. */ +		#define SCSI_CMD_READ_6                                0x08 + +		/** SCSI Command Code for a VERIFY (10) command. */ +		#define SCSI_CMD_VERIFY_10                             0x2F + +		/** SCSI Command Code for a MODE SENSE (6) command. */ +		#define SCSI_CMD_MODE_SENSE_6                          0x1A + +		/** SCSI Command Code for a MODE SENSE (10) command. */ +		#define SCSI_CMD_MODE_SENSE_10                         0x5A +		//@} + +		/** \name SCSI Sense Key Values */ +		//@{ +		/** SCSI Sense Code to indicate no error has occurred. */ +		#define SCSI_SENSE_KEY_GOOD                            0x00 + +		/** SCSI Sense Code to indicate that the device has recovered from an error. */ +		#define SCSI_SENSE_KEY_RECOVERED_ERROR                 0x01 + +		/** SCSI Sense Code to indicate that the device is not ready for a new command. */ +		#define SCSI_SENSE_KEY_NOT_READY                       0x02 + +		/** SCSI Sense Code to indicate an error whilst accessing the medium. */ +		#define SCSI_SENSE_KEY_MEDIUM_ERROR                    0x03 + +		/** SCSI Sense Code to indicate a hardware error has occurred. */ +		#define SCSI_SENSE_KEY_HARDWARE_ERROR                  0x04 + +		/** SCSI Sense Code to indicate that an illegal request has been issued. */ +		#define SCSI_SENSE_KEY_ILLEGAL_REQUEST                 0x05 + +		/** SCSI Sense Code to indicate that the unit requires attention from the host to indicate +		 *  a reset event, medium removal or other condition. +		 */ +		#define SCSI_SENSE_KEY_UNIT_ATTENTION                  0x06 + +		/** SCSI Sense Code to indicate that a write attempt on a protected block has been made. */ +		#define SCSI_SENSE_KEY_DATA_PROTECT                    0x07 + +		/** SCSI Sense Code to indicate an error while trying to write to a write-once medium. */ +		#define SCSI_SENSE_KEY_BLANK_CHECK                     0x08 + +		/** SCSI Sense Code to indicate a vendor specific error has occurred. */ +		#define SCSI_SENSE_KEY_VENDOR_SPECIFIC                 0x09 + +		/** SCSI Sense Code to indicate that an EXTENDED COPY command has aborted due to an error. */ +		#define SCSI_SENSE_KEY_COPY_ABORTED                    0x0A + +		/** SCSI Sense Code to indicate that the device has aborted the issued command. */ +		#define SCSI_SENSE_KEY_ABORTED_COMMAND                 0x0B + +		/** SCSI Sense Code to indicate an attempt to write past the end of a partition has been made. */ +		#define SCSI_SENSE_KEY_VOLUME_OVERFLOW                 0x0D + +		/** SCSI Sense Code to indicate that the source data did not match the data read from the medium. */ +		#define SCSI_SENSE_KEY_MISCOMPARE                      0x0E +		//@} + +		/** \name SCSI Additional Sense Codes */ +		//@{ +		/** SCSI Additional Sense Code to indicate no additional sense information is available. */ +		#define SCSI_ASENSE_NO_ADDITIONAL_INFORMATION          0x00 + +		/** SCSI Additional Sense Code to indicate that the logical unit (LUN) addressed is not ready. */ +		#define SCSI_ASENSE_LOGICAL_UNIT_NOT_READY             0x04 + +		/** SCSI Additional Sense Code to indicate an invalid field was encountered while processing the issued command. */ +		#define SCSI_ASENSE_INVALID_FIELD_IN_CDB               0x24 + +		/** SCSI Additional Sense Code to indicate that a medium that was previously indicated as not ready has now +		 *  become ready for use. +		 */ +		#define SCSI_ASENSE_NOT_READY_TO_READY_CHANGE          0x28 + +		/** SCSI Additional Sense Code to indicate that an attempt to write to a protected area was made. */ +		#define SCSI_ASENSE_WRITE_PROTECTED                    0x27 + +		/** SCSI Additional Sense Code to indicate an error whilst formatting the device medium. */ +		#define SCSI_ASENSE_FORMAT_ERROR                       0x31 + +		/** SCSI Additional Sense Code to indicate an invalid command was issued. */ +		#define SCSI_ASENSE_INVALID_COMMAND                    0x20 + +		/** SCSI Additional Sense Code to indicate a write to a block out outside of the medium's range was issued. */ +		#define SCSI_ASENSE_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE 0x21 + +		/** SCSI Additional Sense Code to indicate that no removable medium is inserted into the device. */ +		#define SCSI_ASENSE_MEDIUM_NOT_PRESENT                 0x3A +		//@} + +		/** \name SCSI Additional Sense Key Code Qualifiers */ +		//@{ +		/** SCSI Additional Sense Qualifier Code to indicate no additional sense qualifier information is available. */ +		#define SCSI_ASENSEQ_NO_QUALIFIER                      0x00 + +		/** SCSI Additional Sense Qualifier Code to indicate that a medium format command failed to complete. */ +		#define SCSI_ASENSEQ_FORMAT_COMMAND_FAILED             0x01 + +		/** SCSI Additional Sense Qualifier Code to indicate that an initializing command must be issued before the issued +		 *  command can be executed. +		 */ +		#define SCSI_ASENSEQ_INITIALIZING_COMMAND_REQUIRED     0x02 + +		/** SCSI Additional Sense Qualifier Code to indicate that an operation is currently in progress. */ +		#define SCSI_ASENSEQ_OPERATION_IN_PROGRESS             0x07 +		//@} + +	/* Enums: */ +		/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the Mass +		 *  Storage device class. +		 */ +		enum MS_Descriptor_ClassSubclassProtocol_t +		{ +			MS_CSCP_MassStorageClass          = 0x08, /**< Descriptor Class value indicating that the device or interface +			                                           *   belongs to the Mass Storage class. +			                                           */ +			MS_CSCP_SCSITransparentSubclass   = 0x06, /**< Descriptor Subclass value indicating that the device or interface +			                                           *   belongs to the SCSI Transparent Command Set subclass of the Mass +			                                           *   storage class. +			                                           */ +			MS_CSCP_BulkOnlyTransportProtocol = 0x50, /**< Descriptor Protocol value indicating that the device or interface +			                                           *   belongs to the Bulk Only Transport protocol of the Mass Storage class. +			                                           */ +		}; + +		/** Enum for the Mass Storage class specific control requests that can be issued by the USB bus host. */ +		enum MS_ClassRequests_t +		{ +			MS_REQ_GetMaxLUN                  = 0xFE, /**< Mass Storage class-specific request to retrieve the total number of Logical +			                                           *   Units (drives) in the SCSI device. +			                                           */ +			MS_REQ_MassStorageReset           = 0xFF, /**< Mass Storage class-specific request to reset the Mass Storage interface, +			                                           *   ready for the next command. +		                                               */ +		}; + +		/** Enum for the possible command status wrapper return status codes. */ +		enum MS_CommandStatusCodes_t +		{ +			MS_SCSI_COMMAND_Pass              = 0, /**< Command completed with no error */ +			MS_SCSI_COMMAND_Fail              = 1, /**< Command failed to complete - host may check the exact error via a +			                                        *   SCSI REQUEST SENSE command. +			                                        */ +			MS_SCSI_COMMAND_PhaseError        = 2, /**< Command failed due to being invalid in the current phase. */ +		}; + +	/* Type Defines: */ +		/** \brief Mass Storage Class Command Block Wrapper. +		 * +		 *  Type define for a Command Block Wrapper, used in the Mass Storage Bulk-Only Transport protocol. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint32_t Signature; /**< Command block signature, must be \ref MS_CBW_SIGNATURE to indicate a valid Command Block. */ +			uint32_t Tag; /**< Unique command ID value, to associate a command block wrapper with its command status wrapper. */ +			uint32_t DataTransferLength; /**< Length of the optional data portion of the issued command, in bytes. */ +			uint8_t  Flags; /**< Command block flags, indicating command data direction. */ +			uint8_t  LUN; /**< Logical Unit number this command is issued to. */ +			uint8_t  SCSICommandLength; /**< Length of the issued SCSI command within the SCSI command data array. */ +			uint8_t  SCSICommandData[16]; /**< Issued SCSI command in the Command Block. */ +		} ATTR_PACKED MS_CommandBlockWrapper_t; + +		/** \brief Mass Storage Class Command Status Wrapper. +		 * +		 *  Type define for a Command Status Wrapper, used in the Mass Storage Bulk-Only Transport protocol. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint32_t Signature; /**< Status block signature, must be \ref MS_CSW_SIGNATURE to indicate a valid Command Status. */ +			uint32_t Tag; /**< Unique command ID value, to associate a command block wrapper with its command status wrapper. */ +			uint32_t DataTransferResidue; /**< Number of bytes of data not processed in the SCSI command. */ +			uint8_t  Status; /**< Status code of the issued command - a value from the \ref MS_CommandStatusCodes_t enum. */ +		} ATTR_PACKED MS_CommandStatusWrapper_t; + +		/** \brief Mass Storage Class SCSI Sense Structure +		 * +		 *  Type define for a SCSI Sense structure. Structures of this type are filled out by the +		 *  device via the \ref MS_Host_RequestSense() function, indicating the current sense data of the +		 *  device (giving explicit error codes for the last issued command). For details of the +		 *  structure contents, refer to the SCSI specifications. +		 */ +		typedef struct +		{ +			uint8_t  ResponseCode; + +			uint8_t  SegmentNumber; + +			unsigned SenseKey            : 4; +			unsigned Reserved            : 1; +			unsigned ILI                 : 1; +			unsigned EOM                 : 1; +			unsigned FileMark            : 1; + +			uint8_t  Information[4]; +			uint8_t  AdditionalLength; +			uint8_t  CmdSpecificInformation[4]; +			uint8_t  AdditionalSenseCode; +			uint8_t  AdditionalSenseQualifier; +			uint8_t  FieldReplaceableUnitCode; +			uint8_t  SenseKeySpecific[3]; +		} ATTR_PACKED SCSI_Request_Sense_Response_t; + +		/** \brief Mass Storage Class SCSI Inquiry Structure. +		 * +		 *  Type define for a SCSI Inquiry structure. Structures of this type are filled out by the +		 *  device via the \ref MS_Host_GetInquiryData() function, retrieving the attached device's +		 *  information. +		 * +		 *  For details of the structure contents, refer to the SCSI specifications. +		 */ +		typedef struct +		{ +			unsigned DeviceType          : 5; +			unsigned PeripheralQualifier : 3; + +			unsigned Reserved            : 7; +			unsigned Removable           : 1; + +			uint8_t  Version; + +			unsigned ResponseDataFormat  : 4; +			unsigned Reserved2           : 1; +			unsigned NormACA             : 1; +			unsigned TrmTsk              : 1; +			unsigned AERC                : 1; + +			uint8_t  AdditionalLength; +			uint8_t  Reserved3[2]; + +			unsigned SoftReset           : 1; +			unsigned CmdQue              : 1; +			unsigned Reserved4           : 1; +			unsigned Linked              : 1; +			unsigned Sync                : 1; +			unsigned WideBus16Bit        : 1; +			unsigned WideBus32Bit        : 1; +			unsigned RelAddr             : 1; + +			uint8_t  VendorID[8]; +			uint8_t  ProductID[16]; +			uint8_t  RevisionID[4]; +		} ATTR_PACKED SCSI_Inquiry_Response_t; + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/PrinterClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/PrinterClassCommon.h new file mode 100644 index 0000000000..2db830e048 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/PrinterClassCommon.h @@ -0,0 +1,119 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Common definitions and declarations for the library USB Printer Class driver. + * + *  Common definitions and declarations for the library USB Printer Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassPrinter + *  \defgroup Group_USBClassPrinterCommon  Common Class Definitions + * + *  \section Sec_USBClassPrinterCommon_ModDescription Module Description + *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB + *  Printer Class. + * + *  @{ + */ + +#ifndef _PRINTER_CLASS_COMMON_H_ +#define _PRINTER_CLASS_COMMON_H_ + +	/* Includes: */ +		#include "../../Core/StdDescriptors.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_PRINTER_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Macros: */ +		/** \name Virtual Printer Status Line Masks */ +		//@{ +		/** Port status mask for a printer device, indicating that an error has *not* occurred. */ +		#define PRNT_PORTSTATUS_NOTERROR    (1 << 3) + +		/** Port status mask for a printer device, indicating that the device is currently selected. */ +		#define PRNT_PORTSTATUS_SELECT      (1 << 4) + +		/** Port status mask for a printer device, indicating that the device is currently out of paper. */ +		#define PRNT_PORTSTATUS_PAPEREMPTY  (1 << 5) +		//@} + +	/* Enums: */ +		/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the Printer +		 *  device class. +		 */ +		enum PRNT_Descriptor_ClassSubclassProtocol_t +		{ +			PRNT_CSCP_PrinterClass          = 0x07, /**< Descriptor Class value indicating that the device or interface +			                                         *   belongs to the Printer class. +			                                         */ +			PRNT_CSCP_PrinterSubclass       = 0x01, /**< Descriptor Subclass value indicating that the device or interface +			                                         *   belongs to the Printer subclass. +			                                         */ +			PRNT_CSCP_BidirectionalProtocol = 0x02, /**< Descriptor Protocol value indicating that the device or interface +			                                         *   belongs to the Bidirectional protocol of the Printer class. +			                                         */ +		}; + +		/** Enum for the Printer class specific control requests that can be issued by the USB bus host. */ +		enum PRNT_ClassRequests_t +		{ +			PRNT_REQ_GetDeviceID            = 0x00, /**< Printer class-specific request to retrieve the Unicode ID +			                                         *   string of the device, containing the device's name, manufacturer +			                                         *   and supported printer languages. +			                                         */ +			PRNT_REQ_GetPortStatus          = 0x01, /**< Printer class-specific request to get the current status of the +			                                         *   virtual printer port, for device selection and ready states. +			                                         */ +			PRNT_REQ_SoftReset              = 0x02, /**< Printer class-specific request to reset the device, ready for new +			                                         *   printer commands. +			                                         */ +		}; + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/RNDISClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/RNDISClassCommon.h new file mode 100644 index 0000000000..ade1af0673 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/RNDISClassCommon.h @@ -0,0 +1,411 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Common definitions and declarations for the library USB RNDIS Class driver. + * + *  Common definitions and declarations for the library USB RNDIS Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassRNDIS + *  \defgroup Group_USBClassRNDISCommon  Common Class Definitions + * + *  \section Sec_USBClassRNDISCommon_ModDescription Module Description + *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB + *  RNDIS Class. + * + *  @{ + */ + +#ifndef _RNDIS_CLASS_COMMON_H_ +#define _RNDIS_CLASS_COMMON_H_ + +	/* Macros: */ +		#define __INCLUDE_FROM_CDC_DRIVER + +	/* Includes: */ +		#include "../../Core/StdDescriptors.h" +		#include "CDCClassCommon.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_RNDIS_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Macros: */ +		/** Additional error code for RNDIS functions when a device returns a logical command failure. */ +		#define RNDIS_ERROR_LOGICAL_CMD_FAILED        0x80 + +		/** Implemented RNDIS Version Major. */ +		#define REMOTE_NDIS_VERSION_MAJOR             0x01 + +		/** Implemented RNDIS Version Minor. */ +		#define REMOTE_NDIS_VERSION_MINOR             0x00 + +		/** \name RNDIS Message Values */ +		//@{ +		#define REMOTE_NDIS_PACKET_MSG                0x00000001UL +		#define REMOTE_NDIS_INITIALIZE_MSG            0x00000002UL +		#define REMOTE_NDIS_HALT_MSG                  0x00000003UL +		#define REMOTE_NDIS_QUERY_MSG                 0x00000004UL +		#define REMOTE_NDIS_SET_MSG                   0x00000005UL +		#define REMOTE_NDIS_RESET_MSG                 0x00000006UL +		#define REMOTE_NDIS_INDICATE_STATUS_MSG       0x00000007UL +		#define REMOTE_NDIS_KEEPALIVE_MSG             0x00000008UL +		//@} + +		/** \name RNDIS Response Values */ +		//@{ +		#define REMOTE_NDIS_INITIALIZE_CMPLT          0x80000002UL +		#define REMOTE_NDIS_QUERY_CMPLT               0x80000004UL +		#define REMOTE_NDIS_SET_CMPLT                 0x80000005UL +		#define REMOTE_NDIS_RESET_CMPLT               0x80000006UL +		#define REMOTE_NDIS_KEEPALIVE_CMPLT           0x80000008UL +		//@} + +		/** \name RNDIS Status Values */ +		//@{ +		#define REMOTE_NDIS_STATUS_SUCCESS            0x00000000UL +		#define REMOTE_NDIS_STATUS_FAILURE            0xC0000001UL +		#define REMOTE_NDIS_STATUS_INVALID_DATA       0xC0010015UL +		#define REMOTE_NDIS_STATUS_NOT_SUPPORTED      0xC00000BBUL +		#define REMOTE_NDIS_STATUS_MEDIA_CONNECT      0x4001000BUL +		#define REMOTE_NDIS_STATUS_MEDIA_DISCONNECT   0x4001000CUL +		//@} + +		/** \name RNDIS Media States */ +		//@{ +		#define REMOTE_NDIS_MEDIA_STATE_CONNECTED     0x00000000UL +		#define REMOTE_NDIS_MEDIA_STATE_DISCONNECTED  0x00000001UL +		//@} + +		/** \name RNDIS Media Types */ +		//@{ +		#define REMOTE_NDIS_MEDIUM_802_3              0x00000000UL +		//@} + +		/** \name RNDIS Connection Types */ +		//@{ +		#define REMOTE_NDIS_DF_CONNECTIONLESS	      0x00000001UL +		#define REMOTE_NDIS_DF_CONNECTION_ORIENTED    0x00000002UL +		//@} + +		/** \name RNDIS Packet Types */ +		//@{ +		#define REMOTE_NDIS_PACKET_DIRECTED           0x00000001UL +		#define REMOTE_NDIS_PACKET_MULTICAST          0x00000002UL +		#define REMOTE_NDIS_PACKET_ALL_MULTICAST      0x00000004UL +		#define REMOTE_NDIS_PACKET_BROADCAST          0x00000008UL +		#define REMOTE_NDIS_PACKET_SOURCE_ROUTING     0x00000010UL +		#define REMOTE_NDIS_PACKET_PROMISCUOUS        0x00000020UL +		#define REMOTE_NDIS_PACKET_SMT                0x00000040UL +		#define REMOTE_NDIS_PACKET_ALL_LOCAL          0x00000080UL +		#define REMOTE_NDIS_PACKET_GROUP              0x00001000UL +		#define REMOTE_NDIS_PACKET_ALL_FUNCTIONAL     0x00002000UL +		#define REMOTE_NDIS_PACKET_FUNCTIONAL         0x00004000UL +		#define REMOTE_NDIS_PACKET_MAC_FRAME          0x00008000UL +		//@} + +		/** \name RNDIS OID Values */ +		//@{ +		#define OID_GEN_SUPPORTED_LIST                0x00010101UL +		#define OID_GEN_HARDWARE_STATUS               0x00010102UL +		#define OID_GEN_MEDIA_SUPPORTED               0x00010103UL +		#define OID_GEN_MEDIA_IN_USE                  0x00010104UL +		#define OID_GEN_MAXIMUM_FRAME_SIZE            0x00010106UL +		#define OID_GEN_MAXIMUM_TOTAL_SIZE            0x00010111UL +		#define OID_GEN_LINK_SPEED                    0x00010107UL +		#define OID_GEN_TRANSMIT_BLOCK_SIZE           0x0001010AUL +		#define OID_GEN_RECEIVE_BLOCK_SIZE            0x0001010BUL +		#define OID_GEN_VENDOR_ID                     0x0001010CUL +		#define OID_GEN_VENDOR_DESCRIPTION            0x0001010DUL +		#define OID_GEN_CURRENT_PACKET_FILTER         0x0001010EUL +		#define OID_GEN_MAXIMUM_TOTAL_SIZE            0x00010111UL +		#define OID_GEN_MEDIA_CONNECT_STATUS          0x00010114UL +		#define OID_GEN_PHYSICAL_MEDIUM               0x00010202UL +		#define OID_GEN_XMIT_OK                       0x00020101UL +		#define OID_GEN_RCV_OK                        0x00020102UL +		#define OID_GEN_XMIT_ERROR                    0x00020103UL +		#define OID_GEN_RCV_ERROR                     0x00020104UL +		#define OID_GEN_RCV_NO_BUFFER                 0x00020105UL +		#define OID_802_3_PERMANENT_ADDRESS           0x01010101UL +		#define OID_802_3_CURRENT_ADDRESS             0x01010102UL +		#define OID_802_3_MULTICAST_LIST              0x01010103UL +		#define OID_802_3_MAXIMUM_LIST_SIZE           0x01010104UL +		#define OID_802_3_RCV_ERROR_ALIGNMENT         0x01020101UL +		#define OID_802_3_XMIT_ONE_COLLISION          0x01020102UL +		#define OID_802_3_XMIT_MORE_COLLISIONS        0x01020103UL +		//@} + +		/** Maximum size in bytes of an Ethernet frame according to the Ethernet standard. */ +		#define ETHERNET_FRAME_SIZE_MAX               1500 + +	/* Enums: */ +		/** Enum for the RNDIS class specific control requests that can be issued by the USB bus host. */ +		enum RNDIS_ClassRequests_t +		{ +			RNDIS_REQ_SendEncapsulatedCommand = 0x00, /**< RNDIS request to issue a host-to-device NDIS command. */ +			RNDIS_REQ_GetEncapsulatedResponse = 0x01, /**< RNDIS request to issue a device-to-host NDIS response. */ +		}; + +		/** Enum for the possible NDIS adapter states. */ +		enum RNDIS_States_t +		{ +			RNDIS_Uninitialized    = 0, /**< Adapter currently uninitialized. */ +			RNDIS_Initialized      = 1, /**< Adapter currently initialized but not ready for data transfers. */ +			RNDIS_Data_Initialized = 2, /**< Adapter currently initialized and ready for data transfers. */ +		}; + +		/** Enum for the RNDIS class specific notification requests that can be issued by a RNDIS device to a host. */ +		enum RNDIS_ClassNotifications_t +		{ +			RNDIS_NOTIF_ResponseAvailable = 0x01, /**< Notification request value for a RNDIS Response Available notification. */ +		}; + +		/** Enum for the NDIS hardware states. */ +		enum NDIS_Hardware_Status_t +		{ +			NDIS_HardwareStatus_Ready, /**< Hardware Ready to accept commands from the host. */ +			NDIS_HardwareStatus_Initializing, /**< Hardware busy initializing. */ +			NDIS_HardwareStatus_Reset, /**< Hardware reset. */ +			NDIS_HardwareStatus_Closing, /**< Hardware currently closing. */ +			NDIS_HardwareStatus_NotReady /**< Hardware not ready to accept commands from the host. */ +		}; + +	/* Type Defines: */ +		/** \brief MAC Address Structure. +		 * +		 *  Type define for a physical MAC address of a device on a network. +		 */ +		typedef struct +		{ +			uint8_t Octets[6]; /**< Individual bytes of a MAC address */ +		} ATTR_PACKED MAC_Address_t; + +		/** \brief RNDIS Common Message Header Structure. +		 * +		 *  Type define for a RNDIS message header, sent before RNDIS messages. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint32_t MessageType; /**< RNDIS message type, a \c REMOTE_NDIS_*_MSG constant */ +			uint32_t MessageLength; /**< Total length of the RNDIS message, in bytes */ +		} ATTR_PACKED RNDIS_Message_Header_t; + +		/** \brief RNDIS Message Structure. +		 * +		 *  Type define for a RNDIS packet message, used to encapsulate Ethernet packets sent to and from the adapter. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint32_t MessageType; +			uint32_t MessageLength; +			uint32_t DataOffset; +			uint32_t DataLength; +			uint32_t OOBDataOffset; +			uint32_t OOBDataLength; +			uint32_t NumOOBDataElements; +			uint32_t PerPacketInfoOffset; +			uint32_t PerPacketInfoLength; +			uint32_t VcHandle; +			uint32_t Reserved; +		} ATTR_PACKED RNDIS_Packet_Message_t; + +		/** \brief RNDIS Initialization Message Structure. +		 * +		 *  Type define for a RNDIS Initialize command message. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint32_t MessageType; +			uint32_t MessageLength; +			uint32_t RequestId; + +			uint32_t MajorVersion; +			uint32_t MinorVersion; +			uint32_t MaxTransferSize; +		} ATTR_PACKED RNDIS_Initialize_Message_t; + +		/** \brief RNDIS Initialize Complete Message Structure. +		 * +		 *  Type define for a RNDIS Initialize Complete response message. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint32_t MessageType; +			uint32_t MessageLength; +			uint32_t RequestId; +			uint32_t Status; + +			uint32_t MajorVersion; +			uint32_t MinorVersion; +			uint32_t DeviceFlags; +			uint32_t Medium; +			uint32_t MaxPacketsPerTransfer; +			uint32_t MaxTransferSize; +			uint32_t PacketAlignmentFactor; +			uint32_t AFListOffset; +			uint32_t AFListSize; +		} ATTR_PACKED RNDIS_Initialize_Complete_t; + +		/** \brief RNDIS Keep Alive Message Structure. +		 * +		 *  Type define for a RNDIS Keep Alive command message. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint32_t MessageType; +			uint32_t MessageLength; +			uint32_t RequestId; +		} ATTR_PACKED RNDIS_KeepAlive_Message_t; + +		/** \brief RNDIS Keep Alive Complete Message Structure. +		 * +		 *  Type define for a RNDIS Keep Alive Complete response message. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint32_t MessageType; +			uint32_t MessageLength; +			uint32_t RequestId; +			uint32_t Status; +		} ATTR_PACKED RNDIS_KeepAlive_Complete_t; + +		/** \brief RNDIS Reset Complete Message Structure. +		 * +		 *  Type define for a RNDIS Reset Complete response message. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint32_t MessageType; +			uint32_t MessageLength; +			uint32_t Status; + +			uint32_t AddressingReset; +		} ATTR_PACKED RNDIS_Reset_Complete_t; + +		/** \brief RNDIS OID Property Set Message Structure. +		 * +		 *  Type define for a RNDIS OID Property Set command message. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint32_t MessageType; +			uint32_t MessageLength; +			uint32_t RequestId; + +			uint32_t Oid; +			uint32_t InformationBufferLength; +			uint32_t InformationBufferOffset; +			uint32_t DeviceVcHandle; +		} ATTR_PACKED RNDIS_Set_Message_t; + +		/** \brief RNDIS OID Property Set Complete Message Structure. +		 * +		 *  Type define for a RNDIS OID Property Set Complete response message. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint32_t MessageType; +			uint32_t MessageLength; +			uint32_t RequestId; +			uint32_t Status; +		} ATTR_PACKED RNDIS_Set_Complete_t; + +		/** \brief RNDIS OID Property Query Message Structure. +		 * +		 *  Type define for a RNDIS OID Property Query command message. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint32_t MessageType; +			uint32_t MessageLength; +			uint32_t RequestId; + +			uint32_t Oid; +			uint32_t InformationBufferLength; +			uint32_t InformationBufferOffset; +			uint32_t DeviceVcHandle; +		} ATTR_PACKED RNDIS_Query_Message_t; + +		/** \brief RNDIS OID Property Query Complete Message Structure. +		 * +		 *  Type define for a RNDIS OID Property Query Complete response message. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint32_t MessageType; +			uint32_t MessageLength; +			uint32_t RequestId; +			uint32_t Status; + +			uint32_t InformationBufferLength; +			uint32_t InformationBufferOffset; +		} ATTR_PACKED RNDIS_Query_Complete_t; + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Common/StillImageClassCommon.h b/lib/lufa/LUFA/Drivers/USB/Class/Common/StillImageClassCommon.h new file mode 100644 index 0000000000..7608b18cc4 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Common/StillImageClassCommon.h @@ -0,0 +1,161 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Common definitions and declarations for the library USB Still Image Class driver. + * + *  Common definitions and declarations for the library USB Still Image Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassSI + *  \defgroup Group_USBClassSICommon  Common Class Definitions + * + *  \section Sec_USBClassSICommon_ModDescription Module Description + *  Constants, Types and Enum definitions that are common to both Device and Host modes for the USB + *  Still Image Class. + * + *  @{ + */ + +#ifndef _SI_CLASS_COMMON_H_ +#define _SI_CLASS_COMMON_H_ + +	/* Includes: */ +		#include "../../Core/StdDescriptors.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_SI_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Macros: */ +		/** Length in bytes of a given Unicode string's character length. +		 * +		 *  \param[in] Chars  Total number of Unicode characters in the string. +		 * +		 *  \return Number of bytes of the given unicode string. +		 */ +		#define UNICODE_STRING_LENGTH(Chars)  ((Chars) << 1) + +		/** Used in the DataLength field of a PIMA container, to give the total container size in bytes for +		 *  a command container. +		 * +		 *  \param[in] Params  Number of parameters which are to be sent in the \c Param field of the container. +		 */ +		#define PIMA_COMMAND_SIZE(Params)     ((sizeof(PIMA_Container_t) - 12) + ((Params) * sizeof(uint32_t))) + +		/** Used in the DataLength field of a PIMA container, to give the total container size in bytes for +		 *  a data container. +		 * +		 *  \param[in] DataLen  Length in bytes of the data in the container. +		 */ +		#define PIMA_DATA_SIZE(DataLen)       ((sizeof(PIMA_Container_t) - 12) + (DataLen)) + +	/* Enums: */ +		/** Enum for the possible PIMA contains types. */ +		enum PIMA_Container_Types_t +		{ +			PIMA_CONTAINER_Undefined     = 0, /**< Undefined container type. */ +			PIMA_CONTAINER_CommandBlock  = 1, /**< Command Block container type. */ +			PIMA_CONTAINER_DataBlock     = 2, /**< Data Block container type. */ +			PIMA_CONTAINER_ResponseBlock = 3, /**< Response container type. */ +			PIMA_CONTAINER_EventBlock    = 4, /**< Event Block container type. */ +		}; + +	/* Enums: */ +		/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors relating to the +		 *  Still Image device class. +		 */ +		enum SI_Descriptor_ClassSubclassProtocol_t +		{ +			SI_CSCP_StillImageClass             = 0x06, /**< Descriptor Class value indicating that the device or interface +			                                             *   belongs to the Still Image class. +			                                             */ +			SI_CSCP_StillImageSubclass          = 0x01, /**< Descriptor Subclass value indicating that the device or interface +			                                             *   belongs to the Still Image subclass. +			                                             */ +			SI_CSCP_BulkOnlyProtocol            = 0x01, /**< Descriptor Protocol value indicating that the device or interface +			                                             *   belongs to the Bulk Only Transport protocol of the Still Image class. +			                                             */ +		}; + +		/** Enums for the possible status codes of a returned Response Block from an attached PIMA compliant Still Image device. */ +		enum PIMA_ResponseCodes_t +		{ +			PIMA_RESPONSE_OK                    = 1, /**< Response code indicating no error in the issued command. */ +			PIMA_RESPONSE_GeneralError          = 2, /**< Response code indicating a general error while processing the +			                                          *  issued command. +			                                          */ +			PIMA_RESPONSE_SessionNotOpen        = 3, /**< Response code indicating that the sent command requires an open +			                                          *   session before being issued. +			                                          */ +			PIMA_RESPONSE_InvalidTransaction    = 4, /**< Response code indicating an invalid transaction occurred. */ +			PIMA_RESPONSE_OperationNotSupported = 5, /**< Response code indicating that the issued command is not supported +			                                          *   by the attached device. +			                                          */ +			PIMA_RESPONSE_ParameterNotSupported = 6, /**< Response code indicating that one or more of the issued command's +			                                          *   parameters are not supported by the device. +			                                          */ +		}; + +	/* Type Defines: */ +		/** \brief PIMA Still Image Device Command/Response Container. +		 * +		 *  Type define for a PIMA container, use to send commands and receive responses to and from an +		 *  attached Still Image device. +		 * +		 *  \note Regardless of CPU architecture, these values should be stored as little endian. +		 */ +		typedef struct +		{ +			uint32_t DataLength; /**< Length of the container and data, in bytes. */ +			uint16_t Type; /**< Container type, a value from the \ref PIMA_Container_Types_t enum. */ +			uint16_t Code; /**< Command, event or response code of the container. */ +			uint32_t TransactionID; /**< Unique container ID to link blocks together. */ +			uint32_t Params[3]; /**< Block parameters to be issued along with the block code (command blocks only). */ +		} ATTR_PACKED PIMA_Container_t; + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.c new file mode 100644 index 0000000000..08cbeb7061 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.c @@ -0,0 +1,197 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_DEVICE) + +#define  __INCLUDE_FROM_AUDIO_DRIVER +#define  __INCLUDE_FROM_AUDIO_DEVICE_C +#include "AudioClassDevice.h" + +void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +{ +	if (!(Endpoint_IsSETUPReceived())) +	  return; + +	if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_INTERFACE) +	{ +		uint8_t InterfaceIndex = (USB_ControlRequest.wIndex & 0xFF); + +		if ((InterfaceIndex != AudioInterfaceInfo->Config.ControlInterfaceNumber) && +		    (InterfaceIndex != AudioInterfaceInfo->Config.StreamingInterfaceNumber)) +		{ +			return; +		} +	} +	else if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_ENDPOINT) +	{ +		uint8_t EndpointAddress = (USB_ControlRequest.wIndex & 0xFF); + +		if ((EndpointAddress != AudioInterfaceInfo->Config.DataINEndpoint.Address) && +		    (EndpointAddress != AudioInterfaceInfo->Config.DataOUTEndpoint.Address)) +		{ +			return; +		} +	} + +	switch (USB_ControlRequest.bRequest) +	{ +		case REQ_SetInterface: +			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE)) +			{ +				Endpoint_ClearSETUP(); +				Endpoint_ClearStatusStage(); + +				AudioInterfaceInfo->State.InterfaceEnabled = ((USB_ControlRequest.wValue & 0xFF) != 0); +				EVENT_Audio_Device_StreamStartStop(AudioInterfaceInfo); +			} + +			break; +		case AUDIO_REQ_GetStatus: +			if ((USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) || +			    (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT))) +			{ +				Endpoint_ClearSETUP(); +				Endpoint_ClearStatusStage(); +			} + +			break; +		case AUDIO_REQ_SetCurrent: +		case AUDIO_REQ_SetMinimum: +		case AUDIO_REQ_SetMaximum: +		case AUDIO_REQ_SetResolution: +			if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_ENDPOINT) +			{ +				uint8_t EndpointProperty = USB_ControlRequest.bRequest; +				uint8_t EndpointAddress  = (uint8_t)USB_ControlRequest.wIndex; +				uint8_t EndpointControl  = (USB_ControlRequest.wValue >> 8); + +				if (CALLBACK_Audio_Device_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress, +				                                                 EndpointControl, NULL, NULL)) +				{ +					uint16_t ValueLength = USB_ControlRequest.wLength; +					uint8_t  Value[ValueLength]; + +					Endpoint_ClearSETUP(); +					Endpoint_Read_Control_Stream_LE(Value, ValueLength); +					Endpoint_ClearIN(); + +					CALLBACK_Audio_Device_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress, +					                                             EndpointControl, &ValueLength, Value); +				} +			} +			else if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_INTERFACE) +			{ +				uint8_t  Property  = USB_ControlRequest.bRequest; +				uint8_t  Entity    = (USB_ControlRequest.wIndex >> 8); +				uint16_t Parameter = USB_ControlRequest.wValue; + +				if (CALLBACK_Audio_Device_GetSetInterfaceProperty(AudioInterfaceInfo, Property, Entity, +				                                                  Parameter, NULL, NULL)) +				{ +					uint16_t ValueLength = USB_ControlRequest.wLength; +					uint8_t  Value[ValueLength]; + +					Endpoint_ClearSETUP(); +					Endpoint_Read_Control_Stream_LE(Value, ValueLength); +					Endpoint_ClearIN(); + +					CALLBACK_Audio_Device_GetSetInterfaceProperty(AudioInterfaceInfo, Property, Entity, +				                                                  Parameter, &ValueLength, Value); +				} +			} + +			break; +		case AUDIO_REQ_GetCurrent: +		case AUDIO_REQ_GetMinimum: +		case AUDIO_REQ_GetMaximum: +		case AUDIO_REQ_GetResolution: +			if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_ENDPOINT) +			{ +				uint8_t  EndpointProperty = USB_ControlRequest.bRequest; +				uint8_t  EndpointAddress  = (uint8_t)USB_ControlRequest.wIndex; +				uint8_t  EndpointControl  = (USB_ControlRequest.wValue >> 8); +				uint16_t ValueLength      = USB_ControlRequest.wLength; +				uint8_t  Value[ValueLength]; + +				if (CALLBACK_Audio_Device_GetSetEndpointProperty(AudioInterfaceInfo, EndpointProperty, EndpointAddress, +				                                                 EndpointControl, &ValueLength, Value)) +				{ +					Endpoint_ClearSETUP(); +					Endpoint_Write_Control_Stream_LE(Value, ValueLength); +					Endpoint_ClearOUT(); +				} +			} +			else if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) == REQREC_INTERFACE) +			{ +				uint8_t  Property    = USB_ControlRequest.bRequest; +				uint8_t  Entity      = (USB_ControlRequest.wIndex >> 8); +				uint16_t Parameter   = USB_ControlRequest.wValue; +				uint16_t ValueLength = USB_ControlRequest.wLength; +				uint8_t  Value[ValueLength]; + +				if (CALLBACK_Audio_Device_GetSetInterfaceProperty(AudioInterfaceInfo, Property, Entity, +				                                                  Parameter, &ValueLength, Value)) +				{ +					Endpoint_ClearSETUP(); +					Endpoint_Write_Control_Stream_LE(Value, ValueLength); +					Endpoint_ClearOUT(); +				} +			} + +			break; +	} +} + +bool Audio_Device_ConfigureEndpoints(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +{ +	memset(&AudioInterfaceInfo->State, 0x00, sizeof(AudioInterfaceInfo->State)); + +	AudioInterfaceInfo->Config.DataINEndpoint.Type  = EP_TYPE_ISOCHRONOUS; +	AudioInterfaceInfo->Config.DataOUTEndpoint.Type = EP_TYPE_ISOCHRONOUS; + +	if (!(Endpoint_ConfigureEndpointTable(&AudioInterfaceInfo->Config.DataINEndpoint, 1))) +	  return false; + +	if (!(Endpoint_ConfigureEndpointTable(&AudioInterfaceInfo->Config.DataOUTEndpoint, 1))) +	  return false; + +	return true; +} + +void Audio_Device_Event_Stub(void) +{ + +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h new file mode 100644 index 0000000000..ca63511b20 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/AudioClassDevice.h @@ -0,0 +1,396 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Device mode driver for the library USB Audio 1.0 Class driver. + * + *  Device mode driver for the library USB Audio 1.0 Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassAudio + *  \defgroup Group_USBClassAudioDevice Audio 1.0 Class Device Mode Driver + * + *  \section Sec_USBClassAudioDevice_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Device/AudioClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassAudioDevice_ModDescription Module Description + *  Device Mode USB Class driver framework interface, for the Audio 1.0 USB Class driver. + * + *  @{ + */ + +#ifndef _AUDIO_CLASS_DEVICE_H_ +#define _AUDIO_CLASS_DEVICE_H_ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/AudioClassCommon.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_AUDIO_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Type Defines: */ +			/** \brief Audio Class Device Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made for each Audio interface +			 *  within the user application, and passed to each of the Audio class driver functions as the +			 *  \c AudioInterfaceInfo parameter. This stores each Audio interface's configuration and state information. +			 */ +			typedef struct +			{ +				struct +				{ +					uint8_t  ControlInterfaceNumber; /**< Index of the Audio Control interface within the device this +					                                  *   structure controls. +					                                  */ +					uint8_t  StreamingInterfaceNumber; /**< Index of the Audio Streaming interface within the device this +														*   structure controls. +														*/ + +					USB_Endpoint_Table_t DataINEndpoint; /**< Data IN endpoint configuration table. */ +					USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */ +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ +				struct +				{ +					bool InterfaceEnabled; /**< Set and cleared by the class driver to indicate if the host has enabled the streaming endpoints +					                        *   of the Audio Streaming interface. +					                        */ +				} State; /**< State data for the USB class interface within the device. All elements in this section +				          *   are reset to their defaults when the interface is enumerated. +				          */ +			} USB_ClassInfo_Audio_Device_t; + +		/* Function Prototypes: */ +			/** Configures the endpoints of a given Audio interface, ready for use. This should be linked to the library +			 *  \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration containing the +			 *  given Audio interface is selected. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 * +			 *  \return Boolean \c true if the endpoints were successfully configured, \c false otherwise. +			 */ +			bool Audio_Device_ConfigureEndpoints(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Processes incoming control requests from the host, that are directed to the given Audio class interface. This should be +			 *  linked to the library \ref EVENT_USB_Device_ControlRequest() event. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 */ +			void Audio_Device_ProcessControlRequest(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Audio class driver callback for the setting and retrieval of streaming endpoint properties. This callback must be implemented +			 *  in the user application to handle property manipulations on streaming audio endpoints. +			 * +			 *  When the DataLength parameter is NULL, this callback should only indicate whether the specified operation is valid for +			 *  the given endpoint index, and should return as fast as possible. When non-NULL, this value may be altered for GET operations +			 *  to indicate the size of the retrieved data. +			 * +			 *  \note The length of the retrieved data stored into the Data buffer on GET operations should not exceed the initial value +			 *        of the \c DataLength parameter. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 *  \param[in]     EndpointProperty    Property of the endpoint to get or set, a value from \ref Audio_ClassRequests_t. +			 *  \param[in]     EndpointAddress     Address of the streaming endpoint whose property is being referenced. +			 *  \param[in]     EndpointControl     Parameter of the endpoint to get or set, a value from \ref Audio_EndpointControls_t. +			 *  \param[in,out] DataLength          For SET operations, the length of the parameter data to set. For GET operations, the maximum +			 *                                     length of the retrieved data. When NULL, the function should return whether the given property +			 *                                     and parameter is valid for the requested endpoint without reading or modifying the Data buffer. +			 *  \param[in,out] Data                Pointer to a location where the parameter data is stored for SET operations, or where +			 *                                     the retrieved data is to be stored for GET operations. +			 * +			 *  \return Boolean \c true if the property GET/SET was successful, \c false otherwise +			 */ +			bool CALLBACK_Audio_Device_GetSetEndpointProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, +			                                                  const uint8_t EndpointProperty, +			                                                  const uint8_t EndpointAddress, +			                                                  const uint8_t EndpointControl, +			                                                  uint16_t* const DataLength, +			                                                  uint8_t* Data) ATTR_NON_NULL_PTR_ARG(1); + +			/** Audio class driver callback for the setting and retrieval of streaming interface properties. This callback must be implemented +			 *  in the user application to handle property manipulations on streaming audio interfaces. +			 * +			 *  When the DataLength parameter is NULL, this callback should only indicate whether the specified operation is valid for +			 *  the given entity and should return as fast as possible. When non-NULL, this value may be altered for GET operations +			 *  to indicate the size of the retrieved data. +			 * +			 *  \note The length of the retrieved data stored into the Data buffer on GET operations should not exceed the initial value +			 *        of the \c DataLength parameter. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 *  \param[in]     Property            Property of the interface to get or set, a value from \ref Audio_ClassRequests_t. +			 *  \param[in]     EntityAddress       Address of the audio entity whose property is being referenced. +			 *  \param[in]     Parameter           Parameter of the entity to get or set, specific to each type of entity (see USB Audio specification). +			 *  \param[in,out] DataLength          For SET operations, the length of the parameter data to set. For GET operations, the maximum +			 *                                     length of the retrieved data. When NULL, the function should return whether the given property +			 *                                     and parameter is valid for the requested endpoint without reading or modifying the Data buffer. +			 *  \param[in,out] Data                Pointer to a location where the parameter data is stored for SET operations, or where +			 *                                     the retrieved data is to be stored for GET operations. +			 * +			 *  \return Boolean \c true if the property GET/SET was successful, \c false otherwise +			 */ +			bool CALLBACK_Audio_Device_GetSetInterfaceProperty(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, +			                                                   const uint8_t Property, +			                                                   const uint8_t EntityAddress, +			                                                   const uint16_t Parameter, +			                                                   uint16_t* const DataLength, +			                                                   uint8_t* Data) ATTR_NON_NULL_PTR_ARG(1); + +			/** Audio class driver event for an Audio Stream start/stop change. This event fires each time the device receives a stream enable or +			 *  disable control request from the host, to start and stop the audio stream. The current state of the stream can be determined by the +			 *  State.InterfaceEnabled value inside the Audio interface structure passed as a parameter. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 */ +			void EVENT_Audio_Device_StreamStartStop(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo); + +		/* Inline Functions: */ +			/** General management task for a given Audio class interface, required for the correct operation of the interface. This should +			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 */ +			static inline void Audio_Device_USBTask(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +			                                        ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline void Audio_Device_USBTask(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +			{ +				(void)AudioInterfaceInfo; +			} + +			/** Determines if the given audio interface is ready for a sample to be read from it, and selects the streaming +			 *  OUT endpoint ready for reading. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 * +			 *  \return Boolean \c true if the given Audio interface has a sample to be read, \c false otherwise. +			 */ +			static inline bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +			                                                 ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline bool Audio_Device_IsSampleReceived(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +			{ +				if ((USB_DeviceState != DEVICE_STATE_Configured) || !(AudioInterfaceInfo->State.InterfaceEnabled)) +				  return false; + +				Endpoint_SelectEndpoint(AudioInterfaceInfo->Config.DataOUTEndpoint.Address); +				return Endpoint_IsOUTReceived(); +			} + +			/** Determines if the given audio interface is ready to accept the next sample to be written to it, and selects +			 *  the streaming IN endpoint ready for writing. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 * +			 *  \return Boolean \c true if the given Audio interface is ready to accept the next sample, \c false otherwise. +			 */ +			static inline bool Audio_Device_IsReadyForNextSample(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +			                                                     ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline bool Audio_Device_IsReadyForNextSample(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +			{ +				if ((USB_DeviceState != DEVICE_STATE_Configured) || !(AudioInterfaceInfo->State.InterfaceEnabled)) +				  return false; + +				Endpoint_SelectEndpoint(AudioInterfaceInfo->Config.DataINEndpoint.Address); +				return Endpoint_IsINReady(); +			} + +			/** Reads the next 8-bit audio sample from the current audio interface. +			 * +			 *  \pre This should be preceded immediately by a call to the \ref Audio_Device_IsSampleReceived() function to ensure +			 *       that the correct endpoint is selected and ready for data. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 * +			 *  \return  Signed 8-bit audio sample from the audio interface. +			 */ +			static inline int8_t Audio_Device_ReadSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +			                                              ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline int8_t Audio_Device_ReadSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +			{ +				int8_t Sample; + +				(void)AudioInterfaceInfo; + +				Sample = Endpoint_Read_8(); + +				if (!(Endpoint_BytesInEndpoint())) +				  Endpoint_ClearOUT(); + +				return Sample; +			} + +			/** Reads the next 16-bit audio sample from the current audio interface. +			 * +			 *  \pre This should be preceded immediately by a call to the \ref Audio_Device_IsSampleReceived() function to ensure +			 *       that the correct endpoint is selected and ready for data. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 * +			 *  \return  Signed 16-bit audio sample from the audio interface. +			 */ +			static inline int16_t Audio_Device_ReadSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +			                                                ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline int16_t Audio_Device_ReadSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +			{ +				int16_t Sample; + +				(void)AudioInterfaceInfo; + +				Sample = (int16_t)Endpoint_Read_16_LE(); + +				if (!(Endpoint_BytesInEndpoint())) +				  Endpoint_ClearOUT(); + +				return Sample; +			} + +			/** Reads the next 24-bit audio sample from the current audio interface. +			 * +			 *  \pre This should be preceded immediately by a call to the \ref Audio_Device_IsSampleReceived() function to ensure +			 *       that the correct endpoint is selected and ready for data. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 * +			 *  \return Signed 24-bit audio sample from the audio interface. +			 */ +			static inline int32_t Audio_Device_ReadSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +			                                                ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline int32_t Audio_Device_ReadSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +			{ +				int32_t Sample; + +				(void)AudioInterfaceInfo; + +				Sample = (((uint32_t)Endpoint_Read_8() << 16) | Endpoint_Read_16_LE()); + +				if (!(Endpoint_BytesInEndpoint())) +				  Endpoint_ClearOUT(); + +				return Sample; +			} + +			/** Writes the next 8-bit audio sample to the current audio interface. +			 * +			 *  \pre This should be preceded immediately by a call to the \ref Audio_Device_IsReadyForNextSample() function to +			 *       ensure that the correct endpoint is selected and ready for data. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 *  \param[in]     Sample              Signed 8-bit audio sample. +			 */ +			static inline void Audio_Device_WriteSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, +			                                             const int8_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline void Audio_Device_WriteSample8(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, +			                                             const int8_t Sample) +			{ +				Endpoint_Write_8(Sample); + +				if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpoint.Size) +				  Endpoint_ClearIN(); +			} + +			/** Writes the next 16-bit audio sample to the current audio interface. +			 * +			 *  \pre This should be preceded immediately by a call to the \ref Audio_Device_IsReadyForNextSample() function to +			 *       ensure that the correct endpoint is selected and ready for data. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 *  \param[in]     Sample              Signed 16-bit audio sample. +			 */ +			static inline void Audio_Device_WriteSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, +			                                              const int16_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline void Audio_Device_WriteSample16(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, +			                                              const int16_t Sample) +			{ +				Endpoint_Write_16_LE(Sample); + +				if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpoint.Size) +				  Endpoint_ClearIN(); +			} + +			/** Writes the next 24-bit audio sample to the current audio interface. +			 * +			 *  \pre This should be preceded immediately by a call to the \ref Audio_Device_IsReadyForNextSample() function to +			 *       ensure that the correct endpoint is selected and ready for data. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 *  \param[in]     Sample              Signed 24-bit audio sample. +			 */ +			static inline void Audio_Device_WriteSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, +			                                              const int32_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline void Audio_Device_WriteSample24(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo, +			                                              const int32_t Sample) +			{ +				Endpoint_Write_16_LE(Sample); +				Endpoint_Write_8(Sample >> 16); + +				if (Endpoint_BytesInEndpoint() == AudioInterfaceInfo->Config.DataINEndpoint.Size) +				  Endpoint_ClearIN(); +			} + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_AUDIO_DEVICE_C) +				void Audio_Device_Event_Stub(void) ATTR_CONST; + +				void EVENT_Audio_Device_StreamStartStop(USB_ClassInfo_Audio_Device_t* const AudioInterfaceInfo) +				                                        ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(Audio_Device_Event_Stub); +			#endif + +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c new file mode 100644 index 0000000000..867548c00b --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.c @@ -0,0 +1,362 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_DEVICE) + +#define  __INCLUDE_FROM_CDC_DRIVER +#define  __INCLUDE_FROM_CDC_DEVICE_C +#include "CDCClassDevice.h" + +void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ +	if (!(Endpoint_IsSETUPReceived())) +	  return; + +	if (USB_ControlRequest.wIndex != CDCInterfaceInfo->Config.ControlInterfaceNumber) +	  return; + +	switch (USB_ControlRequest.bRequest) +	{ +		case CDC_REQ_GetLineEncoding: +			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				Endpoint_ClearSETUP(); + +				while (!(Endpoint_IsINReady())); + +				Endpoint_Write_32_LE(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS); +				Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.CharFormat); +				Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.ParityType); +				Endpoint_Write_8(CDCInterfaceInfo->State.LineEncoding.DataBits); + +				Endpoint_ClearIN(); +				Endpoint_ClearStatusStage(); +			} + +			break; +		case CDC_REQ_SetLineEncoding: +			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				Endpoint_ClearSETUP(); + +				while (!(Endpoint_IsOUTReceived())) +				{ +					if (USB_DeviceState == DEVICE_STATE_Unattached) +					  return; +				} + +				CDCInterfaceInfo->State.LineEncoding.BaudRateBPS = Endpoint_Read_32_LE(); +				CDCInterfaceInfo->State.LineEncoding.CharFormat  = Endpoint_Read_8(); +				CDCInterfaceInfo->State.LineEncoding.ParityType  = Endpoint_Read_8(); +				CDCInterfaceInfo->State.LineEncoding.DataBits    = Endpoint_Read_8(); + +				Endpoint_ClearOUT(); +				Endpoint_ClearStatusStage(); + +				EVENT_CDC_Device_LineEncodingChanged(CDCInterfaceInfo); +			} + +			break; +		case CDC_REQ_SetControlLineState: +			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				Endpoint_ClearSETUP(); +				Endpoint_ClearStatusStage(); + +				CDCInterfaceInfo->State.ControlLineStates.HostToDevice = USB_ControlRequest.wValue; + +				EVENT_CDC_Device_ControLineStateChanged(CDCInterfaceInfo); +			} + +			break; +		case CDC_REQ_SendBreak: +			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				Endpoint_ClearSETUP(); +				Endpoint_ClearStatusStage(); + +				EVENT_CDC_Device_BreakSent(CDCInterfaceInfo, (uint8_t)USB_ControlRequest.wValue); +			} + +			break; +	} +} + +bool CDC_Device_ConfigureEndpoints(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ +	memset(&CDCInterfaceInfo->State, 0x00, sizeof(CDCInterfaceInfo->State)); + +	CDCInterfaceInfo->Config.DataINEndpoint.Type       = EP_TYPE_BULK; +	CDCInterfaceInfo->Config.DataOUTEndpoint.Type      = EP_TYPE_BULK; +	CDCInterfaceInfo->Config.NotificationEndpoint.Type = EP_TYPE_INTERRUPT; + +	if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataINEndpoint, 1))) +	  return false; + +	if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.DataOUTEndpoint, 1))) +	  return false; + +	if (!(Endpoint_ConfigureEndpointTable(&CDCInterfaceInfo->Config.NotificationEndpoint, 1))) +	  return false; + +	return true; +} + +void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ +	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) +	  return; + +	#if !defined(NO_CLASS_DRIVER_AUTOFLUSH) +	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); + +	if (Endpoint_IsINReady()) +	  CDC_Device_Flush(CDCInterfaceInfo); +	#endif +} + +uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +                              const char* const String) +{ +	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) +	  return ENDPOINT_RWSTREAM_DeviceDisconnected; + +	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); +	return Endpoint_Write_Stream_LE(String, strlen(String), NULL); +} + +uint8_t CDC_Device_SendString_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +                              const char* const String) +{ +	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) +	  return ENDPOINT_RWSTREAM_DeviceDisconnected; + +	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); +	return Endpoint_Write_PStream_LE(String, strlen_P(String), NULL); +} + +uint8_t CDC_Device_SendData(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +                            const void* const Buffer, +                            const uint16_t Length) +{ +	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) +	  return ENDPOINT_RWSTREAM_DeviceDisconnected; + +	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); +	return Endpoint_Write_Stream_LE(Buffer, Length, NULL); +} + +uint8_t CDC_Device_SendData_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +                            const void* const Buffer, +                            const uint16_t Length) +{ +	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) +	  return ENDPOINT_RWSTREAM_DeviceDisconnected; + +	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); +	return Endpoint_Write_PStream_LE(Buffer, Length, NULL); +} + +uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +                            const uint8_t Data) +{ +	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) +	  return ENDPOINT_RWSTREAM_DeviceDisconnected; + +	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); + +	if (!(Endpoint_IsReadWriteAllowed())) +	{ +		Endpoint_ClearIN(); + +		uint8_t ErrorCode; + +		if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) +		  return ErrorCode; +	} + +	Endpoint_Write_8(Data); +	return ENDPOINT_READYWAIT_NoError; +} + +uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ +	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) +	  return ENDPOINT_RWSTREAM_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataINEndpoint.Address); + +	if (!(Endpoint_BytesInEndpoint())) +	  return ENDPOINT_READYWAIT_NoError; + +	bool BankFull = !(Endpoint_IsReadWriteAllowed()); + +	Endpoint_ClearIN(); + +	if (BankFull) +	{ +		if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) +		  return ErrorCode; + +		Endpoint_ClearIN(); +	} + +	return ENDPOINT_READYWAIT_NoError; +} + +uint16_t CDC_Device_BytesReceived(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ +	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) +	  return 0; + +	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpoint.Address); + +	if (Endpoint_IsOUTReceived()) +	{ +		if (!(Endpoint_BytesInEndpoint())) +		{ +			Endpoint_ClearOUT(); +			return 0; +		} +		else +		{ +			return Endpoint_BytesInEndpoint(); +		} +	} +	else +	{ +		return 0; +	} +} + +int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ +	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) +	  return -1; + +	int16_t ReceivedByte = -1; + +	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.DataOUTEndpoint.Address); + +	if (Endpoint_IsOUTReceived()) +	{ +		if (Endpoint_BytesInEndpoint()) +		  ReceivedByte = Endpoint_Read_8(); + +		if (!(Endpoint_BytesInEndpoint())) +		  Endpoint_ClearOUT(); +	} + +	return ReceivedByte; +} + +void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +{ +	if ((USB_DeviceState != DEVICE_STATE_Configured) || !(CDCInterfaceInfo->State.LineEncoding.BaudRateBPS)) +	  return; + +	Endpoint_SelectEndpoint(CDCInterfaceInfo->Config.NotificationEndpoint.Address); + +	USB_Request_Header_t Notification = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE), +			.bRequest      = CDC_NOTIF_SerialState, +			.wValue        = CPU_TO_LE16(0), +			.wIndex        = CPU_TO_LE16(0), +			.wLength       = CPU_TO_LE16(sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost)), +		}; + +	Endpoint_Write_Stream_LE(&Notification, sizeof(USB_Request_Header_t), NULL); +	Endpoint_Write_Stream_LE(&CDCInterfaceInfo->State.ControlLineStates.DeviceToHost, +	                         sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost), +	                         NULL); +	Endpoint_ClearIN(); +} + +#if defined(FDEV_SETUP_STREAM) +void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +                             FILE* const Stream) +{ +	*Stream = (FILE)FDEV_SETUP_STREAM(CDC_Device_putchar, CDC_Device_getchar, _FDEV_SETUP_RW); +	fdev_set_udata(Stream, CDCInterfaceInfo); +} + +void CDC_Device_CreateBlockingStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +                                     FILE* const Stream) +{ +	*Stream = (FILE)FDEV_SETUP_STREAM(CDC_Device_putchar, CDC_Device_getchar_Blocking, _FDEV_SETUP_RW); +	fdev_set_udata(Stream, CDCInterfaceInfo); +} + +static int CDC_Device_putchar(char c, +                              FILE* Stream) +{ +	return CDC_Device_SendByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream), c) ? _FDEV_ERR : 0; +} + +static int CDC_Device_getchar(FILE* Stream) +{ +	int16_t ReceivedByte = CDC_Device_ReceiveByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream)); + +	if (ReceivedByte < 0) +	  return _FDEV_EOF; + +	return ReceivedByte; +} + +static int CDC_Device_getchar_Blocking(FILE* Stream) +{ +	int16_t ReceivedByte; + +	while ((ReceivedByte = CDC_Device_ReceiveByte((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream))) < 0) +	{ +		if (USB_DeviceState == DEVICE_STATE_Unattached) +		  return _FDEV_EOF; + +		CDC_Device_USBTask((USB_ClassInfo_CDC_Device_t*)fdev_get_udata(Stream)); +		USB_USBTask(); +	} + +	return ReceivedByte; +} +#endif + +void CDC_Device_Event_Stub(void) +{ + +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h new file mode 100644 index 0000000000..9d5c4e5a0a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/CDCClassDevice.h @@ -0,0 +1,386 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Device mode driver for the library USB CDC Class driver. + * + *  Device mode driver for the library USB CDC Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassCDC + *  \defgroup Group_USBClassCDCDevice CDC Class Device Mode Driver + * + *  \section Sec_USBClassCDCDevice_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Device/CDCClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassCDCDevice_ModDescription Module Description + *  Device Mode USB Class driver framework interface, for the CDC USB Class driver. + * + *  \note There are several major drawbacks to the CDC-ACM standard USB class, however + *        it is very standardized and thus usually available as a built-in driver on + *        most platforms, and so is a better choice than a proprietary serial class. + * + *        One major issue with CDC-ACM is that it requires two Interface descriptors, + *        which will upset most hosts when part of a multi-function "Composite" USB + *        device. This is because each interface will be loaded into a separate driver + *        instance, causing the two interfaces be become unlinked. To prevent this, you + *        should use the "Interface Association Descriptor" addendum to the USB 2.0 standard + *        which is available on most OSes when creating Composite devices. + * + *        Another major oversight is that there is no mechanism for the host to notify the + *        device that there is a data sink on the host side ready to accept data. This + *        means that the device may try to send data while the host isn't listening, causing + *        lengthy blocking timeouts in the transmission routines. It is thus highly recommended + *        that the virtual serial line DTR (Data Terminal Ready) signal be used where possible + *        to determine if a host application is ready for data. + * + *  @{ + */ + +#ifndef _CDC_CLASS_DEVICE_H_ +#define _CDC_CLASS_DEVICE_H_ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/CDCClassCommon.h" + +		#include <stdio.h> + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_CDC_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Type Defines: */ +			/** \brief CDC Class Device Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made for each CDC interface +			 *  within the user application, and passed to each of the CDC class driver functions as the +			 *  CDCInterfaceInfo parameter. This stores each CDC interface's configuration and state information. +			 */ +			typedef struct +			{ +				struct +				{ +					uint8_t ControlInterfaceNumber; /**< Interface number of the CDC control interface within the device. */ + +					USB_Endpoint_Table_t DataINEndpoint; /**< Data IN endpoint configuration table. */ +					USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */ +					USB_Endpoint_Table_t NotificationEndpoint; /**< Notification IN Endpoint configuration table. */ +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ +				struct +				{ +					struct +					{ +						uint16_t HostToDevice; /**< Control line states from the host to device, as a set of \c CDC_CONTROL_LINE_OUT_* +											    *   masks. This value is updated each time \ref CDC_Device_USBTask() is called. +											    */ +						uint16_t DeviceToHost; /**< Control line states from the device to host, as a set of \c CDC_CONTROL_LINE_IN_* +											    *   masks - to notify the host of changes to these values, call the +											    *   \ref CDC_Device_SendControlLineStateChange() function. +											    */ +					} ControlLineStates; /**< Current states of the virtual serial port's control lines between the device and host. */ + +					CDC_LineEncoding_t LineEncoding; /**< Line encoding used in the virtual serial port, for the device's information. +					                                  *   This is generally only used if the virtual serial port data is to be +					                                  *   reconstructed on a physical UART. +					                                  */ +				} State; /**< State data for the USB class interface within the device. All elements in this section +				          *   are reset to their defaults when the interface is enumerated. +				          */ +			} USB_ClassInfo_CDC_Device_t; + +		/* Function Prototypes: */ +			/** Configures the endpoints of a given CDC interface, ready for use. This should be linked to the library +			 *  \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration containing +			 *  the given CDC interface is selected. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 * +			 *  \return Boolean \c true if the endpoints were successfully configured, \c false otherwise. +			 */ +			bool CDC_Device_ConfigureEndpoints(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Processes incoming control requests from the host, that are directed to the given CDC class interface. This should be +			 *  linked to the library \ref EVENT_USB_Device_ControlRequest() event. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 */ +			void CDC_Device_ProcessControlRequest(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** General management task for a given CDC class interface, required for the correct operation of the interface. This should +			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 */ +			void CDC_Device_USBTask(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** CDC class driver event for a line encoding change on a CDC interface. This event fires each time the host requests a +			 *  line encoding change (containing the serial parity, baud and other configuration information) and may be hooked in the +			 *  user program by declaring a handler function with the same name and parameters listed here. The new line encoding +			 *  settings are available in the \c LineEncoding structure inside the CDC interface structure passed as a parameter. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 */ +			void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** CDC class driver event for a control line state change on a CDC interface. This event fires each time the host requests a +			 *  control line state change (containing the virtual serial control line states, such as DTR) and may be hooked in the +			 *  user program by declaring a handler function with the same name and parameters listed here. The new control line states +			 *  are available in the \c ControlLineStates.HostToDevice value inside the CDC interface structure passed as a parameter, set as +			 *  a mask of \c CDC_CONTROL_LINE_OUT_* masks. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 */ +			void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** CDC class driver event for a send break request sent to the device from the host. This is generally used to separate +			 *  data or to indicate a special condition to the receiving device. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 *  \param[in]     Duration          Duration of the break that has been sent by the host, in milliseconds. +			 */ +			void EVENT_CDC_Device_BreakSent(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +			                                const uint8_t Duration) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a given data buffer to the attached USB host, if connected. If a host is not connected when the function is +			 *  called, the string is discarded. Bytes will be queued for transmission to the host until either the endpoint bank +			 *  becomes full, or the \ref CDC_Device_Flush() function is called to flush the pending data to the host. This allows +			 *  for multiple bytes to be packed into a single endpoint packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 *  \param[in]     Buffer            Pointer to a buffer containing the data to send to the device. +			 *  \param[in]     Length            Length of the data to send to the host. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t CDC_Device_SendData(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +			                            const void* const Buffer, +			                            const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Sends a given data buffer from PROGMEM space to the attached USB host, if connected. If a host is not connected when the +			 *  function is called, the string is discarded. Bytes will be queued for transmission to the host until either the endpoint +			 *  bank becomes full, or the \ref CDC_Device_Flush() function is called to flush the pending data to the host. This allows +			 *  for multiple bytes to be packed into a single endpoint packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 *  \param[in]     Buffer            Pointer to a buffer containing the data to send to the device. +			 *  \param[in]     Length            Length of the data to send to the host. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t CDC_Device_SendData_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +			                            const void* const Buffer, +			                            const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Sends a given null terminated string to the attached USB host, if connected. If a host is not connected when +			 *  the function is called, the string is discarded. Bytes will be queued for transmission to the host until either +			 *  the endpoint bank becomes full, or the \ref CDC_Device_Flush() function is called to flush the pending data to +			 *  the host. This allows for multiple bytes to be packed into a single endpoint packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 *  \param[in]     String            Pointer to the null terminated string to send to the host. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t CDC_Device_SendString(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +			                              const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Sends a given null terminated string from PROGMEM space to the attached USB host, if connected. If a host is not connected +			 *  when the function is called, the string is discarded. Bytes will be queued for transmission to the host until either +			 *  the endpoint bank becomes full, or the \ref CDC_Device_Flush() function is called to flush the pending data to +			 *  the host. This allows for multiple bytes to be packed into a single endpoint packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 *  \param[in]     String            Pointer to the null terminated string to send to the host. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t CDC_Device_SendString_P(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +			                              const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Sends a given byte to the attached USB host, if connected. If a host is not connected when the function is called, the +			 *  byte is discarded. Bytes will be queued for transmission to the host until either the endpoint bank becomes full, or the +			 *  \ref CDC_Device_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be +			 *  packed into a single endpoint packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 *  \param[in]     Data              Byte of data to send to the host. +			 * +			 *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum. +			 */ +			uint8_t CDC_Device_SendByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +			                            const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1); + +			/** Determines the number of bytes received by the CDC interface from the host, waiting to be read. This indicates the number +			 *  of bytes in the OUT endpoint bank only, and thus the number of calls to \ref CDC_Device_ReceiveByte() which are guaranteed to +			 *  succeed immediately. If multiple bytes are to be received, they should be buffered by the user application, as the endpoint +			 *  bank will not be released back to the USB controller until all bytes are read. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 * +			 *  \return Total number of buffered bytes received from the host. +			 */ +			uint16_t CDC_Device_BytesReceived(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads a byte of data from the host. If no data is waiting to be read of if a USB host is not connected, the function +			 *  returns a negative value. The \ref CDC_Device_BytesReceived() function may be queried in advance to determine how many +			 *  bytes are currently buffered in the CDC interface's data receive endpoint bank, and thus how many repeated calls to this +			 *  function which are guaranteed to succeed. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 * +			 *  \return Next received byte from the host, or a negative value if no data received. +			 */ +			int16_t CDC_Device_ReceiveByte(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Flushes any data waiting to be sent, ensuring that the send buffer is cleared. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 * +			 *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum. +			 */ +			uint8_t CDC_Device_Flush(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a Serial Control Line State Change notification to the host. This should be called when the virtual serial +			 *  control lines (DCD, DSR, etc.) have changed states, or to give BREAK notifications to the host. Line states persist +			 *  until they are cleared via a second notification. This should be called each time the CDC class driver's +			 *  \c ControlLineStates.DeviceToHost value is updated to push the new states to the USB host. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 */ +			void CDC_Device_SendControlLineStateChange(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			#if defined(FDEV_SETUP_STREAM) || defined(__DOXYGEN__) +			/** Creates a standard character stream for the given CDC Device instance so that it can be used with all the regular +			 *  functions in the standard <stdio.h> library that accept a \c FILE stream as a destination (e.g. \c fprintf()). The created +			 *  stream is bidirectional and can be used for both input and output functions. +			 * +			 *  Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single +			 *  fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may +			 *  be used when the read data is processed byte-per-bye (via \c getc()) or when the user application will implement its own +			 *  line buffering. +			 * +			 *  \note The created stream can be given as \c stdout if desired to direct the standard output from all \c <stdio.h> functions +			 *        to the given CDC interface. +			 *        \n\n +			 * +			 *  \note This function is not available on all microcontroller architectures. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed. +			 */ +			void CDC_Device_CreateStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +			                             FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Identical to \ref CDC_Device_CreateStream(), except that reads are blocking until the calling stream function terminates +			 *  the transfer. While blocking, the USB and CDC service tasks are called repeatedly to maintain USB communications. +			 * +			 *  \note This function is not available on all microcontroller architectures. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed. +			 */ +			void CDC_Device_CreateBlockingStream(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +			                                     FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); +			#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_CDC_DEVICE_C) +				#if defined(FDEV_SETUP_STREAM) +				static int CDC_Device_putchar(char c, +				                              FILE* Stream) ATTR_NON_NULL_PTR_ARG(2); +				static int CDC_Device_getchar(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); +				static int CDC_Device_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); +				#endif + +				void CDC_Device_Event_Stub(void) ATTR_CONST; + +				void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +				                                          ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Device_Event_Stub); +				void EVENT_CDC_Device_ControLineStateChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo) +				                                             ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Device_Event_Stub); +				void EVENT_CDC_Device_BreakSent(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo, +				                                const uint8_t Duration) ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) +				                                ATTR_ALIAS(CDC_Device_Event_Stub); +			#endif + +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/HIDClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/HIDClassDevice.c new file mode 100644 index 0000000000..a8a6e8b50e --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/HIDClassDevice.c @@ -0,0 +1,211 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_DEVICE) + +#define  __INCLUDE_FROM_HID_DRIVER +#define  __INCLUDE_FROM_HID_DEVICE_C +#include "HIDClassDevice.h" + +void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) +{ +	if (!(Endpoint_IsSETUPReceived())) +	  return; + +	if (USB_ControlRequest.wIndex != HIDInterfaceInfo->Config.InterfaceNumber) +	  return; + +	switch (USB_ControlRequest.bRequest) +	{ +		case HID_REQ_GetReport: +			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				uint16_t ReportSize = 0; +				uint8_t  ReportID   = (USB_ControlRequest.wValue & 0xFF); +				uint8_t  ReportType = (USB_ControlRequest.wValue >> 8) - 1; +				uint8_t  ReportData[HIDInterfaceInfo->Config.PrevReportINBufferSize]; + +				memset(ReportData, 0, sizeof(ReportData)); + +				CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, ReportType, ReportData, &ReportSize); + +				if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL) +				{ +					memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportData, +					       HIDInterfaceInfo->Config.PrevReportINBufferSize); +				} + +				Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + +				Endpoint_ClearSETUP(); + +				if (ReportID) +				  Endpoint_Write_8(ReportID); + +				Endpoint_Write_Control_Stream_LE(ReportData, ReportSize); +				Endpoint_ClearOUT(); +			} + +			break; +		case HID_REQ_SetReport: +			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				uint16_t ReportSize = USB_ControlRequest.wLength; +				uint8_t  ReportID   = (USB_ControlRequest.wValue & 0xFF); +				uint8_t  ReportType = (USB_ControlRequest.wValue >> 8) - 1; +				uint8_t  ReportData[ReportSize]; + +				Endpoint_ClearSETUP(); +				Endpoint_Read_Control_Stream_LE(ReportData, ReportSize); +				Endpoint_ClearIN(); + +				CALLBACK_HID_Device_ProcessHIDReport(HIDInterfaceInfo, ReportID, ReportType, +				                                     &ReportData[ReportID ? 1 : 0], ReportSize - (ReportID ? 1 : 0)); +			} + +			break; +		case HID_REQ_GetProtocol: +			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				Endpoint_ClearSETUP(); +				while (!(Endpoint_IsINReady())); +				Endpoint_Write_8(HIDInterfaceInfo->State.UsingReportProtocol); +				Endpoint_ClearIN(); +				Endpoint_ClearStatusStage(); +			} + +			break; +		case HID_REQ_SetProtocol: +			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				Endpoint_ClearSETUP(); +				Endpoint_ClearStatusStage(); + +				HIDInterfaceInfo->State.UsingReportProtocol = ((USB_ControlRequest.wValue & 0xFF) != 0x00); +			} + +			break; +		case HID_REQ_SetIdle: +			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				Endpoint_ClearSETUP(); +				Endpoint_ClearStatusStage(); + +				HIDInterfaceInfo->State.IdleCount = ((USB_ControlRequest.wValue & 0xFF00) >> 6); +			} + +			break; +		case HID_REQ_GetIdle: +			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				Endpoint_ClearSETUP(); +				while (!(Endpoint_IsINReady())); +				Endpoint_Write_8(HIDInterfaceInfo->State.IdleCount >> 2); +				Endpoint_ClearIN(); +				Endpoint_ClearStatusStage(); +			} + +			break; +	} +} + +bool HID_Device_ConfigureEndpoints(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) +{ +	memset(&HIDInterfaceInfo->State, 0x00, sizeof(HIDInterfaceInfo->State)); +	HIDInterfaceInfo->State.UsingReportProtocol = true; +	HIDInterfaceInfo->State.IdleCount           = 500; + +	HIDInterfaceInfo->Config.ReportINEndpoint.Type = EP_TYPE_INTERRUPT; + +	if (!(Endpoint_ConfigureEndpointTable(&HIDInterfaceInfo->Config.ReportINEndpoint, 1))) +	  return false; + +	return true; +} + +void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) +{ +	if (USB_DeviceState != DEVICE_STATE_Configured) +	  return; + +	if (HIDInterfaceInfo->State.PrevFrameNum == USB_Device_GetFrameNumber()) +	{ +		#if defined(USB_DEVICE_OPT_LOWSPEED) +		if (!(USB_Options & USB_DEVICE_OPT_LOWSPEED)) +		  return; +		#else +		return; +		#endif +	} + +	Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpoint.Address); + +	if (Endpoint_IsReadWriteAllowed()) +	{ +		uint8_t  ReportINData[HIDInterfaceInfo->Config.PrevReportINBufferSize]; +		uint8_t  ReportID     = 0; +		uint16_t ReportINSize = 0; + +		memset(ReportINData, 0, sizeof(ReportINData)); + +		bool ForceSend         = CALLBACK_HID_Device_CreateHIDReport(HIDInterfaceInfo, &ReportID, HID_REPORT_ITEM_In, +		                                                             ReportINData, &ReportINSize); +		bool StatesChanged     = false; +		bool IdlePeriodElapsed = (HIDInterfaceInfo->State.IdleCount && !(HIDInterfaceInfo->State.IdleMSRemaining)); + +		if (HIDInterfaceInfo->Config.PrevReportINBuffer != NULL) +		{ +			StatesChanged = (memcmp(ReportINData, HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINSize) != 0); +			memcpy(HIDInterfaceInfo->Config.PrevReportINBuffer, ReportINData, HIDInterfaceInfo->Config.PrevReportINBufferSize); +		} + +		if (ReportINSize && (ForceSend || StatesChanged || IdlePeriodElapsed)) +		{ +			HIDInterfaceInfo->State.IdleMSRemaining = HIDInterfaceInfo->State.IdleCount; + +			Endpoint_SelectEndpoint(HIDInterfaceInfo->Config.ReportINEndpoint.Address); + +			if (ReportID) +			  Endpoint_Write_8(ReportID); + +			Endpoint_Write_Stream_LE(ReportINData, ReportINSize, NULL); + +			Endpoint_ClearIN(); +		} + +		HIDInterfaceInfo->State.PrevFrameNum = USB_Device_GetFrameNumber(); +	} +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/HIDClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/HIDClassDevice.h new file mode 100644 index 0000000000..ae628c87d4 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/HIDClassDevice.h @@ -0,0 +1,210 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Device mode driver for the library USB HID Class driver. + * + *  Device mode driver for the library USB HID Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassHID + *  \defgroup Group_USBClassHIDDevice HID Class Device Mode Driver + * + *  \section Sec_USBClassHIDDevice_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Device/HIDClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassHIDDevice_ModDescription Module Description + *  Device Mode USB Class driver framework interface, for the HID USB Class driver. + * + *  @{ + */ + +#ifndef _HID_CLASS_DEVICE_H_ +#define _HID_CLASS_DEVICE_H_ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/HIDClassCommon.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_HID_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Type Defines: */ +			/** \brief HID Class Device Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made for each HID interface +			 *  within the user application, and passed to each of the HID class driver functions as the +			 *  \c HIDInterfaceInfo parameter. This stores each HID interface's configuration and state information. +			 * +			 *  \note Due to technical limitations, the HID device class driver does not utilize a separate OUT +			 *        endpoint for host->device communications. Instead, the host->device data (if any) is sent to +			 *        the device via the control endpoint. +			 */ +			typedef struct +			{ +				struct +				{ +					uint8_t  InterfaceNumber; /**< Interface number of the HID interface within the device. */ + +					USB_Endpoint_Table_t ReportINEndpoint; /**< Data IN HID report endpoint configuration table. */ + +					void*    PrevReportINBuffer; /**< Pointer to a buffer where the previously created HID input report can be +					                              *  stored by the driver, for comparison purposes to detect report changes that +					                              *  must be sent immediately to the host. This should point to a buffer big enough +					                              *  to hold the largest HID input report sent from the HID interface. If this is set +					                              *  to \c NULL, it is up to the user to force transfers when needed in the +					                              *  \ref CALLBACK_HID_Device_CreateHIDReport() callback function. +					                              * +					                              *  \note Due to the single buffer, the internal driver can only correctly compare +					                              *        subsequent reports with identical report IDs. In multiple report devices, +					                              *        this buffer should be set to \c NULL and the decision to send reports made +					                              *        by the user application instead. +					                              */ +					uint8_t  PrevReportINBufferSize; /**< Size in bytes of the given input report buffer. This is used to create a +					                                  *  second buffer of the same size within the driver so that subsequent reports +					                                  *  can be compared. If the user app is to determine when reports are to be sent +					                                  *  exclusively (i.e. \c PrevReportINBuffer is \c NULL) this value must still be +					                                  *  set to the size of the largest report the device can issue to the host. +					                                  */ +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ +				struct +				{ +					bool     UsingReportProtocol; /**< Indicates if the HID interface is set to Boot or Report protocol mode. */ +					uint16_t PrevFrameNum; /**< Frame number of the previous HID report packet opportunity. */ +					uint16_t IdleCount; /**< Report idle period, in milliseconds, set by the host. */ +					uint16_t IdleMSRemaining; /**< Total number of milliseconds remaining before the idle period elapsed - this +				                               *   should be decremented by the user application if non-zero each millisecond. */ +				} State; /**< State data for the USB class interface within the device. All elements in this section +				          *   are reset to their defaults when the interface is enumerated. +				          */ +			} USB_ClassInfo_HID_Device_t; + +		/* Function Prototypes: */ +			/** Configures the endpoints of a given HID interface, ready for use. This should be linked to the library +			 *  \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration +			 *  containing the given HID interface is selected. +			 * +			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state. +			 * +			 *  \return Boolean \c true if the endpoints were successfully configured, \c false otherwise. +			 */ +			bool HID_Device_ConfigureEndpoints(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Processes incoming control requests from the host, that are directed to the given HID class interface. This should be +			 *  linked to the library \ref EVENT_USB_Device_ControlRequest() event. +			 * +			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state. +			 */ +			void HID_Device_ProcessControlRequest(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** General management task for a given HID class interface, required for the correct operation of the interface. This should +			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). +			 * +			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state. +			 */ +			void HID_Device_USBTask(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** HID class driver callback for the user creation of a HID IN report. This callback may fire in response to either +			 *  HID class control requests from the host, or by the normal HID endpoint polling procedure. Inside this callback the +			 *  user is responsible for the creation of the next HID input report to be sent to the host. +			 * +			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state. +			 *  \param[in,out] ReportID          If preset to a non-zero value, this is the report ID being requested by the host. If zero, +			 *                                   this should be set to the report ID of the generated HID input report (if any). If multiple +			 *                                   reports are not sent via the given HID interface, this parameter should be ignored. +			 *  \param[in]     ReportType        Type of HID report to generate, either \ref HID_REPORT_ITEM_In or \ref HID_REPORT_ITEM_Feature. +			 *  \param[out]    ReportData        Pointer to a buffer where the generated HID report should be stored. +			 *  \param[out]    ReportSize        Number of bytes in the generated input report, or zero if no report is to be sent. +			 * +			 *  \return Boolean \c true to force the sending of the report even if it is identical to the previous report and still within +			 *          the idle period (useful for devices which report relative movement), \c false otherwise. +			 */ +			bool CALLBACK_HID_Device_CreateHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, +			                                         uint8_t* const ReportID, +			                                         const uint8_t ReportType, +			                                         void* ReportData, +			                                         uint16_t* const ReportSize) ATTR_NON_NULL_PTR_ARG(1) +			                                         ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(4) ATTR_NON_NULL_PTR_ARG(5); + +			/** HID class driver callback for the user processing of a received HID OUT report. This callback may fire in response to +			 *  either HID class control requests from the host, or by the normal HID endpoint polling procedure. Inside this callback +			 *  the user is responsible for the processing of the received HID output report from the host. +			 * +			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state. +			 *  \param[in]     ReportID          Report ID of the received output report. If multiple reports are not received via the given HID +			 *                                   interface, this parameter should be ignored. +			 *  \param[in]     ReportType        Type of received HID report, either \ref HID_REPORT_ITEM_Out or \ref HID_REPORT_ITEM_Feature. +			 *  \param[in]     ReportData        Pointer to a buffer where the received HID report is stored. +			 *  \param[in]     ReportSize        Size in bytes of the received report from the host. +			 */ +			void CALLBACK_HID_Device_ProcessHIDReport(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo, +			                                          const uint8_t ReportID, +			                                          const uint8_t ReportType, +			                                          const void* ReportData, +			                                          const uint16_t ReportSize) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(4); + +		/* Inline Functions: */ +			/** Indicates that a millisecond of idle time has elapsed on the given HID interface, and the interface's idle count should be +			 *  decremented. This should be called once per millisecond so that hardware key-repeats function correctly. It is recommended +			 *  that this be called by the \ref EVENT_USB_Device_StartOfFrame() event, once SOF events have been enabled via +			 *  \ref USB_Device_EnableSOFEvents(). +			 * +			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class configuration and state. +			 */ +			static inline void HID_Device_MillisecondElapsed(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) ATTR_ALWAYS_INLINE ATTR_NON_NULL_PTR_ARG(1); +			static inline void HID_Device_MillisecondElapsed(USB_ClassInfo_HID_Device_t* const HIDInterfaceInfo) +			{ +				if (HIDInterfaceInfo->State.IdleMSRemaining) +				  HIDInterfaceInfo->State.IdleMSRemaining--; +			} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.c new file mode 100644 index 0000000000..a35c4082bc --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.c @@ -0,0 +1,131 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_DEVICE) + +#define  __INCLUDE_FROM_MIDI_DRIVER +#define  __INCLUDE_FROM_MIDI_DEVICE_C +#include "MIDIClassDevice.h" + +bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) +{ +	memset(&MIDIInterfaceInfo->State, 0x00, sizeof(MIDIInterfaceInfo->State)); + +	MIDIInterfaceInfo->Config.DataINEndpoint.Type  = EP_TYPE_BULK; +	MIDIInterfaceInfo->Config.DataOUTEndpoint.Type = EP_TYPE_BULK; + +	if (!(Endpoint_ConfigureEndpointTable(&MIDIInterfaceInfo->Config.DataINEndpoint, 1))) +	  return false; + +	if (!(Endpoint_ConfigureEndpointTable(&MIDIInterfaceInfo->Config.DataOUTEndpoint, 1))) +	  return false; + +	return true; +} + +void MIDI_Device_USBTask(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) +{ +	if (USB_DeviceState != DEVICE_STATE_Configured) +	  return; + +	#if !defined(NO_CLASS_DRIVER_AUTOFLUSH) +	Endpoint_SelectEndpoint(MIDIInterfaceInfo->Config.DataINEndpoint.Address); + +	if (Endpoint_IsINReady()) +	  MIDI_Device_Flush(MIDIInterfaceInfo); +	#endif +} + +uint8_t MIDI_Device_SendEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo, +                                    const MIDI_EventPacket_t* const Event) +{ +	if (USB_DeviceState != DEVICE_STATE_Configured) +	  return ENDPOINT_RWSTREAM_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Endpoint_SelectEndpoint(MIDIInterfaceInfo->Config.DataINEndpoint.Address); + +	if ((ErrorCode = Endpoint_Write_Stream_LE(Event, sizeof(MIDI_EventPacket_t), NULL)) != ENDPOINT_RWSTREAM_NoError) +	  return ErrorCode; + +	if (!(Endpoint_IsReadWriteAllowed())) +	  Endpoint_ClearIN(); + +	return ENDPOINT_RWSTREAM_NoError; +} + +uint8_t MIDI_Device_Flush(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) +{ +	if (USB_DeviceState != DEVICE_STATE_Configured) +	  return ENDPOINT_RWSTREAM_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Endpoint_SelectEndpoint(MIDIInterfaceInfo->Config.DataINEndpoint.Address); + +	if (Endpoint_BytesInEndpoint()) +	{ +		Endpoint_ClearIN(); + +		if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) +		  return ErrorCode; +	} + +	return ENDPOINT_READYWAIT_NoError; +} + +bool MIDI_Device_ReceiveEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo, +                                    MIDI_EventPacket_t* const Event) +{ +	if (USB_DeviceState != DEVICE_STATE_Configured) +	  return false; + +	Endpoint_SelectEndpoint(MIDIInterfaceInfo->Config.DataOUTEndpoint.Address); + +	if (!(Endpoint_IsOUTReceived())) +		return false; + +	if (!(Endpoint_IsReadWriteAllowed())) +	  return false; + +	Endpoint_Read_Stream_LE(Event, sizeof(MIDI_EventPacket_t), NULL); + +	if (!(Endpoint_IsReadWriteAllowed())) +	  Endpoint_ClearOUT(); + +	return true; +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.h new file mode 100644 index 0000000000..ee2efd7c18 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/MIDIClassDevice.h @@ -0,0 +1,175 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Device mode driver for the library USB MIDI Class driver. + * + *  Device mode driver for the library USB MIDI Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassMIDI + *  \defgroup Group_USBClassMIDIDevice MIDI Class Device Mode Driver + * + *  \section Sec_USBClassMIDIDevice_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Device/MIDIClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassMIDIDevice_ModDescription Module Description + *  Device Mode USB Class driver framework interface, for the MIDI USB Class driver. + * + *  @{ + */ + +#ifndef _MIDI_CLASS_DEVICE_H_ +#define _MIDI_CLASS_DEVICE_H_ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/MIDIClassCommon.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_MIDI_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Type Define: */ +			/** \brief MIDI Class Device Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made for each MIDI interface +			 *  within the user application, and passed to each of the MIDI class driver functions as the +			 *  \c MIDIInterfaceInfo parameter. This stores each MIDI interface's configuration and state information. +			 */ +			typedef struct +			{ +				struct +				{ +					uint8_t  StreamingInterfaceNumber; /**< Index of the Audio Streaming interface within the device this structure controls. */ + +					USB_Endpoint_Table_t DataINEndpoint; /**< Data IN endpoint configuration table. */ +					USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */ +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ + +				struct +				{ +					uint8_t RESERVED; // No state information for this class +				} State; /**< State data for the USB class interface within the device. All elements in this section +				          *   are reset to their defaults when the interface is enumerated. +				          */ +			} USB_ClassInfo_MIDI_Device_t; + +		/* Function Prototypes: */ +			/** Configures the endpoints of a given MIDI interface, ready for use. This should be linked to the library +			 *  \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration +			 *  containing the given MIDI interface is selected. +			 * +			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state. +			 * +			 *  \return Boolean \c true if the endpoints were successfully configured, \c false otherwise. +			 */ +			bool MIDI_Device_ConfigureEndpoints(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** General management task for a given MIDI class interface, required for the correct operation of the interface. This should +			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). +			 * +			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state. +			 */ +			void MIDI_Device_USBTask(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a MIDI event packet to the host. If no host is connected, the event packet is discarded. Events are queued into the +			 *  endpoint bank until either the endpoint bank is full, or \ref MIDI_Device_Flush() is called. This allows for multiple +			 *  MIDI events to be packed into a single endpoint packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state. +			 *  \param[in]     Event              Pointer to a populated \ref MIDI_EventPacket_t structure containing the MIDI event to send. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t MIDI_Device_SendEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo, +			                                    const MIDI_EventPacket_t* const Event) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + + +			/** Flushes the MIDI send buffer, sending any queued MIDI events to the host. This should be called to override the +			 *  \ref MIDI_Device_SendEventPacket() function's packing behavior, to flush queued events. +			 * +			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state. +			 * +			 *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum. +			 */ +			uint8_t MIDI_Device_Flush(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Receives a MIDI event packet from the host. Events are unpacked from the endpoint, thus if the endpoint bank contains +			 *  multiple MIDI events from the host in the one packet, multiple calls to this function will return each individual event. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state. +			 *  \param[out]    Event              Pointer to a USB_MIDI_EventPacket_t structure where the received MIDI event is to be placed. +			 * +			 *  \return Boolean \c true if a MIDI event packet was received, \c false otherwise. +			 */ +			bool MIDI_Device_ReceiveEventPacket(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo, +			                                    MIDI_EventPacket_t* const Event) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +		/* Inline Functions: */ +			/** Processes incoming control requests from the host, that are directed to the given MIDI class interface. This should be +			 *  linked to the library \ref EVENT_USB_Device_ControlRequest() event. +			 * +			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state. +			 */ +			static inline void MIDI_Device_ProcessControlRequest(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); +			static inline void MIDI_Device_ProcessControlRequest(USB_ClassInfo_MIDI_Device_t* const MIDIInterfaceInfo) +			{ +				(void)MIDIInterfaceInfo; +			} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.c new file mode 100644 index 0000000000..1ea30f7cbc --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.c @@ -0,0 +1,215 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_DEVICE) + +#define  __INCLUDE_FROM_MS_DRIVER +#define  __INCLUDE_FROM_MASSSTORAGE_DEVICE_C +#include "MassStorageClassDevice.h" + +void MS_Device_ProcessControlRequest(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) +{ +	if (!(Endpoint_IsSETUPReceived())) +	  return; + +	if (USB_ControlRequest.wIndex != MSInterfaceInfo->Config.InterfaceNumber) +	  return; + +	switch (USB_ControlRequest.bRequest) +	{ +		case MS_REQ_MassStorageReset: +			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				Endpoint_ClearSETUP(); +				Endpoint_ClearStatusStage(); + +				MSInterfaceInfo->State.IsMassStoreReset = true; +			} + +			break; +		case MS_REQ_GetMaxLUN: +			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				Endpoint_ClearSETUP(); +				while (!(Endpoint_IsINReady())); +				Endpoint_Write_8(MSInterfaceInfo->Config.TotalLUNs - 1); +				Endpoint_ClearIN(); +				Endpoint_ClearStatusStage(); +			} + +			break; +	} +} + +bool MS_Device_ConfigureEndpoints(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) +{ +	memset(&MSInterfaceInfo->State, 0x00, sizeof(MSInterfaceInfo->State)); + +	MSInterfaceInfo->Config.DataINEndpoint.Type  = EP_TYPE_BULK; +	MSInterfaceInfo->Config.DataOUTEndpoint.Type = EP_TYPE_BULK; + +	if (!(Endpoint_ConfigureEndpointTable(&MSInterfaceInfo->Config.DataINEndpoint, 1))) +	  return false; + +	if (!(Endpoint_ConfigureEndpointTable(&MSInterfaceInfo->Config.DataOUTEndpoint, 1))) +	  return false; + +	return true; +} + +void MS_Device_USBTask(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) +{ +	if (USB_DeviceState != DEVICE_STATE_Configured) +	  return; + +	Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpoint.Address); + +	if (Endpoint_IsOUTReceived()) +	{ +		if (MS_Device_ReadInCommandBlock(MSInterfaceInfo)) +		{ +			if (MSInterfaceInfo->State.CommandBlock.Flags & MS_COMMAND_DIR_DATA_IN) +			  Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataINEndpoint.Address); + +			bool SCSICommandResult = CALLBACK_MS_Device_SCSICommandReceived(MSInterfaceInfo); + +			MSInterfaceInfo->State.CommandStatus.Status              = (SCSICommandResult) ? MS_SCSI_COMMAND_Pass : MS_SCSI_COMMAND_Fail; +			MSInterfaceInfo->State.CommandStatus.Signature           = CPU_TO_LE32(MS_CSW_SIGNATURE); +			MSInterfaceInfo->State.CommandStatus.Tag                 = MSInterfaceInfo->State.CommandBlock.Tag; +			MSInterfaceInfo->State.CommandStatus.DataTransferResidue = MSInterfaceInfo->State.CommandBlock.DataTransferLength; + +			if (!(SCSICommandResult) && (le32_to_cpu(MSInterfaceInfo->State.CommandStatus.DataTransferResidue))) +			  Endpoint_StallTransaction(); + +			MS_Device_ReturnCommandStatus(MSInterfaceInfo); +		} +	} + +	if (MSInterfaceInfo->State.IsMassStoreReset) +	{ +		Endpoint_ResetEndpoint(MSInterfaceInfo->Config.DataOUTEndpoint.Address); +		Endpoint_ResetEndpoint(MSInterfaceInfo->Config.DataINEndpoint.Address); + +		Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpoint.Address); +		Endpoint_ClearStall(); +		Endpoint_ResetDataToggle(); +		Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataINEndpoint.Address); +		Endpoint_ClearStall(); +		Endpoint_ResetDataToggle(); + +		MSInterfaceInfo->State.IsMassStoreReset = false; +	} +} + +static bool MS_Device_ReadInCommandBlock(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) +{ +	uint16_t BytesProcessed; + +	Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpoint.Address); + +	BytesProcessed = 0; +	while (Endpoint_Read_Stream_LE(&MSInterfaceInfo->State.CommandBlock, +	                               (sizeof(MS_CommandBlockWrapper_t) - 16), &BytesProcessed) == +	                               ENDPOINT_RWSTREAM_IncompleteTransfer) +	{ +		if (MSInterfaceInfo->State.IsMassStoreReset) +		  return false; +	} + +	if ((MSInterfaceInfo->State.CommandBlock.Signature         != CPU_TO_LE32(MS_CBW_SIGNATURE))     || +	    (MSInterfaceInfo->State.CommandBlock.LUN               >= MSInterfaceInfo->Config.TotalLUNs) || +		(MSInterfaceInfo->State.CommandBlock.Flags              & 0x1F)                              || +		(MSInterfaceInfo->State.CommandBlock.SCSICommandLength == 0)                                 || +		(MSInterfaceInfo->State.CommandBlock.SCSICommandLength >  16)) +	{ +		Endpoint_StallTransaction(); +		Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataINEndpoint.Address); +		Endpoint_StallTransaction(); + +		return false; +	} + +	BytesProcessed = 0; +	while (Endpoint_Read_Stream_LE(&MSInterfaceInfo->State.CommandBlock.SCSICommandData, +	                                MSInterfaceInfo->State.CommandBlock.SCSICommandLength, &BytesProcessed) == +	                                ENDPOINT_RWSTREAM_IncompleteTransfer) +	{ +		if (MSInterfaceInfo->State.IsMassStoreReset) +		  return false; +	} + +	Endpoint_ClearOUT(); + +	return true; +} + +static void MS_Device_ReturnCommandStatus(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) +{ +	Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataOUTEndpoint.Address); + +	while (Endpoint_IsStalled()) +	{ +		#if !defined(INTERRUPT_CONTROL_ENDPOINT) +		USB_USBTask(); +		#endif + +		if (MSInterfaceInfo->State.IsMassStoreReset) +		  return; +	} + +	Endpoint_SelectEndpoint(MSInterfaceInfo->Config.DataINEndpoint.Address); + +	while (Endpoint_IsStalled()) +	{ +		#if !defined(INTERRUPT_CONTROL_ENDPOINT) +		USB_USBTask(); +		#endif + +		if (MSInterfaceInfo->State.IsMassStoreReset) +		  return; +	} + +	uint16_t BytesProcessed = 0; +	while (Endpoint_Write_Stream_LE(&MSInterfaceInfo->State.CommandStatus, +	                                sizeof(MS_CommandStatusWrapper_t), &BytesProcessed) == +	                                ENDPOINT_RWSTREAM_IncompleteTransfer) +	{ +		if (MSInterfaceInfo->State.IsMassStoreReset) +		  return; +	} + +	Endpoint_ClearIN(); +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.h new file mode 100644 index 0000000000..12b54f8dfb --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.h @@ -0,0 +1,161 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Device mode driver for the library USB Mass Storage Class driver. + * + *  Device mode driver for the library USB Mass Storage Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassMS + *  \defgroup Group_USBClassMSDevice Mass Storage Class Device Mode Driver + * + *  \section Sec_USBClassMSDevice_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassMSDevice_ModDescription Module Description + *  Device Mode USB Class driver framework interface, for the Mass Storage USB Class driver. + * + *  @{ + */ + +#ifndef _MS_CLASS_DEVICE_H_ +#define _MS_CLASS_DEVICE_H_ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/MassStorageClassCommon.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_MS_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Type Defines: */ +			/** \brief Mass Storage Class Device Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made for each Mass Storage interface +			 *  within the user application, and passed to each of the Mass Storage class driver functions as the +			 *  \c MSInterfaceInfo parameter. This stores each Mass Storage interface's configuration and state information. +			 */ +			typedef struct +			{ +				struct +				{ +					uint8_t  InterfaceNumber; /**< Interface number of the Mass Storage interface within the device. */ + +					USB_Endpoint_Table_t DataINEndpoint; /**< Data IN endpoint configuration table. */ +					USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */ + +					uint8_t  TotalLUNs; /**< Total number of logical drives in the Mass Storage interface. */ +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ +				struct +				{ +					MS_CommandBlockWrapper_t  CommandBlock; /**< Mass Storage class command block structure, stores the received SCSI +															 *   command from the host which is to be processed. +															 */ +					MS_CommandStatusWrapper_t CommandStatus; /**< Mass Storage class command status structure, set elements to indicate +															  *   the issued command's success or failure to the host. +															  */ +					volatile bool IsMassStoreReset; /**< Flag indicating that the host has requested that the Mass Storage interface be reset +											         *   and that all current Mass Storage operations should immediately abort. +											         */ +				} State; /**< State data for the USB class interface within the device. All elements in this section +				          *   are reset to their defaults when the interface is enumerated. +				          */ +			} USB_ClassInfo_MS_Device_t; + +		/* Function Prototypes: */ +			/** Configures the endpoints of a given Mass Storage interface, ready for use. This should be linked to the library +			 *  \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration +			 *  containing the given Mass Storage interface is selected. +			 * +			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a Mass Storage Class configuration and state. +			 * +			 *  \return Boolean \c true if the endpoints were successfully configured, \c false otherwise. +			 */ +			bool MS_Device_ConfigureEndpoints(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Processes incoming control requests from the host, that are directed to the given Mass Storage class interface. This should be +			 *  linked to the library \ref EVENT_USB_Device_ControlRequest() event. +			 * +			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a Mass Storage Class configuration and state. +			 */ +			void MS_Device_ProcessControlRequest(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** General management task for a given Mass Storage class interface, required for the correct operation of the interface. This should +			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). +			 * +			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a Mass Storage configuration and state. +			 */ +			void MS_Device_USBTask(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Mass Storage class driver callback for the user processing of a received SCSI command. This callback will fire each time the +			 *  host sends a SCSI command which requires processing by the user application. Inside this callback the user is responsible +			 *  for the processing of the received SCSI command from the host. The SCSI command is available in the CommandBlock structure +			 *  inside the Mass Storage class state structure passed as a parameter to the callback function. +			 * +			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a Mass Storage Class configuration and state. +			 * +			 *  \return Boolean \c true if the SCSI command was successfully processed, \c false otherwise. +			 */ +			bool CALLBACK_MS_Device_SCSICommandReceived(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_MASSSTORAGE_DEVICE_C) +				static void MS_Device_ReturnCommandStatus(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); +				static bool MS_Device_ReadInCommandBlock(USB_ClassInfo_MS_Device_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); +			#endif + +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c new file mode 100644 index 0000000000..7209c452dc --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c @@ -0,0 +1,314 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_DEVICE) + +#define  __INCLUDE_FROM_PRINTER_DRIVER +#define  __INCLUDE_FROM_PRINTER_DEVICE_C +#include "PrinterClassDevice.h" + +void PRNT_Device_ProcessControlRequest(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) +{ +	if (!(Endpoint_IsSETUPReceived())) +	  return; + +	if (USB_ControlRequest.wIndex != PRNTInterfaceInfo->Config.InterfaceNumber) +	  return; + +	switch (USB_ControlRequest.bRequest) +	{ +		case PRNT_REQ_GetDeviceID: +			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				Endpoint_ClearSETUP(); + +				while (!(Endpoint_IsINReady())) +				{ +					if (USB_DeviceState == DEVICE_STATE_Unattached) +					  return; +				} + +				uint16_t IEEEStringLen = strlen(PRNTInterfaceInfo->Config.IEEE1284String); +				Endpoint_Write_16_BE(IEEEStringLen); +				Endpoint_Write_Control_Stream_LE(PRNTInterfaceInfo->Config.IEEE1284String, IEEEStringLen); +				Endpoint_ClearStatusStage(); +			} + +			break; +		case PRNT_REQ_GetPortStatus: +			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				Endpoint_ClearSETUP(); + +				while (!(Endpoint_IsINReady())) +				{ +					if (USB_DeviceState == DEVICE_STATE_Unattached) +					  return; +				} + +				Endpoint_Write_8(PRNTInterfaceInfo->State.PortStatus); +				Endpoint_ClearStatusStage(); +			} + +			break; +		case PRNT_REQ_SoftReset: +			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				Endpoint_ClearSETUP(); +				Endpoint_ClearStatusStage(); + +				PRNTInterfaceInfo->State.IsPrinterReset = true; + +				EVENT_PRNT_Device_SoftReset(PRNTInterfaceInfo); +			} + +			break; +	} +} + +bool PRNT_Device_ConfigureEndpoints(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) +{ +	memset(&PRNTInterfaceInfo->State, 0x00, sizeof(PRNTInterfaceInfo->State)); +	PRNTInterfaceInfo->State.PortStatus = PRNT_PORTSTATUS_NOTERROR | PRNT_PORTSTATUS_SELECT; + +	PRNTInterfaceInfo->Config.DataINEndpoint.Type  = EP_TYPE_BULK; +	PRNTInterfaceInfo->Config.DataOUTEndpoint.Type = EP_TYPE_BULK; + +	if (!(Endpoint_ConfigureEndpointTable(&PRNTInterfaceInfo->Config.DataINEndpoint, 1))) +	  return false; + +	if (!(Endpoint_ConfigureEndpointTable(&PRNTInterfaceInfo->Config.DataOUTEndpoint, 1))) +	  return false; + +	return true; +} + +void PRNT_Device_USBTask(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) +{ +	if (USB_DeviceState != DEVICE_STATE_Configured) +	  return; + +	#if !defined(NO_CLASS_DRIVER_AUTOFLUSH) +	Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address); + +	if (Endpoint_IsINReady()) +	  PRNT_Device_Flush(PRNTInterfaceInfo); +	#endif + +	if (PRNTInterfaceInfo->State.IsPrinterReset) +	{ +		Endpoint_ResetEndpoint(PRNTInterfaceInfo->Config.DataOUTEndpoint.Address); +		Endpoint_ResetEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address); + +		Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataOUTEndpoint.Address); +		Endpoint_ClearStall(); +		Endpoint_ResetDataToggle(); +		Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address); +		Endpoint_ClearStall(); +		Endpoint_ResetDataToggle(); + +		PRNTInterfaceInfo->State.IsPrinterReset = false; +	} +} + +uint8_t PRNT_Device_SendString(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo, +                               const char* const String) +{ +	if (USB_DeviceState != DEVICE_STATE_Configured) +	  return ENDPOINT_RWSTREAM_DeviceDisconnected; + +	Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address); +	return Endpoint_Write_Stream_LE(String, strlen(String), NULL); +} + +uint8_t PRNT_Device_SendData(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo, +                             const void* const Buffer, +                             const uint16_t Length) +{ +	if (USB_DeviceState != DEVICE_STATE_Configured) +	  return ENDPOINT_RWSTREAM_DeviceDisconnected; + +	Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address); +	return Endpoint_Write_Stream_LE(Buffer, Length, NULL); +} + +uint8_t PRNT_Device_SendByte(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo, +                             const uint8_t Data) +{ +	if (USB_DeviceState != DEVICE_STATE_Configured) +	  return ENDPOINT_RWSTREAM_DeviceDisconnected; + +	Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address); + +	if (!(Endpoint_IsReadWriteAllowed())) +	{ +		Endpoint_ClearIN(); + +		uint8_t ErrorCode; + +		if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) +		  return ErrorCode; +	} + +	Endpoint_Write_8(Data); +	return ENDPOINT_READYWAIT_NoError; +} + +uint8_t PRNT_Device_Flush(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) +{ +	if (USB_DeviceState != DEVICE_STATE_Configured) +	  return ENDPOINT_RWSTREAM_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataINEndpoint.Address); + +	if (!(Endpoint_BytesInEndpoint())) +	  return ENDPOINT_READYWAIT_NoError; + +	bool BankFull = !(Endpoint_IsReadWriteAllowed()); + +	Endpoint_ClearIN(); + +	if (BankFull) +	{ +		if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) +		  return ErrorCode; + +		Endpoint_ClearIN(); +	} + +	return ENDPOINT_READYWAIT_NoError; +} + +uint16_t PRNT_Device_BytesReceived(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) +{ +	if (USB_DeviceState != DEVICE_STATE_Configured) +	  return 0; + +	Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataOUTEndpoint.Address); + +	if (Endpoint_IsOUTReceived()) +	{ +		if (!(Endpoint_BytesInEndpoint())) +		{ +			Endpoint_ClearOUT(); +			return 0; +		} +		else +		{ +			return Endpoint_BytesInEndpoint(); +		} +	} +	else +	{ +		return 0; +	} +} + +int16_t PRNT_Device_ReceiveByte(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) +{ +	if (USB_DeviceState != DEVICE_STATE_Configured) +	  return -1; + +	int16_t ReceivedByte = -1; + +	Endpoint_SelectEndpoint(PRNTInterfaceInfo->Config.DataOUTEndpoint.Address); + +	if (Endpoint_IsOUTReceived()) +	{ +		if (Endpoint_BytesInEndpoint()) +		  ReceivedByte = Endpoint_Read_8(); + +		if (!(Endpoint_BytesInEndpoint())) +		  Endpoint_ClearOUT(); +	} + +	return ReceivedByte; +} + +#if defined(FDEV_SETUP_STREAM) +void PRNT_Device_CreateStream(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo, +                              FILE* const Stream) +{ +	*Stream = (FILE)FDEV_SETUP_STREAM(PRNT_Device_putchar, PRNT_Device_getchar, _FDEV_SETUP_RW); +	fdev_set_udata(Stream, PRNTInterfaceInfo); +} + +void PRNT_Device_CreateBlockingStream(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo, +                                      FILE* const Stream) +{ +	*Stream = (FILE)FDEV_SETUP_STREAM(PRNT_Device_putchar, PRNT_Device_getchar_Blocking, _FDEV_SETUP_RW); +	fdev_set_udata(Stream, PRNTInterfaceInfo); +} + +static int PRNT_Device_putchar(char c, +                               FILE* Stream) +{ +	return PRNT_Device_SendByte((USB_ClassInfo_PRNT_Device_t*)fdev_get_udata(Stream), c) ? _FDEV_ERR : 0; +} + +static int PRNT_Device_getchar(FILE* Stream) +{ +	int16_t ReceivedByte = PRNT_Device_ReceiveByte((USB_ClassInfo_PRNT_Device_t*)fdev_get_udata(Stream)); + +	if (ReceivedByte < 0) +	  return _FDEV_EOF; + +	return ReceivedByte; +} + +static int PRNT_Device_getchar_Blocking(FILE* Stream) +{ +	int16_t ReceivedByte; + +	while ((ReceivedByte = PRNT_Device_ReceiveByte((USB_ClassInfo_PRNT_Device_t*)fdev_get_udata(Stream))) < 0) +	{ +		if (USB_DeviceState == DEVICE_STATE_Unattached) +		  return _FDEV_EOF; + +		PRNT_Device_USBTask((USB_ClassInfo_PRNT_Device_t*)fdev_get_udata(Stream)); +		USB_USBTask(); +	} + +	return ReceivedByte; +} +#endif + +void PRNT_Device_Event_Stub(void) +{ + +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h new file mode 100644 index 0000000000..802c5912d3 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/PrinterClassDevice.h @@ -0,0 +1,293 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Device mode driver for the library USB Printer Class driver. + * + *  Device mode driver for the library USB Printer Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassPrinter + *  \defgroup Group_USBClassPrinterDevice Printer Class Device Mode Driver + * + *  \section Sec_USBClassPrinterDevice_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Device/PrinterClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassPrinterDevice_ModDescription Module Description + *  Device Mode USB Class driver framework interface, for the Printer USB Class driver. + * + *  @{ + */ + +#ifndef _PRINTER_CLASS_DEVICE_H_ +#define _PRINTER_CLASS_DEVICE_H_ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/PrinterClassCommon.h" + +		#include <stdio.h> + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_PRINTER_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Type Defines: */ +			/** \brief Printer Class Device Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made for each Printer interface +			 *  within the user application, and passed to each of the Printer class driver functions as the +			 *  PRNTInterfaceInfo parameter. This stores each Printer interface's configuration and state information. +			 */ +			typedef struct +			{ +				struct +				{ +					uint8_t InterfaceNumber; /**< Interface number of the Printer interface within the device. */ + +					USB_Endpoint_Table_t DataINEndpoint; /**< Data IN endpoint configuration table. */ +					USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */ + +					char* IEEE1284String; /**< IEEE 1284 identification string, sent to the host during enumeration +					                       *   to identify the printer model, manufacturer and other characteristics. +					                       */ +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ +				struct +				{ +					uint8_t PortStatus; /**< Current status of the Printer virtual port, a collection of \c PRNT_PORTSTATUS_* +					                     *   bitmask values. +					                     */ + +					volatile bool IsPrinterReset; /**< Flag indicating that the host has requested that the Printer interface be reset +											       *   and that all current Mass Storage operations should immediately abort. +											       */ +				} State; /**< State data for the USB class interface within the device. All elements in this section +				          *   are reset to their defaults when the interface is enumerated. +				          */ +			} USB_ClassInfo_PRNT_Device_t; + +		/* Function Prototypes: */ +			/** Configures the endpoints of a given Printer interface, ready for use. This should be linked to the library +			 *  \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration containing +			 *  the given Printer interface is selected. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state. +			 * +			 *  \return Boolean \c true if the endpoints were successfully configured, \c false otherwise. +			 */ +			bool PRNT_Device_ConfigureEndpoints(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Processes incoming control requests from the host, that are directed to the given Printer class interface. This should be +			 *  linked to the library \ref EVENT_USB_Device_ControlRequest() event. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state. +			 */ +			void PRNT_Device_ProcessControlRequest(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** General management task for a given Printer class interface, required for the correct operation of the interface. This should +			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state. +			 */ +			void PRNT_Device_USBTask(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Printer class driver event for a soft reset request on a Printer interface. This event fires each time the host +			 *  requests a reset of the printer interface's internal state, and may be hooked in the user program by declaring a +			 *  handler function with the same name and parameters listed here. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state. +			 */ +			void EVENT_PRNT_Device_SoftReset(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a given data buffer to the attached USB host, if connected. If a host is not connected when the function is +			 *  called, the string is discarded. Bytes will be queued for transmission to the host until either the endpoint bank +			 *  becomes full, or the \ref PRNT_Device_Flush() function is called to flush the pending data to the host. This allows +			 *  for multiple bytes to be packed into a single endpoint packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state. +			 *  \param[in]     Buffer            Pointer to a buffer containing the data to send to the device. +			 *  \param[in]     Length            Length of the data to send to the host. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t PRNT_Device_SendData(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo, +			                             const void* const Buffer, +			                             const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Sends a given null terminated string to the attached USB host, if connected. If a host is not connected when +			 *  the function is called, the string is discarded. Bytes will be queued for transmission to the host until either +			 *  the endpoint bank becomes full, or the \ref PRNT_Device_Flush() function is called to flush the pending data to +			 *  the host. This allows for multiple bytes to be packed into a single endpoint packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state. +			 *  \param[in]     String            Pointer to the null terminated string to send to the host. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t PRNT_Device_SendString(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo, +			                               const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Sends a given byte to the attached USB host, if connected. If a host is not connected when the function is called, the +			 *  byte is discarded. Bytes will be queued for transmission to the host until either the endpoint bank becomes full, or the +			 *  \ref PRNT_Device_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be +			 *  packed into a single endpoint packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state. +			 *  \param[in]     Data              Byte of data to send to the host. +			 * +			 *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum. +			 */ +			uint8_t PRNT_Device_SendByte(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo, +			                             const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1); + +			/** Determines the number of bytes received by the Printer interface from the host, waiting to be read. This indicates the number +			 *  of bytes in the OUT endpoint bank only, and thus the number of calls to \ref PRNT_Device_ReceiveByte() which are guaranteed to +			 *  succeed immediately. If multiple bytes are to be received, they should be buffered by the user application, as the endpoint +			 *  bank will not be released back to the USB controller until all bytes are read. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state. +			 * +			 *  \return Total number of buffered bytes received from the host. +			 */ +			uint16_t PRNT_Device_BytesReceived(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads a byte of data from the host. If no data is waiting to be read of if a USB host is not connected, the function +			 *  returns a negative value. The \ref PRNT_Device_BytesReceived() function may be queried in advance to determine how many +			 *  bytes are currently buffered in the Printer interface's data receive endpoint bank, and thus how many repeated calls to this +			 *  function which are guaranteed to succeed. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state. +			 * +			 *  \return Next received byte from the host, or a negative value if no data received. +			 */ +			int16_t PRNT_Device_ReceiveByte(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Flushes any data waiting to be sent, ensuring that the send buffer is cleared. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state. +			 * +			 *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum. +			 */ +			uint8_t PRNT_Device_Flush(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			#if defined(FDEV_SETUP_STREAM) || defined(__DOXYGEN__) +			/** Creates a standard character stream for the given Printer Device instance so that it can be used with all the regular +			 *  functions in the standard <stdio.h> library that accept a \c FILE stream as a destination (e.g. \c fprintf()). The created +			 *  stream is bidirectional and can be used for both input and output functions. +			 * +			 *  Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single +			 *  fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may +			 *  be used when the read data is processed byte-per-bye (via \c getc()) or when the user application will implement its own +			 *  line buffering. +			 * +			 *  \note The created stream can be given as \c stdout if desired to direct the standard output from all \c <stdio.h> functions +			 *        to the given Printer interface. +			 *        \n\n +			 * +			 *  \note This function is not available on all microcontroller architectures. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state. +			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed. +			 */ +			void PRNT_Device_CreateStream(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo, +			                              FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Identical to \ref PRNT_Device_CreateStream(), except that reads are blocking until the calling stream function terminates +			 *  the transfer. While blocking, the USB and Printer service tasks are called repeatedly to maintain USB communications. +			 * +			 *  \note This function is not available on all microcontroller architectures. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class configuration and state. +			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed. +			 */ +			void PRNT_Device_CreateBlockingStream(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo, +			                                      FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); +			#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_PRINTER_DEVICE_C) +				#if defined(FDEV_SETUP_STREAM) +				static int PRNT_Device_putchar(char c, +				                               FILE* Stream) ATTR_NON_NULL_PTR_ARG(2); +				static int PRNT_Device_getchar(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); +				static int PRNT_Device_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); +				#endif + +				void PRNT_Device_Event_Stub(void) ATTR_CONST; + +				void EVENT_PRNT_Device_SoftReset(USB_ClassInfo_PRNT_Device_t* const PRNTInterfaceInfo) +				                                 ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(PRNT_Device_Event_Stub); + +			#endif + +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c b/lib/lufa/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c new file mode 100644 index 0000000000..45293b12fc --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c @@ -0,0 +1,508 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_DEVICE) + +#define  __INCLUDE_FROM_RNDIS_DRIVER +#define  __INCLUDE_FROM_RNDIS_DEVICE_C +#include "RNDISClassDevice.h" + +static const uint32_t PROGMEM AdapterSupportedOIDList[]  = +	{ +		CPU_TO_LE32(OID_GEN_SUPPORTED_LIST), +		CPU_TO_LE32(OID_GEN_PHYSICAL_MEDIUM), +		CPU_TO_LE32(OID_GEN_HARDWARE_STATUS), +		CPU_TO_LE32(OID_GEN_MEDIA_SUPPORTED), +		CPU_TO_LE32(OID_GEN_MEDIA_IN_USE), +		CPU_TO_LE32(OID_GEN_MAXIMUM_FRAME_SIZE), +		CPU_TO_LE32(OID_GEN_MAXIMUM_TOTAL_SIZE), +		CPU_TO_LE32(OID_GEN_LINK_SPEED), +		CPU_TO_LE32(OID_GEN_TRANSMIT_BLOCK_SIZE), +		CPU_TO_LE32(OID_GEN_RECEIVE_BLOCK_SIZE), +		CPU_TO_LE32(OID_GEN_VENDOR_ID), +		CPU_TO_LE32(OID_GEN_VENDOR_DESCRIPTION), +		CPU_TO_LE32(OID_GEN_CURRENT_PACKET_FILTER), +		CPU_TO_LE32(OID_GEN_MAXIMUM_TOTAL_SIZE), +		CPU_TO_LE32(OID_GEN_MEDIA_CONNECT_STATUS), +		CPU_TO_LE32(OID_GEN_XMIT_OK), +		CPU_TO_LE32(OID_GEN_RCV_OK), +		CPU_TO_LE32(OID_GEN_XMIT_ERROR), +		CPU_TO_LE32(OID_GEN_RCV_ERROR), +		CPU_TO_LE32(OID_GEN_RCV_NO_BUFFER), +		CPU_TO_LE32(OID_802_3_PERMANENT_ADDRESS), +		CPU_TO_LE32(OID_802_3_CURRENT_ADDRESS), +		CPU_TO_LE32(OID_802_3_MULTICAST_LIST), +		CPU_TO_LE32(OID_802_3_MAXIMUM_LIST_SIZE), +		CPU_TO_LE32(OID_802_3_RCV_ERROR_ALIGNMENT), +		CPU_TO_LE32(OID_802_3_XMIT_ONE_COLLISION), +		CPU_TO_LE32(OID_802_3_XMIT_MORE_COLLISIONS), +	}; + +void RNDIS_Device_ProcessControlRequest(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) +{ +	if (!(Endpoint_IsSETUPReceived())) +	  return; + +	if (USB_ControlRequest.wIndex != RNDISInterfaceInfo->Config.ControlInterfaceNumber) +	  return; + +	switch (USB_ControlRequest.bRequest) +	{ +		case RNDIS_REQ_SendEncapsulatedCommand: +			if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				Endpoint_ClearSETUP(); +				Endpoint_Read_Control_Stream_LE(RNDISInterfaceInfo->Config.MessageBuffer, USB_ControlRequest.wLength); +				Endpoint_ClearIN(); + +				RNDIS_Device_ProcessRNDISControlMessage(RNDISInterfaceInfo); +			} + +			break; +		case RNDIS_REQ_GetEncapsulatedResponse: +			if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE)) +			{ +				RNDIS_Message_Header_t* MessageHeader = (RNDIS_Message_Header_t*)RNDISInterfaceInfo->Config.MessageBuffer; + +				if (!(MessageHeader->MessageLength)) +				{ +					RNDISInterfaceInfo->Config.MessageBuffer[0] = 0; +					MessageHeader->MessageLength                = CPU_TO_LE32(1); +				} + +				Endpoint_ClearSETUP(); +				Endpoint_Write_Control_Stream_LE(RNDISInterfaceInfo->Config.MessageBuffer, le32_to_cpu(MessageHeader->MessageLength)); +				Endpoint_ClearOUT(); + +				MessageHeader->MessageLength = CPU_TO_LE32(0); +			} + +			break; +	} +} + +bool RNDIS_Device_ConfigureEndpoints(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) +{ +	memset(&RNDISInterfaceInfo->State, 0x00, sizeof(RNDISInterfaceInfo->State)); + +	RNDISInterfaceInfo->Config.DataINEndpoint.Type       = EP_TYPE_BULK; +	RNDISInterfaceInfo->Config.DataOUTEndpoint.Type      = EP_TYPE_BULK; +	RNDISInterfaceInfo->Config.NotificationEndpoint.Type = EP_TYPE_INTERRUPT; + +	if (RNDISInterfaceInfo->Config.MessageBuffer == NULL) +	  return false; + +	if (RNDISInterfaceInfo->Config.MessageBufferLength < RNDIS_DEVICE_MIN_MESSAGE_BUFFER_LENGTH) +	  return false; + +	if (!(Endpoint_ConfigureEndpointTable(&RNDISInterfaceInfo->Config.DataINEndpoint, 1))) +	  return false; + +	if (!(Endpoint_ConfigureEndpointTable(&RNDISInterfaceInfo->Config.DataOUTEndpoint, 1))) +	  return false; + +	if (!(Endpoint_ConfigureEndpointTable(&RNDISInterfaceInfo->Config.NotificationEndpoint, 1))) +	  return false; + +	return true; +} + +void RNDIS_Device_USBTask(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) +{ +	if (USB_DeviceState != DEVICE_STATE_Configured) +	  return; + +	Endpoint_SelectEndpoint(RNDISInterfaceInfo->Config.NotificationEndpoint.Address); + +	if (Endpoint_IsINReady() && RNDISInterfaceInfo->State.ResponseReady) +	{ +		USB_Request_Header_t Notification = (USB_Request_Header_t) +			{ +				.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE), +				.bRequest      = RNDIS_NOTIF_ResponseAvailable, +				.wValue        = CPU_TO_LE16(0), +				.wIndex        = CPU_TO_LE16(0), +				.wLength       = CPU_TO_LE16(0), +			}; + +		Endpoint_Write_Stream_LE(&Notification, sizeof(USB_Request_Header_t), NULL); + +		Endpoint_ClearIN(); + +		RNDISInterfaceInfo->State.ResponseReady = false; +	} +} + +void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) +{ +	/* Note: Only a single buffer is used for both the received message and its response to save SRAM. Because of +	         this, response bytes should be filled in order so that they do not clobber unread data in the buffer. */ + +	RNDIS_Message_Header_t* MessageHeader = (RNDIS_Message_Header_t*)RNDISInterfaceInfo->Config.MessageBuffer; + +	switch (le32_to_cpu(MessageHeader->MessageType)) +	{ +		case REMOTE_NDIS_INITIALIZE_MSG: +			RNDISInterfaceInfo->State.ResponseReady     = true; + +			RNDIS_Initialize_Message_t*  INITIALIZE_Message  = +			               (RNDIS_Initialize_Message_t*)RNDISInterfaceInfo->Config.MessageBuffer; +			RNDIS_Initialize_Complete_t* INITIALIZE_Response = +			               (RNDIS_Initialize_Complete_t*)RNDISInterfaceInfo->Config.MessageBuffer; + +			INITIALIZE_Response->MessageType            = CPU_TO_LE32(REMOTE_NDIS_INITIALIZE_CMPLT); +			INITIALIZE_Response->MessageLength          = CPU_TO_LE32(sizeof(RNDIS_Initialize_Complete_t)); +			INITIALIZE_Response->RequestId              = INITIALIZE_Message->RequestId; +			INITIALIZE_Response->Status                 = CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS); + +			INITIALIZE_Response->MajorVersion           = CPU_TO_LE32(REMOTE_NDIS_VERSION_MAJOR); +			INITIALIZE_Response->MinorVersion           = CPU_TO_LE32(REMOTE_NDIS_VERSION_MINOR); +			INITIALIZE_Response->DeviceFlags            = CPU_TO_LE32(REMOTE_NDIS_DF_CONNECTIONLESS); +			INITIALIZE_Response->Medium                 = CPU_TO_LE32(REMOTE_NDIS_MEDIUM_802_3); +			INITIALIZE_Response->MaxPacketsPerTransfer  = CPU_TO_LE32(1); +			INITIALIZE_Response->MaxTransferSize        = CPU_TO_LE32(sizeof(RNDIS_Packet_Message_t) + ETHERNET_FRAME_SIZE_MAX); +			INITIALIZE_Response->PacketAlignmentFactor  = CPU_TO_LE32(0); +			INITIALIZE_Response->AFListOffset           = CPU_TO_LE32(0); +			INITIALIZE_Response->AFListSize             = CPU_TO_LE32(0); + +			RNDISInterfaceInfo->State.CurrRNDISState    = RNDIS_Initialized; +			break; +		case REMOTE_NDIS_HALT_MSG: +			RNDISInterfaceInfo->State.ResponseReady     = false; + +			MessageHeader->MessageLength                = CPU_TO_LE32(0); + +			RNDISInterfaceInfo->State.CurrRNDISState    = RNDIS_Uninitialized; +			break; +		case REMOTE_NDIS_QUERY_MSG: +			RNDISInterfaceInfo->State.ResponseReady     = true; + +			RNDIS_Query_Message_t*  QUERY_Message       = (RNDIS_Query_Message_t*)RNDISInterfaceInfo->Config.MessageBuffer; +			RNDIS_Query_Complete_t* QUERY_Response      = (RNDIS_Query_Complete_t*)RNDISInterfaceInfo->Config.MessageBuffer; +			uint32_t                Query_Oid           = CPU_TO_LE32(QUERY_Message->Oid); + +			void*    QueryData    = &RNDISInterfaceInfo->Config.MessageBuffer[sizeof(RNDIS_Message_Header_t) + +			                                                                  le32_to_cpu(QUERY_Message->InformationBufferOffset)]; +			void*    ResponseData = &RNDISInterfaceInfo->Config.MessageBuffer[sizeof(RNDIS_Query_Complete_t)]; +			uint16_t ResponseSize; + +			QUERY_Response->MessageType                 = CPU_TO_LE32(REMOTE_NDIS_QUERY_CMPLT); + +			if (RNDIS_Device_ProcessNDISQuery(RNDISInterfaceInfo, Query_Oid, QueryData, le32_to_cpu(QUERY_Message->InformationBufferLength), +			                                  ResponseData, &ResponseSize)) +			{ +				QUERY_Response->Status                  = CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS); +				QUERY_Response->MessageLength           = cpu_to_le32(sizeof(RNDIS_Query_Complete_t) + ResponseSize); + +				QUERY_Response->InformationBufferLength = CPU_TO_LE32(ResponseSize); +				QUERY_Response->InformationBufferOffset = CPU_TO_LE32(sizeof(RNDIS_Query_Complete_t) - sizeof(RNDIS_Message_Header_t)); +			} +			else +			{ +				QUERY_Response->Status                  = CPU_TO_LE32(REMOTE_NDIS_STATUS_NOT_SUPPORTED); +				QUERY_Response->MessageLength           = CPU_TO_LE32(sizeof(RNDIS_Query_Complete_t)); + +				QUERY_Response->InformationBufferLength = CPU_TO_LE32(0); +				QUERY_Response->InformationBufferOffset = CPU_TO_LE32(0); +			} + +			break; +		case REMOTE_NDIS_SET_MSG: +			RNDISInterfaceInfo->State.ResponseReady     = true; + +			RNDIS_Set_Message_t*  SET_Message           = (RNDIS_Set_Message_t*)RNDISInterfaceInfo->Config.MessageBuffer; +			RNDIS_Set_Complete_t* SET_Response          = (RNDIS_Set_Complete_t*)RNDISInterfaceInfo->Config.MessageBuffer; +			uint32_t              SET_Oid               = le32_to_cpu(SET_Message->Oid); + +			SET_Response->MessageType                   = CPU_TO_LE32(REMOTE_NDIS_SET_CMPLT); +			SET_Response->MessageLength                 = CPU_TO_LE32(sizeof(RNDIS_Set_Complete_t)); +			SET_Response->RequestId                     = SET_Message->RequestId; + +			void* SetData = &RNDISInterfaceInfo->Config.MessageBuffer[sizeof(RNDIS_Message_Header_t) + +			                                                              le32_to_cpu(SET_Message->InformationBufferOffset)]; + +			SET_Response->Status = RNDIS_Device_ProcessNDISSet(RNDISInterfaceInfo, SET_Oid, SetData, +			                                                   le32_to_cpu(SET_Message->InformationBufferLength)) ? +			                                                   REMOTE_NDIS_STATUS_SUCCESS : REMOTE_NDIS_STATUS_NOT_SUPPORTED; +			break; +		case REMOTE_NDIS_RESET_MSG: +			RNDISInterfaceInfo->State.ResponseReady     = true; + +			RNDIS_Reset_Complete_t* RESET_Response      = (RNDIS_Reset_Complete_t*)RNDISInterfaceInfo->Config.MessageBuffer; + +			RESET_Response->MessageType                 = CPU_TO_LE32(REMOTE_NDIS_RESET_CMPLT); +			RESET_Response->MessageLength               = CPU_TO_LE32(sizeof(RNDIS_Reset_Complete_t)); +			RESET_Response->Status                      = CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS); +			RESET_Response->AddressingReset             = CPU_TO_LE32(0); + +			break; +		case REMOTE_NDIS_KEEPALIVE_MSG: +			RNDISInterfaceInfo->State.ResponseReady     = true; + +			RNDIS_KeepAlive_Message_t*  KEEPALIVE_Message  = +			                (RNDIS_KeepAlive_Message_t*)RNDISInterfaceInfo->Config.MessageBuffer; +			RNDIS_KeepAlive_Complete_t* KEEPALIVE_Response = +			                (RNDIS_KeepAlive_Complete_t*)RNDISInterfaceInfo->Config.MessageBuffer; + +			KEEPALIVE_Response->MessageType             = CPU_TO_LE32(REMOTE_NDIS_KEEPALIVE_CMPLT); +			KEEPALIVE_Response->MessageLength           = CPU_TO_LE32(sizeof(RNDIS_KeepAlive_Complete_t)); +			KEEPALIVE_Response->RequestId               = KEEPALIVE_Message->RequestId; +			KEEPALIVE_Response->Status                  = CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS); + +			break; +	} +} + +static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, +                                          const uint32_t OId, +                                          void* const QueryData, +                                          const uint16_t QuerySize, +                                          void* ResponseData, +                                          uint16_t* const ResponseSize) +{ +	(void)QueryData; +	(void)QuerySize; + +	switch (OId) +	{ +		case OID_GEN_SUPPORTED_LIST: +			*ResponseSize = sizeof(AdapterSupportedOIDList); + +			memcpy_P(ResponseData, AdapterSupportedOIDList, sizeof(AdapterSupportedOIDList)); + +			return true; +		case OID_GEN_PHYSICAL_MEDIUM: +			*ResponseSize = sizeof(uint32_t); + +			/* Indicate that the device is a true ethernet link */ +			*((uint32_t*)ResponseData) = CPU_TO_LE32(0); + +			return true; +		case OID_GEN_HARDWARE_STATUS: +			*ResponseSize = sizeof(uint32_t); + +			*((uint32_t*)ResponseData) = CPU_TO_LE32(NDIS_HardwareStatus_Ready); + +			return true; +		case OID_GEN_MEDIA_SUPPORTED: +		case OID_GEN_MEDIA_IN_USE: +			*ResponseSize = sizeof(uint32_t); + +			*((uint32_t*)ResponseData) = CPU_TO_LE32(REMOTE_NDIS_MEDIUM_802_3); + +			return true; +		case OID_GEN_VENDOR_ID: +			*ResponseSize = sizeof(uint32_t); + +			/* Vendor ID 0x0xFFFFFF is reserved for vendors who have not purchased a NDIS VID */ +			*((uint32_t*)ResponseData) = CPU_TO_LE32(0x00FFFFFF); + +			return true; +		case OID_GEN_MAXIMUM_FRAME_SIZE: +		case OID_GEN_TRANSMIT_BLOCK_SIZE: +		case OID_GEN_RECEIVE_BLOCK_SIZE: +			*ResponseSize = sizeof(uint32_t); + +			*((uint32_t*)ResponseData) = CPU_TO_LE32(ETHERNET_FRAME_SIZE_MAX); + +			return true; +		case OID_GEN_VENDOR_DESCRIPTION: +			*ResponseSize = (strlen(RNDISInterfaceInfo->Config.AdapterVendorDescription) + 1); + +			memcpy(ResponseData, RNDISInterfaceInfo->Config.AdapterVendorDescription, *ResponseSize); + +			return true; +		case OID_GEN_MEDIA_CONNECT_STATUS: +			*ResponseSize = sizeof(uint32_t); + +			*((uint32_t*)ResponseData) = CPU_TO_LE32(REMOTE_NDIS_MEDIA_STATE_CONNECTED); + +			return true; +		case OID_GEN_LINK_SPEED: +			*ResponseSize = sizeof(uint32_t); + +			/* Indicate 10Mb/s link speed */ +			*((uint32_t*)ResponseData) = CPU_TO_LE32(100000); + +			return true; +		case OID_802_3_PERMANENT_ADDRESS: +		case OID_802_3_CURRENT_ADDRESS: +			*ResponseSize = sizeof(MAC_Address_t); + +			memcpy(ResponseData, &RNDISInterfaceInfo->Config.AdapterMACAddress, sizeof(MAC_Address_t)); + +			return true; +		case OID_802_3_MAXIMUM_LIST_SIZE: +			*ResponseSize = sizeof(uint32_t); + +			/* Indicate only one multicast address supported */ +			*((uint32_t*)ResponseData) = CPU_TO_LE32(1); + +			return true; +		case OID_GEN_CURRENT_PACKET_FILTER: +			*ResponseSize = sizeof(uint32_t); + +			*((uint32_t*)ResponseData) = cpu_to_le32(RNDISInterfaceInfo->State.CurrPacketFilter); + +			return true; +		case OID_GEN_XMIT_OK: +		case OID_GEN_RCV_OK: +		case OID_GEN_XMIT_ERROR: +		case OID_GEN_RCV_ERROR: +		case OID_GEN_RCV_NO_BUFFER: +		case OID_802_3_RCV_ERROR_ALIGNMENT: +		case OID_802_3_XMIT_ONE_COLLISION: +		case OID_802_3_XMIT_MORE_COLLISIONS: +			*ResponseSize = sizeof(uint32_t); + +			/* Unused statistic OIDs - always return 0 for each */ +			*((uint32_t*)ResponseData) = CPU_TO_LE32(0); + +			return true; +		case OID_GEN_MAXIMUM_TOTAL_SIZE: +			*ResponseSize = sizeof(uint32_t); + +			/* Indicate maximum overall buffer (Ethernet frame and RNDIS header) the adapter can handle */ +			*((uint32_t*)ResponseData) = CPU_TO_LE32(RNDISInterfaceInfo->Config.MessageBufferLength + ETHERNET_FRAME_SIZE_MAX); + +			return true; +		default: +			return false; +	} +} + +static bool RNDIS_Device_ProcessNDISSet(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, +                                        const uint32_t OId, +                                        const void* SetData, +                                        const uint16_t SetSize) +{ +	(void)SetSize; + +	switch (OId) +	{ +		case OID_GEN_CURRENT_PACKET_FILTER: +			RNDISInterfaceInfo->State.CurrPacketFilter = le32_to_cpu(*((uint32_t*)SetData)); +			RNDISInterfaceInfo->State.CurrRNDISState   = (RNDISInterfaceInfo->State.CurrPacketFilter) ? RNDIS_Data_Initialized : RNDIS_Initialized; + +			return true; +		case OID_802_3_MULTICAST_LIST: +			/* Do nothing - throw away the value from the host as it is unused */ + +			return true; +		default: +			return false; +	} +} + +bool RNDIS_Device_IsPacketReceived(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) +{ +	if ((USB_DeviceState != DEVICE_STATE_Configured) || +	    (RNDISInterfaceInfo->State.CurrRNDISState != RNDIS_Data_Initialized)) +	{ +		return false; +	} + +	Endpoint_SelectEndpoint(RNDISInterfaceInfo->Config.DataOUTEndpoint.Address); +	return Endpoint_IsOUTReceived(); +} + +uint8_t RNDIS_Device_ReadPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, +                                void* Buffer, +                                uint16_t* const PacketLength) +{ +	if ((USB_DeviceState != DEVICE_STATE_Configured) || +	    (RNDISInterfaceInfo->State.CurrRNDISState != RNDIS_Data_Initialized)) +	{ +		return ENDPOINT_RWSTREAM_DeviceDisconnected; +	} + +	Endpoint_SelectEndpoint(RNDISInterfaceInfo->Config.DataOUTEndpoint.Address); + +	*PacketLength = 0; + +	if (!(Endpoint_IsOUTReceived())) +		return ENDPOINT_RWSTREAM_NoError; + +	RNDIS_Packet_Message_t RNDISPacketHeader; +	Endpoint_Read_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_Packet_Message_t), NULL); + +	if (le32_to_cpu(RNDISPacketHeader.DataLength) > ETHERNET_FRAME_SIZE_MAX) +	{ +		Endpoint_StallTransaction(); + +		return RNDIS_ERROR_LOGICAL_CMD_FAILED; +	} + +	*PacketLength = (uint16_t)le32_to_cpu(RNDISPacketHeader.DataLength); + +	Endpoint_Read_Stream_LE(Buffer, *PacketLength, NULL); +	Endpoint_ClearOUT(); + +	return ENDPOINT_RWSTREAM_NoError; +} + +uint8_t RNDIS_Device_SendPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, +                                void* Buffer, +                                const uint16_t PacketLength) +{ +	uint8_t ErrorCode; + +	if ((USB_DeviceState != DEVICE_STATE_Configured) || +	    (RNDISInterfaceInfo->State.CurrRNDISState != RNDIS_Data_Initialized)) +	{ +		return ENDPOINT_RWSTREAM_DeviceDisconnected; +	} + +	Endpoint_SelectEndpoint(RNDISInterfaceInfo->Config.DataINEndpoint.Address); + +	if ((ErrorCode = Endpoint_WaitUntilReady()) != ENDPOINT_READYWAIT_NoError) +	  return ErrorCode; + +	RNDIS_Packet_Message_t RNDISPacketHeader; + +	memset(&RNDISPacketHeader, 0, sizeof(RNDIS_Packet_Message_t)); + +	RNDISPacketHeader.MessageType   = CPU_TO_LE32(REMOTE_NDIS_PACKET_MSG); +	RNDISPacketHeader.MessageLength = cpu_to_le32(sizeof(RNDIS_Packet_Message_t) + PacketLength); +	RNDISPacketHeader.DataOffset    = CPU_TO_LE32(sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t)); +	RNDISPacketHeader.DataLength    = cpu_to_le32(PacketLength); + +	Endpoint_Write_Stream_LE(&RNDISPacketHeader, sizeof(RNDIS_Packet_Message_t), NULL); +	Endpoint_Write_Stream_LE(Buffer, PacketLength, NULL); +	Endpoint_ClearIN(); + +	return ENDPOINT_RWSTREAM_NoError; +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.h b/lib/lufa/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.h new file mode 100644 index 0000000000..761bc2790f --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Device/RNDISClassDevice.h @@ -0,0 +1,207 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Device mode driver for the library USB RNDIS Class driver. + * + *  Device mode driver for the library USB RNDIS Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassRNDIS + *  \defgroup Group_USBClassRNDISDevice RNDIS Class Device Mode Driver + * + *  \section Sec_USBClassRNDISDevice_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassRNDISDevice_ModDescription Module Description + *  Device Mode USB Class driver framework interface, for the RNDIS USB Class driver. + * + *  @{ + */ + +#ifndef _RNDIS_CLASS_DEVICE_H_ +#define _RNDIS_CLASS_DEVICE_H_ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/RNDISClassCommon.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_RNDIS_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Type Defines: */ +			/** \brief RNDIS Class Device Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made for each RNDIS interface +			 *  within the user application, and passed to each of the RNDIS class driver functions as the +			 *  \c RNDISInterfaceInfo parameter. This stores each RNDIS interface's configuration and state information. +			 */ +			typedef struct +			{ +				struct +				{ +					uint8_t  ControlInterfaceNumber; /**< Interface number of the RNDIS control interface within the device. */ + +					USB_Endpoint_Table_t DataINEndpoint; /**< Data IN endpoint configuration table. */ +					USB_Endpoint_Table_t DataOUTEndpoint; /**< Data OUT endpoint configuration table. */ +					USB_Endpoint_Table_t NotificationEndpoint; /**< Notification IN Endpoint configuration table. */ + +					char*         AdapterVendorDescription; /**< String description of the adapter vendor. */ +					MAC_Address_t AdapterMACAddress; /**< MAC address of the adapter. */ + +					uint8_t*      MessageBuffer; /**< Buffer where RNDIS messages can be stored by the internal driver. This +					                              *   should be at least 132 bytes in length for minimal functionality. */ +					uint16_t      MessageBufferLength; /**< Length in bytes of the \ref MessageBuffer RNDIS buffer. */ +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ +				struct +				{ +					bool     ResponseReady; /**< Internal flag indicating if a RNDIS message is waiting to be returned to the host. */ +					uint8_t  CurrRNDISState; /**< Current RNDIS state of the adapter, a value from the \ref RNDIS_States_t enum. */ +					uint32_t CurrPacketFilter; /**< Current packet filter mode, used internally by the class driver. */ +				} State; /**< State data for the USB class interface within the device. All elements in this section +				          *   are reset to their defaults when the interface is enumerated. +				          */ +			} USB_ClassInfo_RNDIS_Device_t; + +		/* Function Prototypes: */ +			/** Configures the endpoints of a given RNDIS interface, ready for use. This should be linked to the library +			 *  \ref EVENT_USB_Device_ConfigurationChanged() event so that the endpoints are configured when the configuration +			 *  containing the given RNDIS interface is selected. +			 * +			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing a RNDIS Class configuration and state. +			 * +			 *  \return Boolean \c true if the endpoints were successfully configured, \c false otherwise. +			 */ +			bool RNDIS_Device_ConfigureEndpoints(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Processes incoming control requests from the host, that are directed to the given RNDIS class interface. This should be +			 *  linked to the library \ref EVENT_USB_Device_ControlRequest() event. +			 * +			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing a RNDIS Class configuration and state. +			 */ +			void RNDIS_Device_ProcessControlRequest(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** General management task for a given RNDIS class interface, required for the correct operation of the interface. This should +			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). +			 * +			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing a RNDIS Class configuration and state. +			 */ +			void RNDIS_Device_USBTask(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Determines if a packet is currently waiting for the device to read in and process. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class configuration and state. +			 * +			 *  \return Boolean \c true if a packet is waiting to be read in by the host, \c false otherwise. +			 */ +			bool RNDIS_Device_IsPacketReceived(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Retrieves the next pending packet from the device, discarding the remainder of the RNDIS packet header to leave +			 *  only the packet contents for processing by the device in the nominated buffer. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class configuration and state. +			 *  \param[out]    Buffer              Pointer to a buffer where the packer data is to be written to. +			 *  \param[out]    PacketLength        Pointer to where the length in bytes of the read packet is to be stored. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t RNDIS_Device_ReadPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, +											void* Buffer, +											uint16_t* const PacketLength) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends the given packet to the attached RNDIS device, after adding a RNDIS packet message header. +			 * +			 *  \pre This function must only be called when the Device state machine is in the \ref DEVICE_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class configuration and state. +			 *  \param[in]     Buffer              Pointer to a buffer where the packer data is to be read from. +			 *  \param[in]     PacketLength        Length in bytes of the packet to send. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t RNDIS_Device_SendPacket(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, +											void* Buffer, +											const uint16_t PacketLength) ATTR_NON_NULL_PTR_ARG(1); + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#define RNDIS_DEVICE_MIN_MESSAGE_BUFFER_LENGTH  sizeof(AdapterSupportedOIDList) + sizeof(RNDIS_Query_Complete_t) + +		/* Function Prototypes: */ +		#if defined(__INCLUDE_FROM_RNDIS_DEVICE_C) +			static void RNDIS_Device_ProcessRNDISControlMessage(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo) +			                                                    ATTR_NON_NULL_PTR_ARG(1); +			static bool RNDIS_Device_ProcessNDISQuery(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, +			                                          const uint32_t OId, +                                                      void* const QueryData, +                                                      const uint16_t QuerySize, +										              void* ResponseData, +                                                      uint16_t* const ResponseSize) ATTR_NON_NULL_PTR_ARG(1) +			                                          ATTR_NON_NULL_PTR_ARG(5) ATTR_NON_NULL_PTR_ARG(6); +			static bool RNDIS_Device_ProcessNDISSet(USB_ClassInfo_RNDIS_Device_t* const RNDISInterfaceInfo, +                                                    const uint32_t OId, +			                                        const void* SetData, +                                                    const uint16_t SetSize) ATTR_NON_NULL_PTR_ARG(1) +			                                        ATTR_NON_NULL_PTR_ARG(3); +		#endif + +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/HIDClass.h b/lib/lufa/LUFA/Drivers/USB/Class/HIDClass.h new file mode 100644 index 0000000000..158eb256b6 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/HIDClass.h @@ -0,0 +1,82 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Master include file for the library USB HID Class driver. + * + *  Master include file for the library USB HID Class driver, for both host and device modes, where available. + * + *  This file should be included in all user projects making use of this optional class driver, instead of + *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories. + */ + +/** \ingroup Group_USBClassDrivers + *  \defgroup Group_USBClassHID HID Class Driver + *  \brief USB class driver for the USB-IF Human Interface Device (HID) class standard. + * + *  \section Sec_USBClassHID_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Device/HIDClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + *    - LUFA/Drivers/USB/Class/Host/HIDClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + *    - LUFA/Drivers/USB/Class/Host/HIDParser.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + * + *  \section Sec_USBClassHID_ModDescription Module Description + *  HID Class Driver module. This module contains an internal implementation of the USB HID Class, for both Device + *  and Host USB modes. User applications can use this class driver instead of implementing the HID class manually + *  via the low-level LUFA APIs. + * + *  This module is designed to simplify the user code by exposing only the required interface needed to interface with + *  Hosts or Devices using the USB HID Class. + * + *  @{ + */ + +#ifndef _HID_CLASS_H_ +#define _HID_CLASS_H_ + +	/* Macros: */ +		#define __INCLUDE_FROM_USB_DRIVER +		#define __INCLUDE_FROM_HID_DRIVER + +	/* Includes: */ +		#include "../Core/USBMode.h" + +		#if defined(USB_CAN_BE_DEVICE) +			#include "Device/HIDClassDevice.h" +		#endif + +		#if defined(USB_CAN_BE_HOST) +			#include "Host/HIDClassHost.h" +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c new file mode 100644 index 0000000000..ea89033668 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c @@ -0,0 +1,422 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_HOST) + +#define  __INCLUDE_FROM_AOA_DRIVER +#define  __INCLUDE_FROM_ANDROIDACCESSORY_HOST_C +#include "AndroidAccessoryClassHost.h" + +bool AOA_Host_ValidateAccessoryDevice(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +                                      const USB_Descriptor_Device_t* const DeviceDescriptor, +                                      bool* const NeedModeSwitch) +{ +	(void)AOAInterfaceInfo; + +	if (DeviceDescriptor->Header.Type != DTYPE_Device) +	  return false; + +	*NeedModeSwitch = ((DeviceDescriptor->ProductID != ANDROID_ACCESSORY_PRODUCT_ID) && +	                   (DeviceDescriptor->ProductID != ANDROID_ACCESSORY_ADB_PRODUCT_ID)); + +	return true; +} + +uint8_t AOA_Host_ConfigurePipes(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +                                uint16_t ConfigDescriptorSize, +                                void* ConfigDescriptorData) +{ +	USB_Descriptor_Endpoint_t*  DataINEndpoint  = NULL; +	USB_Descriptor_Endpoint_t*  DataOUTEndpoint = NULL; +	USB_Descriptor_Interface_t* AOAInterface    = NULL; + +	memset(&AOAInterfaceInfo->State, 0x00, sizeof(AOAInterfaceInfo->State)); + +	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration) +	  return AOA_ENUMERROR_InvalidConfigDescriptor; + +	if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +	                              DCOMP_AOA_Host_NextAndroidAccessoryInterface) != DESCRIPTOR_SEARCH_COMP_Found) +	{ +		return AOA_ENUMERROR_NoCompatibleInterfaceFound; +	} + +	AOAInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t); + +	while (!(DataINEndpoint) || !(DataOUTEndpoint)) +	{ +		if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +		                              DCOMP_AOA_Host_NextInterfaceBulkEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) +		{ +			return AOA_ENUMERROR_NoCompatibleInterfaceFound; +		} + +		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t); + +		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN) +		  DataINEndpoint  = EndpointData; +		else +		  DataOUTEndpoint = EndpointData; +	} + +	AOAInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize); +	AOAInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress; +	AOAInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_BULK; + +	AOAInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize); +	AOAInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress; +	AOAInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_BULK; + +	if (!(Pipe_ConfigurePipeTable(&AOAInterfaceInfo->Config.DataINPipe, 1))) +	  return AOA_ENUMERROR_PipeConfigurationFailed; + +	if (!(Pipe_ConfigurePipeTable(&AOAInterfaceInfo->Config.DataOUTPipe, 1))) +	  return AOA_ENUMERROR_PipeConfigurationFailed; + +	AOAInterfaceInfo->State.IsActive        = true; +	AOAInterfaceInfo->State.InterfaceNumber = AOAInterface->InterfaceNumber; + +	return AOA_ENUMERROR_NoError; +} + +static uint8_t DCOMP_AOA_Host_NextAndroidAccessoryInterface(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Interface) +	{ +		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); + +		if ((Interface->Class    == AOA_CSCP_AOADataClass)    && +		    (Interface->SubClass == AOA_CSCP_AOADataSubclass) && +		    (Interface->Protocol == AOA_CSCP_AOADataProtocol)) +		{ +			return DESCRIPTOR_SEARCH_Found; +		} +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +static uint8_t DCOMP_AOA_Host_NextInterfaceBulkEndpoint(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Endpoint) +	{ +		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); + +		uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK); + +		if ((EndpointType == EP_TYPE_BULK) && (!(Pipe_IsEndpointBound(Endpoint->EndpointAddress)))) +		  return DESCRIPTOR_SEARCH_Found; +	} +	else if (Header->Type == DTYPE_Interface) +	{ +		return DESCRIPTOR_SEARCH_Fail; +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +void AOA_Host_USBTask(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(AOAInterfaceInfo->State.IsActive)) +	  return; + +	#if !defined(NO_CLASS_DRIVER_AUTOFLUSH) +	AOA_Host_Flush(AOAInterfaceInfo); +	#endif +} + +uint8_t AOA_Host_StartAccessoryMode(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo) +{ +	uint8_t ErrorCode; + +	uint16_t AccessoryProtocol; +	if ((ErrorCode = AOA_Host_GetAccessoryProtocol(&AccessoryProtocol)) != HOST_WAITERROR_Successful) +	  return ErrorCode; + +	if ((AccessoryProtocol != CPU_TO_LE16(AOA_PROTOCOL_AccessoryV1)) && (AccessoryProtocol != CPU_TO_LE16(AOA_PROTOCOL_AccessoryV2))) +	  return AOA_ERROR_LOGICAL_CMD_FAILED; + +	for (uint8_t PropertyIndex = 0; PropertyIndex < AOA_STRING_TOTAL_STRINGS; PropertyIndex++) +	{ +		if ((ErrorCode = AOA_Host_SendPropertyString(AOAInterfaceInfo, PropertyIndex)) != HOST_WAITERROR_Successful) +		  return ErrorCode; +	} + +	USB_ControlRequest = (USB_Request_Header_t) +	{ +		.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR | REQREC_DEVICE), +		.bRequest      = AOA_REQ_StartAccessoryMode, +		.wValue        = 0, +		.wIndex        = 0, +		.wLength       = 0, +	}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); +	return USB_Host_SendControlRequest(NULL); +} + +static uint8_t AOA_Host_GetAccessoryProtocol(uint16_t* const Protocol) +{ +	USB_ControlRequest = (USB_Request_Header_t) +	{ +		.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_VENDOR | REQREC_DEVICE), +		.bRequest      = AOA_REQ_GetAccessoryProtocol, +		.wValue        = 0, +		.wIndex        = 0, +		.wLength       = sizeof(uint16_t), +	}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); +	return USB_Host_SendControlRequest(Protocol); +} + +static uint8_t AOA_Host_SendPropertyString(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +                                           const uint8_t StringIndex) +{ +	const char* String = AOAInterfaceInfo->Config.PropertyStrings[StringIndex]; + +	if (String == NULL) +	  String = ""; + +	USB_ControlRequest = (USB_Request_Header_t) +	{ +		.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR | REQREC_DEVICE), +		.bRequest      = AOA_REQ_SendString, +		.wValue        = 0, +		.wIndex        = StringIndex, +		.wLength       = (strlen(String) + 1), +	}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); +	return USB_Host_SendControlRequest((char*)String); +} + +uint8_t AOA_Host_SendData(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +                          const void* const Buffer, +                          const uint16_t Length) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(AOAInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Pipe_SelectPipe(AOAInterfaceInfo->Config.DataOUTPipe.Address); + +	Pipe_Unfreeze(); +	ErrorCode = Pipe_Write_Stream_LE(Buffer, Length, NULL); +	Pipe_Freeze(); + +	return ErrorCode; +} + +uint8_t AOA_Host_SendString(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +                            const char* const String) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(AOAInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Pipe_SelectPipe(AOAInterfaceInfo->Config.DataOUTPipe.Address); + +	Pipe_Unfreeze(); +	ErrorCode = Pipe_Write_Stream_LE(String, strlen(String), NULL); +	Pipe_Freeze(); + +	return ErrorCode; +} + +uint8_t AOA_Host_SendByte(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +                          const uint8_t Data) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(AOAInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Pipe_SelectPipe(AOAInterfaceInfo->Config.DataOUTPipe.Address); +	Pipe_Unfreeze(); + +	if (!(Pipe_IsReadWriteAllowed())) +	{ +		Pipe_ClearOUT(); + +		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError) +		  return ErrorCode; +	} + +	Pipe_Write_8(Data); +	Pipe_Freeze(); + +	return PIPE_READYWAIT_NoError; +} + +uint16_t AOA_Host_BytesReceived(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(AOAInterfaceInfo->State.IsActive)) +	  return 0; + +	Pipe_SelectPipe(AOAInterfaceInfo->Config.DataINPipe.Address); +	Pipe_Unfreeze(); + +	if (Pipe_IsINReceived()) +	{ +		if (!(Pipe_BytesInPipe())) +		{ +			Pipe_ClearIN(); +			Pipe_Freeze(); +			return 0; +		} +		else +		{ +			Pipe_Freeze(); +			return Pipe_BytesInPipe(); +		} +	} +	else +	{ +		Pipe_Freeze(); + +		return 0; +	} +} + +int16_t AOA_Host_ReceiveByte(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(AOAInterfaceInfo->State.IsActive)) +	  return -1; + +	int16_t ReceivedByte = -1; + +	Pipe_SelectPipe(AOAInterfaceInfo->Config.DataINPipe.Address); +	Pipe_Unfreeze(); + +	if (Pipe_IsINReceived()) +	{ +		if (Pipe_BytesInPipe()) +		  ReceivedByte = Pipe_Read_8(); + +		if (!(Pipe_BytesInPipe())) +		  Pipe_ClearIN(); +	} + +	Pipe_Freeze(); + +	return ReceivedByte; +} + +uint8_t AOA_Host_Flush(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(AOAInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Pipe_SelectPipe(AOAInterfaceInfo->Config.DataOUTPipe.Address); +	Pipe_Unfreeze(); + +	if (!(Pipe_BytesInPipe())) +	  return PIPE_READYWAIT_NoError; + +	bool BankFull = !(Pipe_IsReadWriteAllowed()); + +	Pipe_ClearOUT(); + +	if (BankFull) +	{ +		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError) +		  return ErrorCode; + +		Pipe_ClearOUT(); +	} + +	Pipe_Freeze(); + +	return PIPE_READYWAIT_NoError; +} + +#if defined(FDEV_SETUP_STREAM) +void AOA_Host_CreateStream(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +                           FILE* const Stream) +{ +	*Stream = (FILE)FDEV_SETUP_STREAM(AOA_Host_putchar, AOA_Host_getchar, _FDEV_SETUP_RW); +	fdev_set_udata(Stream, AOAInterfaceInfo); +} + +void AOA_Host_CreateBlockingStream(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +                                   FILE* const Stream) +{ +	*Stream = (FILE)FDEV_SETUP_STREAM(AOA_Host_putchar, AOA_Host_getchar_Blocking, _FDEV_SETUP_RW); +	fdev_set_udata(Stream, AOAInterfaceInfo); +} + +static int AOA_Host_putchar(char c, +                            FILE* Stream) +{ +	return AOA_Host_SendByte((USB_ClassInfo_AOA_Host_t*)fdev_get_udata(Stream), c) ? _FDEV_ERR : 0; +} + +static int AOA_Host_getchar(FILE* Stream) +{ +	int16_t ReceivedByte = AOA_Host_ReceiveByte((USB_ClassInfo_AOA_Host_t*)fdev_get_udata(Stream)); + +	if (ReceivedByte < 0) +	  return _FDEV_EOF; + +	return ReceivedByte; +} + +static int AOA_Host_getchar_Blocking(FILE* Stream) +{ +	int16_t ReceivedByte; + +	while ((ReceivedByte = AOA_Host_ReceiveByte((USB_ClassInfo_AOA_Host_t*)fdev_get_udata(Stream))) < 0) +	{ +		if (USB_HostState == HOST_STATE_Unattached) +		  return _FDEV_EOF; + +		AOA_Host_USBTask((USB_ClassInfo_AOA_Host_t*)fdev_get_udata(Stream)); +		USB_USBTask(); +	} + +	return ReceivedByte; +} +#endif + +#endif + + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.h new file mode 100644 index 0000000000..f4f04e445a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.h @@ -0,0 +1,314 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Host mode driver for the library USB Android Open Accessory Class driver. + * + *  Host mode driver for the library USB Android Open Accessory Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassAOA + *  \defgroup Group_USBClassAndroidAccessoryHost Android Open Accessory Class Host Mode Driver + * + *  \section Sec_USBClassAndroidAccessoryHost_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Host/AndroidAccessoryClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassAndroidAccessoryHost_ModDescription Module Description + *  Host Mode USB Class driver framework interface, for the Android Open Accessory USB Class driver. + * + *  @{ + */ + +#ifndef __AOA_CLASS_HOST_H__ +#define __AOA_CLASS_HOST_H__ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/AndroidAccessoryClassCommon.h" + +		#include <stdio.h> + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_AOA_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Error code for some Android Open Accessory Host functions, indicating a logical (and not hardware) error. */ +			#define AOA_ERROR_LOGICAL_CMD_FAILED              0x80 + +		/* Type Defines: */ +			/** \brief Android Open Accessory Class Host Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made within the user application, +			 *  and passed to each of the Android Open Accessory class driver functions as the \c AOAInterfaceInfo +			 *  parameter. This stores each Android Open Accessory interface's configuration and state information. +			 */ +			typedef struct +			{ +				struct +				{ +					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */ +					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */ + +					char*    PropertyStrings[AOA_STRING_TOTAL_STRINGS]; /**< Android Accessory property strings, sent to identify the accessory when the +					                                                     *   Android device is switched into Open Accessory mode. */ +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ +				struct +				{ +					bool IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid +					                *   after \ref AOA_Host_ConfigurePipes() is called and the Host state machine is in the +					                *   Configured state. +					                */ +					uint8_t  InterfaceNumber; /**< Interface index of the AOA interface within the attached device. */ +				} State; /**< State data for the USB class interface within the device. All elements in this section +						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when +						  *   the interface is enumerated. +						  */ +			} USB_ClassInfo_AOA_Host_t; + +		/* Enums: */ +			/** Enum for the possible error codes returned by the \ref AOA_Host_ConfigurePipes() function. */ +			enum AOA_Host_EnumerationFailure_ErrorCodes_t +			{ +				AOA_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */ +				AOA_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */ +				AOA_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible Android Open Accessory interface was not found in the device's Configuration Descriptor. */ +				AOA_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ +			}; + +		/* Function Prototypes: */ +			/** General management task for a given Android Open Accessory host class interface, required for the correct operation of the interface. +			 *  This should be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). +			 * +			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing an Android Open Accessory Class host configuration and state. +			 */ +			void AOA_Host_USBTask(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Validates a device descriptor, to check if the device is a valid Android device, and if it is currently in Android Open Accessory mode. +			 * +			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing an AOA Class host configuration and state. +			 *  \param[in]     DeviceDescriptor  Pointer a buffer containing the attached device's Device Descriptor. +			 *  \param[out]    NeedModeSwitch    Pointer to a boolean where the mode switch requirement of the attached device is to be stored. +			 * +			 *  \return Boolean \c true if the attached device is a valid Android device, \c false otherwise. +			 */ +			bool AOA_Host_ValidateAccessoryDevice(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +                                                  const USB_Descriptor_Device_t* const DeviceDescriptor, +			                                      bool* const NeedModeSwitch) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(3); + +			/** Host interface configuration routine, to configure a given Android Open Accessory host interface instance using the Configuration +			 *  Descriptor read from an attached USB device. This function automatically updates the given Android Open Accessory Host instance's +			 *  state values and configures the pipes required to communicate with the interface if it is found within the device. This should be +			 *  called once after the stack has enumerated the attached device, while the host state machine is in the Addressed state. +			 * +			 *  \param[in,out] AOAInterfaceInfo      Pointer to a structure containing an AOA Class host configuration and state. +			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor. +			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor. +			 * +			 *  \return A value from the \ref AOA_Host_EnumerationFailure_ErrorCodes_t enum. +			 */ +			uint8_t AOA_Host_ConfigurePipes(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +			                                uint16_t ConfigDescriptorSize, +			                                void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); + +			/** Starts Accessory Mode in the attached Android device. This function will validate the device's Android Open Accessory protocol +			 *  version, send the configured property strings, and request a switch to Android Open Accessory mode. +			 * +			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing an AOA Class host configuration and state. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum, or \ref AOA_ERROR_LOGICAL_CMD_FAILED if a logical error occurred.. +			 */ +			uint8_t AOA_Host_StartAccessoryMode(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a given data buffer to the attached USB device, if connected. If a device is not connected when the function is +			 *  called, the data will be discarded. Bytes will be queued for transmission to the device until either the pipe bank +			 *  becomes full, or the \ref AOA_Host_Flush() function is called to flush the pending data to the device. This allows for +			 *  multiple bytes to be packed into a single pipe packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class host configuration and state. +			 *  \param[in]     Buffer            Pointer to a buffer containing the data to send to the device. +			 *  \param[in]     Length            Length of the data to send to the device. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t AOA_Host_SendData(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +			                          const void* const Buffer, +			                          const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a given null-terminated string to the attached USB device, if connected. If a device is not connected when the +			 *  function is called, the string is discarded. Bytes will be queued for transmission to the device until either the pipe +			 *  bank becomes full, or the \ref AOA_Host_Flush() function is called to flush the pending data to the device. This allows +			 *  for multiple bytes to be packed into a single pipe packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class host configuration and state. +			 *  \param[in]     String            Pointer to the null terminated string to send to the device. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t AOA_Host_SendString(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +			                            const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Sends a given byte to the attached USB device, if connected. If a device is not connected when the function is called, the +			 *  byte is discarded. Bytes will be queued for transmission to the device until either the pipe bank becomes full, or the +			 *  \ref AOA_Host_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be +			 *  packed into a single pipe packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class host configuration and state. +			 *  \param[in]     Data              Byte of data to send to the device. +			 * +			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum. +			 */ +			uint8_t AOA_Host_SendByte(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +			                          const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1); + +			/** Determines the number of bytes received by the AOA interface from the device, waiting to be read. This indicates the number +			 *  of bytes in the IN pipe bank only, and thus the number of calls to \ref AOA_Host_ReceiveByte() which are guaranteed to succeed +			 *  immediately. If multiple bytes are to be received, they should be buffered by the user application, as the pipe bank will not be +			 *  released back to the USB controller until all bytes are read. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class host configuration and state. +			 * +			 *  \return Total number of buffered bytes received from the device. +			 */ +			uint16_t AOA_Host_BytesReceived(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads a byte of data from the device. If no data is waiting to be read of if a USB device is not connected, the function +			 *  returns a negative value. The \ref AOA_Host_BytesReceived() function may be queried in advance to determine how many bytes +			 *  are currently buffered in the AOA interface's data receive pipe. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class host configuration and state. +			 * +			 *  \return Next received byte from the device, or a negative value if no data received. +			 */ +			int16_t AOA_Host_ReceiveByte(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Flushes any data waiting to be sent, ensuring that the send buffer is cleared. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class host configuration and state. +			 * +			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum. +			 */ +			uint8_t AOA_Host_Flush(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Creates a standard character stream for the given AOA Device instance so that it can be used with all the regular +			 *  functions in the standard \c <stdio.h> library that accept a \c FILE stream as a destination (e.g. \c fprintf). The created +			 *  stream is bidirectional and can be used for both input and output functions. +			 * +			 *  Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single +			 *  fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may +			 *  be used when the read data is processed byte-per-bye (via \c getc()) or when the user application will implement its own +			 *  line buffering. +			 * +			 *  \note The created stream can be given as \c stdout if desired to direct the standard output from all \c <stdio.h> functions +			 *        to the given AOA interface. +			 *        \n\n +			 * +			 *  \note This function is not available on all microcontroller architectures. +			 * +			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class configuration and state. +			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed. +			 */ +			void AOA_Host_CreateStream(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +			                           FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Identical to \ref AOA_Host_CreateStream(), except that reads are blocking until the calling stream function terminates +			 *  the transfer. While blocking, the USB and AOA service tasks are called repeatedly to maintain USB communications. +			 * +			 *  \note This function is not available on all microcontroller architectures. +			 * +			 *  \param[in,out] AOAInterfaceInfo  Pointer to a structure containing a AOA Class configuration and state. +			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed. +			 */ +			void AOA_Host_CreateBlockingStream(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +			                                   FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_ANDROIDACCESSORY_HOST_C) +				#if defined(FDEV_SETUP_STREAM) +				static int AOA_Host_putchar(char c, +				                            FILE* Stream) ATTR_NON_NULL_PTR_ARG(2); +				static int AOA_Host_getchar(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); +				static int AOA_Host_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); +				#endif + +				static uint8_t AOA_Host_GetAccessoryProtocol(uint16_t* const Protocol) ATTR_NON_NULL_PTR_ARG(1); +				static uint8_t AOA_Host_SendPropertyString(USB_ClassInfo_AOA_Host_t* const AOAInterfaceInfo, +			                                               const uint8_t StringIndex) ATTR_NON_NULL_PTR_ARG(1); + +				static uint8_t DCOMP_AOA_Host_NextAndroidAccessoryInterface(void* const CurrentDescriptor) +				                                                            ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +				static uint8_t DCOMP_AOA_Host_NextInterfaceBulkEndpoint(void* const CurrentDescriptor) +				                                                        ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +			#endif +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/AudioClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/AudioClassHost.c new file mode 100644 index 0000000000..9f1a6dc2c8 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/AudioClassHost.c @@ -0,0 +1,223 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_HOST) + +#define  __INCLUDE_FROM_AUDIO_DRIVER +#define  __INCLUDE_FROM_AUDIO_HOST_C +#include "AudioClassHost.h" + +uint8_t Audio_Host_ConfigurePipes(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, +                                  uint16_t ConfigDescriptorSize, +                                  void* ConfigDescriptorData) +{ +	USB_Descriptor_Endpoint_t*  DataINEndpoint          = NULL; +	USB_Descriptor_Endpoint_t*  DataOUTEndpoint         = NULL; +	USB_Descriptor_Interface_t* AudioControlInterface   = NULL; +	USB_Descriptor_Interface_t* AudioStreamingInterface = NULL; + +	memset(&AudioInterfaceInfo->State, 0x00, sizeof(AudioInterfaceInfo->State)); + +	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration) +	  return AUDIO_ENUMERROR_InvalidConfigDescriptor; + +	while ((AudioInterfaceInfo->Config.DataINPipe.Address  && !(DataINEndpoint)) || +	       (AudioInterfaceInfo->Config.DataOUTPipe.Address && !(DataOUTEndpoint))) +	{ +		if (!(AudioControlInterface) || +		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +		                              DCOMP_Audio_Host_NextAudioInterfaceDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) +		{ +			if (!(AudioControlInterface) || +			    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +			                              DCOMP_Audio_Host_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found) +			{ +				if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +				                              DCOMP_Audio_Host_NextAudioControlInterface) != DESCRIPTOR_SEARCH_COMP_Found) +				{ +					return AUDIO_ENUMERROR_NoCompatibleInterfaceFound; +				} + +				AudioControlInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t); + +				if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +				                              DCOMP_Audio_Host_NextAudioStreamInterface) != DESCRIPTOR_SEARCH_COMP_Found) +				{ +					return AUDIO_ENUMERROR_NoCompatibleInterfaceFound; +				} +			} + +			AudioStreamingInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t); + +			DataINEndpoint  = NULL; +			DataOUTEndpoint = NULL; + +			continue; +		} + +		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t); + +		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN) +		  DataINEndpoint  = EndpointData; +		else +		  DataOUTEndpoint = EndpointData; +	} + +	AudioInterfaceInfo->Config.DataINPipe.Size   = le16_to_cpu(DataINEndpoint->EndpointSize); +	AudioInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress; +	AudioInterfaceInfo->Config.DataINPipe.Type   = EP_TYPE_ISOCHRONOUS; +	AudioInterfaceInfo->Config.DataINPipe.Banks  = 2; + +	AudioInterfaceInfo->Config.DataOUTPipe.Size  = le16_to_cpu(DataOUTEndpoint->EndpointSize); +	AudioInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress; +	AudioInterfaceInfo->Config.DataOUTPipe.Type  = EP_TYPE_ISOCHRONOUS; +	AudioInterfaceInfo->Config.DataOUTPipe.Banks = 2; + +	if (!(Pipe_ConfigurePipeTable(&AudioInterfaceInfo->Config.DataINPipe, 1))) +	  return AUDIO_ENUMERROR_PipeConfigurationFailed; + +	if (!(Pipe_ConfigurePipeTable(&AudioInterfaceInfo->Config.DataOUTPipe, 1))) +	  return AUDIO_ENUMERROR_PipeConfigurationFailed; + +	AudioInterfaceInfo->State.ControlInterfaceNumber    = AudioControlInterface->InterfaceNumber; +	AudioInterfaceInfo->State.StreamingInterfaceNumber  = AudioStreamingInterface->InterfaceNumber; +	AudioInterfaceInfo->State.EnabledStreamingAltIndex  = AudioStreamingInterface->AlternateSetting; +	AudioInterfaceInfo->State.IsActive = true; + +	return AUDIO_ENUMERROR_NoError; +} + +static uint8_t DCOMP_Audio_Host_NextAudioControlInterface(void* CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Interface) +	{ +		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); + +		if ((Interface->Class    == AUDIO_CSCP_AudioClass) && +		    (Interface->SubClass == AUDIO_CSCP_ControlSubclass) && +		    (Interface->Protocol == AUDIO_CSCP_ControlProtocol)) +		{ +			return DESCRIPTOR_SEARCH_Found; +		} +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +static uint8_t DCOMP_Audio_Host_NextAudioStreamInterface(void* CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Interface) +	{ +		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); + +		if ((Interface->Class    == AUDIO_CSCP_AudioClass) && +		    (Interface->SubClass == AUDIO_CSCP_AudioStreamingSubclass) && +		    (Interface->Protocol == AUDIO_CSCP_StreamingProtocol)) +		{ +			return DESCRIPTOR_SEARCH_Found; +		} +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +static uint8_t DCOMP_Audio_Host_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Endpoint) +	{ +		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); + +		if ((Endpoint->Attributes & EP_TYPE_MASK) == EP_TYPE_ISOCHRONOUS) +		  return DESCRIPTOR_SEARCH_Found; +	} +	else if (Header->Type == DTYPE_Interface) +	{ +		return DESCRIPTOR_SEARCH_Fail; +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +uint8_t Audio_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, +			                          const bool EnableStreaming) +{ +	if (!(AudioInterfaceInfo->State.IsActive)) +	  return HOST_SENDCONTROL_DeviceDisconnected; + +	return USB_Host_SetInterfaceAltSetting(AudioInterfaceInfo->State.StreamingInterfaceNumber, +	                                       EnableStreaming ? AudioInterfaceInfo->State.EnabledStreamingAltIndex : 0); +} + +uint8_t Audio_Host_GetSetEndpointProperty(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, +			                              const uint8_t DataPipeIndex, +			                              const uint8_t EndpointProperty, +			                              const uint8_t EndpointControl, +			                              const uint16_t DataLength, +			                              void* const Data) +{ +	if (!(AudioInterfaceInfo->State.IsActive)) +	  return HOST_SENDCONTROL_DeviceDisconnected; + +	uint8_t RequestType; +	uint8_t EndpointAddress; + +	if (EndpointProperty & 0x80) +	  RequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_ENDPOINT); +	else +	  RequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_ENDPOINT); + +	Pipe_SelectPipe(DataPipeIndex); +	EndpointAddress = Pipe_GetBoundEndpointAddress(); + +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = RequestType, +			.bRequest      = EndpointProperty, +			.wValue        = ((uint16_t)EndpointControl << 8), +			.wIndex        = EndpointAddress, +			.wLength       = DataLength, +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	return USB_Host_SendControlRequest(Data); +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/AudioClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/AudioClassHost.h new file mode 100644 index 0000000000..f1f4207f19 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/AudioClassHost.h @@ -0,0 +1,411 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Host mode driver for the library USB Audio 1.0 Class driver. + * + *  Host mode driver for the library USB Audio 1.0 Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassAudio + *  \defgroup Group_USBClassAudioHost Audio 1.0 Class Host Mode Driver + * + *  \section Sec_USBClassAudioHost_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Host/AudioClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassAudioHost_ModDescription Module Description + *  Host Mode USB Class driver framework interface, for the Audio 1.0 USB Class driver. + * + *  @{ + */ + +#ifndef __AUDIO_CLASS_HOST_H__ +#define __AUDIO_CLASS_HOST_H__ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/AudioClassCommon.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_AUDIO_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Type Defines: */ +			/** \brief Audio Class Host Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made within the user application, +			 *  and passed to each of the Audio class driver functions as the \c AudioInterfaceInfo parameter. This +			 *  stores each Audio interface's configuration and state information. +			 */ +			typedef struct +			{ +				struct +				{ +					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */ +					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */ +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ +				struct +				{ +					bool IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid +					                *   after \ref Audio_Host_ConfigurePipes() is called and the Host state machine is in the +					                *   Configured state. +					                */ +					uint8_t ControlInterfaceNumber; /**< Interface index of the Audio Control interface within the attached device. */ +					uint8_t StreamingInterfaceNumber; /**< Interface index of the Audio Streaming interface within the attached device. */ + +					uint8_t EnabledStreamingAltIndex; /**< Alternative setting index of the Audio Streaming interface when the stream is enabled. */ +				} State; /**< State data for the USB class interface within the device. All elements in this section +						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when +						  *   the interface is enumerated. +						  */ +			} USB_ClassInfo_Audio_Host_t; + +		/* Enums: */ +			/** Enum for the possible error codes returned by the \ref Audio_Host_ConfigurePipes() function. */ +			enum AUDIO_Host_EnumerationFailure_ErrorCodes_t +			{ +				AUDIO_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */ +				AUDIO_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */ +				AUDIO_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible AUDIO interface was not found in the device's Configuration Descriptor. */ +				AUDIO_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ +			}; + +		/* Function Prototypes: */ +			/** Host interface configuration routine, to configure a given Audio host interface instance using the Configuration +			 *  Descriptor read from an attached USB device. This function automatically updates the given Audio Host instance's +			 *  state values and configures the pipes required to communicate with the interface if it is found within the +			 *  device. This should be called once after the stack has enumerated the attached device, while the host state +			 *  machine is in the Addressed state. +			 * +			 *  \param[in,out] AudioInterfaceInfo    Pointer to a structure containing an Audio Class host configuration and state. +			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor. +			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor. +			 * +			 *  \return A value from the \ref AUDIO_Host_EnumerationFailure_ErrorCodes_t enum. +			 */ +			uint8_t Audio_Host_ConfigurePipes(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, +			                                  uint16_t ConfigDescriptorSize, +			                                  void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); + +			/** Starts or stops the audio streaming for the given configured Audio Host interface, allowing for audio samples to be +			 *  send and/or received. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class host configuration and state. +			 *  \param[in]     EnableStreaming     Boolean true to enable streaming of the specified interface, \c false to disable +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. +			 */ +			uint8_t Audio_Host_StartStopStreaming(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, +			                                      const bool EnableStreaming) ATTR_NON_NULL_PTR_ARG(1); + +			/** Gets or sets the specified property of a streaming audio class endpoint that is bound to a pipe in the given +			 *  class instance. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class host configuration and state. +			 *  \param[in]     DataPipeIndex       Index of the data pipe whose bound endpoint is to be altered. +			 *  \param[in]     EndpointProperty    Property of the endpoint to get or set, a value from \ref Audio_ClassRequests_t. +			 *  \param[in]     EndpointControl     Parameter of the endpoint to get or set, a value from \ref Audio_EndpointControls_t. +			 *  \param[in,out] DataLength          For SET operations, the length of the parameter data to set. For GET operations, the maximum +			 *                                     length of the retrieved data. +			 *  \param[in,out] Data                Pointer to a location where the parameter data is stored for SET operations, or where +			 *                                     the retrieved data is to be stored for GET operations. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. +			 */ +			uint8_t Audio_Host_GetSetEndpointProperty(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, +			                                          const uint8_t DataPipeIndex, +			                                          const uint8_t EndpointProperty, +			                                          const uint8_t EndpointControl, +			                                          const uint16_t DataLength, +			                                          void* const Data) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(6); + +		/* Inline Functions: */ +			/** General management task for a given Audio host class interface, required for the correct operation of +			 *  the interface. This should be called frequently in the main program loop, before the master USB management task +			 *  \ref USB_USBTask(). +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class host configuration and state. +			 */ +			static inline void Audio_Host_USBTask(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo) +			                                      ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline void Audio_Host_USBTask(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo) +			{ +				(void)AudioInterfaceInfo; +			} + +			/** Determines if the given audio interface is ready for a sample to be read from it, and selects the streaming +			 *  IN pipe ready for reading. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 * +			 *  \return Boolean \c true if the given Audio interface has a sample to be read, \c false otherwise. +			 */ +			static inline bool Audio_Host_IsSampleReceived(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo) +			                                               ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline bool Audio_Host_IsSampleReceived(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo) +			{ +				if ((USB_HostState != HOST_STATE_Configured) || !(AudioInterfaceInfo->State.IsActive)) +				  return false; + +				bool SampleReceived = false; + +				Pipe_SelectPipe(AudioInterfaceInfo->Config.DataINPipe.Address); +				Pipe_Unfreeze(); +				SampleReceived = Pipe_IsINReceived(); +				Pipe_Freeze(); + +				return SampleReceived; +			} + +			/** Determines if the given audio interface is ready to accept the next sample to be written to it, and selects +			 *  the streaming OUT pipe ready for writing. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 * +			 *  \return Boolean \c true if the given Audio interface is ready to accept the next sample, \c false otherwise. +			 */ +			static inline bool Audio_Host_IsReadyForNextSample(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo) +			                                                   ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline bool Audio_Host_IsReadyForNextSample(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo) +			{ +				if ((USB_HostState != HOST_STATE_Configured) || !(AudioInterfaceInfo->State.IsActive)) +				  return false; + +				Pipe_SelectPipe(AudioInterfaceInfo->Config.DataOUTPipe.Address); +				return Pipe_IsOUTReady(); +			} + +			/** Reads the next 8-bit audio sample from the current audio interface. +			 * +			 *  \pre This should be preceded immediately by a call to the \ref Audio_Host_IsSampleReceived() function to ensure +			 *       that the correct pipe is selected and ready for data. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 * +			 *  \return  Signed 8-bit audio sample from the audio interface. +			 */ +			static inline int8_t Audio_Host_ReadSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo) +			                                            ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline int8_t Audio_Host_ReadSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo) +			{ +				int8_t Sample; + +				(void)AudioInterfaceInfo; + +				Sample = Pipe_Read_8(); + +				if (!(Pipe_BytesInPipe())) +				{ +					Pipe_Unfreeze(); +					Pipe_ClearIN(); +					Pipe_Freeze(); +				} + +				return Sample; +			} + +			/** Reads the next 16-bit audio sample from the current audio interface. +			 * +			 *  \pre This should be preceded immediately by a call to the \ref Audio_Host_IsSampleReceived() function to ensure +			 *       that the correct pipe is selected and ready for data. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 * +			 *  \return  Signed 16-bit audio sample from the audio interface. +			 */ +			static inline int16_t Audio_Host_ReadSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo) +			                                              ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline int16_t Audio_Host_ReadSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo) +			{ +				int16_t Sample; + +				(void)AudioInterfaceInfo; + +				Sample = (int16_t)Pipe_Read_16_LE(); + +				if (!(Pipe_BytesInPipe())) +				{ +					Pipe_Unfreeze(); +					Pipe_ClearIN(); +					Pipe_Freeze(); +				} + +				return Sample; +			} + +			/** Reads the next 24-bit audio sample from the current audio interface. +			 * +			 *  \pre This should be preceded immediately by a call to the \ref Audio_Host_IsSampleReceived() function to ensure +			 *       that the correct pipe is selected and ready for data. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 * +			 *  \return Signed 24-bit audio sample from the audio interface. +			 */ +			static inline int32_t Audio_Host_ReadSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo) +			                                              ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline int32_t Audio_Host_ReadSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo) +			{ +				int32_t Sample; + +				(void)AudioInterfaceInfo; + +				Sample = (((uint32_t)Pipe_Read_8() << 16) | Pipe_Read_16_LE()); + +				if (!(Pipe_BytesInPipe())) +				{ +					Pipe_Unfreeze(); +					Pipe_ClearIN(); +					Pipe_Freeze(); +				} + +				return Sample; +			} + +			/** Writes the next 8-bit audio sample to the current audio interface. +			 * +			 *  \pre This should be preceded immediately by a call to the \ref Audio_Host_IsReadyForNextSample() function to +			 *       ensure that the correct pipe is selected and ready for data. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 *  \param[in]     Sample              Signed 8-bit audio sample. +			 */ +			static inline void Audio_Host_WriteSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, +			                                           const int8_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline void Audio_Host_WriteSample8(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, +			                                           const int8_t Sample) +			{ +				(void)AudioInterfaceInfo; + +				Pipe_Write_8(Sample); + +				if (!(Pipe_IsReadWriteAllowed())) +				{ +					Pipe_Unfreeze(); +					Pipe_ClearOUT(); +					Pipe_WaitUntilReady(); +					Pipe_Freeze(); +				} +			} + +			/** Writes the next 16-bit audio sample to the current audio interface. +			 * +			 *  \pre This should be preceded immediately by a call to the \ref Audio_Host_IsReadyForNextSample() function to +			 *       ensure that the correct pipe is selected and ready for data. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 *  \param[in]     Sample              Signed 16-bit audio sample. +			 */ +			static inline void Audio_Host_WriteSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, +			                                            const int16_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline void Audio_Host_WriteSample16(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, +			                                            const int16_t Sample) +			{ +				(void)AudioInterfaceInfo; + +				Pipe_Write_16_LE(Sample); + +				if (!(Pipe_IsReadWriteAllowed())) +				{ +					Pipe_Unfreeze(); +					Pipe_ClearOUT(); +					Pipe_WaitUntilReady(); +					Pipe_Freeze(); +				} +			} + +			/** Writes the next 24-bit audio sample to the current audio interface. +			 * +			 *  \pre This should be preceded immediately by a call to the \ref Audio_Host_IsReadyForNextSample() function to +			 *       ensure that the correct pipe is selected and ready for data. +			 * +			 *  \param[in,out] AudioInterfaceInfo  Pointer to a structure containing an Audio Class configuration and state. +			 *  \param[in]     Sample              Signed 24-bit audio sample. +			 */ +			static inline void Audio_Host_WriteSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, +			                                            const int32_t Sample) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline void Audio_Host_WriteSample24(USB_ClassInfo_Audio_Host_t* const AudioInterfaceInfo, +			                                            const int32_t Sample) +			{ +				(void)AudioInterfaceInfo; + +				Pipe_Write_16_LE(Sample); +				Pipe_Write_8(Sample >> 16); + +				if (!(Pipe_IsReadWriteAllowed())) +				{ +					Pipe_Unfreeze(); +					Pipe_ClearOUT(); +					Pipe_WaitUntilReady(); +					Pipe_Freeze(); +				} +			} + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_AUDIO_HOST_C) +				static uint8_t DCOMP_Audio_Host_NextAudioControlInterface(void* CurrentDescriptor) +				                                                          ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +				static uint8_t DCOMP_Audio_Host_NextAudioStreamInterface(void* CurrentDescriptor) +				                                                         ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +				static uint8_t DCOMP_Audio_Host_NextAudioInterfaceDataEndpoint(void* CurrentDescriptor) +				                                                               ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +			#endif +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.c new file mode 100644 index 0000000000..af9ed96e24 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.c @@ -0,0 +1,512 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_HOST) + +#define  __INCLUDE_FROM_CDC_DRIVER +#define  __INCLUDE_FROM_CDC_HOST_C +#include "CDCClassHost.h" + +uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +                                uint16_t ConfigDescriptorSize, +                                void* ConfigDescriptorData) +{ +	USB_Descriptor_Endpoint_t*  DataINEndpoint       = NULL; +	USB_Descriptor_Endpoint_t*  DataOUTEndpoint      = NULL; +	USB_Descriptor_Endpoint_t*  NotificationEndpoint = NULL; +	USB_Descriptor_Interface_t* CDCControlInterface  = NULL; + +	memset(&CDCInterfaceInfo->State, 0x00, sizeof(CDCInterfaceInfo->State)); + +	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration) +	  return CDC_ENUMERROR_InvalidConfigDescriptor; + +	while (!(DataINEndpoint) || !(DataOUTEndpoint) || !(NotificationEndpoint)) +	{ +		if (!(CDCControlInterface) || +		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +		                              DCOMP_CDC_Host_NextCDCInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) +		{ +			if (NotificationEndpoint) +			{ +				if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +				                              DCOMP_CDC_Host_NextCDCDataInterface) != DESCRIPTOR_SEARCH_COMP_Found) +				{ +					return CDC_ENUMERROR_NoCompatibleInterfaceFound; +				} + +				DataINEndpoint  = NULL; +				DataOUTEndpoint = NULL; +			} +			else +			{ +				if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +				                              DCOMP_CDC_Host_NextCDCControlInterface) != DESCRIPTOR_SEARCH_COMP_Found) +				{ +					return CDC_ENUMERROR_NoCompatibleInterfaceFound; +				} + +				CDCControlInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t); + +				NotificationEndpoint = NULL; +			} + +			continue; +		} + +		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t); + +		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN) +		{ +			if ((EndpointData->Attributes & EP_TYPE_MASK) == EP_TYPE_INTERRUPT) +			  NotificationEndpoint = EndpointData; +			else +			  DataINEndpoint = EndpointData; +		} +		else +		{ +			DataOUTEndpoint = EndpointData; +		} +	} + +	CDCInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize); +	CDCInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress; +	CDCInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_BULK; + +	CDCInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize); +	CDCInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress; +	CDCInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_BULK; + +	CDCInterfaceInfo->Config.NotificationPipe.Size = le16_to_cpu(NotificationEndpoint->EndpointSize); +	CDCInterfaceInfo->Config.NotificationPipe.EndpointAddress = NotificationEndpoint->EndpointAddress; +	CDCInterfaceInfo->Config.NotificationPipe.Type = EP_TYPE_INTERRUPT; + +	if (!(Pipe_ConfigurePipeTable(&CDCInterfaceInfo->Config.DataINPipe, 1))) +	  return CDC_ENUMERROR_PipeConfigurationFailed; + +	if (!(Pipe_ConfigurePipeTable(&CDCInterfaceInfo->Config.DataOUTPipe, 1))) +	  return CDC_ENUMERROR_PipeConfigurationFailed; + +	if (!(Pipe_ConfigurePipeTable(&CDCInterfaceInfo->Config.NotificationPipe, 1))) +	  return CDC_ENUMERROR_PipeConfigurationFailed; + +	CDCInterfaceInfo->State.ControlInterfaceNumber = CDCControlInterface->InterfaceNumber; +	CDCInterfaceInfo->State.ControlLineStates.HostToDevice = (CDC_CONTROL_LINE_OUT_RTS | CDC_CONTROL_LINE_OUT_DTR); +	CDCInterfaceInfo->State.ControlLineStates.DeviceToHost = (CDC_CONTROL_LINE_IN_DCD  | CDC_CONTROL_LINE_IN_DSR); +	CDCInterfaceInfo->State.IsActive = true; + +	return CDC_ENUMERROR_NoError; +} + +static uint8_t DCOMP_CDC_Host_NextCDCControlInterface(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Interface) +	{ +		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); + +		if ((Interface->Class    == CDC_CSCP_CDCClass)    && +		    (Interface->SubClass == CDC_CSCP_ACMSubclass) && +		    (Interface->Protocol == CDC_CSCP_ATCommandProtocol)) +		{ +			return DESCRIPTOR_SEARCH_Found; +		} +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +static uint8_t DCOMP_CDC_Host_NextCDCDataInterface(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Interface) +	{ +		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); + +		if ((Interface->Class    == CDC_CSCP_CDCDataClass)   && +		    (Interface->SubClass == CDC_CSCP_NoDataSubclass) && +		    (Interface->Protocol == CDC_CSCP_NoDataProtocol)) +		{ +			return DESCRIPTOR_SEARCH_Found; +		} +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +static uint8_t DCOMP_CDC_Host_NextCDCInterfaceEndpoint(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Endpoint) +	{ +		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); + +		uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK); + +		if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) && +		    !(Pipe_IsEndpointBound(Endpoint->EndpointAddress))) +		{ +			return DESCRIPTOR_SEARCH_Found; +		} +	} +	else if (Header->Type == DTYPE_Interface) +	{ +		return DESCRIPTOR_SEARCH_Fail; +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) +	  return; + +	Pipe_SelectPipe(CDCInterfaceInfo->Config.NotificationPipe.Address); +	Pipe_Unfreeze(); + +	if (Pipe_IsINReceived()) +	{ +		USB_Request_Header_t Notification; +		Pipe_Read_Stream_LE(&Notification, sizeof(USB_Request_Header_t), NULL); + +		if ((Notification.bRequest      == CDC_NOTIF_SerialState) && +		    (Notification.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))) +		{ +			Pipe_Read_Stream_LE(&CDCInterfaceInfo->State.ControlLineStates.DeviceToHost, +			                    sizeof(CDCInterfaceInfo->State.ControlLineStates.DeviceToHost), +			                    NULL); + +			Pipe_ClearIN(); + +			EVENT_CDC_Host_ControLineStateChanged(CDCInterfaceInfo); +		} +		else +		{ +			Pipe_ClearIN(); +		} +	} + +	Pipe_Freeze(); + +	#if !defined(NO_CLASS_DRIVER_AUTOFLUSH) +	CDC_Host_Flush(CDCInterfaceInfo); +	#endif +} + +uint8_t CDC_Host_SetLineEncoding(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) +{ +	USB_ControlRequest = (USB_Request_Header_t) +	{ +		.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE), +		.bRequest      = CDC_REQ_SetLineEncoding, +		.wValue        = 0, +		.wIndex        = CDCInterfaceInfo->State.ControlInterfaceNumber, +		.wLength       = sizeof(CDCInterfaceInfo->State.LineEncoding), +	}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	return USB_Host_SendControlRequest(&CDCInterfaceInfo->State.LineEncoding); +} + +uint8_t CDC_Host_SendControlLineStateChange(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) +{ +	USB_ControlRequest = (USB_Request_Header_t) +	{ +		.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE), +		.bRequest      = CDC_REQ_SetControlLineState, +		.wValue        = CDCInterfaceInfo->State.ControlLineStates.HostToDevice, +		.wIndex        = CDCInterfaceInfo->State.ControlInterfaceNumber, +		.wLength       = 0, +	}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	return USB_Host_SendControlRequest(NULL); +} + +uint8_t CDC_Host_SendBreak(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +                           const uint8_t Duration) +{ +	USB_ControlRequest = (USB_Request_Header_t) +	{ +		.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE), +		.bRequest      = CDC_REQ_SendBreak, +		.wValue        = Duration, +		.wIndex        = CDCInterfaceInfo->State.ControlInterfaceNumber, +		.wLength       = 0, +	}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	return USB_Host_SendControlRequest(NULL); +} + +uint8_t CDC_Host_SendData(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +                          const void* const Buffer, +                          const uint16_t Length) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipe.Address); + +	Pipe_Unfreeze(); +	ErrorCode = Pipe_Write_Stream_LE(Buffer, Length, NULL); +	Pipe_Freeze(); + +	return ErrorCode; +} + +uint8_t CDC_Host_SendData_P(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +                          const void* const Buffer, +                          const uint16_t Length) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipe.Address); + +	Pipe_Unfreeze(); +	ErrorCode = Pipe_Write_PStream_LE(Buffer, Length, NULL); +	Pipe_Freeze(); + +	return ErrorCode; +} + +uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +                            const char* const String) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipe.Address); + +	Pipe_Unfreeze(); +	ErrorCode = Pipe_Write_Stream_LE(String, strlen(String), NULL); +	Pipe_Freeze(); + +	return ErrorCode; +} + +uint8_t CDC_Host_SendString_P(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +                            const char* const String) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipe.Address); + +	Pipe_Unfreeze(); +	ErrorCode = Pipe_Write_PStream_LE(String, strlen_P(String), NULL); +	Pipe_Freeze(); + +	return ErrorCode; +} + +uint8_t CDC_Host_SendByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +                          const uint8_t Data) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipe.Address); +	Pipe_Unfreeze(); + +	if (!(Pipe_IsReadWriteAllowed())) +	{ +		Pipe_ClearOUT(); + +		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError) +		  return ErrorCode; +	} + +	Pipe_Write_8(Data); +	Pipe_Freeze(); + +	return PIPE_READYWAIT_NoError; +} + +uint16_t CDC_Host_BytesReceived(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) +	  return 0; + +	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipe.Address); +	Pipe_Unfreeze(); + +	if (Pipe_IsINReceived()) +	{ +		if (!(Pipe_BytesInPipe())) +		{ +			Pipe_ClearIN(); +			Pipe_Freeze(); +			return 0; +		} +		else +		{ +			Pipe_Freeze(); +			return Pipe_BytesInPipe(); +		} +	} +	else +	{ +		Pipe_Freeze(); + +		return 0; +	} +} + +int16_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) +	  return -1; + +	int16_t ReceivedByte = -1; + +	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataINPipe.Address); +	Pipe_Unfreeze(); + +	if (Pipe_IsINReceived()) +	{ +		if (Pipe_BytesInPipe()) +		  ReceivedByte = Pipe_Read_8(); + +		if (!(Pipe_BytesInPipe())) +		  Pipe_ClearIN(); +	} + +	Pipe_Freeze(); + +	return ReceivedByte; +} + +uint8_t CDC_Host_Flush(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(CDCInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Pipe_SelectPipe(CDCInterfaceInfo->Config.DataOUTPipe.Address); +	Pipe_Unfreeze(); + +	if (!(Pipe_BytesInPipe())) +	  return PIPE_READYWAIT_NoError; + +	bool BankFull = !(Pipe_IsReadWriteAllowed()); + +	Pipe_ClearOUT(); + +	if (BankFull) +	{ +		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError) +		  return ErrorCode; + +		Pipe_ClearOUT(); +	} + +	Pipe_Freeze(); + +	return PIPE_READYWAIT_NoError; +} + +#if defined(FDEV_SETUP_STREAM) +void CDC_Host_CreateStream(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +                           FILE* const Stream) +{ +	*Stream = (FILE)FDEV_SETUP_STREAM(CDC_Host_putchar, CDC_Host_getchar, _FDEV_SETUP_RW); +	fdev_set_udata(Stream, CDCInterfaceInfo); +} + +void CDC_Host_CreateBlockingStream(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +                                   FILE* const Stream) +{ +	*Stream = (FILE)FDEV_SETUP_STREAM(CDC_Host_putchar, CDC_Host_getchar_Blocking, _FDEV_SETUP_RW); +	fdev_set_udata(Stream, CDCInterfaceInfo); +} + +static int CDC_Host_putchar(char c, +                            FILE* Stream) +{ +	return CDC_Host_SendByte((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream), c) ? _FDEV_ERR : 0; +} + +static int CDC_Host_getchar(FILE* Stream) +{ +	int16_t ReceivedByte = CDC_Host_ReceiveByte((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream)); + +	if (ReceivedByte < 0) +	  return _FDEV_EOF; + +	return ReceivedByte; +} + +static int CDC_Host_getchar_Blocking(FILE* Stream) +{ +	int16_t ReceivedByte; + +	while ((ReceivedByte = CDC_Host_ReceiveByte((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream))) < 0) +	{ +		if (USB_HostState == HOST_STATE_Unattached) +		  return _FDEV_EOF; + +		CDC_Host_USBTask((USB_ClassInfo_CDC_Host_t*)fdev_get_udata(Stream)); +		USB_USBTask(); +	} + +	return ReceivedByte; +} +#endif + +void CDC_Host_Event_Stub(void) +{ + +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h new file mode 100644 index 0000000000..86ce6def38 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/CDCClassHost.h @@ -0,0 +1,385 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Host mode driver for the library USB CDC Class driver. + * + *  Host mode driver for the library USB CDC Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassCDC + *  \defgroup Group_USBClassCDCHost CDC Class Host Mode Driver + * + *  \section Sec_USBClassCDCHost_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Host/CDCClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassCDCHost_ModDescription Module Description + *  Host Mode USB Class driver framework interface, for the CDC USB Class driver. + * + *  @{ + */ + +#ifndef __CDC_CLASS_HOST_H__ +#define __CDC_CLASS_HOST_H__ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/CDCClassCommon.h" + +		#include <stdio.h> + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_CDC_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Type Defines: */ +			/** \brief CDC Class Host Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made within the user application, +			 *  and passed to each of the CDC class driver functions as the \c CDCInterfaceInfo parameter. This +			 *  stores each CDC interface's configuration and state information. +			 */ +			typedef struct +			{ +				struct +				{ +					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */ +					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */ +					USB_Pipe_Table_t NotificationPipe; /**< Notification IN Pipe configuration table. */ +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ +				struct +				{ +					bool IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid +					                *   after \ref CDC_Host_ConfigurePipes() is called and the Host state machine is in the +					                *   Configured state. +					                */ +					uint8_t  ControlInterfaceNumber; /**< Interface index of the CDC-ACM control interface within the attached device. */ + +					struct +					{ +						uint16_t HostToDevice; /**< Control line states from the host to device, as a set of \c CDC_CONTROL_LINE_OUT_* +						                        *   masks - to notify the device of changes to these values, call the +						                        *   \ref CDC_Host_SendControlLineStateChange() function. +						                        */ +						uint16_t DeviceToHost; /**< Control line states from the device to host, as a set of \c CDC_CONTROL_LINE_IN_* +						                        *   masks. This value is updated each time \ref CDC_Host_USBTask() is called. +						                        */ +					} ControlLineStates; /**< Current states of the virtual serial port's control lines between the device and host. */ + +					CDC_LineEncoding_t LineEncoding; /**< Line encoding used in the virtual serial port, for the device's information. +					                                  *   This is generally only used if the virtual serial port data is to be +					                                  *   reconstructed on a physical UART. When set by the host application, the +					                                  *   \ref CDC_Host_SetLineEncoding() function must be called to push the changes +					                                  *   to the device. +					                                  */ +				} State; /**< State data for the USB class interface within the device. All elements in this section +						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when +						  *   the interface is enumerated. +						  */ +			} USB_ClassInfo_CDC_Host_t; + +		/* Enums: */ +			/** Enum for the possible error codes returned by the \ref CDC_Host_ConfigurePipes() function. */ +			enum CDC_Host_EnumerationFailure_ErrorCodes_t +			{ +				CDC_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */ +				CDC_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */ +				CDC_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible CDC interface was not found in the device's Configuration Descriptor. */ +				CDC_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ +			}; + +		/* Function Prototypes: */ +			/** General management task for a given CDC host class interface, required for the correct operation of the interface. This should +			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing an CDC Class host configuration and state. +			 */ +			void CDC_Host_USBTask(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Host interface configuration routine, to configure a given CDC host interface instance using the Configuration +			 *  Descriptor read from an attached USB device. This function automatically updates the given CDC Host instance's +			 *  state values and configures the pipes required to communicate with the interface if it is found within the device. +			 *  This should be called once after the stack has enumerated the attached device, while the host state machine is in +			 *  the Addressed state. +			 * +			 *  \param[in,out] CDCInterfaceInfo      Pointer to a structure containing an CDC Class host configuration and state. +			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor. +			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor. +			 * +			 *  \return A value from the \ref CDC_Host_EnumerationFailure_ErrorCodes_t enum. +			 */ +			uint8_t CDC_Host_ConfigurePipes(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +			                                uint16_t ConfigDescriptorSize, +			                                void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); + +			/** Sets the line encoding for the attached device's virtual serial port. This should be called when the \c LineEncoding +			 *  values of the interface have been changed to push the new settings to the USB device. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. +			 */ +			uint8_t CDC_Host_SetLineEncoding(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a Serial Control Line State Change notification to the device. This should be called when the virtual serial +			 *  control lines (DTR, RTS, etc.) have changed states. Line states persist until they are cleared via a second +			 *  notification. This should be called each time the CDC class driver's \c ControlLineStates.HostToDevice value is updated +			 *  to push the new states to the USB device. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. +			 */ +			uint8_t CDC_Host_SendControlLineStateChange(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a Send Break request to the device. This is generally used to separate data or to indicate a special condition +			 *  to the receiving device. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state. +			 *  \param[in]     Duration          Duration of the break, in milliseconds. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. +			 */ +			uint8_t CDC_Host_SendBreak(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +			                           const uint8_t Duration) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a given data buffer to the attached USB device, if connected. If a device is not connected when the function is +			 *  called, the data will be discarded. Bytes will be queued for transmission to the device until either the pipe bank +			 *  becomes full, or the \ref CDC_Host_Flush() function is called to flush the pending data to the device. This allows for +			 *  multiple bytes to be packed into a single pipe packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state. +			 *  \param[in]     Buffer            Pointer to a buffer containing the data to send to the device. +			 *  \param[in]     Length            Length of the data to send to the device. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t CDC_Host_SendData(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +			                          const void* const Buffer, +			                          const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a given data buffer from PROGMEM space to the attached USB device, if connected. If a device is not connected when the +			 *  function is called, the string is discarded. Bytes will be queued for transmission to the host until either the pipe +			 *  bank becomes full, or the \ref CDC_Host_Flush() function is called to flush the pending data to the device. This allows +			 *  for multiple bytes to be packed into a single pipe packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state. +			 *  \param[in]     Buffer            Pointer to a buffer containing the data to send to the device. +			 *  \param[in]     Length            Length of the data to send to the host. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t CDC_Host_SendData_P(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +			                            const void* const Buffer, +			                            const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a given null-terminated string to the attached USB device, if connected. If a device is not connected when the +			 *  function is called, the string is discarded. Bytes will be queued for transmission to the device until either the pipe +			 *  bank becomes full, or the \ref CDC_Host_Flush() function is called to flush the pending data to the device. This allows +			 *  for multiple bytes to be packed into a single pipe packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state. +			 *  \param[in]     String            Pointer to the null terminated string to send to the device. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t CDC_Host_SendString(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +			                            const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Sends a given null terminated string from PROGMEM space to the attached USB device, if connected. If a device is not connected +			 *  when the function is called, the string is discarded. Bytes will be queued for transmission to the device until either +			 *  the pipe bank becomes full, or the \ref CDC_Host_Flush() function is called to flush the pending data to +			 *  the device. This allows for multiple bytes to be packed into a single pipe packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or +			 *       the call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state. +			 *  \param[in]     String            Pointer to the null terminated string to send to the host. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t CDC_Host_SendString_P(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +			                              const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Sends a given byte to the attached USB device, if connected. If a device is not connected when the function is called, the +			 *  byte is discarded. Bytes will be queued for transmission to the device until either the pipe bank becomes full, or the +			 *  \ref CDC_Host_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be +			 *  packed into a single pipe packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state. +			 *  \param[in]     Data              Byte of data to send to the device. +			 * +			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum. +			 */ +			uint8_t CDC_Host_SendByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +			                          const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1); + +			/** Determines the number of bytes received by the CDC interface from the device, waiting to be read. This indicates the number +			 *  of bytes in the IN pipe bank only, and thus the number of calls to \ref CDC_Host_ReceiveByte() which are guaranteed to succeed +			 *  immediately. If multiple bytes are to be received, they should be buffered by the user application, as the pipe bank will not be +			 *  released back to the USB controller until all bytes are read. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state. +			 * +			 *  \return Total number of buffered bytes received from the device. +			 */ +			uint16_t CDC_Host_BytesReceived(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads a byte of data from the device. If no data is waiting to be read of if a USB device is not connected, the function +			 *  returns a negative value. The \ref CDC_Host_BytesReceived() function may be queried in advance to determine how many bytes +			 *  are currently buffered in the CDC interface's data receive pipe. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state. +			 * +			 *  \return Next received byte from the device, or a negative value if no data received. +			 */ +			int16_t CDC_Host_ReceiveByte(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Flushes any data waiting to be sent, ensuring that the send buffer is cleared. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state. +			 * +			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum. +			 */ +			uint8_t CDC_Host_Flush(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			#if defined(FDEV_SETUP_STREAM) || defined(__DOXYGEN__) +			/** Creates a standard character stream for the given CDC Device instance so that it can be used with all the regular +			 *  functions in the standard \c <stdio.h> library that accept a \c FILE stream as a destination (e.g. \c fprintf). The created +			 *  stream is bidirectional and can be used for both input and output functions. +			 * +			 *  Reading data from this stream is non-blocking, i.e. in most instances, complete strings cannot be read in by a single +			 *  fetch, as the endpoint will not be ready at some point in the transmission, aborting the transfer. However, this may +			 *  be used when the read data is processed byte-per-bye (via \c getc()) or when the user application will implement its own +			 *  line buffering. +			 * +			 *  \note The created stream can be given as \c stdout if desired to direct the standard output from all \c <stdio.h> functions +			 *        to the given CDC interface. +			 *        \n\n +			 * +			 *  \note This function is not available on all microcontroller architectures. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed. +			 */ +			void CDC_Host_CreateStream(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +			                           FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Identical to \ref CDC_Host_CreateStream(), except that reads are blocking until the calling stream function terminates +			 *  the transfer. While blocking, the USB and CDC service tasks are called repeatedly to maintain USB communications. +			 * +			 *  \note This function is not available on all microcontroller architectures. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class configuration and state. +			 *  \param[in,out] Stream            Pointer to a FILE structure where the created stream should be placed. +			 */ +			void CDC_Host_CreateBlockingStream(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo, +			                                   FILE* const Stream) ATTR_NON_NULL_PTR_ARG(1)  ATTR_NON_NULL_PTR_ARG(2); +			#endif + +			/** CDC class driver event for a control line state change on a CDC host interface. This event fires each time the device notifies +			 *  the host of a control line state change (containing the virtual serial control line states, such as DCD) and may be hooked in the +			 *  user program by declaring a handler function with the same name and parameters listed here. The new control line states +			 *  are available in the \c ControlLineStates.DeviceToHost value inside the CDC host interface structure passed as a parameter, set as +			 *  a mask of \c CDC_CONTROL_LINE_IN_* masks. +			 * +			 *  \param[in,out] CDCInterfaceInfo  Pointer to a structure containing a CDC Class host configuration and state. +			 */ +			void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_CDC_HOST_C) +				#if defined(FDEV_SETUP_STREAM) +				static int CDC_Host_putchar(char c, +				                            FILE* Stream) ATTR_NON_NULL_PTR_ARG(2); +				static int CDC_Host_getchar(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); +				static int CDC_Host_getchar_Blocking(FILE* Stream) ATTR_NON_NULL_PTR_ARG(1); +				#endif + +				void CDC_Host_Event_Stub(void) ATTR_CONST; + +				void EVENT_CDC_Host_ControLineStateChanged(USB_ClassInfo_CDC_Host_t* const CDCInterfaceInfo) +				                                           ATTR_WEAK ATTR_NON_NULL_PTR_ARG(1) ATTR_ALIAS(CDC_Host_Event_Stub); + +				static uint8_t DCOMP_CDC_Host_NextCDCControlInterface(void* const CurrentDescriptor) +				                                                      ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +				static uint8_t DCOMP_CDC_Host_NextCDCDataInterface(void* const CurrentDescriptor) +				                                                   ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +				static uint8_t DCOMP_CDC_Host_NextCDCInterfaceEndpoint(void* const CurrentDescriptor) +				                                                       ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +			#endif +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/HIDClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/HIDClassHost.c new file mode 100644 index 0000000000..32591ffd74 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/HIDClassHost.c @@ -0,0 +1,399 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_HOST) + +#define  __INCLUDE_FROM_HID_DRIVER +#define  __INCLUDE_FROM_HID_HOST_C +#include "HIDClassHost.h" + +uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, +                                uint16_t ConfigDescriptorSize, +                                void* ConfigDescriptorData) +{ +	USB_Descriptor_Endpoint_t*  DataINEndpoint  = NULL; +	USB_Descriptor_Endpoint_t*  DataOUTEndpoint = NULL; +	USB_Descriptor_Interface_t* HIDInterface    = NULL; +	USB_HID_Descriptor_HID_t*   HIDDescriptor   = NULL; + +	memset(&HIDInterfaceInfo->State, 0x00, sizeof(HIDInterfaceInfo->State)); + +	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration) +	  return HID_ENUMERROR_InvalidConfigDescriptor; + +	while (!(DataINEndpoint) || !(DataOUTEndpoint)) +	{ +		if (!(HIDInterface) || +		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +		                              DCOMP_HID_Host_NextHIDInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) +		{ +			if (DataINEndpoint) +			  break; + +			do +			{ +				if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +				                              DCOMP_HID_Host_NextHIDInterface) != DESCRIPTOR_SEARCH_COMP_Found) +				{ +					return HID_ENUMERROR_NoCompatibleInterfaceFound; +				} + +				HIDInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t); +			} while (HIDInterfaceInfo->Config.HIDInterfaceProtocol && +					 (HIDInterface->Protocol != HIDInterfaceInfo->Config.HIDInterfaceProtocol)); + +			if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +			                              DCOMP_HID_Host_NextHIDDescriptor) != DESCRIPTOR_SEARCH_COMP_Found) +			{ +				return HID_ENUMERROR_NoCompatibleInterfaceFound; +			} + +			HIDDescriptor = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_HID_Descriptor_HID_t); + +			DataINEndpoint  = NULL; +			DataOUTEndpoint = NULL; + +			continue; +		} + +		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t); + +		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN) +		  DataINEndpoint  = EndpointData; +		else +		  DataOUTEndpoint = EndpointData; +	} + +	HIDInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize); +	HIDInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress; +	HIDInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_INTERRUPT; + +	if (!(Pipe_ConfigurePipeTable(&HIDInterfaceInfo->Config.DataINPipe, 1))) +	  return HID_ENUMERROR_PipeConfigurationFailed; + +	if (DataOUTEndpoint) +	{ +		HIDInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize); +		HIDInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress; +		HIDInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_INTERRUPT; + +		if (!(Pipe_ConfigurePipeTable(&HIDInterfaceInfo->Config.DataOUTPipe, 1))) +		  return HID_ENUMERROR_PipeConfigurationFailed; +	} + +	HIDInterfaceInfo->State.InterfaceNumber      = HIDInterface->InterfaceNumber; +	HIDInterfaceInfo->State.HIDReportSize        = LE16_TO_CPU(HIDDescriptor->HIDReportLength); +	HIDInterfaceInfo->State.SupportsBootProtocol = (HIDInterface->SubClass != HID_CSCP_NonBootProtocol); +	HIDInterfaceInfo->State.LargestReportSize    = 8; +	HIDInterfaceInfo->State.IsActive             = true; + +	return HID_ENUMERROR_NoError; +} + +static uint8_t DCOMP_HID_Host_NextHIDInterface(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Interface) +	{ +		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); + +		if (Interface->Class == HID_CSCP_HIDClass) +		  return DESCRIPTOR_SEARCH_Found; +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +static uint8_t DCOMP_HID_Host_NextHIDDescriptor(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == HID_DTYPE_HID) +	  return DESCRIPTOR_SEARCH_Found; +	else if (Header->Type == DTYPE_Interface) +	  return DESCRIPTOR_SEARCH_Fail; +	else +	  return DESCRIPTOR_SEARCH_NotFound; +} + +static uint8_t DCOMP_HID_Host_NextHIDInterfaceEndpoint(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Endpoint) +	{ +		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); + +		if (!(Pipe_IsEndpointBound(Endpoint->EndpointAddress))) +		  return DESCRIPTOR_SEARCH_Found; +	} +	else if (Header->Type == DTYPE_Interface) +	{ +		return DESCRIPTOR_SEARCH_Fail; +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY) +uint8_t HID_Host_ReceiveReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, +                                   const uint8_t ReportID, +                                   void* Buffer) +{ +	USB_ControlRequest = (USB_Request_Header_t) +	{ +		.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE), +		.bRequest      = HID_REQ_SetReport, +		.wValue        = ((HID_REPORT_ITEM_In + 1) << 8) | ReportID, +		.wIndex        = HIDInterfaceInfo->State.InterfaceNumber, +		.wLength       = USB_GetHIDReportSize(HIDInterfaceInfo->Config.HIDParserData, ReportID, HID_REPORT_ITEM_In), +	}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	return USB_Host_SendControlRequest(Buffer); +} +#endif + +uint8_t HID_Host_ReceiveReport(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, +                               void* Buffer) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(HIDInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Pipe_SelectPipe(HIDInterfaceInfo->Config.DataINPipe.Address); +	Pipe_Unfreeze(); + +	uint16_t ReportSize; +	uint8_t* BufferPos = Buffer; + +#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY) +	if (!(HIDInterfaceInfo->State.UsingBootProtocol)) +	{ +		uint8_t ReportID = 0; + +		if (HIDInterfaceInfo->Config.HIDParserData->UsingReportIDs) +		{ +			ReportID = Pipe_Read_8(); +			*(BufferPos++) = ReportID; +		} + +		ReportSize = USB_GetHIDReportSize(HIDInterfaceInfo->Config.HIDParserData, ReportID, HID_REPORT_ITEM_In); +	} +	else +#endif +	{ +		ReportSize = Pipe_BytesInPipe(); +	} + +	if ((ErrorCode = Pipe_Read_Stream_LE(BufferPos, ReportSize, NULL)) != PIPE_RWSTREAM_NoError) +	  return ErrorCode; + +	Pipe_ClearIN(); +	Pipe_Freeze(); + +	return PIPE_RWSTREAM_NoError; +} + +uint8_t HID_Host_SendReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, +#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY) +                                const uint8_t ReportID, +#endif +                                const uint8_t ReportType, +                                void* Buffer, +                                const uint16_t ReportSize) +{ +#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY) +	if ((USB_HostState != HOST_STATE_Configured) || !(HIDInterfaceInfo->State.IsActive)) +	  return PIPE_RWSTREAM_NoError; + +	if (HIDInterfaceInfo->State.DeviceUsesOUTPipe && (ReportType == HID_REPORT_ITEM_Out)) +	{ +		uint8_t ErrorCode; + +		Pipe_SelectPipe(HIDInterfaceInfo->Config.DataOUTPipe.Address); +		Pipe_Unfreeze(); + +		if (ReportID) +		  Pipe_Write_Stream_LE(&ReportID, sizeof(ReportID), NULL); + +		if ((ErrorCode = Pipe_Write_Stream_LE(Buffer, ReportSize, NULL)) != PIPE_RWSTREAM_NoError) +		  return ErrorCode; + +		Pipe_ClearOUT(); +		Pipe_Freeze(); + +		return PIPE_RWSTREAM_NoError; +	} +	else +#endif +	{ +		USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE), +			.bRequest      = HID_REQ_SetReport, +#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY) +			.wValue        = ((ReportType + 1) << 8) | ReportID, +#else +			.wValue        = ((ReportType + 1) << 8), +#endif +			.wIndex        = HIDInterfaceInfo->State.InterfaceNumber, +			.wLength       = ReportSize, +		}; + +		Pipe_SelectPipe(PIPE_CONTROLPIPE); + +		return USB_Host_SendControlRequest(Buffer); +	} +} + +bool HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(HIDInterfaceInfo->State.IsActive)) +	  return false; + +	bool ReportReceived; + +	Pipe_SelectPipe(HIDInterfaceInfo->Config.DataINPipe.Address); +	Pipe_Unfreeze(); + +	ReportReceived = Pipe_IsINReceived(); + +	Pipe_Freeze(); + +	return ReportReceived; +} + +uint8_t HID_Host_SetBootProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) +{ +	uint8_t ErrorCode; + +	if (!(HIDInterfaceInfo->State.SupportsBootProtocol)) +	  return HID_ERROR_LOGICAL; + +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE), +			.bRequest      = HID_REQ_SetProtocol, +			.wValue        = 0, +			.wIndex        = HIDInterfaceInfo->State.InterfaceNumber, +			.wLength       = 0, +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) +	  return ErrorCode; + +	HIDInterfaceInfo->State.LargestReportSize = 8; +	HIDInterfaceInfo->State.UsingBootProtocol = true; + +	return HOST_SENDCONTROL_Successful; +} + +uint8_t HID_Host_SetIdlePeriod(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, +                               const uint16_t MS) +{ +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE), +			.bRequest      = HID_REQ_SetIdle, +			.wValue        = ((MS << 6) & 0xFF00), +			.wIndex        = HIDInterfaceInfo->State.InterfaceNumber, +			.wLength       = 0, +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	return USB_Host_SendControlRequest(NULL); +} + +#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY) +uint8_t HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) +{ +	uint8_t ErrorCode; + +	uint8_t HIDReportData[HIDInterfaceInfo->State.HIDReportSize]; + +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE), +			.bRequest      = REQ_GetDescriptor, +			.wValue        = (HID_DTYPE_Report << 8), +			.wIndex        = HIDInterfaceInfo->State.InterfaceNumber, +			.wLength       = HIDInterfaceInfo->State.HIDReportSize, +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	if ((ErrorCode = USB_Host_SendControlRequest(HIDReportData)) != HOST_SENDCONTROL_Successful) +	  return ErrorCode; + +	if (HIDInterfaceInfo->State.UsingBootProtocol) +	{ +		USB_ControlRequest = (USB_Request_Header_t) +			{ +				.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE), +				.bRequest      = HID_REQ_SetProtocol, +				.wValue        = 1, +				.wIndex        = HIDInterfaceInfo->State.InterfaceNumber, +				.wLength       = 0, +			}; + +		if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) +		  return ErrorCode; + +		HIDInterfaceInfo->State.UsingBootProtocol = false; +	} + +	if (HIDInterfaceInfo->Config.HIDParserData == NULL) +	  return HID_ERROR_LOGICAL; + +	if ((ErrorCode = USB_ProcessHIDReport(HIDReportData, HIDInterfaceInfo->State.HIDReportSize, +	                                      HIDInterfaceInfo->Config.HIDParserData)) != HID_PARSE_Successful) +	{ +		return HID_ERROR_LOGICAL | ErrorCode; +	} + +	uint16_t LargestReportSizeBits = HIDInterfaceInfo->Config.HIDParserData->LargestReportSizeBits; +	HIDInterfaceInfo->State.LargestReportSize = (LargestReportSizeBits >> 3) + ((LargestReportSizeBits & 0x07) != 0); + +	return 0; +} +#endif + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/HIDClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/HIDClassHost.h new file mode 100644 index 0000000000..73b5abb1ba --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/HIDClassHost.h @@ -0,0 +1,313 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Host mode driver for the library USB HID Class driver. + * + *  Host mode driver for the library USB HID Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassHID + *  \defgroup Group_USBClassHIDHost HID Class Host Mode Driver + * + *  \section Sec_USBClassHIDHost_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Host/HIDClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassHIDHost_ModDescription Module Description + *  Host Mode USB Class driver framework interface, for the HID USB Class driver. + * + *  @{ + */ + +#ifndef __HID_CLASS_HOST_H__ +#define __HID_CLASS_HOST_H__ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/HIDClassCommon.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_HID_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Error code for some HID Host functions, indicating a logical (and not hardware) error. */ +			#define HID_ERROR_LOGICAL              0x80 + +		/* Type Defines: */ +			/** \brief HID Class Host Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made within the user application, +			 *  and passed to each of the HID class driver functions as the \c HIDInterfaceInfo parameter. This +			 *  stores each HID interface's configuration and state information. +			 */ +			typedef struct +			{ +				struct +				{ +					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */ +					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */ + +					uint8_t  HIDInterfaceProtocol; /**< HID interface protocol value to match against if a specific +					                                *   boot subclass protocol is required, a protocol value from the +					                                *   \ref HID_Descriptor_ClassSubclassProtocol_t enum. +					                                */ +					#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY) +					HID_ReportInfo_t* HIDParserData; /**< HID parser data to store the parsed HID report data, when boot protocol +					                                  *   is not used. +					                                  * +					                                  *  \note When the \c HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined, +					                                  *        this field is unavailable. +					                                  */ +					#endif +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ +				struct +				{ +					bool IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid +					                *   after \ref HID_Host_ConfigurePipes() is called and the Host state machine is in the +					                *   Configured state. +					                */ +					uint8_t InterfaceNumber; /**< Interface index of the HID interface within the attached device. */ + +					bool SupportsBootProtocol; /**< Indicates if the current interface instance supports the HID Boot +					                            *   Protocol when enabled via \ref HID_Host_SetBootProtocol(). +					                            */ +					bool DeviceUsesOUTPipe; /**< Indicates if the current interface instance uses a separate OUT data pipe for +					                         *   OUT reports, or if OUT reports are sent via the control pipe instead. +					                         */ +					bool UsingBootProtocol; /**< Indicates that the interface is currently initialized in Boot Protocol mode */ +					uint16_t HIDReportSize; /**< Size in bytes of the HID report descriptor in the device. */ + +					uint8_t LargestReportSize; /**< Largest report the device will send, in bytes. */ +				} State; /**< State data for the USB class interface within the device. All elements in this section +				          *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when +				          *   the interface is enumerated. +				          */ +			} USB_ClassInfo_HID_Host_t; + +		/* Enums: */ +			/** Enum for the possible error codes returned by the \ref HID_Host_ConfigurePipes() function. */ +			enum HID_Host_EnumerationFailure_ErrorCodes_t +			{ +				HID_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */ +				HID_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */ +				HID_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible HID interface was not found in the device's Configuration Descriptor. */ +				HID_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ +			}; + +		/* Function Prototypes: */ +			/** Host interface configuration routine, to configure a given HID host interface instance using the Configuration +			 *  Descriptor read from an attached USB device. This function automatically updates the given HID Host instance's +			 *  state values and configures the pipes required to communicate with the interface if it is found within the +			 *  device. This should be called once after the stack has enumerated the attached device, while the host state +			 *  machine is in the Addressed state. +			 * +			 *  \attention Once the device pipes are configured, the HID device's reporting protocol <b>must</b> be set via a call +			 *             to either the \ref HID_Host_SetBootProtocol() or \ref HID_Host_SetReportProtocol() function. +			 * +			 *  \param[in,out] HIDInterfaceInfo      Pointer to a structure containing a HID Class host configuration and state. +			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor. +			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor. +			 * +			 *  \return A value from the \ref HID_Host_EnumerationFailure_ErrorCodes_t enum. +			 */ +			uint8_t HID_Host_ConfigurePipes(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, +			                                uint16_t ConfigDescriptorSize, +			                                void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); + + +			/** Receives a HID IN report from the attached HID device, when a report has been received on the HID IN Data pipe. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \attention The destination buffer should be large enough to accommodate the largest report that the attached device +			 *             can generate. +			 * +			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state. +			 *  \param[in]     Buffer            Buffer to store the received report into. +			 * +			 *  \return An error code from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t HID_Host_ReceiveReport(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, +			                               void* Buffer) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY) +			/** Receives a HID IN report from the attached device, by the report ID. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \note When the \c HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined, this method is unavailable. +			 * +			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state. +			 *  \param[in]     ReportID          Report ID of the received report if ControlRequest is false, set by the to the Report ID to fetch. +			 *  \param[in]     Buffer            Buffer to store the received report into. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. +			 */ +			uint8_t HID_Host_ReceiveReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, +			                                   const uint8_t ReportID, +			                                   void* Buffer) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); +			#endif + +			/** Sends an OUT or FEATURE report to the currently attached HID device, using the device's OUT pipe if available, +			 *  or the device's Control pipe if not. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \note When the \c HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined, the ReportID parameter is removed +			 *        from the parameter list of this function. +			 * +			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state. +			 *  \param[in]     ReportID          Report ID of the report to send to the device, or 0 if the device does not use report IDs. +			 *  \param[in]     ReportType        Type of report to issue to the device, either \ref HID_REPORT_ITEM_Out or \ref HID_REPORT_ITEM_Feature. +			 *  \param[in]     Buffer            Buffer containing the report to send to the attached device. +			 *  \param[in]     ReportSize        Report size in bytes to send to the attached device. +			 * +			 *  \return An error code from the \ref USB_Host_SendControlErrorCodes_t enum if the DeviceUsesOUTPipe flag is set in +			 *          the interface's state structure, a value from the \ref Pipe_Stream_RW_ErrorCodes_t enum otherwise. +			 */ +			uint8_t HID_Host_SendReportByID(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, +			#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY) +			                                const uint8_t ReportID, +			#endif +			                                const uint8_t ReportType, +			                                void* Buffer, +			                                const uint16_t ReportSize) ATTR_NON_NULL_PTR_ARG(1) +			#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY) +			                                ATTR_NON_NULL_PTR_ARG(4); +			#else +			                                ATTR_NON_NULL_PTR_ARG(3); +			#endif + +			/** Determines if a HID IN report has been received from the attached device on the data IN pipe. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state. +			 * +			 *  \return Boolean \c true if a report has been received, \c false otherwise. +			 */ +			bool HID_Host_IsReportReceived(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Switches the attached HID device's reporting protocol over to the Boot Report protocol mode, on supported devices. +			 * +			 *  \note When the \c HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined, this method must still be called +			 *        to explicitly place the attached device into boot protocol mode before use. +			 * +			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state. +			 * +			 *  \return \ref HID_ERROR_LOGICAL if the device does not support Boot Protocol mode, a value from the +			 *          \ref USB_Host_SendControlErrorCodes_t enum otherwise. +			 */ +			uint8_t HID_Host_SetBootProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sets the idle period for the attached HID device to the specified interval. The HID idle period determines the rate +			 *  at which the device should send a report, when no state changes have occurred; i.e. on HID keyboards, this sets the +			 *  hardware key repeat interval. +			 * +			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state. +			 *  \param[in]     MS                Idle period as a multiple of four milliseconds, zero to disable hardware repeats +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. +			 */ +			uint8_t HID_Host_SetIdlePeriod(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo, +			                               const uint16_t MS) ATTR_NON_NULL_PTR_ARG(1); + +			#if !defined(HID_HOST_BOOT_PROTOCOL_ONLY) +			/** Switches the attached HID device's reporting protocol over to the standard Report protocol mode. This also retrieves +			 *  and parses the device's HID report descriptor, so that the size of each report can be determined in advance. +			 * +			 *  \attention Whether this function is used or not, the \ref CALLBACK_HIDParser_FilterHIDReportItem() callback from the HID +			 *             Report Parser this function references <b>must</b> be implemented in the user code. +			 * +			 *  \note When the \c HID_HOST_BOOT_PROTOCOL_ONLY compile time token is defined, this method is unavailable. +			 * +			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum if an error occurs while retrieving the HID +			 *          Report descriptor or the setting of the Report protocol, \ref HID_ERROR_LOGICAL if the HID interface does +			 *          not have a valid \ref HID_ReportInfo_t structure set in its configuration, a mask of \ref HID_ERROR_LOGICAL +			 *          and a value from the \ref HID_Parse_ErrorCodes_t otherwise. +			 */ +			uint8_t HID_Host_SetReportProtocol(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); +			#endif + +		/* Inline Functions: */ +			/** General management task for a given Human Interface Class host class interface, required for the correct operation of +			 *  the interface. This should be called frequently in the main program loop, before the master USB management task +			 *  \ref USB_USBTask(). +			 * +			 *  \param[in,out] HIDInterfaceInfo  Pointer to a structure containing a HID Class host configuration and state. +			 */ +			static inline void HID_Host_USBTask(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); +			static inline void HID_Host_USBTask(USB_ClassInfo_HID_Host_t* const HIDInterfaceInfo) +			{ +				(void)HIDInterfaceInfo; +			} + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_HID_HOST_C) +				static uint8_t DCOMP_HID_Host_NextHIDInterface(void* const CurrentDescriptor) +				                                               ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +				static uint8_t DCOMP_HID_Host_NextHIDDescriptor(void* const CurrentDescriptor) +				                                                ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +				static uint8_t DCOMP_HID_Host_NextHIDInterfaceEndpoint(void* const CurrentDescriptor) +				                                                       ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +			#endif +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c new file mode 100644 index 0000000000..635148f5e2 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/MIDIClassHost.c @@ -0,0 +1,231 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_HOST) + +#define  __INCLUDE_FROM_MIDI_DRIVER +#define  __INCLUDE_FROM_MIDI_HOST_C +#include "MIDIClassHost.h" + +uint8_t MIDI_Host_ConfigurePipes(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo, +                                 uint16_t ConfigDescriptorSize, +                                 void* ConfigDescriptorData) +{ +	USB_Descriptor_Endpoint_t*  DataINEndpoint  = NULL; +	USB_Descriptor_Endpoint_t*  DataOUTEndpoint = NULL; +	USB_Descriptor_Interface_t* MIDIInterface   = NULL; + +	memset(&MIDIInterfaceInfo->State, 0x00, sizeof(MIDIInterfaceInfo->State)); + +	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration) +	  return MIDI_ENUMERROR_InvalidConfigDescriptor; + +	while (!(DataINEndpoint) || !(DataOUTEndpoint)) +	{ +		if (!(MIDIInterface) || +		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +		                              DCOMP_MIDI_Host_NextMIDIStreamingDataEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) +		{ +			if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +			                              DCOMP_MIDI_Host_NextMIDIStreamingInterface) != DESCRIPTOR_SEARCH_COMP_Found) +			{ +				return MIDI_ENUMERROR_NoCompatibleInterfaceFound; +			} + +			MIDIInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t); + +			DataINEndpoint  = NULL; +			DataOUTEndpoint = NULL; + +			continue; +		} + +		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t); + +		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN) +		  DataINEndpoint  = EndpointData; +		else +		  DataOUTEndpoint = EndpointData; +	} + +	MIDIInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize); +	MIDIInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress; +	MIDIInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_BULK; + +	MIDIInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize); +	MIDIInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress; +	MIDIInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_BULK; + +	if (!(Pipe_ConfigurePipeTable(&MIDIInterfaceInfo->Config.DataINPipe, 1))) +	  return MIDI_ENUMERROR_PipeConfigurationFailed; + +	if (!(Pipe_ConfigurePipeTable(&MIDIInterfaceInfo->Config.DataOUTPipe, 1))) +	  return MIDI_ENUMERROR_PipeConfigurationFailed; + +	MIDIInterfaceInfo->State.InterfaceNumber = MIDIInterface->InterfaceNumber; +	MIDIInterfaceInfo->State.IsActive = true; + +	return MIDI_ENUMERROR_NoError; +} + +static uint8_t DCOMP_MIDI_Host_NextMIDIStreamingInterface(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Interface) +	{ +		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); + +		if ((Interface->Class    == AUDIO_CSCP_AudioClass)            && +		    (Interface->SubClass == AUDIO_CSCP_MIDIStreamingSubclass) && +		    (Interface->Protocol == AUDIO_CSCP_StreamingProtocol)) +		{ +			return DESCRIPTOR_SEARCH_Found; +		} +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +static uint8_t DCOMP_MIDI_Host_NextMIDIStreamingDataEndpoint(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Endpoint) +	{ +		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); + +		uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK); + +		if ((EndpointType == EP_TYPE_BULK) && !(Pipe_IsEndpointBound(Endpoint->EndpointAddress))) +		  return DESCRIPTOR_SEARCH_Found; +	} +	else if (Header->Type == DTYPE_Interface) +	{ +		return DESCRIPTOR_SEARCH_Fail; +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +void MIDI_Host_USBTask(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(MIDIInterfaceInfo->State.IsActive)) +	  return; + +	#if !defined(NO_CLASS_DRIVER_AUTOFLUSH) +	MIDI_Host_Flush(MIDIInterfaceInfo); +	#endif +} + +uint8_t MIDI_Host_Flush(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(MIDIInterfaceInfo->State.IsActive)) +	  return PIPE_RWSTREAM_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Pipe_SelectPipe(MIDIInterfaceInfo->Config.DataOUTPipe.Address); +	Pipe_Unfreeze(); + +	if (Pipe_BytesInPipe()) +	{ +		Pipe_ClearOUT(); + +		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError) +		{ +			Pipe_Freeze(); +			return ErrorCode; +		} +	} + +	Pipe_Freeze(); + +	return PIPE_READYWAIT_NoError; +} + +uint8_t MIDI_Host_SendEventPacket(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo, +                                  MIDI_EventPacket_t* const Event) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(MIDIInterfaceInfo->State.IsActive)) +	  return HOST_SENDCONTROL_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Pipe_SelectPipe(MIDIInterfaceInfo->Config.DataOUTPipe.Address); +	Pipe_Unfreeze(); + +	if ((ErrorCode = Pipe_Write_Stream_LE(Event, sizeof(MIDI_EventPacket_t), NULL)) != PIPE_RWSTREAM_NoError) +	{ +		Pipe_Freeze(); +		return ErrorCode; +	} + +	if (!(Pipe_IsReadWriteAllowed())) +	  Pipe_ClearOUT(); + +	Pipe_Freeze(); + +	return PIPE_RWSTREAM_NoError; +} + +bool MIDI_Host_ReceiveEventPacket(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo, +                                  MIDI_EventPacket_t* const Event) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(MIDIInterfaceInfo->State.IsActive)) +	  return HOST_SENDCONTROL_DeviceDisconnected; + +	bool DataReady = false; + +	Pipe_SelectPipe(MIDIInterfaceInfo->Config.DataINPipe.Address); +	Pipe_Unfreeze(); + +	if (Pipe_IsINReceived()) +	{ +		if (Pipe_BytesInPipe()) +		{ +			Pipe_Read_Stream_LE(Event, sizeof(MIDI_EventPacket_t), NULL); +			DataReady = true; +		} + +		if (!(Pipe_BytesInPipe())) +		  Pipe_ClearIN(); +	} + +	Pipe_Freeze(); + +	return DataReady; +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/MIDIClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/MIDIClassHost.h new file mode 100644 index 0000000000..9cae21a1b6 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/MIDIClassHost.h @@ -0,0 +1,190 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Host mode driver for the library USB MIDI Class driver. + * + *  Host mode driver for the library USB MIDI Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassMIDI + *  \defgroup Group_USBClassMIDIHost MIDI Class Host Mode Driver + * + *  \section Sec_USBClassMIDIHost_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Host/MIDIClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassMIDIHost_ModDescription Module Description + *  Host Mode USB Class driver framework interface, for the MIDI USB Class driver. + * + *  @{ + */ + +#ifndef __MIDI_CLASS_HOST_H__ +#define __MIDI_CLASS_HOST_H__ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/MIDIClassCommon.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_MIDI_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Type Defines: */ +			/** \brief MIDI Class Host Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made within the user application, +			 *  and passed to each of the MIDI class driver functions as the \c MIDIInterfaceInfo parameter. This +			 *  stores each MIDI interface's configuration and state information. +			 */ +			typedef struct +			{ +				struct +				{ +					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */ +					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */ +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ +				struct +				{ +					bool     IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid +					                    *   after \ref MIDI_Host_ConfigurePipes() is called and the Host state machine is in the +					                    *   Configured state. +					                    */ +					uint8_t  InterfaceNumber; /**< Interface index of the MIDI interface within the attached device. */ +				} State; /**< State data for the USB class interface within the device. All elements in this section +						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when +						  *   the interface is enumerated. +						  */ +			} USB_ClassInfo_MIDI_Host_t; + +		/* Enums: */ +			/** Enum for the possible error codes returned by the \ref MIDI_Host_ConfigurePipes() function. */ +			enum MIDI_Host_EnumerationFailure_ErrorCodes_t +			{ +				MIDI_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */ +				MIDI_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */ +				MIDI_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible MIDI interface was not found in the device's Configuration Descriptor. */ +				MIDI_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ +			}; + +		/* Function Prototypes: */ +			/** Host interface configuration routine, to configure a given MIDI host interface instance using the Configuration +			 *  Descriptor read from an attached USB device. This function automatically updates the given MIDI Host instance's +			 *  state values and configures the pipes required to communicate with the interface if it is found within the device. +			 *  This should be called once after the stack has enumerated the attached device, while the host state machine is in +			 *  the Addressed state. +			 * +			 *  \param[in,out] MIDIInterfaceInfo     Pointer to a structure containing an MIDI Class host configuration and state. +			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor. +			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor. +			 * +			 *  \return A value from the \ref MIDI_Host_EnumerationFailure_ErrorCodes_t enum. +			 */ +			uint8_t MIDI_Host_ConfigurePipes(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo, +			                                 uint16_t ConfigDescriptorSize, +			                                 void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); + +			/** General management task for a given MIDI host class interface, required for the correct operation of the interface. This should +			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). +			 * +			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing an MIDI Class host configuration and state. +			 */ +			void MIDI_Host_USBTask(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a MIDI event packet to the device. If no device is connected, the event packet is discarded. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state. +			 *  \param[in]     Event              Pointer to a populated USB_MIDI_EventPacket_t structure containing the MIDI event to send. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t MIDI_Host_SendEventPacket(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo, +			                                  MIDI_EventPacket_t* const Event) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Flushes the MIDI send buffer, sending any queued MIDI events to the device. This should be called to override the +			 *  \ref MIDI_Host_SendEventPacket() function's packing behavior, to flush queued events. Events are queued into the +			 *  pipe bank until either the pipe bank is full, or \ref MIDI_Host_Flush() is called. This allows for multiple MIDI +			 *  events to be packed into a single pipe packet, increasing data throughput. +			 * +			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state. +			 * +			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum. +			 */ +			 uint8_t MIDI_Host_Flush(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Receives a MIDI event packet from the device. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] MIDIInterfaceInfo  Pointer to a structure containing a MIDI Class configuration and state. +			 *  \param[out]    Event              Pointer to a USB_MIDI_EventPacket_t structure where the received MIDI event is to be placed. +			 * +			 *  \return Boolean \c true if a MIDI event packet was received, \c false otherwise. +			 */ +			bool MIDI_Host_ReceiveEventPacket(USB_ClassInfo_MIDI_Host_t* const MIDIInterfaceInfo, +			                                  MIDI_EventPacket_t* const Event) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_MIDI_HOST_C) +				static uint8_t DCOMP_MIDI_Host_NextMIDIStreamingInterface(void* const CurrentDescriptor) +				                                                          ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +				static uint8_t DCOMP_MIDI_Host_NextMIDIStreamingDataEndpoint(void* const CurrentDescriptor) +				                                                             ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +			#endif +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.c new file mode 100644 index 0000000000..f7c5a6a738 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.c @@ -0,0 +1,579 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_HOST) + +#define  __INCLUDE_FROM_MS_DRIVER +#define  __INCLUDE_FROM_MASSSTORAGE_HOST_C +#include "MassStorageClassHost.h" + +uint8_t MS_Host_ConfigurePipes(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +                               uint16_t ConfigDescriptorSize, +							   void* ConfigDescriptorData) +{ +	USB_Descriptor_Endpoint_t*  DataINEndpoint       = NULL; +	USB_Descriptor_Endpoint_t*  DataOUTEndpoint      = NULL; +	USB_Descriptor_Interface_t* MassStorageInterface = NULL; + +	memset(&MSInterfaceInfo->State, 0x00, sizeof(MSInterfaceInfo->State)); + +	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration) +	  return MS_ENUMERROR_InvalidConfigDescriptor; + +	while (!(DataINEndpoint) || !(DataOUTEndpoint)) +	{ +		if (!(MassStorageInterface) || +		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +		                              DCOMP_MS_Host_NextMSInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) +		{ +			if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +			                              DCOMP_MS_Host_NextMSInterface) != DESCRIPTOR_SEARCH_COMP_Found) +			{ +				return MS_ENUMERROR_NoCompatibleInterfaceFound; +			} + +			MassStorageInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t); + +			DataINEndpoint  = NULL; +			DataOUTEndpoint = NULL; + +			continue; +		} + +		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t); + +		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN) +		  DataINEndpoint  = EndpointData; +		else +		  DataOUTEndpoint = EndpointData; +	} + +	MSInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize); +	MSInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress; +	MSInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_BULK; + +	MSInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize); +	MSInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress; +	MSInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_BULK; + +	if (!(Pipe_ConfigurePipeTable(&MSInterfaceInfo->Config.DataINPipe, 1))) +	  return MS_ENUMERROR_PipeConfigurationFailed; + +	if (!(Pipe_ConfigurePipeTable(&MSInterfaceInfo->Config.DataOUTPipe, 1))) +	  return MS_ENUMERROR_PipeConfigurationFailed; + +	MSInterfaceInfo->State.InterfaceNumber = MassStorageInterface->InterfaceNumber; +	MSInterfaceInfo->State.IsActive = true; + +	return MS_ENUMERROR_NoError; +} + +static uint8_t DCOMP_MS_Host_NextMSInterface(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Interface) +	{ +		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); + +		if ((Interface->Class    == MS_CSCP_MassStorageClass)        && +		    (Interface->SubClass == MS_CSCP_SCSITransparentSubclass) && +		    (Interface->Protocol == MS_CSCP_BulkOnlyTransportProtocol)) +		{ +			return DESCRIPTOR_SEARCH_Found; +		} +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +static uint8_t DCOMP_MS_Host_NextMSInterfaceEndpoint(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Endpoint) +	{ +		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); + +		uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK); + +		if ((EndpointType == EP_TYPE_BULK) && (!(Pipe_IsEndpointBound(Endpoint->EndpointAddress)))) +		{ +			return DESCRIPTOR_SEARCH_Found; +		} +	} +	else if (Header->Type == DTYPE_Interface) +	{ +		return DESCRIPTOR_SEARCH_Fail; +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +static uint8_t MS_Host_SendCommand(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +                                   MS_CommandBlockWrapper_t* const SCSICommandBlock, +                                   const void* const BufferPtr) +{ +	uint8_t ErrorCode = PIPE_RWSTREAM_NoError; + +	if (++MSInterfaceInfo->State.TransactionTag == 0xFFFFFFFF) +	  MSInterfaceInfo->State.TransactionTag = 1; + +	SCSICommandBlock->Signature = CPU_TO_LE32(MS_CBW_SIGNATURE); +	SCSICommandBlock->Tag       = cpu_to_le32(MSInterfaceInfo->State.TransactionTag); + +	Pipe_SelectPipe(MSInterfaceInfo->Config.DataOUTPipe.Address); +	Pipe_Unfreeze(); + +	if ((ErrorCode = Pipe_Write_Stream_LE(SCSICommandBlock, sizeof(MS_CommandBlockWrapper_t), +	                                      NULL)) != PIPE_RWSTREAM_NoError) +	{ +		return ErrorCode; +	} + +	Pipe_ClearOUT(); +	Pipe_WaitUntilReady(); + +	Pipe_Freeze(); + +	if (BufferPtr != NULL) +	{ +		ErrorCode = MS_Host_SendReceiveData(MSInterfaceInfo, SCSICommandBlock, (void*)BufferPtr); + +		if ((ErrorCode != PIPE_RWSTREAM_NoError) && (ErrorCode != PIPE_RWSTREAM_PipeStalled)) +		{ +			Pipe_Freeze(); +			return ErrorCode; +		} +	} + +	MS_CommandStatusWrapper_t SCSIStatusBlock; +	return MS_Host_GetReturnedStatus(MSInterfaceInfo, &SCSIStatusBlock); +} + +static uint8_t MS_Host_WaitForDataReceived(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo) +{ +	uint16_t TimeoutMSRem        = MS_COMMAND_DATA_TIMEOUT_MS; +	uint16_t PreviousFrameNumber = USB_Host_GetFrameNumber(); + +	Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipe.Address); +	Pipe_Unfreeze(); + +	while (!(Pipe_IsINReceived())) +	{ +		uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber(); + +		if (CurrentFrameNumber != PreviousFrameNumber) +		{ +			PreviousFrameNumber = CurrentFrameNumber; + +			if (!(TimeoutMSRem--)) +			  return PIPE_RWSTREAM_Timeout; +		} + +		Pipe_Freeze(); +		Pipe_SelectPipe(MSInterfaceInfo->Config.DataOUTPipe.Address); +		Pipe_Unfreeze(); + +		if (Pipe_IsStalled()) +		{ +			USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress()); +			return PIPE_RWSTREAM_PipeStalled; +		} + +		Pipe_Freeze(); +		Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipe.Address); +		Pipe_Unfreeze(); + +		if (Pipe_IsStalled()) +		{ +			USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress()); +			return PIPE_RWSTREAM_PipeStalled; +		} + +		if (USB_HostState == HOST_STATE_Unattached) +		  return PIPE_RWSTREAM_DeviceDisconnected; +	}; + +	Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipe.Address); +	Pipe_Freeze(); + +	Pipe_SelectPipe(MSInterfaceInfo->Config.DataOUTPipe.Address); +	Pipe_Freeze(); + +	return PIPE_RWSTREAM_NoError; +} + +static uint8_t MS_Host_SendReceiveData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +                                       MS_CommandBlockWrapper_t* const SCSICommandBlock, +                                       void* BufferPtr) +{ +	uint8_t  ErrorCode = PIPE_RWSTREAM_NoError; +	uint16_t BytesRem  = le32_to_cpu(SCSICommandBlock->DataTransferLength); + +	if (SCSICommandBlock->Flags & MS_COMMAND_DIR_DATA_IN) +	{ +		if ((ErrorCode = MS_Host_WaitForDataReceived(MSInterfaceInfo)) != PIPE_RWSTREAM_NoError) +		{ +			Pipe_Freeze(); +			return ErrorCode; +		} + +		Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipe.Address); +		Pipe_Unfreeze(); + +		if ((ErrorCode = Pipe_Read_Stream_LE(BufferPtr, BytesRem, NULL)) != PIPE_RWSTREAM_NoError) +		  return ErrorCode; + +		Pipe_ClearIN(); +	} +	else +	{ +		Pipe_SelectPipe(MSInterfaceInfo->Config.DataOUTPipe.Address); +		Pipe_Unfreeze(); + +		if ((ErrorCode = Pipe_Write_Stream_LE(BufferPtr, BytesRem, NULL)) != PIPE_RWSTREAM_NoError) +		  return ErrorCode; + +		Pipe_ClearOUT(); + +		while (!(Pipe_IsOUTReady())) +		{ +			if (USB_HostState == HOST_STATE_Unattached) +			  return PIPE_RWSTREAM_DeviceDisconnected; +		} +	} + +	Pipe_Freeze(); + +	return ErrorCode; +} + +static uint8_t MS_Host_GetReturnedStatus(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +                                         MS_CommandStatusWrapper_t* const SCSICommandStatus) +{ +	uint8_t ErrorCode = PIPE_RWSTREAM_NoError; + +	if ((ErrorCode = MS_Host_WaitForDataReceived(MSInterfaceInfo)) != PIPE_RWSTREAM_NoError) +	  return ErrorCode; + +	Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipe.Address); +	Pipe_Unfreeze(); + +	if ((ErrorCode = Pipe_Read_Stream_LE(SCSICommandStatus, sizeof(MS_CommandStatusWrapper_t), +	                                     NULL)) != PIPE_RWSTREAM_NoError) +	{ +		return ErrorCode; +	} + +	Pipe_ClearIN(); +	Pipe_Freeze(); + +	if (SCSICommandStatus->Status != MS_SCSI_COMMAND_Pass) +	  ErrorCode = MS_ERROR_LOGICAL_CMD_FAILED; + +	return ErrorCode; +} + +uint8_t MS_Host_ResetMSInterface(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo) +{ +	uint8_t ErrorCode; + +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE), +			.bRequest      = MS_REQ_MassStorageReset, +			.wValue        = 0, +			.wIndex        = MSInterfaceInfo->State.InterfaceNumber, +			.wLength       = 0, +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	if ((ErrorCode = USB_Host_SendControlRequest(NULL)) != HOST_SENDCONTROL_Successful) +	  return ErrorCode; + +	Pipe_SelectPipe(MSInterfaceInfo->Config.DataINPipe.Address); + +	if ((ErrorCode = USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress())) != HOST_SENDCONTROL_Successful) +	  return ErrorCode; + +	Pipe_SelectPipe(MSInterfaceInfo->Config.DataOUTPipe.Address); + +	if ((ErrorCode = USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress())) != HOST_SENDCONTROL_Successful) +	  return ErrorCode; + +	return HOST_SENDCONTROL_Successful; +} + +uint8_t MS_Host_GetMaxLUN(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +                          uint8_t* const MaxLUNIndex) +{ +	uint8_t ErrorCode; + +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE), +			.bRequest      = MS_REQ_GetMaxLUN, +			.wValue        = 0, +			.wIndex        = MSInterfaceInfo->State.InterfaceNumber, +			.wLength       = 1, +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	if ((ErrorCode = USB_Host_SendControlRequest(MaxLUNIndex)) == HOST_SENDCONTROL_SetupStalled) +	{ +		*MaxLUNIndex = 0; +		ErrorCode    = HOST_SENDCONTROL_Successful; +	} + +	return ErrorCode; +} + +uint8_t MS_Host_GetInquiryData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +                               const uint8_t LUNIndex, +                               SCSI_Inquiry_Response_t* const InquiryData) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.IsActive)) +	  return HOST_SENDCONTROL_DeviceDisconnected; + +	MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t) +		{ +			.DataTransferLength = CPU_TO_LE32(sizeof(SCSI_Inquiry_Response_t)), +			.Flags              = MS_COMMAND_DIR_DATA_IN, +			.LUN                = LUNIndex, +			.SCSICommandLength  = 6, +			.SCSICommandData    = +				{ +					SCSI_CMD_INQUIRY, +					0x00,                            // Reserved +					0x00,                            // Reserved +					0x00,                            // Reserved +					sizeof(SCSI_Inquiry_Response_t), // Allocation Length +					0x00                             // Unused (control) +				} +		}; + +	return MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, InquiryData); +} + +uint8_t MS_Host_TestUnitReady(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +                              const uint8_t LUNIndex) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.IsActive)) +	  return HOST_SENDCONTROL_DeviceDisconnected; + +	MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t) +		{ +			.DataTransferLength = CPU_TO_LE32(0), +			.Flags              = MS_COMMAND_DIR_DATA_IN, +			.LUN                = LUNIndex, +			.SCSICommandLength  = 6, +			.SCSICommandData    = +				{ +					SCSI_CMD_TEST_UNIT_READY, +					0x00,                   // Reserved +					0x00,                   // Reserved +					0x00,                   // Reserved +					0x00,                   // Reserved +					0x00                    // Unused (control) +				} +		}; + +	return MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, NULL); +} + +uint8_t MS_Host_ReadDeviceCapacity(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +                                   const uint8_t LUNIndex, +                                   SCSI_Capacity_t* const DeviceCapacity) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.IsActive)) +	  return HOST_SENDCONTROL_DeviceDisconnected; + +	uint8_t ErrorCode; + +	MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t) +		{ +			.DataTransferLength = CPU_TO_LE32(sizeof(SCSI_Capacity_t)), +			.Flags              = MS_COMMAND_DIR_DATA_IN, +			.LUN                = LUNIndex, +			.SCSICommandLength  = 10, +			.SCSICommandData    = +				{ +					SCSI_CMD_READ_CAPACITY_10, +					0x00,                   // Reserved +					0x00,                   // MSB of Logical block address +					0x00, +					0x00, +					0x00,                   // LSB of Logical block address +					0x00,                   // Reserved +					0x00,                   // Reserved +					0x00,                   // Partial Medium Indicator +					0x00                    // Unused (control) +				} +		}; + +	if ((ErrorCode = MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, DeviceCapacity)) != PIPE_RWSTREAM_NoError) +	  return ErrorCode; + +	DeviceCapacity->Blocks    = BE32_TO_CPU(DeviceCapacity->Blocks); +	DeviceCapacity->BlockSize = BE32_TO_CPU(DeviceCapacity->BlockSize); + +	return PIPE_RWSTREAM_NoError; +} + +uint8_t MS_Host_RequestSense(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +                             const uint8_t LUNIndex, +                             SCSI_Request_Sense_Response_t* const SenseData) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.IsActive)) +	  return HOST_SENDCONTROL_DeviceDisconnected; + +	MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t) +		{ +			.DataTransferLength = CPU_TO_LE32(sizeof(SCSI_Request_Sense_Response_t)), +			.Flags              = MS_COMMAND_DIR_DATA_IN, +			.LUN                = LUNIndex, +			.SCSICommandLength  = 6, +			.SCSICommandData    = +				{ +					SCSI_CMD_REQUEST_SENSE, +					0x00,                                  // Reserved +					0x00,                                  // Reserved +					0x00,                                  // Reserved +					sizeof(SCSI_Request_Sense_Response_t), // Allocation Length +					0x00                                   // Unused (control) +				} +		}; + +	return MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, SenseData); +} + +uint8_t MS_Host_PreventAllowMediumRemoval(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +                                          const uint8_t LUNIndex, +                                          const bool PreventRemoval) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.IsActive)) +	  return HOST_SENDCONTROL_DeviceDisconnected; + +	MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t) +		{ +			.DataTransferLength = CPU_TO_LE32(0), +			.Flags              = MS_COMMAND_DIR_DATA_OUT, +			.LUN                = LUNIndex, +			.SCSICommandLength  = 6, +			.SCSICommandData    = +				{ +					SCSI_CMD_PREVENT_ALLOW_MEDIUM_REMOVAL, +					0x00,                   // Reserved +					0x00,                   // Reserved +					PreventRemoval,         // Prevent flag +					0x00,                   // Reserved +					0x00                    // Unused (control) +				} +		}; + +	return MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, NULL); +} + +uint8_t MS_Host_ReadDeviceBlocks(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +                                 const uint8_t LUNIndex, +                                 const uint32_t BlockAddress, +                                 const uint8_t Blocks, +                                 const uint16_t BlockSize, +                                 void* BlockBuffer) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.IsActive)) +	  return HOST_SENDCONTROL_DeviceDisconnected; + +	MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t) +		{ +			.DataTransferLength = cpu_to_le32((uint32_t)Blocks * BlockSize), +			.Flags              = MS_COMMAND_DIR_DATA_IN, +			.LUN                = LUNIndex, +			.SCSICommandLength  = 10, +			.SCSICommandData    = +				{ +					SCSI_CMD_READ_10, +					0x00,                   // Unused (control bits, all off) +					(BlockAddress >> 24),   // MSB of Block Address +					(BlockAddress >> 16), +					(BlockAddress >> 8), +					(BlockAddress & 0xFF),  // LSB of Block Address +					0x00,                   // Reserved +					0x00,                   // MSB of Total Blocks to Read +					Blocks,                 // LSB of Total Blocks to Read +					0x00                    // Unused (control) +				} +		}; + +	return MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, BlockBuffer); +} + +uint8_t MS_Host_WriteDeviceBlocks(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +                                  const uint8_t LUNIndex, +                                  const uint32_t BlockAddress, +                                  const uint8_t Blocks, +                                  const uint16_t BlockSize, +                                  const void* BlockBuffer) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(MSInterfaceInfo->State.IsActive)) +	  return HOST_SENDCONTROL_DeviceDisconnected; + +	MS_CommandBlockWrapper_t SCSICommandBlock = (MS_CommandBlockWrapper_t) +		{ +			.DataTransferLength = cpu_to_le32((uint32_t)Blocks * BlockSize), +			.Flags              = MS_COMMAND_DIR_DATA_OUT, +			.LUN                = LUNIndex, +			.SCSICommandLength  = 10, +			.SCSICommandData    = +				{ +					SCSI_CMD_WRITE_10, +					0x00,                   // Unused (control bits, all off) +					(BlockAddress >> 24),   // MSB of Block Address +					(BlockAddress >> 16), +					(BlockAddress >> 8), +					(BlockAddress & 0xFF),  // LSB of Block Address +					0x00,                   // Reserved +					0x00,                   // MSB of Total Blocks to Write +					Blocks,                 // LSB of Total Blocks to Write +					0x00                    // Unused (control) +				} +		}; + +	return MS_Host_SendCommand(MSInterfaceInfo, &SCSICommandBlock, BlockBuffer); +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.h new file mode 100644 index 0000000000..348050f8f5 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/MassStorageClassHost.h @@ -0,0 +1,335 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Host mode driver for the library USB Mass Storage Class driver. + * + *  Host mode driver for the library USB Mass Storage Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassMS + *  \defgroup Group_USBClassMassStorageHost Mass Storage Class Host Mode Driver + * + *  \section Sec_USBClassMassStorageHost_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Host/MassStorageClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassMassStorageHost_ModDescription Module Description + *  Host Mode USB Class driver framework interface, for the Mass Storage USB Class driver. + * + *  @{ + */ + +#ifndef __MS_CLASS_HOST_H__ +#define __MS_CLASS_HOST_H__ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/MassStorageClassCommon.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_MS_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Error code for some Mass Storage Host functions, indicating a logical (and not hardware) error. */ +			#define MS_ERROR_LOGICAL_CMD_FAILED              0x80 + +		/* Type Defines: */ +			/** \brief Mass Storage Class Host Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made within the user application, +			 *  and passed to each of the Mass Storage class driver functions as the \c MSInterfaceInfo parameter. This +			 *  stores each Mass Storage interface's configuration and state information. +			 */ +			typedef struct +			{ +				struct +				{ +					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */ +					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */ +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ +				struct +				{ +					bool     IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid +					                    *   after \ref MS_Host_ConfigurePipes() is called and the Host state machine is in the +					                    *   Configured state. +					                    */ +					uint8_t  InterfaceNumber; /**< Interface index of the Mass Storage interface within the attached device. */ + +					uint32_t TransactionTag; /**< Current transaction tag for data synchronizing of packets. */ +				} State; /**< State data for the USB class interface within the device. All elements in this section +						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when +						  *   the interface is enumerated. +						  */ +			} USB_ClassInfo_MS_Host_t; + +			/** \brief SCSI Device LUN Capacity Structure. +			 * +			 *  SCSI capacity structure, to hold the total capacity of the device in both the number +			 *  of blocks in the current LUN, and the size of each block. This structure is filled by +			 *  the device when the \ref MS_Host_ReadDeviceCapacity() function is called. +			 */ +			typedef struct +			{ +				uint32_t Blocks; /**< Number of blocks in the addressed LUN of the device. */ +				uint32_t BlockSize; /**< Number of bytes in each block in the addressed LUN. */ +			} SCSI_Capacity_t; + +		/* Enums: */ +			/** Enum for the possible error codes returned by the \ref MS_Host_ConfigurePipes() function. */ +			enum MS_Host_EnumerationFailure_ErrorCodes_t +			{ +				MS_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */ +				MS_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */ +				MS_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible Mass Storage interface was not found in the device's Configuration Descriptor. */ +				MS_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ +			}; + +		/* Function Prototypes: */ +			/** Host interface configuration routine, to configure a given Mass Storage host interface instance using the +			 *  Configuration Descriptor read from an attached USB device. This function automatically updates the given Mass +			 *  Storage Host instance's state values and configures the pipes required to communicate with the interface if it +			 *  is found within the device. This should be called once after the stack has enumerated the attached device, while +			 *  the host state machine is in the Addressed state. +			 * +			 *  \param[in,out] MSInterfaceInfo         Pointer to a structure containing an MS Class host configuration and state. +			 *  \param[in]     ConfigDescriptorSize    Length of the attached device's Configuration Descriptor. +			 *  \param[in]     DeviceConfigDescriptor  Pointer to a buffer containing the attached device's Configuration Descriptor. +			 * +			 *  \return A value from the \ref MS_Host_EnumerationFailure_ErrorCodes_t enum. +			 */ +			uint8_t MS_Host_ConfigurePipes(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +			                               uint16_t ConfigDescriptorSize, +			                               void* DeviceConfigDescriptor) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); + +			/** Sends a MASS STORAGE RESET control request to the attached device, resetting the Mass Storage Interface +			 *  and readying it for the next Mass Storage command. This should be called after a failed SCSI request to +			 *  ensure the attached Mass Storage device is ready to receive the next command. +			 * +			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. +			 */ +			uint8_t MS_Host_ResetMSInterface(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a GET MAX LUN control request to the attached device, retrieving the index of the highest LUN (Logical +			 *  UNit, a logical drive) in the device. This value can then be used in the other functions of the Mass Storage +			 *  Host mode Class driver to address a specific LUN within the device. +			 * +			 *  \note Some devices do not support this request, and will STALL it when issued. To get around this, +			 *        on unsupported devices the max LUN index will be reported as zero and no error will be returned +			 *        if the device STALLs the request. +			 * +			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state. +			 *  \param[out]    MaxLUNIndex      Pointer to a location where the highest LUN index value should be stored. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. +			 */ +			uint8_t MS_Host_GetMaxLUN(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +			                          uint8_t* const MaxLUNIndex) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Retrieves the Mass Storage device's inquiry data for the specified LUN, indicating the device characteristics and +			 *  properties. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state. +			 *  \param[in]     LUNIndex         LUN index within the device the command is being issued to. +			 *  \param[out]    InquiryData      Location where the read inquiry data should be stored. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED. +			 */ +			uint8_t MS_Host_GetInquiryData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +			                               const uint8_t LUNIndex, +			                               SCSI_Inquiry_Response_t* const InquiryData) ATTR_NON_NULL_PTR_ARG(1) +			                               ATTR_NON_NULL_PTR_ARG(3); + +			/** Sends a TEST UNIT READY command to the device, to determine if it is ready to accept other SCSI commands. +			 * +			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state. +			 *  \param[in]     LUNIndex         LUN index within the device the command is being issued to. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED if not ready. +			 */ +			uint8_t MS_Host_TestUnitReady(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +			                              const uint8_t LUNIndex) ATTR_NON_NULL_PTR_ARG(1); + +			/** Retrieves the total capacity of the attached USB Mass Storage device, in blocks, and block size. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state. +			 *  \param[in]     LUNIndex         LUN index within the device the command is being issued to. +			 *  \param[out]    DeviceCapacity   Pointer to the location where the capacity information should be stored. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED if not ready. +			 */ +			uint8_t MS_Host_ReadDeviceCapacity(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +			                                   const uint8_t LUNIndex, +			                                   SCSI_Capacity_t* const DeviceCapacity) ATTR_NON_NULL_PTR_ARG(1) +			                                   ATTR_NON_NULL_PTR_ARG(3); + +			/** Retrieves the device sense data, indicating the current device state and error codes for the previously +			 *  issued command. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state. +			 *  \param[in]     LUNIndex         LUN index within the device the command is being issued to. +			 *  \param[out]    SenseData        Pointer to the location where the sense information should be stored. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED if not ready. +			 */ +			uint8_t MS_Host_RequestSense(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +			                             const uint8_t LUNIndex, +			                             SCSI_Request_Sense_Response_t* const SenseData) ATTR_NON_NULL_PTR_ARG(1) +			                             ATTR_NON_NULL_PTR_ARG(3); + +			/** Issues a PREVENT MEDIUM REMOVAL command, to logically (or, depending on the type of device, physically) lock +			 *  the device from removal so that blocks of data on the medium can be read or altered. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state. +			 *  \param[in]     LUNIndex         LUN index within the device the command is being issued to. +			 *  \param[in]     PreventRemoval   Boolean \c true if the device should be locked from removal, \c false otherwise. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED if not ready. +			 */ +			uint8_t MS_Host_PreventAllowMediumRemoval(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +			                                          const uint8_t LUNIndex, +			                                          const bool PreventRemoval) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads blocks of data from the attached Mass Storage device's medium. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state. +			 *  \param[in]     LUNIndex         LUN index within the device the command is being issued to. +			 *  \param[in]     BlockAddress     Starting block address within the device to read from. +			 *  \param[in]     Blocks           Total number of blocks to read. +			 *  \param[in]     BlockSize        Size in bytes of each block within the device. +			 *  \param[out]    BlockBuffer      Pointer to where the read data from the device should be stored. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED if not ready. +			 */ +			uint8_t MS_Host_ReadDeviceBlocks(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +			                                 const uint8_t LUNIndex, +			                                 const uint32_t BlockAddress, +			                                 const uint8_t Blocks, +			                                 const uint16_t BlockSize, +			                                 void* BlockBuffer) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(6); + +			/** Writes blocks of data to the attached Mass Storage device's medium. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing a MS Class host configuration and state. +			 *  \param[in]     LUNIndex         LUN index within the device the command is being issued to. +			 *  \param[in]     BlockAddress     Starting block address within the device to write to. +			 *  \param[in]     Blocks           Total number of blocks to read. +			 *  \param[in]     BlockSize        Size in bytes of each block within the device. +			 *  \param[in]     BlockBuffer      Pointer to where the data to write should be sourced from. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum or \ref MS_ERROR_LOGICAL_CMD_FAILED if not ready. +			 */ +			uint8_t MS_Host_WriteDeviceBlocks(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +			                                  const uint8_t LUNIndex, +			                                  const uint32_t BlockAddress, +			                                  const uint8_t Blocks, +			                                  const uint16_t BlockSize, +			                                  const void* BlockBuffer) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(6); + +		/* Inline Functions: */ +			/** General management task for a given Mass Storage host class interface, required for the correct operation of +			 *  the interface. This should be called frequently in the main program loop, before the master USB management task +			 *  \ref USB_USBTask(). +			 * +			 *  \param[in,out] MSInterfaceInfo  Pointer to a structure containing an Mass Storage Class host configuration and state. +			 */ +			static inline void MS_Host_USBTask(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline void MS_Host_USBTask(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo) +			{ +				(void)MSInterfaceInfo; +			} + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#define MS_COMMAND_DATA_TIMEOUT_MS        10000 + +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_MASSSTORAGE_HOST_C) +				static uint8_t MS_Host_SendCommand(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +				                                   MS_CommandBlockWrapper_t* const SCSICommandBlock, +				                                   const void* const BufferPtr) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); +				static uint8_t MS_Host_WaitForDataReceived(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); +				static uint8_t MS_Host_SendReceiveData(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +				                                       MS_CommandBlockWrapper_t* const SCSICommandBlock, +				                                       void* BufferPtr) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); +				static uint8_t MS_Host_GetReturnedStatus(USB_ClassInfo_MS_Host_t* const MSInterfaceInfo, +				                                         MS_CommandStatusWrapper_t* const SCSICommandStatus) +				                                         ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +				static uint8_t DCOMP_MS_Host_NextMSInterface(void* const CurrentDescriptor) +				                                             ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +				static uint8_t DCOMP_MS_Host_NextMSInterfaceEndpoint(void* const CurrentDescriptor) +				                                                     ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +			#endif +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/PrinterClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/PrinterClassHost.c new file mode 100644 index 0000000000..8a04d0ab8b --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/PrinterClassHost.c @@ -0,0 +1,400 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_HOST) + +#define  __INCLUDE_FROM_PRINTER_DRIVER +#define  __INCLUDE_FROM_PRINTER_HOST_C +#include "PrinterClassHost.h" + +uint8_t PRNT_Host_ConfigurePipes(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, +                                 uint16_t ConfigDescriptorSize, +							     void* ConfigDescriptorData) +{ +	USB_Descriptor_Endpoint_t*  DataINEndpoint   = NULL; +	USB_Descriptor_Endpoint_t*  DataOUTEndpoint  = NULL; +	USB_Descriptor_Interface_t* PrinterInterface = NULL; + +	memset(&PRNTInterfaceInfo->State, 0x00, sizeof(PRNTInterfaceInfo->State)); + +	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration) +	  return PRNT_ENUMERROR_InvalidConfigDescriptor; + +	while (!(DataINEndpoint) || !(DataOUTEndpoint)) +	{ +		if (!(PrinterInterface) || +		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +		                              DCOMP_PRNT_Host_NextPRNTInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) +		{ +			if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +			                              DCOMP_PRNT_Host_NextPRNTInterface) != DESCRIPTOR_SEARCH_COMP_Found) +			{ +				return PRNT_ENUMERROR_NoCompatibleInterfaceFound; +			} + +			PrinterInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t); + +			DataINEndpoint  = NULL; +			DataOUTEndpoint = NULL; + +			continue; +		} + +		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t); + +		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN) +		  DataINEndpoint  = EndpointData; +		else +		  DataOUTEndpoint = EndpointData; +	} + +	PRNTInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize); +	PRNTInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress; +	PRNTInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_BULK; + +	PRNTInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize); +	PRNTInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress; +	PRNTInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_BULK; + +	if (!(Pipe_ConfigurePipeTable(&PRNTInterfaceInfo->Config.DataINPipe, 1))) +	  return PRNT_ENUMERROR_PipeConfigurationFailed; + +	if (!(Pipe_ConfigurePipeTable(&PRNTInterfaceInfo->Config.DataOUTPipe, 1))) +	  return PRNT_ENUMERROR_PipeConfigurationFailed; + +	PRNTInterfaceInfo->State.InterfaceNumber  = PrinterInterface->InterfaceNumber; +	PRNTInterfaceInfo->State.AlternateSetting = PrinterInterface->AlternateSetting; +	PRNTInterfaceInfo->State.IsActive = true; + +	return PRNT_ENUMERROR_NoError; +} + +static uint8_t DCOMP_PRNT_Host_NextPRNTInterface(void* CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Interface) +	{ +		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); + +		if ((Interface->Class    == PRNT_CSCP_PrinterClass)    && +		    (Interface->SubClass == PRNT_CSCP_PrinterSubclass) && +		    (Interface->Protocol == PRNT_CSCP_BidirectionalProtocol)) +		{ +			return DESCRIPTOR_SEARCH_Found; +		} +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +static uint8_t DCOMP_PRNT_Host_NextPRNTInterfaceEndpoint(void* CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Endpoint) +	{ +		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); + +		uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK); + +		if (EndpointType == EP_TYPE_BULK) +		  return DESCRIPTOR_SEARCH_Found; +	} +	else if (Header->Type == DTYPE_Interface) +	{ +		return DESCRIPTOR_SEARCH_Fail; +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +void PRNT_Host_USBTask(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive)) +	  return; + +	#if !defined(NO_CLASS_DRIVER_AUTOFLUSH) +	PRNT_Host_Flush(PRNTInterfaceInfo); +	#endif +} + +uint8_t PRNT_Host_SetBidirectionalMode(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) +{ +	if (PRNTInterfaceInfo->State.AlternateSetting) +	{ +		uint8_t ErrorCode; + +		if ((ErrorCode = USB_Host_SetInterfaceAltSetting(PRNTInterfaceInfo->State.InterfaceNumber, +		                                                 PRNTInterfaceInfo->State.AlternateSetting)) != HOST_SENDCONTROL_Successful) +		{ +			return ErrorCode; +		} +	} + +	return HOST_SENDCONTROL_Successful; +} + +uint8_t PRNT_Host_GetPortStatus(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, +                                uint8_t* const PortStatus) +{ +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE), +			.bRequest      = PRNT_REQ_GetPortStatus, +			.wValue        = 0, +			.wIndex        = PRNTInterfaceInfo->State.InterfaceNumber, +			.wLength       = sizeof(uint8_t), +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); +	return USB_Host_SendControlRequest(PortStatus); +} + +uint8_t PRNT_Host_SoftReset(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) +{ +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE), +			.bRequest      = PRNT_REQ_SoftReset, +			.wValue        = 0, +			.wIndex        = PRNTInterfaceInfo->State.InterfaceNumber, +			.wLength       = 0, +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); +	return USB_Host_SendControlRequest(NULL); +} + +uint8_t PRNT_Host_Flush(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataOUTPipe.Address); +	Pipe_Unfreeze(); + +	if (!(Pipe_BytesInPipe())) +	  return PIPE_READYWAIT_NoError; + +	bool BankFull = !(Pipe_IsReadWriteAllowed()); + +	Pipe_ClearOUT(); + +	if (BankFull) +	{ +		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError) +		  return ErrorCode; + +		Pipe_ClearOUT(); +	} + +	Pipe_Freeze(); + +	return PIPE_READYWAIT_NoError; +} + +uint8_t PRNT_Host_SendByte(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, +                           const uint8_t Data) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; + +	uint8_t ErrorCode; + +	Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataOUTPipe.Address); +	Pipe_Unfreeze(); + +	if (!(Pipe_IsReadWriteAllowed())) +	{ +		Pipe_ClearOUT(); + +		if ((ErrorCode = Pipe_WaitUntilReady()) != PIPE_READYWAIT_NoError) +		  return ErrorCode; +	} + +	Pipe_Write_8(Data); +	Pipe_Freeze(); + +	return PIPE_READYWAIT_NoError; +} + +uint8_t PRNT_Host_SendString(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, +                             const char* const String) +{ +	uint8_t ErrorCode; + +	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive)) +	  return PIPE_RWSTREAM_DeviceDisconnected; + +	Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataOUTPipe.Address); +	Pipe_Unfreeze(); + +	if ((ErrorCode = Pipe_Write_Stream_LE(String, strlen(String), NULL)) != PIPE_RWSTREAM_NoError) +	  return ErrorCode; + +	Pipe_ClearOUT(); + +	ErrorCode = Pipe_WaitUntilReady(); + +	Pipe_Freeze(); + +	return ErrorCode; +} + +uint8_t PRNT_Host_SendData(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, +                           const void* Buffer, +                           const uint16_t Length) +{ +	uint8_t ErrorCode; + +	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive)) +	  return PIPE_RWSTREAM_DeviceDisconnected; + +	Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataOUTPipe.Address); +	Pipe_Unfreeze(); + +	if ((ErrorCode = Pipe_Write_Stream_LE(Buffer, Length, NULL)) != PIPE_RWSTREAM_NoError) +	  return ErrorCode; + +	Pipe_ClearOUT(); + +	ErrorCode = Pipe_WaitUntilReady(); + +	Pipe_Freeze(); + +	return ErrorCode; +} + +uint16_t PRNT_Host_BytesReceived(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive)) +	  return 0; + +	Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataINPipe.Address); +	Pipe_Unfreeze(); + +	if (Pipe_IsINReceived()) +	{ +		if (!(Pipe_BytesInPipe())) +		{ +			Pipe_ClearIN(); +			Pipe_Freeze(); +			return 0; +		} +		else +		{ +			Pipe_Freeze(); +			return Pipe_BytesInPipe(); +		} +	} +	else +	{ +		Pipe_Freeze(); + +		return 0; +	} +} + +int16_t PRNT_Host_ReceiveByte(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(PRNTInterfaceInfo->State.IsActive)) +	  return PIPE_RWSTREAM_DeviceDisconnected; + +	int16_t ReceivedByte = -1; + +	Pipe_SelectPipe(PRNTInterfaceInfo->Config.DataINPipe.Address); +	Pipe_Unfreeze(); + +	if (Pipe_IsINReceived()) +	{ +		if (Pipe_BytesInPipe()) +		  ReceivedByte = Pipe_Read_8(); + +		if (!(Pipe_BytesInPipe())) +		  Pipe_ClearIN(); +	} + +	Pipe_Freeze(); + +	return ReceivedByte; +} + +uint8_t PRNT_Host_GetDeviceID(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, +                              char* const DeviceIDString, +                              const uint16_t BufferSize) +{ +	uint8_t  ErrorCode; +	uint16_t DeviceIDStringLength = 0; + +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE), +			.bRequest      = PRNT_REQ_GetDeviceID, +			.wValue        = 0, +			.wIndex        = PRNTInterfaceInfo->State.InterfaceNumber, +			.wLength       = sizeof(DeviceIDStringLength), +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	if ((ErrorCode = USB_Host_SendControlRequest(&DeviceIDStringLength)) != HOST_SENDCONTROL_Successful) +	  return ErrorCode; + +	if (!(DeviceIDStringLength)) +	{ +		DeviceIDString[0] = 0x00; +		return HOST_SENDCONTROL_Successful; +	} + +	DeviceIDStringLength = be16_to_cpu(DeviceIDStringLength); + +	if (DeviceIDStringLength > BufferSize) +	  DeviceIDStringLength = BufferSize; + +	USB_ControlRequest.wLength = DeviceIDStringLength; + +	if ((ErrorCode = USB_Host_SendControlRequest(DeviceIDString)) != HOST_SENDCONTROL_Successful) +	  return ErrorCode; + +	memmove(&DeviceIDString[0], &DeviceIDString[2], DeviceIDStringLength - 2); + +	DeviceIDString[DeviceIDStringLength - 2] = 0x00; + +	return HOST_SENDCONTROL_Successful; +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/PrinterClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/PrinterClassHost.h new file mode 100644 index 0000000000..511dab4b40 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/PrinterClassHost.h @@ -0,0 +1,285 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Host mode driver for the library USB Printer Class driver. + * + *  Host mode driver for the library USB Printer Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassPrinter + *  \defgroup Group_USBClassPrinterHost Printer Class Host Mode Driver + * + *  \section Sec_USBClassPrinterHost_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Host/PrinterClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassPrinterHost_ModDescription Module Description + *  Host Mode USB Class driver framework interface, for the Printer USB Class driver. + * + *  @{ + */ + +#ifndef __PRINTER_CLASS_HOST_H__ +#define __PRINTER_CLASS_HOST_H__ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/PrinterClassCommon.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_PRINTER_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Type Defines: */ +			/** \brief Printer Class Host Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made within the user application, +			 *  and passed to each of the Printer class driver functions as the \c PRNTInterfaceInfo parameter. This +			 *  stores each Printer interface's configuration and state information. +			 */ +			typedef struct +			{ +				struct +				{ +					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */ +					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */ +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ +				struct +				{ +					bool IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid +					                *   after \ref PRNT_Host_ConfigurePipes() is called and the Host state machine is in the +					                *   Configured state. +					                */ +					uint8_t InterfaceNumber; /**< Interface index of the Printer interface within the attached device. */ +					uint8_t AlternateSetting; /**< Alternate setting within the Printer Interface in the attached device. */ +				} State; /**< State data for the USB class interface within the device. All elements in this section +						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when +						  *   the interface is enumerated. +						  */ +			} USB_ClassInfo_PRNT_Host_t; + +		/* Enums: */ +			/** Enum for the possible error codes returned by the \ref PRNT_Host_ConfigurePipes() function. */ +			enum PRNT_Host_EnumerationFailure_ErrorCodes_t +			{ +				PRNT_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */ +				PRNT_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */ +				PRNT_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible Printer interface was not found in the device's Configuration Descriptor. */ +				PRNT_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ +			}; + +		/* Function Prototypes: */ +			/** Host interface configuration routine, to configure a given Printer host interface instance using the +			 *  Configuration Descriptor read from an attached USB device. This function automatically updates the given Printer +			 *  instance's state values and configures the pipes required to communicate with the interface if it is found within +			 *  the device. This should be called once after the stack has enumerated the attached device, while the host state +			 *  machine is in the Addressed state. +			 * +			 *  \param[in,out] PRNTInterfaceInfo     Pointer to a structure containing a Printer Class host configuration and state. +			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor. +			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor. +			 * +			 *  \return A value from the \ref PRNT_Host_EnumerationFailure_ErrorCodes_t enum. +			 */ +			uint8_t PRNT_Host_ConfigurePipes(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, +			                                 uint16_t ConfigDescriptorSize, +			                                 void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); + +			/** General management task for a given Printer host class interface, required for the correct operation of +			 *  the interface. This should be called frequently in the main program loop, before the master USB management task +			 *  \ref USB_USBTask(). +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state. +			 */ +			void PRNT_Host_USBTask(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Configures the printer to enable Bidirectional mode, if it is not already in this mode. This should be called +			 *  once the connected device's configuration has been set, to ensure the printer is ready to accept commands. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. +			 */ +			uint8_t PRNT_Host_SetBidirectionalMode(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Retrieves the status of the virtual Printer port's inbound status lines. The result can then be masked against the +			 *  \c PRNT_PORTSTATUS_* macros to determine the printer port's status. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state. +			 *  \param[out]    PortStatus         Location where the retrieved port status should be stored. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. +			 */ +			uint8_t PRNT_Host_GetPortStatus(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, +			                                uint8_t* const PortStatus) +			                                ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Soft-resets the attached printer, readying it for new commands. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum. +			 */ +			uint8_t PRNT_Host_SoftReset(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Flushes any data waiting to be sent, ensuring that the send buffer is cleared. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state. +			 * +			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum. +			 */ +			uint8_t PRNT_Host_Flush(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends the given null terminated string to the attached printer's input endpoint. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state. +			 *  \param[in]     String             Pointer to a null terminated string to send. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t PRNT_Host_SendString(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, +			                             const char* const String) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Sends the given raw data stream to the attached printer's input endpoint. This should contain commands that the +			 *  printer is able to understand - for example, PCL data. Not all printers accept all printer languages; see +			 *  \ref PRNT_Host_GetDeviceID() for details on determining acceptable languages for an attached printer. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state. +			 *  \param[in]     Buffer             Pointer to a buffer containing the raw command stream to send to the printer. +			 *  \param[in]     Length             Size in bytes of the command stream to be sent. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t PRNT_Host_SendData(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, +			                           const void* Buffer, +			                           const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Sends a given byte to the attached USB device, if connected. If a device is not connected when the function is called, the +			 *  byte is discarded. Bytes will be queued for transmission to the device until either the pipe bank becomes full, or the +			 *  \ref PRNT_Host_Flush() function is called to flush the pending data to the host. This allows for multiple bytes to be +			 *  packed into a single pipe packet, increasing data throughput. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state. +			 *  \param[in]     Data               Byte of data to send to the device. +			 * +			 *  \return A value from the \ref Pipe_WaitUntilReady_ErrorCodes_t enum. +			 */ +			uint8_t PRNT_Host_SendByte(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, +			                           const uint8_t Data) ATTR_NON_NULL_PTR_ARG(1); + +			/** Determines the number of bytes received by the printer interface from the device, waiting to be read. This indicates the number +			 *  of bytes in the IN pipe bank only, and thus the number of calls to \ref PRNT_Host_ReceiveByte() which are guaranteed to succeed +			 *  immediately. If multiple bytes are to be received, they should be buffered by the user application, as the pipe bank will not be +			 *  released back to the USB controller until all bytes are read. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state. +			 * +			 *  \return Total number of buffered bytes received from the device. +			 */ +			uint16_t PRNT_Host_BytesReceived(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads a byte of data from the device. If no data is waiting to be read of if a USB device is not connected, the function +			 *  returns a negative value. The \ref PRNT_Host_BytesReceived() function may be queried in advance to determine how many bytes +			 *  are currently buffered in the Printer interface's data receive pipe. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state. +			 * +			 *  \return Next received byte from the device, or a negative value if no data received. +			 */ +			int16_t PRNT_Host_ReceiveByte(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Retrieves the attached printer device's ID string, formatted according to IEEE 1284. This string is sent as a +			 *  Unicode string from the device and is automatically converted to an ASCII encoded C string by this function, thus +			 *  the maximum reportable string length is two less than the size given (to accommodate the Unicode string length +			 *  bytes which are removed). +			 * +			 *  This string, when supported, contains the model, manufacturer and acceptable printer languages for the attached device. +			 * +			 *  \param[in,out] PRNTInterfaceInfo  Pointer to a structure containing a Printer Class host configuration and state. +			 *  \param[out]    DeviceIDString     Pointer to a buffer where the Device ID string should be stored, in ASCII format. +			 *  \param[in]     BufferSize         Size in bytes of the buffer allocated for the Device ID string. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t PRNT_Host_GetDeviceID(USB_ClassInfo_PRNT_Host_t* const PRNTInterfaceInfo, +			                              char* const DeviceIDString, +			                              const uint16_t BufferSize) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_PRINTER_HOST_C) +				static uint8_t DCOMP_PRNT_Host_NextPRNTInterface(void* const CurrentDescriptor) +				                                                 ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +				static uint8_t DCOMP_PRNT_Host_NextPRNTInterfaceEndpoint(void* const CurrentDescriptor) +				                                                         ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +			#endif +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/RNDISClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/RNDISClassHost.c new file mode 100644 index 0000000000..6fb09fdab2 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/RNDISClassHost.c @@ -0,0 +1,476 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_HOST) + +#define  __INCLUDE_FROM_RNDIS_DRIVER +#define  __INCLUDE_FROM_RNDIS_HOST_C +#include "RNDISClassHost.h" + +uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, +                                  uint16_t ConfigDescriptorSize, +                                  void* ConfigDescriptorData) +{ +	USB_Descriptor_Endpoint_t*  DataINEndpoint        = NULL; +	USB_Descriptor_Endpoint_t*  DataOUTEndpoint       = NULL; +	USB_Descriptor_Endpoint_t*  NotificationEndpoint  = NULL; +	USB_Descriptor_Interface_t* RNDISControlInterface = NULL; + +	memset(&RNDISInterfaceInfo->State, 0x00, sizeof(RNDISInterfaceInfo->State)); + +	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration) +	  return RNDIS_ENUMERROR_InvalidConfigDescriptor; + +	RNDISControlInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t); + +	while (!(DataINEndpoint) || !(DataOUTEndpoint) || !(NotificationEndpoint)) +	{ +		if (!(RNDISControlInterface) || +		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +		                              DCOMP_RNDIS_Host_NextRNDISInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) +		{ +			if (NotificationEndpoint) +			{ +				if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +											  DCOMP_RNDIS_Host_NextRNDISDataInterface) != DESCRIPTOR_SEARCH_COMP_Found) +				{ +					return RNDIS_ENUMERROR_NoCompatibleInterfaceFound; +				} + +				DataINEndpoint  = NULL; +				DataOUTEndpoint = NULL; +			} +			else +			{ +				if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +											  DCOMP_RNDIS_Host_NextRNDISControlInterface) != DESCRIPTOR_SEARCH_COMP_Found) +				{ +					return RNDIS_ENUMERROR_NoCompatibleInterfaceFound; +				} + +				RNDISControlInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t); + +				NotificationEndpoint = NULL; +			} + +			continue; +		} + +		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t); + +		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN) +		{ +			if ((EndpointData->Attributes & EP_TYPE_MASK) == EP_TYPE_INTERRUPT) +			  NotificationEndpoint = EndpointData; +			else +			  DataINEndpoint = EndpointData; +		} +		else +		{ +			DataOUTEndpoint = EndpointData; +		} +	} + +	RNDISInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize); +	RNDISInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress; +	RNDISInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_BULK; + +	RNDISInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize); +	RNDISInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress; +	RNDISInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_BULK; + +	RNDISInterfaceInfo->Config.NotificationPipe.Size = le16_to_cpu(NotificationEndpoint->EndpointSize); +	RNDISInterfaceInfo->Config.NotificationPipe.EndpointAddress = NotificationEndpoint->EndpointAddress; +	RNDISInterfaceInfo->Config.NotificationPipe.Type = EP_TYPE_INTERRUPT; + +	if (!(Pipe_ConfigurePipeTable(&RNDISInterfaceInfo->Config.DataINPipe, 1))) +	  return RNDIS_ENUMERROR_PipeConfigurationFailed; + +	if (!(Pipe_ConfigurePipeTable(&RNDISInterfaceInfo->Config.DataOUTPipe, 1))) +	  return RNDIS_ENUMERROR_PipeConfigurationFailed; + +	if (!(Pipe_ConfigurePipeTable(&RNDISInterfaceInfo->Config.NotificationPipe, 1))) +	  return RNDIS_ENUMERROR_PipeConfigurationFailed; + +	RNDISInterfaceInfo->State.ControlInterfaceNumber = RNDISControlInterface->InterfaceNumber; +	RNDISInterfaceInfo->State.IsActive = true; + +	return RNDIS_ENUMERROR_NoError; +} + +static uint8_t DCOMP_RNDIS_Host_NextRNDISControlInterface(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Interface) +	{ +		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); + +		if ((Interface->Class    == CDC_CSCP_CDCClass)    && +		    (Interface->SubClass == CDC_CSCP_ACMSubclass) && +		    (Interface->Protocol == CDC_CSCP_VendorSpecificProtocol)) +		{ +			return DESCRIPTOR_SEARCH_Found; +		} +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +static uint8_t DCOMP_RNDIS_Host_NextRNDISDataInterface(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Interface) +	{ +		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, +		                                                         USB_Descriptor_Interface_t); + +		if ((Interface->Class    == CDC_CSCP_CDCDataClass)   && +		    (Interface->SubClass == CDC_CSCP_NoDataSubclass) && +		    (Interface->Protocol == CDC_CSCP_NoDataProtocol)) +		{ +			return DESCRIPTOR_SEARCH_Found; +		} +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +static uint8_t DCOMP_RNDIS_Host_NextRNDISInterfaceEndpoint(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Endpoint) +	{ +		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); + +		uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK); + +		if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) && +		    !(Pipe_IsEndpointBound(Endpoint->EndpointAddress))) +		{ +			return DESCRIPTOR_SEARCH_Found; +		} +	} +	else if (Header->Type == DTYPE_Interface) +	{ +		return DESCRIPTOR_SEARCH_Fail; +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +static uint8_t RNDIS_SendEncapsulatedCommand(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, +                                             void* Buffer, +                                             const uint16_t Length) +{ +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE), +			.bRequest      = RNDIS_REQ_SendEncapsulatedCommand, +			.wValue        = 0, +			.wIndex        = RNDISInterfaceInfo->State.ControlInterfaceNumber, +			.wLength       = Length, +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	return USB_Host_SendControlRequest(Buffer); +} + +static uint8_t RNDIS_GetEncapsulatedResponse(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, +                                             void* Buffer, +                                             const uint16_t Length) +{ +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE), +			.bRequest      = RNDIS_REQ_GetEncapsulatedResponse, +			.wValue        = 0, +			.wIndex        = RNDISInterfaceInfo->State.ControlInterfaceNumber, +			.wLength       = Length, +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	return USB_Host_SendControlRequest(Buffer); +} + +uint8_t RNDIS_Host_SendKeepAlive(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo) +{ +	uint8_t ErrorCode; + +	RNDIS_KeepAlive_Message_t  KeepAliveMessage; +	RNDIS_KeepAlive_Complete_t KeepAliveMessageResponse; + +	KeepAliveMessage.MessageType     = CPU_TO_LE32(REMOTE_NDIS_KEEPALIVE_MSG); +	KeepAliveMessage.MessageLength   = CPU_TO_LE32(sizeof(RNDIS_KeepAlive_Message_t)); +	KeepAliveMessage.RequestId       = cpu_to_le32(RNDISInterfaceInfo->State.RequestID++); + +	if ((ErrorCode = RNDIS_SendEncapsulatedCommand(RNDISInterfaceInfo, &KeepAliveMessage, +	                                               sizeof(RNDIS_KeepAlive_Message_t))) != HOST_SENDCONTROL_Successful) +	{ +		return ErrorCode; +	} + +	if ((ErrorCode = RNDIS_GetEncapsulatedResponse(RNDISInterfaceInfo, &KeepAliveMessageResponse, +	                                               sizeof(RNDIS_KeepAlive_Complete_t))) != HOST_SENDCONTROL_Successful) +	{ +		return ErrorCode; +	} + +	return HOST_SENDCONTROL_Successful; +} + +uint8_t RNDIS_Host_InitializeDevice(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo) +{ +	uint8_t ErrorCode; + +	RNDIS_Initialize_Message_t  InitMessage; +	RNDIS_Initialize_Complete_t InitMessageResponse; + +	InitMessage.MessageType     = CPU_TO_LE32(REMOTE_NDIS_INITIALIZE_MSG); +	InitMessage.MessageLength   = CPU_TO_LE32(sizeof(RNDIS_Initialize_Message_t)); +	InitMessage.RequestId       = cpu_to_le32(RNDISInterfaceInfo->State.RequestID++); + +	InitMessage.MajorVersion    = CPU_TO_LE32(REMOTE_NDIS_VERSION_MAJOR); +	InitMessage.MinorVersion    = CPU_TO_LE32(REMOTE_NDIS_VERSION_MINOR); +	InitMessage.MaxTransferSize = cpu_to_le32(RNDISInterfaceInfo->Config.HostMaxPacketSize); + +	if ((ErrorCode = RNDIS_SendEncapsulatedCommand(RNDISInterfaceInfo, &InitMessage, +	                                               sizeof(RNDIS_Initialize_Message_t))) != HOST_SENDCONTROL_Successful) +	{ +		return ErrorCode; +	} + +	if ((ErrorCode = RNDIS_GetEncapsulatedResponse(RNDISInterfaceInfo, &InitMessageResponse, +	                                               sizeof(RNDIS_Initialize_Complete_t))) != HOST_SENDCONTROL_Successful) +	{ +		return ErrorCode; +	} + +	if (InitMessageResponse.Status != CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS)) +	  return RNDIS_ERROR_LOGICAL_CMD_FAILED; + +	RNDISInterfaceInfo->State.DeviceMaxPacketSize = le32_to_cpu(InitMessageResponse.MaxTransferSize); + +	return HOST_SENDCONTROL_Successful; +} + +uint8_t RNDIS_Host_SetRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, +                                    const uint32_t Oid, +                                    void* Buffer, +                                    const uint16_t Length) +{ +	uint8_t ErrorCode; + +	struct +	{ +		RNDIS_Set_Message_t SetMessage; +		uint8_t             ContiguousBuffer[Length]; +	} SetMessageData; + +	RNDIS_Set_Complete_t SetMessageResponse; + +	SetMessageData.SetMessage.MessageType    = CPU_TO_LE32(REMOTE_NDIS_SET_MSG); +	SetMessageData.SetMessage.MessageLength  = cpu_to_le32(sizeof(RNDIS_Set_Message_t) + Length); +	SetMessageData.SetMessage.RequestId      = cpu_to_le32(RNDISInterfaceInfo->State.RequestID++); + +	SetMessageData.SetMessage.Oid            = cpu_to_le32(Oid); +	SetMessageData.SetMessage.InformationBufferLength = cpu_to_le32(Length); +	SetMessageData.SetMessage.InformationBufferOffset = CPU_TO_LE32(sizeof(RNDIS_Set_Message_t) - sizeof(RNDIS_Message_Header_t)); +	SetMessageData.SetMessage.DeviceVcHandle = CPU_TO_LE32(0); + +	memcpy(&SetMessageData.ContiguousBuffer, Buffer, Length); + +	if ((ErrorCode = RNDIS_SendEncapsulatedCommand(RNDISInterfaceInfo, &SetMessageData, +	                                               (sizeof(RNDIS_Set_Message_t) + Length))) != HOST_SENDCONTROL_Successful) +	{ +		return ErrorCode; +	} + +	if ((ErrorCode = RNDIS_GetEncapsulatedResponse(RNDISInterfaceInfo, &SetMessageResponse, +	                                               sizeof(RNDIS_Set_Complete_t))) != HOST_SENDCONTROL_Successful) +	{ +		return ErrorCode; +	} + +	if (SetMessageResponse.Status != CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS)) +	  return RNDIS_ERROR_LOGICAL_CMD_FAILED; + +	return HOST_SENDCONTROL_Successful; +} + +uint8_t RNDIS_Host_QueryRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, +                                      const uint32_t Oid, +                                      void* Buffer, +                                      const uint16_t MaxLength) +{ +	uint8_t ErrorCode; + +	RNDIS_Query_Message_t QueryMessage; + +	struct +	{ +		RNDIS_Query_Complete_t QueryMessageResponse; +		uint8_t                ContiguousBuffer[MaxLength]; +	} QueryMessageResponseData; + +	QueryMessage.MessageType    = CPU_TO_LE32(REMOTE_NDIS_QUERY_MSG); +	QueryMessage.MessageLength  = CPU_TO_LE32(sizeof(RNDIS_Query_Message_t)); +	QueryMessage.RequestId      = cpu_to_le32(RNDISInterfaceInfo->State.RequestID++); + +	QueryMessage.Oid            = cpu_to_le32(Oid); +	QueryMessage.InformationBufferLength = CPU_TO_LE32(0); +	QueryMessage.InformationBufferOffset = CPU_TO_LE32(0); +	QueryMessage.DeviceVcHandle = CPU_TO_LE32(0); + +	if ((ErrorCode = RNDIS_SendEncapsulatedCommand(RNDISInterfaceInfo, &QueryMessage, +	                                               sizeof(RNDIS_Query_Message_t))) != HOST_SENDCONTROL_Successful) +	{ +		return ErrorCode; +	} + +	if ((ErrorCode = RNDIS_GetEncapsulatedResponse(RNDISInterfaceInfo, &QueryMessageResponseData, +	                                               sizeof(QueryMessageResponseData))) != HOST_SENDCONTROL_Successful) +	{ +		return ErrorCode; +	} + +	if (QueryMessageResponseData.QueryMessageResponse.Status != CPU_TO_LE32(REMOTE_NDIS_STATUS_SUCCESS)) +	  return RNDIS_ERROR_LOGICAL_CMD_FAILED; + +	memcpy(Buffer, &QueryMessageResponseData.ContiguousBuffer, MaxLength); + +	return HOST_SENDCONTROL_Successful; +} + +bool RNDIS_Host_IsPacketReceived(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo) +{ +	bool PacketWaiting; + +	if ((USB_HostState != HOST_STATE_Configured) || !(RNDISInterfaceInfo->State.IsActive)) +	  return false; + +	Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataINPipe.Address); + +	Pipe_Unfreeze(); +	PacketWaiting = Pipe_IsINReceived(); +	Pipe_Freeze(); + +	return PacketWaiting; +} + +uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, +                              void* Buffer, +                              uint16_t* const PacketLength) +{ +	uint8_t ErrorCode; + +	if ((USB_HostState != HOST_STATE_Configured) || !(RNDISInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; + +	Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataINPipe.Address); +	Pipe_Unfreeze(); + +	if (!(Pipe_IsReadWriteAllowed())) +	{ +		if (Pipe_IsINReceived()) +		  Pipe_ClearIN(); + +		*PacketLength = 0; +		Pipe_Freeze(); +		return PIPE_RWSTREAM_NoError; +	} + +	RNDIS_Packet_Message_t DeviceMessage; + +	if ((ErrorCode = Pipe_Read_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t), +	                                     NULL)) != PIPE_RWSTREAM_NoError) +	{ +		return ErrorCode; +	} + +	*PacketLength = (uint16_t)le32_to_cpu(DeviceMessage.DataLength); + +	Pipe_Discard_Stream(le32_to_cpu(DeviceMessage.DataOffset) - +	                    (sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t)), +	                    NULL); + +	Pipe_Read_Stream_LE(Buffer, *PacketLength, NULL); + +	if (!(Pipe_BytesInPipe())) +	  Pipe_ClearIN(); + +	Pipe_Freeze(); + +	return PIPE_RWSTREAM_NoError; +} + +uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, +                              void* Buffer, +                              const uint16_t PacketLength) +{ +	uint8_t ErrorCode; + +	if ((USB_HostState != HOST_STATE_Configured) || !(RNDISInterfaceInfo->State.IsActive)) +	  return PIPE_READYWAIT_DeviceDisconnected; + +	RNDIS_Packet_Message_t DeviceMessage; + +	memset(&DeviceMessage, 0, sizeof(RNDIS_Packet_Message_t)); +	DeviceMessage.MessageType   = CPU_TO_LE32(REMOTE_NDIS_PACKET_MSG); +	DeviceMessage.MessageLength = CPU_TO_LE32(sizeof(RNDIS_Packet_Message_t) + PacketLength); +	DeviceMessage.DataOffset    = CPU_TO_LE32(sizeof(RNDIS_Packet_Message_t) - sizeof(RNDIS_Message_Header_t)); +	DeviceMessage.DataLength    = cpu_to_le32(PacketLength); + +	Pipe_SelectPipe(RNDISInterfaceInfo->Config.DataOUTPipe.Address); +	Pipe_Unfreeze(); + +	if ((ErrorCode = Pipe_Write_Stream_LE(&DeviceMessage, sizeof(RNDIS_Packet_Message_t), +	                                      NULL)) != PIPE_RWSTREAM_NoError) +	{ +		return ErrorCode; +	} + +	Pipe_Write_Stream_LE(Buffer, PacketLength, NULL); +	Pipe_ClearOUT(); + +	Pipe_Freeze(); + +	return PIPE_RWSTREAM_NoError; +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/RNDISClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/RNDISClassHost.h new file mode 100644 index 0000000000..bddbc247a8 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/RNDISClassHost.h @@ -0,0 +1,270 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Host mode driver for the library USB RNDIS Class driver. + * + *  Host mode driver for the library USB RNDIS Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassRNDIS + *  \defgroup Group_USBClassRNDISHost RNDIS Class Host Mode Driver + * + *  \section Sec_USBClassRNDISHost_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Host/RNDISClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassRNDISHost_ModDescription Module Description + *  Host Mode USB Class driver framework interface, for the Microsoft RNDIS Ethernet + *  USB Class driver. + * + *  @{ + */ + +#ifndef __RNDIS_CLASS_HOST_H__ +#define __RNDIS_CLASS_HOST_H__ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/RNDISClassCommon.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_RNDIS_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Type Defines: */ +			/** \brief RNDIS Class Host Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made within the user application, +			 *  and passed to each of the RNDIS class driver functions as the \c RNDISInterfaceInfo parameter. This +			 *  stores each RNDIS interface's configuration and state information. +			 */ +			typedef struct +			{ +				struct +				{ +					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */ +					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */ +					USB_Pipe_Table_t NotificationPipe; /**< Notification IN Pipe configuration table. */ + +					uint32_t HostMaxPacketSize; /**< Maximum size of a packet which can be buffered by the host. */ +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ +				struct +				{ +					bool IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid +					                *   after \ref RNDIS_Host_ConfigurePipes() is called and the Host state machine is in the +					                *   Configured state. +					                */ +					uint8_t ControlInterfaceNumber; /**< Interface index of the RNDIS control interface within the attached device. */ + +					uint32_t DeviceMaxPacketSize; /**< Maximum size of a packet which can be buffered by the attached RNDIS device. */ + +					uint32_t RequestID; /**< Request ID counter to give a unique ID for each command/response pair. */ +				} State; /**< State data for the USB class interface within the device. All elements in this section +						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when +						  *   the interface is enumerated. +						  */ +			} USB_ClassInfo_RNDIS_Host_t; + +		/* Enums: */ +			/** Enum for the possible error codes returned by the \ref RNDIS_Host_ConfigurePipes() function. */ +			enum RNDIS_Host_EnumerationFailure_ErrorCodes_t +			{ +				RNDIS_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */ +				RNDIS_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */ +				RNDIS_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible RNDIS interface was not found in the device's Configuration Descriptor. */ +				RNDIS_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ +			}; + +		/* Function Prototypes: */ +			/** Host interface configuration routine, to configure a given RNDIS host interface instance using the Configuration +			 *  Descriptor read from an attached USB device. This function automatically updates the given RNDIS Host instance's +			 *  state values and configures the pipes required to communicate with the interface if it is found within the device. +			 *  This should be called once after the stack has enumerated the attached device, while the host state machine is in +			 *  the Addressed state. +			 * +			 *  \param[in,out] RNDISInterfaceInfo    Pointer to a structure containing an RNDIS Class host configuration and state. +			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor. +			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor. +			 * +			 *  \return A value from the \ref RNDIS_Host_EnumerationFailure_ErrorCodes_t enum. +			 */ +			uint8_t RNDIS_Host_ConfigurePipes(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, +			                                  uint16_t ConfigDescriptorSize, +			                                  void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); + +			/** Sends a RNDIS KEEPALIVE command to the device, to ensure that it does not enter standby mode after periods +			 *  of long inactivity. +			 * +			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum or \ref RNDIS_ERROR_LOGICAL_CMD_FAILED if the device returned a +			 *          logical command failure. +			 */ +			uint8_t RNDIS_Host_SendKeepAlive(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Initializes the attached RNDIS device's RNDIS interface. This should be called after the device's pipes have been +			 *  configured via the call to \ref RNDIS_Host_ConfigurePipes(). +			 * +			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum or \ref RNDIS_ERROR_LOGICAL_CMD_FAILED if the +			 *          device returned a logical command failure. +			 */ +			uint8_t RNDIS_Host_InitializeDevice(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sets a given RNDIS property of an attached RNDIS device. +			 * +			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state. +			 *  \param[in]     Oid                 OID number of the parameter to set. +			 *  \param[in]     Buffer              Pointer to where the property data is to be sourced from. +			 *  \param[in]     Length              Length in bytes of the property data to sent to the device. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum or \ref RNDIS_ERROR_LOGICAL_CMD_FAILED if the +			 *          device returned a logical command failure. +			 */ +			uint8_t RNDIS_Host_SetRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, +			                                    const uint32_t Oid, +			                                    void* Buffer, +			                                    const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); + +			/** Gets a given RNDIS property of an attached RNDIS device. +			 * +			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state. +			 *  \param[in]     Oid                 OID number of the parameter to get. +			 *  \param[in]     Buffer              Pointer to where the property data is to be written to. +			 *  \param[in]     MaxLength           Length in bytes of the destination buffer size. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum or \ref RNDIS_ERROR_LOGICAL_CMD_FAILED if the +			 *          device returned a logical command failure. +			 */ +			uint8_t RNDIS_Host_QueryRNDISProperty(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, +			                                      const uint32_t Oid, +			                                      void* Buffer, +			                                      const uint16_t MaxLength) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); + +			/** Determines if a packet is currently waiting for the host to read in and process. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state. +			 * +			 *  \return Boolean \c true if a packet is waiting to be read in by the host, \c false otherwise. +			 */ +			bool RNDIS_Host_IsPacketReceived(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Retrieves the next pending packet from the device, discarding the remainder of the RNDIS packet header to leave +			 *  only the packet contents for processing by the host in the nominated buffer. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state. +			 *  \param[out]    Buffer              Pointer to a buffer where the packer data is to be written to. +			 *  \param[out]    PacketLength        Pointer to where the length in bytes of the read packet is to be stored. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t RNDIS_Host_ReadPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, +			                              void* Buffer, +			                              uint16_t* const PacketLength) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2) +			                              ATTR_NON_NULL_PTR_ARG(3); + +			/** Sends the given packet to the attached RNDIS device, after adding a RNDIS packet message header. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state. +			 *  \param[in]     Buffer              Pointer to a buffer where the packer data is to be read from. +			 *  \param[in]     PacketLength        Length in bytes of the packet to send. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t RNDIS_Host_SendPacket(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, +			                              void* Buffer, +			                              const uint16_t PacketLength) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +		/* Inline Functions: */ +			/** General management task for a given RNDIS host class interface, required for the correct operation of the interface. This should +			 *  be called frequently in the main program loop, before the master USB management task \ref USB_USBTask(). +			 * +			 *  \param[in,out] RNDISInterfaceInfo  Pointer to a structure containing an RNDIS Class host configuration and state. +			 */ +			static inline void RNDIS_Host_USBTask(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline void RNDIS_Host_USBTask(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo) +			{ +				(void)RNDISInterfaceInfo; +			} + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_RNDIS_HOST_C) +				static uint8_t RNDIS_SendEncapsulatedCommand(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, +				                                             void* Buffer, +				                                             const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) +				                                             ATTR_NON_NULL_PTR_ARG(2); +				static uint8_t RNDIS_GetEncapsulatedResponse(USB_ClassInfo_RNDIS_Host_t* const RNDISInterfaceInfo, +				                                             void* Buffer, +				                                             const uint16_t Length) ATTR_NON_NULL_PTR_ARG(1) +				                                             ATTR_NON_NULL_PTR_ARG(2); + +				static uint8_t DCOMP_RNDIS_Host_NextRNDISControlInterface(void* const CurrentDescriptor) +				                                                          ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +				static uint8_t DCOMP_RNDIS_Host_NextRNDISDataInterface(void* const CurrentDescriptor) +				                                                       ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +				static uint8_t DCOMP_RNDIS_Host_NextRNDISInterfaceEndpoint(void* const CurrentDescriptor) +				                                                           ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +			#endif +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/StillImageClassHost.c b/lib/lufa/LUFA/Drivers/USB/Class/Host/StillImageClassHost.c new file mode 100644 index 0000000000..ef33d9be40 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/StillImageClassHost.c @@ -0,0 +1,436 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../../Core/USBMode.h" + +#if defined(USB_CAN_BE_HOST) + +#define  __INCLUDE_FROM_SI_DRIVER +#define  __INCLUDE_FROM_STILLIMAGE_HOST_C +#include "StillImageClassHost.h" + +uint8_t SI_Host_ConfigurePipes(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, +                               uint16_t ConfigDescriptorSize, +                               void* ConfigDescriptorData) +{ +	USB_Descriptor_Endpoint_t*  DataINEndpoint      = NULL; +	USB_Descriptor_Endpoint_t*  DataOUTEndpoint     = NULL; +	USB_Descriptor_Endpoint_t*  EventsEndpoint      = NULL; +	USB_Descriptor_Interface_t* StillImageInterface = NULL; + +	memset(&SIInterfaceInfo->State, 0x00, sizeof(SIInterfaceInfo->State)); + +	if (DESCRIPTOR_TYPE(ConfigDescriptorData) != DTYPE_Configuration) +	  return SI_ENUMERROR_InvalidConfigDescriptor; + +	while (!(DataINEndpoint) || !(DataOUTEndpoint) || !(EventsEndpoint)) +	{ +		if (!(StillImageInterface) || +		    USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +		                              DCOMP_SI_Host_NextSIInterfaceEndpoint) != DESCRIPTOR_SEARCH_COMP_Found) +		{ +			if (USB_GetNextDescriptorComp(&ConfigDescriptorSize, &ConfigDescriptorData, +			                              DCOMP_SI_Host_NextSIInterface) != DESCRIPTOR_SEARCH_COMP_Found) +			{ +				return SI_ENUMERROR_NoCompatibleInterfaceFound; +			} + +			StillImageInterface = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Interface_t); + +			DataINEndpoint  = NULL; +			DataOUTEndpoint = NULL; +			EventsEndpoint  = NULL; + +			continue; +		} + +		USB_Descriptor_Endpoint_t* EndpointData = DESCRIPTOR_PCAST(ConfigDescriptorData, USB_Descriptor_Endpoint_t); + +		if ((EndpointData->EndpointAddress & ENDPOINT_DIR_MASK) == ENDPOINT_DIR_IN) +		{ +			if ((EndpointData->Attributes & EP_TYPE_MASK) == EP_TYPE_INTERRUPT) +			  EventsEndpoint = EndpointData; +			else +			  DataINEndpoint = EndpointData; +		} +		else +		{ +			DataOUTEndpoint = EndpointData; +		} +	} + +	SIInterfaceInfo->Config.DataINPipe.Size  = le16_to_cpu(DataINEndpoint->EndpointSize); +	SIInterfaceInfo->Config.DataINPipe.EndpointAddress = DataINEndpoint->EndpointAddress; +	SIInterfaceInfo->Config.DataINPipe.Type  = EP_TYPE_BULK; + +	SIInterfaceInfo->Config.DataOUTPipe.Size = le16_to_cpu(DataOUTEndpoint->EndpointSize); +	SIInterfaceInfo->Config.DataOUTPipe.EndpointAddress = DataOUTEndpoint->EndpointAddress; +	SIInterfaceInfo->Config.DataOUTPipe.Type = EP_TYPE_BULK; + +	SIInterfaceInfo->Config.EventsPipe.Size = le16_to_cpu(EventsEndpoint->EndpointSize); +	SIInterfaceInfo->Config.EventsPipe.EndpointAddress = EventsEndpoint->EndpointAddress; +	SIInterfaceInfo->Config.EventsPipe.Type = EP_TYPE_INTERRUPT; + +	if (!(Pipe_ConfigurePipeTable(&SIInterfaceInfo->Config.DataINPipe, 1))) +	  return SI_ENUMERROR_PipeConfigurationFailed; + +	if (!(Pipe_ConfigurePipeTable(&SIInterfaceInfo->Config.DataOUTPipe, 1))) +	  return SI_ENUMERROR_PipeConfigurationFailed; + +	if (!(Pipe_ConfigurePipeTable(&SIInterfaceInfo->Config.EventsPipe, 1))) +	  return SI_ENUMERROR_PipeConfigurationFailed; + +	SIInterfaceInfo->State.InterfaceNumber = StillImageInterface->InterfaceNumber; +	SIInterfaceInfo->State.IsActive = true; + +	return SI_ENUMERROR_NoError; +} + +uint8_t DCOMP_SI_Host_NextSIInterface(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Interface) +	{ +		USB_Descriptor_Interface_t* Interface = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Interface_t); + +		if ((Interface->Class    == SI_CSCP_StillImageClass)    && +		    (Interface->SubClass == SI_CSCP_StillImageSubclass) && +		    (Interface->Protocol == SI_CSCP_BulkOnlyProtocol)) +		{ +			return DESCRIPTOR_SEARCH_Found; +		} +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +uint8_t DCOMP_SI_Host_NextSIInterfaceEndpoint(void* const CurrentDescriptor) +{ +	USB_Descriptor_Header_t* Header = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Header_t); + +	if (Header->Type == DTYPE_Endpoint) +	{ +		USB_Descriptor_Endpoint_t* Endpoint = DESCRIPTOR_PCAST(CurrentDescriptor, USB_Descriptor_Endpoint_t); + +		uint8_t EndpointType = (Endpoint->Attributes & EP_TYPE_MASK); + +		if (((EndpointType == EP_TYPE_BULK) || (EndpointType == EP_TYPE_INTERRUPT)) && +		    (!(Pipe_IsEndpointBound(Endpoint->EndpointAddress)))) +		{ +			return DESCRIPTOR_SEARCH_Found; +		} +	} +	else if (Header->Type == DTYPE_Interface) +	{ +		return DESCRIPTOR_SEARCH_Fail; +	} + +	return DESCRIPTOR_SEARCH_NotFound; +} + +uint8_t SI_Host_SendBlockHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, +                                PIMA_Container_t* const PIMAHeader) +{ +	uint8_t ErrorCode; + +	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive)) +	  return PIPE_RWSTREAM_DeviceDisconnected; + +	if (SIInterfaceInfo->State.IsSessionOpen) +	  PIMAHeader->TransactionID = cpu_to_le32(SIInterfaceInfo->State.TransactionID++); + +	Pipe_SelectPipe(SIInterfaceInfo->Config.DataOUTPipe.Address); +	Pipe_Unfreeze(); + +	if ((ErrorCode = Pipe_Write_Stream_LE(PIMAHeader, PIMA_COMMAND_SIZE(0), NULL)) != PIPE_RWSTREAM_NoError) +	  return ErrorCode; + +	uint8_t ParamBytes = (PIMAHeader->DataLength - PIMA_COMMAND_SIZE(0)); + +	if (ParamBytes) +	{ +		if ((ErrorCode = Pipe_Write_Stream_LE(&PIMAHeader->Params, ParamBytes, NULL)) != PIPE_RWSTREAM_NoError) +		  return ErrorCode; +	} + +	Pipe_ClearOUT(); +	Pipe_Freeze(); + +	return PIPE_RWSTREAM_NoError; +} + +uint8_t SI_Host_ReceiveBlockHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, +                                   PIMA_Container_t* const PIMAHeader) +{ +	uint16_t TimeoutMSRem        = SI_COMMAND_DATA_TIMEOUT_MS; +	uint16_t PreviousFrameNumber = USB_Host_GetFrameNumber(); + +	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive)) +	  return PIPE_RWSTREAM_DeviceDisconnected; + +	Pipe_SelectPipe(SIInterfaceInfo->Config.DataINPipe.Address); +	Pipe_Unfreeze(); + +	while (!(Pipe_IsINReceived())) +	{ +		uint16_t CurrentFrameNumber = USB_Host_GetFrameNumber(); + +		if (CurrentFrameNumber != PreviousFrameNumber) +		{ +			PreviousFrameNumber = CurrentFrameNumber; + +			if (!(TimeoutMSRem--)) +			  return PIPE_RWSTREAM_Timeout; +		} + +		Pipe_Freeze(); +		Pipe_SelectPipe(SIInterfaceInfo->Config.DataOUTPipe.Address); +		Pipe_Unfreeze(); + +		if (Pipe_IsStalled()) +		{ +			USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress()); +			return PIPE_RWSTREAM_PipeStalled; +		} + +		Pipe_Freeze(); +		Pipe_SelectPipe(SIInterfaceInfo->Config.DataINPipe.Address); +		Pipe_Unfreeze(); + +		if (Pipe_IsStalled()) +		{ +			USB_Host_ClearEndpointStall(Pipe_GetBoundEndpointAddress()); +			return PIPE_RWSTREAM_PipeStalled; +		} + +		if (USB_HostState == HOST_STATE_Unattached) +		  return PIPE_RWSTREAM_DeviceDisconnected; +	} + +	Pipe_Read_Stream_LE(PIMAHeader, PIMA_COMMAND_SIZE(0), NULL); + +	if (PIMAHeader->Type == CPU_TO_LE16(PIMA_CONTAINER_ResponseBlock)) +	{ +		uint8_t ParamBytes = (PIMAHeader->DataLength - PIMA_COMMAND_SIZE(0)); + +		if (ParamBytes) +		  Pipe_Read_Stream_LE(&PIMAHeader->Params, ParamBytes, NULL); + +		Pipe_ClearIN(); +	} + +	Pipe_Freeze(); + +	return PIPE_RWSTREAM_NoError; +} + +uint8_t SI_Host_SendData(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, +                         const void* Buffer, +                         const uint16_t Bytes) +{ +	uint8_t ErrorCode; + +	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive)) +	  return PIPE_RWSTREAM_DeviceDisconnected; + +	Pipe_SelectPipe(SIInterfaceInfo->Config.DataOUTPipe.Address); +	Pipe_Unfreeze(); + +	ErrorCode = Pipe_Write_Stream_LE(Buffer, Bytes, NULL); + +	Pipe_ClearOUT(); +	Pipe_Freeze(); + +	return ErrorCode; +} + +uint8_t SI_Host_ReadData(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, +                         void* Buffer, +                         const uint16_t Bytes) +{ +	uint8_t ErrorCode; + +	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive)) +	  return PIPE_RWSTREAM_DeviceDisconnected; + +	Pipe_SelectPipe(SIInterfaceInfo->Config.DataINPipe.Address); +	Pipe_Unfreeze(); + +	ErrorCode = Pipe_Read_Stream_LE(Buffer, Bytes, NULL); + +	Pipe_Freeze(); + +	return ErrorCode; +} + +bool SI_Host_IsEventReceived(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) +{ +	bool IsEventReceived = false; + +	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive)) +	  return false; + +	Pipe_SelectPipe(SIInterfaceInfo->Config.EventsPipe.Address); +	Pipe_Unfreeze(); + +	if (Pipe_IsINReceived()) +	  IsEventReceived = true; + +	Pipe_Freeze(); + +	return IsEventReceived; +} + +uint8_t SI_Host_ReceiveEventHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, +                                   PIMA_Container_t* const PIMAHeader) +{ +	uint8_t ErrorCode; + +	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive)) +	  return PIPE_RWSTREAM_DeviceDisconnected; + +	Pipe_SelectPipe(SIInterfaceInfo->Config.EventsPipe.Address); +	Pipe_Unfreeze(); + +	ErrorCode = Pipe_Read_Stream_LE(PIMAHeader, sizeof(PIMA_Container_t), NULL); + +	Pipe_ClearIN(); +	Pipe_Freeze(); + +	return ErrorCode; +} + +uint8_t SI_Host_OpenSession(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive)) +	  return PIPE_RWSTREAM_DeviceDisconnected; + +	uint8_t ErrorCode; + +	SIInterfaceInfo->State.TransactionID = 0; +	SIInterfaceInfo->State.IsSessionOpen = false; + +	PIMA_Container_t PIMABlock = (PIMA_Container_t) +		{ +			.DataLength    = CPU_TO_LE32(PIMA_COMMAND_SIZE(1)), +			.Type          = CPU_TO_LE16(PIMA_CONTAINER_CommandBlock), +			.Code          = CPU_TO_LE16(0x1002), +			.Params        = {CPU_TO_LE32(1)}, +		}; + +	if ((ErrorCode = SI_Host_SendBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError) +	  return ErrorCode; + +	if ((ErrorCode = SI_Host_ReceiveBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError) +	  return ErrorCode; + +	if ((PIMABlock.Type != CPU_TO_LE16(PIMA_CONTAINER_ResponseBlock)) || (PIMABlock.Code != CPU_TO_LE16(0x2001))) +	  return SI_ERROR_LOGICAL_CMD_FAILED; + +	SIInterfaceInfo->State.IsSessionOpen = true; + +	return PIPE_RWSTREAM_NoError; +} + +uint8_t SI_Host_CloseSession(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive)) +	  return PIPE_RWSTREAM_DeviceDisconnected; + +	uint8_t ErrorCode; + +	PIMA_Container_t PIMABlock = (PIMA_Container_t) +		{ +			.DataLength    = CPU_TO_LE32(PIMA_COMMAND_SIZE(1)), +			.Type          = CPU_TO_LE16(PIMA_CONTAINER_CommandBlock), +			.Code          = CPU_TO_LE16(0x1003), +			.Params        = {CPU_TO_LE32(1)}, +		}; + +	if ((ErrorCode = SI_Host_SendBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError) +	  return ErrorCode; + +	if ((ErrorCode = SI_Host_ReceiveBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError) +	  return ErrorCode; + +	SIInterfaceInfo->State.IsSessionOpen = false; + +	if ((PIMABlock.Type != CPU_TO_LE16(PIMA_CONTAINER_ResponseBlock)) || (PIMABlock.Code != CPU_TO_LE16(0x2001))) +	  return SI_ERROR_LOGICAL_CMD_FAILED; + +	return PIPE_RWSTREAM_NoError; +} + +uint8_t SI_Host_SendCommand(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, +                            const uint16_t Operation, +                            const uint8_t TotalParams, +                            uint32_t* const Params) +{ +	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive)) +	  return PIPE_RWSTREAM_DeviceDisconnected; + +	uint8_t ErrorCode; + +	PIMA_Container_t PIMABlock = (PIMA_Container_t) +		{ +			.DataLength    = cpu_to_le32(PIMA_COMMAND_SIZE(TotalParams)), +			.Type          = CPU_TO_LE16(PIMA_CONTAINER_CommandBlock), +			.Code          = cpu_to_le16(Operation), +		}; + +	memcpy(&PIMABlock.Params, Params, sizeof(uint32_t) * TotalParams); + +	if ((ErrorCode = SI_Host_SendBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError) +	  return ErrorCode; + +	return PIPE_RWSTREAM_NoError; +} + +uint8_t SI_Host_ReceiveResponse(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) +{ +	uint8_t ErrorCode; +	PIMA_Container_t PIMABlock; + +	if ((USB_HostState != HOST_STATE_Configured) || !(SIInterfaceInfo->State.IsActive)) +	  return PIPE_RWSTREAM_DeviceDisconnected; + +	if ((ErrorCode = SI_Host_ReceiveBlockHeader(SIInterfaceInfo, &PIMABlock)) != PIPE_RWSTREAM_NoError) +	  return ErrorCode; + +	if ((PIMABlock.Type != CPU_TO_LE16(PIMA_CONTAINER_ResponseBlock)) || (PIMABlock.Code != CPU_TO_LE16(0x2001))) +	  return SI_ERROR_LOGICAL_CMD_FAILED; + +	return PIPE_RWSTREAM_NoError; +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/Host/StillImageClassHost.h b/lib/lufa/LUFA/Drivers/USB/Class/Host/StillImageClassHost.h new file mode 100644 index 0000000000..ababdb09a6 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/Host/StillImageClassHost.h @@ -0,0 +1,317 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Host mode driver for the library USB Still Image Class driver. + * + *  Host mode driver for the library USB Still Image Class driver. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB module driver + *        dispatch header located in LUFA/Drivers/USB.h. + */ + +/** \ingroup Group_USBClassSI + *  \defgroup Group_USBClassStillImageHost Still Image Class Host Mode Driver + * + *  \section Sec_USBClassStillImageHost_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Host/StillImageClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassStillImageHost_ModDescription Module Description + *  Host Mode USB Class driver framework interface, for the Still Image USB Class driver. + * + *  @{ + */ + +#ifndef __SI_CLASS_HOST_H__ +#define __SI_CLASS_HOST_H__ + +	/* Includes: */ +		#include "../../USB.h" +		#include "../Common/StillImageClassCommon.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_SI_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Error code for some Still Image Host functions, indicating a logical (and not hardware) error. */ +			#define SI_ERROR_LOGICAL_CMD_FAILED              0x80 + +		/* Type Defines: */ +			/** \brief Still Image Class Host Mode Configuration and State Structure. +			 * +			 *  Class state structure. An instance of this structure should be made within the user application, +			 *  and passed to each of the Still Image class driver functions as the \c SIInterfaceInfo parameter. This +			 *  stores each Still Image interface's configuration and state information. +			 */ +			typedef struct +			{ +				struct +				{ +					USB_Pipe_Table_t DataINPipe; /**< Data IN Pipe configuration table. */ +					USB_Pipe_Table_t DataOUTPipe; /**< Data OUT Pipe configuration table. */ +					USB_Pipe_Table_t EventsPipe; /**< Event notification IN Pipe configuration table. */ +				} Config; /**< Config data for the USB class interface within the device. All elements in this section +				           *   <b>must</b> be set or the interface will fail to enumerate and operate correctly. +				           */ +				struct +				{ +					bool     IsActive; /**< Indicates if the current interface instance is connected to an attached device, valid +					                    *   after \ref SI_Host_ConfigurePipes() is called and the Host state machine is in the +					                    *   Configured state. +					                    */ +					uint8_t  InterfaceNumber; /**< Interface index of the Still Image interface within the attached device. */ + +					bool IsSessionOpen; /**< Indicates if a PIMA session is currently open with the attached device. */ +					uint32_t TransactionID; /**< Transaction ID for the next transaction to send to the device. */ +				} State; /**< State data for the USB class interface within the device. All elements in this section +						  *   <b>may</b> be set to initial values, but may also be ignored to default to sane values when +						  *   the interface is enumerated. +						  */ +			} USB_ClassInfo_SI_Host_t; + +		/* Enums: */ +			/** Enum for the possible error codes returned by the \ref SI_Host_ConfigurePipes() function. */ +			enum SI_Host_EnumerationFailure_ErrorCodes_t +			{ +				SI_ENUMERROR_NoError                    = 0, /**< Configuration Descriptor was processed successfully. */ +				SI_ENUMERROR_InvalidConfigDescriptor    = 1, /**< The device returned an invalid Configuration Descriptor. */ +				SI_ENUMERROR_NoCompatibleInterfaceFound = 2, /**< A compatible Still Image interface was not found in the device's +				                                              *   Configuration Descriptor. +				                                              */ +				SI_ENUMERROR_PipeConfigurationFailed    = 3, /**< One or more pipes for the specified interface could not be configured correctly. */ +			}; + +		/* Function Prototypes: */ +			/** Host interface configuration routine, to configure a given Still Image host interface instance using the +			 *  Configuration Descriptor read from an attached USB device. This function automatically updates the given Still +			 *  Image Host instance's state values and configures the pipes required to communicate with the interface if it is +			 *  found within the device. This should be called once after the stack has enumerated the attached device, while +			 *  the host state machine is in the Addressed state. +			 * +			 *  \param[in,out] SIInterfaceInfo       Pointer to a structure containing a Still Image Class host configuration and state. +			 *  \param[in]     ConfigDescriptorSize  Length of the attached device's Configuration Descriptor. +			 *  \param[in]     ConfigDescriptorData  Pointer to a buffer containing the attached device's Configuration Descriptor. +			 * +			 *  \return A value from the \ref SI_Host_EnumerationFailure_ErrorCodes_t enum. +			 */ +			uint8_t SI_Host_ConfigurePipes(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, +			                               uint16_t ConfigDescriptorSize, +			                               void* ConfigDescriptorData) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(3); + +			/** Opens a new PIMA session with the attached device. This should be used before any session-orientated PIMA commands +			 *  are issued to the device. Only one session can be open at the one time. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum, or \ref SI_ERROR_LOGICAL_CMD_FAILED if the device +			 *          returned a logical command failure. +			 */ +			uint8_t SI_Host_OpenSession(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Closes an already opened PIMA session with the attached device. This should be used after all session-orientated +			 *  PIMA commands have been issued to the device. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum, or \ref SI_ERROR_LOGICAL_CMD_FAILED if the device +			 *          returned a logical command failure. +			 */ +			uint8_t SI_Host_CloseSession(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a raw PIMA block header to the device, filling out the transaction ID automatically. This can be used to send +			 *  arbitrary PIMA blocks to the device with or without parameters. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state. +			 *  \param[in]     PIMAHeader       Pointer to a PIMA container structure that is to be sent. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t SI_Host_SendBlockHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, +			                                PIMA_Container_t* const PIMAHeader) ATTR_NON_NULL_PTR_ARG(1) +			                                ATTR_NON_NULL_PTR_ARG(2); + +			/** Receives a raw PIMA block header from the device. This can be used to receive arbitrary PIMA blocks from the device with +			 *  or without parameters. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state. +			 *  \param[out]    PIMAHeader       Pointer to a PIMA container structure where the received block is to be stored. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t SI_Host_ReceiveBlockHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, +			                                   PIMA_Container_t* const PIMAHeader) ATTR_NON_NULL_PTR_ARG(1) +			                                   ATTR_NON_NULL_PTR_ARG(2); + +			/** Sends a given PIMA command to the attached device, filling out the PIMA command header's Transaction ID automatically. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state. +			 *  \param[in]     Operation        PIMA operation code to issue to the device. +			 *  \param[in]     TotalParams      Total number of 32-bit parameters to send to the device in the issued command block. +			 *  \param[in]     Params           Pointer to an array of 32-bit values containing the parameters to send in the command block. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum, or \ref SI_ERROR_LOGICAL_CMD_FAILED if the device +			 *          returned a logical command failure. +			 */ +			uint8_t SI_Host_SendCommand(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, +			                            const uint16_t Operation, +			                            const uint8_t TotalParams, +			                            uint32_t* const Params) ATTR_NON_NULL_PTR_ARG(1); + +			/** Receives and checks a response block from the attached Still Image device, once a command has been issued and all data +			 *  associated with the command has been transferred. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum, or \ref SI_ERROR_LOGICAL_CMD_FAILED if the device +			 *          returned a logical command failure. +			 */ +			uint8_t SI_Host_ReceiveResponse(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Indicates if the device has issued a PIMA event block to the host via the asynchronous events pipe. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state. +			 * +			 *  \return Boolean \c true if an event is waiting to be read, \c false otherwise. +			 */ +			bool SI_Host_IsEventReceived(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1); + +			/** Receives an asynchronous event block from the device via the asynchronous events pipe. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state. +			 *  \param[out]    PIMAHeader       Pointer to a PIMA container structure where the event should be stored. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum, or \ref SI_ERROR_LOGICAL_CMD_FAILED if the device +			 *          returned a logical command failure. +			 */ +			uint8_t SI_Host_ReceiveEventHeader(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, +			                                   PIMA_Container_t* const PIMAHeader) ATTR_NON_NULL_PTR_ARG(1) +			                                   ATTR_NON_NULL_PTR_ARG(2); + +			/** Sends arbitrary data to the attached device, for use in the data phase of PIMA commands which require data +			 *  transfer beyond the regular PIMA command block parameters. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state. +			 *  \param[in]     Buffer           Pointer to a buffer where the data to send has been stored. +			 *  \param[in]     Bytes            Length in bytes of the data in the buffer to send to the attached device. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t SI_Host_SendData(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, +			                         const void* Buffer, +			                         const uint16_t Bytes) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Receives arbitrary data from the attached device, for use in the data phase of PIMA commands which require data +			 *  transfer beyond the regular PIMA command block parameters. +			 * +			 *  \pre This function must only be called when the Host state machine is in the \ref HOST_STATE_Configured state or the +			 *       call will fail. +			 * +			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state. +			 *  \param[out]    Buffer           Pointer to a buffer where the received data is to be stored. +			 *  \param[in]     Bytes            Length in bytes of the data to read. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t SI_Host_ReadData(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo, +			                         void* Buffer, +			                         const uint16_t Bytes) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +		/* Inline Functions: */ +			/** General management task for a given Still Image host class interface, required for the correct operation of the +			 *  interface. This should be called frequently in the main program loop, before the master USB management task +			 *  \ref USB_USBTask(). +			 * +			 *  \param[in,out] SIInterfaceInfo  Pointer to a structure containing a Still Image Class host configuration and state. +			 */ +			static inline void SI_Host_USBTask(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline void SI_Host_USBTask(USB_ClassInfo_SI_Host_t* const SIInterfaceInfo) +			{ +				(void)SIInterfaceInfo; +			} + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#define SI_COMMAND_DATA_TIMEOUT_MS        10000 + +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_STILLIMAGE_HOST_C) +				static uint8_t DCOMP_SI_Host_NextSIInterface(void* const CurrentDescriptor) +				                                             ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +				static uint8_t DCOMP_SI_Host_NextSIInterfaceEndpoint(void* const CurrentDescriptor) +				                                                     ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(1); +			#endif +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/MIDIClass.h b/lib/lufa/LUFA/Drivers/USB/Class/MIDIClass.h new file mode 100644 index 0000000000..a35ae13aa0 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/MIDIClass.h @@ -0,0 +1,84 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Master include file for the library USB MIDI Class driver. + * + *  Master include file for the library USB MIDI Class driver, for both host and device modes, where available. + * + *  This file should be included in all user projects making use of this optional class driver, instead of + *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories. + */ + +/** \ingroup Group_USBClassDrivers + *  \defgroup Group_USBClassMIDI MIDI Class Driver + *  \brief USB class driver for the USB-IF MIDI class standard. + * + *  \section Sec_USBClassMIDI_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Device/MIDIClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + *    - LUFA/Drivers/USB/Class/Host/MIDIClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassMIDI_ModDescription Module Description + *  MIDI Class Driver module. This module contains an internal implementation of the USB MIDI Class, for both Device + *  and Host USB modes. User applications can use this class driver instead of implementing the MIDI class manually + *  via the low-level LUFA APIs. + * + *  This module is designed to simplify the user code by exposing only the required interface needed to interface with + *  Hosts or Devices using the USB MIDI Class. + * + *  \note The USB MIDI class is actually a special case of the regular Audio class, thus this module depends on + *        structure definitions from the \ref Group_USBClassAudioDevice class driver module. + * + *  @{ + */ + +#ifndef _MIDI_CLASS_H_ +#define _MIDI_CLASS_H_ + +	/* Macros: */ +		#define __INCLUDE_FROM_USB_DRIVER +		#define __INCLUDE_FROM_MIDI_DRIVER + +	/* Includes: */ +		#include "../Core/USBMode.h" + +		#if defined(USB_CAN_BE_DEVICE) +			#include "Device/MIDIClassDevice.h" +		#endif + +		#if defined(USB_CAN_BE_HOST) +			#include "Host/MIDIClassHost.h" +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/MassStorageClass.h b/lib/lufa/LUFA/Drivers/USB/Class/MassStorageClass.h new file mode 100644 index 0000000000..fa41fbf817 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/MassStorageClass.h @@ -0,0 +1,81 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Master include file for the library USB Mass Storage Class driver. + * + *  Master include file for the library USB Mass Storage Class driver, for both host and device modes, where available. + * + *  This file should be included in all user projects making use of this optional class driver, instead of + *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories. + */ + +/** \ingroup Group_USBClassDrivers + *  \defgroup Group_USBClassMS Mass Storage Class Driver + *  \brief USB class driver for the USB-IF Bulk-Only Transport Mass Storage class standard. + * + *  \section Sec_USBClassMS_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Device/MassStorageClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + *    - LUFA/Drivers/USB/Class/Host/MassStorageClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassMS_ModDescription Module Description + *  Mass Storage Class Driver module. This module contains an internal implementation of the USB Mass Storage Class, for both + *  Device and Host USB modes. User applications can use this class driver instead of implementing the Mass Storage class + *  manually via the low-level LUFA APIs. + * + *  This module is designed to simplify the user code by exposing only the required interface needed to interface with + *  Hosts or Devices using the USB Mass Storage Class. + * + *  @{ + */ + +#ifndef _MS_CLASS_H_ +#define _MS_CLASS_H_ + +	/* Macros: */ +		#define __INCLUDE_FROM_USB_DRIVER +		#define __INCLUDE_FROM_MS_DRIVER + +	/* Includes: */ +		#include "../Core/USBMode.h" + +		#if defined(USB_CAN_BE_DEVICE) +			#include "Device/MassStorageClassDevice.h" +		#endif + +		#if defined(USB_CAN_BE_HOST) +			#include "Host/MassStorageClassHost.h" +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/PrinterClass.h b/lib/lufa/LUFA/Drivers/USB/Class/PrinterClass.h new file mode 100644 index 0000000000..78ad52068a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/PrinterClass.h @@ -0,0 +1,83 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Master include file for the library USB Printer Class driver. + * + *  Master include file for the library USB Printer Class driver, for both host and device modes, where available. + * + *  This file should be included in all user projects making use of this optional class driver, instead of + *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories. + */ + +/** \ingroup Group_USBClassDrivers + *  \defgroup Group_USBClassPrinter Printer Class Driver + *  \brief USB class driver for the USB-IF Printer class standard. + * + *  \section Sec_USBClassPrinter_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Host/PrinterClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + *    - LUFA/Drivers/USB/Class/Host/PrinterClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassPrinter_ModDescription Module Description + *  Printer Class Driver module. This module contains an internal implementation of the USB Printer Class, for the base + *  USB Printer transport layer for USB Host mode only. Note that printers are free to implement whatever printer language + *  they choose on top of this (e.g. Postscript), and so this driver exposes low level data transport functions only rather + *  than high level raster or text functions. User applications can use this class driver instead of implementing the Printer + *  class manually via the low-level LUFA APIs. + * + *  This module is designed to simplify the user code by exposing only the required interface needed to interface with + *  Devices using the USB Printer Class. + * + *  @{ + */ + +#ifndef _PRINTER_CLASS_H_ +#define _PRINTER_CLASS_H_ + +	/* Macros: */ +		#define __INCLUDE_FROM_USB_DRIVER +		#define __INCLUDE_FROM_PRINTER_DRIVER + +	/* Includes: */ +		#include "../Core/USBMode.h" + +		#if defined(USB_CAN_BE_DEVICE) +			#include "Device/PrinterClassDevice.h" +		#endif + +		#if defined(USB_CAN_BE_HOST) +			#include "Host/PrinterClassHost.h" +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/RNDISClass.h b/lib/lufa/LUFA/Drivers/USB/Class/RNDISClass.h new file mode 100644 index 0000000000..07b4f56270 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/RNDISClass.h @@ -0,0 +1,81 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Master include file for the library USB RNDIS Class driver. + * + *  Master include file for the library USB RNDIS Class driver, for both host and device modes, where available. + * + *  This file should be included in all user projects making use of this optional class driver, instead of + *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories. + */ + +/** \ingroup Group_USBClassDrivers + *  \defgroup Group_USBClassRNDIS RNDIS (Networking) Class Driver + *  \brief USB class driver for the Microsoft Remote Network Driver Interface Specification (RNDIS) class standard. + * + *  \section Sec_USBClassRNDIS_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Device/RNDISClassDevice.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + *    - LUFA/Drivers/USB/Class/Host/RNDISClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassRNDIS_ModDescription Module Description + *  RNDIS Class Driver module. This module contains an internal implementation of the Microsoft USB RNDIS Networking + *  Class, for both Device and Host USB modes. User applications can use this class driver instead of implementing the + *  RNDIS class manually via the low-level LUFA APIs. + * + *  This module is designed to simplify the user code by exposing only the required interface needed to interface with + *  Hosts using the USB RNDIS Class. + * + *  @{ + */ + +#ifndef _RNDIS_CLASS_H_ +#define _RNDIS_CLASS_H_ + +	/* Macros: */ +		#define __INCLUDE_FROM_USB_DRIVER +		#define __INCLUDE_FROM_RNDIS_DRIVER + +	/* Includes: */ +		#include "../Core/USBMode.h" + +		#if defined(USB_CAN_BE_DEVICE) +			#include "Device/RNDISClassDevice.h" +		#endif + +		#if defined(USB_CAN_BE_HOST) +			#include "Host/RNDISClassHost.h" +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Class/StillImageClass.h b/lib/lufa/LUFA/Drivers/USB/Class/StillImageClass.h new file mode 100644 index 0000000000..7cb8b4fcf6 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Class/StillImageClass.h @@ -0,0 +1,76 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Master include file for the library USB Still Image Class driver. + * + *  Master include file for the library USB Still Image Class driver, for both host and device modes, where available. + * + *  This file should be included in all user projects making use of this optional class driver, instead of + *  including any headers in the USB/ClassDriver/Device, USB/ClassDriver/Host or USB/ClassDriver/Common subdirectories. + */ + +/** \ingroup Group_USBClassDrivers + *  \defgroup Group_USBClassSI Still Image Class Driver + *  \brief USB class driver for the USB-IF Still Image (PIMA-compliant) class standard. + * + *  \section Sec_USBClassSI_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Class/Host/StillImageClassHost.c <i>(Makefile source module name: LUFA_SRC_USBCLASS)</i> + * + *  \section Sec_USBClassSI_ModDescription Module Description + *  Still Image Class Driver module. This module contains an internal implementation of the USB Still Image Class, + *  for USB Host mode only. User applications can use this class driver instead of implementing the Still Image class + *  manually via the low-level LUFA APIs. + * + *  This module is designed to simplify the user code by exposing only the required interface needed to interface with + *  Devices using the USB Still Image Class. + * + *  @{ + */ + +#ifndef _SI_CLASS_H_ +#define _SI_CLASS_H_ + +	/* Macros: */ +		#define __INCLUDE_FROM_USB_DRIVER +		#define __INCLUDE_FROM_SI_DRIVER + +	/* Includes: */ +		#include "../Core/USBMode.h" + +		#if defined(USB_CAN_BE_HOST) +			#include "Host/StillImageClassHost.h" +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c new file mode 100644 index 0000000000..f972b0bcc5 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.c @@ -0,0 +1,57 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_AVR8) + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../USBMode.h" + +#if defined(USB_CAN_BE_DEVICE) + +#include "../Device.h" + +void USB_Device_SendRemoteWakeup(void) +{ +	if (!(USB_Options & USB_OPT_MANUAL_PLL)) +	{ +		USB_PLL_On(); +		while (!(USB_PLL_IsReady())); +	} + +	USB_CLK_Unfreeze(); + +	UDCON |= (1 << RMWKUP); +	while (UDCON & (1 << RMWKUP)); +} + +#endif + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h new file mode 100644 index 0000000000..69f9be593e --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Device_AVR8.h @@ -0,0 +1,269 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Device definitions for the AVR8 microcontrollers. + *  \copydetails Group_Device_AVR8 + * + *  \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_AVR8 Device Management (AVR8) + *  \brief USB Device definitions for the AVR8 microcontrollers. + * + *  Architecture specific USB Device definitions for the Atmel 8-bit AVR microcontrollers. + * + *  @{ + */ + +#ifndef __USBDEVICE_AVR8_H__ +#define __USBDEVICE_AVR8_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../USBController.h" +		#include "../StdDescriptors.h" +		#include "../USBInterrupt.h" +		#include "../Endpoint.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_USB_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. +		#endif + +		#if (defined(USE_RAM_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS)) +			#error USE_RAM_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive. +		#endif + +		#if (defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS)) +			#error USE_FLASH_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive. +		#endif + +		#if (defined(USE_FLASH_DESCRIPTORS) && defined(USE_RAM_DESCRIPTORS)) +			#error USE_FLASH_DESCRIPTORS and USE_RAM_DESCRIPTORS are mutually exclusive. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** \name USB Device Mode Option Masks */ +			//@{ +			#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) || defined(__DOXYGEN__) +				/** 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 - please refer to the USB 2.0 specification. +				 */ +				#define USB_DEVICE_OPT_LOWSPEED            (1 << 0) +			#endif + +			/** 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(NO_INTERNAL_SERIAL) && \ +			     (defined(USB_SERIES_7_AVR) || defined(USB_SERIES_6_AVR) || \ +			      defined(USB_SERIES_4_AVR) || defined(USB_SERIES_2_AVR) || \ +				  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    80 + +				/** Start address of the internal serial number, in the appropriate address space, if present on the selected microcontroller +				 *  model. +				 */ +				#define INTERNAL_SERIAL_START_ADDRESS  0x0E +			#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. +			 * +			 *  \attention This function should only be used if the device has indicated to the host that it +			 *             supports the Remote Wakeup feature in the device descriptors, and should only be +			 *             issued if the host is currently allowing remote wakeup events from the device (i.e., +			 *             the \ref USB_Device_RemoteWakeupEnabled flag is set). When the \c NO_DEVICE_REMOTE_WAKEUP +			 *             compile time option is used, this function is unavailable. +			 *             \n\n +			 * +			 *  \attention The USB clock must be running for this function to operate. If the stack is initialized with +			 *             the \ref USB_OPT_MANUAL_PLL option enabled, the user must ensure that the PLL is running +			 *             before attempting to call this function. +			 * +			 *  \see \ref Group_StdDescriptors for more information on the RMWAKEUP feature and device descriptors. +			 */ +			void USB_Device_SendRemoteWakeup(void); + +		/* Inline Functions: */ +			/** Returns the current USB frame number, when in device mode. Every millisecond the USB bus is active (i.e. enumerated to a host) +			 *  the frame number is incremented by one. +			 * +			 *  \return Current USB frame number from the USB controller. +			 */ +			static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint16_t USB_Device_GetFrameNumber(void) +			{ +				return UDFNUM; +			} + +			#if !defined(NO_SOF_EVENTS) +				/** Enables the device mode Start Of Frame events. When enabled, this causes the +				 *  \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus, +				 *  at the start of each USB frame when enumerated in device mode. +				 * +				 *  \note This function is not available when the \c NO_SOF_EVENTS compile time token is defined. +				 */ +				static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE; +				static inline void USB_Device_EnableSOFEvents(void) +				{ +					USB_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 This function is not available when the \c NO_SOF_EVENTS compile time token is defined. +				 */ +				static inline void USB_Device_DisableSOFEvents(void) ATTR_ALWAYS_INLINE; +				static inline void USB_Device_DisableSOFEvents(void) +				{ +					USB_INT_Disable(USB_INT_SOFI); +				} +			#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Inline Functions: */ +			#if defined(USB_DEVICE_OPT_LOWSPEED) +			static inline void USB_Device_SetLowSpeed(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Device_SetLowSpeed(void) +			{ +				UDCON |=  (1 << LSM); +			} + +			static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Device_SetFullSpeed(void) +			{ +				UDCON &= ~(1 << LSM); +			} +			#endif + +			static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; +			static inline void USB_Device_SetDeviceAddress(const uint8_t Address) +			{ +				UDADDR = (UDADDR & (1 << ADDEN)) | (Address & 0x7F); +			} + +			static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; +			static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) +			{ +				(void)Address; + +				UDADDR |= (1 << ADDEN); +			} + +			static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline bool USB_Device_IsAddressSet(void) +			{ +				return (UDADDR & (1 << 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 = INTERNAL_SERIAL_START_ADDRESS; + +				for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++) +				{ +					uint8_t SerialByte = boot_signature_byte_get(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/lib/lufa/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c new file mode 100644 index 0000000000..8ffae15e19 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.c @@ -0,0 +1,275 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_AVR8) + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../USBMode.h" + +#if defined(USB_CAN_BE_DEVICE) + +#include "EndpointStream_AVR8.h" + +#if !defined(CONTROL_ONLY_DEVICE) +uint8_t Endpoint_Discard_Stream(uint16_t Length, +                                uint16_t* const BytesProcessed) +{ +	uint8_t  ErrorCode; +	uint16_t BytesInTransfer = 0; + +	if ((ErrorCode = Endpoint_WaitUntilReady())) +	  return ErrorCode; + +	if (BytesProcessed != NULL) +	  Length -= *BytesProcessed; + +	while (Length) +	{ +		if (!(Endpoint_IsReadWriteAllowed())) +		{ +			Endpoint_ClearOUT(); + +			if (BytesProcessed != NULL) +			{ +				*BytesProcessed += BytesInTransfer; +				return ENDPOINT_RWSTREAM_IncompleteTransfer; +			} + +			if ((ErrorCode = Endpoint_WaitUntilReady())) +			  return ErrorCode; +		} +		else +		{ +			Endpoint_Discard_8(); + +			Length--; +			BytesInTransfer++; +		} +	} + +	return ENDPOINT_RWSTREAM_NoError; +} + +uint8_t Endpoint_Null_Stream(uint16_t Length, +                             uint16_t* const BytesProcessed) +{ +	uint8_t  ErrorCode; +	uint16_t BytesInTransfer = 0; + +	if ((ErrorCode = Endpoint_WaitUntilReady())) +	  return ErrorCode; + +	if (BytesProcessed != NULL) +	  Length -= *BytesProcessed; + +	while (Length) +	{ +		if (!(Endpoint_IsReadWriteAllowed())) +		{ +			Endpoint_ClearIN(); + +			if (BytesProcessed != NULL) +			{ +				*BytesProcessed += BytesInTransfer; +				return ENDPOINT_RWSTREAM_IncompleteTransfer; +			} + +			if ((ErrorCode = Endpoint_WaitUntilReady())) +			  return ErrorCode; +		} +		else +		{ +			Endpoint_Write_8(0); + +			Length--; +			BytesInTransfer++; +		} +	} + +	return ENDPOINT_RWSTREAM_NoError; +} + +/* The following abuses the C preprocessor in order to copy-paste common code with slight alterations, + * so that the code needs to be written once. It is a crude form of templating to reduce code maintenance. */ + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_LE +#define  TEMPLATE_BUFFER_TYPE                      const void* +#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr) +#include "Template/Template_Endpoint_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_BE +#define  TEMPLATE_BUFFER_TYPE                      const void* +#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr) +#include "Template/Template_Endpoint_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_LE +#define  TEMPLATE_BUFFER_TYPE                      void* +#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT() +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8() +#include "Template/Template_Endpoint_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_BE +#define  TEMPLATE_BUFFER_TYPE                      void* +#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT() +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8() +#include "Template/Template_Endpoint_RW.c" + +#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE) +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_LE +	#define  TEMPLATE_BUFFER_TYPE                      const void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_RW.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_BE +	#define  TEMPLATE_BUFFER_TYPE                      const void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_RW.c" +#endif + +#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE) +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_LE +	#define  TEMPLATE_BUFFER_TYPE                      const void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_RW.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_BE +	#define  TEMPLATE_BUFFER_TYPE                      const void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_RW.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_LE +	#define  TEMPLATE_BUFFER_TYPE                      void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8()) +	#include "Template/Template_Endpoint_RW.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_BE +	#define  TEMPLATE_BUFFER_TYPE                      void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8()) +	#include "Template/Template_Endpoint_RW.c" +#endif + +#endif + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_LE +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr) +#include "Template/Template_Endpoint_Control_W.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_BE +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr) +#include "Template/Template_Endpoint_Control_W.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_LE +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8() +#include "Template/Template_Endpoint_Control_R.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_BE +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8() +#include "Template/Template_Endpoint_Control_R.c" + +#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE) +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_LE +	#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_Control_W.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_BE +	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_Control_W.c" +#endif + +#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE) +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_LE +	#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_Control_W.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_BE +	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_Control_W.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_LE +	#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8()) +	#include "Template/Template_Endpoint_Control_R.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_BE +	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8()) +	#include "Template/Template_Endpoint_Control_R.c" +#endif + +#endif + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.h new file mode 100644 index 0000000000..80e78df1b4 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/EndpointStream_AVR8.h @@ -0,0 +1,658 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Endpoint data stream transmission and reception management for the AVR8 microcontrollers. + *  \copydetails Group_EndpointStreamRW_AVR8 + * + *  \note This file should not be included directly. It is automatically included as needed by the USB driver + *        dispatch header located in LUFA/Drivers/USB/USB.h. + */ + +/** \ingroup Group_EndpointStreamRW + *  \defgroup Group_EndpointStreamRW_AVR8 Read/Write of Multi-Byte Streams (AVR8) + *  \brief Endpoint data stream transmission and reception management for the Atmel AVR8 architecture. + * + *  Functions, macros, variables, enums and types related to data reading and writing of data streams from + *  and to endpoints. + * + *  @{ + */ + +#ifndef __ENDPOINT_STREAM_AVR8_H__ +#define __ENDPOINT_STREAM_AVR8_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../USBMode.h" +		#include "../USBTask.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_USB_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Function Prototypes: */ +			/** \name Stream functions for null data */ +			//@{ + +			/** Reads and discards the given number of bytes from the currently selected endpoint's bank, +			 *  discarding fully read packets from the host as needed. The last packet is not automatically +			 *  discarded once the remaining bytes has been read; the user is responsible for manually +			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the endpoint bank becomes empty while there is still data to process (and after the current +			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number +			 *  of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Endpoint_Discard_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Endpoint_Discard_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[in] Length          Number of bytes to discard via the currently selected endpoint. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Discard_Stream(uint16_t Length, +			                                uint16_t* const BytesProcessed); + +			/** Writes a given number of zeroed bytes to the currently selected endpoint's bank, sending +			 *  full packets to the host as needed. The last packet is not automatically sent once the +			 *  remaining bytes have been written; the user is responsible for manually sending the last +			 *  packet to the host via the \ref Endpoint_ClearIN() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the endpoint bank becomes full while there is still data to process (and after the current +			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the +			 *  total number of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Endpoint_Null_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Endpoint_Null_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[in] Length          Number of zero bytes to send via the currently selected endpoint. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Null_Stream(uint16_t Length, +			                             uint16_t* const BytesProcessed); + +			//@} + +			/** \name Stream functions for RAM source/destination data */ +			//@{ + +			/** Writes the given number of bytes to the endpoint from the given buffer in little endian, +			 *  sending full packets to the host as needed. The last packet filled is not automatically sent; +			 *  the user is responsible for manually sending the last written packet to the host via the +			 *  \ref Endpoint_ClearIN() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the endpoint bank becomes full while there is still data to process (and after the current +			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the +			 *  total number of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t DataStream[512]; +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream), +			 *                                            NULL)) != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  DataStream[512]; +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream), +			 *                                               &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Stream_LE(const void* const Buffer, +			                                 uint16_t Length, +			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Writes the given number of bytes to the endpoint from the given buffer in big endian, +			 *  sending full packets to the host as needed. The last packet filled is not automatically sent; +			 *  the user is responsible for manually sending the last written packet to the host via the +			 *  \ref Endpoint_ClearIN() macro. +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Stream_BE(const void* const Buffer, +			                                 uint16_t Length, +			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the endpoint from the given buffer in little endian, +			 *  discarding fully read packets from the host as needed. The last packet is not automatically +			 *  discarded once the remaining bytes has been read; the user is responsible for manually +			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the endpoint bank becomes empty while there is still data to process (and after the current +			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number +			 *  of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t DataStream[512]; +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream), +			 *                                           NULL)) != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  DataStream[512]; +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream), +			 *                                              &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[out] Buffer          Pointer to the destination data buffer to write to. +			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                              transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Stream_LE(void* const Buffer, +			                                uint16_t Length, +			                                uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the endpoint from the given buffer in big endian, +			 *  discarding fully read packets from the host as needed. The last packet is not automatically +			 *  discarded once the remaining bytes has been read; the user is responsible for manually +			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro. +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[out] Buffer          Pointer to the destination data buffer to write to. +			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                              transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Stream_BE(void* const Buffer, +			                                uint16_t Length, +			                                uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in little endian, +			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared +			 *  in both failure and success states; the user is responsible for manually clearing the status OUT packet +			 *  to finalize the transfer's status stage via the \ref Endpoint_ClearOUT() macro. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[in] Buffer  Pointer to the source data buffer to read from. +			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Control_Stream_LE(const void* const Buffer, +			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in big endian, +			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared +			 *  in both failure and success states; the user is responsible for manually clearing the status OUT packet +			 *  to finalize the transfer's status stage via the \ref Endpoint_ClearOUT() macro. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[in] Buffer  Pointer to the source data buffer to read from. +			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Control_Stream_BE(const void* const Buffer, +			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in little endian, +			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not +			 *  automatically sent after success or failure states; the user is responsible for manually sending the +			 *  status IN packet to finalize the transfer's status stage via the \ref Endpoint_ClearIN() macro. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[out] Buffer  Pointer to the destination data buffer to write to. +			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Control_Stream_LE(void* const Buffer, +			                                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in big endian, +			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not +			 *  automatically sent after success or failure states; the user is responsible for manually sending the +			 *  status IN packet to finalize the transfer's status stage via the \ref Endpoint_ClearIN() macro. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[out] Buffer  Pointer to the destination data buffer to write to. +			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Control_Stream_BE(void* const Buffer, +			                                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); +			//@} + +			/** \name Stream functions for EEPROM source/destination data */ +			//@{ + +			/** EEPROM buffer source version of \ref Endpoint_Write_Stream_LE(). +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_EStream_LE(const void* const Buffer, +			                                  uint16_t Length, +			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer source version of \ref Endpoint_Write_Stream_BE(). +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_EStream_BE(const void* const Buffer, +			                                  uint16_t Length, +			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer destination version of \ref Endpoint_Read_Stream_LE(). +			 * +			 *  \param[out] Buffer          Pointer to the destination data buffer to write to, located in EEPROM memory space. +			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                              transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_EStream_LE(void* const Buffer, +			                                 uint16_t Length, +			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer destination version of \ref Endpoint_Read_Stream_BE(). +			 * +			 *  \param[out] Buffer          Pointer to the destination data buffer to write to, located in EEPROM memory space. +			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                              transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_EStream_BE(void* const Buffer, +			                                 uint16_t Length, +			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer source version of Endpoint_Write_Control_Stream_LE. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 *        \n\n +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[in] Buffer  Pointer to the source data buffer to read from. +			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Control_EStream_LE(const void* const Buffer, +			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer source version of \ref Endpoint_Write_Control_Stream_BE(). +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 *        \n\n +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[in] Buffer  Pointer to the source data buffer to read from. +			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Control_EStream_BE(const void* const Buffer, +			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_LE(). +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 *        \n\n +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[out] Buffer  Pointer to the destination data buffer to write to. +			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Control_EStream_LE(void* const Buffer, +			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_BE(). +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 *        \n\n +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[out] Buffer  Pointer to the destination data buffer to write to. +			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Control_EStream_BE(void* const Buffer, +			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); +			//@} + +			/** \name Stream functions for PROGMEM source/destination data */ +			//@{ + +			/** FLASH buffer source version of \ref Endpoint_Write_Stream_LE(). +			 * +			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly. +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_PStream_LE(const void* const Buffer, +			                                  uint16_t Length, +			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** FLASH buffer source version of \ref Endpoint_Write_Stream_BE(). +			 * +			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly. +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_PStream_BE(const void* const Buffer, +			                                  uint16_t Length, +			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_LE(). +			 * +			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 *        \n\n +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[in] Buffer  Pointer to the source data buffer to read from. +			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Control_PStream_LE(const void* const Buffer, +			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_BE(). +			 * +			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 *        \n\n +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[in] Buffer  Pointer to the source data buffer to read from. +			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Control_PStream_BE(const void* const Buffer, +			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); +			//@} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.c new file mode 100644 index 0000000000..92cf8360de --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.c @@ -0,0 +1,201 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_AVR8) + +#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_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, +                                     const uint8_t Entries) +{ +	for (uint8_t i = 0; i < Entries; i++) +	{ +		if (!(Table[i].Address)) +		  continue; + +		if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) +		  return false; +	} + +	return true; +} + +bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number, +                                    const uint8_t UECFG0XData, +                                    const uint8_t UECFG1XData) +{ +#if defined(CONTROL_ONLY_DEVICE) || defined(ORDERED_EP_CONFIG) +	Endpoint_SelectEndpoint(Number); +	Endpoint_EnableEndpoint(); + +	UECFG1X = 0; +	UECFG0X = UECFG0XData; +	UECFG1X = UECFG1XData; + +	return Endpoint_IsConfigured(); +#else +	for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) +	{ +		uint8_t UECFG0XTemp; +		uint8_t UECFG1XTemp; +		uint8_t UEIENXTemp; + +		Endpoint_SelectEndpoint(EPNum); + +		if (EPNum == Number) +		{ +			UECFG0XTemp = UECFG0XData; +			UECFG1XTemp = UECFG1XData; +			UEIENXTemp  = 0; +		} +		else +		{ +			UECFG0XTemp = UECFG0X; +			UECFG1XTemp = UECFG1X; +			UEIENXTemp  = UEIENX; +		} + +		if (!(UECFG1XTemp & (1 << ALLOC))) +		  continue; + +		Endpoint_DisableEndpoint(); +		UECFG1X &= ~(1 << ALLOC); + +		Endpoint_EnableEndpoint(); +		UECFG0X = UECFG0XTemp; +		UECFG1X = UECFG1XTemp; +		UEIENX  = UEIENXTemp; + +		if (!(Endpoint_IsConfigured())) +		  return false; +	} + +	Endpoint_SelectEndpoint(Number); +	return true; +#endif +} + +void Endpoint_ClearEndpoints(void) +{ +	UEINT = 0; + +	for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) +	{ +		Endpoint_SelectEndpoint(EPNum); +		UEIENX  = 0; +		UEINTX  = 0; +		UECFG1X = 0; +		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 + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h new file mode 100644 index 0000000000..6d8375230e --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Endpoint_AVR8.h @@ -0,0 +1,819 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Endpoint definitions for the AVR8 microcontrollers. + *  \copydetails Group_EndpointManagement_AVR8 + * + *  \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_AVR8 Endpoint Data Reading and Writing (AVR8) + *  \brief Endpoint data read/write definitions for the Atmel AVR8 architecture. + * + *  Functions, macros, variables, enums and types related to data reading and writing from and to endpoints. + */ + +/** \ingroup Group_EndpointPrimitiveRW + *  \defgroup Group_EndpointPrimitiveRW_AVR8 Read/Write of Primitive Data Types (AVR8) + *  \brief Endpoint primitive read/write definitions for the Atmel AVR8 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_AVR8 Endpoint Packet Management (AVR8) + *  \brief Endpoint packet management definitions for the Atmel AVR8 architecture. + * + *  Functions, macros, variables, enums and types related to packet management of endpoints. + */ + +/** \ingroup Group_EndpointManagement + *  \defgroup Group_EndpointManagement_AVR8 Endpoint Management (AVR8) + *  \brief Endpoint management definitions for the Atmel AVR8 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_AVR8_H__ +#define __ENDPOINT_AVR8_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__) +		/* 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 << EPSIZE0); +			} + +		/* 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: */ +			#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 + +			#if !defined(CONTROL_ONLY_DEVICE) || defined(__DOXYGEN__) +				#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) || 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        7 +				#else +					#define ENDPOINT_TOTAL_ENDPOINTS        5 +				#endif +			#else +				#define ENDPOINT_TOTAL_ENDPOINTS            1 +			#endif + +		/* Enums: */ +			/** Enum for the possible error return codes of the \ref Endpoint_WaitUntilReady() function. +			 * +			 *  \ingroup Group_EndpointRW_AVR8 +			 */ +			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 address with the given endpoint type, bank size and number of hardware +			 *  banks. Once configured, the endpoint may be read from or written to, depending on its direction. +			 * +			 *  \param[in] Address    Endpoint address to configure. +			 * +			 *  \param[in] Type       Type of endpoint to configure, a \c EP_TYPE_* mask. Not all endpoint types +			 *                        are available on Low Speed USB devices - refer to the USB 2.0 specification. +			 * +			 *  \param[in] Size       Size of the endpoint's bank, where packets are stored before they are transmitted +			 *                        to the USB host, or after they have been received from the USB host (depending on +			 *                        the endpoint's data direction). The bank size must indicate the maximum packet size +			 *                        that the endpoint can handle. +			 * +			 *  \param[in] Banks      Number of banks to use for the endpoint being configured. +			 * +			 *  \attention 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. +			 * +			 *  \note Different endpoints may have different maximum packet sizes based on the endpoint's index - please +			 *        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 Address, +			                                              const uint8_t Type, +			                                              const uint16_t Size, +			                                              const uint8_t Banks) ATTR_ALWAYS_INLINE; +			static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, +			                                              const uint8_t Type, +			                                              const uint16_t Size, +			                                              const uint8_t Banks) +			{ +				uint8_t Number = (Address & ENDPOINT_EPNUM_MASK); + +				if (Number >= ENDPOINT_TOTAL_ENDPOINTS) +				  return false; + +				return Endpoint_ConfigureEndpoint_Prv(Number, +				                                      ((Type << EPTYPE0) | ((Address & ENDPOINT_DIR_IN) ? (1 << EPDIR) : 0)), +				                                      ((1 << ALLOC) | ((Banks > 1) ? (1 << EPBK0) : 0) | Endpoint_BytesToEPSizeMask(Size))); +			} + +			/** Indicates the number of bytes currently stored in the current endpoint's selected bank. +			 * +			 *  \ingroup Group_EndpointRW_AVR8 +			 * +			 *  \return Total number of bytes in the currently selected Endpoint's FIFO buffer. +			 */ +			static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline uint16_t Endpoint_BytesInEndpoint(void) +			{ +				#if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) +					return UEBCX; +				#elif defined(USB_SERIES_4_AVR) +					return (((uint16_t)UEBCHX << 8) | UEBCLX); +				#elif defined(USB_SERIES_2_AVR) +					return UEBCLX; +				#endif +			} + +			/** 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 (UECFG0X & (1 << EPDIR)) ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT; +			} + +			/** Get the endpoint address of the currently selected endpoint. This is typically used to save +			 *  the currently selected endpoint so that it can be restored after another endpoint has been +			 *  manipulated. +			 * +			 *  \return Index of the currently selected endpoint. +			 */ +			static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline uint8_t Endpoint_GetCurrentEndpoint(void) +			{ +				#if !defined(CONTROL_ONLY_DEVICE) +					return ((UENUM & ENDPOINT_EPNUM_MASK) | Endpoint_GetEndpointDirection()); +				#else +					return ENDPOINT_CONTROLEP; +				#endif +			} + +			/** Selects the given endpoint address. +			 * +			 *  Any endpoint operations which do not require the endpoint address to be indicated will operate on +			 *  the currently selected endpoint. +			 * +			 *  \param[in] Address Endpoint address to select. +			 */ +			static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_SelectEndpoint(const uint8_t Address) +			{ +				#if !defined(CONTROL_ONLY_DEVICE) +					UENUM = (Address & ENDPOINT_EPNUM_MASK); +				#endif +			} + +			/** Resets the endpoint bank FIFO. This clears all the endpoint banks and resets the USB controller's +			 *  data In and Out pointers to the bank's contents. +			 * +			 *  \param[in] Address  Endpoint address whose FIFO buffers are to be reset. +			 */ +			static inline void Endpoint_ResetEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_ResetEndpoint(const uint8_t Address) +			{ +				UERST = (1 << (Address & ENDPOINT_EPNUM_MASK)); +				UERST = 0; +			} + +			/** 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) +			{ +				UECONX |= (1 << EPEN); +			} + +			/** 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) +			{ +				UECONX &= ~(1 << EPEN); +			} + +			/** 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 ((UECONX & (1 << EPEN)) ? 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 acknowledgment via the +			 *  \ref Endpoint_ClearOUT() command. +			 * +			 *  \ingroup Group_EndpointPacketManagement_AVR8 +			 * +			 *  \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 (UESTA0X & (0x03 << NBUSYBK0)); +			} + +			/** 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_AVR8 +			 */ +			static inline void Endpoint_AbortPendingIN(void) +			{ +				while (Endpoint_GetBusyBanks() != 0) +				{ +					UEINTX |= (1 << RXOUTI); +					while (UEINTX & (1 << RXOUTI)); +				} +			} + +			/** 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_AVR8 +			 * +			 *  \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 ((UEINTX & (1 << RWAL)) ? true : false); +			} + +			/** 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 ((UESTA0X & (1 << CFGOK)) ? true : false); +			} + +			/** 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 UEINT; +			} + +			/** Determines if the specified endpoint number has interrupted (valid only for INTERRUPT type +			 *  endpoints). +			 * +			 *  \param[in] Address  Address 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 Address) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool Endpoint_HasEndpointInterrupted(const uint8_t Address) +			{ +				return ((Endpoint_GetEndpointInterrupts() & (1 << (Address & ENDPOINT_EPNUM_MASK))) ? true : false); +			} + +			/** Determines if the selected IN endpoint is ready for a new packet to be sent to the host. +			 * +			 *  \ingroup Group_EndpointPacketManagement_AVR8 +			 * +			 *  \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 ((UEINTX & (1 << TXINI)) ? true : false); +			} + +			/** Determines if the selected OUT endpoint has received new packet from the host. +			 * +			 *  \ingroup Group_EndpointPacketManagement_AVR8 +			 * +			 *  \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 ((UEINTX & (1 << RXOUTI)) ? true : false); +			} + +			/** Determines if the current CONTROL type endpoint has received a SETUP packet. +			 * +			 *  \ingroup Group_EndpointPacketManagement_AVR8 +			 * +			 *  \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 ((UEINTX & (1 << RXSTPI)) ? true : false); +			} + +			/** Clears a received SETUP packet on the currently selected CONTROL type endpoint, freeing up the +			 *  endpoint for the next packet. +			 * +			 *  \ingroup Group_EndpointPacketManagement_AVR8 +			 * +			 *  \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) +			{ +				UEINTX &= ~(1 << RXSTPI); +			} + +			/** 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_AVR8 +			 */ +			static inline void Endpoint_ClearIN(void) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_ClearIN(void) +			{ +				#if !defined(CONTROL_ONLY_DEVICE) +					UEINTX &= ~((1 << TXINI) | (1 << FIFOCON)); +				#else +					UEINTX &= ~(1 << TXINI); +				#endif +			} + +			/** 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_AVR8 +			 */ +			static inline void Endpoint_ClearOUT(void) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_ClearOUT(void) +			{ +				#if !defined(CONTROL_ONLY_DEVICE) +					UEINTX &= ~((1 << RXOUTI) | (1 << FIFOCON)); +				#else +					UEINTX &= ~(1 << RXOUTI); +				#endif +			} + +			/** 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_AVR8 +			 */ +			static inline void Endpoint_StallTransaction(void) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_StallTransaction(void) +			{ +				UECONX |= (1 << STALLRQ); +			} + +			/** Clears the STALL condition on the currently selected endpoint. +			 * +			 *  \ingroup Group_EndpointPacketManagement_AVR8 +			 */ +			static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_ClearStall(void) +			{ +				UECONX |= (1 << STALLRQC); +			} + +			/** Determines if the currently selected endpoint is stalled, \c false otherwise. +			 * +			 *  \ingroup Group_EndpointPacketManagement_AVR8 +			 * +			 *  \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 ((UECONX & (1 << STALLRQ)) ? true : false); +			} + +			/** Resets the data toggle of the currently selected endpoint. */ +			static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_ResetDataToggle(void) +			{ +				UECONX |= (1 << RSTDT); +			} + +			/** 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) +			{ +				UECFG0X = ((UECFG0X & ~(1 << EPDIR)) | (DirectionMask ? (1 << EPDIR) : 0)); +			} + +			/** Reads one byte from the currently selected endpoint's bank, for OUT direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_AVR8 +			 * +			 *  \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 UEDATX; +			} + +			/** Writes one byte to the currently selected endpoint's bank, for IN direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				UEDATX = Data; +			} + +			/** Discards one byte from the currently selected endpoint's bank, for OUT direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_AVR8 +			 */ +			static inline void Endpoint_Discard_8(void) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_Discard_8(void) +			{ +				uint8_t Dummy; + +				Dummy = UEDATX; + +				(void)Dummy; +			} + +			/** Reads two bytes from the currently selected endpoint's bank in little endian format, for OUT +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				union +				{ +					uint16_t Value; +					uint8_t  Bytes[2]; +				} Data; + +				Data.Bytes[0] = UEDATX; +				Data.Bytes[1] = UEDATX; + +				return Data.Value; +			} + +			/** Reads two bytes from the currently selected endpoint's bank in big endian format, for OUT +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				union +				{ +					uint16_t Value; +					uint8_t  Bytes[2]; +				} Data; + +				Data.Bytes[1] = UEDATX; +				Data.Bytes[0] = UEDATX; + +				return Data.Value; +			} + +			/** Writes two bytes to the currently selected endpoint's bank in little endian format, for IN +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				UEDATX = (Data & 0xFF); +				UEDATX = (Data >> 8); +			} + +			/** Writes two bytes to the currently selected endpoint's bank in big endian format, for IN +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				UEDATX = (Data >> 8); +				UEDATX = (Data & 0xFF); +			} + +			/** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_AVR8 +			 */ +			static inline void Endpoint_Discard_16(void) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_Discard_16(void) +			{ +				uint8_t Dummy; + +				Dummy = UEDATX; +				Dummy = UEDATX; + +				(void)Dummy; +			} + +			/** Reads four bytes from the currently selected endpoint's bank in little endian format, for OUT +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				union +				{ +					uint32_t Value; +					uint8_t  Bytes[4]; +				} Data; + +				Data.Bytes[0] = UEDATX; +				Data.Bytes[1] = UEDATX; +				Data.Bytes[2] = UEDATX; +				Data.Bytes[3] = UEDATX; + +				return Data.Value; +			} + +			/** Reads four bytes from the currently selected endpoint's bank in big endian format, for OUT +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				union +				{ +					uint32_t Value; +					uint8_t  Bytes[4]; +				} Data; + +				Data.Bytes[3] = UEDATX; +				Data.Bytes[2] = UEDATX; +				Data.Bytes[1] = UEDATX; +				Data.Bytes[0] = UEDATX; + +				return Data.Value; +			} + +			/** Writes four bytes to the currently selected endpoint's bank in little endian format, for IN +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				UEDATX = (Data &  0xFF); +				UEDATX = (Data >> 8); +				UEDATX = (Data >> 16); +				UEDATX = (Data >> 24); +			} + +			/** Writes four bytes to the currently selected endpoint's bank in big endian format, for IN +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				UEDATX = (Data >> 24); +				UEDATX = (Data >> 16); +				UEDATX = (Data >> 8); +				UEDATX = (Data &  0xFF); +			} + +			/** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_AVR8 +			 */ +			static inline void Endpoint_Discard_32(void) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_Discard_32(void) +			{ +				uint8_t Dummy; + +				Dummy = UEDATX; +				Dummy = UEDATX; +				Dummy = UEDATX; +				Dummy = UEDATX; + +				(void)Dummy; +			} + +		/* External Variables: */ +			/** Global indicating the maximum packet size of the default control endpoint located at address +			 *  0 in the device. This value is set to the value indicated in the device descriptor in the user +			 *  project once the USB interface is initialized into device mode. +			 * +			 *  If space is an issue, it is possible to fix this to a static value by defining the control +			 *  endpoint size in the \c FIXED_CONTROL_ENDPOINT_SIZE token passed to the compiler in the makefile +			 *  via the -D switch. When a fixed control endpoint size is used, the size is no longer dynamically +			 *  read from the descriptors at runtime and instead fixed to the given value. When used, it is +			 *  important that the descriptor control endpoint size value matches the size given as the +			 *  \c FIXED_CONTROL_ENDPOINT_SIZE token - it is recommended that the \c FIXED_CONTROL_ENDPOINT_SIZE token +			 *  be used in the device descriptors to ensure this. +			 * +			 *  \attention This variable should be treated as read-only in the user application, and never manually +			 *             changed in value. +			 */ +			#if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__)) +				extern uint8_t USB_Device_ControlEndpointSize; +			#else +				#define USB_Device_ControlEndpointSize FIXED_CONTROL_ENDPOINT_SIZE +			#endif + +		/* Function Prototypes: */ +			/** Configures a table of endpoint descriptions, in sequence. This function can be used to configure multiple +			 *  endpoints at the same time. +			 * +			 *  \note Endpoints with a zero address will be ignored, thus this function cannot be used to configure the +			 *        control endpoint. +			 * +			 *  \param[in] Table    Pointer to a table of endpoint descriptions. +			 *  \param[in] Entries  Number of entries in the endpoint table to configure. +			 * +			 *  \return Boolean \c true if all endpoints configured successfully, \c false otherwise. +			 */ +			bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, +			                                     const uint8_t Entries); + +			/** Completes the status stage of a control transfer on a CONTROL type endpoint automatically, +			 *  with respect to the data direction. This is a convenience function which can be used to +			 *  simplify user control request handling. +			 * +			 *  \note This routine should not be called on non CONTROL type endpoints. +			 */ +			void Endpoint_ClearStatusStage(void); + +			/** Spin-loops until the currently selected non-control endpoint is ready for the next packet of data +			 *  to be read or written to it. +			 * +			 *  \note This routine should not be called on CONTROL type endpoints. +			 * +			 *  \ingroup Group_EndpointRW_AVR8 +			 * +			 *  \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/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.c new file mode 100644 index 0000000000..cbb7735e1c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.c @@ -0,0 +1,297 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_AVR8) + +#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(); + +				#if defined(NO_AUTO_VBUS_MANAGEMENT) +				USB_Host_VBUS_Manual_Enable(); +				USB_Host_VBUS_Manual_On(); +				#endif + +				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: +			if (!(Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL, ENDPOINT_CONTROLEP, PIPE_CONTROLPIPE_DEFAULT_SIZE, 1))) +			{ +				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]; + +			Pipe_SelectPipe(PIPE_CONTROLPIPE); +			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: +			if (!(Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL, ENDPOINT_CONTROLEP, USB_Host_ControlPipeSize, 1))) +			{ +				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; + +		default: +			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()) +		{ +			Pipe_ClearError(); +			ErrorCode = HOST_WAITERROR_PipeError; + +			break; +		} + +		if (Pipe_IsStalled()) +		{ +			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 + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.h new file mode 100644 index 0000000000..7a48e3162d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Host_AVR8.h @@ -0,0 +1,372 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Host definitions for the AVR8 microcontrollers. + *  \copydetails Group_Host_AVR8 + * + *  \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_AVR8 Host Management (AVR8) + *  \brief USB Host definitions for the AVR8 microcontrollers. + * + *  Architecture specific USB Host definitions for the Atmel 8-bit AVR microcontrollers. + * + *  @{ + */ + +#ifndef __USBHOST_AVR8_H__ +#define __USBHOST_AVR8_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 + +		#if defined(INVERTED_VBUS_ENABLE_LINE) && !defined(NO_AUTO_VBUS_MANAGEMENT) +			#error The INVERTED_VBUS_ENABLE_LINE compile option requires NO_AUTO_VBUS_MANAGEMENT for the AVR8 architecture. +		#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(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 + +			/** 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. +			 * +			 *  \return Current USB frame number from the USB controller. +			 */ +			static inline uint16_t USB_Host_GetFrameNumber(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline uint16_t USB_Host_GetFrameNumber(void) +			{ +				return 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 This function is 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 This function is not available when the \c 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) +			{ +				UHCON |=  (1 << RESET); +			} + +			/** 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 ((UHCON & (1 << RESET)) ? false : true); +			} + +			/** 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) +			{ +				UHCON |=  (1 << SOFEN); +			} + +			/** 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. +			 * +			 *  \attention 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) +			{ +				UHCON &= ~(1 << SOFEN); +			} + +			/** 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 ((UHCON & (1 << SOFEN)) ? false : true); +			} + +			/** 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 ((USBSTA & (1 << SPEED)) ? true : false); +			} + +			/** 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, \c 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 ((UHINT & (1 << RXRSMI)) ? true : false); +			} + +			/** 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) +			{ +				UHINT &= ~(1 << RXRSMI); +			} + +			/** 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) +			{ +				UHCON |=  (1 << RESUME); +			} + +			/** 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 ((UHCON & (1 << RESUME)) ? false : true); +			} + +	/* 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) +			{ +				USBCON |=  (1 << HOST); +			} + +			static inline void USB_Host_HostMode_Off(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Host_HostMode_Off(void) +			{ +				USBCON &= ~(1 << HOST); +			} + +			static inline void USB_Host_VBUS_Auto_Enable(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Host_VBUS_Auto_Enable(void) +			{ +				OTGCON &= ~(1 << VBUSHWC); +				UHWCON |=  (1 << UVCONE); +			} + +			static inline void USB_Host_VBUS_Manual_Enable(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Host_VBUS_Manual_Enable(void) +			{ +				OTGCON |=  (1 << VBUSHWC); +				UHWCON &= ~(1 << UVCONE); + +				DDRE   |=  (1 << 7); +			} + +			static inline void USB_Host_VBUS_Auto_On(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Host_VBUS_Auto_On(void) +			{ +				OTGCON |=  (1 << VBUSREQ); +			} + +			static inline void USB_Host_VBUS_Manual_On(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Host_VBUS_Manual_On(void) +			{ +				#if defined(INVERTED_VBUS_ENABLE_LINE) +				PORTE  &= ~(1 << 7); +				#else +				PORTE  |=  (1 << 7); +				#endif +			} + +			static inline void USB_Host_VBUS_Auto_Off(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Host_VBUS_Auto_Off(void) +			{ +				OTGCON |=  (1 << VBUSRQC); +			} + +			static inline void USB_Host_VBUS_Manual_Off(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Host_VBUS_Manual_Off(void) +			{ +				#if defined(INVERTED_VBUS_ENABLE_LINE) +				PORTE  |=  (1 << 7); +				#else +				PORTE  &= ~(1 << 7); +				#endif +			} + +			static inline void USB_Host_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; +			static inline void USB_Host_SetDeviceAddress(const uint8_t Address) +			{ +				UHADDR  =  (Address & 0x7F); +			} + +		/* 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/lib/lufa/LUFA/Drivers/USB/Core/AVR8/OTG_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/OTG_AVR8.h new file mode 100644 index 0000000000..74c70ccdfd --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/OTG_AVR8.h @@ -0,0 +1,159 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB OTG definitions for the AVR8 microcontrollers. + *  \copydetails Group_OTG_AVR8 + * + *  \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_OTG + *  \defgroup Group_OTG_AVR8 USB On The Go (OTG) Management (AVR8) + *  \brief USB OTG definitions for the AVR8 microcontrollers. + * + *  Architecture specific USB OTG definitions for the Atmel 8-bit AVR microcontrollers. + * + *  @{ + */ + +#ifndef __USBOTG_AVR8_H__ +#define __USBOTG_AVR8_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 + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Mask for the VBUS pulsing method of SRP, supported by some OTG devices. +			 * +			 *  \see \ref USB_OTG_Device_InitiateSRP(). +			 */ +			#define USB_OTG_SRP_VBUS                   (1 << SRPSEL) + +			/** Mask for the Data + pulsing method of SRP, supported by some OTG devices. +			 * +			 *  \see \ref USB_OTG_Device_InitiateSRP(). +			 */ +			#define USB_OTG_STP_DATA                   0 + +		/* Inline Functions: */ +			/** Initiate a Host Negotiation Protocol request. This indicates to the other connected device +			 *  that the device wishes to change device/host roles. +			 */ +			static inline void USB_OTG_Device_RequestHNP(void) ATTR_ALWAYS_INLINE; +			static inline void USB_OTG_Device_RequestHNP(void) +			{ +				OTGCON |=  (1 << HNPREQ); +			} + +			/** Cancel a Host Negotiation Protocol request. This stops a pending HNP request to the other +			 *  connected device. +			 */ +			static inline void USB_OTG_Device_CancelHNPRequest(void) ATTR_ALWAYS_INLINE; +			static inline void USB_OTG_Device_CancelHNPRequest(void) +			{ +				OTGCON &= ~(1 << HNPREQ); +			} + +			/** Determines if the device is currently sending a HNP to an attached host. +			 * +			 *  \return Boolean \c true if currently sending a HNP to the other connected device, \c false otherwise +			 */ +			static inline bool USB_OTG_Device_IsSendingHNP(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool USB_OTG_Device_IsSendingHNP(void) +			{ +				return ((OTGCON & (1 << HNPREQ)) ? true : false); +			} + +			/** Initiates a Session Request Protocol request. Most OTG devices turn off VBUS when the USB +			 *  interface is not in use, to conserve power. Sending a SRP to a USB OTG device running in +			 *  host mode indicates that VBUS should be applied and a session started. +			 * +			 *  There are two different methods of sending a SRP - either pulses on the VBUS line, or by +			 *  pulsing the Data + line via the internal pull-up resistor. +			 * +			 *  \param[in] SRPTypeMask  Mask indicating the type of SRP to use, either \ref USB_OTG_SRP_VBUS or +			 *                          \ref USB_OTG_STP_DATA. +			 */ +			static inline void USB_OTG_Device_InitiateSRP(const uint8_t SRPTypeMask) ATTR_ALWAYS_INLINE; +			static inline void USB_OTG_Device_InitiateSRP(const uint8_t SRPTypeMask) +			{ +				OTGCON = ((OTGCON & ~(1 << SRPSEL)) | (SRPTypeMask | (1 << SRPREQ))); +			} + +			/** Accepts a HNP from a connected device, indicating that both devices should exchange +			 *  device/host roles. +			 */ +			static inline void USB_OTG_Host_AcceptHNP(void) ATTR_ALWAYS_INLINE; +			static inline void USB_OTG_Host_AcceptHNP(void) +			{ +				OTGCON |=  (1 << HNPREQ); +			} + +			/** Rejects a HNP from a connected device, indicating that both devices should remain in their +			 *  current device/host roles. +			 */ +			static inline void USB_OTG_Host_RejectHNP(void) ATTR_ALWAYS_INLINE; +			static inline void USB_OTG_Host_RejectHNP(void) +			{ +				OTGCON &= ~(1 << HNPREQ); +			} + +			/** Indicates if the connected device is currently sending a HNP request. +			 * +			 *  \return Boolean \c true if a HNP is currently being issued by the connected device, \c false otherwise. +			 */ +			static inline bool USB_OTG_Host_IsHNPReceived(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool USB_OTG_Host_IsHNPReceived(void) +			{ +				return ((OTGCON & (1 << HNPREQ)) ? true : false); +			} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.c new file mode 100644 index 0000000000..7b17d45d4f --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.c @@ -0,0 +1,221 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_AVR8) + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../USBMode.h" + +#if defined(USB_CAN_BE_HOST) + +#include "PipeStream_AVR8.h" + +uint8_t Pipe_Discard_Stream(uint16_t Length, +                            uint16_t* const BytesProcessed) +{ +	uint8_t  ErrorCode; +	uint16_t BytesInTransfer = 0; + +	Pipe_SetPipeToken(PIPE_TOKEN_IN); + +	if ((ErrorCode = Pipe_WaitUntilReady())) +	  return ErrorCode; + +	if (BytesProcessed != NULL) +	  Length -= *BytesProcessed; + +	while (Length) +	{ +		if (!(Pipe_IsReadWriteAllowed())) +		{ +			Pipe_ClearIN(); + +			if (BytesProcessed != NULL) +			{ +				*BytesProcessed += BytesInTransfer; +				return PIPE_RWSTREAM_IncompleteTransfer; +			} + +			if ((ErrorCode = Pipe_WaitUntilReady())) +			  return ErrorCode; +		} +		else +		{ +			Pipe_Discard_8(); + +			Length--; +			BytesInTransfer++; +		} +	} + +	return PIPE_RWSTREAM_NoError; +} + +uint8_t Pipe_Null_Stream(uint16_t Length, +                         uint16_t* const BytesProcessed) +{ +	uint8_t  ErrorCode; +	uint16_t BytesInTransfer = 0; + +	Pipe_SetPipeToken(PIPE_TOKEN_OUT); + +	if ((ErrorCode = Pipe_WaitUntilReady())) +	  return ErrorCode; + +	if (BytesProcessed != NULL) +	  Length -= *BytesProcessed; + +	while (Length) +	{ +		if (!(Pipe_IsReadWriteAllowed())) +		{ +			Pipe_ClearOUT(); + +			if (BytesProcessed != NULL) +			{ +				*BytesProcessed += BytesInTransfer; +				return PIPE_RWSTREAM_IncompleteTransfer; +			} + +			USB_USBTask(); + +			if ((ErrorCode = Pipe_WaitUntilReady())) +			  return ErrorCode; +		} +		else +		{ +			Pipe_Write_8(0); + +			Length--; +			BytesInTransfer++; +		} +	} + +	return PIPE_RWSTREAM_NoError; +} + +/* The following abuses the C preprocessor in order to copy-paste common code with slight alterations, + * so that the code needs to be written once. It is a crude form of templating to reduce code maintenance. */ + +#define  TEMPLATE_FUNC_NAME                        Pipe_Write_Stream_LE +#define  TEMPLATE_BUFFER_TYPE                      const void* +#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT +#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT() +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(*BufferPtr) +#include "Template/Template_Pipe_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Pipe_Write_Stream_BE +#define  TEMPLATE_BUFFER_TYPE                      const void* +#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT +#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT() +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(*BufferPtr) +#include "Template/Template_Pipe_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_LE +#define  TEMPLATE_BUFFER_TYPE                      void* +#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN +#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN() +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Pipe_Read_8() +#include "Template/Template_Pipe_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_BE +#define  TEMPLATE_BUFFER_TYPE                      void* +#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN +#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN() +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Pipe_Read_8() +#include "Template/Template_Pipe_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Pipe_Write_PStream_LE +#define  TEMPLATE_BUFFER_TYPE                      const void* +#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT +#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT() +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(pgm_read_byte(BufferPtr)) +#include "Template/Template_Pipe_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Pipe_Write_PStream_BE +#define  TEMPLATE_BUFFER_TYPE                      const void* +#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT +#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT() +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(pgm_read_byte(BufferPtr)) +#include "Template/Template_Pipe_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Pipe_Write_EStream_LE +#define  TEMPLATE_BUFFER_TYPE                      const void* +#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT +#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT() +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(eeprom_read_byte(BufferPtr)) +#include "Template/Template_Pipe_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Pipe_Write_EStream_BE +#define  TEMPLATE_BUFFER_TYPE                      const void* +#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT +#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT() +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(eeprom_read_byte(BufferPtr)) +#include "Template/Template_Pipe_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Pipe_Read_EStream_LE +#define  TEMPLATE_BUFFER_TYPE                      void* +#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN +#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN() +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Pipe_Read_8()) +#include "Template/Template_Pipe_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Pipe_Read_EStream_BE +#define  TEMPLATE_BUFFER_TYPE                      void* +#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN +#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN() +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Pipe_Read_8()) +#include "Template/Template_Pipe_RW.c" + +#endif + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.h new file mode 100644 index 0000000000..ca63bdf5a2 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/PipeStream_AVR8.h @@ -0,0 +1,442 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Pipe data stream transmission and reception management for the AVR8 microcontrollers + *  \copydetails Group_PipeStreamRW_AVR8 + * + *  \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_PipeStreamRW + *  \defgroup Group_PipeStreamRW_AVR8 Read/Write of Multi-Byte Streams (AVR8) + *  \brief Pipe data stream transmission and reception management for the Atmel AVR8 architecture. + * + *  Functions, macros, variables, enums and types related to data reading and writing of data streams from + *  and to pipes. + * + *  @{ + */ + +#ifndef __PIPE_STREAM_AVR8_H__ +#define __PIPE_STREAM_AVR8_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../USBMode.h" +		#include "../USBTask.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_USB_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Function Prototypes: */ +			/** \name Stream functions for null data */ +			//@{ + +			/** Reads and discards the given number of bytes from the pipe, discarding fully read packets from the host +			 *  as needed. The last packet is not automatically discarded once the remaining bytes has been read; the +			 *  user is responsible for manually discarding the last packet from the device via the \ref Pipe_ClearIN() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, failing or +			 *  succeeding as a single unit. If the BytesProcessed parameter points to a valid storage location, the transfer +			 *  will instead be performed as a series of chunks. Each time the pipe bank becomes empty while there is still data +			 *  to process (and after the current packet has been acknowledged) the BytesProcessed location will be updated with +			 *  the total number of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed in the user code - to +			 *  continue the transfer, call the function again with identical parameters and it will resume until the BytesProcessed +			 *  value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Pipe_Discard_Stream(512, NULL)) != PIPE_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Pipe_Discard_Stream(512, &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != PIPE_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without +			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken(). +			 * +			 *  \param[in] Length          Number of bytes to discard via the currently selected pipe. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                             updated, \c NULL if the entire stream should be processed at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Discard_Stream(uint16_t Length, +			                            uint16_t* const BytesProcessed); + +			/** Writes a given number of zeroed bytes to the pipe, sending full pipe packets from the host to the device +			 *  as needed. The last packet is not automatically sent once the remaining bytes has been written; the +			 *  user is responsible for manually discarding the last packet from the device via the \ref Pipe_ClearOUT() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, failing or +			 *  succeeding as a single unit. If the BytesProcessed parameter points to a valid storage location, the transfer +			 *  will instead be performed as a series of chunks. Each time the pipe bank becomes full while there is still data +			 *  to process (and after the current packet transmission has been initiated) the BytesProcessed location will be +			 *  updated with the total number of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed in the user code - to +			 *  continue the transfer, call the function again with identical parameters and it will resume until the BytesProcessed +			 *  value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Pipe_Null_Stream(512, NULL)) != PIPE_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Pipe_Null_Stream(512, &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != PIPE_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without +			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken(). +			 * +			 *  \param[in] Length          Number of zero bytes to write via the currently selected pipe. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                             updated, \c NULL if the entire stream should be processed at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Null_Stream(uint16_t Length, +			                         uint16_t* const BytesProcessed); + +			//@} + +			/** \name Stream functions for RAM source/destination data */ +			//@{ + +			/** Writes the given number of bytes to the pipe from the given buffer in little endian, +			 *  sending full packets to the device as needed. The last packet filled is not automatically sent; +			 *  the user is responsible for manually sending the last written packet to the host via the +			 *  \ref Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is +			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the pipe bank becomes full while there is still data to process (and after the current +			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the +			 *  total number of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t DataStream[512]; +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Pipe_Write_Stream_LE(DataStream, sizeof(DataStream), +			 *                                        NULL)) != PIPE_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  DataStream[512]; +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Pipe_Write_Stream_LE(DataStream, sizeof(DataStream), +			 *                                           &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != PIPE_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without +			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken(). +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                             updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Write_Stream_LE(const void* const Buffer, +			                             uint16_t Length, +			                             uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Writes the given number of bytes to the pipe from the given buffer in big endian, +			 *  sending full packets to the device as needed. The last packet filled is not automatically sent; +			 *  the user is responsible for manually sending the last written packet to the host via the +			 *  \ref Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is +			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. +			 * +			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without +			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken(). +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                             updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Write_Stream_BE(const void* const Buffer, +			                             uint16_t Length, +			                             uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the pipe into the given buffer in little endian, +			 *  sending full packets to the device as needed. The last packet filled is not automatically sent; +			 *  the user is responsible for manually sending the last written packet to the host via the +			 *  \ref Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is +			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the pipe bank becomes empty while there is still data to process (and after the current +			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number +			 *  of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t DataStream[512]; +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Pipe_Read_Stream_LE(DataStream, sizeof(DataStream), +			 *                                       NULL)) != PIPE_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  DataStream[512]; +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Pipe_Read_Stream_LE(DataStream, sizeof(DataStream), +			 *                                          &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != PIPE_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without +			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken(). +			 * +			 *  \param[out] Buffer          Pointer to the source data buffer to write to. +			 *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                              updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Read_Stream_LE(void* const Buffer, +			                            uint16_t Length, +			                            uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the pipe into the given buffer in big endian, +			 *  sending full packets to the device as needed. The last packet filled is not automatically sent; +			 *  the user is responsible for manually sending the last written packet to the host via the +			 *  \ref Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is +			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. +			 * +			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without +			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken(). +			 * +			 *  \param[out] Buffer          Pointer to the source data buffer to write to. +			 *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                              updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Read_Stream_BE(void* const Buffer, +			                            uint16_t Length, +			                            uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); +			//@} + +			/** \name Stream functions for EEPROM source/destination data */ +			//@{ + +			/** EEPROM buffer source version of \ref Pipe_Write_Stream_LE(). +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                             updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Write_EStream_LE(const void* const Buffer, +			                              uint16_t Length, +			                              uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer source version of \ref Pipe_Write_Stream_BE(). +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                             updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Write_EStream_BE(const void* const Buffer, +			                              uint16_t Length, +			                              uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer source version of \ref Pipe_Read_Stream_LE(). +			 * +			 *  \param[out] Buffer          Pointer to the source data buffer to write to. +			 *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                              updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Read_EStream_LE(void* const Buffer, +			                             uint16_t Length, +			                             uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer source version of \ref Pipe_Read_Stream_BE(). +			 * +			 *  \param[out] Buffer          Pointer to the source data buffer to write to. +			 *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                              updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Read_EStream_BE(void* const Buffer, +			                             uint16_t Length, +			                             uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); +			//@} + +			/** \name Stream functions for PROGMEM source/destination data */ +			//@{ + +			/** FLASH buffer source version of \ref Pipe_Write_Stream_LE(). +			 * +			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly. +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                             updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Write_PStream_LE(const void* const Buffer, +			                              uint16_t Length, +			                              uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** FLASH buffer source version of \ref Pipe_Write_Stream_BE(). +			 * +			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly. +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                             updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Write_PStream_BE(const void* const Buffer, +			                              uint16_t Length, +			                              uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); +			//@} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c new file mode 100644 index 0000000000..20239d06f8 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.c @@ -0,0 +1,210 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_AVR8) + +#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; + +bool Pipe_ConfigurePipeTable(const USB_Pipe_Table_t* const Table, +                             const uint8_t Entries) +{ +	for (uint8_t i = 0; i < Entries; i++) +	{ +		if (!(Table[i].Address)) +		  continue; + +		if (!(Pipe_ConfigurePipe(Table[i].Address, Table[i].Type, Table[i].EndpointAddress, Table[i].Size, Table[i].Banks))) +		{ +			return false; +		} +	} + +	return true; +} + +bool Pipe_ConfigurePipe(const uint8_t Address, +                        const uint8_t Type, +                        const uint8_t EndpointAddress, +                        const uint16_t Size, +                        const uint8_t Banks) +{ +	uint8_t Number = (Address & PIPE_EPNUM_MASK); +	uint8_t Token  = (Address & PIPE_DIR_IN) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT; + +	if (Number >= PIPE_TOTAL_PIPES) +	  return false; + +	if (Type == EP_TYPE_CONTROL) +	  Token = PIPE_TOKEN_SETUP; + +#if defined(ORDERED_EP_CONFIG) +	Pipe_SelectPipe(Number); +	Pipe_EnablePipe(); + +	UPCFG1X = 0; + +	UPCFG0X = ((Type << EPTYPE0) | Token | ((EndpointAddress & PIPE_EPNUM_MASK) << PEPNUM0)); +	UPCFG1X = ((1 << ALLOC) | ((Banks > 1) ? (1 << EPBK0) : 0) | Pipe_BytesToEPSizeMask(Size)); + +	Pipe_SetInfiniteINRequests(); + +	return Pipe_IsConfigured(); +#else +	for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++) +	{ +		uint8_t UPCFG0XTemp; +		uint8_t UPCFG1XTemp; +		uint8_t UPCFG2XTemp; +		uint8_t UPIENXTemp; + +		Pipe_SelectPipe(PNum); + +		if (PNum == Number) +		{ +			UPCFG0XTemp = ((Type << EPTYPE0) | Token | ((EndpointAddress & PIPE_EPNUM_MASK) << PEPNUM0)); +			UPCFG1XTemp = ((1 << ALLOC) | ((Banks > 1) ? (1 << EPBK0) : 0) | Pipe_BytesToEPSizeMask(Size)); +			UPCFG2XTemp = 0; +			UPIENXTemp  = 0; +		} +		else +		{ +			UPCFG0XTemp = UPCFG0X; +			UPCFG1XTemp = UPCFG1X; +			UPCFG2XTemp = UPCFG2X; +			UPIENXTemp  = UPIENX; +		} + +		if (!(UPCFG1XTemp & (1 << ALLOC))) +		  continue; + +		Pipe_DisablePipe(); +		UPCFG1X &= ~(1 << ALLOC); + +		Pipe_EnablePipe(); +		UPCFG0X = UPCFG0XTemp; +		UPCFG1X = UPCFG1XTemp; +		UPCFG2X = UPCFG2XTemp; +		UPIENX  = UPIENXTemp; + +		Pipe_SetInfiniteINRequests(); + +		if (!(Pipe_IsConfigured())) +		  return false; +	} + +	Pipe_SelectPipe(Number); +	return true; +#endif +} + +void Pipe_ClearPipes(void) +{ +	UPINT = 0; + +	for (uint8_t PNum = 0; PNum < PIPE_TOTAL_PIPES; PNum++) +	{ +		Pipe_SelectPipe(PNum); +		UPIENX  = 0; +		UPINTX  = 0; +		UPCFG1X = 0; +		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 + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h new file mode 100644 index 0000000000..3521efbe9e --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Pipe_AVR8.h @@ -0,0 +1,922 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Pipe definitions for the AVR8 microcontrollers. + *  \copydetails Group_PipeManagement_AVR8 + * + *  \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_AVR8 Pipe Data Reading and Writing (AVR8) + *  \brief Pipe data read/write definitions for the Atmel AVR8 architecture. + * + *  Functions, macros, variables, enums and types related to data reading and writing from and to pipes. + */ + +/** \ingroup Group_PipePrimitiveRW + *  \defgroup Group_PipePrimitiveRW_AVR8 Read/Write of Primitive Data Types (AVR8) + *  \brief Pipe primitive data read/write definitions for the Atmel AVR8 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_AVR8 Pipe Packet Management (AVR8) + *  \brief Pipe packet management definitions for the Atmel AVR8 architecture. + * + *  Functions, macros, variables, enums and types related to packet management of pipes. + */ + +/** \ingroup Group_PipeControlReq + *  \defgroup Group_PipeControlReq_AVR8 Pipe Control Request Management (AVR8) + *  \brief Pipe control request management definitions for the Atmel AVR8 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_AVR8 Pipe Management (AVR8) + *  \brief Pipe management definitions for the Atmel AVR8 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_AVR8_H__ +#define __PIPE_AVR8_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 + +	/* 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         (1 << 6) + +			/** Mask for \ref Pipe_GetErrorFlags(), indicating that an underflow error occurred in the pipe on the received data. */ +			#define PIPE_ERRORFLAG_UNDERFLOW        (1 << 5) + +			/** Mask for \ref Pipe_GetErrorFlags(), indicating that a CRC error occurred in the pipe on the received data. */ +			#define PIPE_ERRORFLAG_CRC16            (1 << 4) + +			/** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware timeout error occurred in the pipe. */ +			#define PIPE_ERRORFLAG_TIMEOUT          (1 << 3) + +			/** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware PID error occurred in the pipe. */ +			#define PIPE_ERRORFLAG_PID              (1 << 2) + +			/** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data PID error occurred in the pipe. */ +			#define PIPE_ERRORFLAG_DATAPID          (1 << 1) + +			/** Mask for \ref Pipe_GetErrorFlags(), indicating that a hardware data toggle error occurred in the pipe. */ +			#define PIPE_ERRORFLAG_DATATGL          (1 << 0) +			//@} + +			/** \name Pipe Token Masks */ +			//@{ +			/** Token mask for \ref Pipe_SetPipeToken() and \ref Pipe_GetPipeToken(). 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                (0 << PTOKEN0) + +			/** Token mask for \ref Pipe_SetPipeToken() and \ref Pipe_GetPipeToken(). 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                   (1 << PTOKEN0) + +			/** Token mask for \ref Pipe_SetPipeToken() and \ref Pipe_GetPipeToken(). 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                  (2 << PTOKEN0) +			//@} + +			/** 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 + +			/** Total number of pipes (including the default control pipe at address 0) which may be used in +			 *  the device. Different USB AVR models support different amounts of pipes, this value reflects +			 *  the maximum number of pipes for the currently selected AVR model. +			 */ +			#define PIPE_TOTAL_PIPES                7 + +			/** 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 USB AVR model. +			 */ +			#define PIPE_MAX_SIZE                   256 + +		/* Enums: */ +			/** Enum for the possible error return codes of the \ref Pipe_WaitUntilReady() function. +			 * +			 *  \ingroup Group_PipeRW_AVR8 +			 */ +			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. +			 * +			 *  \ingroup Group_PipeRW_AVR8 +			 * +			 *  \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 UPBCX; +			} + +			/** Determines the currently selected pipe's direction. +			 * +			 *  \return The currently selected pipe's direction, as a \c PIPE_DIR_* mask. +			 */ +			static inline uint8_t Pipe_GetPipeDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline uint8_t Pipe_GetPipeDirection(void) +			{ +				return (UPCFG0X & (1 << EPDIR)) ? PIPE_DIR_IN : PIPE_DIR_OUT; +			} + +			/** Returns the pipe address of the currently selected pipe. This is typically used to save the +			 *  currently selected pipe address 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 ((UPNUM & PIPE_PIPENUM_MASK) | Pipe_GetPipeDirection()); +			} + +			/** Selects the given pipe address. Any pipe operations which do not require the pipe address to be +			 *  indicated will operate on the currently selected pipe. +			 * +			 *  \param[in] Address  Address of the pipe to select. +			 */ +			static inline void Pipe_SelectPipe(const uint8_t Address) ATTR_ALWAYS_INLINE; +			static inline void Pipe_SelectPipe(const uint8_t Address) +			{ +				UPNUM = (Address & PIPE_PIPENUM_MASK); +			} + +			/** Resets the desired pipe, including the pipe banks and flags. +			 * +			 *  \param[in] Address  Address of the pipe to reset. +			 */ +			static inline void Pipe_ResetPipe(const uint8_t Address) ATTR_ALWAYS_INLINE; +			static inline void Pipe_ResetPipe(const uint8_t Address) +			{ +				UPRST = (1 << (Address & PIPE_PIPENUM_MASK)); +				UPRST = 0; +			} + +			/** 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) +			{ +				UPCONX |= (1 << PEN); +			} + +			/** 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) +			{ +				UPCONX &= ~(1 << PEN); +			} + +			/** 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 ((UPCONX & (1 << PEN)) ? 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 (UPCFG0X & (0x03 << PTOKEN0)); +			} + +			/** 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) +			{ +				UPCFG0X = ((UPCFG0X & ~(0x03 << PTOKEN0)) | 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) +			{ +				UPCONX |= (1 << INMODE); +			} + +			/** 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) +			{ +				UPCONX &= ~(1 << INMODE); +				UPINRQX = 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 ((UPSTAX & (1 << CFGOK)) ? true : false); +			} + +			/** 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) +			{ +				uint8_t UPCFG0X_Temp = UPCFG0X; + +				return (((UPCFG0X_Temp >> PEPNUM0) & PIPE_EPNUM_MASK) | +				        ((UPCFG0X_Temp & (1 << PTOKEN1)) ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT)); +			} + +			/** 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) +			{ +				UPCFG2X = 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 UPINT; +			} + +			/** Determines if the specified pipe address has interrupted (valid only for INTERRUPT type +			 *  pipes). +			 * +			 *  \param[in] Address  Address 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 Address) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool Pipe_HasPipeInterrupted(const uint8_t Address) +			{ +				return ((UPINT & (1 << (Address & PIPE_PIPENUM_MASK))) ? 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) +			{ +				UPCONX &= ~(1 << PFREEZE); +			} + +			/** 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) +			{ +				UPCONX |= (1 << PFREEZE); +			} + +			/** 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 ((UPCONX & (1 << 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) +			{ +				UPERRX = 0; +				UPINTX &= ~(1 << PERRI); +			} + +			/** 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 ((UPINTX & (1 << PERRI)) ? 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 ((UPERRX & (PIPE_ERRORFLAG_CRC16 | PIPE_ERRORFLAG_TIMEOUT | +				                   PIPE_ERRORFLAG_PID   | PIPE_ERRORFLAG_DATAPID | +				                   PIPE_ERRORFLAG_DATATGL)) | +				        (UPSTAX & (PIPE_ERRORFLAG_OVERFLOW | PIPE_ERRORFLAG_UNDERFLOW))); +			} + +			/** 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_AVR8 +			 * +			 *  \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 (UPSTAX & (0x03 << NBUSYBK0)); +			} + +			/** 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_AVR8 +			 * +			 *  \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 ((UPINTX & (1 << RWAL)) ? true : false); +			} + +			/** Determines if a packet has been received on the currently selected IN pipe from the attached device. +			 * +			 *  \ingroup Group_PipePacketManagement_AVR8 +			 * +			 *  \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 ((UPINTX & (1 << RXINI)) ? true : false); +			} + +			/** Determines if the currently selected OUT pipe is ready to send an OUT packet to the attached device. +			 * +			 *  \ingroup Group_PipePacketManagement_AVR8 +			 * +			 *  \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 ((UPINTX & (1 << TXOUTI)) ? true : false); +			} + +			/** Determines if no SETUP request is currently being sent to the attached device on the selected +			 *  CONTROL type pipe. +			 * +			 *  \ingroup Group_PipePacketManagement_AVR8 +			 * +			 *  \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 ((UPINTX & (1 << TXSTPI)) ? true : false); +			} + +			/** Sends the currently selected CONTROL type pipe's contents to the device as a SETUP packet. +			 * +			 *  \ingroup Group_PipePacketManagement_AVR8 +			 */ +			static inline void Pipe_ClearSETUP(void) ATTR_ALWAYS_INLINE; +			static inline void Pipe_ClearSETUP(void) +			{ +				UPINTX &= ~((1 << TXSTPI) | (1 << FIFOCON)); +			} + +			/** 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_AVR8 +			 */ +			static inline void Pipe_ClearIN(void) ATTR_ALWAYS_INLINE; +			static inline void Pipe_ClearIN(void) +			{ +				UPINTX &= ~((1 << RXINI) | (1 << FIFOCON)); +			} + +			/** 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_AVR8 +			 */ +			static inline void Pipe_ClearOUT(void) ATTR_ALWAYS_INLINE; +			static inline void Pipe_ClearOUT(void) +			{ +				UPINTX &= ~((1 << TXOUTI) | (1 << FIFOCON)); +			} + +			/** 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_AVR8 +			 * +			 *  \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 ((UPINTX & (1 << NAKEDI)) ? true : false); +			} + +			/** Clears the NAK condition on the currently selected pipe. +			 * +			 *  \ingroup Group_PipePacketManagement_AVR8 +			 * +			 *  \see \ref Pipe_IsNAKReceived() for more details. +			 */ +			static inline void Pipe_ClearNAKReceived(void) ATTR_ALWAYS_INLINE; +			static inline void Pipe_ClearNAKReceived(void) +			{ +				UPINTX &= ~(1 << NAKEDI); +			} + +			/** Determines if the currently selected pipe has had the STALL condition set by the attached device. +			 * +			 *  \ingroup Group_PipePacketManagement_AVR8 +			 * +			 *  \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 ((UPINTX & (1 << RXSTALLI)) ? true : false); +			} + +			/** 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_AVR8 +			 */ +			static inline void Pipe_ClearStall(void) ATTR_ALWAYS_INLINE; +			static inline void Pipe_ClearStall(void) +			{ +				UPINTX &= ~(1 << RXSTALLI); +			} + +			/** Reads one byte from the currently selected pipe's bank, for OUT direction pipes. +			 * +			 *  \ingroup Group_PipePrimitiveRW_AVR8 +			 * +			 *  \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 UPDATX; +			} + +			/** Writes one byte to the currently selected pipe's bank, for IN direction pipes. +			 * +			 *  \ingroup Group_PipePrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				UPDATX = Data; +			} + +			/** Discards one byte from the currently selected pipe's bank, for OUT direction pipes. +			 * +			 *  \ingroup Group_PipePrimitiveRW_AVR8 +			 */ +			static inline void Pipe_Discard_8(void) ATTR_ALWAYS_INLINE; +			static inline void Pipe_Discard_8(void) +			{ +				uint8_t Dummy; + +				Dummy = UPDATX; + +				(void)Dummy; +			} + +			/** Reads two bytes from the currently selected pipe's bank in little endian format, for OUT +			 *  direction pipes. +			 * +			 *  \ingroup Group_PipePrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				union +				{ +					uint16_t Value; +					uint8_t  Bytes[2]; +				} Data; + +				Data.Bytes[0] = UPDATX; +				Data.Bytes[1] = UPDATX; + +				return Data.Value; +			} + +			/** Reads two bytes from the currently selected pipe's bank in big endian format, for OUT +			 *  direction pipes. +			 * +			 *  \ingroup Group_PipePrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				union +				{ +					uint16_t Value; +					uint8_t  Bytes[2]; +				} Data; + +				Data.Bytes[1] = UPDATX; +				Data.Bytes[0] = UPDATX; + +				return Data.Value; +			} + +			/** Writes two bytes to the currently selected pipe's bank in little endian format, for IN +			 *  direction pipes. +			 * +			 *  \ingroup Group_PipePrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				UPDATX = (Data & 0xFF); +				UPDATX = (Data >> 8); +			} + +			/** Writes two bytes to the currently selected pipe's bank in big endian format, for IN +			 *  direction pipes. +			 * +			 *  \ingroup Group_PipePrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				UPDATX = (Data >> 8); +				UPDATX = (Data & 0xFF); +			} + +			/** Discards two bytes from the currently selected pipe's bank, for OUT direction pipes. +			 * +			 *  \ingroup Group_PipePrimitiveRW_AVR8 +			 */ +			static inline void Pipe_Discard_16(void) ATTR_ALWAYS_INLINE; +			static inline void Pipe_Discard_16(void) +			{ +				uint8_t Dummy; + +				Dummy = UPDATX; +				Dummy = UPDATX; + +				(void)Dummy; +			} + +			/** Reads four bytes from the currently selected pipe's bank in little endian format, for OUT +			 *  direction pipes. +			 * +			 *  \ingroup Group_PipePrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				union +				{ +					uint32_t Value; +					uint8_t  Bytes[4]; +				} Data; + +				Data.Bytes[0] = UPDATX; +				Data.Bytes[1] = UPDATX; +				Data.Bytes[2] = UPDATX; +				Data.Bytes[3] = UPDATX; + +				return Data.Value; +			} + +			/** Reads four bytes from the currently selected pipe's bank in big endian format, for OUT +			 *  direction pipes. +			 * +			 *  \ingroup Group_PipePrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				union +				{ +					uint32_t DWord; +					uint8_t  Bytes[4]; +				} Data; + +				Data.Bytes[3] = UPDATX; +				Data.Bytes[2] = UPDATX; +				Data.Bytes[1] = UPDATX; +				Data.Bytes[0] = UPDATX; + +				return Data.DWord; +			} + +			/** Writes four bytes to the currently selected pipe's bank in little endian format, for IN +			 *  direction pipes. +			 * +			 *  \ingroup Group_PipePrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				UPDATX = (Data &  0xFF); +				UPDATX = (Data >> 8); +				UPDATX = (Data >> 16); +				UPDATX = (Data >> 24); +			} + +			/** Writes four bytes to the currently selected pipe's bank in big endian format, for IN +			 *  direction pipes. +			 * +			 *  \ingroup Group_PipePrimitiveRW_AVR8 +			 * +			 *  \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) +			{ +				UPDATX = (Data >> 24); +				UPDATX = (Data >> 16); +				UPDATX = (Data >> 8); +				UPDATX = (Data &  0xFF); +			} + +			/** Discards four bytes from the currently selected pipe's bank, for OUT direction pipes. +			 * +			 *  \ingroup Group_PipePrimitiveRW_AVR8 +			 */ +			static inline void Pipe_Discard_32(void) ATTR_ALWAYS_INLINE; +			static inline void Pipe_Discard_32(void) +			{ +				uint8_t Dummy; + +				Dummy = UPDATX; +				Dummy = UPDATX; +				Dummy = UPDATX; +				Dummy = UPDATX; + +				(void)Dummy; +			} + +		/* 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. +			 * +			 *  \attention 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 a table of pipe descriptions, in sequence. This function can be used to configure multiple +			 *  pipes at the same time. +			 * +			 *  \note Pipe with a zero address will be ignored, thus this function cannot be used to configure the +			 *        control pipe. +			 * +			 *  \param[in] Table    Pointer to a table of pipe descriptions. +			 *  \param[in] Entries  Number of entries in the pipe table to configure. +			 * +			 *  \return Boolean \c true if all pipes configured successfully, \c false otherwise. +			 */ +			bool Pipe_ConfigurePipeTable(const USB_Pipe_Table_t* const Table, +			                             const uint8_t Entries); + +			/** Configures the specified pipe address with the given pipe type, endpoint address within the attached device, +			 *  bank size and number of hardware banks. +			 * +			 *  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] Address          Pipe address to configure. +			 * +			 *  \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] EndpointAddress  Endpoint address 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. +			 * +			 *  \attention 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. +			 * +			 *  \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 Address, +			                        const uint8_t Type, +			                        const uint8_t EndpointAddress, +			                        const uint16_t Size, +			                        const uint8_t Banks); + +			/** Spin-loops until the currently selected non-control pipe is ready for the next packet 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_AVR8 +			 * +			 *  \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 << EPSIZE0); +			} + +		/* Function Prototypes: */ +			void Pipe_ClearPipes(void); +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c new file mode 100644 index 0000000000..f6c4beb229 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c @@ -0,0 +1,84 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#if defined(TEMPLATE_FUNC_NAME) + +uint8_t TEMPLATE_FUNC_NAME (void* const Buffer, +                            uint16_t Length) +{ +	uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); + +	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/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c new file mode 100644 index 0000000000..922b58efa3 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c @@ -0,0 +1,95 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#if defined(TEMPLATE_FUNC_NAME) + +uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, +                            uint16_t Length) +{ +	uint8_t* DataStream     = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); +	bool     LastPacketFull = false; + +	if (Length > USB_ControlRequest.wLength) +	  Length = USB_ControlRequest.wLength; +	else if (!(Length)) +	  Endpoint_ClearIN(); + +	while (Length || LastPacketFull) +	{ +		uint8_t USB_DeviceState_LCL = USB_DeviceState; + +		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) +		  return ENDPOINT_RWCSTREAM_DeviceDisconnected; +		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) +		  return ENDPOINT_RWCSTREAM_BusSuspended; +		else if (Endpoint_IsSETUPReceived()) +		  return ENDPOINT_RWCSTREAM_HostAborted; +		else if (Endpoint_IsOUTReceived()) +		  break; + +		if (Endpoint_IsINReady()) +		{ +			uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); + +			while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) +			{ +				TEMPLATE_TRANSFER_BYTE(DataStream); +				TEMPLATE_BUFFER_MOVE(DataStream, 1); +				Length--; +				BytesInEndpoint++; +			} + +			LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); +			Endpoint_ClearIN(); +		} +	} + +	while (!(Endpoint_IsOUTReceived())) +	{ +		uint8_t USB_DeviceState_LCL = USB_DeviceState; + +		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) +		  return ENDPOINT_RWCSTREAM_DeviceDisconnected; +		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) +		  return ENDPOINT_RWCSTREAM_BusSuspended; +		else if (Endpoint_IsSETUPReceived()) +		  return ENDPOINT_RWCSTREAM_HostAborted; +	} + +	return ENDPOINT_RWCSTREAM_NoError; +} + +#undef TEMPLATE_BUFFER_OFFSET +#undef TEMPLATE_BUFFER_MOVE +#undef TEMPLATE_FUNC_NAME +#undef TEMPLATE_TRANSFER_BYTE + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c new file mode 100644 index 0000000000..e55e592eb2 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c @@ -0,0 +1,89 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#if defined(TEMPLATE_FUNC_NAME) + +uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer, +                            uint16_t Length, +                            uint16_t* const BytesProcessed) +{ +	uint8_t* DataStream      = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); +	uint16_t BytesInTransfer = 0; +	uint8_t  ErrorCode; + +	if ((ErrorCode = Endpoint_WaitUntilReady())) +	  return ErrorCode; + +	if (BytesProcessed != NULL) +	{ +		Length -= *BytesProcessed; +		TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed); +	} + +	while (Length) +	{ +		if (!(Endpoint_IsReadWriteAllowed())) +		{ +			TEMPLATE_CLEAR_ENDPOINT(); + +			#if !defined(INTERRUPT_CONTROL_ENDPOINT) +			USB_USBTask(); +			#endif + +			if (BytesProcessed != NULL) +			{ +				*BytesProcessed += BytesInTransfer; +				return ENDPOINT_RWSTREAM_IncompleteTransfer; +			} + +			if ((ErrorCode = Endpoint_WaitUntilReady())) +			  return ErrorCode; +		} +		else +		{ +			TEMPLATE_TRANSFER_BYTE(DataStream); +			TEMPLATE_BUFFER_MOVE(DataStream, 1); +			Length--; +			BytesInTransfer++; +		} +	} + +	return ENDPOINT_RWSTREAM_NoError; +} + +#undef TEMPLATE_FUNC_NAME +#undef TEMPLATE_BUFFER_TYPE +#undef TEMPLATE_TRANSFER_BYTE +#undef TEMPLATE_CLEAR_ENDPOINT +#undef TEMPLATE_BUFFER_OFFSET +#undef TEMPLATE_BUFFER_MOVE + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c new file mode 100644 index 0000000000..bb2a57fa52 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c @@ -0,0 +1,88 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#if defined(TEMPLATE_FUNC_NAME) + +uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer, +                            uint16_t Length, +                            uint16_t* const BytesProcessed) +{ +	uint8_t* DataStream      = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); +	uint16_t BytesInTransfer = 0; +	uint8_t  ErrorCode; + +	Pipe_SetPipeToken(TEMPLATE_TOKEN); + +	if ((ErrorCode = Pipe_WaitUntilReady())) +	  return ErrorCode; + +	if (BytesProcessed != NULL) +	{ +		Length -= *BytesProcessed; +		TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed); +	} + +	while (Length) +	{ +		if (!(Pipe_IsReadWriteAllowed())) +		{ +			TEMPLATE_CLEAR_PIPE(); + +			if (BytesProcessed != NULL) +			{ +				*BytesProcessed += BytesInTransfer; +				return PIPE_RWSTREAM_IncompleteTransfer; +			} + +			if ((ErrorCode = Pipe_WaitUntilReady())) +			  return ErrorCode; +		} +		else +		{ +			TEMPLATE_TRANSFER_BYTE(DataStream); +			TEMPLATE_BUFFER_MOVE(DataStream, 1); +			Length--; +			BytesInTransfer++; +		} +	} + +	return PIPE_RWSTREAM_NoError; +} + +#undef TEMPLATE_FUNC_NAME +#undef TEMPLATE_BUFFER_TYPE +#undef TEMPLATE_TOKEN +#undef TEMPLATE_TRANSFER_BYTE +#undef TEMPLATE_CLEAR_PIPE +#undef TEMPLATE_BUFFER_OFFSET +#undef TEMPLATE_BUFFER_MOVE + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c new file mode 100644 index 0000000000..92532ab00b --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.c @@ -0,0 +1,273 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_AVR8) + +#define  __INCLUDE_FROM_USB_DRIVER +#define  __INCLUDE_FROM_USB_CONTROLLER_C +#include "../USBController.h" + +#if defined(USB_CAN_BE_BOTH) +volatile uint8_t USB_CurrentMode = USB_MODE_None; +#endif + +#if !defined(USE_STATIC_OPTIONS) +volatile uint8_t USB_Options; +#endif + +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_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) +	/* Workaround for AVR8 bootloaders that fail to turn off the OTG pad before running +	 * the loaded application. This causes VBUS detection to fail unless we first force +	 * it off to reset it. */ +	USB_OTGPAD_Off(); +	#endif + +	if (!(USB_Options & USB_OPT_REG_DISABLED)) +	  USB_REG_On(); +	else +	  USB_REG_Off(); + +	if (!(USB_Options & USB_OPT_MANUAL_PLL)) +	{ +		#if defined(USB_SERIES_4_AVR) +		PLLFRQ = (1 << PDIV2); +		#endif +	} + +	#if defined(USB_CAN_BE_BOTH) +	if (Mode == USB_MODE_UID) +	{ +		UHWCON |=  (1 << UIDE); +		USB_INT_Enable(USB_INT_IDTI); +		USB_CurrentMode = USB_GetUSBModeFromUID(); +	} +	else +	{ +		UHWCON &= ~(1 << UIDE); +		USB_CurrentMode = Mode; +	} +	#endif + +	USB_IsInitialized = true; + +	USB_ResetInterface(); +} + +void USB_Disable(void) +{ +	USB_INT_DisableAllInterrupts(); +	USB_INT_ClearAllInterrupts(); + +	USB_Detach(); +	USB_Controller_Disable(); + +	if (!(USB_Options & USB_OPT_MANUAL_PLL)) +	  USB_PLL_Off(); + +	if (!(USB_Options & USB_OPT_REG_KEEP_ENABLED)) +	  USB_REG_Off(); + +	#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) +	USB_OTGPAD_Off(); +	#endif + +	#if defined(USB_CAN_BE_BOTH) +	USB_CurrentMode = USB_MODE_None; +	#endif + +	USB_IsInitialized = false; +} + +void USB_ResetInterface(void) +{ +	#if defined(USB_CAN_BE_BOTH) +	bool UIDModeSelectEnabled = ((UHWCON & (1 << UIDE)) != 0); +	#endif + +	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) +		#if (defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) +		UHWCON |=  (1 << UIMOD); +		#endif + +		if (!(USB_Options & USB_OPT_MANUAL_PLL)) +		{ +			#if defined(USB_SERIES_2_AVR) +			USB_PLL_On(); +			while (!(USB_PLL_IsReady())); +			#else +			USB_PLL_Off(); +			#endif +		} + +		USB_Init_Device(); +		#endif +	} +	else if (USB_CurrentMode == USB_MODE_Host) +	{ +		#if defined(USB_CAN_BE_HOST) +		UHWCON &= ~(1 << UIMOD); + +		if (!(USB_Options & USB_OPT_MANUAL_PLL)) +		{ +			#if defined(USB_CAN_BE_HOST) +			USB_PLL_On(); +			while (!(USB_PLL_IsReady())); +			#endif +		} + +		USB_Init_Host(); +		#endif +	} + +	#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) +	USB_OTGPAD_On(); +	#endif +} + +#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 (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) +	if (USB_Options & USB_DEVICE_OPT_LOWSPEED) +	  USB_Device_SetLowSpeed(); +	else +	  USB_Device_SetFullSpeed(); + +	USB_INT_Enable(USB_INT_VBUSTI); +	#endif + +	Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL, +							   USB_Device_ControlEndpointSize, 1); + +	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_Off(); +	USB_Host_VBUS_Manual_Enable(); +	USB_Host_VBUS_Manual_On(); + +	USB_INT_Enable(USB_INT_SRPI); +	USB_INT_Enable(USB_INT_BCERRI); + +	USB_Attach(); +} +#endif + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h new file mode 100644 index 0000000000..1b6e2ef43c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBController_AVR8.h @@ -0,0 +1,432 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Controller definitions for the AVR8 microcontrollers. + *  \copydetails Group_USBManagement_AVR8 + * + *  \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_AVR8 USB Interface Management (AVR8) + *  \brief USB Controller definitions for the AVR8 microcontrollers. + * + *  Functions, macros, variables, enums and types related to the setup and management of the USB interface. + * + *  @{ + */ + +#ifndef __USBCONTROLLER_AVR8_H__ +#define __USBCONTROLLER_AVR8_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 unprescaled USB controller clock in your project makefile. +		#endif + +		#if (F_USB == 8000000) +			#if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \ +			     defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \ +			     defined(__AVR_ATmega32U2__)) +				#define USB_PLL_PSC                0 +			#elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)) +				#define USB_PLL_PSC                0 +			#elif (defined(__AVR_AT90USB646__)  || defined(__AVR_AT90USB1286__)) +				#define USB_PLL_PSC                ((1 << PLLP1) | (1 << PLLP0)) +			#elif (defined(__AVR_AT90USB647__)  || defined(__AVR_AT90USB1287__)) +				#define USB_PLL_PSC                ((1 << PLLP1) | (1 << PLLP0)) +			#endif +		#elif (F_USB == 16000000) +			#if (defined(__AVR_AT90USB82__) || defined(__AVR_AT90USB162__) || \ +			     defined(__AVR_ATmega8U2__) || defined(__AVR_ATmega16U2__) || \ +			     defined(__AVR_ATmega32U2__)) +				#define USB_PLL_PSC                (1 << PLLP0) +			#elif (defined(__AVR_ATmega16U4__) || defined(__AVR_ATmega32U4__)) +				#define USB_PLL_PSC                (1 << PINDIV) +			#elif (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB647__)) +				#define USB_PLL_PSC                ((1 << PLLP2) | (1 << PLLP1)) +			#elif (defined(__AVR_AT90USB1286__) || defined(__AVR_AT90USB1287__)) +				#define USB_PLL_PSC                ((1 << PLLP2) | (1 << PLLP0)) +			#endif +		#endif + +		#if !defined(USB_PLL_PSC) +			#error No PLL prescale value available for chosen F_USB value and AVR model. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** \name USB Controller Option Masks */ +			//@{ +			/** Regulator disable option mask for \ref USB_Init(). This indicates that the internal 3.3V USB data pad +			 *  regulator should be disabled and the AVR's VCC level used for the data pads. +			 * +			 *  \note See USB AVR data sheet for more information on the internal pad regulator. +			 */ +			#define USB_OPT_REG_DISABLED               (1 << 1) + +			/** Regulator enable option mask for \ref USB_Init(). This indicates that the internal 3.3V USB data pad +			 *  regulator should be enabled to regulate the data pin voltages from the VBUS level down to a level within +			 *  the range allowable by the USB standard. +			 * +			 *  \note See USB AVR data sheet for more information on the internal pad regulator. +			 */ +			#define USB_OPT_REG_ENABLED                (0 << 1) + +			/** Option mask for \ref USB_Init() to keep regulator enabled at all times. Indicates that \ref USB_Disable() +			 *  should not disable the regulator as it would otherwise. Has no effect if regulator is disabled using +			 *  \ref USB_OPT_REG_DISABLED. +			 * +			 *  \note See USB AVR data sheet for more information on the internal pad regulator. +			 */ +			#define USB_OPT_REG_KEEP_ENABLED           (1 << 3) + +			/** Manual PLL control option mask for \ref USB_Init(). This indicates to the library that the user application +			 *  will take full responsibility for controlling the AVR's PLL (used to generate the high frequency clock +			 *  that the USB controller requires) and ensuring that it is locked at the correct frequency for USB operations. +			 */ +			#define USB_OPT_MANUAL_PLL                 (1 << 2) + +			/** Automatic PLL control option mask for \ref USB_Init(). This indicates to the library that the library should +			 *  take full responsibility for controlling the AVR's PLL (used to generate the high frequency clock +			 *  that the USB controller requires) and ensuring that it is locked at the correct frequency for USB operations. +			 */ +			#define USB_OPT_AUTO_PLL                   (0 << 2) +			//@} + +			#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: */ +			#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) || defined(__DOXYGEN__) +				/** Determines if the VBUS line is currently high (i.e. the USB host is supplying power). +				 * +				 *  \note This function is not available on some AVR models which do not support hardware VBUS monitoring. +				 * +				 *  \return Boolean \c true if the VBUS line is currently detecting power from a host, \c false otherwise. +				 */ +				static inline bool USB_VBUS_GetStatus(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +				static inline bool USB_VBUS_GetStatus(void) +				{ +					return ((USBSTA & (1 << VBUS)) ? true : false); +				} +			#endif + +			/** 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) +			{ +				UDCON  |=  (1 << DETACH); +			} + +			/** 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) +			{ +				UDCON  &= ~(1 << DETACH); +			} + +		/* Function Prototypes: */ +			/** Main function to initialize and start the USB interface. Once active, the USB interface will +			 *  allow for device connection to a host when in device mode, or for device enumeration while in +			 *  host mode. +			 * +			 *  As the USB library relies on interrupts for the device and host mode enumeration processes, +			 *  the user must enable global interrupts before or shortly after this function is called. In +			 *  device mode, interrupts must be enabled within 500ms of this function being called to ensure +			 *  that the host does not time out whilst enumerating the device. In host mode, interrupts may be +			 *  enabled at the application's leisure however enumeration will not begin of an attached device +			 *  until after this has occurred. +			 * +			 *  Calling this function when the USB interface is already initialized will cause a complete USB +			 *  interface reset and re-enumeration. +			 * +			 *  \param[in] Mode     Mask indicating what mode the USB interface is to be initialized to, a value +			 *                      from the \ref USB_Modes_t enum. +			 *                      \note This parameter does not exist on devices with only one supported USB +			 *                            mode (device or host). +			 * +			 *  \param[in] Options  Mask indicating the options which should be used when initializing the USB +			 *                      interface to control the USB interface's behavior. This should be comprised of +			 *                      a \c USB_OPT_REG_* mask to control the regulator, a \c USB_OPT_*_PLL mask to control the +			 *                      PLL, and a \c USB_DEVICE_OPT_* mask (when the device mode is enabled) to set the device +			 *                      mode speed. +			 * +			 *  \note To reduce the FLASH requirements of the library if only device or host mode is required, +			 *        the mode can be statically set in the project makefile by defining the token \c USB_DEVICE_ONLY +			 *        (for device mode) or \c USB_HOST_ONLY (for host mode), passing the token to the compiler +			 *        via the -D switch. If the mode is statically set, this parameter does not exist in the +			 *        function prototype. +			 *        \n\n +			 * +			 *  \note To reduce the FLASH requirements of the library if only fixed settings are required, +			 *        the options may be set statically in the same manner as the mode (see the Mode parameter of +			 *        this function). To statically set the USB options, pass in the \c USE_STATIC_OPTIONS token, +			 *        defined to the appropriate options masks. When the options are statically set, this +			 *        parameter does not exist in the function prototype. +			 *        \n\n +			 * +			 *  \note The mode parameter does not exist on devices where only one mode is possible, such as USB +			 *        AVR models which only implement the USB device mode in hardware. +			 * +			 *  \see \ref Group_Device for the \c USB_DEVICE_OPT_* masks. +			 */ +			void USB_Init( +			               #if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__) +			               const uint8_t Mode +			               #endif + +			               #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS)) || defined(__DOXYGEN__) +			               , +			               #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS)) +			               void +			               #endif + +			               #if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__) +			               const uint8_t Options +			               #endif +			               ); + +			/** Shuts down the USB interface. This turns off the USB interface after deallocating all USB FIFO +			 *  memory, endpoints and pipes. When turned off, no USB functionality can be used until the interface +			 *  is restarted with the \ref USB_Init() function. +			 */ +			void USB_Disable(void); + +			/** Resets the interface, when already initialized. This will re-enumerate the device if already connected +			 *  to a host, or re-enumerate an already attached device when in host mode. +			 */ +			void USB_ResetInterface(void); + +		/* Global Variables: */ +			#if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__) +				/** Indicates the mode that the USB interface is currently initialized to, a value from the +				 *  \ref USB_Modes_t enum. +				 * +				 *  \attention This variable should be treated as read-only in the user application, and never manually +				 *             changed in value. +				 * +				 *  \note When the controller is initialized into UID auto-detection mode, this variable will hold the +				 *        currently selected USB mode (i.e. \ref USB_MODE_Device or \ref USB_MODE_Host). If the controller +				 *        is fixed into a specific mode (either through the \c USB_DEVICE_ONLY or \c USB_HOST_ONLY compile time +				 *        options, or a limitation of the USB controller in the chosen device model) this will evaluate to +				 *        a constant of the appropriate value and will never evaluate to \ref USB_MODE_None even when the +				 *        USB interface is not initialized. +				 */ +				extern volatile uint8_t USB_CurrentMode; +			#elif defined(USB_CAN_BE_HOST) +				#define USB_CurrentMode USB_MODE_Host +			#elif defined(USB_CAN_BE_DEVICE) +				#define USB_CurrentMode USB_MODE_Device +			#endif + +			#if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__) +				/** Indicates the current USB options that the USB interface was initialized with when \ref USB_Init() +				 *  was called. This value will be one of the \c USB_MODE_* masks defined elsewhere in this module. +				 * +				 *  \attention This variable should be treated as read-only in the user application, and never manually +				 *             changed in value. +				 */ +				extern volatile uint8_t USB_Options; +			#elif defined(USE_STATIC_OPTIONS) +				#define USB_Options USE_STATIC_OPTIONS +			#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_USB_CONTROLLER_C) +				#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_PLL_On(void) ATTR_ALWAYS_INLINE; +			static inline void USB_PLL_On(void) +			{ +				PLLCSR = USB_PLL_PSC; +				PLLCSR = (USB_PLL_PSC | (1 << PLLE)); +			} + +			static inline void USB_PLL_Off(void) ATTR_ALWAYS_INLINE; +			static inline void USB_PLL_Off(void) +			{ +				PLLCSR = 0; +			} + +			static inline bool USB_PLL_IsReady(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool USB_PLL_IsReady(void) +			{ +				return ((PLLCSR & (1 << PLOCK)) ? true : false); +			} + +			static inline void USB_REG_On(void) ATTR_ALWAYS_INLINE; +			static inline void USB_REG_On(void) +			{ +			#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) +				UHWCON |=  (1 << UVREGE); +			#else +				REGCR  &= ~(1 << REGDIS); +			#endif +			} + +			static inline void USB_REG_Off(void) ATTR_ALWAYS_INLINE; +			static inline void USB_REG_Off(void) +			{ +			#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) +				UHWCON &= ~(1 << UVREGE); +			#else +				REGCR  |=  (1 << REGDIS); +			#endif +			} + +			#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) +			static inline void USB_OTGPAD_On(void) ATTR_ALWAYS_INLINE; +			static inline void USB_OTGPAD_On(void) +			{ +				USBCON |=  (1 << OTGPADE); +			} + +			static inline void USB_OTGPAD_Off(void) ATTR_ALWAYS_INLINE; +			static inline void USB_OTGPAD_Off(void) +			{ +				USBCON &= ~(1 << OTGPADE); +			} +			#endif + +			static inline void USB_CLK_Freeze(void) ATTR_ALWAYS_INLINE; +			static inline void USB_CLK_Freeze(void) +			{ +				USBCON |=  (1 << FRZCLK); +			} + +			static inline void USB_CLK_Unfreeze(void) ATTR_ALWAYS_INLINE; +			static inline void USB_CLK_Unfreeze(void) +			{ +				USBCON &= ~(1 << FRZCLK); +			} + +			static inline void USB_Controller_Enable(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Controller_Enable(void) +			{ +				USBCON |=  (1 << USBE); +			} + +			static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Controller_Disable(void) +			{ +				USBCON &= ~(1 << USBE); +			} + +			static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Controller_Reset(void) +			{ +				USBCON &= ~(1 << USBE); +				USBCON |=  (1 << USBE); +			} + +			#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 (USBSTA & (1 << 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/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c new file mode 100644 index 0000000000..fac4fb41ad --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c @@ -0,0 +1,279 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_AVR8) + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../USBInterrupt.h" + +void USB_INT_DisableAllInterrupts(void) +{ +	#if defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) +	USBCON &= ~((1 << VBUSTE) | (1 << IDTE)); +	#elif defined(USB_SERIES_4_AVR) +	USBCON &= ~(1 << VBUSTE); +	#endif + +	#if defined(USB_CAN_BE_BOTH) +	OTGIEN  = 0; +	#endif + +	#if defined(USB_CAN_BE_HOST) +	UHIEN   = 0; +	#endif + +	#if defined(USB_CAN_BE_DEVICE) +	UDIEN   = 0; +	#endif +} + +void USB_INT_ClearAllInterrupts(void) +{ +	#if defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) +	USBINT = 0; +	#endif + +	#if defined(USB_CAN_BE_BOTH) +	OTGINT = 0; +	#endif + +	#if defined(USB_CAN_BE_HOST) +	UHINT  = 0; +	#endif + +	#if defined(USB_CAN_BE_DEVICE) +	UDINT  = 0; +	#endif +} + +ISR(USB_GEN_vect, ISR_BLOCK) +{ +	#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 defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) +	if (USB_INT_HasOccurred(USB_INT_VBUSTI) && USB_INT_IsEnabled(USB_INT_VBUSTI)) +	{ +		USB_INT_Clear(USB_INT_VBUSTI); + +		if (USB_VBUS_GetStatus()) +		{ +			if (!(USB_Options & USB_OPT_MANUAL_PLL)) +			{ +				USB_PLL_On(); +				while (!(USB_PLL_IsReady())); +			} + +			USB_DeviceState = DEVICE_STATE_Powered; +			EVENT_USB_Device_Connect(); +		} +		else +		{ +			if (!(USB_Options & USB_OPT_MANUAL_PLL)) +			  USB_PLL_Off(); + +			USB_DeviceState = DEVICE_STATE_Unattached; +			EVENT_USB_Device_Disconnect(); +		} +	} +	#endif + +	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(); + +		if (!(USB_Options & USB_OPT_MANUAL_PLL)) +		  USB_PLL_Off(); + +		#if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT) +		USB_DeviceState = DEVICE_STATE_Unattached; +		EVENT_USB_Device_Disconnect(); +		#else +		USB_DeviceState = DEVICE_STATE_Suspended; +		EVENT_USB_Device_Suspend(); +		#endif +	} + +	if (USB_INT_HasOccurred(USB_INT_WAKEUPI) && USB_INT_IsEnabled(USB_INT_WAKEUPI)) +	{ +		if (!(USB_Options & USB_OPT_MANUAL_PLL)) +		{ +			USB_PLL_On(); +			while (!(USB_PLL_IsReady())); +		} + +		USB_CLK_Unfreeze(); + +		USB_INT_Clear(USB_INT_WAKEUPI); + +		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_Addressed : DEVICE_STATE_Powered; + +		#if defined(USB_SERIES_2_AVR) && !defined(NO_LIMITED_CONTROLLER_CONNECT) +		EVENT_USB_Device_Connect(); +		#else +		EVENT_USB_Device_WakeUp(); +		#endif +	} + +	if (USB_INT_HasOccurred(USB_INT_EORSTI) && USB_INT_IsEnabled(USB_INT_EORSTI)) +	{ +		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); + +		Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL, +		                           USB_Device_ControlEndpointSize, 1); + +		#if defined(INTERRUPT_CONTROL_ENDPOINT) +		USB_INT_Enable(USB_INT_RXSTPI); +		#endif + +		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_SRPI) && USB_INT_IsEnabled(USB_INT_SRPI)) +	{ +		USB_INT_Clear(USB_INT_SRPI); +		USB_INT_Disable(USB_INT_SRPI); + +		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 +} + +#if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE) +ISR(USB_COM_vect, ISR_BLOCK) +{ +	uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint(); + +	Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); +	USB_INT_Disable(USB_INT_RXSTPI); + +	GlobalInterruptEnable(); + +	USB_Device_ProcessControlRequest(); + +	Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); +	USB_INT_Enable(USB_INT_RXSTPI); +	Endpoint_SelectEndpoint(PrevSelectedEndpoint); +} +#endif + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h new file mode 100644 index 0000000000..1eeb019f20 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h @@ -0,0 +1,375 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Controller Interrupt definitions for the AVR8 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_AVR8_H__ +#define __USBINTERRUPT_AVR8_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 +			{ +				#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR) || defined(__DOXYGEN__)) +				USB_INT_VBUSTI  = 0, +				#endif +				#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, +				USB_INT_RXSTPI  = 6, +				#endif +				#if (defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)) +				USB_INT_HSOFI   = 7, +				USB_INT_DCONNI  = 8, +				USB_INT_DDISCI  = 9, +				USB_INT_RSTI    = 10, +				USB_INT_BCERRI  = 11, +				USB_INT_VBERRI  = 12, +				USB_INT_SRPI    = 13, +				#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) +				{ +					#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) +					case USB_INT_VBUSTI: +						USBCON |= (1 << VBUSTE); +						break; +					#endif +					#if defined(USB_CAN_BE_BOTH) +					case USB_INT_IDTI: +						USBCON |= (1 << IDTE); +						break; +					#endif +					#if defined(USB_CAN_BE_DEVICE) +					case USB_INT_WAKEUPI: +						UDIEN  |= (1 << WAKEUPE); +						break; +					case USB_INT_SUSPI: +						UDIEN  |= (1 << SUSPE); +						break; +					case USB_INT_EORSTI: +						UDIEN  |= (1 << EORSTE); +						break; +					case USB_INT_SOFI: +						UDIEN  |= (1 << SOFE); +						break; +					case USB_INT_RXSTPI: +						UEIENX |= (1 << RXSTPE); +						break; +					#endif +					#if defined(USB_CAN_BE_HOST) +					case USB_INT_HSOFI: +						UHIEN  |= (1 << HSOFE); +						break; +					case USB_INT_DCONNI: +						UHIEN  |= (1 << DCONNE); +						break; +					case USB_INT_DDISCI: +						UHIEN  |= (1 << DDISCE); +						break; +					case USB_INT_RSTI: +						UHIEN  |= (1 << RSTE); +						break; +					case USB_INT_BCERRI: +						OTGIEN |= (1 << BCERRE); +						break; +					case USB_INT_VBERRI: +						OTGIEN |= (1 << VBERRE); +						break; +					case USB_INT_SRPI: +						OTGIEN |= (1 << SRPE); +						break; +					#endif +					default: +						break; +				} +			} + +			static inline void USB_INT_Disable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE; +			static inline void USB_INT_Disable(const uint8_t Interrupt) +			{ +				switch (Interrupt) +				{ +					#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) +					case USB_INT_VBUSTI: +						USBCON &= ~(1 << VBUSTE); +						break; +					#endif +					#if defined(USB_CAN_BE_BOTH) +					case USB_INT_IDTI: +						USBCON &= ~(1 << IDTE); +						break; +					#endif +					#if defined(USB_CAN_BE_DEVICE) +					case USB_INT_WAKEUPI: +						UDIEN  &= ~(1 << WAKEUPE); +						break; +					case USB_INT_SUSPI: +						UDIEN  &= ~(1 << SUSPE); +						break; +					case USB_INT_EORSTI: +						UDIEN  &= ~(1 << EORSTE); +						break; +					case USB_INT_SOFI: +						UDIEN  &= ~(1 << SOFE); +						break; +					case USB_INT_RXSTPI: +						UEIENX &= ~(1 << RXSTPE); +						break; +					#endif +					#if defined(USB_CAN_BE_HOST) +					case USB_INT_HSOFI: +						UHIEN  &= ~(1 << HSOFE); +						break; +					case USB_INT_DCONNI: +						UHIEN  &= ~(1 << DCONNE); +						break; +					case USB_INT_DDISCI: +						UHIEN  &= ~(1 << DDISCE); +						break; +					case USB_INT_RSTI: +						UHIEN  &= ~(1 << RSTE); +						break; +					case USB_INT_BCERRI: +						OTGIEN &= ~(1 << BCERRE); +						break; +					case USB_INT_VBERRI: +						OTGIEN &= ~(1 << VBERRE); +						break; +					case USB_INT_SRPI: +						OTGIEN &= ~(1 << SRPE); +						break; +					#endif +					default: +						break; +				} +			} + +			static inline void USB_INT_Clear(const uint8_t Interrupt) ATTR_ALWAYS_INLINE; +			static inline void USB_INT_Clear(const uint8_t Interrupt) +			{ +				switch (Interrupt) +				{ +					#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) +					case USB_INT_VBUSTI: +						USBINT &= ~(1 << VBUSTI); +						break; +					#endif +					#if defined(USB_CAN_BE_BOTH) +					case USB_INT_IDTI: +						USBINT &= ~(1 << IDTI); +						break; +					#endif +					#if defined(USB_CAN_BE_DEVICE) +					case USB_INT_WAKEUPI: +						UDINT  &= ~(1 << WAKEUPI); +						break; +					case USB_INT_SUSPI: +						UDINT  &= ~(1 << SUSPI); +						break; +					case USB_INT_EORSTI: +						UDINT  &= ~(1 << EORSTI); +						break; +					case USB_INT_SOFI: +						UDINT  &= ~(1 << SOFI); +						break; +					case USB_INT_RXSTPI: +						UEINTX &= ~(1 << RXSTPI); +						break; +					#endif +					#if defined(USB_CAN_BE_HOST) +					case USB_INT_HSOFI: +						UHINT  &= ~(1 << HSOFI); +						break; +					case USB_INT_DCONNI: +						UHINT  &= ~(1 << DCONNI); +						break; +					case USB_INT_DDISCI: +						UHINT  &= ~(1 << DDISCI); +						break; +					case USB_INT_RSTI: +						UHINT  &= ~(1 << RSTI); +						break; +					case USB_INT_BCERRI: +						OTGINT &= ~(1 << BCERRI); +						break; +					case USB_INT_VBERRI: +						OTGINT &= ~(1 << VBERRI); +						break; +					case USB_INT_SRPI: +						OTGINT &= ~(1 << SRPI); +						break; +					#endif +					default: +						break; +				} +			} + +			static inline bool USB_INT_IsEnabled(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline bool USB_INT_IsEnabled(const uint8_t Interrupt) +			{ +				switch (Interrupt) +				{ +					#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) +					case USB_INT_VBUSTI: +						return (USBCON & (1 << VBUSTE)); +					#endif +					#if defined(USB_CAN_BE_BOTH) +					case USB_INT_IDTI: +						return (USBCON & (1 << IDTE)); +					#endif +					#if defined(USB_CAN_BE_DEVICE) +					case USB_INT_WAKEUPI: +						return (UDIEN  & (1 << WAKEUPE)); +					case USB_INT_SUSPI: +						return (UDIEN  & (1 << SUSPE)); +					case USB_INT_EORSTI: +						return (UDIEN  & (1 << EORSTE)); +					case USB_INT_SOFI: +						return (UDIEN  & (1 << SOFE)); +					case USB_INT_RXSTPI: +						return (UEIENX & (1 << RXSTPE)); +					#endif +					#if defined(USB_CAN_BE_HOST) +					case USB_INT_HSOFI: +						return (UHIEN  & (1 << HSOFE)); +					case USB_INT_DCONNI: +						return (UHIEN  & (1 << DCONNE)); +					case USB_INT_DDISCI: +						return (UHIEN  & (1 << DDISCE)); +					case USB_INT_RSTI: +						return (UHIEN  & (1 << RSTE)); +					case USB_INT_BCERRI: +						return (OTGIEN & (1 << BCERRE)); +					case USB_INT_VBERRI: +						return (OTGIEN & (1 << VBERRE)); +					case USB_INT_SRPI: +						return (OTGIEN & (1 << SRPE)); +					#endif +					default: +						return false; +				} +			} + +			static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) +			{ +				switch (Interrupt) +				{ +					#if (defined(USB_SERIES_4_AVR) || defined(USB_SERIES_6_AVR) || defined(USB_SERIES_7_AVR)) +					case USB_INT_VBUSTI: +						return (USBINT & (1 << VBUSTI)); +					#endif +					#if defined(USB_CAN_BE_BOTH) +					case USB_INT_IDTI: +						return (USBINT & (1 << IDTI)); +					#endif +					#if defined(USB_CAN_BE_DEVICE) +					case USB_INT_WAKEUPI: +						return (UDINT  & (1 << WAKEUPI)); +					case USB_INT_SUSPI: +						return (UDINT  & (1 << SUSPI)); +					case USB_INT_EORSTI: +						return (UDINT  & (1 << EORSTI)); +					case USB_INT_SOFI: +						return (UDINT  & (1 << SOFI)); +					case USB_INT_RXSTPI: +						return (UEINTX & (1 << RXSTPI)); +					#endif +					#if defined(USB_CAN_BE_HOST) +					case USB_INT_HSOFI: +						return (UHINT  & (1 << HSOFI)); +					case USB_INT_DCONNI: +						return (UHINT  & (1 << DCONNI)); +					case USB_INT_DDISCI: +						return (UHINT  & (1 << DDISCI)); +					case USB_INT_RSTI: +						return (UHINT  & (1 << RSTI)); +					case USB_INT_BCERRI: +						return (OTGINT & (1 << BCERRI)); +					case USB_INT_VBERRI: +						return (OTGINT & (1 << VBERRI)); +					case USB_INT_SRPI: +						return (OTGINT & (1 << SRPI)); +					#endif +					default: +						return false; +				} +			} + +		/* Includes: */ +			#include "../USBMode.h" +			#include "../Events.h" +			#include "../USBController.h" + +		/* Function Prototypes: */ +			void USB_INT_ClearAllInterrupts(void); +			void USB_INT_DisableAllInterrupts(void); +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.c b/lib/lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.c new file mode 100644 index 0000000000..d540bcfb4f --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.c @@ -0,0 +1,146 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "ConfigDescriptors.h" + +#if defined(USB_CAN_BE_HOST) +uint8_t USB_Host_GetDeviceConfigDescriptor(const uint8_t ConfigNumber, +                                           uint16_t* const ConfigSizePtr, +                                           void* const BufferPtr, +                                           const uint16_t BufferSize) +{ +	uint8_t ErrorCode; +	uint8_t ConfigHeader[sizeof(USB_Descriptor_Configuration_Header_t)]; + +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE), +			.bRequest      = REQ_GetDescriptor, +			.wValue        = ((DTYPE_Configuration << 8) | (ConfigNumber - 1)), +			.wIndex        = 0, +			.wLength       = sizeof(USB_Descriptor_Configuration_Header_t), +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	if ((ErrorCode = USB_Host_SendControlRequest(ConfigHeader)) != HOST_SENDCONTROL_Successful) +	  return ErrorCode; + +	*ConfigSizePtr = le16_to_cpu(DESCRIPTOR_PCAST(ConfigHeader, USB_Descriptor_Configuration_Header_t)->TotalConfigurationSize); + +	if (*ConfigSizePtr > BufferSize) +	  return HOST_GETCONFIG_BuffOverflow; + +	USB_ControlRequest.wLength = *ConfigSizePtr; + +	if ((ErrorCode = USB_Host_SendControlRequest(BufferPtr)) != HOST_SENDCONTROL_Successful) +	  return ErrorCode; + +	if (DESCRIPTOR_TYPE(BufferPtr) != DTYPE_Configuration) +	  return HOST_GETCONFIG_InvalidData; + +	return HOST_GETCONFIG_Successful; +} +#endif + +void USB_GetNextDescriptorOfType(uint16_t* const BytesRem, +                                 void** const CurrConfigLoc, +                                 const uint8_t Type) +{ +	while (*BytesRem) +	{ +		USB_GetNextDescriptor(BytesRem, CurrConfigLoc); + +		if (DESCRIPTOR_TYPE(*CurrConfigLoc) == Type) +		  return; +	} +} + +void USB_GetNextDescriptorOfTypeBefore(uint16_t* const BytesRem, +                                       void** const CurrConfigLoc, +                                       const uint8_t Type, +                                       const uint8_t BeforeType) +{ +	while (*BytesRem) +	{ +		USB_GetNextDescriptor(BytesRem, CurrConfigLoc); + +		if (DESCRIPTOR_TYPE(*CurrConfigLoc) == Type) +		{ +			return; +		} +		else if (DESCRIPTOR_TYPE(*CurrConfigLoc) == BeforeType) +		{ +			*BytesRem = 0; +			return; +		} +	} +} + +void USB_GetNextDescriptorOfTypeAfter(uint16_t* const BytesRem, +                                      void** const CurrConfigLoc, +                                      const uint8_t Type, +                                      const uint8_t AfterType) +{ +	USB_GetNextDescriptorOfType(BytesRem, CurrConfigLoc, AfterType); + +	if (*BytesRem) +	  USB_GetNextDescriptorOfType(BytesRem, CurrConfigLoc, Type); +} + +uint8_t USB_GetNextDescriptorComp(uint16_t* const BytesRem, +                                  void** const CurrConfigLoc, +                                  ConfigComparatorPtr_t const ComparatorRoutine) +{ +	uint8_t ErrorCode; + +	while (*BytesRem) +	{ +		uint8_t* PrevDescLoc  = *CurrConfigLoc; +		uint16_t PrevBytesRem = *BytesRem; + +		USB_GetNextDescriptor(BytesRem, CurrConfigLoc); + +		if ((ErrorCode = ComparatorRoutine(*CurrConfigLoc)) != DESCRIPTOR_SEARCH_NotFound) +		{ +			if (ErrorCode == DESCRIPTOR_SEARCH_Fail) +			{ +				*CurrConfigLoc = PrevDescLoc; +				*BytesRem      = PrevBytesRem; +			} + +			return ErrorCode; +		} +	} + +	return DESCRIPTOR_SEARCH_COMP_EndOfDescriptor; +} + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.h b/lib/lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.h new file mode 100644 index 0000000000..5355ecfe6d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/ConfigDescriptors.h @@ -0,0 +1,287 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Configuration Descriptor definitions. + *  \copydetails Group_ConfigDescriptorParser + * + *  \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_StdDescriptors + *  \defgroup Group_ConfigDescriptorParser Configuration Descriptor Parser + *  \brief USB Configuration Descriptor definitions. + * + *  This section of the library gives a friendly API which can be used in host applications to easily + *  parse an attached device's configuration descriptor so that endpoint, interface and other descriptor + *  data can be extracted and used as needed. + * + *  @{ + */ + +#ifndef __CONFIGDESCRIPTORS_H__ +#define __CONFIGDESCRIPTORS_H__ + +	/* Includes: */ +		#include "../../../Common/Common.h" +		#include "USBMode.h" +		#include "HostStandardReq.h" +		#include "StdDescriptors.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: */ +			/** Casts a pointer to a descriptor inside the configuration descriptor into a pointer to the given +			 *  descriptor type. +			 * +			 *  Usage Example: +			 *  \code +			 *  uint8_t* CurrDescriptor = &ConfigDescriptor[0]; // Pointing to the configuration header +			 *  USB_Descriptor_Configuration_Header_t* ConfigHeaderPtr = DESCRIPTOR_PCAST(CurrDescriptor, +			 *                                                           USB_Descriptor_Configuration_Header_t); +			 * +			 *  // Can now access elements of the configuration header struct using the -> indirection operator +			 *  \endcode +			 */ +			#define DESCRIPTOR_PCAST(DescriptorPtr, Type) ((Type*)(DescriptorPtr)) + +			/** Casts a pointer to a descriptor inside the configuration descriptor into the given descriptor +			 *  type (as an actual struct instance rather than a pointer to a struct). +			 * +			 *  Usage Example: +			 *  \code +			 *  uint8_t* CurrDescriptor = &ConfigDescriptor[0]; // Pointing to the configuration header +			 *  USB_Descriptor_Configuration_Header_t ConfigHeader = DESCRIPTOR_CAST(CurrDescriptor, +			 *                                                       USB_Descriptor_Configuration_Header_t); +			 * +			 *  // Can now access elements of the configuration header struct using the . operator +			 *  \endcode +			 */ +			#define DESCRIPTOR_CAST(DescriptorPtr, Type)  (*DESCRIPTOR_PCAST(DescriptorPtr, Type)) + +			/** Returns the descriptor's type, expressed as the 8-bit type value in the header of the descriptor. +			 *  This value's meaning depends on the descriptor's placement in the descriptor, but standard type +			 *  values can be accessed in the \ref USB_DescriptorTypes_t enum. +			 */ +			#define DESCRIPTOR_TYPE(DescriptorPtr)    DESCRIPTOR_PCAST(DescriptorPtr, USB_Descriptor_Header_t)->Type + +			/** Returns the descriptor's size, expressed as the 8-bit value indicating the number of bytes. */ +			#define DESCRIPTOR_SIZE(DescriptorPtr)    DESCRIPTOR_PCAST(DescriptorPtr, USB_Descriptor_Header_t)->Size + +		/* Type Defines: */ +			/** Type define for a Configuration Descriptor comparator function (function taking a pointer to an array +			 *  of type void, returning a uint8_t value). +			 * +			 *  \see \ref USB_GetNextDescriptorComp function for more details. +			 */ +			typedef uint8_t (* ConfigComparatorPtr_t)(void*); + +		/* Enums: */ +			/** Enum for the possible return codes of the \ref USB_Host_GetDeviceConfigDescriptor() function. */ +			enum USB_Host_GetConfigDescriptor_ErrorCodes_t +			{ +				HOST_GETCONFIG_Successful       = 0, /**< No error occurred while retrieving the configuration descriptor. */ +				HOST_GETCONFIG_DeviceDisconnect = 1, /**< The attached device was disconnected while retrieving the configuration +				                                      *   descriptor. +				                                      */ +				HOST_GETCONFIG_PipeError        = 2, /**< An error occurred in the pipe while sending the request. */ +				HOST_GETCONFIG_SetupStalled     = 3, /**< The attached device stalled the request to retrieve the configuration +				                                      *   descriptor. +				                                      */ +				HOST_GETCONFIG_SoftwareTimeOut  = 4, /**< The request or data transfer timed out. */ +				HOST_GETCONFIG_BuffOverflow     = 5, /**< The device's configuration descriptor is too large to fit into the allocated +				                                      *   buffer. +				                                      */ +				HOST_GETCONFIG_InvalidData      = 6, /**< The device returned invalid configuration descriptor data. */ +			}; + +			/** Enum for return values of a descriptor comparator function. */ +			enum DSearch_Return_ErrorCodes_t +			{ +				DESCRIPTOR_SEARCH_Found                = 0, /**< Current descriptor matches comparator criteria. */ +				DESCRIPTOR_SEARCH_Fail                 = 1, /**< No further descriptor could possibly match criteria, fail the search. */ +				DESCRIPTOR_SEARCH_NotFound             = 2, /**< Current descriptor does not match comparator criteria. */ +			}; + +			/** Enum for return values of \ref USB_GetNextDescriptorComp(). */ +			enum DSearch_Comp_Return_ErrorCodes_t +			{ +				DESCRIPTOR_SEARCH_COMP_Found           = 0, /**< Configuration descriptor now points to descriptor which matches +				                                             *   search criteria of the given comparator function. */ +				DESCRIPTOR_SEARCH_COMP_Fail            = 1, /**< Comparator function returned \ref DESCRIPTOR_SEARCH_Fail. */ +				DESCRIPTOR_SEARCH_COMP_EndOfDescriptor = 2, /**< End of configuration descriptor reached before match found. */ +			}; + +		/* Function Prototypes: */ +			/** Retrieves the configuration descriptor data from an attached device via a standard request into a buffer, +			 *  including validity and size checking to prevent a buffer overflow. +			 * +			 *  \param[in]     ConfigNumber   Device configuration descriptor number to fetch from the device (usually set to 1 for +			 *                                single configuration devices). +			 *  \param[in,out] ConfigSizePtr  Pointer to a location for storing the retrieved configuration descriptor size. +			 *  \param[out]    BufferPtr      Pointer to the buffer for storing the configuration descriptor data. +			 *  \param[out]    BufferSize     Size of the allocated buffer where the configuration descriptor is to be stored. +			 * +			 *  \return A value from the \ref USB_Host_GetConfigDescriptor_ErrorCodes_t enum. +			 */ +			uint8_t USB_Host_GetDeviceConfigDescriptor(const uint8_t ConfigNumber, +			                                           uint16_t* const ConfigSizePtr, +			                                           void* const BufferPtr, +			                                           const uint16_t BufferSize) ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(3); + +			/** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value. +			 *  The bytes remaining value is automatically decremented. +			 * +			 * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor. +			 * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor. +			 * \param[in]     Type           Descriptor type value to search for. +			 */ +			void USB_GetNextDescriptorOfType(uint16_t* const BytesRem, +			                                 void** const CurrConfigLoc, +			                                 const uint8_t Type) +			                                 ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value, +			 *  which must come before a descriptor of the second given type value. If the BeforeType type +			 *  descriptor is reached first, the number of bytes remaining to process is set to zero and the +			 *  function exits. The bytes remaining value is automatically decremented. +			 * +			 * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor. +			 * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor. +			 * \param[in]     Type           Descriptor type value to search for. +			 * \param[in]     BeforeType     Descriptor type value which must not be reached before the given Type descriptor. +			 */ +			void USB_GetNextDescriptorOfTypeBefore(uint16_t* const BytesRem, +			                                       void** const CurrConfigLoc, +			                                       const uint8_t Type, +			                                       const uint8_t BeforeType) +			                                       ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Skips to the next sub-descriptor inside the configuration descriptor of the specified type value, +			 *  which must come after a descriptor of the second given type value. The bytes remaining value is +			 *  automatically decremented. +			 * +			 * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor. +			 * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor. +			 * \param[in]     Type           Descriptor type value to search for. +			 * \param[in]     AfterType      Descriptor type value which must be reached before the given Type descriptor. +			 */ +			void USB_GetNextDescriptorOfTypeAfter(uint16_t* const BytesRem, +			                                      void** const CurrConfigLoc, +			                                      const uint8_t Type, +			                                      const uint8_t AfterType) +			                                      ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); + +			/** Searches for the next descriptor in the given configuration descriptor using a pre-made comparator +			 *  function. The routine updates the position and remaining configuration descriptor bytes values +			 *  automatically. If a comparator routine fails a search, the descriptor pointer is retreated back +			 *  so that the next descriptor search invocation will start from the descriptor which first caused the +			 *  original search to fail. This behavior allows for one comparator to be used immediately after another +			 *  has failed, starting the second search from the descriptor which failed the first. +			 * +			 *  Comparator functions should be standard functions which accept a pointer to the header of the current +			 *  descriptor inside the configuration descriptor which is being compared, and should return a value from +			 *  the \ref DSearch_Return_ErrorCodes_t enum as a uint8_t value. +			 * +			 *  \note This function is available in USB Host mode only. +			 * +			 *  \param[in,out] BytesRem           Pointer to an int storing the remaining bytes in the configuration descriptor. +			 *  \param[in,out] CurrConfigLoc      Pointer to the current position in the configuration descriptor. +			 *  \param[in]     ComparatorRoutine  Name of the comparator search function to use on the configuration descriptor. +			 * +			 *  \return Value of one of the members of the \ref DSearch_Comp_Return_ErrorCodes_t enum. +			 * +			 *  Usage Example: +			 *  \code +			 *  uint8_t EndpointSearcher(void* CurrentDescriptor); // Comparator Prototype +			 * +			 *  uint8_t EndpointSearcher(void* CurrentDescriptor) +			 *  { +			 *     if (DESCRIPTOR_TYPE(CurrentDescriptor) == DTYPE_Endpoint) +			 *         return DESCRIPTOR_SEARCH_Found; +			 *     else +			 *         return DESCRIPTOR_SEARCH_NotFound; +			 *  } +			 * +			 *  //... +			 * +			 *  // After retrieving configuration descriptor: +			 *  if (USB_Host_GetNextDescriptorComp(&BytesRemaining, &CurrentConfigLoc, EndpointSearcher) == +			 *      Descriptor_Search_Comp_Found) +			 *  { +			 *      // Do something with the endpoint descriptor +			 *  } +			 *  \endcode +			 */ +			uint8_t USB_GetNextDescriptorComp(uint16_t* const BytesRem, +			                                  void** const CurrConfigLoc, +			                                  ConfigComparatorPtr_t const ComparatorRoutine) ATTR_NON_NULL_PTR_ARG(1) +			                                  ATTR_NON_NULL_PTR_ARG(2) ATTR_NON_NULL_PTR_ARG(3); + +		/* Inline Functions: */ +			/** Skips over the current sub-descriptor inside the configuration descriptor, so that the pointer then +			    points to the next sub-descriptor. The bytes remaining value is automatically decremented. +			 * +			 * \param[in,out] BytesRem       Pointer to the number of bytes remaining of the configuration descriptor. +			 * \param[in,out] CurrConfigLoc  Pointer to the current descriptor inside the configuration descriptor. +			 */ +			static inline void USB_GetNextDescriptor(uint16_t* const BytesRem, +			                                         void** CurrConfigLoc) ATTR_NON_NULL_PTR_ARG(1) ATTR_NON_NULL_PTR_ARG(2); +			static inline void USB_GetNextDescriptor(uint16_t* const BytesRem, +			                                         void** CurrConfigLoc) +			{ +				uint16_t CurrDescriptorSize = DESCRIPTOR_CAST(*CurrConfigLoc, USB_Descriptor_Header_t).Size; + +				if (*BytesRem < CurrDescriptorSize) +				  CurrDescriptorSize = *BytesRem; + +				*CurrConfigLoc  = (void*)((uintptr_t)*CurrConfigLoc + CurrDescriptorSize); +				*BytesRem      -= CurrDescriptorSize; +			} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/Device.h b/lib/lufa/LUFA/Drivers/USB/Core/Device.h new file mode 100644 index 0000000000..81b0e17028 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/Device.h @@ -0,0 +1,159 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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] DescriptorMemorySpace  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 uint16_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* const DescriptorMemorySpace +			#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/lib/lufa/LUFA/Drivers/USB/Core/DeviceStandardReq.c b/lib/lufa/LUFA/Drivers/USB/Core/DeviceStandardReq.c new file mode 100644 index 0000000000..feb092dbf7 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/DeviceStandardReq.c @@ -0,0 +1,393 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "USBMode.h" + +#if defined(USB_CAN_BE_DEVICE) + +#define  __INCLUDE_FROM_DEVICESTDREQ_C +#include "DeviceStandardReq.h" + +uint8_t USB_Device_ConfigurationNumber; + +#if !defined(NO_DEVICE_SELF_POWER) +bool    USB_Device_CurrentlySelfPowered; +#endif + +#if !defined(NO_DEVICE_REMOTE_WAKEUP) +bool    USB_Device_RemoteWakeupEnabled; +#endif + +void USB_Device_ProcessControlRequest(void) +{ +	#if defined(ARCH_BIG_ENDIAN) +	USB_ControlRequest.bmRequestType = Endpoint_Read_8(); +	USB_ControlRequest.bRequest      = Endpoint_Read_8(); +	USB_ControlRequest.wValue        = Endpoint_Read_16_LE(); +	USB_ControlRequest.wIndex        = Endpoint_Read_16_LE(); +	USB_ControlRequest.wLength       = Endpoint_Read_16_LE(); +	#else +	uint8_t* RequestHeader = (uint8_t*)&USB_ControlRequest; + +	for (uint8_t RequestHeaderByte = 0; RequestHeaderByte < sizeof(USB_Request_Header_t); RequestHeaderByte++) +	  *(RequestHeader++) = Endpoint_Read_8(); +	#endif + +	EVENT_USB_Device_ControlRequest(); + +	if (Endpoint_IsSETUPReceived()) +	{ +		uint8_t bmRequestType = USB_ControlRequest.bmRequestType; + +		switch (USB_ControlRequest.bRequest) +		{ +			case REQ_GetStatus: +				if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || +					(bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT))) +				{ +					USB_Device_GetStatus(); +				} + +				break; +			case REQ_ClearFeature: +			case REQ_SetFeature: +				if ((bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) || +					(bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT))) +				{ +					USB_Device_ClearSetFeature(); +				} + +				break; +			case REQ_SetAddress: +				if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) +				  USB_Device_SetAddress(); + +				break; +			case REQ_GetDescriptor: +				if ((bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) || +					(bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE))) +				{ +					USB_Device_GetDescriptor(); +				} + +				break; +			case REQ_GetConfiguration: +				if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE)) +				  USB_Device_GetConfiguration(); + +				break; +			case REQ_SetConfiguration: +				if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE)) +				  USB_Device_SetConfiguration(); + +				break; + +			default: +				break; +		} +	} + +	if (Endpoint_IsSETUPReceived()) +	{ +		Endpoint_ClearSETUP(); +		Endpoint_StallTransaction(); +	} +} + +static void USB_Device_SetAddress(void) +{ +	uint8_t DeviceAddress = (USB_ControlRequest.wValue & 0x7F); + +	USB_Device_SetDeviceAddress(DeviceAddress); + +	Endpoint_ClearSETUP(); + +	Endpoint_ClearStatusStage(); + +	while (!(Endpoint_IsINReady())); + +	USB_Device_EnableDeviceAddress(DeviceAddress); + +	USB_DeviceState = (DeviceAddress) ? DEVICE_STATE_Addressed : DEVICE_STATE_Default; +} + +static void USB_Device_SetConfiguration(void) +{ +	#if defined(FIXED_NUM_CONFIGURATIONS) +	if ((uint8_t)USB_ControlRequest.wValue > FIXED_NUM_CONFIGURATIONS) +	  return; +	#else +	USB_Descriptor_Device_t* DevDescriptorPtr; + +	#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) +		#if defined(USE_FLASH_DESCRIPTORS) +			#define MemoryAddressSpace  MEMSPACE_FLASH +		#elif defined(USE_EEPROM_DESCRIPTORS) +			#define MemoryAddressSpace  MEMSPACE_EEPROM +		#elif defined(USE_RAM_DESCRIPTORS) +			#define MemoryAddressSpace  MEMSPACE_RAM +		#else +			uint8_t MemoryAddressSpace; +		#endif +	#endif + +	if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DevDescriptorPtr +	#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \ +	    !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS)) +	                               , &MemoryAddressSpace +	#endif +	                               ) == NO_DESCRIPTOR) +	{ +		return; +	} + +	#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) +	if (MemoryAddressSpace == MEMSPACE_FLASH) +	{ +		if (((uint8_t)USB_ControlRequest.wValue > pgm_read_byte(&DevDescriptorPtr->NumberOfConfigurations))) +		  return; +	} +	else if (MemoryAddressSpace == MEMSPACE_EEPROM) +	{ +		if (((uint8_t)USB_ControlRequest.wValue > eeprom_read_byte(&DevDescriptorPtr->NumberOfConfigurations))) +		  return; +	} +	else +	{ +		if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations) +		  return; +	} +	#else +	if ((uint8_t)USB_ControlRequest.wValue > DevDescriptorPtr->NumberOfConfigurations) +	  return; +	#endif +	#endif + +	Endpoint_ClearSETUP(); + +	USB_Device_ConfigurationNumber = (uint8_t)USB_ControlRequest.wValue; + +	Endpoint_ClearStatusStage(); + +	if (USB_Device_ConfigurationNumber) +	  USB_DeviceState = DEVICE_STATE_Configured; +	else +	  USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Configured : DEVICE_STATE_Powered; + +	EVENT_USB_Device_ConfigurationChanged(); +} + +static void USB_Device_GetConfiguration(void) +{ +	Endpoint_ClearSETUP(); + +	Endpoint_Write_8(USB_Device_ConfigurationNumber); +	Endpoint_ClearIN(); + +	Endpoint_ClearStatusStage(); +} + +#if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR) +static void USB_Device_GetInternalSerialDescriptor(void) +{ +	struct +	{ +		USB_Descriptor_Header_t Header; +		uint16_t                UnicodeString[INTERNAL_SERIAL_LENGTH_BITS / 4]; +	} SignatureDescriptor; + +	SignatureDescriptor.Header.Type = DTYPE_String; +	SignatureDescriptor.Header.Size = USB_STRING_LEN(INTERNAL_SERIAL_LENGTH_BITS / 4); + +	USB_Device_GetSerialString(SignatureDescriptor.UnicodeString); + +	Endpoint_ClearSETUP(); + +	Endpoint_Write_Control_Stream_LE(&SignatureDescriptor, sizeof(SignatureDescriptor)); +	Endpoint_ClearOUT(); +} +#endif + +static void USB_Device_GetDescriptor(void) +{ +	const void* DescriptorPointer; +	uint16_t    DescriptorSize; + +	#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \ +	    !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS)) +	uint8_t DescriptorAddressSpace; +	#endif + +	#if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR) +	if (USB_ControlRequest.wValue == ((DTYPE_String << 8) | USE_INTERNAL_SERIAL)) +	{ +		USB_Device_GetInternalSerialDescriptor(); +		return; +	} +	#endif + +	if ((DescriptorSize = CALLBACK_USB_GetDescriptor(USB_ControlRequest.wValue, USB_ControlRequest.wIndex, +	                                                 &DescriptorPointer +	#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \ +	    !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS)) +	                                                 , &DescriptorAddressSpace +	#endif +													 )) == NO_DESCRIPTOR) +	{ +		return; +	} + +	Endpoint_ClearSETUP(); + +	#if defined(USE_RAM_DESCRIPTORS) || !defined(ARCH_HAS_MULTI_ADDRESS_SPACE) +	Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize); +	#elif defined(USE_EEPROM_DESCRIPTORS) +	Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize); +	#elif defined(USE_FLASH_DESCRIPTORS) +	Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize); +	#else +	if (DescriptorAddressSpace == MEMSPACE_FLASH) +	  Endpoint_Write_Control_PStream_LE(DescriptorPointer, DescriptorSize); +	else if (DescriptorAddressSpace == MEMSPACE_EEPROM) +	  Endpoint_Write_Control_EStream_LE(DescriptorPointer, DescriptorSize); +	else +	  Endpoint_Write_Control_Stream_LE(DescriptorPointer, DescriptorSize); +	#endif + +	Endpoint_ClearOUT(); +} + +static void USB_Device_GetStatus(void) +{ +	uint8_t CurrentStatus = 0; + +	switch (USB_ControlRequest.bmRequestType) +	{ +		case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE): +		{ +			#if !defined(NO_DEVICE_SELF_POWER) +			if (USB_Device_CurrentlySelfPowered) +			  CurrentStatus |= FEATURE_SELFPOWERED_ENABLED; +			#endif + +			#if !defined(NO_DEVICE_REMOTE_WAKEUP) +			if (USB_Device_RemoteWakeupEnabled) +			  CurrentStatus |= FEATURE_REMOTE_WAKEUP_ENABLED; +			#endif +			break; +		} +		case (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_ENDPOINT): +		{ +			#if !defined(CONTROL_ONLY_DEVICE) +			uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); + +			if (EndpointIndex >= ENDPOINT_TOTAL_ENDPOINTS) +				return; + +			Endpoint_SelectEndpoint(EndpointIndex); + +			CurrentStatus = Endpoint_IsStalled(); + +			Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); +			#endif + +			break; +		} +		default: +			return; +	} + +	Endpoint_ClearSETUP(); + +	Endpoint_Write_16_LE(CurrentStatus); +	Endpoint_ClearIN(); + +	Endpoint_ClearStatusStage(); +} + +static void USB_Device_ClearSetFeature(void) +{ +	switch (USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_RECIPIENT) +	{ +		#if !defined(NO_DEVICE_REMOTE_WAKEUP) +		case REQREC_DEVICE: +		{ +			if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_DeviceRemoteWakeup) +			  USB_Device_RemoteWakeupEnabled = (USB_ControlRequest.bRequest == REQ_SetFeature); +			else +			  return; + +			break; +		} +		#endif +		#if !defined(CONTROL_ONLY_DEVICE) +		case REQREC_ENDPOINT: +		{ +			if ((uint8_t)USB_ControlRequest.wValue == FEATURE_SEL_EndpointHalt) +			{ +				uint8_t EndpointIndex = ((uint8_t)USB_ControlRequest.wIndex & ENDPOINT_EPNUM_MASK); + +				if (EndpointIndex == ENDPOINT_CONTROLEP || EndpointIndex >= ENDPOINT_TOTAL_ENDPOINTS) +				  return; + +				Endpoint_SelectEndpoint(EndpointIndex); + +				if (Endpoint_IsEnabled()) +				{ +					if (USB_ControlRequest.bRequest == REQ_SetFeature) +					{ +						Endpoint_StallTransaction(); +					} +					else +					{ +						Endpoint_ClearStall(); +						Endpoint_ResetEndpoint(EndpointIndex); +						Endpoint_ResetDataToggle(); +					} +				} +			} + +			break; +		} +		#endif +		default: +			return; +	} + +	Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + +	Endpoint_ClearSETUP(); + +	Endpoint_ClearStatusStage(); +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/DeviceStandardReq.h b/lib/lufa/LUFA/Drivers/USB/Core/DeviceStandardReq.h new file mode 100644 index 0000000000..14badcda1f --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/DeviceStandardReq.h @@ -0,0 +1,158 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB device standard request management. + * + *  This file contains the function prototypes necessary for the processing of incoming standard control requests + *  when the library is in USB device mode. + * + *  \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 __DEVICESTDREQ_H__ +#define __DEVICESTDREQ_H__ + +	/* Includes: */ +		#include "../../../Common/Common.h" +		#include "USBMode.h" +		#include "StdDescriptors.h" +		#include "Events.h" +		#include "StdRequestType.h" +		#include "USBTask.h" +		#include "USBController.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_USB_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Enums: */ +			#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) || defined(__DOXYGEN__) +				/** Enum for the possible descriptor memory spaces, for the \c MemoryAddressSpace parameter of the +				 *  \ref CALLBACK_USB_GetDescriptor() function. This can be used when none of the \c USE_*_DESCRIPTORS +				 *  compile time options are used, to indicate in which memory space the descriptor is stored. +				 * +				 *  \ingroup Group_Device +				 */ +				enum USB_DescriptorMemorySpaces_t +				{ +					#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE) || defined(__DOXYGEN__) +					MEMSPACE_FLASH    = 0, /**< Indicates the requested descriptor is located in FLASH memory. */ +					#endif +					#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE) || defined(__DOXYGEN__) +					MEMSPACE_EEPROM   = 1, /**< Indicates the requested descriptor is located in EEPROM memory. */ +					#endif +					MEMSPACE_RAM      = 2, /**< Indicates the requested descriptor is located in RAM memory. */ +				}; +			#endif + +		/* Global Variables: */ +			/** Indicates the currently set configuration number of the device. USB devices may have several +			 *  different configurations which the host can select between; this indicates the currently selected +			 *  value, or 0 if no configuration has been selected. +			 * +			 *  \attention This variable should be treated as read-only in the user application, and never manually +			 *             changed in value. +			 * +			 *  \ingroup Group_Device +			 */ +			extern uint8_t USB_Device_ConfigurationNumber; + +			#if !defined(NO_DEVICE_REMOTE_WAKEUP) +				/** Indicates if the host is currently allowing the device to issue remote wakeup events. If this +				 *  flag is cleared, the device should not issue remote wakeup events to the host. +				 * +				 *  \attention This variable should be treated as read-only in the user application, and never manually +				 *             changed in value. +				 * +				 *  \note To reduce FLASH usage of the compiled applications where Remote Wakeup is not supported, +				 *        this global and the underlying management code can be disabled by defining the +				 *        \c NO_DEVICE_REMOTE_WAKEUP token in the project makefile and passing it to the compiler via +				 *        the -D switch. +				 * +				 *  \ingroup Group_Device +				 */ +				extern bool USB_Device_RemoteWakeupEnabled; +			#endif + +			#if !defined(NO_DEVICE_SELF_POWER) +				/** Indicates if the device is currently being powered by its own power supply, rather than being +				 *  powered by the host's USB supply. This flag should remain cleared if the device does not +				 *  support self powered mode, as indicated in the device descriptors. +				 * +				 *  \ingroup Group_Device +				 */ +				extern bool USB_Device_CurrentlySelfPowered; +			#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		#if defined(USE_RAM_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS) +			#error USE_RAM_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive. +		#elif defined(USE_RAM_DESCRIPTORS) && defined(USE_FLASH_DESCRIPTORS) +			#error USE_RAM_DESCRIPTORS and USE_FLASH_DESCRIPTORS are mutually exclusive. +		#elif defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS) +			#error USE_FLASH_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive. +		#elif defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS) && defined(USE_RAM_DESCRIPTORS) +			#error Only one of the USE_*_DESCRIPTORS modes should be selected. +		#endif + +		/* Function Prototypes: */ +			void USB_Device_ProcessControlRequest(void); + +			#if defined(__INCLUDE_FROM_DEVICESTDREQ_C) +				static void USB_Device_SetAddress(void); +				static void USB_Device_SetConfiguration(void); +				static void USB_Device_GetConfiguration(void); +				static void USB_Device_GetDescriptor(void); +				static void USB_Device_GetStatus(void); +				static void USB_Device_ClearSetFeature(void); + +				#if !defined(NO_INTERNAL_SERIAL) && (USE_INTERNAL_SERIAL != NO_DESCRIPTOR) +					static void USB_Device_GetInternalSerialDescriptor(void); +				#endif +			#endif +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/Endpoint.h b/lib/lufa/LUFA/Drivers/USB/Core/Endpoint.h new file mode 100644 index 0000000000..b577f63476 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/Endpoint.h @@ -0,0 +1,130 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Endpoint definitions for 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: */ +		/* Type Defines: */ +			/** Type define for a endpoint table entry, used to configure endpoints in groups via +			 *  \ref Endpoint_ConfigureEndpointTable(). +			 */ +			typedef struct +			{ +				uint8_t  Address; /**< Address of the endpoint to configure, or zero if the table entry is to be unused. */ +				uint16_t Size; /**< Size of the endpoint bank, in bytes. */ +				uint8_t  Type; /**< Type of the endpoint, a \c EP_TYPE_* mask. */ +				uint8_t  Banks; /**< Number of hardware banks to use for the endpoint. */ +			} USB_Endpoint_Table_t; + +		/* Macros: */ +			/** Endpoint number mask, for masking against endpoint addresses to retrieve the endpoint's +			 *  numerical address in the device. +			 */ +			#define ENDPOINT_EPNUM_MASK                     0x0F + +			/** 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/lib/lufa/LUFA/Drivers/USB/Core/EndpointStream.h b/lib/lufa/LUFA/Drivers/USB/Core/EndpointStream.h new file mode 100644 index 0000000000..156d155b3d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/EndpointStream.h @@ -0,0 +1,124 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Endpoint data stream transmission and reception management. + *  \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/lib/lufa/LUFA/Drivers/USB/Core/Events.c b/lib/lufa/LUFA/Drivers/USB/Core/Events.c new file mode 100644 index 0000000000..186557956a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/Events.c @@ -0,0 +1,39 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_EVENTS_C +#define  __INCLUDE_FROM_USB_DRIVER +#include "Events.h" + +void USB_Event_Stub(void) +{ + +} + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/Events.h b/lib/lufa/LUFA/Drivers/USB/Core/Events.h new file mode 100644 index 0000000000..57fd0d9af7 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/Events.h @@ -0,0 +1,372 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Event management definitions. + *  \copydetails Group_Events + * + *  \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_Events USB Events + *  \brief USB Event management definitions. + * + *  This module contains macros and functions relating to the management of library events, which are small + *  pieces of code similar to ISRs which are run when a given condition is met. Each event can be fired from + *  multiple places in the user or library code, which may or may not be inside an ISR, thus each handler + *  should be written to be as small and fast as possible to prevent possible problems. + * + *  Events can be hooked by the user application by declaring a handler function with the same name and parameters + *  listed here. If an event with no user-associated handler is fired within the library, it by default maps to an + *  internal empty stub function. + * + *  Each event must only have one associated event handler, but can be raised by multiple sources by calling the + *  event handler function (with any required event parameters). + * + *  @{ + */ + +#ifndef __USBEVENTS_H__ +#define __USBEVENTS_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: */ +		/* Pseudo-Functions for Doxygen: */ +		#if !defined(__INCLUDE_FROM_EVENTS_C) || defined(__DOXYGEN__) +			/** Event for USB mode pin level change. This event fires when the USB interface is set to dual role +			 *  mode, and the UID pin level has changed to indicate a new mode (device or host). This event fires +			 *  before the mode is switched to the newly indicated mode but after the \ref EVENT_USB_Device_Disconnect +			 *  event has fired (if disconnected before the role change). +			 * +			 *  \note This event only exists on microcontrollers that support dual role USB modes. +			 *        \n\n +			 * +			 *  \note This event does not exist if the \c USB_DEVICE_ONLY or \c USB_HOST_ONLY tokens have been supplied +			 *        to the compiler (see \ref Group_USBManagement documentation). +			 */ +			void EVENT_USB_UIDChange(void); + +			/** Event for USB host error. This event fires when a hardware fault has occurred whilst the USB +			 *  interface is in host mode. +			 * +			 *  \param[in] ErrorCode  Error code indicating the failure reason, a value in \ref USB_Host_ErrorCodes_t. +			 * +			 *  \note This event only exists on microcontrollers that supports USB host mode. +			 *        \n\n +			 * +			 *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see +			 *        \ref Group_USBManagement documentation). +			 */ +			void EVENT_USB_Host_HostError(const uint8_t ErrorCode); + +			/** Event for USB device attachment. This event fires when a the USB interface is in host mode, and +			 *  a USB device has been connected to the USB interface. This is interrupt driven, thus fires before +			 *  the standard \ref EVENT_USB_Device_Connect() event and so can be used to programmatically start the USB +			 *  management task to reduce CPU consumption. +			 * +			 *  \note This event only exists on microcontrollers that supports USB host mode. +			 *        \n\n +			 * +			 *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see +			 *        \ref Group_USBManagement documentation). +			 * +			 *  \see \ref USB_USBTask() for more information on the USB management task and reducing CPU usage. +			 */ +			void EVENT_USB_Host_DeviceAttached(void); + +			/** Event for USB device removal. This event fires when a the USB interface is in host mode, and +			 *  a USB device has been removed the USB interface whether or not it has been enumerated. This +			 *  can be used to programmatically stop the USB management task to reduce CPU consumption. +			 * +			 *  \note This event only exists on microcontrollers that supports USB host mode. +			 *        \n\n +			 * +			 *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see +			 *        \ref Group_USBManagement documentation). +			 * +			 *  \see \ref USB_USBTask() for more information on the USB management task and reducing CPU usage. +			 */ +			void EVENT_USB_Host_DeviceUnattached(void); + +			/** Event for USB device enumeration failure. This event fires when a the USB interface is +			 *  in host mode, and an attached USB device has failed to enumerate completely. +			 * +			 *  \param[in] ErrorCode     Error code indicating the failure reason, a value in +			 *                           \ref USB_Host_EnumerationErrorCodes_t. +			 * +			 *  \param[in] SubErrorCode  Sub error code indicating the reason for failure - for example, if the +			 *                           ErrorCode parameter indicates a control error, this will give the error +			 *                           code returned by the \ref USB_Host_SendControlRequest() function. +			 * +			 *  \note This event only exists on microcontrollers that supports USB host mode. +			 *        \n\n +			 * +			 *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see +			 *        \ref Group_USBManagement documentation). +			 */ +			void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, +			                                            const uint8_t SubErrorCode); + +			/** Event for USB device enumeration completion. This event fires when a the USB interface is +			 *  in host mode and an attached USB device has been completely enumerated and is ready to be +			 *  controlled by the user application. +			 * +			 *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around +			 *  1 second) when a transaction is waiting to be processed by the device will prevent break communications +			 *  and cause the host to reset the USB bus. +			 * +			 *  \note This event only exists on microcontrollers that supports USB host mode. +			 *        \n\n +			 * +			 *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see +			 *        \ref Group_USBManagement documentation). +			 */ +			void EVENT_USB_Host_DeviceEnumerationComplete(void); + +			/** Event for USB Start Of Frame detection, when enabled. This event fires at the start of each USB +			 *  frame, once per millisecond, and is synchronized to the USB bus. This can be used as an accurate +			 *  millisecond timer source when the USB bus is not suspended while in host mode. +			 * +			 *  This event is time-critical; it is run once per millisecond and thus long handlers will significantly +			 *  degrade device performance. This event should only be enabled when needed to reduce device wake-ups. +			 * +			 *  \note This event is not normally active - it must be manually enabled and disabled via the +			 *        \ref USB_Host_EnableSOFEvents() and \ref USB_Host_DisableSOFEvents() commands after enumeration of +			 *        a USB device. +			 *        \n\n +			 * +			 *  \note This event does not exist if the \c USB_DEVICE_ONLY token is supplied to the compiler (see +			 *        \ref Group_USBManagement documentation). +			 */ +			void EVENT_USB_Host_StartOfFrame(void); + +			/** Event for USB device connection. This event fires when the microcontroller is in USB Device mode +			 *  and the device is connected to a USB host, beginning the enumeration process measured by a rising +			 *  level on the microcontroller's VBUS sense pin. +			 * +			 *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around +			 *  two seconds) will prevent the device from enumerating correctly. +			 * +			 *  \attention This event may fire multiple times during device enumeration on the microcontrollers with limited USB controllers +			 *             if \c NO_LIMITED_CONTROLLER_CONNECT is not defined. +			 * +			 *  \note For the microcontrollers with limited USB controller functionality, VBUS sensing is not available. +			 *        this means that the current connection state is derived from the bus suspension and wake up events by default, +			 *        which is not always accurate (host may suspend the bus while still connected). If the actual connection state +			 *        needs to be determined, VBUS should be routed to an external pin, and the auto-detect behavior turned off by +			 *        passing the \c NO_LIMITED_CONTROLLER_CONNECT token to the compiler via the -D switch at compile time. The connection +			 *        and disconnection events may be manually fired, and the \ref USB_DeviceState global changed manually. +			 *        \n\n +			 * +			 *  \see \ref Group_USBManagement for more information on the USB management task and reducing CPU usage. +			 */ +			void EVENT_USB_Device_Connect(void); + +			/** Event for USB device disconnection. This event fires when the microcontroller is in USB Device mode and the device is +			 *  disconnected from a host, measured by a falling level on the microcontroller's VBUS sense pin. +			 * +			 *  \attention This event may fire multiple times during device enumeration on the microcontrollers with limited USB controllers +			 *             if \c NO_LIMITED_CONTROLLER_CONNECT is not defined. +			 * +			 *  \note For the microcontrollers with limited USB controllers, VBUS sense is not available to the USB controller. +			 *        this means that the current connection state is derived from the bus suspension and wake up events by default, +			 *        which is not always accurate (host may suspend the bus while still connected). If the actual connection state +			 *        needs to be determined, VBUS should be routed to an external pin, and the auto-detect behavior turned off by +			 *        passing the \c NO_LIMITED_CONTROLLER_CONNECT token to the compiler via the -D switch at compile time. The connection +			 *        and disconnection events may be manually fired, and the \ref USB_DeviceState global changed manually. +			 *        \n\n +			 * +			 *  \see \ref Group_USBManagement for more information on the USB management task and reducing CPU usage. +			 */ +			void EVENT_USB_Device_Disconnect(void); + +			/** Event for control requests. This event fires when a the USB host issues a control request +			 *  to the mandatory device control endpoint (of address 0). This may either be a standard +			 *  request that the library may have a handler code for internally, or a class specific request +			 *  issued to the device which must be handled appropriately. If a request is not processed in the +			 *  user application via this event, it will be passed to the library for processing internally +			 *  if a suitable handler exists. +			 * +			 *  This event is time-critical; each packet within the request transaction must be acknowledged or +			 *  sent within 50ms or the host will abort the transfer. +			 * +			 *  The library internally handles all standard control requests with the exceptions of SYNC FRAME, +			 *  SET DESCRIPTOR and SET INTERFACE. These and all other non-standard control requests will be left +			 *  for the user to process via this event if desired. If not handled in the user application or by +			 *  the library internally, unknown requests are automatically STALLed. +			 * +			 *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see +			 *        \ref Group_USBManagement documentation). +			 *        \n\n +			 * +			 *  \note Requests should be handled in the same manner as described in the USB 2.0 Specification, +			 *        or appropriate class specification. In all instances, the library has already read the +			 *        request SETUP parameters into the \ref USB_ControlRequest structure which should then be used +			 *        by the application to determine how to handle the issued request. +			 */ +			void EVENT_USB_Device_ControlRequest(void); + +			/** Event for USB configuration number changed. This event fires when a the USB host changes the +			 *  selected configuration number while in device mode. This event should be hooked in device +			 *  applications to create the endpoints and configure the device for the selected configuration. +			 * +			 *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around +			 *  one second) will prevent the device from enumerating correctly. +			 * +			 *  This event fires after the value of \ref USB_Device_ConfigurationNumber has been changed. +			 * +			 *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see +			 *        \ref Group_USBManagement documentation). +			 */ +			void EVENT_USB_Device_ConfigurationChanged(void); + +			/** Event for USB suspend. This event fires when a the USB host suspends the device by halting its +			 *  transmission of Start Of Frame pulses to the device. This is generally hooked in order to move +			 *  the device over to a low power state until the host wakes up the device. If the USB interface is +			 *  enumerated with the \ref USB_OPT_AUTO_PLL option set, the library will automatically suspend the +			 *  USB PLL before the event is fired to save power. +			 * +			 *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see +			 *        \ref Group_USBManagement documentation). +			 *        \n\n +			 * +			 *  \note This event does not exist on the microcontrollers with limited USB VBUS sensing abilities +			 *        when the \c NO_LIMITED_CONTROLLER_CONNECT compile time token is not set - see +			 *        \ref EVENT_USB_Device_Disconnect. +			 * +			 *  \see \ref EVENT_USB_Device_WakeUp() event for accompanying Wake Up event. +			 */ +			void EVENT_USB_Device_Suspend(void); + +			/** Event for USB wake up. This event fires when a the USB interface is suspended while in device +			 *  mode, and the host wakes up the device by supplying Start Of Frame pulses. This is generally +			 *  hooked to pull the user application out of a low power state and back into normal operating +			 *  mode. If the USB interface is enumerated with the \ref USB_OPT_AUTO_PLL option set, the library +			 *  will automatically restart the USB PLL before the event is fired. +			 * +			 *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see +			 *        \ref Group_USBManagement documentation). +			 *        \n\n +			 * +			 *  \note This event does not exist on the microcontrollers with limited USB VBUS sensing abilities +			 *        when the \c NO_LIMITED_CONTROLLER_CONNECT compile time token is not set - see +			 *        \ref EVENT_USB_Device_Disconnect. +			 * +			 *  \see \ref EVENT_USB_Device_Suspend() event for accompanying Suspend event. +			 */ +			void EVENT_USB_Device_WakeUp(void); + +			/** Event for USB interface reset. This event fires when the USB interface is in device mode, and +			 *  a the USB host requests that the device reset its interface. This event fires after the control +			 *  endpoint has been automatically configured by the library. +			 * +			 *  This event is time-critical; exceeding OS-specific delays within this event handler (typically of around +			 *  two seconds) will prevent the device from enumerating correctly. +			 * +			 *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see +			 *        \ref Group_USBManagement documentation). +			 */ +			void EVENT_USB_Device_Reset(void); + +			/** Event for USB Start Of Frame detection, when enabled. This event fires at the start of each USB +			 *  frame, once per millisecond, and is synchronized to the USB bus. This can be used as an accurate +			 *  millisecond timer source when the USB bus is enumerated in device mode to a USB host. +			 * +			 *  This event is time-critical; it is run once per millisecond and thus long handlers will significantly +			 *  degrade device performance. This event should only be enabled when needed to reduce device wake-ups. +			 * +			 *  \pre This event is not normally active - it must be manually enabled and disabled via the +			 *       \ref USB_Device_EnableSOFEvents() and \ref USB_Device_DisableSOFEvents() commands after enumeration. +			 *       \n\n +			 * +			 *  \note This event does not exist if the \c USB_HOST_ONLY token is supplied to the compiler (see +			 *        \ref Group_USBManagement documentation). +			 */ +			void EVENT_USB_Device_StartOfFrame(void); +		#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_EVENTS_C) +				void USB_Event_Stub(void) ATTR_CONST; + +				#if defined(USB_CAN_BE_BOTH) +					void EVENT_USB_UIDChange(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); +				#endif + +				#if defined(USB_CAN_BE_HOST) +					void EVENT_USB_Host_HostError(const uint8_t ErrorCode) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); +					void EVENT_USB_Host_DeviceAttached(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); +					void EVENT_USB_Host_DeviceUnattached(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); +					void EVENT_USB_Host_DeviceEnumerationComplete(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); +					void EVENT_USB_Host_DeviceEnumerationFailed(const uint8_t ErrorCode, +                                                                const uint8_t SubErrorCode) +					                                            ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); +					void EVENT_USB_Host_StartOfFrame(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); +				#endif + +				#if defined(USB_CAN_BE_DEVICE) +					void EVENT_USB_Device_Connect(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); +					void EVENT_USB_Device_Disconnect(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); +					void EVENT_USB_Device_ControlRequest(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); +					void EVENT_USB_Device_ConfigurationChanged(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); +					void EVENT_USB_Device_Suspend(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); +					void EVENT_USB_Device_WakeUp(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); +					void EVENT_USB_Device_Reset(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); +					void EVENT_USB_Device_StartOfFrame(void) ATTR_WEAK ATTR_ALIAS(USB_Event_Stub); +				#endif +			#endif +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/Host.h b/lib/lufa/LUFA/Drivers/USB/Core/Host.h new file mode 100644 index 0000000000..50410b2be8 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/Host.h @@ -0,0 +1,139 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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/lib/lufa/LUFA/Drivers/USB/Core/HostStandardReq.c b/lib/lufa/LUFA/Drivers/USB/Core/HostStandardReq.c new file mode 100644 index 0000000000..42a934daa0 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/HostStandardReq.c @@ -0,0 +1,322 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "USBMode.h" + +#if defined(USB_CAN_BE_HOST) + +#define  __INCLUDE_FROM_HOSTSTDREQ_C +#include "HostStandardReq.h" + +uint8_t USB_Host_ConfigurationNumber; + +static uint8_t USB_Host_SendControlRequest_PRV(void* const BufferPtr) +{ +	uint8_t* DataStream   = (uint8_t*)BufferPtr; +	uint8_t  ReturnStatus = HOST_SENDCONTROL_Successful; +	uint16_t DataLen      = USB_ControlRequest.wLength; + +	USB_Host_ResumeBus(); + +	if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful) +	  return ReturnStatus; + +	Pipe_SetPipeToken(PIPE_TOKEN_SETUP); +	Pipe_ClearError(); + +	Pipe_Unfreeze(); + +	#if defined(ARCH_BIG_ENDIAN) +	Pipe_Write_8(USB_ControlRequest.bmRequestType); +	Pipe_Write_8(USB_ControlRequest.bRequest); +	Pipe_Write_16_LE(USB_ControlRequest.wValue); +	Pipe_Write_16_LE(USB_ControlRequest.wIndex); +	Pipe_Write_16_LE(USB_ControlRequest.wLength); +	#else +	uint8_t* HeaderStream = (uint8_t*)&USB_ControlRequest; + +	for (uint8_t HeaderByte = 0; HeaderByte < sizeof(USB_Request_Header_t); HeaderByte++) +	  Pipe_Write_8(*(HeaderStream++)); +	#endif + +	Pipe_ClearSETUP(); + +	if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_SetupSent)) != HOST_SENDCONTROL_Successful) +	  return ReturnStatus; + +	Pipe_Freeze(); + +	if ((ReturnStatus = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful) +	  return ReturnStatus; + +	if ((USB_ControlRequest.bmRequestType & CONTROL_REQTYPE_DIRECTION) == REQDIR_DEVICETOHOST) +	{ +		Pipe_SetPipeToken(PIPE_TOKEN_IN); + +		if (DataStream != NULL) +		{ +			while (DataLen) +			{ +				Pipe_Unfreeze(); + +				if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful) +				  return ReturnStatus; + +				if (!(Pipe_BytesInPipe())) +				  DataLen = 0; + +				while (Pipe_BytesInPipe() && DataLen) +				{ +					*(DataStream++) = Pipe_Read_8(); +					DataLen--; +				} + +				Pipe_Freeze(); +				Pipe_ClearIN(); +			} +		} + +		Pipe_SetPipeToken(PIPE_TOKEN_OUT); +		Pipe_Unfreeze(); + +		if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful) +		  return ReturnStatus; + +		Pipe_ClearOUT(); + +		if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful) +		  return ReturnStatus; +	} +	else +	{ +		if (DataStream != NULL) +		{ +			Pipe_SetPipeToken(PIPE_TOKEN_OUT); +			Pipe_Unfreeze(); + +			while (DataLen) +			{ +				if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful) +				  return ReturnStatus; + +				while (DataLen && (Pipe_BytesInPipe() < USB_Host_ControlPipeSize)) +				{ +					Pipe_Write_8(*(DataStream++)); +					DataLen--; +				} + +				Pipe_ClearOUT(); +			} + +			if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_OutReady)) != HOST_SENDCONTROL_Successful) +			  return ReturnStatus; + +			Pipe_Freeze(); +		} + +		Pipe_SetPipeToken(PIPE_TOKEN_IN); +		Pipe_Unfreeze(); + +		if ((ReturnStatus = USB_Host_WaitForIOS(USB_HOST_WAITFOR_InReceived)) != HOST_SENDCONTROL_Successful) +		  return ReturnStatus; + +		Pipe_ClearIN(); +	} + +	return ReturnStatus; +} + +static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType) +{ +	#if (USB_HOST_TIMEOUT_MS < 0xFF) +	uint8_t  TimeoutCounter = USB_HOST_TIMEOUT_MS; +	#else +	uint16_t TimeoutCounter = USB_HOST_TIMEOUT_MS; +	#endif + +	while (!(((WaitType == USB_HOST_WAITFOR_SetupSent)  && Pipe_IsSETUPSent())  || +	         ((WaitType == USB_HOST_WAITFOR_InReceived) && Pipe_IsINReceived()) || +	         ((WaitType == USB_HOST_WAITFOR_OutReady)   && Pipe_IsOUTReady()))) +	{ +		uint8_t ErrorCode; + +		if ((ErrorCode = USB_Host_WaitMS(1)) != HOST_WAITERROR_Successful) +		  return ErrorCode; + +		if (!(TimeoutCounter--)) +		  return HOST_SENDCONTROL_SoftwareTimeOut; +	} + +	return HOST_SENDCONTROL_Successful; +} + +uint8_t USB_Host_SendControlRequest(void* const BufferPtr) +{ +	bool BusSuspended    = USB_Host_IsBusSuspended(); +	uint8_t ReturnStatus = USB_Host_SendControlRequest_PRV(BufferPtr); + +	Pipe_Freeze(); + +	if (BusSuspended) +	  USB_Host_SuspendBus(); + +	Pipe_ResetPipe(PIPE_CONTROLPIPE); + +	return ReturnStatus; +} + +uint8_t USB_Host_SetDeviceConfiguration(const uint8_t ConfigNumber) +{ +	uint8_t ErrorCode; + +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_DEVICE), +			.bRequest      = REQ_SetConfiguration, +			.wValue        = ConfigNumber, +			.wIndex        = 0, +			.wLength       = 0, +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	if ((ErrorCode = USB_Host_SendControlRequest(NULL)) == HOST_SENDCONTROL_Successful) +	{ +		USB_Host_ConfigurationNumber = ConfigNumber; +		USB_HostState                = (ConfigNumber) ? HOST_STATE_Configured : HOST_STATE_Addressed; +	} + +	return ErrorCode; +} + +uint8_t USB_Host_GetDeviceConfiguration(uint8_t* const ConfigNumber) +{ +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE), +			.bRequest      = REQ_GetConfiguration, +			.wValue        = 0, +			.wIndex        = 0, +			.wLength       = sizeof(uint8_t), +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	return USB_Host_SendControlRequest(ConfigNumber); +} + +uint8_t USB_Host_GetDescriptor(const uint8_t Type, +                               const uint8_t Index, +                               void* const Buffer, +                               const uint8_t BufferLength) +{ +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE), +			.bRequest      = REQ_GetDescriptor, +			.wValue        = (((uint16_t)Type << 8) | Index), +			.wIndex        = 0, +			.wLength       = BufferLength, +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	return USB_Host_SendControlRequest(Buffer); +} + +uint8_t USB_Host_GetDeviceStatus(uint8_t* const FeatureStatus) +{ +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_DEVICE), +			.bRequest      = REQ_GetStatus, +			.wValue        = 0, +			.wIndex        = 0, +			.wLength       = 0, +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	return USB_Host_SendControlRequest(FeatureStatus); +} + +uint8_t USB_Host_ClearEndpointStall(const uint8_t EndpointAddress) +{ +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_ENDPOINT), +			.bRequest      = REQ_ClearFeature, +			.wValue        = FEATURE_SEL_EndpointHalt, +			.wIndex        = EndpointAddress, +			.wLength       = 0, +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	return USB_Host_SendControlRequest(NULL); +} + +uint8_t USB_Host_SetInterfaceAltSetting(const uint8_t InterfaceIndex, +                                        const uint8_t AltSetting) +{ +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_HOSTTODEVICE | REQTYPE_STANDARD | REQREC_INTERFACE), +			.bRequest      = REQ_SetInterface, +			.wValue        = AltSetting, +			.wIndex        = InterfaceIndex, +			.wLength       = 0, +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	return USB_Host_SendControlRequest(NULL); +} + +uint8_t USB_Host_GetInterfaceAltSetting(const uint8_t InterfaceIndex, +                                        uint8_t* const AltSetting) +{ +	USB_ControlRequest = (USB_Request_Header_t) +		{ +			.bmRequestType = (REQDIR_DEVICETOHOST | REQTYPE_STANDARD | REQREC_INTERFACE), +			.bRequest      = REQ_GetInterface, +			.wValue        = 0, +			.wIndex        = InterfaceIndex, +			.wLength       = sizeof(uint8_t), +		}; + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	return USB_Host_SendControlRequest(AltSetting); +} + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/HostStandardReq.h b/lib/lufa/LUFA/Drivers/USB/Core/HostStandardReq.h new file mode 100644 index 0000000000..66542690ab --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/HostStandardReq.h @@ -0,0 +1,292 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB host standard request management. + * + *  This file contains the function prototypes necessary for the issuing of outgoing standard control requests + *  when the library is in USB host mode. + * + *  \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 __HOSTSTDREQ_H__ +#define __HOSTSTDREQ_H__ + +	/* Includes: */ +		#include "../../../Common/Common.h" +		#include "USBMode.h" +		#include "StdRequestType.h" +		#include "USBController.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_USB_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			#if !defined(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 + +		/* Enums: */ +			/** Enum for the \ref USB_Host_SendControlRequest() return code, indicating the reason for the error +			 *  if the transfer of the request is unsuccessful. +			 * +			 *  \ingroup Group_PipeControlReq +			 */ +			enum USB_Host_SendControlErrorCodes_t +			{ +				HOST_SENDCONTROL_Successful         = 0, /**< No error occurred in the request transfer. */ +				HOST_SENDCONTROL_DeviceDisconnected = 1, /**< The attached device was disconnected during the +				                                        *     request transfer. +				                                        */ +				HOST_SENDCONTROL_PipeError          = 2, /**< An error occurred in the pipe while sending the request. */ +				HOST_SENDCONTROL_SetupStalled       = 3, /**< The attached device stalled the request, usually +				                                          *   indicating that the request is unsupported on the device. +				                                          */ +				HOST_SENDCONTROL_SoftwareTimeOut    = 4, /**< The request or data transfer timed out. */ +			}; + +		/* Global Variables: */ +			/** Indicates the currently set configuration number of the attached device. This indicates the currently +			 *  selected configuration value if one has been set successfully, or 0 if no configuration has been selected. +			 * +			 *  To set a device configuration, call the \ref USB_Host_SetDeviceConfiguration() function. +			 * +			 *  \attention This variable should be treated as read-only in the user application, and never manually +			 *             changed in value. +			 * +			 *  \ingroup Group_Host +			 */ +			extern uint8_t USB_Host_ConfigurationNumber; + +		/* Function Prototypes: */ +			/** Sends the request stored in the \ref USB_ControlRequest global structure to the attached device, +			 *  and transfers the data stored in the buffer to the device, or from the device to the buffer +			 *  as requested. The transfer is made on the currently selected pipe. +			 * +			 *  \ingroup Group_PipeControlReq +			 * +			 *  \param[in] BufferPtr  Pointer to the start of the data buffer if the request has a data stage, or +			 *                        \c NULL if the request transfers no data to or from the device. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result. +			 */ +			uint8_t USB_Host_SendControlRequest(void* const BufferPtr); + +			/** Sends a SET CONFIGURATION standard request to the attached device, with the given configuration index. +			 * +			 *  This routine will automatically update the \ref USB_HostState and \ref USB_Host_ConfigurationNumber +			 *  state variables according to the given function parameters and the result of the request. +			 * +			 *  \note After this routine returns, the control pipe will be selected. +			 * +			 *  \ingroup Group_PipeControlReq +			 * +			 *  \param[in] ConfigNumber  Configuration index to send to the device. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result. +			 */ +			uint8_t USB_Host_SetDeviceConfiguration(const uint8_t ConfigNumber); + +			/** Sends a GET CONFIGURATION standard request to the attached device, to retrieve the currently selected +			 *  device configuration index. +			 * +			 *  \note After this routine returns, the control pipe will be selected. +			 * +			 *  \ingroup Group_PipeControlReq +			 * +			 *  \param[out] ConfigNumber  Pointer to a location where the retrieved configuration index should be stored. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result. +			 */ +			uint8_t USB_Host_GetDeviceConfiguration(uint8_t* const ConfigNumber) ATTR_NON_NULL_PTR_ARG(1); + +			/** Sends a GET DESCRIPTOR standard request to the attached device, requesting the  descriptor of the +			 *  specified type and index. +			 * +			 *  \note After this routine returns, the control pipe will be selected. +			 * +			 *  \ingroup Group_PipeControlReq +			 * +			 *  \param[in]  Type          Type of descriptor to retrieve, a value from the \ref USB_DescriptorTypes_t enum. +			 *  \param[in]  Index         Index of the descriptor to retrieve. +			 *  \param[out] Buffer        Pointer to the destination buffer where the retrieved string descriptor is to be stored. +			 *  \param[in]  BufferLength  Maximum size of the string descriptor which can be stored into the buffer. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result. +			 */ +			uint8_t USB_Host_GetDescriptor(const uint8_t Type, +			                               const uint8_t Index, +			                               void* const Buffer, +			                               const uint8_t BufferLength) ATTR_NON_NULL_PTR_ARG(3); + +			/** Retrieves the current feature status of the attached device, via a GET STATUS standard request. The +			 *  retrieved feature status can then be examined by masking the retrieved value with the various +			 *  \c FEATURE_* masks for bus/self power information and remote wakeup support. +			 * +			 *  \note After this routine returns, the control pipe will be selected. +			 * +			 *  \ingroup Group_PipeControlReq +			 * +			 *  \param[out]  FeatureStatus  Location where the retrieved feature status should be stored. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result. +			 */ +			uint8_t USB_Host_GetDeviceStatus(uint8_t* const FeatureStatus) ATTR_NON_NULL_PTR_ARG(1); + +			/** Clears a stall condition on the given pipe, via a CLEAR FEATURE standard request to the attached device. +			 * +			 *  \note After this routine returns, the control pipe will be selected. +			 * +			 *  \ingroup Group_PipeControlReq +			 * +			 *  \param[in] EndpointAddress  Address of the endpoint to clear, including the endpoint's direction. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result. +			 */ +			uint8_t USB_Host_ClearEndpointStall(const uint8_t EndpointAddress); + +			/** Selects a given alternative setting for the specified interface, via a SET INTERFACE standard request to +			 *  the attached device. +			 * +			 *  \note After this routine returns, the control pipe will be selected. +			 * +			 *  \ingroup Group_PipeControlReq +			 * +			 *  \param[in] InterfaceIndex  Index of the interface whose alternative setting is to be altered. +			 *  \param[in] AltSetting      Index of the interface's alternative setting which is to be selected. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result. +			 */ +			uint8_t USB_Host_SetInterfaceAltSetting(const uint8_t InterfaceIndex, +			                                        const uint8_t AltSetting); + + +			/** Retrieves the current alternative setting for the specified interface, via a GET INTERFACE standard request to +			 *  the attached device. +			 * +			 *  \note After this routine returns, the control pipe will be selected. +			 * +			 *  \ingroup Group_PipeControlReq +			 * +			 *  \param[in]  InterfaceIndex  Index of the interface whose alternative setting is to be altered. +			 *  \param[out] AltSetting      Pointer to a location where the retrieved alternative setting value should be stored. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result. +			 */ +			uint8_t USB_Host_GetInterfaceAltSetting(const uint8_t InterfaceIndex, +			                                        uint8_t* const AltSetting) ATTR_NON_NULL_PTR_ARG(2); + +		/* Inline Functions: */ +			/** Sends a GET DESCRIPTOR standard request to the attached device, requesting the device descriptor. +			 *  This can be used to easily retrieve information about the device such as its VID, PID and power +			 *  requirements. This is a convenience wrapper for \ref USB_Host_GetDescriptor(). +			 * +			 *  \note After this routine returns, the control pipe will be selected. +			 * +			 *  \ingroup Group_PipeControlReq +			 * +			 *  \param[out] DeviceDescriptorPtr  Pointer to the destination device descriptor structure where +			 *                                   the read data is to be stored. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result. +			 */ +			static inline uint8_t USB_Host_GetDeviceDescriptor(USB_Descriptor_Device_t* const DeviceDescriptorPtr) ATTR_NON_NULL_PTR_ARG(1); +			static inline uint8_t USB_Host_GetDeviceDescriptor(USB_Descriptor_Device_t* const DeviceDescriptorPtr) +			{ +				return USB_Host_GetDescriptor(DTYPE_Device, 0, DeviceDescriptorPtr, sizeof(USB_Descriptor_Device_t)); +			} + +			/** Sends a GET DESCRIPTOR standard request to the attached device, requesting the string descriptor +			 *  of the specified index. This can be used to easily retrieve string descriptors from the device by +			 *  index, after the index is obtained from the Device or Configuration descriptors. This is a convenience +			 *  wrapper for \ref USB_Host_GetDescriptor(). +			 * +			 *  \note After this routine returns, the control pipe will be selected. +			 * +			 *  \ingroup Group_PipeControlReq +			 * +			 *  \param[in]  Index        Index of the string descriptor to retrieve. +			 *  \param[out] Buffer       Pointer to the destination buffer where the retrieved string descriptor is +			 *                           to be stored. +			 *  \param[in] BufferLength  Maximum size of the string descriptor which can be stored into the buffer. +			 * +			 *  \return A value from the \ref USB_Host_SendControlErrorCodes_t enum to indicate the result. +			 */ +			static inline uint8_t USB_Host_GetDeviceStringDescriptor(const uint8_t Index, +			                                                         void* const Buffer, +			                                                         const uint8_t BufferLength) ATTR_NON_NULL_PTR_ARG(2); +			static inline uint8_t USB_Host_GetDeviceStringDescriptor(const uint8_t Index, +			                                                         void* const Buffer, +			                                                         const uint8_t BufferLength) +			{ +				return USB_Host_GetDescriptor(DTYPE_String, Index,  Buffer, BufferLength); +			} + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Enums: */ +			enum USB_WaitForTypes_t +			{ +				USB_HOST_WAITFOR_SetupSent, +				USB_HOST_WAITFOR_InReceived, +				USB_HOST_WAITFOR_OutReady, +			}; + +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_HOSTSTDREQ_C) +				static uint8_t USB_Host_SendControlRequest_PRV(void* const BufferPtr); +				static uint8_t USB_Host_WaitForIOS(const uint8_t WaitType); +			#endif +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/OTG.h b/lib/lufa/LUFA/Drivers/USB/Core/OTG.h new file mode 100644 index 0000000000..6293e4cacd --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/OTG.h @@ -0,0 +1,80 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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/lib/lufa/LUFA/Drivers/USB/Core/Pipe.h b/lib/lufa/LUFA/Drivers/USB/Core/Pipe.h new file mode 100644 index 0000000000..0697078d01 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/Pipe.h @@ -0,0 +1,144 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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: */ +		/* Type Defines: */ +			/** Type define for a pipe table entry, used to configure pipes in groups via +			 *  \ref Pipe_ConfigurePipeTable(). +			 */ +			typedef struct +			{ +				uint8_t  Address; /**< Address of the pipe to configure, or zero if the table entry is to be unused. */ +				uint16_t Size; /**< Size of the pipe bank, in bytes. */ +				uint8_t  EndpointAddress; /**< Address of the endpoint in the connected device. */ +				uint8_t  Type; /**< Type of the endpoint, a \c EP_TYPE_* mask. */ +				uint8_t  Banks; /**< Number of hardware banks to use for the pipe. */ +			} USB_Pipe_Table_t; + +		/* 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               0x0F + +			/** Endpoint number mask, for masking against endpoint addresses to retrieve the endpoint's +			 *  numerical address in the attached device. +			 */ +			#define PIPE_EPNUM_MASK                 0x0F + +	/* 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/lib/lufa/LUFA/Drivers/USB/Core/PipeStream.h b/lib/lufa/LUFA/Drivers/USB/Core/PipeStream.h new file mode 100644 index 0000000000..8785302847 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/PipeStream.h @@ -0,0 +1,100 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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/lib/lufa/LUFA/Drivers/USB/Core/StdDescriptors.h b/lib/lufa/LUFA/Drivers/USB/Core/StdDescriptors.h new file mode 100644 index 0000000000..381c02c53f --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/StdDescriptors.h @@ -0,0 +1,765 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Common standard USB Descriptor definitions for all architectures. + *  \copydetails Group_StdDescriptors + * + *  \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_StdDescriptors USB Descriptors + *  \brief Standard USB Descriptor definitions. + * + *  Standard USB device descriptor defines and retrieval routines, for USB devices. This module contains + *  structures and macros for the easy creation of standard USB descriptors in USB device projects. + * + *  @{ + */ + +#ifndef __USBDESCRIPTORS_H__ +#define __USBDESCRIPTORS_H__ + +	/* Includes: */ +		#include "../../../Common/Common.h" +		#include "USBMode.h" +		#include "Events.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 that a given descriptor does not exist in the device. This can be used inside descriptors +			 *  for string descriptor indexes, or may be use as a return value for GetDescriptor when the specified +			 *  descriptor does not exist. +			 */ +			#define NO_DESCRIPTOR                     0 + +			/** Macro to calculate the power value for the configuration descriptor, from a given number of milliamperes. +			 * +			 *  \param[in] mA  Maximum number of milliamps the device consumes when the given configuration is selected. +			 */ +			#define USB_CONFIG_POWER_MA(mA)           ((mA) >> 1) + +			/** Macro to calculate the Unicode length of a string with a given number of Unicode characters. +			 *  Should be used in string descriptor's headers for giving the string descriptor's byte length. +			 * +			 *  \param[in] UnicodeChars  Number of Unicode characters in the string text. +			 */ +			#define USB_STRING_LEN(UnicodeChars)      (sizeof(USB_Descriptor_Header_t) + ((UnicodeChars) << 1)) + +			/** Convenience macro to easily create \ref USB_Descriptor_String_t instances from a wide character string. +			 * +			 *  \note This macro is for little-endian systems only. +			 * +			 *  \param[in] String  String to initialize a USB String Descriptor structure with. +			 */ +			#define USB_STRING_DESCRIPTOR(String)     { .Header = {.Size = sizeof(USB_Descriptor_Header_t) + (sizeof(String) - 2), .Type = DTYPE_String}, .UnicodeString = String } + +			/** Convenience macro to easily create \ref USB_Descriptor_String_t instances from an array of characters. +			 * +			 *  \param[in] ...  Characters to initialize a USB String Descriptor structure with. +			 */ +			#define USB_STRING_DESCRIPTOR_ARRAY(...)  { .Header = {.Size = sizeof(USB_Descriptor_Header_t) + sizeof((uint16_t){__VA_ARGS__}), .Type = DTYPE_String}, .UnicodeString = {__VA_ARGS__} } + +			/** Macro to encode a given major/minor/revision version number into Binary Coded Decimal format for descriptor +			 *  fields requiring BCD encoding, such as the USB version number in the standard device descriptor. +			 * +			 *  \note This value is automatically converted into Little Endian, suitable for direct use inside device +			 *        descriptors on all architectures without endianness conversion macros. +			 * +			 *  \param[in]  Major     Major version number to encode. +			 *  \param[in]  Minor     Minor version number to encode. +			 *  \param[in]  Revision  Revision version number to encode. +			 */ +			#define VERSION_BCD(Major, Minor, Revision) \ +			                                          CPU_TO_LE16( ((Major & 0xFF) << 8) | \ +			                                                       ((Minor & 0x0F) << 4) | \ +			                                                       (Revision & 0x0F) ) + +			/** String language ID for the English language. Should be used in \ref USB_Descriptor_String_t descriptors +			 *  to indicate that the English language is supported by the device in its string descriptors. +			 */ +			#define LANGUAGE_ID_ENG                   0x0409 + +			/** \name USB Configuration Descriptor Attribute Masks */ +			//@{ +			/** Mask for the reserved bit in the Configuration Descriptor's \c ConfigAttributes field, which must be set on all +			 *  devices for historical purposes. +			 */ +			#define USB_CONFIG_ATTR_RESERVED          0x80 + +			/** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t +			 *  descriptor's \c ConfigAttributes value to indicate that the specified configuration can draw its power +			 *  from the device's own power source. +			 */ +			#define USB_CONFIG_ATTR_SELFPOWERED       0x40 + +			/** Can be masked with other configuration descriptor attributes for a \ref USB_Descriptor_Configuration_Header_t +			 *  descriptor's \c ConfigAttributes value to indicate that the specified configuration supports the +			 *  remote wakeup feature of the USB standard, allowing a suspended USB device to wake up the host upon +			 *  request. +			 */ +			#define USB_CONFIG_ATTR_REMOTEWAKEUP      0x20 +			//@} + +			/** \name Endpoint Descriptor Attribute Masks */ +			//@{ +			/** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's +			 *  \c Attributes value to indicate that the specified endpoint is not synchronized. +			 * +			 *  \see The USB specification for more details on the possible Endpoint attributes. +			 */ +			#define ENDPOINT_ATTR_NO_SYNC             (0 << 2) + +			/** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's +			 *  \c Attributes value to indicate that the specified endpoint is asynchronous. +			 * +			 *  \see The USB specification for more details on the possible Endpoint attributes. +			 */ +			#define ENDPOINT_ATTR_ASYNC               (1 << 2) + +			/** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's +			 *  \c Attributes value to indicate that the specified endpoint is adaptive. +			 * +			 *  \see The USB specification for more details on the possible Endpoint attributes. +			 */ +			#define ENDPOINT_ATTR_ADAPTIVE            (2 << 2) + +			/** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's +			 *  \c Attributes value to indicate that the specified endpoint is synchronized. +			 * +			 *  \see The USB specification for more details on the possible Endpoint attributes. +			 */ +			#define ENDPOINT_ATTR_SYNC                (3 << 2) +			//@} + +			/** \name Endpoint Descriptor Usage Masks */ +			//@{ +			/** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's +			 *  \c Attributes value to indicate that the specified endpoint is used for data transfers. +			 * +			 *  \see The USB specification for more details on the possible Endpoint usage attributes. +			 */ +			#define ENDPOINT_USAGE_DATA               (0 << 4) + +			/** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's +			 *  \c Attributes value to indicate that the specified endpoint is used for feedback. +			 * +			 *  \see The USB specification for more details on the possible Endpoint usage attributes. +			 */ +			#define ENDPOINT_USAGE_FEEDBACK           (1 << 4) + +			/** Can be masked with other endpoint descriptor attributes for a \ref USB_Descriptor_Endpoint_t descriptor's +			 *  \c Attributes value to indicate that the specified endpoint is used for implicit feedback. +			 * +			 *  \see The USB specification for more details on the possible Endpoint usage attributes. +			 */ +			#define ENDPOINT_USAGE_IMPLICIT_FEEDBACK  (2 << 4) +			//@} + +		/* Enums: */ +			/** Enum for the possible standard descriptor types, as given in each descriptor's header. */ +			enum USB_DescriptorTypes_t +			{ +				DTYPE_Device                    = 0x01, /**< Indicates that the descriptor is a device descriptor. */ +				DTYPE_Configuration             = 0x02, /**< Indicates that the descriptor is a configuration descriptor. */ +				DTYPE_String                    = 0x03, /**< Indicates that the descriptor is a string descriptor. */ +				DTYPE_Interface                 = 0x04, /**< Indicates that the descriptor is an interface descriptor. */ +				DTYPE_Endpoint                  = 0x05, /**< Indicates that the descriptor is an endpoint descriptor. */ +				DTYPE_DeviceQualifier           = 0x06, /**< Indicates that the descriptor is a device qualifier descriptor. */ +				DTYPE_Other                     = 0x07, /**< Indicates that the descriptor is of other type. */ +				DTYPE_InterfacePower            = 0x08, /**< Indicates that the descriptor is an interface power descriptor. */ +				DTYPE_InterfaceAssociation      = 0x0B, /**< Indicates that the descriptor is an interface association descriptor. */ +				DTYPE_CSInterface               = 0x24, /**< Indicates that the descriptor is a class specific interface descriptor. */ +				DTYPE_CSEndpoint                = 0x25, /**< Indicates that the descriptor is a class specific endpoint descriptor. */ +			}; + +			/** Enum for possible Class, Subclass and Protocol values of device and interface descriptors. */ +			enum USB_Descriptor_ClassSubclassProtocol_t +			{ +				USB_CSCP_NoDeviceClass          = 0x00, /**< Descriptor Class value indicating that the device does not belong +				                                         *   to a particular class at the device level. +				                                         */ +				USB_CSCP_NoDeviceSubclass       = 0x00, /**< Descriptor Subclass value indicating that the device does not belong +				                                         *   to a particular subclass at the device level. +				                                         */ +				USB_CSCP_NoDeviceProtocol       = 0x00, /**< Descriptor Protocol value indicating that the device does not belong +				                                         *   to a particular protocol at the device level. +				                                         */ +				USB_CSCP_VendorSpecificClass    = 0xFF, /**< Descriptor Class value indicating that the device/interface belongs +				                                         *   to a vendor specific class. +				                                         */ +				USB_CSCP_VendorSpecificSubclass = 0xFF, /**< Descriptor Subclass value indicating that the device/interface belongs +				                                         *   to a vendor specific subclass. +				                                         */ +				USB_CSCP_VendorSpecificProtocol = 0xFF, /**< Descriptor Protocol value indicating that the device/interface belongs +				                                         *   to a vendor specific protocol. +				                                         */ +				USB_CSCP_IADDeviceClass         = 0xEF, /**< Descriptor Class value indicating that the device belongs to the +				                                         *   Interface Association Descriptor class. +				                                         */ +				USB_CSCP_IADDeviceSubclass      = 0x02, /**< Descriptor Subclass value indicating that the device belongs to the +				                                         *   Interface Association Descriptor subclass. +				                                         */ +				USB_CSCP_IADDeviceProtocol      = 0x01, /**< Descriptor Protocol value indicating that the device belongs to the +				                                         *   Interface Association Descriptor protocol. +				                                         */ +			}; + +		/* Type Defines: */ +			/** \brief Standard USB Descriptor Header (LUFA naming conventions). +			 * +             *  Type define for all descriptors' standard header, indicating the descriptor's length and type. This structure +			 *  uses LUFA-specific element names to make each element's purpose clearer. +			 * +			 *  \see \ref USB_StdDescriptor_Header_t for the version of this type with standard element names. +			 * +			 *  \note Regardless of CPU architecture, these values should be stored as little endian. +			 */ +			typedef struct +			{ +				uint8_t Size; /**< Size of the descriptor, in bytes. */ +				uint8_t Type; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +				               *   given by the specific class. +				               */ +			} ATTR_PACKED USB_Descriptor_Header_t; + +			/** \brief Standard USB Descriptor Header (USB-IF naming conventions). +			 * +			 *  Type define for all descriptors' standard header, indicating the descriptor's length and type. This structure +			 *  uses the relevant standard's given element names to ensure compatibility with the standard. +			 * +			 *  \see \ref USB_Descriptor_Header_t for the version of this type with non-standard LUFA specific element names. +			 * +			 *  \note Regardless of CPU architecture, these values should be stored as little endian. +			 */ +			typedef struct +			{ +				uint8_t bLength; /**< Size of the descriptor, in bytes. */ +				uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +				                          *   given by the specific class. +				                          */ +			} ATTR_PACKED USB_StdDescriptor_Header_t; + +			/** \brief Standard USB Device Descriptor (LUFA naming conventions). +			 * +			 *  Type define for a standard Device Descriptor. This structure uses LUFA-specific element names to make each +			 *  element's purpose clearer. +			 * +			 *  \see \ref USB_StdDescriptor_Device_t for the version of this type with standard element names. +			 * +			 *  \note Regardless of CPU architecture, these values should be stored as little endian. +			 */ +			typedef struct +			{ +				USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ + +				uint16_t USBSpecification; /**< BCD of the supported USB specification. +				                            * +				                            *   \see \ref VERSION_BCD() utility macro. +				                            */ +				uint8_t  Class; /**< USB device class. */ +				uint8_t  SubClass; /**< USB device subclass. */ +				uint8_t  Protocol; /**< USB device protocol. */ + +				uint8_t  Endpoint0Size; /**< Size of the control (address 0) endpoint's bank in bytes. */ + +				uint16_t VendorID; /**< Vendor ID for the USB product. */ +				uint16_t ProductID; /**< Unique product ID for the USB product. */ +				uint16_t ReleaseNumber; /**< Product release (version) number. +				                         * +				                         *   \see \ref VERSION_BCD() utility macro. +				                         */ +				uint8_t  ManufacturerStrIndex; /**< String index for the manufacturer's name. The +				                                *   host will request this string via a separate +				                                *   control request for the string descriptor. +				                                * +				                                *   \note If no string supplied, use \ref NO_DESCRIPTOR. +				                                */ +				uint8_t  ProductStrIndex; /**< String index for the product name/details. +				                           * +				                           *  \see ManufacturerStrIndex structure entry. +				                           */ +				uint8_t  SerialNumStrIndex; /**< String index for the product's globally unique hexadecimal +				                             *   serial number, in uppercase Unicode ASCII. +				                             * +				                             *  \note On some microcontroller models, there is an embedded serial number +				                             *        in the chip which can be used for the device serial number. +				                             *        To use this serial number, set this to \c USE_INTERNAL_SERIAL. +				                             *        On unsupported devices, this will evaluate to \ref NO_DESCRIPTOR +				                             *        and will cause the host to generate a pseudo-unique value for the +				                             *        device upon insertion. +				                             * +				                             *  \see \c ManufacturerStrIndex structure entry. +				                             */ +				uint8_t  NumberOfConfigurations; /**< Total number of configurations supported by +				                                  *   the device. +				                                  */ +			} ATTR_PACKED USB_Descriptor_Device_t; + +			/** \brief Standard USB Device Descriptor (USB-IF naming conventions). +			 * +			 *  Type define for a standard Device Descriptor. This structure uses the relevant standard's given element names +			 *  to ensure compatibility with the standard. +			 * +			 *  \see \ref USB_Descriptor_Device_t for the version of this type with non-standard LUFA specific element names. +			 * +			 *  \note Regardless of CPU architecture, these values should be stored as little endian. +			 */ +			typedef struct +			{ +				uint8_t  bLength; /**< Size of the descriptor, in bytes. */ +				uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +				                              *   given by the specific class. +				                              */ +				uint16_t bcdUSB; /**< BCD of the supported USB specification. +				                  * +				                  *   \see \ref VERSION_BCD() utility macro. +				                  */ +				uint8_t  bDeviceClass; /**< USB device class. */ +				uint8_t  bDeviceSubClass; /**< USB device subclass. */ +				uint8_t  bDeviceProtocol; /**< USB device protocol. */ +				uint8_t  bMaxPacketSize0; /**< Size of the control (address 0) endpoint's bank in bytes. */ +				uint16_t idVendor; /**< Vendor ID for the USB product. */ +				uint16_t idProduct; /**< Unique product ID for the USB product. */ +				uint16_t bcdDevice; /**< Product release (version) number. +				                     * +				                     *   \see \ref VERSION_BCD() utility macro. +				                     */ +				uint8_t  iManufacturer; /**< String index for the manufacturer's name. The +				                         *   host will request this string via a separate +				                         *   control request for the string descriptor. +				                         * +				                         *   \note If no string supplied, use \ref NO_DESCRIPTOR. +				                         */ +				uint8_t  iProduct; /**< String index for the product name/details. +				                    * +				                    *  \see ManufacturerStrIndex structure entry. +				                    */ +				uint8_t iSerialNumber; /**< String index for the product's globally unique hexadecimal +				                        *   serial number, in uppercase Unicode ASCII. +				                        * +				                        *  \note On some microcontroller models, there is an embedded serial number +				                        *        in the chip which can be used for the device serial number. +				                        *        To use this serial number, set this to \c USE_INTERNAL_SERIAL. +				                        *        On unsupported devices, this will evaluate to \ref NO_DESCRIPTOR +				                        *        and will cause the host to generate a pseudo-unique value for the +				                        *        device upon insertion. +				                        * +				                        *  \see \c ManufacturerStrIndex structure entry. +				                        */ +				uint8_t  bNumConfigurations; /**< Total number of configurations supported by +				                              *   the device. +				                              */ +			} ATTR_PACKED USB_StdDescriptor_Device_t; + +			/** \brief Standard USB Device Qualifier Descriptor (LUFA naming conventions). +			 * +			 *  Type define for a standard Device Qualifier Descriptor. This structure uses LUFA-specific element names +			 *  to make each element's purpose clearer. +			 * +			 *  \see \ref USB_StdDescriptor_DeviceQualifier_t for the version of this type with standard element names. +			 */ +			typedef struct +			{ +				USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ + +				uint16_t USBSpecification; /**< BCD of the supported USB specification. +				                            * +				                            *   \see \ref VERSION_BCD() utility macro. +				                            */ +				uint8_t  Class; /**< USB device class. */ +				uint8_t  SubClass; /**< USB device subclass. */ +				uint8_t  Protocol; /**< USB device protocol. */ + +				uint8_t  Endpoint0Size; /**< Size of the control (address 0) endpoint's bank in bytes. */ +				uint8_t  NumberOfConfigurations; /**< Total number of configurations supported by +				                                  *   the device. +				                                  */ +				uint8_t  Reserved; /**< Reserved for future use, must be 0. */ +			} ATTR_PACKED USB_Descriptor_DeviceQualifier_t; + +			/** \brief Standard USB Device Qualifier Descriptor (USB-IF naming conventions). +			 * +			 *  Type define for a standard Device Qualifier Descriptor. This structure uses the relevant standard's given element names +			 *  to ensure compatibility with the standard. +			 * +			 *  \see \ref USB_Descriptor_DeviceQualifier_t for the version of this type with non-standard LUFA specific element names. +			 */ +			typedef struct +			{ +				uint8_t  bLength; /**< Size of the descriptor, in bytes. */ +				uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +				                           *   given by the specific class. +				                           */ +				uint16_t bcdUSB; /**< BCD of the supported USB specification. +				                  * +				                  *   \see \ref VERSION_BCD() utility macro. +				                  */ +				uint8_t  bDeviceClass; /**< USB device class. */ +				uint8_t  bDeviceSubClass; /**< USB device subclass. */ +				uint8_t  bDeviceProtocol; /**< USB device protocol. */ +				uint8_t  bMaxPacketSize0; /**< Size of the control (address 0) endpoint's bank in bytes. */ +				uint8_t  bNumConfigurations; /**< Total number of configurations supported by +				                              *   the device. +				                              */ +				uint8_t  bReserved; /**< Reserved for future use, must be 0. */ +			} ATTR_PACKED USB_StdDescriptor_DeviceQualifier_t; + +			/** \brief Standard USB Configuration Descriptor (LUFA naming conventions). +			 * +			 *  Type define for a standard Configuration Descriptor header. This structure uses LUFA-specific element names +			 *  to make each element's purpose clearer. +			 * +			 *  \see \ref USB_StdDescriptor_Configuration_Header_t for the version of this type with standard element names. +			 * +			 *  \note Regardless of CPU architecture, these values should be stored as little endian. +			 */ +			typedef struct +			{ +				USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ + +				uint16_t TotalConfigurationSize; /**< Size of the configuration descriptor header, +				                                  *   and all sub descriptors inside the configuration. +				                                  */ +				uint8_t  TotalInterfaces; /**< Total number of interfaces in the configuration. */ + +				uint8_t  ConfigurationNumber; /**< Configuration index of the current configuration. */ +				uint8_t  ConfigurationStrIndex; /**< Index of a string descriptor describing the configuration. */ + +				uint8_t  ConfigAttributes; /**< Configuration attributes, comprised of a mask of \c USB_CONFIG_ATTR_* masks. +				                            *   On all devices, this should include USB_CONFIG_ATTR_RESERVED at a minimum. +				                            */ + +				uint8_t  MaxPowerConsumption; /**< Maximum power consumption of the device while in the +				                               *   current configuration, calculated by the \ref USB_CONFIG_POWER_MA() +				                               *   macro. +				                               */ +			} ATTR_PACKED USB_Descriptor_Configuration_Header_t; + +			/** \brief Standard USB Configuration Descriptor (USB-IF naming conventions). +			 * +			 *  Type define for a standard Configuration Descriptor header. This structure uses the relevant standard's given element names +			 *  to ensure compatibility with the standard. +			 * +			 *  \see \ref USB_Descriptor_Device_t for the version of this type with non-standard LUFA specific element names. +			 * +			 *  \note Regardless of CPU architecture, these values should be stored as little endian. +			 */ +			typedef struct +			{ +				uint8_t  bLength; /**< Size of the descriptor, in bytes. */ +				uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +				                           *   given by the specific class. +				                           */ +				uint16_t wTotalLength; /**< Size of the configuration descriptor header, +				                           *   and all sub descriptors inside the configuration. +				                           */ +				uint8_t  bNumInterfaces; /**< Total number of interfaces in the configuration. */ +				uint8_t  bConfigurationValue; /**< Configuration index of the current configuration. */ +				uint8_t  iConfiguration; /**< Index of a string descriptor describing the configuration. */ +				uint8_t  bmAttributes; /**< Configuration attributes, comprised of a mask of \c USB_CONFIG_ATTR_* masks. +				                        *   On all devices, this should include USB_CONFIG_ATTR_RESERVED at a minimum. +				                        */ +				uint8_t  bMaxPower; /**< Maximum power consumption of the device while in the +				                     *   current configuration, calculated by the \ref USB_CONFIG_POWER_MA() +				                     *   macro. +				                     */ +			} ATTR_PACKED USB_StdDescriptor_Configuration_Header_t; + +			/** \brief Standard USB Interface Descriptor (LUFA naming conventions). +			 * +			 *  Type define for a standard Interface Descriptor. This structure uses LUFA-specific element names +			 *  to make each element's purpose clearer. +			 * +			 *  \see \ref USB_StdDescriptor_Interface_t for the version of this type with standard element names. +			 * +			 *  \note Regardless of CPU architecture, these values should be stored as little endian. +			 */ +			typedef struct +			{ +				USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ + +				uint8_t InterfaceNumber; /**< Index of the interface in the current configuration. */ +				uint8_t AlternateSetting; /**< Alternate setting for the interface number. The same +				                           *   interface number can have multiple alternate settings +				                           *   with different endpoint configurations, which can be +				                           *   selected by the host. +				                           */ +				uint8_t TotalEndpoints; /**< Total number of endpoints in the interface. */ + +				uint8_t Class; /**< Interface class ID. */ +				uint8_t SubClass; /**< Interface subclass ID. */ +				uint8_t Protocol; /**< Interface protocol ID. */ + +				uint8_t InterfaceStrIndex; /**< Index of the string descriptor describing the interface. */ +			} ATTR_PACKED USB_Descriptor_Interface_t; + +			/** \brief Standard USB Interface Descriptor (USB-IF naming conventions). +			 * +			 *  Type define for a standard Interface Descriptor. This structure uses the relevant standard's given element names +			 *  to ensure compatibility with the standard. +			 * +			 *  \see \ref USB_Descriptor_Interface_t for the version of this type with non-standard LUFA specific element names. +			 * +			 *  \note Regardless of CPU architecture, these values should be stored as little endian. +			 */ +			typedef struct +			{ +				uint8_t bLength; /**< Size of the descriptor, in bytes. */ +				uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +				                          *   given by the specific class. +				                          */ +				uint8_t bInterfaceNumber; /**< Index of the interface in the current configuration. */ +				uint8_t bAlternateSetting; /**< Alternate setting for the interface number. The same +				                            *   interface number can have multiple alternate settings +				                            *   with different endpoint configurations, which can be +				                            *   selected by the host. +				                            */ +				uint8_t bNumEndpoints; /**< Total number of endpoints in the interface. */ +				uint8_t bInterfaceClass; /**< Interface class ID. */ +				uint8_t bInterfaceSubClass; /**< Interface subclass ID. */ +				uint8_t bInterfaceProtocol; /**< Interface protocol ID. */ +				uint8_t iInterface; /**< Index of the string descriptor describing the +				                     *   interface. +				                     */ +			} ATTR_PACKED USB_StdDescriptor_Interface_t; + +			/** \brief Standard USB Interface Association Descriptor (LUFA naming conventions). +			 * +			 *  Type define for a standard Interface Association Descriptor. This structure uses LUFA-specific element names +			 *  to make each element's purpose clearer. +			 * +			 *  This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at +			 *  <a>http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf</a>. It allows composite +			 *  devices with multiple interfaces related to the same function to have the multiple interfaces bound +			 *  together at the point of enumeration, loading one generic driver for all the interfaces in the single +			 *  function. Read the ECN for more information. +			 * +			 *  \see \ref USB_StdDescriptor_Interface_Association_t for the version of this type with standard element names. +			 * +			 *  \note Regardless of CPU architecture, these values should be stored as little endian. +			 */ +			typedef struct +			{ +				USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ + +				uint8_t FirstInterfaceIndex; /**< Index of the first associated interface. */ +				uint8_t TotalInterfaces; /**< Total number of associated interfaces. */ + +				uint8_t Class; /**< Interface class ID. */ +				uint8_t SubClass; /**< Interface subclass ID. */ +				uint8_t Protocol; /**< Interface protocol ID. */ + +				uint8_t IADStrIndex; /**< Index of the string descriptor describing the +				                      *   interface association. +				                      */ +			} ATTR_PACKED USB_Descriptor_Interface_Association_t; + +			/** \brief Standard USB Interface Association Descriptor (USB-IF naming conventions). +			 * +			 *  Type define for a standard Interface Association Descriptor. This structure uses the relevant standard's given +			 *  element names to ensure compatibility with the standard. +			 * +			 *  This descriptor has been added as a supplement to the USB2.0 standard, in the ECN located at +			 *  <a>http://www.usb.org/developers/docs/InterfaceAssociationDescriptor_ecn.pdf</a>. It allows composite +			 *  devices with multiple interfaces related to the same function to have the multiple interfaces bound +			 *  together at the point of enumeration, loading one generic driver for all the interfaces in the single +			 *  function. Read the ECN for more information. +			 * +			 *  \see \ref USB_Descriptor_Interface_Association_t for the version of this type with non-standard LUFA specific +			 *       element names. +			 * +			 *  \note Regardless of CPU architecture, these values should be stored as little endian. +			 */ +			typedef struct +			{ +				uint8_t bLength; /**< Size of the descriptor, in bytes. */ +				uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a value +				                          *   given by the specific class. +				                          */ +				uint8_t bFirstInterface; /**< Index of the first associated interface. */ +				uint8_t bInterfaceCount; /**< Total number of associated interfaces. */ +				uint8_t bFunctionClass; /**< Interface class ID. */ +				uint8_t bFunctionSubClass; /**< Interface subclass ID. */ +				uint8_t bFunctionProtocol; /**< Interface protocol ID. */ +				uint8_t iFunction; /**< Index of the string descriptor describing the +				                    *   interface association. +				                    */ +			} ATTR_PACKED USB_StdDescriptor_Interface_Association_t; + +			/** \brief Standard USB Endpoint Descriptor (LUFA naming conventions). +			 * +			 *  Type define for a standard Endpoint Descriptor. This structure uses LUFA-specific element names +			 *  to make each element's purpose clearer. +			 * +			 *  \see \ref USB_StdDescriptor_Endpoint_t for the version of this type with standard element names. +			 * +			 *  \note Regardless of CPU architecture, these values should be stored as little endian. +			 */ +			typedef struct +			{ +				USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ + +				uint8_t  EndpointAddress; /**< Logical address of the endpoint within the device for the current +				                           *   configuration, including direction mask. +				                           */ +				uint8_t  Attributes; /**< Endpoint attributes, comprised of a mask of the endpoint type (EP_TYPE_*) +				                      *   and attributes (ENDPOINT_ATTR_*) masks. +				                      */ +				uint16_t EndpointSize; /**< Size of the endpoint bank, in bytes. This indicates the maximum packet +				                        *   size that the endpoint can receive at a time. +				                        */ +				uint8_t  PollingIntervalMS; /**< Polling interval in milliseconds for the endpoint if it is an INTERRUPT +				                             *   or ISOCHRONOUS type. +				                             */ +			} ATTR_PACKED USB_Descriptor_Endpoint_t; + +			/** \brief Standard USB Endpoint Descriptor (USB-IF naming conventions). +			 * +			 *  Type define for a standard Endpoint Descriptor. This structure uses the relevant standard's given +			 *  element names to ensure compatibility with the standard. +			 * +			 *  \see \ref USB_Descriptor_Endpoint_t for the version of this type with non-standard LUFA specific +			 *       element names. +			 * +			 *  \note Regardless of CPU architecture, these values should be stored as little endian. +			 */ +			typedef struct +			{ +				uint8_t  bLength; /**< Size of the descriptor, in bytes. */ +				uint8_t  bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t or a +				                           *   value given by the specific class. +				                           */ +				uint8_t  bEndpointAddress; /**< Logical address of the endpoint within the device for the current +				                            *   configuration, including direction mask. +				                            */ +				uint8_t  bmAttributes; /**< Endpoint attributes, comprised of a mask of the endpoint type (EP_TYPE_*) +				                        *   and attributes (ENDPOINT_ATTR_*) masks. +				                        */ +				uint16_t wMaxPacketSize; /**< Size of the endpoint bank, in bytes. This indicates the maximum packet size +				                          *   that the endpoint can receive at a time. +				                          */ +				uint8_t  bInterval; /**< Polling interval in milliseconds for the endpoint if it is an INTERRUPT or +				                     *   ISOCHRONOUS type. +				                     */ +			} ATTR_PACKED USB_StdDescriptor_Endpoint_t; + +			/** \brief Standard USB String Descriptor (LUFA naming conventions). +			 * +			 *  Type define for a standard string descriptor. Unlike other standard descriptors, the length +			 *  of the descriptor for placement in the descriptor header must be determined by the \ref USB_STRING_LEN() +			 *  macro rather than by the size of the descriptor structure, as the length is not fixed. +			 * +			 *  This structure should also be used for string index 0, which contains the supported language IDs for +			 *  the device as an array. +			 * +			 *  This structure uses LUFA-specific element names to make each element's purpose clearer. +			 * +			 *  \see \ref USB_StdDescriptor_String_t for the version of this type with standard element names. +			 * +			 *  \note Regardless of CPU architecture, these values should be stored as little endian. +			 */ +			typedef struct +			{ +				USB_Descriptor_Header_t Header; /**< Descriptor header, including type and size. */ + +				#if (((ARCH == ARCH_AVR8) || (ARCH == ARCH_XMEGA)) && !defined(__DOXYGEN__)) +				wchar_t  UnicodeString[]; +				#else +				uint16_t UnicodeString[]; /**< String data, as unicode characters (alternatively, +				                           *   string language IDs). If normal ASCII characters are +				                           *   to be used, they must be added as an array of characters +				                           *   rather than a normal C string so that they are widened to +				                           *   Unicode size. +				                           * +				                           *   Under GCC, strings prefixed with the "L" character (before +				                           *   the opening string quotation mark) are considered to be +				                           *   Unicode strings, and may be used instead of an explicit +				                           *   array of ASCII characters on little endian devices with +				                           *   UTF-16-LE \c wchar_t encoding. +				                           */ +				#endif +			} ATTR_PACKED USB_Descriptor_String_t; + +			/** \brief Standard USB String Descriptor (USB-IF naming conventions). +			 * +			 *  Type define for a standard string descriptor. Unlike other standard descriptors, the length +			 *  of the descriptor for placement in the descriptor header must be determined by the \ref USB_STRING_LEN() +			 *  macro rather than by the size of the descriptor structure, as the length is not fixed. +			 * +			 *  This structure should also be used for string index 0, which contains the supported language IDs for +			 *  the device as an array. +			 * +			 *  This structure uses the relevant standard's given element names to ensure compatibility with the standard. +			 * +			 *  \see \ref USB_Descriptor_String_t for the version of this type with with non-standard LUFA specific +			 *       element names. +			 * +			 *  \note Regardless of CPU architecture, these values should be stored as little endian. +			 */ +			typedef struct +			{ +				uint8_t bLength; /**< Size of the descriptor, in bytes. */ +				uint8_t bDescriptorType; /**< Type of the descriptor, either a value in \ref USB_DescriptorTypes_t +				                          *   or a value given by the specific class. +				                          */ +				uint16_t bString[]; /**< String data, as unicode characters (alternatively, string language IDs). +				                     *   If normal ASCII characters are to be used, they must be added as an array +				                     *   of characters rather than a normal C string so that they are widened to +				                     *   Unicode size. +				                     * +				                     *   Under GCC, strings prefixed with the "L" character (before the opening string +				                     *   quotation mark) are considered to be Unicode strings, and may be used instead +				                     *   of an explicit array of ASCII characters. +				                     */ +			} ATTR_PACKED USB_StdDescriptor_String_t; + + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/StdRequestType.h b/lib/lufa/LUFA/Drivers/USB/Core/StdRequestType.h new file mode 100644 index 0000000000..7297806962 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/StdRequestType.h @@ -0,0 +1,258 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB control endpoint request definitions. + *  \copydetails Group_StdRequest + * + *  \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_StdRequest Standard USB Requests + *  \brief USB control endpoint request definitions. + * + *  This module contains definitions for the various control request parameters, so that the request + *  details (such as data direction, request recipient, etc.) can be extracted via masking. + * + *  @{ + */ + +#ifndef __STDREQTYPE_H__ +#define __STDREQTYPE_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: */ +			/** Mask for the request type parameter, to indicate the direction of the request data (Host to Device +			 *  or Device to Host). The result of this mask should then be compared to the request direction masks. +			 * +			 *  \see \c REQDIR_* macros for masks indicating the request data direction. +			 */ +			#define CONTROL_REQTYPE_DIRECTION  0x80 + +			/** Mask for the request type parameter, to indicate the type of request (Device, Class or Vendor +			 *  Specific). The result of this mask should then be compared to the request type masks. +			 * +			 *  \see \c REQTYPE_* macros for masks indicating the request type. +			 */ +			#define CONTROL_REQTYPE_TYPE       0x60 + +			/** Mask for the request type parameter, to indicate the recipient of the request (Device, Interface +			 *  Endpoint or Other). The result of this mask should then be compared to the request recipient +			 *  masks. +			 * +			 *  \see \c REQREC_* macros for masks indicating the request recipient. +			 */ +			#define CONTROL_REQTYPE_RECIPIENT  0x1F + +			/** \name Control Request Data Direction Masks */ +			//@{ +			/** Request data direction mask, indicating that the request data will flow from host to device. +			 * +			 *  \see \ref CONTROL_REQTYPE_DIRECTION macro. +			 */ +			#define REQDIR_HOSTTODEVICE        (0 << 7) + +			/** Request data direction mask, indicating that the request data will flow from device to host. +			 * +			 *  \see \ref CONTROL_REQTYPE_DIRECTION macro. +			 */ +			#define REQDIR_DEVICETOHOST        (1 << 7) +			//@} + +			/** \name Control Request Type Masks */ +			//@{ +			/** Request type mask, indicating that the request is a standard request. +			 * +			 *  \see \ref CONTROL_REQTYPE_TYPE macro. +			 */ +			#define REQTYPE_STANDARD           (0 << 5) + +			/** Request type mask, indicating that the request is a class-specific request. +			 * +			 *  \see \ref CONTROL_REQTYPE_TYPE macro. +			 */ +			#define REQTYPE_CLASS              (1 << 5) + +			/** Request type mask, indicating that the request is a vendor specific request. +			 * +			 *  \see \ref CONTROL_REQTYPE_TYPE macro. +			 */ +			#define REQTYPE_VENDOR             (2 << 5) +			//@} + +			/** \name Control Request Recipient Masks */ +			//@{ +			/** Request recipient mask, indicating that the request is to be issued to the device as a whole. +			 * +			 *  \see \ref CONTROL_REQTYPE_RECIPIENT macro. +			 */ +			#define REQREC_DEVICE              (0 << 0) + +			/** Request recipient mask, indicating that the request is to be issued to an interface in the +			 *  currently selected configuration. +			 * +			 *  \see \ref CONTROL_REQTYPE_RECIPIENT macro. +			 */ +			#define REQREC_INTERFACE           (1 << 0) + +			/** Request recipient mask, indicating that the request is to be issued to an endpoint in the +			 *  currently selected configuration. +			 * +			 *  \see \ref CONTROL_REQTYPE_RECIPIENT macro. +			 */ +			#define REQREC_ENDPOINT            (2 << 0) + +			/** Request recipient mask, indicating that the request is to be issued to an unspecified element +			 *  in the currently selected configuration. +			 * +			 *  \see \ref CONTROL_REQTYPE_RECIPIENT macro. +			 */ +			#define REQREC_OTHER               (3 << 0) +			//@} + +		/* Type Defines: */ +			/** \brief Standard USB Control Request +			 * +			 *  Type define for a standard USB control request. +			 * +			 *  \see The USB 2.0 specification for more information on standard control requests. +			 */ +			typedef struct +			{ +				uint8_t  bmRequestType; /**< Type of the request. */ +				uint8_t  bRequest; /**< Request command code. */ +				uint16_t wValue; /**< wValue parameter of the request. */ +				uint16_t wIndex; /**< wIndex parameter of the request. */ +				uint16_t wLength; /**< Length of the data to transfer in bytes. */ +			} ATTR_PACKED USB_Request_Header_t; + +		/* Enums: */ +			/** Enumeration for the various standard request commands. These commands are applicable when the +			 *  request type is \ref REQTYPE_STANDARD (with the exception of \ref REQ_GetDescriptor, which is always +			 *  handled regardless of the request type value). +			 * +			 *  \see Chapter 9 of the USB 2.0 Specification. +			 */ +			enum USB_Control_Request_t +			{ +				REQ_GetStatus           = 0, /**< Implemented in the library for device and endpoint recipients. Passed +				                              *   to the user application for other recipients via the +				                              *   \ref EVENT_USB_Device_ControlRequest() event when received in +				                              *   device mode. */ +				REQ_ClearFeature        = 1, /**< Implemented in the library for device and endpoint recipients. Passed +				                              *   to the user application for other recipients via the +				                              *   \ref EVENT_USB_Device_ControlRequest() event when received in +				                              *   device mode. */ +				REQ_SetFeature          = 3, /**< Implemented in the library for device and endpoint recipients. Passed +				                              *   to the user application for other recipients via the +				                              *   \ref EVENT_USB_Device_ControlRequest() event when received in +				                              *   device mode. */ +				REQ_SetAddress          = 5, /**< Implemented in the library for the device recipient. Passed +				                              *   to the user application for other recipients via the +				                              *   \ref EVENT_USB_Device_ControlRequest() event when received in +				                              *   device mode. */ +				REQ_GetDescriptor       = 6, /**< Implemented in the library for device and interface recipients. Passed to the +				                              *   user application for other recipients via the +				                              *   \ref EVENT_USB_Device_ControlRequest() event when received in +				                              *   device mode. */ +				REQ_SetDescriptor       = 7, /**< Not implemented in the library, passed to the user application +				                              *   via the \ref EVENT_USB_Device_ControlRequest() event when received in +				                              *   device mode. */ +				REQ_GetConfiguration    = 8, /**< Implemented in the library for the device recipient. Passed +				                              *   to the user application for other recipients via the +				                              *   \ref EVENT_USB_Device_ControlRequest() event when received in +				                              *   device mode. */ +				REQ_SetConfiguration    = 9, /**< Implemented in the library for the device recipient. Passed +				                              *   to the user application for other recipients via the +				                              *   \ref EVENT_USB_Device_ControlRequest() event when received in +				                              *   device mode. */ +				REQ_GetInterface        = 10, /**< Not implemented in the library, passed to the user application +				                              *   via the \ref EVENT_USB_Device_ControlRequest() event when received in +				                              *   device mode. */ +				REQ_SetInterface        = 11, /**< Not implemented in the library, passed to the user application +				                              *   via the \ref EVENT_USB_Device_ControlRequest() event when received in +				                              *   device mode. */ +				REQ_SynchFrame          = 12, /**< Not implemented in the library, passed to the user application +				                              *   via the \ref EVENT_USB_Device_ControlRequest() event when received in +				                              *   device mode. */ +			}; + +			/** Feature Selector values for Set Feature and Clear Feature standard control requests directed to the device, interface +			 *  and endpoint recipients. +			 */ +			enum USB_Feature_Selectors_t +			{ +				FEATURE_SEL_EndpointHalt       = 0x00, /**< Feature selector for Clear Feature or Set Feature commands. When +				                                        *   used in a Set Feature or Clear Feature request this indicates that an +				                                        *   endpoint (whose address is given elsewhere in the request) should have +				                                        *   its stall condition changed. +				                                        */ +				FEATURE_SEL_DeviceRemoteWakeup = 0x01, /**< Feature selector for Device level Remote Wakeup enable set or clear. +			                                            *   This feature can be controlled by the host on devices which indicate +			                                            *   remote wakeup support in their descriptors to selectively disable or +			                                            *   enable remote wakeup. +			                                            */ +				FEATURE_SEL_TestMode           = 0x02, /**< Feature selector for Test Mode features, used to test the USB controller +			                                            *   to check for incorrect operation. +			                                            */ +			}; + +	/* Private Interface - For use in library only: */ +		#if !defined(__DOXYGEN__) +			/* Macros: */ +				#define FEATURE_SELFPOWERED_ENABLED     (1 << 0) +				#define FEATURE_REMOTE_WAKEUP_ENABLED   (1 << 1) +		#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Device_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Device_UC3.c new file mode 100644 index 0000000000..3aa1433f53 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Device_UC3.c @@ -0,0 +1,51 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_UC3) + +#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 + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Device_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Device_UC3.h new file mode 100644 index 0000000000..fd6dbde887 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Device_UC3.h @@ -0,0 +1,267 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Device definitions for the 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 - please 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 function should only be used if the device has indicated to the host that it +			 *        supports the Remote Wakeup feature in the device descriptors, and should only be +			 *        issued if the host is currently allowing remote wakeup events from the device (i.e., +			 *        the \ref USB_Device_RemoteWakeupEnabled flag is set). When the \c NO_DEVICE_REMOTE_WAKEUP +			 *        compile time option is used, this function is unavailable. +			 * +			 *  \note The USB clock must be running for this function to operate. If the stack is initialized with +			 *        the \ref USB_OPT_MANUAL_PLL option enabled, the user must ensure that the PLL is running +			 *        before attempting to call this function. +			 * +			 *  \see \ref Group_StdDescriptors for more information on the RMWAKEUP feature and device descriptors. +			 */ +			void USB_Device_SendRemoteWakeup(void); + +		/* Inline Functions: */ +			/** Returns the current USB frame number, when in device mode. Every millisecond the USB bus is active (i.e. enumerated to a host) +			 *  the frame number is incremented by one. +			 * +			 *  \return Current USB frame number from the USB controller. +			 */ +			static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint16_t USB_Device_GetFrameNumber(void) +			{ +				return 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; +			} + +			static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; +			static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) +			{ +				(void)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/lib/lufa/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.c new file mode 100644 index 0000000000..04f6e97d65 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.c @@ -0,0 +1,235 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_UC3) + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../USBMode.h" + +#if defined(USB_CAN_BE_DEVICE) + +#include "EndpointStream_UC3.h" + +#if !defined(CONTROL_ONLY_DEVICE) +uint8_t Endpoint_Discard_Stream(uint16_t Length, +                                uint16_t* const BytesProcessed) +{ +	uint8_t  ErrorCode; +	uint16_t BytesInTransfer = 0; + +	if ((ErrorCode = Endpoint_WaitUntilReady())) +	  return ErrorCode; + +	if (BytesProcessed != NULL) +	  Length -= *BytesProcessed; + +	while (Length) +	{ +		if (!(Endpoint_IsReadWriteAllowed())) +		{ +			Endpoint_ClearOUT(); + +			if (BytesProcessed != NULL) +			{ +				*BytesProcessed += BytesInTransfer; +				return ENDPOINT_RWSTREAM_IncompleteTransfer; +			} + +			if ((ErrorCode = Endpoint_WaitUntilReady())) +			  return ErrorCode; +		} +		else +		{ +			Endpoint_Discard_8(); + +			Length--; +			BytesInTransfer++; +		} +	} + +	return ENDPOINT_RWSTREAM_NoError; +} + +uint8_t Endpoint_Null_Stream(uint16_t Length, +                             uint16_t* const BytesProcessed) +{ +	uint8_t  ErrorCode; +	uint16_t BytesInTransfer = 0; + +	if ((ErrorCode = Endpoint_WaitUntilReady())) +	  return ErrorCode; + +	if (BytesProcessed != NULL) +	  Length -= *BytesProcessed; + +	while (Length) +	{ +		if (!(Endpoint_IsReadWriteAllowed())) +		{ +			Endpoint_ClearIN(); + +			if (BytesProcessed != NULL) +			{ +				*BytesProcessed += BytesInTransfer; +				return ENDPOINT_RWSTREAM_IncompleteTransfer; +			} + +			if ((ErrorCode = Endpoint_WaitUntilReady())) +			  return ErrorCode; +		} +		else +		{ +			Endpoint_Write_8(0); + +			Length--; +			BytesInTransfer++; +		} +	} + +	return ENDPOINT_RWSTREAM_NoError; +} + +/* The following abuses the C preprocessor in order to copy-paste common code with slight alterations, + * so that the code needs to be written once. It is a crude form of templating to reduce code maintenance. */ + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_LE +#define  TEMPLATE_BUFFER_TYPE                      const void* +#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr) +#include "Template/Template_Endpoint_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_BE +#define  TEMPLATE_BUFFER_TYPE                      const void* +#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr) +#include "Template/Template_Endpoint_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_LE +#define  TEMPLATE_BUFFER_TYPE                      void* +#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT() +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8() +#include "Template/Template_Endpoint_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_BE +#define  TEMPLATE_BUFFER_TYPE                      void* +#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT() +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8() +#include "Template/Template_Endpoint_RW.c" + +#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE) +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_LE +	#define  TEMPLATE_BUFFER_TYPE                      const void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_RW.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_BE +	#define  TEMPLATE_BUFFER_TYPE                      const void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_RW.c" +#endif + +#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE) +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_LE +	#define  TEMPLATE_BUFFER_TYPE                      const void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_RW.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_BE +	#define  TEMPLATE_BUFFER_TYPE                      const void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_RW.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_LE +	#define  TEMPLATE_BUFFER_TYPE                      void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8()) +	#include "Template/Template_Endpoint_RW.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_BE +	#define  TEMPLATE_BUFFER_TYPE                      void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8()) +	#include "Template/Template_Endpoint_RW.c" +#endif + +#endif + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_LE +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr) +#include "Template/Template_Endpoint_Control_W.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_BE +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr) +#include "Template/Template_Endpoint_Control_W.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_LE +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8() +#include "Template/Template_Endpoint_Control_R.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_BE +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8() +#include "Template/Template_Endpoint_Control_R.c" + +#endif + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.h new file mode 100644 index 0000000000..8b1c10eb09 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/EndpointStream_UC3.h @@ -0,0 +1,438 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Endpoint data stream transmission and reception management for the AVR32 UC3 microcontrollers. + *  \copydetails Group_EndpointStreamRW_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_EndpointStreamRW + *  \defgroup Group_EndpointStreamRW_UC3 Read/Write of Multi-Byte Streams (UC3) + *  \brief Endpoint data stream transmission and reception management for the Atmel AVR32 UC3 architecture. + * + *  Functions, macros, variables, enums and types related to data reading and writing of data streams from + *  and to endpoints. + * + *  @{ + */ + +#ifndef __ENDPOINT_STREAM_UC3_H__ +#define __ENDPOINT_STREAM_UC3_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../USBMode.h" +		#include "../USBTask.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_USB_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Function Prototypes: */ +			/** \name Stream functions for null data */ +			//@{ + +			/** Reads and discards the given number of bytes from the currently selected endpoint's bank, +			 *  discarding fully read packets from the host as needed. The last packet is not automatically +			 *  discarded once the remaining bytes has been read; the user is responsible for manually +			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the endpoint bank becomes empty while there is still data to process (and after the current +			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number +			 *  of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Endpoint_Discard_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Endpoint_Discard_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[in] Length          Number of bytes to discard via the currently selected endpoint. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Discard_Stream(uint16_t Length, +			                                uint16_t* const BytesProcessed); + +			/** Writes a given number of zeroed bytes to the currently selected endpoint's bank, sending +			 *  full packets to the host as needed. The last packet is not automatically sent once the +			 *  remaining bytes have been written; the user is responsible for manually sending the last +			 *  packet to the host via the \ref Endpoint_ClearIN() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the endpoint bank becomes full while there is still data to process (and after the current +			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the +			 *  total number of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Endpoint_Null_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Endpoint_Null_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[in] Length          Number of zero bytes to send via the currently selected endpoint. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Null_Stream(uint16_t Length, +			                             uint16_t* const BytesProcessed); + +			//@} + +			/** \name Stream functions for RAM source/destination data */ +			//@{ + +			/** Writes the given number of bytes to the endpoint from the given buffer in little endian, +			 *  sending full packets to the host as needed. The last packet filled is not automatically sent; +			 *  the user is responsible for manually sending the last written packet to the host via the +			 *  \ref Endpoint_ClearIN() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the endpoint bank becomes full while there is still data to process (and after the current +			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the +			 *  total number of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t DataStream[512]; +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream), +			 *                                            NULL)) != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  DataStream[512]; +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream), +			 *                                               &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Stream_LE(const void* const Buffer, +			                                 uint16_t Length, +			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Writes the given number of bytes to the endpoint from the given buffer in big endian, +			 *  sending full packets to the host as needed. The last packet filled is not automatically sent; +			 *  the user is responsible for manually sending the last written packet to the host via the +			 *  \ref Endpoint_ClearIN() macro. +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Stream_BE(const void* const Buffer, +			                                 uint16_t Length, +			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the endpoint from the given buffer in little endian, +			 *  discarding fully read packets from the host as needed. The last packet is not automatically +			 *  discarded once the remaining bytes has been read; the user is responsible for manually +			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the endpoint bank becomes empty while there is still data to process (and after the current +			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number +			 *  of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t DataStream[512]; +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream), +			 *                                           NULL)) != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  DataStream[512]; +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream), +			 *                                              &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[out] Buffer          Pointer to the destination data buffer to write to. +			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                              transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Stream_LE(void* const Buffer, +			                                uint16_t Length, +			                                uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the endpoint from the given buffer in big endian, +			 *  discarding fully read packets from the host as needed. The last packet is not automatically +			 *  discarded once the remaining bytes has been read; the user is responsible for manually +			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro. +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[out] Buffer          Pointer to the destination data buffer to write to. +			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                              transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Stream_BE(void* const Buffer, +			                                uint16_t Length, +			                                uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in little endian, +			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared +			 *  in both failure and success states; the user is responsible for manually clearing the status OUT packet +			 *  to finalize the transfer's status stage via the \ref Endpoint_ClearOUT() macro. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[in] Buffer  Pointer to the source data buffer to read from. +			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Control_Stream_LE(const void* const Buffer, +			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in big endian, +			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared +			 *  in both failure and success states; the user is responsible for manually clearing the status OUT packet +			 *  to finalize the transfer's status stage via the \ref Endpoint_ClearOUT() macro. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[in] Buffer  Pointer to the source data buffer to read from. +			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Control_Stream_BE(const void* const Buffer, +			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in little endian, +			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not +			 *  automatically sent after success or failure states; the user is responsible for manually sending the +			 *  status IN packet to finalize the transfer's status stage via the \ref Endpoint_ClearIN() macro. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[out] Buffer  Pointer to the destination data buffer to write to. +			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Control_Stream_LE(void* const Buffer, +			                                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in big endian, +			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not +			 *  automatically sent after success or failure states; the user is responsible for manually sending the +			 *  status IN packet to finalize the transfer's status stage via the \ref Endpoint_ClearIN() macro. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[out] Buffer  Pointer to the destination data buffer to write to. +			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Control_Stream_BE(void* const Buffer, +			                                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); +			//@} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c new file mode 100644 index 0000000000..7e24672c50 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.c @@ -0,0 +1,196 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_UC3) + +#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_Endpoint_SelectedEndpoint = ENDPOINT_CONTROLEP; +volatile uint8_t* USB_Endpoint_FIFOPos[ENDPOINT_TOTAL_ENDPOINTS]; + +bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, +                                     const uint8_t Entries) +{ +	for (uint8_t i = 0; i < Entries; i++) +	{ +		if (!(Table[i].Address)) +		  continue; + +		if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) +		{ +			return false; +		} +	} + +	return true; +} + +bool Endpoint_ConfigureEndpoint_Prv(const uint8_t Number, +                                    const uint32_t UECFG0Data) +{ +	USB_Endpoint_FIFOPos[Number] = &AVR32_USBB_SLAVE[Number * ENDPOINT_HSB_ADDRESS_SPACE_SIZE]; + +#if defined(CONTROL_ONLY_DEVICE) || defined(ORDERED_EP_CONFIG) +	Endpoint_SelectEndpoint(Number); +	Endpoint_EnableEndpoint(); + +	(&AVR32_USBB.uecfg0)[Number] = 0; +	(&AVR32_USBB.uecfg0)[Number] = UECFG0Data; + +	return Endpoint_IsConfigured(); +#else +	for (uint8_t EPNum = Number; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) +	{ +		uint32_t UECFG0Temp; + +		Endpoint_SelectEndpoint(EPNum); + +		if (EPNum == Number) +		{ +			UECFG0Temp = UECFG0Data; +		} +		else +		{ +			UECFG0Temp = (&AVR32_USBB.uecfg0)[EPNum]; +		} + +		if (!(UECFG0Temp & AVR32_USBB_ALLOC_MASK)) +		  continue; + +		Endpoint_DisableEndpoint(); +		(&AVR32_USBB.uecfg0)[EPNum] &= ~AVR32_USBB_ALLOC_MASK; + +		Endpoint_EnableEndpoint(); +		(&AVR32_USBB.uecfg0)[EPNum] = UECFG0Temp; + +		if (!(Endpoint_IsConfigured())) +		  return false; +	} + +	Endpoint_SelectEndpoint(Number); +	return true; +#endif +} + +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_Endpoint_FIFOPos[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 + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h new file mode 100644 index 0000000000..32d6a9b768 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Endpoint_UC3.h @@ -0,0 +1,794 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Endpoint definitions for the 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_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_Endpoint_SelectedEndpoint; +			extern volatile uint8_t* USB_Endpoint_FIFOPos[]; +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			#if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__)) +				/** Default size of the default control endpoint's bank, until altered by the control endpoint bank size +				 *  value in the device descriptor. Not available if the \c FIXED_CONTROL_ENDPOINT_SIZE token is defined. +				 */ +				#define ENDPOINT_CONTROLEP_DEFAULT_SIZE     8 +			#endif + +			#if !defined(CONTROL_ONLY_DEVICE) || defined(__DOXYGEN__) +				#if defined(USB_SERIES_UC3A3_AVR32) || defined(USB_SERIES_UC3A4_AVR32) +					#define ENDPOINT_TOTAL_ENDPOINTS        8 +				#else +					/** 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        7 +				#endif +			#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 address with the given endpoint type, bank size and number of hardware +			 *  banks. Once configured, the endpoint may be read from or written to, depending on its direction. +			 * +			 *  \param[in] Address    Endpoint address to configure. +			 * +			 *  \param[in] Type       Type of endpoint to configure, a \c EP_TYPE_* mask. Not all endpoint types +			 *                        are available on Low Speed USB devices - refer to the USB 2.0 specification. +			 * +			 *  \param[in] Size       Size of the endpoint's bank, where packets are stored before they are transmitted +			 *                        to the USB host, or after they have been received from the USB host (depending on +			 *                        the endpoint's data direction). The bank size must indicate the maximum packet size +			 *                        that the endpoint can handle. +			 * +			 *  \param[in] Banks      Number of hardware banks to use for the endpoint being configured. +			 * +			 *  \attention 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. +			 * +			 *  \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 Address, +			                                              const uint8_t Type, +			                                              const uint16_t Size, +			                                              const uint8_t Banks) ATTR_ALWAYS_INLINE; +			static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, +			                                              const uint8_t Type, +			                                              const uint16_t Size, +			                                              const uint8_t Banks) +			{ +				uint8_t Number = (Address & ENDPOINT_EPNUM_MASK); + +				if (Number >= ENDPOINT_TOTAL_ENDPOINTS) +				  return false; + +				return Endpoint_ConfigureEndpoint_Prv(Number, +				                                      (AVR32_USBB_ALLOC_MASK | +				                                       ((uint32_t)Type << AVR32_USBB_EPTYPE_OFFSET) | +				                                       ((Address & ENDPOINT_DIR_IN) ? AVR32_USBB_UECFG0_EPDIR_MASK : 0) | +				                                       ((Banks > 1) ? AVR32_USBB_UECFG0_EPBK_SINGLE : AVR32_USBB_UECFG0_EPBK_DOUBLE) | +				                                       Endpoint_BytesToEPSizeMask(Size))); +			} + +			/** Indicates the number of bytes currently stored in the current endpoint's selected bank. +			 * +			 *  \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_Endpoint_SelectedEndpoint].byct; +			} + +			/** 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_Endpoint_SelectedEndpoint].epdir ? ENDPOINT_DIR_IN : ENDPOINT_DIR_OUT); +			} + +			/** Get the endpoint address of the currently selected endpoint. This is typically used to save +			 *  the currently selected endpoint so that it can be restored after another endpoint has been +			 *  manipulated. +			 * +			 *  \return Index of the currently selected endpoint. +			 */ +			static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline uint8_t Endpoint_GetCurrentEndpoint(void) +			{ +				return (USB_Endpoint_SelectedEndpoint | Endpoint_GetEndpointDirection()); +			} + +			/** Selects the given endpoint address. +			 * +			 *  Any endpoint operations which do not require the endpoint address to be indicated will operate on +			 *  the currently selected endpoint. +			 * +			 *  \param[in] Address  Endpoint address to select. +			 */ +			static inline void Endpoint_SelectEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_SelectEndpoint(const uint8_t Address) +			{ +				USB_Endpoint_SelectedEndpoint = (Address & ENDPOINT_EPNUM_MASK); +			} + +			/** Resets the endpoint bank FIFO. This clears all the endpoint banks and resets the USB controller's +			 *  data In and Out pointers to the bank's contents. +			 * +			 *  \param[in] Address  Endpoint number whose FIFO buffers are to be reset. +			 */ +			static inline void Endpoint_ResetEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_ResetEndpoint(const uint8_t Address) +			{ +				uint32_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK); + +				AVR32_USBB.uerst |=  (AVR32_USBB_EPRST0_MASK << EndpointNumber); +				AVR32_USBB.uerst &= ~(AVR32_USBB_EPRST0_MASK << EndpointNumber); +				USB_Endpoint_FIFOPos[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_Endpoint_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_Endpoint_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_Endpoint_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_Endpoint_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_Endpoint_SelectedEndpoint].killbks = true; +					while ((&AVR32_USBB.UECON0)[USB_Endpoint_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_Endpoint_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_Endpoint_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 uint32_t Endpoint_GetEndpointInterrupts(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline uint32_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] Address  Address 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 Address) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool Endpoint_HasEndpointInterrupted(const uint8_t Address) +			{ +				return ((Endpoint_GetEndpointInterrupts() & (AVR32_USBB_EP0INT_MASK << (Address & ENDPOINT_EPNUM_MASK))) ? 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_Endpoint_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_Endpoint_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_Endpoint_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_Endpoint_SelectedEndpoint].rxstpic = true; +				USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint] = &AVR32_USBB_SLAVE[USB_Endpoint_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_Endpoint_SelectedEndpoint].txinic   = true; +				(&AVR32_USBB.UECON0CLR)[USB_Endpoint_SelectedEndpoint].fifoconc = true; +				USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint] = &AVR32_USBB_SLAVE[USB_Endpoint_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_Endpoint_SelectedEndpoint].rxoutic  = true; +				(&AVR32_USBB.UECON0CLR)[USB_Endpoint_SelectedEndpoint].fifoconc = true; +				USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint] = &AVR32_USBB_SLAVE[USB_Endpoint_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_Endpoint_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_Endpoint_SelectedEndpoint].stallrqc = true; +			} + +			/** Determines if the currently selected endpoint is stalled, \c 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_Endpoint_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_Endpoint_SelectedEndpoint].rstdts = true; +			} + +			/** 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_Endpoint_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_Endpoint_FIFOPos[USB_Endpoint_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_Endpoint_FIFOPos[USB_Endpoint_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_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); + +				(void)Dummy; +			} + +			/** 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 Byte0 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); +				uint16_t Byte1 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); + +				return ((Byte1 << 8) | Byte0); +			} + +			/** Reads two bytes from the currently selected endpoint's bank in big endian format, for OUT +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_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_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); +				uint16_t Byte1 = *(USB_Endpoint_FIFOPos[USB_Endpoint_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_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data & 0xFF); +				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 8); +			} + +			/** 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_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 8); +				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data & 0xFF); +			} + +			/** 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_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); +				Dummy = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); + +				(void)Dummy; +			} + +			/** 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 Byte0 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); +				uint32_t Byte1 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); +				uint32_t Byte2 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); +				uint32_t Byte3 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); + +				return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0); +			} + +			/** Reads four bytes from the currently selected endpoint's bank in big endian format, for OUT +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_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_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); +				uint32_t Byte1 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); +				uint32_t Byte2 = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); +				uint32_t Byte3 = *(USB_Endpoint_FIFOPos[USB_Endpoint_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_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data &  0xFF); +				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 8); +				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 16); +				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 24); +			} + +			/** 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_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 24); +				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 16); +				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data >> 8); +				*(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++) = (Data &  0xFF); +			} + +			/** 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_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); +				Dummy = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); +				Dummy = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); +				Dummy = *(USB_Endpoint_FIFOPos[USB_Endpoint_SelectedEndpoint]++); + +				(void)Dummy; +			} + +		/* External Variables: */ +			/** Global indicating the maximum packet size of the default control endpoint located at address +			 *  0 in the device. This value is set to the value indicated in the device descriptor in the user +			 *  project once the USB interface is initialized into device mode. +			 * +			 *  If space is an issue, it is possible to fix this to a static value by defining the control +			 *  endpoint size in the \c FIXED_CONTROL_ENDPOINT_SIZE token passed to the compiler in the makefile +			 *  via the -D switch. When a fixed control endpoint size is used, the size is no longer dynamically +			 *  read from the descriptors at runtime and instead fixed to the given value. When used, it is +			 *  important that the descriptor control endpoint size value matches the size given as the +			 *  \c FIXED_CONTROL_ENDPOINT_SIZE token - it is recommended that the \c FIXED_CONTROL_ENDPOINT_SIZE token +			 *  be used in the device descriptors to ensure this. +			 * +			 *  \attention This variable should be treated as read-only in the user application, and never manually +			 *             changed in value. +			 */ +			#if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__)) +				extern uint8_t USB_Device_ControlEndpointSize; +			#else +				#define USB_Device_ControlEndpointSize FIXED_CONTROL_ENDPOINT_SIZE +			#endif + +		/* Function Prototypes: */ +			/** Configures a table of endpoint descriptions, in sequence. This function can be used to configure multiple +			 *  endpoints at the same time. +			 * +			 *  \note Endpoints with a zero address will be ignored, thus this function cannot be used to configure the +			 *        control endpoint. +			 * +			 *  \param[in] Table    Pointer to a table of endpoint descriptions. +			 *  \param[in] Entries  Number of entries in the endpoint table to configure. +			 * +			 *  \return Boolean \c true if all endpoints configured successfully, \c false otherwise. +			 */ +			bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, +			                                     const uint8_t Entries); + +			/** Completes the status stage of a control transfer on a CONTROL type endpoint automatically, +			 *  with respect to the data direction. This is a convenience function which can be used to +			 *  simplify user control request handling. +			 * +			 *  \note This routine should not be called on non CONTROL type endpoints. +			 */ +			void Endpoint_ClearStatusStage(void); + +			/** Spin-loops until the currently selected non-control endpoint is ready for the next packet of data +			 *  to be read or written to it. +			 * +			 *  \note This routine should not be called on CONTROL type endpoints. +			 * +			 *  \ingroup Group_EndpointRW_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/lib/lufa/LUFA/Drivers/USB/Core/UC3/Host_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Host_UC3.c new file mode 100644 index 0000000000..2c182ab69c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Host_UC3.c @@ -0,0 +1,297 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_UC3) + +#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(); + +				#if defined(NO_AUTO_VBUS_MANAGEMENT) +				USB_Host_VBUS_Manual_Enable(); +				USB_Host_VBUS_Manual_On(); +				#endif + +				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: +			if (!(Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL, ENDPOINT_CONTROLEP, PIPE_CONTROLPIPE_DEFAULT_SIZE, 1))) +			{ +				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]; + +			Pipe_SelectPipe(PIPE_CONTROLPIPE); +			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: +			if (!(Pipe_ConfigurePipe(PIPE_CONTROLPIPE, EP_TYPE_CONTROL, ENDPOINT_CONTROLEP, USB_Host_ControlPipeSize, 1))) +			{ +				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; + +		default: +			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()) +		{ +			Pipe_ClearError(); +			ErrorCode = HOST_WAITERROR_PipeError; + +			break; +		} + +		if (Pipe_IsStalled()) +		{ +			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 + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Host_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Host_UC3.h new file mode 100644 index 0000000000..5338f72089 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Host_UC3.h @@ -0,0 +1,363 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB 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(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. +			 * +			 *  \return Current USB frame number from the USB controller. +			 */ +			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 This function is 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 This function is not available when the \c 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, \c 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/lib/lufa/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.c new file mode 100644 index 0000000000..27426ada0b --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.c @@ -0,0 +1,166 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_UC3) + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../USBMode.h" + +#if defined(USB_CAN_BE_HOST) + +#include "PipeStream_UC3.h" + +uint8_t Pipe_Discard_Stream(uint16_t Length, +                            uint16_t* const BytesProcessed) +{ +	uint8_t  ErrorCode; +	uint16_t BytesInTransfer = 0; + +	Pipe_SetPipeToken(PIPE_TOKEN_IN); + +	if ((ErrorCode = Pipe_WaitUntilReady())) +	  return ErrorCode; + +	if (BytesProcessed != NULL) +	  Length -= *BytesProcessed; + +	while (Length) +	{ +		if (!(Pipe_IsReadWriteAllowed())) +		{ +			Pipe_ClearIN(); + +			if (BytesProcessed != NULL) +			{ +				*BytesProcessed += BytesInTransfer; +				return PIPE_RWSTREAM_IncompleteTransfer; +			} + +			if ((ErrorCode = Pipe_WaitUntilReady())) +			  return ErrorCode; +		} +		else +		{ +			Pipe_Discard_8(); + +			Length--; +			BytesInTransfer++; +		} +	} + +	return PIPE_RWSTREAM_NoError; +} + +uint8_t Pipe_Null_Stream(uint16_t Length, +                         uint16_t* const BytesProcessed) +{ +	uint8_t  ErrorCode; +	uint16_t BytesInTransfer = 0; + +	Pipe_SetPipeToken(PIPE_TOKEN_OUT); + +	if ((ErrorCode = Pipe_WaitUntilReady())) +	  return ErrorCode; + +	if (BytesProcessed != NULL) +	  Length -= *BytesProcessed; + +	while (Length) +	{ +		if (!(Pipe_IsReadWriteAllowed())) +		{ +			Pipe_ClearOUT(); + +			if (BytesProcessed != NULL) +			{ +				*BytesProcessed += BytesInTransfer; +				return PIPE_RWSTREAM_IncompleteTransfer; +			} + +			USB_USBTask(); + +			if ((ErrorCode = Pipe_WaitUntilReady())) +			  return ErrorCode; +		} +		else +		{ +			Pipe_Write_8(0); + +			Length--; +			BytesInTransfer++; +		} +	} + +	return PIPE_RWSTREAM_NoError; +} + +/* The following abuses the C preprocessor in order to copy-paste common code with slight alterations, + * so that the code needs to be written once. It is a crude form of templating to reduce code maintenance. */ + +#define  TEMPLATE_FUNC_NAME                        Pipe_Write_Stream_LE +#define  TEMPLATE_BUFFER_TYPE                      const void* +#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT +#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT() +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(*BufferPtr) +#include "Template/Template_Pipe_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Pipe_Write_Stream_BE +#define  TEMPLATE_BUFFER_TYPE                      const void* +#define  TEMPLATE_TOKEN                            PIPE_TOKEN_OUT +#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearOUT() +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Pipe_Write_8(*BufferPtr) +#include "Template/Template_Pipe_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_LE +#define  TEMPLATE_BUFFER_TYPE                      void* +#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN +#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN() +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Pipe_Read_8() +#include "Template/Template_Pipe_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Pipe_Read_Stream_BE +#define  TEMPLATE_BUFFER_TYPE                      void* +#define  TEMPLATE_TOKEN                            PIPE_TOKEN_IN +#define  TEMPLATE_CLEAR_PIPE()                     Pipe_ClearIN() +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   DataStream -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Pipe_Read_8() +#include "Template/Template_Pipe_RW.c" + +#endif + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.h new file mode 100644 index 0000000000..cc34442084 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/PipeStream_UC3.h @@ -0,0 +1,352 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Pipe data stream transmission and reception management for the AVR32 UC3 microcontrollers. + *  \copydetails Group_PipeStreamRW_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_PipeStreamRW + *  \defgroup Group_PipeStreamRW_UC3 Read/Write of Multi-Byte Streams (UC3) + *  \brief Pipe data stream transmission and reception management for the Atmel AVR32 UC3 architecture. + * + *  Functions, macros, variables, enums and types related to data reading and writing of data streams from + *  and to pipes. + * + *  @{ + */ + +#ifndef __PIPE_STREAM_UC3_H__ +#define __PIPE_STREAM_UC3_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../USBMode.h" +		#include "../USBTask.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_USB_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Function Prototypes: */ +			/** \name Stream functions for null data */ +			//@{ + +			/** Reads and discards the given number of bytes from the pipe, discarding fully read packets from the host +			 *  as needed. The last packet is not automatically discarded once the remaining bytes has been read; the +			 *  user is responsible for manually discarding the last packet from the device via the \ref Pipe_ClearIN() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, failing or +			 *  succeeding as a single unit. If the BytesProcessed parameter points to a valid storage location, the transfer +			 *  will instead be performed as a series of chunks. Each time the pipe bank becomes empty while there is still data +			 *  to process (and after the current packet has been acknowledged) the BytesProcessed location will be updated with +			 *  the total number of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed in the user code - to +			 *  continue the transfer, call the function again with identical parameters and it will resume until the BytesProcessed +			 *  value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Pipe_Discard_Stream(512, NULL)) != PIPE_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Pipe_Discard_Stream(512, &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != PIPE_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without +			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken(). +			 * +			 *  \param[in] Length          Number of bytes to discard via the currently selected pipe. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                             updated, \c NULL if the entire stream should be processed at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Discard_Stream(uint16_t Length, +			                            uint16_t* const BytesProcessed); + +			/** Writes a given number of zeroed bytes to the pipe, sending full pipe packets from the host to the device +			 *  as needed. The last packet is not automatically sent once the remaining bytes has been written; the +			 *  user is responsible for manually discarding the last packet from the device via the \ref Pipe_ClearOUT() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, failing or +			 *  succeeding as a single unit. If the BytesProcessed parameter points to a valid storage location, the transfer +			 *  will instead be performed as a series of chunks. Each time the pipe bank becomes full while there is still data +			 *  to process (and after the current packet transmission has been initiated) the BytesProcessed location will be +			 *  updated with the total number of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed in the user code - to +			 *  continue the transfer, call the function again with identical parameters and it will resume until the BytesProcessed +			 *  value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Pipe_Null_Stream(512, NULL)) != PIPE_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Pipe_Null_Stream(512, &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != PIPE_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without +			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken(). +			 * +			 *  \param[in] Length          Number of zero bytes to write via the currently selected pipe. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                             updated, \c NULL if the entire stream should be processed at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Null_Stream(uint16_t Length, +			                         uint16_t* const BytesProcessed); + +			//@} + +			/** \name Stream functions for RAM source/destination data */ +			//@{ + +			/** Writes the given number of bytes to the pipe from the given buffer in little endian, +			 *  sending full packets to the device as needed. The last packet filled is not automatically sent; +			 *  the user is responsible for manually sending the last written packet to the host via the +			 *  \ref Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is +			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the pipe bank becomes full while there is still data to process (and after the current +			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the +			 *  total number of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t DataStream[512]; +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Pipe_Write_Stream_LE(DataStream, sizeof(DataStream), +			 *                                        NULL)) != PIPE_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  DataStream[512]; +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Pipe_Write_Stream_LE(DataStream, sizeof(DataStream), +			 *                                           &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != PIPE_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without +			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken(). +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                             updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Write_Stream_LE(const void* const Buffer, +			                             uint16_t Length, +			                             uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Writes the given number of bytes to the pipe from the given buffer in big endian, +			 *  sending full packets to the device as needed. The last packet filled is not automatically sent; +			 *  the user is responsible for manually sending the last written packet to the host via the +			 *  \ref Pipe_ClearOUT() macro. Between each USB packet, the given stream callback function is +			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. +			 * +			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without +			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken(). +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected pipe into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                             updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Write_Stream_BE(const void* const Buffer, +			                             uint16_t Length, +			                             uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the pipe into the given buffer in little endian, +			 *  sending full packets to the device as needed. The last packet filled is not automatically sent; +			 *  the user is responsible for manually sending the last written packet to the host via the +			 *  \ref Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is +			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the pipe bank becomes empty while there is still data to process (and after the current +			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number +			 *  of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref PIPE_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t DataStream[512]; +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Pipe_Read_Stream_LE(DataStream, sizeof(DataStream), +			 *                                       NULL)) != PIPE_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  DataStream[512]; +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Pipe_Read_Stream_LE(DataStream, sizeof(DataStream), +			 *                                          &BytesProcessed)) == PIPE_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != PIPE_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without +			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken(). +			 * +			 *  \param[out] Buffer          Pointer to the source data buffer to write to. +			 *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                              updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Read_Stream_LE(void* const Buffer, +			                            uint16_t Length, +			                            uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the pipe into the given buffer in big endian, +			 *  sending full packets to the device as needed. The last packet filled is not automatically sent; +			 *  the user is responsible for manually sending the last written packet to the host via the +			 *  \ref Pipe_ClearIN() macro. Between each USB packet, the given stream callback function is +			 *  executed repeatedly until the next packet is ready, allowing for early aborts of stream transfers. +			 * +			 *  \note The pipe token is set automatically, thus this can be used on bi-directional pipes directly without +			 *        having to explicitly change the data direction with a call to \ref Pipe_SetPipeToken(). +			 * +			 *  \param[out] Buffer          Pointer to the source data buffer to write to. +			 *  \param[in]  Length          Number of bytes to read for the currently selected pipe to read from. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes already processed should +			 *                              updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Pipe_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Pipe_Read_Stream_BE(void* const Buffer, +			                            uint16_t Length, +			                            uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); +			//@} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c new file mode 100644 index 0000000000..73cf360783 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.c @@ -0,0 +1,209 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_UC3) + +#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_Pipe_SelectedPipe = PIPE_CONTROLPIPE; +volatile uint8_t* USB_Pipe_FIFOPos[PIPE_TOTAL_PIPES]; + +bool Pipe_ConfigurePipeTable(const USB_Pipe_Table_t* const Table, +                             const uint8_t Entries) +{ +	for (uint8_t i = 0; i < Entries; i++) +	{ +		if (!(Table[i].Address)) +		  continue; + +		if (!(Pipe_ConfigurePipe(Table[i].Address, Table[i].Type, Table[i].EndpointAddress, Table[i].Size, Table[i].Banks))) +		{ +			return false; +		} +	} + +	return true; +} + +bool Pipe_ConfigurePipe(const uint8_t Address, +                        const uint8_t Type, +                        const uint8_t EndpointAddress, +                        const uint16_t Size, +                        const uint8_t Banks) +{ +	uint8_t Number = (Address & PIPE_EPNUM_MASK); +	uint8_t Token  = (Address & PIPE_DIR_IN) ? PIPE_TOKEN_IN : PIPE_TOKEN_OUT; + +	if (Number >= PIPE_TOTAL_PIPES) +	  return false; + +	if (Type == EP_TYPE_CONTROL) +	  Token = PIPE_TOKEN_SETUP; + +	USB_Pipe_FIFOPos[Number]     = &AVR32_USBB_SLAVE[Number * PIPE_HSB_ADDRESS_SPACE_SIZE]; + +#if defined(ORDERED_EP_CONFIG) +	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) | +	                                ((Banks > 1) ? AVR32_USBB_PBK_MASK : 0)       | +	                                Pipe_BytesToEPSizeMask(Size) | +	                                ((uint32_t)Number << AVR32_USBB_PEPNUM_OFFSET)); + +	Pipe_SetInfiniteINRequests(); + +	return Pipe_IsConfigured(); +#else +	for (uint8_t PNum = Number; PNum < PIPE_TOTAL_PIPES; PNum++) +	{ +		uint32_t UPCFG0Temp; + +		Pipe_SelectPipe(PNum); + +		if (PNum == Number) +		{ +			UPCFG0Temp = (AVR32_USBB_ALLOC_MASK | +			              ((uint32_t)Type  << AVR32_USBB_PTYPE_OFFSET)  | +			              ((uint32_t)Token << AVR32_USBB_PTOKEN_OFFSET) | +			              ((Banks > 1) ? AVR32_USBB_PBK_MASK : 0)       | +			              Pipe_BytesToEPSizeMask(Size) | +			              ((EndpointAddress & PIPE_EPNUM_MASK) << AVR32_USBB_PEPNUM_OFFSET)); +		} +		else +		{ +			UPCFG0Temp = (&AVR32_USBB.upcfg0)[PNum]; +		} + +		if (!(UPCFG0Temp & AVR32_USBB_ALLOC_MASK)) +		  continue; + +		Pipe_DisablePipe(); +		(&AVR32_USBB.upcfg0)[PNum] &= ~AVR32_USBB_ALLOC_MASK; + +		Pipe_EnablePipe(); +		(&AVR32_USBB.upcfg0)[PNum] = UPCFG0Temp; + +		Pipe_SetInfiniteINRequests(); + +		if (!(Pipe_IsConfigured())) +		  return false; +	} + +	Pipe_SelectPipe(Number); +	return true; +#endif +} + +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_Pipe_FIFOPos[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 + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h new file mode 100644 index 0000000000..12e0dcd62d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Pipe_UC3.h @@ -0,0 +1,924 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB 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_Pipe_SelectedPipe; +			extern volatile uint8_t* USB_Pipe_FIFOPos[]; +	#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_SetPipeToken() and \ref Pipe_GetPipeToken(). 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_SetPipeToken() and \ref Pipe_GetPipeToken(). 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_SetPipeToken() and \ref Pipe_GetPipeToken(). 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 +			//@} + +			/** 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. +			 * +			 *  \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_Pipe_SelectedPipe].pbyct; +			} + +			/** Determines the currently selected pipe's direction. +			 * +			 *  \return The currently selected pipe's direction, as a \c PIPE_DIR_* mask. +			 */ +			static inline uint8_t Pipe_GetPipeDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline uint8_t Pipe_GetPipeDirection(void) +			{ +				return (((&AVR32_USBB.UPCFG0)[USB_Pipe_SelectedPipe].ptoken == PIPE_TOKEN_OUT) ? PIPE_DIR_OUT : PIPE_DIR_IN); +			} + +			/** 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_Pipe_SelectedPipe | Pipe_GetPipeDirection()); +			} + +			/** Selects the given pipe address. Any pipe operations which do not require the pipe address to be +			 *  indicated will operate on the currently selected pipe. +			 * +			 *  \param[in] Address  Address of the pipe to select. +			 */ +			static inline void Pipe_SelectPipe(const uint8_t Address) ATTR_ALWAYS_INLINE; +			static inline void Pipe_SelectPipe(const uint8_t Address) +			{ +				USB_Pipe_SelectedPipe = (Address & PIPE_EPNUM_MASK); +			} + +			/** Resets the desired pipe, including the pipe banks and flags. +			 * +			 *  \param[in] Address  Index of the pipe to reset. +			 */ +			static inline void Pipe_ResetPipe(const uint8_t Address) ATTR_ALWAYS_INLINE; +			static inline void Pipe_ResetPipe(const uint8_t Address) +			{ +				uint32_t PipeNumber = (Address & PIPE_EPNUM_MASK); + +				AVR32_USBB.uprst |=  (AVR32_USBB_PRST0_MASK << PipeNumber); +				AVR32_USBB.uprst &= ~(AVR32_USBB_PRST0_MASK << PipeNumber); +				USB_Pipe_FIFOPos[PipeNumber] = &AVR32_USBB_SLAVE[PipeNumber * 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_Pipe_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_Pipe_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_Pipe_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_Pipe_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_Pipe_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_Pipe_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_Pipe_SelectedPipe].inmode = false; +				(&AVR32_USBB.UPINRQ0)[USB_Pipe_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_Pipe_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_Pipe_SelectedPipe].pepnum | +				        ((Pipe_GetPipeToken() == PIPE_TOKEN_IN) ? PIPE_DIR_IN : PIPE_DIR_OUT)); +			} + +			/** 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_Pipe_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 address has interrupted (valid only for INTERRUPT type +			 *  pipes). +			 * +			 *  \param[in] Address  Address 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 Address) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool Pipe_HasPipeInterrupted(const uint8_t Address) +			{ +				return ((AVR32_USBB.uhint & (AVR32_USBB_P0INTES_MASK << (Address & PIPE_EPNUM_MASK))) ? 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_Pipe_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_Pipe_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_Pipe_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_Pipe_SelectedPipe] = 0; +				(&AVR32_USBB.UPSTA0CLR)[USB_Pipe_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_Pipe_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_Pipe_SelectedPipe] & +				        (PIPE_ERRORFLAG_CRC16 | PIPE_ERRORFLAG_TIMEOUT | +				         PIPE_ERRORFLAG_PID   | PIPE_ERRORFLAG_DATAPID | +				         PIPE_ERRORFLAG_DATATGL)) | +				        (((&AVR32_USBB.upsta0)[USB_Pipe_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_Pipe_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_Pipe_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_Pipe_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_Pipe_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_Pipe_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_Pipe_SelectedPipe].txstpic = true; +				(&AVR32_USBB.UPCON0CLR)[USB_Pipe_SelectedPipe].fifoconc = true; +				USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe] = &AVR32_USBB_SLAVE[USB_Pipe_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_Pipe_SelectedPipe].rxinic   = true; +				(&AVR32_USBB.UPCON0CLR)[USB_Pipe_SelectedPipe].fifoconc = true; +				USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe] = &AVR32_USBB_SLAVE[USB_Pipe_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_Pipe_SelectedPipe].txoutic  = true; +				(&AVR32_USBB.UPCON0CLR)[USB_Pipe_SelectedPipe].fifoconc = true; +				USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe] = &AVR32_USBB_SLAVE[USB_Pipe_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_Pipe_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_Pipe_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_Pipe_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_Pipe_SelectedPipe].rxstalldic = true; +				USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe] = &AVR32_USBB_SLAVE[USB_Pipe_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_Pipe_FIFOPos[USB_Pipe_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_Pipe_FIFOPos[USB_Pipe_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_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); + +				(void)Dummy; +			} + +			/** 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 Byte0 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); +				uint16_t Byte1 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); + +				return ((Byte1 << 8) | Byte0); +			} + +			/** 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_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); +				uint16_t Byte1 = *(USB_Pipe_FIFOPos[USB_Pipe_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_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data & 0xFF); +				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 8); +			} + +			/** 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_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 8); +				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data & 0xFF); +			} + +			/** 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_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); +				Dummy = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); + +				(void)Dummy; +			} + +			/** 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 Byte0 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); +				uint32_t Byte1 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); +				uint32_t Byte2 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); +				uint32_t Byte3 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); + +				return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0); +			} + +			/** 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_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); +				uint32_t Byte1 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); +				uint32_t Byte2 = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); +				uint32_t Byte3 = *(USB_Pipe_FIFOPos[USB_Pipe_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_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data &  0xFF); +				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 8); +				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 16); +				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 24); +			} + +			/** 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_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 24); +				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 16); +				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data >> 8); +				*(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++) = (Data &  0xFF); +			} + +			/** 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_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); +				Dummy = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); +				Dummy = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); +				Dummy = *(USB_Pipe_FIFOPos[USB_Pipe_SelectedPipe]++); + +				(void)Dummy; +			} + +		/* 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. +			 * +			 *  \attention 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 a table of pipe descriptions, in sequence. This function can be used to configure multiple +			 *  pipes at the same time. +			 * +			 *  \note Pipe with a zero address will be ignored, thus this function cannot be used to configure the +			 *        control pipe. +			 * +			 *  \param[in] Table    Pointer to a table of pipe descriptions. +			 *  \param[in] Entries  Number of entries in the pipe table to configure. +			 * +			 *  \return Boolean \c true if all pipes configured successfully, \c false otherwise. +			 */ +			bool Pipe_ConfigurePipeTable(const USB_Pipe_Table_t* const Table, +			                             const uint8_t Entries); + +			/** Configures the specified pipe address with the given pipe type, endpoint address within the attached device, +			 *  bank size and number of hardware banks. +			 * +			 *  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] Address          Pipe address to configure. +			 * +			 *  \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] EndpointAddress  Endpoint address 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. +			 * +			 *  \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 Address, +			                        const uint8_t Type, +			                        const uint8_t EndpointAddress, +			                        const uint16_t Size, +			                        const uint8_t Banks); + +			/** Spin-loops until the currently selected non-control pipe is ready for the next packet 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/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c new file mode 100644 index 0000000000..f6c4beb229 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c @@ -0,0 +1,84 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#if defined(TEMPLATE_FUNC_NAME) + +uint8_t TEMPLATE_FUNC_NAME (void* const Buffer, +                            uint16_t Length) +{ +	uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); + +	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/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c new file mode 100644 index 0000000000..922b58efa3 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c @@ -0,0 +1,95 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#if defined(TEMPLATE_FUNC_NAME) + +uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, +                            uint16_t Length) +{ +	uint8_t* DataStream     = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); +	bool     LastPacketFull = false; + +	if (Length > USB_ControlRequest.wLength) +	  Length = USB_ControlRequest.wLength; +	else if (!(Length)) +	  Endpoint_ClearIN(); + +	while (Length || LastPacketFull) +	{ +		uint8_t USB_DeviceState_LCL = USB_DeviceState; + +		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) +		  return ENDPOINT_RWCSTREAM_DeviceDisconnected; +		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) +		  return ENDPOINT_RWCSTREAM_BusSuspended; +		else if (Endpoint_IsSETUPReceived()) +		  return ENDPOINT_RWCSTREAM_HostAborted; +		else if (Endpoint_IsOUTReceived()) +		  break; + +		if (Endpoint_IsINReady()) +		{ +			uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); + +			while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) +			{ +				TEMPLATE_TRANSFER_BYTE(DataStream); +				TEMPLATE_BUFFER_MOVE(DataStream, 1); +				Length--; +				BytesInEndpoint++; +			} + +			LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); +			Endpoint_ClearIN(); +		} +	} + +	while (!(Endpoint_IsOUTReceived())) +	{ +		uint8_t USB_DeviceState_LCL = USB_DeviceState; + +		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) +		  return ENDPOINT_RWCSTREAM_DeviceDisconnected; +		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) +		  return ENDPOINT_RWCSTREAM_BusSuspended; +		else if (Endpoint_IsSETUPReceived()) +		  return ENDPOINT_RWCSTREAM_HostAborted; +	} + +	return ENDPOINT_RWCSTREAM_NoError; +} + +#undef TEMPLATE_BUFFER_OFFSET +#undef TEMPLATE_BUFFER_MOVE +#undef TEMPLATE_FUNC_NAME +#undef TEMPLATE_TRANSFER_BYTE + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c new file mode 100644 index 0000000000..e55e592eb2 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c @@ -0,0 +1,89 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#if defined(TEMPLATE_FUNC_NAME) + +uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer, +                            uint16_t Length, +                            uint16_t* const BytesProcessed) +{ +	uint8_t* DataStream      = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); +	uint16_t BytesInTransfer = 0; +	uint8_t  ErrorCode; + +	if ((ErrorCode = Endpoint_WaitUntilReady())) +	  return ErrorCode; + +	if (BytesProcessed != NULL) +	{ +		Length -= *BytesProcessed; +		TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed); +	} + +	while (Length) +	{ +		if (!(Endpoint_IsReadWriteAllowed())) +		{ +			TEMPLATE_CLEAR_ENDPOINT(); + +			#if !defined(INTERRUPT_CONTROL_ENDPOINT) +			USB_USBTask(); +			#endif + +			if (BytesProcessed != NULL) +			{ +				*BytesProcessed += BytesInTransfer; +				return ENDPOINT_RWSTREAM_IncompleteTransfer; +			} + +			if ((ErrorCode = Endpoint_WaitUntilReady())) +			  return ErrorCode; +		} +		else +		{ +			TEMPLATE_TRANSFER_BYTE(DataStream); +			TEMPLATE_BUFFER_MOVE(DataStream, 1); +			Length--; +			BytesInTransfer++; +		} +	} + +	return ENDPOINT_RWSTREAM_NoError; +} + +#undef TEMPLATE_FUNC_NAME +#undef TEMPLATE_BUFFER_TYPE +#undef TEMPLATE_TRANSFER_BYTE +#undef TEMPLATE_CLEAR_ENDPOINT +#undef TEMPLATE_BUFFER_OFFSET +#undef TEMPLATE_BUFFER_MOVE + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c new file mode 100644 index 0000000000..bb2a57fa52 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c @@ -0,0 +1,88 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#if defined(TEMPLATE_FUNC_NAME) + +uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer, +                            uint16_t Length, +                            uint16_t* const BytesProcessed) +{ +	uint8_t* DataStream      = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); +	uint16_t BytesInTransfer = 0; +	uint8_t  ErrorCode; + +	Pipe_SetPipeToken(TEMPLATE_TOKEN); + +	if ((ErrorCode = Pipe_WaitUntilReady())) +	  return ErrorCode; + +	if (BytesProcessed != NULL) +	{ +		Length -= *BytesProcessed; +		TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed); +	} + +	while (Length) +	{ +		if (!(Pipe_IsReadWriteAllowed())) +		{ +			TEMPLATE_CLEAR_PIPE(); + +			if (BytesProcessed != NULL) +			{ +				*BytesProcessed += BytesInTransfer; +				return PIPE_RWSTREAM_IncompleteTransfer; +			} + +			if ((ErrorCode = Pipe_WaitUntilReady())) +			  return ErrorCode; +		} +		else +		{ +			TEMPLATE_TRANSFER_BYTE(DataStream); +			TEMPLATE_BUFFER_MOVE(DataStream, 1); +			Length--; +			BytesInTransfer++; +		} +	} + +	return PIPE_RWSTREAM_NoError; +} + +#undef TEMPLATE_FUNC_NAME +#undef TEMPLATE_BUFFER_TYPE +#undef TEMPLATE_TOKEN +#undef TEMPLATE_TRANSFER_BYTE +#undef TEMPLATE_CLEAR_PIPE +#undef TEMPLATE_BUFFER_OFFSET +#undef TEMPLATE_BUFFER_MOVE + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c new file mode 100644 index 0000000000..2b1e9ac6b8 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBController_UC3.c @@ -0,0 +1,222 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_UC3) + +#define  __INCLUDE_FROM_USB_DRIVER +#define  __INCLUDE_FROM_USB_CONTROLLER_C +#include "../USBController.h" + +#if defined(USB_CAN_BE_BOTH) +volatile uint8_t USB_CurrentMode = USB_MODE_None; +#endif + +#if !defined(USE_STATIC_OPTIONS) +volatile uint8_t USB_Options; +#endif + +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 / 2) - 1); +	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(INVERTED_VBUS_ENABLE_LINE) +		AVR32_USBB.USBCON.vbuspo = true; +		#endif + +		#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, +							   USB_Device_ControlEndpointSize, 1); + +	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 + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBController_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBController_UC3.h new file mode 100644 index 0000000000..32c2f6ec17 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBController_UC3.h @@ -0,0 +1,353 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Controller definitions for the 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 + +		#if (defined(USB_SERIES_UC3A3_AVR) || defined(USB_SERIES_UC3A4_AVR)) +			#if ((F_USB < 12000000) || (F_USB % 12000000)) +				#error Invalid F_USB specified. F_USB must be a multiple of 12MHz for UC3A3 and UC3A4 devices. +			#endif +		#else +			#if ((F_USB < 48000000) || (F_USB % 48000000)) +				#error Invalid F_USB specified. F_USB must be a multiple of 48MHz for UC3A and UC3B devices. +			#endif +		#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) +			//@} + +			#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     Mask indicating what mode the USB interface is to be initialized to, a value +			 *                      from the \ref USB_Modes_t enum. +			 *                      \note This parameter does not exist on devices with only one supported USB +			 *                            mode (device or host). +			 * +			 *  \param[in] Options  Mask indicating the options which should be used when initializing the USB +			 *                      interface to control the USB interface's behavior. This should be comprised of +			 *                      a \c USB_OPT_REG_* mask to control the regulator, a \c USB_OPT_*_PLL mask to control the +			 *                      PLL, and a \c USB_DEVICE_OPT_* mask (when the device mode is enabled) to set the device +			 *                      mode speed. +			 * +			 *  \note To reduce the FLASH requirements of the library if only device or host mode is required, +			 *        the mode can be statically set in the project makefile by defining the token \c USB_DEVICE_ONLY +			 *        (for device mode) or \c USB_HOST_ONLY (for host mode), passing the token to the compiler +			 *        via the -D switch. If the mode is statically set, this parameter does not exist in the +			 *        function prototype. +			 *        \n\n +			 * +			 *  \note To reduce the FLASH requirements of the library if only fixed settings are required, +			 *        the options may be set statically in the same manner as the mode (see the Mode parameter of +			 *        this function). To statically set the USB options, pass in the \c USE_STATIC_OPTIONS token, +			 *        defined to the appropriate options masks. When the options are statically set, this +			 *        parameter does not exist in the function prototype. +			 * +			 *  \see \ref Group_Device for the \c USB_DEVICE_OPT_* masks. +			 */ +			void USB_Init( +			               #if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__) +			               const uint8_t Mode +			               #endif + +			               #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS)) || defined(__DOXYGEN__) +			               , +			               #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS)) +			               void +			               #endif + +			               #if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__) +			               const uint8_t Options +			               #endif +			               ); + +			/** Shuts down the USB interface. This turns off the USB interface after deallocating all USB FIFO +			 *  memory, endpoints and pipes. When turned off, no USB functionality can be used until the interface +			 *  is restarted with the \ref USB_Init() function. +			 */ +			void USB_Disable(void); + +			/** Resets the interface, when already initialized. This will re-enumerate the device if already connected +			 *  to a host, or re-enumerate an already attached device when in host mode. +			 */ +			void USB_ResetInterface(void); + +		/* Global Variables: */ +			#if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__) +				/** Indicates the mode that the USB interface is currently initialized to, a value from the +				 *  \ref USB_Modes_t enum. +				 * +				 *  \attention This variable should be treated as read-only in the user application, and never manually +				 *             changed in value. +				 * +				 *  \note When the controller is initialized into UID auto-detection mode, this variable will hold the +				 *        currently selected USB mode (i.e. \ref USB_MODE_Device or \ref USB_MODE_Host). If the controller +				 *        is fixed into a specific mode (either through the \c USB_DEVICE_ONLY or \c USB_HOST_ONLY compile time +				 *        options, or a limitation of the USB controller in the chosen device model) this will evaluate to +				 *        a constant of the appropriate value and will never evaluate to \ref USB_MODE_None even when the +				 *        USB interface is not initialized. +				 */ +				extern volatile uint8_t USB_CurrentMode; +			#elif defined(USB_CAN_BE_HOST) +				#define USB_CurrentMode USB_MODE_Host +			#elif defined(USB_CAN_BE_DEVICE) +				#define USB_CurrentMode USB_MODE_Device +			#endif + +			#if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__) +				/** Indicates the current USB options that the USB interface was initialized with when \ref USB_Init() +				 *  was called. This value will be one of the \c USB_MODE_* masks defined elsewhere in this module. +				 * +				 *  \attention This variable should be treated as read-only in the user application, and never manually +				 *             changed in value. +				 */ +				extern volatile uint8_t USB_Options; +			#elif defined(USE_STATIC_OPTIONS) +				#define USB_Options USE_STATIC_OPTIONS +			#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* 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/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c new file mode 100644 index 0000000000..3b3958a145 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.c @@ -0,0 +1,228 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_UC3) + +#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_Addressed : 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, +		                           USB_Device_ControlEndpointSize, 1); + +		#if defined(INTERRUPT_CONTROL_ENDPOINT) +		USB_INT_Enable(USB_INT_RXSTPI); +		#endif + +		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 +} + +#if defined(INTERRUPT_CONTROL_ENDPOINT) && defined(USB_CAN_BE_DEVICE) +ISR(USB_COM_vect) +{ +	uint8_t PrevSelectedEndpoint = Endpoint_GetCurrentEndpoint(); + +	Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); +	USB_INT_Disable(USB_INT_RXSTPI); + +	GlobalInterruptEnable(); + +	USB_Device_ProcessControlRequest(); + +	Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); +	USB_INT_Enable(USB_INT_RXSTPI); +	Endpoint_SelectEndpoint(PrevSelectedEndpoint); +} +#endif + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h new file mode 100644 index 0000000000..e2f67bf86a --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/UC3/USBInterrupt_UC3.h @@ -0,0 +1,376 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Controller Interrupt definitions for the 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__) +		/* External Variables: */ +			extern volatile uint32_t USB_Endpoint_SelectedEndpoint; + +		/* 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, +				USB_INT_RXSTPI  = 6, +				#endif +				#if (defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__)) +				USB_INT_HSOFI   = 7, +				USB_INT_DCONNI  = 8, +				USB_INT_DDISCI  = 9, +				USB_INT_RSTI    = 10, +				USB_INT_BCERRI  = 11, +				USB_INT_VBERRI  = 12, +				#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; +					case USB_INT_RXSTPI: +						(&AVR32_USBB.UECON0SET)[USB_Endpoint_SelectedEndpoint].rxstpes = 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 +					default: +						break; +				} +			} + +			static inline void USB_INT_Disable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE; +			static inline void USB_INT_Disable(const uint8_t Interrupt) +			{ +				switch (Interrupt) +				{ +					case USB_INT_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; +					case USB_INT_RXSTPI: +						(&AVR32_USBB.UECON0CLR)[USB_Endpoint_SelectedEndpoint].rxstpec = 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 +					default: +						break; +				} +			} + +			static inline void USB_INT_Clear(const uint8_t Interrupt) ATTR_ALWAYS_INLINE; +			static inline void USB_INT_Clear(const uint8_t Interrupt) +			{ +				switch (Interrupt) +				{ +					case USB_INT_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; +					case USB_INT_RXSTPI: +						(&AVR32_USBB.UESTA0CLR)[USB_Endpoint_SelectedEndpoint].rxstpic = true; +						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 +					default: +						break; +				} +			} + +			static inline bool USB_INT_IsEnabled(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline bool USB_INT_IsEnabled(const uint8_t Interrupt) +			{ +				switch (Interrupt) +				{ +					case USB_INT_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; +					case USB_INT_RXSTPI: +						return (&AVR32_USBB.UECON0)[USB_Endpoint_SelectedEndpoint].rxstpe; +					#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 +					default: +						return false; +				} +			} + +			static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) +			{ +				switch (Interrupt) +				{ +					case USB_INT_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; +					case USB_INT_RXSTPI: +						return (&AVR32_USBB.UESTA0)[USB_Endpoint_SelectedEndpoint].rxstpi; +					#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 +					default: +						return false; +				} +			} + +		/* Includes: */ +			#include "../USBMode.h" +			#include "../Events.h" +			#include "../USBController.h" + +		/* Function Prototypes: */ +			void USB_INT_ClearAllInterrupts(void); +			void USB_INT_DisableAllInterrupts(void); +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Function 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/lib/lufa/LUFA/Drivers/USB/Core/USBController.h b/lib/lufa/LUFA/Drivers/USB/Core/USBController.h new file mode 100644 index 0000000000..5980a37ce6 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/USBController.h @@ -0,0 +1,165 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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 + +	/* Defines: */ +		/** \name Endpoint Direction Masks */ +		//@{ +		/** Endpoint direction mask, for masking against endpoint addresses to retrieve the endpoint's +		 *  direction for comparing with the \c ENDPOINT_DIR_* masks. +		 */ +		#define ENDPOINT_DIR_MASK                  0x80 + +		/** Endpoint address direction mask for an OUT direction (Host to Device) endpoint. This may be ORed with +		 *  the index of the address within a device to obtain the full endpoint address. +		 */ +		#define ENDPOINT_DIR_OUT                   0x00 + +		/** Endpoint address direction mask for an IN direction (Device to Host) endpoint. This may be ORed with +		 *  the index of the address within a device to obtain the full endpoint address. +		 */ +		#define ENDPOINT_DIR_IN                    0x80 +		//@} + +		/** \name Pipe Direction Masks */ +		//@{ +		/** Pipe direction mask, for masking against pipe addresses to retrieve the pipe's +		 *  direction for comparing with the \c PIPE_DIR_* masks. +		 */ +		#define PIPE_DIR_MASK                      0x80 + +		/** Endpoint address direction mask for an OUT direction (Host to Device) endpoint. This may be ORed with +		 *  the index of the address within a device to obtain the full endpoint address. +		 */ +		#define PIPE_DIR_OUT                       0x00 + +		/** Endpoint address direction mask for an IN direction (Device to Host) endpoint. This may be ORed with +		 *  the index of the address within a device to obtain the full endpoint address. +		 */ +		#define PIPE_DIR_IN                        0x80 +		//@} + +		/** \name Endpoint/Pipe Type Masks */ +		//@{ +		/** Mask for determining the type of an endpoint from an endpoint descriptor. This should then be compared +		 *  with the \c EP_TYPE_* masks to determine the exact type of the endpoint. +		 */ +		#define EP_TYPE_MASK                       0x03 + +		/** 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 +		//@} + +	/* 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. +			                      */ +		}; + +	/* 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/lib/lufa/LUFA/Drivers/USB/Core/USBInterrupt.h b/lib/lufa/LUFA/Drivers/USB/Core/USBInterrupt.h new file mode 100644 index 0000000000..b00ef7bd39 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/USBInterrupt.h @@ -0,0 +1,73 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB controller interrupt 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/lib/lufa/LUFA/Drivers/USB/Core/USBMode.h b/lib/lufa/LUFA/Drivers/USB/Core/USBMode.h new file mode 100644 index 0000000000..2044f899a9 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/USBMode.h @@ -0,0 +1,283 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB mode and feature support definitions. + *  \copydetails Group_USBMode + * + *  \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_USBMode USB Mode Tokens + *  \brief USB mode and feature support definitions. + * + *  This file defines macros indicating the type of USB controller the library is being compiled for, and its + *  capabilities. These macros may then be referenced in the user application to selectively enable or disable + *  code sections depending on if they are defined or not. + * + *  After the inclusion of the master USB driver header, one or more of the following tokens may be defined, to + *  allow the user code to conditionally enable or disable code based on the USB controller family and allowable + *  USB modes. These tokens may be tested against to eliminate code relating to a USB mode which is not enabled for + *  the given compilation. + * + *  @{ + */ + +#ifndef __USBMODE_H__ +#define __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 + +	/* Includes: */ +		#include "../../../Common/Common.h" + +	/* Public Interface - May be used in end-application: */ +	#if defined(__DOXYGEN__) +		/** Indicates that the target AVR microcontroller belongs to the Series 2 AVR8 USB controller +		 *  (i.e. AT90USBxxx2 or ATMEGAxxU2) when defined. +		 */ +		#define USB_SERIES_2_AVR + +		/** Indicates that the target AVR microcontroller belongs to the Series 4 AVR8 USB controller +		 *  (i.e. ATMEGAxxU4) when defined. +		 */ +		#define USB_SERIES_4_AVR + +		/** Indicates that the target AVR microcontroller belongs to the Series 6 AVR8 USB controller +		 *  (i.e. AT90USBxxx6) when defined. +		 */ +		#define USB_SERIES_6_AVR + +		/** Indicates that the target AVR microcontroller belongs to the Series 7 AVR8 USB controller +		 *  (i.e. AT90USBxxx7) when defined. +		 */ +		#define USB_SERIES_7_AVR + +		/** Indicates that the target AVR microcontroller belongs to the AVR32 UC3A0 Series USB controller +		 *  (i.e. AT32UC3A0*) when defined. +		 */ +		#define USB_SERIES_UC3A0_AVR + +		/** Indicates that the target AVR microcontroller belongs to the AVR32 UC3A1 Series USB controller +		 *  (i.e. AT32UC3A1*) when defined. +		 */ +		#define USB_SERIES_UC3A1_AVR + +		/** Indicates that the target AVR microcontroller belongs to the AVR32 UC3A3 Series USB controller +		 *  (i.e. AT32UC3A3*) when defined. +		 */ +		#define USB_SERIES_UC3A3_AVR + +		/** Indicates that the target AVR microcontroller belongs to the AVR32 UC3A4 Series USB controller +		 *  (i.e. AT32UC3A4*) when defined. +		 */ +		#define USB_SERIES_UC3A4_AVR + +		/** Indicates that the target AVR microcontroller belongs to the AVR32 UC3B0 Series USB controller +		 *  (i.e. AT32UC3B0*) when defined. +		 */ +		#define USB_SERIES_UC3B0_AVR + +		/** Indicates that the target AVR microcontroller belongs to the AVR32 UC3B1 Series USB controller +		 *  (i.e. AT32UC3B1*) when defined. +		 */ +		#define USB_SERIES_UC3B1_AVR + +		/** Indicates that the target AVR microcontroller belongs to the XMEGA A1U Series USB controller +		 *  (i.e. ATXMEGA*A1U) when defined. +		 */ +		#define USB_SERIES_A1U_XMEGA + +		/** Indicates that the target AVR microcontroller belongs to the XMEGA A3U Series USB controller +		 *  (i.e. ATXMEGA*A3U) when defined. +		 */ +		#define USB_SERIES_A3U_XMEGA + +		/** Indicates that the target AVR microcontroller belongs to the XMEGA A4U Series USB controller +		 *  (i.e. ATXMEGA*A4U) when defined. +		 */ +		#define USB_SERIES_A4U_XMEGA + +		/** Indicates that the target AVR microcontroller belongs to the XMEGA B1 Series USB controller +		 *  (i.e. ATXMEGA*B1) when defined. +		 */ +		#define USB_SERIES_B1_XMEGA + +		/** Indicates that the target AVR microcontroller belongs to the XMEGA B3 Series USB controller +		 *  (i.e. ATXMEGA*B3) when defined. +		 */ +		#define USB_SERIES_B3_XMEGA + +		/** Indicates that the target AVR microcontroller belongs to the XMEGA C3 Series USB controller +		 *  (i.e. ATXMEGA*C3) when defined. +		 */ +		#define USB_SERIES_C3_XMEGA + +		/** Indicates that the target AVR microcontroller belongs to the XMEGA C4 Series USB controller +		 *  (i.e. ATXMEGA*C4) when defined. +		 */ +		#define USB_SERIES_C4_XMEGA + +		/** Indicates that the target microcontroller and compilation settings allow for the +		 *  target to be configured in USB Device mode when defined. +		 */ +		#define USB_CAN_BE_DEVICE + +		/** Indicates that the target microcontroller and compilation settings allow for the +		 *  target to be configured in USB Host mode when defined. +		 */ +		#define USB_CAN_BE_HOST + +		/** Indicates that the target microcontroller and compilation settings allow for the +		 *  target to be configured in either USB Device or Host mode when defined. +		 */ +		#define USB_CAN_BE_BOTH +	#else +		/* Macros: */ +			#if (defined(__AVR_AT90USB162__) || defined(__AVR_AT90USB82__)  || \ +			     defined(__AVR_ATmega32U2__) || defined(__AVR_ATmega16U2__) || defined(__AVR_ATmega8U2__)) +				#define USB_SERIES_2_AVR +				#define USB_CAN_BE_DEVICE +			#elif (defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega16U4__)) +				#define USB_SERIES_4_AVR +				#define USB_CAN_BE_DEVICE +			#elif (defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)) +				#define USB_SERIES_6_AVR +				#define USB_CAN_BE_DEVICE +			#elif (defined(__AVR_AT90USB647__) || defined(__AVR_AT90USB1287__)) +				#define USB_SERIES_7_AVR +				#define USB_CAN_BE_DEVICE +				#define USB_CAN_BE_HOST +			#elif (defined(__AVR32_UC3A0512__) || defined(__AVR32_UC3A0256__) || \ +			       defined(__AVR32_UC3A0128__) || defined(__AVR32_UC3A064__)) +				#define USB_SERIES_UC3A0_AVR32 +				#define USB_CAN_BE_DEVICE +				#define USB_CAN_BE_HOST +			#elif (defined(__AVR32_UC3A1512__) || defined(__AVR32_UC3A1256__) || \ +			       defined(__AVR32_UC3A1128__) || defined(__AVR32_UC3A164__)) +				#define USB_SERIES_UC3A1_AVR32 +				#define USB_CAN_BE_DEVICE +				#define USB_CAN_BE_HOST +			#elif (defined(__AVR32_UC3A3256__) || defined(__AVR32_UC3A3256S__) || \ +			       defined(__AVR32_UC3A3128__) || defined(__AVR32_UC3A3128S__) || \ +			       defined(__AVR32_UC3A364__)  || defined(__AVR32_UC3A364S__)) +				#define USB_SERIES_UC3A3_AVR32 +				#define USB_CAN_BE_DEVICE +				#define USB_CAN_BE_HOST +			#elif (defined(__AVR32_UC3A4256__) || defined(__AVR32_UC3A4256S__) || \ +			       defined(__AVR32_UC3A4128__) || defined(__AVR32_UC3A4128S__) || \ +			       defined(__AVR32_UC3A464__)  || defined(__AVR32_UC3A464S__)) +				#define USB_SERIES_UC3A4_AVR32 +				#define USB_CAN_BE_DEVICE +				#define USB_CAN_BE_HOST +			#elif (defined(__AVR32_UC3B0512__) || defined(__AVR32_UC3B0256__) || \ +			       defined(__AVR32_UC3B0128__) || defined(__AVR32_UC3B064__)) +				#define USB_SERIES_UC3B0_AVR32 +				#define USB_CAN_BE_DEVICE +				#define USB_CAN_BE_HOST +			#elif (defined(__AVR32_UC3B1512__) || defined(__AVR32_UC3B1256__) || \ +			       defined(__AVR32_UC3B1128__) || defined(__AVR32_UC3B164__)) +				#define USB_SERIES_UC3B1_AVR32 +				#define USB_CAN_BE_DEVICE +				#define USB_CAN_BE_HOST +			#elif (defined(__AVR_ATxmega128A1U__) || defined(__AVR_ATxmega64A1U__)) +				#define USB_SERIES_A1U_XMEGA +				#define USB_CAN_BE_DEVICE +			#elif (defined(__AVR_ATxmega64A3U__) || defined(__AVR_ATxmega128A3U__) || \ +			       defined(__AVR_ATxmega192A3U__) || defined(__AVR_ATxmega256A3U__)) +				#define USB_SERIES_A3U_XMEGA +				#define USB_CAN_BE_DEVICE +			#elif (defined(__AVR_ATxmega256A3BU__)) +				#define USB_SERIES_A3BU_XMEGA +				#define USB_CAN_BE_DEVICE +			#elif (defined(__AVR_ATxmega16A4U__) || defined(__AVR_ATxmega32A4U__) || \ +			       defined(__AVR_ATxmega64A4U__) || defined(__AVR_ATxmega128A4U__)) +				#define USB_SERIES_A4U_XMEGA +				#define USB_CAN_BE_DEVICE +			#elif (defined(__AVR_ATxmega128B1__) || defined(__AVR_ATxmega64B1__)) +				#define USB_SERIES_B1_XMEGA +				#define USB_CAN_BE_DEVICE +			#elif (defined(__AVR_ATxmega128B3__) || defined(__AVR_ATxmega64B3__)) +				#define USB_SERIES_B3_XMEGA +				#define USB_CAN_BE_DEVICE +			#elif (defined(__AVR_ATxmega128C3__) || defined(__AVR_ATxmega64C3__) || \ +			       defined(__AVR_ATxmega192C3__) || defined(__AVR_ATxmega256C3__) || \ +				   defined(__AVR_ATxmega384C3__)) +				#define USB_SERIES_C3_XMEGA +				#define USB_CAN_BE_DEVICE +			#elif (defined(__AVR_ATxmega16C4__) || defined(__AVR_ATxmega32C4__)) +				#define USB_SERIES_C4_XMEGA +				#define USB_CAN_BE_DEVICE +			#endif + +			#if (defined(USB_HOST_ONLY) && defined(USB_DEVICE_ONLY)) +				#error USB_HOST_ONLY and USB_DEVICE_ONLY are mutually exclusive. +			#elif defined(USB_HOST_ONLY) +				#if !defined(USB_CAN_BE_HOST) +					#error USB_HOST_ONLY is not available for the currently selected microcontroller model. +				#else +					#undef USB_CAN_BE_DEVICE +				#endif +			#elif defined(USB_DEVICE_ONLY) +				#if !defined(USB_CAN_BE_DEVICE) +					#error USB_DEVICE_ONLY is not available for the currently selected microcontroller model. +				#else +					#undef USB_CAN_BE_HOST +				#endif +			#endif + +			#if (defined(USB_CAN_BE_DEVICE) && defined(USB_CAN_BE_HOST)) +				#define USB_CAN_BE_BOTH +			#endif + +			#if (!defined(USB_CAN_BE_DEVICE) && !defined(USB_CAN_BE_HOST)) +				#error The currently selected device, USB mode or architecture is not supported. +			#endif +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/USBTask.c b/lib/lufa/LUFA/Drivers/USB/Core/USBTask.c new file mode 100644 index 0000000000..329ff4a272 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/USBTask.c @@ -0,0 +1,89 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USBTASK_C +#define  __INCLUDE_FROM_USB_DRIVER +#include "USBTask.h" + +volatile bool        USB_IsInitialized; +USB_Request_Header_t USB_ControlRequest; + +#if defined(USB_CAN_BE_HOST) && !defined(HOST_STATE_AS_GPIOR) +volatile uint8_t     USB_HostState; +#endif + +#if defined(USB_CAN_BE_DEVICE) && !defined(DEVICE_STATE_AS_GPIOR) +volatile uint8_t     USB_DeviceState; +#endif + +void USB_USBTask(void) +{ +	#if defined(USB_CAN_BE_BOTH) +		if (USB_CurrentMode == USB_MODE_Device) +		  USB_DeviceTask(); +		else if (USB_CurrentMode == USB_MODE_Host) +		  USB_HostTask(); +	#elif defined(USB_CAN_BE_HOST) +		USB_HostTask(); +	#elif defined(USB_CAN_BE_DEVICE) +		USB_DeviceTask(); +	#endif +} + +#if defined(USB_CAN_BE_DEVICE) +static void USB_DeviceTask(void) +{ +	if (USB_DeviceState == DEVICE_STATE_Unattached) +	  return; + +	uint8_t PrevEndpoint = Endpoint_GetCurrentEndpoint(); + +	Endpoint_SelectEndpoint(ENDPOINT_CONTROLEP); + +	if (Endpoint_IsSETUPReceived()) +	  USB_Device_ProcessControlRequest(); + +	Endpoint_SelectEndpoint(PrevEndpoint); +} +#endif + +#if defined(USB_CAN_BE_HOST) +static void USB_HostTask(void) +{ +	uint8_t PrevPipe = Pipe_GetCurrentPipe(); + +	Pipe_SelectPipe(PIPE_CONTROLPIPE); + +	USB_Host_ProcessNextHostState(); + +	Pipe_SelectPipe(PrevPipe); +} +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/USBTask.h b/lib/lufa/LUFA/Drivers/USB/Core/USBTask.h new file mode 100644 index 0000000000..77cee65815 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/USBTask.h @@ -0,0 +1,200 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Main USB service task management. + * + *  This file contains the function definitions required for the main USB service task, which must be called + *  from the user application to ensure that the USB connection to or from a connected USB device is maintained. + * + *  \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 __USBTASK_H__ +#define __USBTASK_H__ + +	/* Includes: */ +		#include "../../../Common/Common.h" +		#include "USBMode.h" +		#include "USBController.h" +		#include "Events.h" +		#include "StdRequestType.h" +		#include "StdDescriptors.h" + +		#if defined(USB_CAN_BE_DEVICE) +			#include "DeviceStandardReq.h" +		#endif + +		#if defined(USB_CAN_BE_HOST) +			#include "HostStandardReq.h" +		#endif + +	/* 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: */ +		/* Global Variables: */ +			/** Indicates if the USB interface is currently initialized but not necessarily connected to a host +			 *  or device (i.e. if \ref USB_Init() has been run). If this is false, all other library globals related +			 *  to the USB driver are invalid. +			 * +			 *  \attention This variable should be treated as read-only in the user application, and never manually +			 *             changed in value. +			 * +			 *  \ingroup Group_USBManagement +			 */ +			extern volatile bool USB_IsInitialized; + +			/** Structure containing the last received Control request when in Device mode (for use in user-applications +			 *  inside of the \ref EVENT_USB_Device_ControlRequest() event, or for filling up with a control request to +			 *  issue when in Host mode before calling \ref USB_Host_SendControlRequest(). +			 * +			 *  \note The contents of this structure is automatically endian-corrected for the current CPU architecture. +			 * +			 *  \ingroup Group_USBManagement +			 */ +			 extern USB_Request_Header_t USB_ControlRequest; + +			#if defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__) +				#if !defined(HOST_STATE_AS_GPIOR) || defined(__DOXYGEN__) +					/** Indicates the current host state machine state. When in host mode, this indicates the state +					 *  via one of the values of the \ref USB_Host_States_t enum values. +					 * +					 *  This value should not be altered by the user application as it is handled automatically by the +					 *  library. +					 * +					 *  To reduce program size and speed up checks of this global on the AVR8 architecture, it can be +					 *  placed into one of the AVR's \c GPIOR hardware registers instead of RAM by defining the +					 *  \c HOST_STATE_AS_GPIOR token to a value between 0 and 2 in the project makefile and passing it to +					 *  the compiler via the -D switch. When defined, the corresponding GPIOR register should not be used +					 *  in the user application except implicitly via the library APIs. +					 * +					 *  \note This global is only present if the user application can be a USB host. +					 * +					 *  \see \ref USB_Host_States_t for a list of possible device states. +					 * +					 *  \ingroup Group_Host +					 */ +					extern volatile uint8_t USB_HostState; +				#else +					#define USB_HostState            CONCAT_EXPANDED(GPIOR, HOST_STATE_AS_GPIOR) +				#endif +			#endif + +			#if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__) +				#if !defined(DEVICE_STATE_AS_GPIOR) || defined(__DOXYGEN__) +					/** Indicates the current device state machine state. When in device mode, this indicates the state +					 *  via one of the values of the \ref USB_Device_States_t enum values. +					 * +					 *  This value should not be altered by the user application as it is handled automatically by the +					 *  library. The only exception to this rule is if the NO_LIMITED_CONTROLLER_CONNECT token is used +					 *  (see \ref EVENT_USB_Device_Connect() and \ref EVENT_USB_Device_Disconnect() events). +					 * +					 *  To reduce program size and speed up checks of this global on the AVR8 architecture, it can be +					 *  placed into one of the AVR's \c GPIOR hardware registers instead of RAM by defining the +					 *  \c DEVICE_STATE_AS_GPIOR token to a value between 0 and 2 in the project makefile and passing it to +					 *  the compiler via the -D switch. When defined, the corresponding GPIOR register should not be used +					 *  in the user application except implicitly via the library APIs. +					 * +					 *  \attention This variable should be treated as read-only in the user application, and never manually +					 *             changed in value except in the circumstances outlined above. +					 * +					 *  \note This global is only present if the user application can be a USB device. +					 *        \n\n +					 * +					 *  \see \ref USB_Device_States_t for a list of possible device states. +					 * +					 *  \ingroup Group_Device +					 */ +					extern volatile uint8_t USB_DeviceState; +				#else +					#define USB_DeviceState            CONCAT_EXPANDED(GPIOR, DEVICE_STATE_AS_GPIOR) +				#endif +			#endif + +		/* Function Prototypes: */ +			/** This is the main USB management task. The USB driver requires this task to be executed +			 *  continuously when the USB system is active (device attached in host mode, or attached to a host +			 *  in device mode) in order to manage USB communications. This task may be executed inside an RTOS, +			 *  fast timer ISR or the main user application loop. +			 * +			 *  The USB task must be serviced within 30ms while in device mode, or within 1ms while in host mode. +			 *  The task may be serviced at all times, or (for minimum CPU consumption): +			 * +			 *    - In device mode, it may be disabled at start-up, enabled on the firing of the \ref EVENT_USB_Device_Connect() +			 *      event and disabled again on the firing of the \ref EVENT_USB_Device_Disconnect() event. +			 * +			 *    - In host mode, it may be disabled at start-up, enabled on the firing of the \ref EVENT_USB_Host_DeviceAttached() +			 *      event and disabled again on the firing of the \ref EVENT_USB_Host_DeviceEnumerationComplete() or +			 *      \ref EVENT_USB_Host_DeviceEnumerationFailed() events. +			 * +			 *  If in device mode (only), the control endpoint can instead be managed via interrupts entirely by the library +			 *  by defining the INTERRUPT_CONTROL_ENDPOINT token and passing it to the compiler via the -D switch. +			 * +			 *  \see \ref Group_Events for more information on the USB events. +			 * +			 *  \ingroup Group_USBManagement +			 */ +			void USB_USBTask(void); + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_USBTASK_C) +				#if defined(USB_CAN_BE_HOST) +					static void USB_HostTask(void); +				#endif + +				#if defined(USB_CAN_BE_DEVICE) +					static void USB_DeviceTask(void); +				#endif +			#endif + +		/* Macros: */ +			#define HOST_TASK_NONBLOCK_WAIT(Duration, NextState) do { USB_HostState   = HOST_STATE_WaitForDevice; \ +			                                                          WaitMSRemaining = (Duration);               \ +			                                                          PostWaitState   = (NextState);              } while (0) +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c new file mode 100644 index 0000000000..470e128b64 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.c @@ -0,0 +1,49 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_XMEGA) + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../USBMode.h" + +#if defined(USB_CAN_BE_DEVICE) + +#include "../Device.h" + +void USB_Device_SendRemoteWakeup(void) +{ +	USB.CTRLB |= USB_RWAKEUP_bm; +} + +#endif + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h new file mode 100644 index 0000000000..759ff350b3 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Device_XMEGA.h @@ -0,0 +1,266 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Device definitions for the AVR XMEGA microcontrollers. + *  \copydetails Group_Device_XMEGA + * + *  \note This file should not be included directly. It is automatically included as needed by the USB driver + *        dispatch header located in LUFA/Drivers/USB/USB.h. + */ + +/** \ingroup Group_Device + *  \defgroup Group_Device_XMEGA Device Management (XMEGA) + *  \brief USB Device definitions for the AVR XMEGA microcontrollers. + * + *  Architecture specific USB Device definitions for the Atmel AVR XMEGA microcontrollers. + * + *  @{ + */ + +#ifndef __USBDEVICE_XMEGA_H__ +#define __USBDEVICE_XMEGA_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../USBController.h" +		#include "../StdDescriptors.h" +		#include "../USBInterrupt.h" +		#include "../Endpoint.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_USB_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. +		#endif + +		#if (defined(USE_RAM_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS)) +			#error USE_RAM_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive. +		#endif + +		#if (defined(USE_FLASH_DESCRIPTORS) && defined(USE_EEPROM_DESCRIPTORS)) +			#error USE_FLASH_DESCRIPTORS and USE_EEPROM_DESCRIPTORS are mutually exclusive. +		#endif + +		#if (defined(USE_FLASH_DESCRIPTORS) && defined(USE_RAM_DESCRIPTORS)) +			#error USE_FLASH_DESCRIPTORS and USE_RAM_DESCRIPTORS are mutually exclusive. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** \name USB Device Mode Option Masks */ +			//@{ +			/** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the +			 *  USB interface should be initialized in low speed (1.5Mb/s) mode. +			 * +			 *  \note Low Speed mode is not available on all USB AVR models. +			 *        \n +			 * +			 *  \note Restrictions apply on the number, size and type of endpoints which can be used +			 *        when running in low speed mode - refer to the USB 2.0 specification. +			 */ +			#define USB_DEVICE_OPT_LOWSPEED        (1 << 0) + +			#if (F_USB > 6000000) +				/** Mask for the Options parameter of the \ref USB_Init() function. This indicates that the +				 *  USB interface should be initialized in full speed (12Mb/s) mode. +				 */ +				#define USB_DEVICE_OPT_FULLSPEED   (0 << 0) +			#endif +			//@} + +			#if (!defined(NO_INTERNAL_SERIAL) || defined(__DOXYGEN__)) +				/** String descriptor index for the device's unique serial number string descriptor within the device. +				 *  This unique serial number is used by the host to associate resources to the device (such as drivers or COM port +				 *  number allocations) to a device regardless of the port it is plugged in to on the host. Some microcontrollers contain +				 *  a unique serial number internally, and setting the device descriptors serial number string index to this value +				 *  will cause it to use the internal serial number. +				 * +				 *  On unsupported devices, this will evaluate to \ref NO_DESCRIPTOR and so will force the host to create a pseudo-serial +				 *  number for the device. +				 */ +				#define USE_INTERNAL_SERIAL            0xDC + +				/** Length of the device's unique internal serial number, in bits, if present on the selected microcontroller +				 *  model. +				 */ +				#define INTERNAL_SERIAL_LENGTH_BITS    (8 * (1 + (offsetof(NVM_PROD_SIGNATURES_t, COORDY1) - offsetof(NVM_PROD_SIGNATURES_t, LOTNUM0)))) + +				/** Start address of the internal serial number, in the appropriate address space, if present on the selected microcontroller +				 *  model. +				 */ +				#define INTERNAL_SERIAL_START_ADDRESS  offsetof(NVM_PROD_SIGNATURES_t, LOTNUM0) +			#else +				#define USE_INTERNAL_SERIAL            NO_DESCRIPTOR + +				#define INTERNAL_SERIAL_LENGTH_BITS    0 +				#define INTERNAL_SERIAL_START_ADDRESS  0 +			#endif + +		/* Function Prototypes: */ +			/** Sends a Remote Wakeup request to the host. This signals to the host that the device should +			 *  be taken out of suspended mode, and communications should resume. +			 * +			 *  Typically, this is implemented so that HID devices (mice, keyboards, etc.) can wake up the +			 *  host computer when the host has suspended all USB devices to enter a low power state. +			 * +			 *  \note This function should only be used if the device has indicated to the host that it +			 *        supports the Remote Wakeup feature in the device descriptors, and should only be +			 *        issued if the host is currently allowing remote wakeup events from the device (i.e., +			 *        the \ref USB_Device_RemoteWakeupEnabled flag is set). When the \c NO_DEVICE_REMOTE_WAKEUP +			 *        compile time option is used, this function is unavailable. +			 *        \n\n +			 * +			 *  \note The USB clock must be running for this function to operate. If the stack is initialized with +			 *        the \ref USB_OPT_MANUAL_PLL option enabled, the user must ensure that the PLL is running +			 *        before attempting to call this function. +			 * +			 *  \see \ref Group_StdDescriptors for more information on the RMWAKEUP feature and device descriptors. +			 */ +			void USB_Device_SendRemoteWakeup(void); + +		/* Inline Functions: */ +			/** Returns the current USB frame number, when in device mode. Every millisecond the USB bus is active (i.e. enumerated to a host) +			 *  the frame number is incremented by one. +			 * +			 *  \return Current USB frame number from the USB controller. +			 */ +			static inline uint16_t USB_Device_GetFrameNumber(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline uint16_t USB_Device_GetFrameNumber(void) +			{ +				return ((USB_EndpointTable_t*)USB.EPPTR)->FrameNum; +			} + +			#if !defined(NO_SOF_EVENTS) +			/** Enables the device mode Start Of Frame events. When enabled, this causes the +			 *  \ref EVENT_USB_Device_StartOfFrame() event to fire once per millisecond, synchronized to the USB bus, +			 *  at the start of each USB frame when enumerated in device mode. +			 * +			 *  \note This function is not available when the \c NO_SOF_EVENTS compile time token is defined. +			 */ +			static inline void USB_Device_EnableSOFEvents(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Device_EnableSOFEvents(void) +			{ +				USB.INTCTRLA |=  USB_SOFIE_bm; +			} + +			/** Disables the device mode Start Of Frame events. When disabled, this stops the firing of the +			 *  \ref EVENT_USB_Device_StartOfFrame() event when enumerated in device mode. +			 * +			 *  \note This function is not available when the \c NO_SOF_EVENTS compile time token is defined. +			 */ +			static inline void USB_Device_DisableSOFEvents(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Device_DisableSOFEvents(void) +			{ +				USB.INTCTRLA &= ~USB_SOFIE_bm; +			} +			#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Inline Functions: */ +			static inline void USB_Device_SetLowSpeed(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Device_SetLowSpeed(void) +			{ +				USB.CTRLA &= ~USB_SPEED_bm; +			} + +			static inline void USB_Device_SetFullSpeed(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Device_SetFullSpeed(void) +			{ +				USB.CTRLA |=  USB_SPEED_bm; +			} + +			static inline void USB_Device_SetDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; +			static inline void USB_Device_SetDeviceAddress(const uint8_t Address) +			{ +				(void)Address; + +				/* No implementation for XMEGA architecture */ +			} + +			static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) ATTR_ALWAYS_INLINE; +			static inline void USB_Device_EnableDeviceAddress(const uint8_t Address) +			{ +				USB.ADDR = Address; +			} + +			static inline bool USB_Device_IsAddressSet(void) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline bool USB_Device_IsAddressSet(void) +			{ +				return ((USB.ADDR != 0) ? true : false); +			} + +			static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString) ATTR_NON_NULL_PTR_ARG(1); +			static inline void USB_Device_GetSerialString(uint16_t* const UnicodeString) +			{ +				uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); +				GlobalInterruptDisable(); + +				uint8_t SigReadAddress = INTERNAL_SERIAL_START_ADDRESS; + +				for (uint8_t SerialCharNum = 0; SerialCharNum < (INTERNAL_SERIAL_LENGTH_BITS / 4); SerialCharNum++) +				{ +					uint8_t SerialByte; + +					NVM.CMD    = NVM_CMD_READ_CALIB_ROW_gc; +					SerialByte = pgm_read_byte(SigReadAddress); +					NVM.CMD    = 0; + +					if (SerialCharNum & 0x01) +					{ +						SerialByte >>= 4; +						SigReadAddress++; +					} + +					SerialByte &= 0x0F; + +					UnicodeString[SerialCharNum] = cpu_to_le16((SerialByte >= 10) ? +															   (('A' - 10) + SerialByte) : ('0' + SerialByte)); +				} + +				SetGlobalInterruptMask(CurrentGlobalInt); +			} + +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c new file mode 100644 index 0000000000..6413281708 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c @@ -0,0 +1,275 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_XMEGA) + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../USBMode.h" + +#if defined(USB_CAN_BE_DEVICE) + +#include "EndpointStream_XMEGA.h" + +#if !defined(CONTROL_ONLY_DEVICE) +uint8_t Endpoint_Discard_Stream(uint16_t Length, +                                uint16_t* const BytesProcessed) +{ +	uint8_t  ErrorCode; +	uint16_t BytesInTransfer = 0; + +	if ((ErrorCode = Endpoint_WaitUntilReady())) +	  return ErrorCode; + +	if (BytesProcessed != NULL) +	  Length -= *BytesProcessed; + +	while (Length) +	{ +		if (!(Endpoint_IsReadWriteAllowed())) +		{ +			Endpoint_ClearOUT(); + +			if (BytesProcessed != NULL) +			{ +				*BytesProcessed += BytesInTransfer; +				return ENDPOINT_RWSTREAM_IncompleteTransfer; +			} + +			if ((ErrorCode = Endpoint_WaitUntilReady())) +			  return ErrorCode; +		} +		else +		{ +			Endpoint_Discard_8(); + +			Length--; +			BytesInTransfer++; +		} +	} + +	return ENDPOINT_RWSTREAM_NoError; +} + +uint8_t Endpoint_Null_Stream(uint16_t Length, +                             uint16_t* const BytesProcessed) +{ +	uint8_t  ErrorCode; +	uint16_t BytesInTransfer = 0; + +	if ((ErrorCode = Endpoint_WaitUntilReady())) +	  return ErrorCode; + +	if (BytesProcessed != NULL) +	  Length -= *BytesProcessed; + +	while (Length) +	{ +		if (!(Endpoint_IsReadWriteAllowed())) +		{ +			Endpoint_ClearIN(); + +			if (BytesProcessed != NULL) +			{ +				*BytesProcessed += BytesInTransfer; +				return ENDPOINT_RWSTREAM_IncompleteTransfer; +			} + +			if ((ErrorCode = Endpoint_WaitUntilReady())) +			  return ErrorCode; +		} +		else +		{ +			Endpoint_Write_8(0); + +			Length--; +			BytesInTransfer++; +		} +	} + +	return ENDPOINT_RWSTREAM_NoError; +} + +/* The following abuses the C preprocessor in order to copy-paste common code with slight alterations, + * so that the code needs to be written once. It is a crude form of templating to reduce code maintenance. */ + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_LE +#define  TEMPLATE_BUFFER_TYPE                      const void* +#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr) +#include "Template/Template_Endpoint_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Stream_BE +#define  TEMPLATE_BUFFER_TYPE                      const void* +#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr) +#include "Template/Template_Endpoint_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_LE +#define  TEMPLATE_BUFFER_TYPE                      void* +#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT() +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8() +#include "Template/Template_Endpoint_RW.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Stream_BE +#define  TEMPLATE_BUFFER_TYPE                      void* +#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT() +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8() +#include "Template/Template_Endpoint_RW.c" + +#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE) +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_LE +	#define  TEMPLATE_BUFFER_TYPE                      const void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_RW.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_PStream_BE +	#define  TEMPLATE_BUFFER_TYPE                      const void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_RW.c" +#endif + +#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE) +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_LE +	#define  TEMPLATE_BUFFER_TYPE                      const void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_RW.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_EStream_BE +	#define  TEMPLATE_BUFFER_TYPE                      const void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearIN() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_RW.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_LE +	#define  TEMPLATE_BUFFER_TYPE                      void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8()) +	#include "Template/Template_Endpoint_RW.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_EStream_BE +	#define  TEMPLATE_BUFFER_TYPE                      void* +	#define  TEMPLATE_CLEAR_ENDPOINT()                 Endpoint_ClearOUT() +	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8()) +	#include "Template/Template_Endpoint_RW.c" +#endif + +#endif + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_LE +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr) +#include "Template/Template_Endpoint_Control_W.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_Stream_BE +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(*BufferPtr) +#include "Template/Template_Endpoint_Control_W.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_LE +#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8() +#include "Template/Template_Endpoint_Control_R.c" + +#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_Stream_BE +#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         *BufferPtr = Endpoint_Read_8() +#include "Template/Template_Endpoint_Control_R.c" + +#if defined(ARCH_HAS_FLASH_ADDRESS_SPACE) +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_LE +	#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_Control_W.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_PStream_BE +	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(pgm_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_Control_W.c" +#endif + +#if defined(ARCH_HAS_EEPROM_ADDRESS_SPACE) +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_LE +	#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_Control_W.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Write_Control_EStream_BE +	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         Endpoint_Write_8(eeprom_read_byte(BufferPtr)) +	#include "Template/Template_Endpoint_Control_W.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_LE +	#define  TEMPLATE_BUFFER_OFFSET(Length)            0 +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr += Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8()) +	#include "Template/Template_Endpoint_Control_R.c" + +	#define  TEMPLATE_FUNC_NAME                        Endpoint_Read_Control_EStream_BE +	#define  TEMPLATE_BUFFER_OFFSET(Length)            (Length - 1) +	#define  TEMPLATE_BUFFER_MOVE(BufferPtr, Amount)   BufferPtr -= Amount +	#define  TEMPLATE_TRANSFER_BYTE(BufferPtr)         eeprom_update_byte(BufferPtr, Endpoint_Read_8()) +	#include "Template/Template_Endpoint_Control_R.c" +#endif + +#endif + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h new file mode 100644 index 0000000000..3c094da49c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h @@ -0,0 +1,658 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Endpoint data stream transmission and reception management for the AVR XMEGA microcontrollers. + *  \copydetails Group_EndpointStreamRW_XMEGA + * + *  \note This file should not be included directly. It is automatically included as needed by the USB driver + *        dispatch header located in LUFA/Drivers/USB/USB.h. + */ + +/** \ingroup Group_EndpointStreamRW + *  \defgroup Group_EndpointStreamRW_XMEGA Read/Write of Multi-Byte Streams (XMEGA) + *  \brief Endpoint data stream transmission and reception management for the Atmel AVR XMEGA architecture. + * + *  Functions, macros, variables, enums and types related to data reading and writing of data streams from + *  and to endpoints. + * + *  @{ + */ + +#ifndef __ENDPOINT_STREAM_XMEGA_H__ +#define __ENDPOINT_STREAM_XMEGA_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../USBMode.h" +		#include "../USBTask.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_USB_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Function Prototypes: */ +			/** \name Stream functions for null data */ +			//@{ + +			/** Reads and discards the given number of bytes from the currently selected endpoint's bank, +			 *  discarding fully read packets from the host as needed. The last packet is not automatically +			 *  discarded once the remaining bytes has been read; the user is responsible for manually +			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the endpoint bank becomes empty while there is still data to process (and after the current +			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number +			 *  of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Endpoint_Discard_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Endpoint_Discard_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[in] Length          Number of bytes to discard via the currently selected endpoint. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Discard_Stream(uint16_t Length, +			                                uint16_t* const BytesProcessed); + +			/** Writes a given number of zeroed bytes to the currently selected endpoint's bank, sending +			 *  full packets to the host as needed. The last packet is not automatically sent once the +			 *  remaining bytes have been written; the user is responsible for manually sending the last +			 *  packet to the host via the \ref Endpoint_ClearIN() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the endpoint bank becomes full while there is still data to process (and after the current +			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the +			 *  total number of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Endpoint_Null_Stream(512, NULL)) != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Endpoint_Null_Stream(512, &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[in] Length          Number of zero bytes to send via the currently selected endpoint. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Null_Stream(uint16_t Length, +			                             uint16_t* const BytesProcessed); + +			//@} + +			/** \name Stream functions for RAM source/destination data */ +			//@{ + +			/** Writes the given number of bytes to the endpoint from the given buffer in little endian, +			 *  sending full packets to the host as needed. The last packet filled is not automatically sent; +			 *  the user is responsible for manually sending the last written packet to the host via the +			 *  \ref Endpoint_ClearIN() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the endpoint bank becomes full while there is still data to process (and after the current +			 *  packet transmission has been initiated) the BytesProcessed location will be updated with the +			 *  total number of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t DataStream[512]; +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream), +			 *                                            NULL)) != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  DataStream[512]; +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Endpoint_Write_Stream_LE(DataStream, sizeof(DataStream), +			 *                                               &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Stream_LE(const void* const Buffer, +			                                 uint16_t Length, +			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Writes the given number of bytes to the endpoint from the given buffer in big endian, +			 *  sending full packets to the host as needed. The last packet filled is not automatically sent; +			 *  the user is responsible for manually sending the last written packet to the host via the +			 *  \ref Endpoint_ClearIN() macro. +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Stream_BE(const void* const Buffer, +			                                 uint16_t Length, +			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the endpoint from the given buffer in little endian, +			 *  discarding fully read packets from the host as needed. The last packet is not automatically +			 *  discarded once the remaining bytes has been read; the user is responsible for manually +			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro. +			 * +			 *  If the BytesProcessed parameter is \c NULL, the entire stream transfer is attempted at once, +			 *  failing or succeeding as a single unit. If the BytesProcessed parameter points to a valid +			 *  storage location, the transfer will instead be performed as a series of chunks. Each time +			 *  the endpoint bank becomes empty while there is still data to process (and after the current +			 *  packet has been acknowledged) the BytesProcessed location will be updated with the total number +			 *  of bytes processed in the stream, and the function will exit with an error code of +			 *  \ref ENDPOINT_RWSTREAM_IncompleteTransfer. This allows for any abort checking to be performed +			 *  in the user code - to continue the transfer, call the function again with identical parameters +			 *  and it will resume until the BytesProcessed value reaches the total transfer length. +			 * +			 *  <b>Single Stream Transfer Example:</b> +			 *  \code +			 *  uint8_t DataStream[512]; +			 *  uint8_t ErrorCode; +			 * +			 *  if ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream), +			 *                                           NULL)) != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *       // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  <b>Partial Stream Transfers Example:</b> +			 *  \code +			 *  uint8_t  DataStream[512]; +			 *  uint8_t  ErrorCode; +			 *  uint16_t BytesProcessed; +			 * +			 *  BytesProcessed = 0; +			 *  while ((ErrorCode = Endpoint_Read_Stream_LE(DataStream, sizeof(DataStream), +			 *                                              &BytesProcessed)) == ENDPOINT_RWSTREAM_IncompleteTransfer) +			 *  { +			 *      // Stream not yet complete - do other actions here, abort if required +			 *  } +			 * +			 *  if (ErrorCode != ENDPOINT_RWSTREAM_NoError) +			 *  { +			 *      // Stream failed to complete - check ErrorCode here +			 *  } +			 *  \endcode +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[out] Buffer          Pointer to the destination data buffer to write to. +			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                              transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Stream_LE(void* const Buffer, +			                                uint16_t Length, +			                                uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the endpoint from the given buffer in big endian, +			 *  discarding fully read packets from the host as needed. The last packet is not automatically +			 *  discarded once the remaining bytes has been read; the user is responsible for manually +			 *  discarding the last packet from the host via the \ref Endpoint_ClearOUT() macro. +			 * +			 *  \note This routine should not be used on CONTROL type endpoints. +			 * +			 *  \param[out] Buffer          Pointer to the destination data buffer to write to. +			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                              transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Stream_BE(void* const Buffer, +			                                uint16_t Length, +			                                uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in little endian, +			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared +			 *  in both failure and success states; the user is responsible for manually clearing the status OUT packet +			 *  to finalize the transfer's status stage via the \ref Endpoint_ClearOUT() macro. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[in] Buffer  Pointer to the source data buffer to read from. +			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Control_Stream_LE(const void* const Buffer, +			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** Writes the given number of bytes to the CONTROL type endpoint from the given buffer in big endian, +			 *  sending full packets to the host as needed. The host OUT acknowledgement is not automatically cleared +			 *  in both failure and success states; the user is responsible for manually clearing the status OUT packet +			 *  to finalize the transfer's status stage via the \ref Endpoint_ClearOUT() macro. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[in] Buffer  Pointer to the source data buffer to read from. +			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Control_Stream_BE(const void* const Buffer, +			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in little endian, +			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not +			 *  automatically sent after success or failure states; the user is responsible for manually sending the +			 *  status IN packet to finalize the transfer's status stage via the \ref Endpoint_ClearIN() macro. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[out] Buffer  Pointer to the destination data buffer to write to. +			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Control_Stream_LE(void* const Buffer, +			                                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** Reads the given number of bytes from the CONTROL endpoint from the given buffer in big endian, +			 *  discarding fully read packets from the host as needed. The device IN acknowledgement is not +			 *  automatically sent after success or failure states; the user is responsible for manually sending the +			 *  status IN packet to finalize the transfer's status stage via the \ref Endpoint_ClearIN() macro. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[out] Buffer  Pointer to the destination data buffer to write to. +			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Control_Stream_BE(void* const Buffer, +			                                        uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); +			//@} + +			/** \name Stream functions for EEPROM source/destination data */ +			//@{ + +			/** EEPROM buffer source version of \ref Endpoint_Write_Stream_LE(). +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_EStream_LE(const void* const Buffer, +			                                  uint16_t Length, +			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer source version of \ref Endpoint_Write_Stream_BE(). +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_EStream_BE(const void* const Buffer, +			                                  uint16_t Length, +			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer destination version of \ref Endpoint_Read_Stream_LE(). +			 * +			 *  \param[out] Buffer          Pointer to the destination data buffer to write to, located in EEPROM memory space. +			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                              transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_EStream_LE(void* const Buffer, +			                                 uint16_t Length, +			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer destination version of \ref Endpoint_Read_Stream_BE(). +			 * +			 *  \param[out] Buffer          Pointer to the destination data buffer to write to, located in EEPROM memory space. +			 *  \param[in]  Length          Number of bytes to send via the currently selected endpoint. +			 *  \param[in]  BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                              transaction should be updated, \c NULL if the entire stream should be read at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_EStream_BE(void* const Buffer, +			                                 uint16_t Length, +			                                 uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer source version of Endpoint_Write_Control_Stream_LE. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 *        \n\n +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[in] Buffer  Pointer to the source data buffer to read from. +			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Control_EStream_LE(const void* const Buffer, +			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer source version of \ref Endpoint_Write_Control_Stream_BE(). +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 *        \n\n +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[in] Buffer  Pointer to the source data buffer to read from. +			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Control_EStream_BE(const void* const Buffer, +			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_LE(). +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 *        \n\n +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[out] Buffer  Pointer to the destination data buffer to write to. +			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Control_EStream_LE(void* const Buffer, +			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** EEPROM buffer source version of \ref Endpoint_Read_Control_Stream_BE(). +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 *        \n\n +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[out] Buffer  Pointer to the destination data buffer to write to. +			 *  \param[in]  Length  Number of bytes to send via the currently selected endpoint. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Read_Control_EStream_BE(void* const Buffer, +			                                         uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); +			//@} + +			/** \name Stream functions for PROGMEM source/destination data */ +			//@{ + +			/** FLASH buffer source version of \ref Endpoint_Write_Stream_LE(). +			 * +			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly. +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_PStream_LE(const void* const Buffer, +			                                  uint16_t Length, +			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** FLASH buffer source version of \ref Endpoint_Write_Stream_BE(). +			 * +			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly. +			 * +			 *  \param[in] Buffer          Pointer to the source data buffer to read from. +			 *  \param[in] Length          Number of bytes to read for the currently selected endpoint into the buffer. +			 *  \param[in] BytesProcessed  Pointer to a location where the total number of bytes processed in the current +			 *                             transaction should be updated, \c NULL if the entire stream should be written at once. +			 * +			 *  \return A value from the \ref Endpoint_Stream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_PStream_BE(const void* const Buffer, +			                                  uint16_t Length, +			                                  uint16_t* const BytesProcessed) ATTR_NON_NULL_PTR_ARG(1); + +			/** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_LE(). +			 * +			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 *        \n\n +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[in] Buffer  Pointer to the source data buffer to read from. +			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Control_PStream_LE(const void* const Buffer, +			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); + +			/** FLASH buffer source version of \ref Endpoint_Write_Control_Stream_BE(). +			 * +			 *  \pre The FLASH data must be located in the first 64KB of FLASH for this function to work correctly. +			 * +			 *  \note This function automatically sends the last packet in the data stage of the transaction; when the +			 *        function returns, the user is responsible for clearing the <b>status</b> stage of the transaction. +			 *        Note that the status stage packet is sent or received in the opposite direction of the data flow. +			 *        \n\n +			 * +			 *  \note This routine should only be used on CONTROL type endpoints. +			 *        \n\n +			 * +			 *  \warning Unlike the standard stream read/write commands, the control stream commands cannot be chained +			 *           together; i.e. the entire stream data must be read or written at the one time. +			 * +			 *  \param[in] Buffer  Pointer to the source data buffer to read from. +			 *  \param[in] Length  Number of bytes to read for the currently selected endpoint into the buffer. +			 * +			 *  \return A value from the \ref Endpoint_ControlStream_RW_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_Write_Control_PStream_BE(const void* const Buffer, +			                                          uint16_t Length) ATTR_NON_NULL_PTR_ARG(1); +			//@} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c new file mode 100644 index 0000000000..470f57ea29 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c @@ -0,0 +1,268 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_XMEGA) + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../USBMode.h" + +#if defined(USB_CAN_BE_DEVICE) + +#include "../Endpoint.h" + +#if !defined(FIXED_CONTROL_ENDPOINT_SIZE) +uint8_t USB_Device_ControlEndpointSize = ENDPOINT_CONTROLEP_DEFAULT_SIZE; +#endif + +Endpoint_FIFOPair_t       USB_Endpoint_FIFOs[ENDPOINT_TOTAL_ENDPOINTS]; + +volatile uint8_t          USB_Endpoint_SelectedEndpoint; +volatile USB_EP_t*        USB_Endpoint_SelectedHandle; +volatile Endpoint_FIFO_t* USB_Endpoint_SelectedFIFO; + +bool Endpoint_IsINReady(void) +{ +	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); + +	return ((USB_Endpoint_SelectedHandle->STATUS & USB_EP_BUSNACK0_bm) ? true : false); +} + +bool Endpoint_IsOUTReceived(void) +{ +	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); + +	if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_TRNCOMPL0_bm) +	{ +		USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; +		return true; +	} + +	return false; +} + +bool Endpoint_IsSETUPReceived(void) +{ +	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); + +	if (USB_Endpoint_SelectedHandle->STATUS & USB_EP_SETUP_bm) +	{ +		USB_Endpoint_SelectedFIFO->Length = USB_Endpoint_SelectedHandle->CNT; +		return true; +	} + +	return false; +} + +void Endpoint_ClearSETUP(void) +{ +	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); +	USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_SETUP_bm | USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); +	USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; +	USB_Endpoint_SelectedFIFO->Position  = 0; + +	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); +	USB_Endpoint_SelectedHandle->STATUS |= USB_EP_TOGGLE_bm; +	USB_Endpoint_SelectedFIFO->Position  = 0; +} + +void Endpoint_ClearIN(void) +{ +	USB_Endpoint_SelectedHandle->CNT     = USB_Endpoint_SelectedFIFO->Position; +	USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); +	USB_Endpoint_SelectedFIFO->Position  = 0; +} + +void Endpoint_ClearOUT(void) +{ +	USB_Endpoint_SelectedHandle->STATUS &= ~(USB_EP_TRNCOMPL0_bm | USB_EP_BUSNACK0_bm | USB_EP_OVF_bm); +	USB_Endpoint_SelectedFIFO->Position  = 0; +} + +void Endpoint_StallTransaction(void) +{ +	USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; + +	if ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_TYPE_gm) == USB_EP_TYPE_CONTROL_gc) +	{ +		Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint ^ ENDPOINT_DIR_IN); +		USB_Endpoint_SelectedHandle->CTRL |= USB_EP_STALL_bm; +	} +} + +uint8_t Endpoint_Read_8(void) +{ +	return USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++]; +} + +void Endpoint_Write_8(const uint8_t Data) +{ +	USB_Endpoint_SelectedFIFO->Data[USB_Endpoint_SelectedFIFO->Position++] = Data; +} + +void Endpoint_SelectEndpoint(const uint8_t Address) +{ +	uint8_t EndpointNumber = (Address & ENDPOINT_EPNUM_MASK); + +	USB_Endpoint_SelectedEndpoint = Address; + +	Endpoint_FIFOPair_t* EndpointFIFOPair = &USB_Endpoint_FIFOs[EndpointNumber]; +	USB_EndpointTable_t* EndpointTable    = (USB_EndpointTable_t*)USB.EPPTR; + +	if (Address & ENDPOINT_DIR_IN) +	{ +		USB_Endpoint_SelectedFIFO   = &EndpointFIFOPair->IN; +		USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].IN; +	} +	else +	{ +		USB_Endpoint_SelectedFIFO   = &EndpointFIFOPair->OUT; +		USB_Endpoint_SelectedHandle = &EndpointTable->Endpoints[EndpointNumber].OUT; +	} +} + +bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, +                                     const uint8_t Entries) +{ +	for (uint8_t i = 0; i < Entries; i++) +	{ +		if (!(Table[i].Address)) +		  continue; + +		if (!(Endpoint_ConfigureEndpoint(Table[i].Address, Table[i].Type, Table[i].Size, Table[i].Banks))) +		{ +			return false; +		} +	} + +	return true; +} + +bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Address, +                                    const uint8_t Config, +                                    const uint8_t Size) +{ +	Endpoint_SelectEndpoint(Address); + +	USB_Endpoint_SelectedHandle->CTRL    = 0; +	USB_Endpoint_SelectedHandle->STATUS  = (Address & ENDPOINT_DIR_IN) ? USB_EP_BUSNACK0_bm : 0; +	USB_Endpoint_SelectedHandle->CTRL    = Config; +	USB_Endpoint_SelectedHandle->CNT     = 0; +	USB_Endpoint_SelectedHandle->DATAPTR = (intptr_t)USB_Endpoint_SelectedFIFO->Data; + +	USB_Endpoint_SelectedFIFO->Length    = (Address & ENDPOINT_DIR_IN) ? Size : 0; +	USB_Endpoint_SelectedFIFO->Position  = 0; + +	return true; +} + +void Endpoint_ClearEndpoints(void) +{ +	for (uint8_t EPNum = 0; EPNum < ENDPOINT_TOTAL_ENDPOINTS; EPNum++) +	{ +		((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].IN.CTRL  = 0; +		((USB_EndpointTable_t*)USB.EPPTR)->Endpoints[EPNum].OUT.CTRL = 0; +	} +} + +void Endpoint_ClearStatusStage(void) +{ +	if (USB_ControlRequest.bmRequestType & REQDIR_DEVICETOHOST) +	{ +		while (!(Endpoint_IsOUTReceived())) +		{ +			if (USB_DeviceState == DEVICE_STATE_Unattached) +			  return; +		} + +		Endpoint_ClearOUT(); +	} +	else +	{ +		while (!(Endpoint_IsINReady())) +		{ +			if (USB_DeviceState == DEVICE_STATE_Unattached) +			  return; +		} + +		Endpoint_ClearIN(); +	} +} + +#if !defined(CONTROL_ONLY_DEVICE) +uint8_t Endpoint_WaitUntilReady(void) +{ +	#if (USB_STREAM_TIMEOUT_MS < 0xFF) +	uint8_t  TimeoutMSRem = USB_STREAM_TIMEOUT_MS; +	#else +	uint16_t TimeoutMSRem = USB_STREAM_TIMEOUT_MS; +	#endif + +	uint16_t PreviousFrameNumber = USB_Device_GetFrameNumber(); + +	for (;;) +	{ +		if (Endpoint_GetEndpointDirection() == ENDPOINT_DIR_IN) +		{ +			if (Endpoint_IsINReady()) +			  return ENDPOINT_READYWAIT_NoError; +		} +		else +		{ +			if (Endpoint_IsOUTReceived()) +			  return ENDPOINT_READYWAIT_NoError; +		} + +		uint8_t USB_DeviceState_LCL = USB_DeviceState; + +		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) +		  return ENDPOINT_READYWAIT_DeviceDisconnected; +		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) +		  return ENDPOINT_READYWAIT_BusSuspended; +		else if (Endpoint_IsStalled()) +		  return ENDPOINT_READYWAIT_EndpointStalled; + +		uint16_t CurrentFrameNumber = USB_Device_GetFrameNumber(); + +		if (CurrentFrameNumber != PreviousFrameNumber) +		{ +			PreviousFrameNumber = CurrentFrameNumber; + +			if (!(TimeoutMSRem--)) +			  return ENDPOINT_READYWAIT_Timeout; +		} +	} +} +#endif + +#endif + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h new file mode 100644 index 0000000000..db7d840d2e --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h @@ -0,0 +1,689 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Endpoint definitions for the AVR XMEGA microcontrollers. + *  \copydetails Group_EndpointManagement_XMEGA + * + *  \note This file should not be included directly. It is automatically included as needed by the USB driver + *        dispatch header located in LUFA/Drivers/USB/USB.h. + */ + +/** \ingroup Group_EndpointRW + *  \defgroup Group_EndpointRW_XMEGA Endpoint Data Reading and Writing (XMEGA) + *  \brief Endpoint data read/write definitions for the Atmel AVR XMEGA architecture. + * + *  Functions, macros, variables, enums and types related to data reading and writing from and to endpoints. + */ + +/** \ingroup Group_EndpointPrimitiveRW + *  \defgroup Group_EndpointPrimitiveRW_XMEGA Read/Write of Primitive Data Types (XMEGA) + *  \brief Endpoint primitive read/write definitions for the Atmel AVR XMEGA architecture. + * + *  Functions, macros, variables, enums and types related to data reading and writing of primitive data types + *  from and to endpoints. + */ + +/** \ingroup Group_EndpointPacketManagement + *  \defgroup Group_EndpointPacketManagement_XMEGA Endpoint Packet Management (XMEGA) + *  \brief Endpoint packet management definitions for the Atmel AVR XMEGA architecture. + * + *  Functions, macros, variables, enums and types related to packet management of endpoints. + */ + +/** \ingroup Group_EndpointManagement + *  \defgroup Group_EndpointManagement_XMEGA Endpoint Management (XMEGA) + *  \brief Endpoint management definitions for the Atmel AVR XMEGA architecture. + * + *  Functions, macros and enums related to endpoint management when in USB Device mode. This + *  module contains the endpoint management macros, as well as endpoint interrupt and data + *  send/receive functions for various data types. + * + *  @{ + */ + +#ifndef __ENDPOINT_XMEGA_H__ +#define __ENDPOINT_XMEGA_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../USBTask.h" +		#include "../USBInterrupt.h" +		#include "../USBController.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_USB_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			#if (!defined(MAX_ENDPOINT_INDEX) && !defined(CONTROL_ONLY_DEVICE)) || defined(__DOXYGEN__) +				/** Total number of endpoints (including the default control endpoint at address 0) which may +				 *  be used in the device. Different USB AVR models support different amounts of endpoints, +				 *  this value reflects the maximum number of endpoints for the currently selected AVR model. +				 */ +				#define ENDPOINT_TOTAL_ENDPOINTS            16 +			#else +				#if defined(CONTROL_ONLY_DEVICE) +					#define ENDPOINT_TOTAL_ENDPOINTS        1 +				#else +					#define ENDPOINT_TOTAL_ENDPOINTS        (MAX_ENDPOINT_INDEX + 1) +				#endif +			#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Type Defines: */ +			typedef struct +			{ +				uint8_t Data[64]; + +				uint8_t Length; +				uint8_t Position; +			} Endpoint_FIFO_t; + +			typedef struct +			{ +				Endpoint_FIFO_t OUT; +				Endpoint_FIFO_t IN; +			} Endpoint_FIFOPair_t; + +		/* External Variables: */ +			extern Endpoint_FIFOPair_t       USB_Endpoint_FIFOs[ENDPOINT_TOTAL_ENDPOINTS]; +			extern volatile uint8_t          USB_Endpoint_SelectedEndpoint; +			extern volatile USB_EP_t*        USB_Endpoint_SelectedHandle; +			extern volatile Endpoint_FIFO_t* USB_Endpoint_SelectedFIFO; + +		/* Inline Functions: */ +			static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) ATTR_WARN_UNUSED_RESULT ATTR_CONST +			                                                                       ATTR_ALWAYS_INLINE; +			static inline uint8_t Endpoint_BytesToEPSizeMask(const uint16_t Bytes) +			{ +				uint8_t  MaskVal    = 0; +				uint16_t CheckBytes = 8; + +				while (CheckBytes < Bytes) +				{ +					MaskVal++; +					CheckBytes <<= 1; +				} + +				return (MaskVal << USB_EP_BUFSIZE_gp); +			} + +		/* Function Prototypes: */ +			bool Endpoint_ConfigureEndpoint_PRV(const uint8_t Address, +			                                    const uint8_t Config, +			                                    const uint8_t Size); +			void Endpoint_ClearEndpoints(void); +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			#if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__)) +				/** Default size of the default control endpoint's bank, until altered by the control endpoint bank size +				 *  value in the device descriptor. Not available if the \c FIXED_CONTROL_ENDPOINT_SIZE token is defined. +				 */ +				#define ENDPOINT_CONTROLEP_DEFAULT_SIZE     8 +			#endif + +		/* Enums: */ +			/** Enum for the possible error return codes of the \ref Endpoint_WaitUntilReady() function. +			 * +			 *  \ingroup Group_EndpointRW_XMEGA +			 */ +			enum Endpoint_WaitUntilReady_ErrorCodes_t +			{ +				ENDPOINT_READYWAIT_NoError                 = 0, /**< Endpoint is ready for next packet, no error. */ +				ENDPOINT_READYWAIT_EndpointStalled         = 1, /**< The endpoint was stalled during the stream +				                                                 *   transfer by the host or device. +				                                                 */ +				ENDPOINT_READYWAIT_DeviceDisconnected      = 2,	/**< Device was disconnected from the host while +				                                                 *   waiting for the endpoint to become ready. +				                                                 */ +				ENDPOINT_READYWAIT_BusSuspended            = 3, /**< The USB bus has been suspended by the host and +				                                                 *   no USB endpoint traffic can occur until the bus +				                                                 *   has resumed. +				                                                 */ +				ENDPOINT_READYWAIT_Timeout                 = 4, /**< The host failed to accept or send the next packet +				                                                 *   within the software timeout period set by the +				                                                 *   \ref USB_STREAM_TIMEOUT_MS macro. +				                                                 */ +			}; + +		/* Inline Functions: */ +			/** Selects the given endpoint address. +			 * +			 *  Any endpoint operations which do not require the endpoint address to be indicated will operate on +			 *  the currently selected endpoint. +			 * +			 *  \param[in] Address  Endpoint address to select. +			 */ +			void Endpoint_SelectEndpoint(const uint8_t Address); + +			/** Configures the specified endpoint address with the given endpoint type, bank size and number of hardware +			 *  banks. Once configured, the endpoint may be read from or written to, depending on its direction. +			 * +			 *  \param[in] Address    Endpoint address to configure. +			 * +			 *  \param[in] Type       Type of endpoint to configure, a \c EP_TYPE_* mask. Not all endpoint types +			 *                        are available on Low Speed USB devices - refer to the USB 2.0 specification. +			 * +			 *  \param[in] Size       Size of the endpoint's bank, where packets are stored before they are transmitted +			 *                        to the USB host, or after they have been received from the USB host (depending on +			 *                        the endpoint's data direction). The bank size must indicate the maximum packet size +			 *                        that the endpoint can handle. +			 * +			 *  \param[in] Banks      Number of hardware banks to use for the endpoint being configured. +			 * +			 *  \note The default control endpoint should not be manually configured by the user application, as +			 *        it is automatically configured by the library internally. +			 *        \n\n +			 * +			 *  \note This routine will automatically select the specified endpoint. +			 * +			 *  \return Boolean \c true if the configuration succeeded, \c false otherwise. +			 */ +			static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, +			                                              const uint8_t Type, +			                                              const uint16_t Size, +			                                              const uint8_t Banks) ATTR_ALWAYS_INLINE; +			static inline bool Endpoint_ConfigureEndpoint(const uint8_t Address, +			                                              const uint8_t Type, +			                                              const uint16_t Size, +			                                              const uint8_t Banks) +			{ +				uint8_t EPConfigMask = (USB_EP_INTDSBL_bm | ((Banks > 1) ? USB_EP_PINGPONG_bm : 0) | Endpoint_BytesToEPSizeMask(Size)); + +				if ((Address & ENDPOINT_EPNUM_MASK) >= ENDPOINT_TOTAL_ENDPOINTS) +				  return false; + +				// TODO - Fix once limitations are lifted +				EPConfigMask &= ~USB_EP_PINGPONG_bm; +				if (Size > 64) +				  return false; + +				switch (Type) +				{ +					case EP_TYPE_CONTROL: +						EPConfigMask |= USB_EP_TYPE_CONTROL_gc; +						break; +					case EP_TYPE_ISOCHRONOUS: +						EPConfigMask |= USB_EP_TYPE_ISOCHRONOUS_gc; +						break; +					default: +						EPConfigMask |= USB_EP_TYPE_BULK_gc; +						break; +				} + +				if (Type == EP_TYPE_CONTROL) +				  Endpoint_ConfigureEndpoint_PRV(Address ^ ENDPOINT_DIR_IN, EPConfigMask, Size); + +				return Endpoint_ConfigureEndpoint_PRV(Address, EPConfigMask, Size); +			} + +			/** Indicates the number of bytes currently stored in the current endpoint's selected bank. +			 * +			 *  \ingroup Group_EndpointRW_XMEGA +			 * +			 *  \return Total number of bytes in the currently selected Endpoint's FIFO buffer. +			 */ +			static inline uint16_t Endpoint_BytesInEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline uint16_t Endpoint_BytesInEndpoint(void) +			{ +				if (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN) +				  return USB_Endpoint_SelectedFIFO->Position; +				else +				  return (USB_Endpoint_SelectedFIFO->Length - USB_Endpoint_SelectedFIFO->Position); +			} + +			/** Get the endpoint address of the currently selected endpoint. This is typically used to save +			 *  the currently selected endpoint so that it can be restored after another endpoint has been +			 *  manipulated. +			 * +			 *  \return Index of the currently selected endpoint. +			 */ +			static inline uint8_t Endpoint_GetCurrentEndpoint(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline uint8_t Endpoint_GetCurrentEndpoint(void) +			{ +				return USB_Endpoint_SelectedEndpoint; +			} + +			/** Resets the endpoint bank FIFO. This clears all the endpoint banks and resets the USB controller's +			 *  data In and Out pointers to the bank's contents. +			 * +			 *  \param[in] Address  Endpoint address whose FIFO buffers are to be reset. +			 */ +			static inline void Endpoint_ResetEndpoint(const uint8_t Address) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_ResetEndpoint(const uint8_t Address) +			{ +				if (Address & ENDPOINT_DIR_IN) +				  USB_Endpoint_FIFOs[Address & ENDPOINT_EPNUM_MASK].IN.Position  = 0; +				else +				  USB_Endpoint_FIFOs[Address & ENDPOINT_EPNUM_MASK].OUT.Position = 0; +			} + +			/** Determines if the currently selected endpoint is enabled, but not necessarily configured. +			 * +			 * \return Boolean \c true if the currently selected endpoint is enabled, \c false otherwise. +			 */ +			static inline bool Endpoint_IsEnabled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool Endpoint_IsEnabled(void) +			{ +				return true; +			} + +			/** Aborts all pending IN transactions on the currently selected endpoint, once the bank +			 *  has been queued for transmission to the host via \ref Endpoint_ClearIN(). This function +			 *  will terminate all queued transactions, resetting the endpoint banks ready for a new +			 *  packet. +			 * +			 *  \ingroup Group_EndpointPacketManagement_XMEGA +			 */ +			static inline void Endpoint_AbortPendingIN(void) +			{ +				USB_Endpoint_SelectedHandle->STATUS |= USB_EP_BUSNACK0_bm; +			} + +			/** Determines if the currently selected endpoint may be read from (if data is waiting in the endpoint +			 *  bank and the endpoint is an OUT direction, or if the bank is not yet full if the endpoint is an IN +			 *  direction). This function will return false if an error has occurred in the endpoint, if the endpoint +			 *  is an OUT direction and no packet (or an empty packet) has been received, or if the endpoint is an IN +			 *  direction and the endpoint bank is full. +			 * +			 *  \ingroup Group_EndpointPacketManagement_XMEGA +			 * +			 *  \return Boolean \c true if the currently selected endpoint may be read from or written to, depending +			 *          on its direction. +			 */ +			static inline bool Endpoint_IsReadWriteAllowed(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool Endpoint_IsReadWriteAllowed(void) +			{ +				return (USB_Endpoint_SelectedFIFO->Position < USB_Endpoint_SelectedFIFO->Length); +			} + +			/** Determines if the currently selected endpoint is configured. +			 * +			 *  \return Boolean \c true if the currently selected endpoint has been configured, \c false otherwise. +			 */ +			static inline bool Endpoint_IsConfigured(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool Endpoint_IsConfigured(void) +			{ +				return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_TYPE_gm) ? true : false); +			} + +			/** Determines if the selected IN endpoint is ready for a new packet to be sent to the host. +			 * +			 *  \ingroup Group_EndpointPacketManagement_XMEGA +			 * +			 *  \return Boolean \c true if the current endpoint is ready for an IN packet, \c false otherwise. +			 */ +			bool Endpoint_IsINReady(void) ATTR_WARN_UNUSED_RESULT; + +			/** Determines if the selected OUT endpoint has received new packet from the host. +			 * +			 *  \ingroup Group_EndpointPacketManagement_XMEGA +			 * +			 *  \return Boolean \c true if current endpoint is has received an OUT packet, \c false otherwise. +			 */ +			bool Endpoint_IsOUTReceived(void) ATTR_WARN_UNUSED_RESULT; + +			/** Determines if the current CONTROL type endpoint has received a SETUP packet. +			 * +			 *  \ingroup Group_EndpointPacketManagement_XMEGA +			 * +			 *  \return Boolean \c true if the selected endpoint has received a SETUP packet, \c false otherwise. +			 */ +			bool Endpoint_IsSETUPReceived(void) ATTR_WARN_UNUSED_RESULT; + +			/** Clears a received SETUP packet on the currently selected CONTROL type endpoint, freeing up the +			 *  endpoint for the next packet. +			 * +			 *  \ingroup Group_EndpointPacketManagement_XMEGA +			 * +			 *  \note This is not applicable for non CONTROL type endpoints. +			 */ +			void Endpoint_ClearSETUP(void); + +			/** Sends an IN packet to the host on the currently selected endpoint, freeing up the endpoint for the +			 *  next packet and switching to the alternative endpoint bank if double banked. +			 * +			 *  \ingroup Group_EndpointPacketManagement_XMEGA +			 */ +			void Endpoint_ClearIN(void); + +			/** Acknowledges an OUT packet to the host on the currently selected endpoint, freeing up the endpoint +			 *  for the next packet and switching to the alternative endpoint bank if double banked. +			 * +			 *  \ingroup Group_EndpointPacketManagement_XMEGA +			 */ +			void Endpoint_ClearOUT(void); + +			/** Stalls the current endpoint, indicating to the host that a logical problem occurred with the +			 *  indicated endpoint and that the current transfer sequence should be aborted. This provides a +			 *  way for devices to indicate invalid commands to the host so that the current transfer can be +			 *  aborted and the host can begin its own recovery sequence. +			 * +			 *  The currently selected endpoint remains stalled until either the \ref Endpoint_ClearStall() macro +			 *  is called, or the host issues a CLEAR FEATURE request to the device for the currently selected +			 *  endpoint. +			 * +			 *  \ingroup Group_EndpointPacketManagement_XMEGA +			 */ +			void Endpoint_StallTransaction(void); + +			/** Clears the STALL condition on the currently selected endpoint. +			 * +			 *  \ingroup Group_EndpointPacketManagement_XMEGA +			 */ +			static inline void Endpoint_ClearStall(void) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_ClearStall(void) +			{ +				USB_Endpoint_SelectedHandle->CTRL &= ~USB_EP_STALL_bm; +			} + +			/** Determines if the currently selected endpoint is stalled, \c false otherwise. +			 * +			 *  \ingroup Group_EndpointPacketManagement_XMEGA +			 * +			 *  \return Boolean \c true if the currently selected endpoint is stalled, \c false otherwise. +			 */ +			static inline bool Endpoint_IsStalled(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline bool Endpoint_IsStalled(void) +			{ +				return ((USB_Endpoint_SelectedHandle->CTRL & USB_EP_STALL_bm) ? true : false); +			} + +			/** Resets the data toggle of the currently selected endpoint. */ +			static inline void Endpoint_ResetDataToggle(void) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_ResetDataToggle(void) +			{ +				USB_Endpoint_SelectedHandle->STATUS &= ~USB_EP_TOGGLE_bm; +			} + +			/** Determines the currently selected endpoint's direction. +			 * +			 *  \return The currently selected endpoint's direction, as a \c ENDPOINT_DIR_* mask. +			 */ +			static inline uint8_t Endpoint_GetEndpointDirection(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline uint8_t Endpoint_GetEndpointDirection(void) +			{ +				return (USB_Endpoint_SelectedEndpoint & ENDPOINT_DIR_IN); +			} + +			/** Reads one byte from the currently selected endpoint's bank, for OUT direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA +			 * +			 *  \return Next byte in the currently selected endpoint's FIFO buffer. +			 */ +			uint8_t Endpoint_Read_8(void) ATTR_WARN_UNUSED_RESULT; + +			/** Writes one byte to the currently selected endpoint's bank, for IN direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA +			 * +			 *  \param[in] Data  Data to write into the the currently selected endpoint's FIFO buffer. +			 */ +			void Endpoint_Write_8(const uint8_t Data); + +			/** Discards one byte from the currently selected endpoint's bank, for OUT direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA +			 */ +			static inline void Endpoint_Discard_8(void) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_Discard_8(void) +			{ +				USB_Endpoint_SelectedFIFO->Position++; +			} + +			/** Reads two bytes from the currently selected endpoint's bank in little endian format, for OUT +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA +			 * +			 *  \return Next two bytes in the currently selected endpoint's FIFO buffer. +			 */ +			static inline uint16_t Endpoint_Read_16_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline uint16_t Endpoint_Read_16_LE(void) +			{ +				uint16_t Byte0 = Endpoint_Read_8(); +				uint16_t Byte1 = Endpoint_Read_8(); + +				return ((Byte1 << 8) | Byte0); +			} + +			/** Reads two bytes from the currently selected endpoint's bank in big endian format, for OUT +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA +			 * +			 *  \return Next two bytes in the currently selected endpoint's FIFO buffer. +			 */ +			static inline uint16_t Endpoint_Read_16_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline uint16_t Endpoint_Read_16_BE(void) +			{ +				uint16_t Byte0 = Endpoint_Read_8(); +				uint16_t Byte1 = Endpoint_Read_8(); + +				return ((Byte0 << 8) | Byte1); +			} + +			/** Writes two bytes to the currently selected endpoint's bank in little endian format, for IN +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA +			 * +			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer. +			 */ +			static inline void Endpoint_Write_16_LE(const uint16_t Data) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_Write_16_LE(const uint16_t Data) +			{ +				Endpoint_Write_8(Data & 0xFF); +				Endpoint_Write_8(Data >> 8); +			} + +			/** Writes two bytes to the currently selected endpoint's bank in big endian format, for IN +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA +			 * +			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer. +			 */ +			static inline void Endpoint_Write_16_BE(const uint16_t Data) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_Write_16_BE(const uint16_t Data) +			{ +				Endpoint_Write_8(Data >> 8); +				Endpoint_Write_8(Data & 0xFF); +			} + +			/** Discards two bytes from the currently selected endpoint's bank, for OUT direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA +			 */ +			static inline void Endpoint_Discard_16(void) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_Discard_16(void) +			{ +				Endpoint_Discard_8(); +				Endpoint_Discard_8(); +			} + +			/** Reads four bytes from the currently selected endpoint's bank in little endian format, for OUT +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA +			 * +			 *  \return Next four bytes in the currently selected endpoint's FIFO buffer. +			 */ +			static inline uint32_t Endpoint_Read_32_LE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline uint32_t Endpoint_Read_32_LE(void) +			{ +				uint32_t Byte0 = Endpoint_Read_8(); +				uint32_t Byte1 = Endpoint_Read_8(); +				uint32_t Byte2 = Endpoint_Read_8(); +				uint32_t Byte3 = Endpoint_Read_8(); + +				return ((Byte3 << 24) | (Byte2 << 16) | (Byte1 << 8) | Byte0); +			} + +			/** Reads four bytes from the currently selected endpoint's bank in big endian format, for OUT +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA +			 * +			 *  \return Next four bytes in the currently selected endpoint's FIFO buffer. +			 */ +			static inline uint32_t Endpoint_Read_32_BE(void) ATTR_WARN_UNUSED_RESULT ATTR_ALWAYS_INLINE; +			static inline uint32_t Endpoint_Read_32_BE(void) +			{ +				uint32_t Byte0 = Endpoint_Read_8(); +				uint32_t Byte1 = Endpoint_Read_8(); +				uint32_t Byte2 = Endpoint_Read_8(); +				uint32_t Byte3 = Endpoint_Read_8(); + +				return ((Byte0 << 24) | (Byte1 << 16) | (Byte2 << 8) | Byte3); +			} + +			/** Writes four bytes to the currently selected endpoint's bank in little endian format, for IN +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA +			 * +			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer. +			 */ +			static inline void Endpoint_Write_32_LE(const uint32_t Data) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_Write_32_LE(const uint32_t Data) +			{ +				Endpoint_Write_8(Data & 0xFF); +				Endpoint_Write_8(Data >> 8); +				Endpoint_Write_8(Data >> 16); +				Endpoint_Write_8(Data >> 24); +			} + +			/** Writes four bytes to the currently selected endpoint's bank in big endian format, for IN +			 *  direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA +			 * +			 *  \param[in] Data  Data to write to the currently selected endpoint's FIFO buffer. +			 */ +			static inline void Endpoint_Write_32_BE(const uint32_t Data) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_Write_32_BE(const uint32_t Data) +			{ +				Endpoint_Write_8(Data >> 24); +				Endpoint_Write_8(Data >> 16); +				Endpoint_Write_8(Data >> 8); +				Endpoint_Write_8(Data & 0xFF); +			} + +			/** Discards four bytes from the currently selected endpoint's bank, for OUT direction endpoints. +			 * +			 *  \ingroup Group_EndpointPrimitiveRW_XMEGA +			 */ +			static inline void Endpoint_Discard_32(void) ATTR_ALWAYS_INLINE; +			static inline void Endpoint_Discard_32(void) +			{ +				Endpoint_Discard_8(); +				Endpoint_Discard_8(); +				Endpoint_Discard_8(); +				Endpoint_Discard_8(); +			} + +		/* External Variables: */ +			/** Global indicating the maximum packet size of the default control endpoint located at address +			 *  0 in the device. This value is set to the value indicated in the device descriptor in the user +			 *  project once the USB interface is initialized into device mode. +			 * +			 *  If space is an issue, it is possible to fix this to a static value by defining the control +			 *  endpoint size in the \c FIXED_CONTROL_ENDPOINT_SIZE token passed to the compiler in the makefile +			 *  via the -D switch. When a fixed control endpoint size is used, the size is no longer dynamically +			 *  read from the descriptors at runtime and instead fixed to the given value. When used, it is +			 *  important that the descriptor control endpoint size value matches the size given as the +			 *  \c FIXED_CONTROL_ENDPOINT_SIZE token - it is recommended that the \c FIXED_CONTROL_ENDPOINT_SIZE token +			 *  be used in the device descriptors to ensure this. +			 * +			 *  \attention This variable should be treated as read-only in the user application, and never manually +			 *             changed in value. +			 */ +			#if (!defined(FIXED_CONTROL_ENDPOINT_SIZE) || defined(__DOXYGEN__)) +				extern uint8_t USB_Device_ControlEndpointSize; +			#else +				#define USB_Device_ControlEndpointSize FIXED_CONTROL_ENDPOINT_SIZE +			#endif + +		/* Function Prototypes: */ +			/** Configures a table of endpoint descriptions, in sequence. This function can be used to configure multiple +			 *  endpoints at the same time. +			 * +			 *  \note Endpoints with a zero address will be ignored, thus this function cannot be used to configure the +			 *        control endpoint. +			 * +			 *  \param[in] Table    Pointer to a table of endpoint descriptions. +			 *  \param[in] Entries  Number of entries in the endpoint table to configure. +			 * +			 *  \return Boolean \c true if all endpoints configured successfully, \c false otherwise. +			 */ +			bool Endpoint_ConfigureEndpointTable(const USB_Endpoint_Table_t* const Table, +			                                     const uint8_t Entries); + +			/** Completes the status stage of a control transfer on a CONTROL type endpoint automatically, +			 *  with respect to the data direction. This is a convenience function which can be used to +			 *  simplify user control request handling. +			 * +			 *  \note This routine should not be called on non CONTROL type endpoints. +			 */ +			void Endpoint_ClearStatusStage(void); + +			/** Spin-loops until the currently selected non-control endpoint is ready for the next packet of data +			 *  to be read or written to it. +			 * +			 *  \note This routine should not be called on CONTROL type endpoints. +			 * +			 *  \ingroup Group_EndpointRW_XMEGA +			 * +			 *  \return A value from the \ref Endpoint_WaitUntilReady_ErrorCodes_t enum. +			 */ +			uint8_t Endpoint_WaitUntilReady(void); + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c new file mode 100644 index 0000000000..b8b8c462cc --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Host_XMEGA.c @@ -0,0 +1,41 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_XMEGA) + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../USBMode.h" + +#if defined(USB_CAN_BE_HOST) + +#endif + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c new file mode 100644 index 0000000000..b8b8c462cc --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/PipeStream_XMEGA.c @@ -0,0 +1,41 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_XMEGA) + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../USBMode.h" + +#if defined(USB_CAN_BE_HOST) + +#endif + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c new file mode 100644 index 0000000000..bb92b1d763 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Pipe_XMEGA.c @@ -0,0 +1,37 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../USBMode.h" + +#if defined(USB_CAN_BE_HOST) + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c new file mode 100644 index 0000000000..c923f31017 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c @@ -0,0 +1,86 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#if defined(TEMPLATE_FUNC_NAME) + +uint8_t TEMPLATE_FUNC_NAME (void* const Buffer, +                            uint16_t Length) +{ +	uint8_t* DataStream = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); + +	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint & ~ENDPOINT_DIR_IN); + +	if (!(Length)) +	  Endpoint_ClearOUT(); + +	while (Length) +	{ +		uint8_t USB_DeviceState_LCL = USB_DeviceState; + +		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) +		  return ENDPOINT_RWCSTREAM_DeviceDisconnected; +		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) +		  return ENDPOINT_RWCSTREAM_BusSuspended; +		else if (Endpoint_IsSETUPReceived()) +		  return ENDPOINT_RWCSTREAM_HostAborted; + +		if (Endpoint_IsOUTReceived()) +		{ +			while (Length && Endpoint_BytesInEndpoint()) +			{ +				TEMPLATE_TRANSFER_BYTE(DataStream); +				TEMPLATE_BUFFER_MOVE(DataStream, 1); +				Length--; +			} + +			Endpoint_ClearOUT(); +		} +	} + +	while (!(Endpoint_IsINReady())) +	{ +		uint8_t USB_DeviceState_LCL = USB_DeviceState; + +		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) +		  return ENDPOINT_RWCSTREAM_DeviceDisconnected; +		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) +		  return ENDPOINT_RWCSTREAM_BusSuspended; +	} + +	return ENDPOINT_RWCSTREAM_NoError; +} + +#undef TEMPLATE_BUFFER_OFFSET +#undef TEMPLATE_BUFFER_MOVE +#undef TEMPLATE_FUNC_NAME +#undef TEMPLATE_TRANSFER_BYTE + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c new file mode 100644 index 0000000000..b32de813df --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c @@ -0,0 +1,97 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#if defined(TEMPLATE_FUNC_NAME) + +uint8_t TEMPLATE_FUNC_NAME (const void* const Buffer, +                            uint16_t Length) +{ +	uint8_t* DataStream     = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); +	bool     LastPacketFull = false; + +	Endpoint_SelectEndpoint(USB_Endpoint_SelectedEndpoint | ENDPOINT_DIR_IN); + +	if (Length > USB_ControlRequest.wLength) +	  Length = USB_ControlRequest.wLength; +	else if (!(Length)) +	  Endpoint_ClearIN(); + +	while (Length || LastPacketFull) +	{ +		uint8_t USB_DeviceState_LCL = USB_DeviceState; + +		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) +		  return ENDPOINT_RWCSTREAM_DeviceDisconnected; +		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) +		  return ENDPOINT_RWCSTREAM_BusSuspended; +		else if (Endpoint_IsSETUPReceived()) +		  return ENDPOINT_RWCSTREAM_HostAborted; +		else if (Endpoint_IsOUTReceived()) +		  break; + +		if (Endpoint_IsINReady()) +		{ +			uint16_t BytesInEndpoint = Endpoint_BytesInEndpoint(); + +			while (Length && (BytesInEndpoint < USB_Device_ControlEndpointSize)) +			{ +				TEMPLATE_TRANSFER_BYTE(DataStream); +				TEMPLATE_BUFFER_MOVE(DataStream, 1); +				Length--; +				BytesInEndpoint++; +			} + +			LastPacketFull = (BytesInEndpoint == USB_Device_ControlEndpointSize); +			Endpoint_ClearIN(); +		} +	} + +	while (!(Endpoint_IsOUTReceived())) +	{ +		uint8_t USB_DeviceState_LCL = USB_DeviceState; + +		if (USB_DeviceState_LCL == DEVICE_STATE_Unattached) +		  return ENDPOINT_RWCSTREAM_DeviceDisconnected; +		else if (USB_DeviceState_LCL == DEVICE_STATE_Suspended) +		  return ENDPOINT_RWCSTREAM_BusSuspended; +		else if (Endpoint_IsSETUPReceived()) +		  return ENDPOINT_RWCSTREAM_HostAborted; +	} + +	return ENDPOINT_RWCSTREAM_NoError; +} + +#undef TEMPLATE_BUFFER_OFFSET +#undef TEMPLATE_BUFFER_MOVE +#undef TEMPLATE_FUNC_NAME +#undef TEMPLATE_TRANSFER_BYTE + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c new file mode 100644 index 0000000000..e55e592eb2 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c @@ -0,0 +1,89 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#if defined(TEMPLATE_FUNC_NAME) + +uint8_t TEMPLATE_FUNC_NAME (TEMPLATE_BUFFER_TYPE const Buffer, +                            uint16_t Length, +                            uint16_t* const BytesProcessed) +{ +	uint8_t* DataStream      = ((uint8_t*)Buffer + TEMPLATE_BUFFER_OFFSET(Length)); +	uint16_t BytesInTransfer = 0; +	uint8_t  ErrorCode; + +	if ((ErrorCode = Endpoint_WaitUntilReady())) +	  return ErrorCode; + +	if (BytesProcessed != NULL) +	{ +		Length -= *BytesProcessed; +		TEMPLATE_BUFFER_MOVE(DataStream, *BytesProcessed); +	} + +	while (Length) +	{ +		if (!(Endpoint_IsReadWriteAllowed())) +		{ +			TEMPLATE_CLEAR_ENDPOINT(); + +			#if !defined(INTERRUPT_CONTROL_ENDPOINT) +			USB_USBTask(); +			#endif + +			if (BytesProcessed != NULL) +			{ +				*BytesProcessed += BytesInTransfer; +				return ENDPOINT_RWSTREAM_IncompleteTransfer; +			} + +			if ((ErrorCode = Endpoint_WaitUntilReady())) +			  return ErrorCode; +		} +		else +		{ +			TEMPLATE_TRANSFER_BYTE(DataStream); +			TEMPLATE_BUFFER_MOVE(DataStream, 1); +			Length--; +			BytesInTransfer++; +		} +	} + +	return ENDPOINT_RWSTREAM_NoError; +} + +#undef TEMPLATE_FUNC_NAME +#undef TEMPLATE_BUFFER_TYPE +#undef TEMPLATE_TRANSFER_BYTE +#undef TEMPLATE_CLEAR_ENDPOINT +#undef TEMPLATE_BUFFER_OFFSET +#undef TEMPLATE_BUFFER_MOVE + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c new file mode 100644 index 0000000000..4eea57a0bf --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.c @@ -0,0 +1,204 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_XMEGA) + +#define  __INCLUDE_FROM_USB_DRIVER +#define  __INCLUDE_FROM_USB_CONTROLLER_C +#include "../USBController.h" + +#if defined(USB_CAN_BE_BOTH) +volatile uint8_t USB_CurrentMode = USB_MODE_None; +#endif + +#if !defined(USE_STATIC_OPTIONS) +volatile uint8_t USB_Options; +#endif + +/* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for the 8-bit AVR-GCC toolchain */ +uint8_t USB_EndpointTable[sizeof(USB_EndpointTable_t) + 1]; + +void USB_Init( +               #if defined(USB_CAN_BE_BOTH) +               const uint8_t Mode +               #endif + +               #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS)) +               , +               #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS)) +               void +               #endif + +               #if !defined(USE_STATIC_OPTIONS) +               const uint8_t Options +               #endif +               ) +{ +	#if !defined(USE_STATIC_OPTIONS) +	USB_Options = Options; +	#endif + +	uint_reg_t CurrentGlobalInt = GetGlobalInterruptMask(); +	GlobalInterruptDisable(); + +	NVM.CMD  = NVM_CMD_READ_CALIB_ROW_gc; +	USB.CAL0 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL0)); +	USB.CAL1 = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBCAL1)); +	NVM.CMD  = NVM_CMD_NO_OPERATION_gc; + +	/* Ugly workaround to ensure an aligned table, since __BIGGEST_ALIGNMENT__ == 1 for the 8-bit AVR-GCC toolchain */ +	USB.EPPTR = ((intptr_t)&USB_EndpointTable[1] & ~(1 << 0)); +	USB.CTRLA = (USB_STFRNUM_bm | ((ENDPOINT_TOTAL_ENDPOINTS - 1) << USB_MAXEP_gp)); + +	if ((USB_Options & USB_OPT_BUSEVENT_PRIHIGH) == USB_OPT_BUSEVENT_PRIHIGH) +	  USB.INTCTRLA = (3 << USB_INTLVL_gp); +	else if ((USB_Options & USB_OPT_BUSEVENT_PRIMED) == USB_OPT_BUSEVENT_PRIMED) +	  USB.INTCTRLA = (2 << USB_INTLVL_gp); +	else +	  USB.INTCTRLA = (1 << USB_INTLVL_gp); + +	SetGlobalInterruptMask(CurrentGlobalInt); + +	#if defined(USB_CAN_BE_BOTH) +	USB_CurrentMode = Mode; +	#endif + +	USB_IsInitialized = true; + +	USB_ResetInterface(); +} + +void USB_Disable(void) +{ +	USB_INT_DisableAllInterrupts(); +	USB_INT_ClearAllInterrupts(); + +	USB_Detach(); +	USB_Controller_Disable(); + +	USB_IsInitialized = false; +} + +void USB_ResetInterface(void) +{ +	uint8_t PrescalerNeeded; + +	#if defined(USB_DEVICE_OPT_FULLSPEED) +	if (USB_Options & USB_DEVICE_OPT_LOWSPEED) +	  PrescalerNeeded = F_USB / 6000000; +	else +	  PrescalerNeeded = F_USB / 48000000; +	#else +	PrescalerNeeded = F_USB / 6000000; +	#endif + +	uint8_t DividerIndex = 0; +	while (PrescalerNeeded > 0) +	{ +		DividerIndex++; +		PrescalerNeeded >>= 1; +	} + +	CLK.USBCTRL = (DividerIndex - 1) << CLK_USBPSDIV_gp; + +	if (USB_Options & USB_OPT_PLLCLKSRC) +	  CLK.USBCTRL |= (CLK_USBSRC_PLL_gc   | CLK_USBSEN_bm); +	else +	  CLK.USBCTRL |= (CLK_USBSRC_RC32M_gc | CLK_USBSEN_bm); + +	USB_Device_SetDeviceAddress(0); + +	USB_INT_DisableAllInterrupts(); +	USB_INT_ClearAllInterrupts(); + +	USB_Controller_Reset(); +	USB_Init_Device(); +} + +#if defined(USB_CAN_BE_DEVICE) +static void USB_Init_Device(void) +{ +	USB_DeviceState                 = DEVICE_STATE_Unattached; +	USB_Device_ConfigurationNumber  = 0; + +	#if !defined(NO_DEVICE_REMOTE_WAKEUP) +	USB_Device_RemoteWakeupEnabled  = false; +	#endif + +	#if !defined(NO_DEVICE_SELF_POWER) +	USB_Device_CurrentlySelfPowered = false; +	#endif + +	#if !defined(FIXED_CONTROL_ENDPOINT_SIZE) +	USB_Descriptor_Device_t* DeviceDescriptorPtr; + +	#if defined(ARCH_HAS_MULTI_ADDRESS_SPACE) && \ +	    !(defined(USE_FLASH_DESCRIPTORS) || defined(USE_EEPROM_DESCRIPTORS) || defined(USE_RAM_DESCRIPTORS)) +	uint8_t DescriptorAddressSpace; + +	if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr, &DescriptorAddressSpace) != NO_DESCRIPTOR) +	{ +		if (DescriptorAddressSpace == MEMSPACE_FLASH) +		  USB_Device_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size); +		else if (DescriptorAddressSpace == MEMSPACE_EEPROM) +		  USB_Device_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size); +		else +		  USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size; +	} +	#else +	if (CALLBACK_USB_GetDescriptor((DTYPE_Device << 8), 0, (void*)&DeviceDescriptorPtr) != NO_DESCRIPTOR) +	{ +		#if defined(USE_RAM_DESCRIPTORS) +		USB_Device_ControlEndpointSize = DeviceDescriptorPtr->Endpoint0Size; +		#elif defined(USE_EEPROM_DESCRIPTORS) +		USB_Device_ControlEndpointSize = eeprom_read_byte(&DeviceDescriptorPtr->Endpoint0Size); +		#else +		USB_Device_ControlEndpointSize = pgm_read_byte(&DeviceDescriptorPtr->Endpoint0Size); +		#endif +	} +	#endif +	#endif + +	if (USB_Options & USB_DEVICE_OPT_LOWSPEED) +	  USB_Device_SetLowSpeed(); +	else +	  USB_Device_SetFullSpeed(); + +	Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL, +							   USB_Device_ControlEndpointSize, 1); + +	USB_INT_Enable(USB_INT_BUSEVENTI); + +	USB_Attach(); +} +#endif + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h new file mode 100644 index 0000000000..6bab03a7d3 --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBController_XMEGA.h @@ -0,0 +1,313 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Controller definitions for the AVR XMEGA microcontrollers. + *  \copydetails Group_USBManagement_XMEGA + * + *  \note This file should not be included directly. It is automatically included as needed by the USB driver + *        dispatch header located in LUFA/Drivers/USB/USB.h. + */ + +/** \ingroup Group_USBManagement + *  \defgroup Group_USBManagement_XMEGA USB Interface Management (XMEGA) + *  \brief USB Controller definitions for the AVR XMEGA microcontrollers. + * + *  Functions, macros, variables, enums and types related to the setup and management of the USB interface. + * + *  @{ + */ + +#ifndef __USBCONTROLLER_XMEGA_H__ +#define __USBCONTROLLER_XMEGA_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" +		#include "../USBMode.h" +		#include "../Events.h" +		#include "../USBTask.h" +		#include "../USBInterrupt.h" + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Macros: */ +			#if defined(MAX_ENDPOINT_INDEX) +				#define ENDPOINT_TABLE_COUNT  (MAX_ENDPOINT_INDEX + 1) +			#else +				#define ENDPOINT_TABLE_COUNT  16 +			#endif + +		/* Type Defines: */ +			typedef struct +			{ +				struct +				{ +					USB_EP_t OUT; +					USB_EP_t IN; +				} Endpoints[ENDPOINT_TABLE_COUNT]; +				uint16_t FrameNum; +			} ATTR_PACKED USB_EndpointTable_t; + +		/* External Variables: */ +			extern uint8_t USB_EndpointTable[]; +	#endif + +	/* Includes: */ +		#if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__) +			#include "../Device.h" +			#include "../Endpoint.h" +			#include "../DeviceStandardReq.h" +			#include "../EndpointStream.h" +		#endif + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks and Defines: */ +		#if !defined(__INCLUDE_FROM_USB_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. +		#endif + +		#if !defined(F_USB) +			#error F_USB is not defined. You must define F_USB to the frequency of the unprescaled USB controller clock in your project makefile. +		#endif + +		#if ((F_USB % 6000000) || (F_USB < 6000000)) +			#error Invalid F_USB specified. F_USB must be a multiple of 6MHz for USB Low Speed operation, and a multiple of 48MHz for Full Speed operation. +		#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** \name USB Controller Option Masks */ +			//@{ +			/** Sets the USB bus interrupt priority level to be low priority. The USB bus interrupt is used for Start of Frame events, bus suspend +			 *  and resume events, bus reset events and other events related to the management of the USB bus. +			 */ +			#define USB_OPT_BUSEVENT_PRILOW           ((0 << 2) | (0 << 1)) + +			/** Sets the USB bus interrupt priority level to be medium priority. The USB bus interrupt is used for Start of Frame events, bus suspend +			 *  and resume events, bus reset events and other events related to the management of the USB bus. +			 */ +			#define USB_OPT_BUSEVENT_PRIMED           ((0 << 2) | (1 << 1)) + +			/** Sets the USB bus interrupt priority level to be high priority. The USB bus interrupt is used for Start of Frame events, bus suspend +			 *  and resume events, bus reset events and other events related to the management of the USB bus. +			 */ +			#define USB_OPT_BUSEVENT_PRIHIGH          ((1 << 2) | (0 << 1)) + +			/** Sets the USB controller to source its clock from the internal RC 32MHz clock, once it has been DFLL calibrated to 48MHz. */ +			#define USB_OPT_RC32MCLKSRC               (0 << 3) + +			/** Sets the USB controller to source its clock from the internal PLL. */ +			#define USB_OPT_PLLCLKSRC                 (1 << 3) +			//@} + +			#if !defined(USB_STREAM_TIMEOUT_MS) || defined(__DOXYGEN__) +				/** Constant for the maximum software timeout period of the USB data stream transfer functions +				 *  (both control and standard) when in either device or host mode. If the next packet of a stream +				 *  is not received or acknowledged within this time period, the stream function will fail. +				 * +				 *  This value may be overridden in the user project makefile as the value of the +				 *  \ref USB_STREAM_TIMEOUT_MS token, and passed to the compiler using the -D switch. +				 */ +				#define USB_STREAM_TIMEOUT_MS       100 +			#endif + +		/* Inline Functions: */ +			/** Detaches the device from the USB bus. This has the effect of removing the device from any +			 *  attached host, ceasing USB communications. If no host is present, this prevents any host from +			 *  enumerating the device once attached until \ref USB_Attach() is called. +			 */ +			static inline void USB_Detach(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Detach(void) +			{ +				USB.CTRLB &= ~USB_ATTACH_bm; +			} + +			/** Attaches the device to the USB bus. This announces the device's presence to any attached +			 *  USB host, starting the enumeration process. If no host is present, attaching the device +			 *  will allow for enumeration once a host is connected to the device. +			 * +			 *  This is inexplicably also required for proper operation while in host mode, to enable the +			 *  attachment of a device to the host. This is despite the bit being located in the device-mode +			 *  register and despite the datasheet making no mention of its requirement in host mode. +			 */ +			static inline void USB_Attach(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Attach(void) +			{ +				USB.CTRLB |= USB_ATTACH_bm; +			} + +		/* Function Prototypes: */ +			/** Main function to initialize and start the USB interface. Once active, the USB interface will +			 *  allow for device connection to a host when in device mode, or for device enumeration while in +			 *  host mode. +			 * +			 *  As the USB library relies on interrupts for the device and host mode enumeration processes, +			 *  the user must enable global interrupts before or shortly after this function is called. In +			 *  device mode, interrupts must be enabled within 500ms of this function being called to ensure +			 *  that the host does not time out whilst enumerating the device. In host mode, interrupts may be +			 *  enabled at the application's leisure however enumeration will not begin of an attached device +			 *  until after this has occurred. +			 * +			 *  Calling this function when the USB interface is already initialized will cause a complete USB +			 *  interface reset and re-enumeration. +			 * +			 *  \param[in] Mode     Mask indicating what mode the USB interface is to be initialized to, a value +			 *                      from the \ref USB_Modes_t enum. +			 *                      \note This parameter does not exist on devices with only one supported USB +			 *                            mode (device or host). +			 * +			 *  \param[in] Options  Mask indicating the options which should be used when initializing the USB +			 *                      interface to control the USB interface's behavior. This should be comprised of +			 *                      a \c USB_OPT_REG_* mask to control the regulator, a \c USB_OPT_*_PLL mask to control the +			 *                      PLL, and a \c USB_DEVICE_OPT_* mask (when the device mode is enabled) to set the device +			 *                      mode speed. +			 * +			 *  \note To reduce the FLASH requirements of the library if only device or host mode is required, +			 *        the mode can be statically set in the project makefile by defining the token \c USB_DEVICE_ONLY +			 *        (for device mode) or \c USB_HOST_ONLY (for host mode), passing the token to the compiler +			 *        via the -D switch. If the mode is statically set, this parameter does not exist in the +			 *        function prototype. +			 *        \n\n +			 * +			 *  \note To reduce the FLASH requirements of the library if only fixed settings are required, +			 *        the options may be set statically in the same manner as the mode (see the Mode parameter of +			 *        this function). To statically set the USB options, pass in the \c USE_STATIC_OPTIONS token, +			 *        defined to the appropriate options masks. When the options are statically set, this +			 *        parameter does not exist in the function prototype. +			 *        \n\n +			 * +			 *  \note The mode parameter does not exist on devices where only one mode is possible, such as USB +			 *        AVR models which only implement the USB device mode in hardware. +			 * +			 *  \see \ref Group_Device for the \c USB_DEVICE_OPT_* masks. +			 */ +			void USB_Init( +			               #if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__) +			               const uint8_t Mode +			               #endif + +			               #if (defined(USB_CAN_BE_BOTH) && !defined(USE_STATIC_OPTIONS)) || defined(__DOXYGEN__) +			               , +			               #elif (!defined(USB_CAN_BE_BOTH) && defined(USE_STATIC_OPTIONS)) +			               void +			               #endif + +			               #if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__) +			               const uint8_t Options +			               #endif +			               ); + +			/** Shuts down the USB interface. This turns off the USB interface after deallocating all USB FIFO +			 *  memory, endpoints and pipes. When turned off, no USB functionality can be used until the interface +			 *  is restarted with the \ref USB_Init() function. +			 */ +			void USB_Disable(void); + +			/** Resets the interface, when already initialized. This will re-enumerate the device if already connected +			 *  to a host, or re-enumerate an already attached device when in host mode. +			 */ +			void USB_ResetInterface(void); + +		/* Global Variables: */ +			#if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__) +				/** Indicates the mode that the USB interface is currently initialized to, a value from the +				 *  \ref USB_Modes_t enum. +				 * +				 *  \attention This variable should be treated as read-only in the user application, and never manually +				 *             changed in value. +				 * +				 *  \note When the controller is initialized into UID auto-detection mode, this variable will hold the +				 *        currently selected USB mode (i.e. \ref USB_MODE_Device or \ref USB_MODE_Host). If the controller +				 *        is fixed into a specific mode (either through the \c USB_DEVICE_ONLY or \c USB_HOST_ONLY compile time +				 *        options, or a limitation of the USB controller in the chosen device model) this will evaluate to +				 *        a constant of the appropriate value and will never evaluate to \ref USB_MODE_None even when the +				 *        USB interface is not initialized. +				 */ +				extern volatile uint8_t USB_CurrentMode; +			#elif defined(USB_CAN_BE_HOST) +				#define USB_CurrentMode USB_MODE_Host +			#elif defined(USB_CAN_BE_DEVICE) +				#define USB_CurrentMode USB_MODE_Device +			#endif + +			#if !defined(USE_STATIC_OPTIONS) || defined(__DOXYGEN__) +				/** Indicates the current USB options that the USB interface was initialized with when \ref USB_Init() +				 *  was called. This value will be one of the \c USB_MODE_* masks defined elsewhere in this module. +				 * +				 *  \attention This variable should be treated as read-only in the user application, and never manually +				 *             changed in value. +				 */ +				extern volatile uint8_t USB_Options; +			#elif defined(USE_STATIC_OPTIONS) +				#define USB_Options USE_STATIC_OPTIONS +			#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Function Prototypes: */ +			#if defined(__INCLUDE_FROM_USB_CONTROLLER_C) +				static void USB_Init_Device(void); +			#endif + +		/* Inline Functions: */ +			static inline void USB_Controller_Enable(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Controller_Enable(void) +			{ +				USB.CTRLA |=  USB_ENABLE_bm; +			} + +			static inline void USB_Controller_Disable(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Controller_Disable(void) +			{ +				USB.CTRLA &= ~USB_ENABLE_bm; +			} + +			static inline void USB_Controller_Reset(void) ATTR_ALWAYS_INLINE; +			static inline void USB_Controller_Reset(void) +			{ +				USB.CTRLA &= ~USB_ENABLE_bm; +				USB.CTRLA |=  USB_ENABLE_bm; +			} + +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c new file mode 100644 index 0000000000..a82dde030c --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c @@ -0,0 +1,106 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../../../Common/Common.h" +#if (ARCH == ARCH_XMEGA) + +#define  __INCLUDE_FROM_USB_DRIVER +#include "../USBInterrupt.h" + +void USB_INT_DisableAllInterrupts(void) +{ +	USB.INTCTRLA    &= USB_INTLVL_gm; +	USB.INTCTRLB     = 0; +} + +void USB_INT_ClearAllInterrupts(void) +{ +	USB.INTFLAGSACLR = 0xFF; +	USB.INTFLAGSBCLR = 0xFF; +} + +ISR(USB_BUSEVENT_vect) +{ +	#if !defined(NO_SOF_EVENTS) +	if (USB_INT_HasOccurred(USB_INT_SOFI) && USB_INT_IsEnabled(USB_INT_SOFI)) +	{ +		USB_INT_Clear(USB_INT_SOFI); + +		EVENT_USB_Device_StartOfFrame(); +	} +	#endif + +	if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Suspend)) +	{ +		USB_INT_Clear(USB_INT_BUSEVENTI_Suspend); + +		#if !defined(NO_LIMITED_CONTROLLER_CONNECT) +		USB_DeviceState = DEVICE_STATE_Unattached; +		EVENT_USB_Device_Disconnect(); +		#else +		USB_DeviceState = DEVICE_STATE_Suspended; +		EVENT_USB_Device_Suspend(); +		#endif +	} + +	if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Resume)) +	{ +		USB_INT_Clear(USB_INT_BUSEVENTI_Resume); + +		if (USB_Device_ConfigurationNumber) +		  USB_DeviceState = DEVICE_STATE_Configured; +		else +		  USB_DeviceState = (USB_Device_IsAddressSet()) ? DEVICE_STATE_Addressed : DEVICE_STATE_Powered; + +		#if !defined(NO_LIMITED_CONTROLLER_CONNECT) +		EVENT_USB_Device_Connect(); +		#else +		EVENT_USB_Device_WakeUp(); +		#endif +	} + +	if (USB_INT_HasOccurred(USB_INT_BUSEVENTI_Reset)) +	{ +		USB_INT_Clear(USB_INT_BUSEVENTI_Reset); + +		USB_DeviceState                = DEVICE_STATE_Default; +		USB_Device_ConfigurationNumber = 0; + +		USB_Device_EnableDeviceAddress(0); + +		Endpoint_ClearEndpoints(); +		Endpoint_ConfigureEndpoint(ENDPOINT_CONTROLEP, EP_TYPE_CONTROL, +		                           USB_Device_ControlEndpointSize, 1); + +		EVENT_USB_Device_Reset(); +	} +} + +#endif diff --git a/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h new file mode 100644 index 0000000000..54ee7f115f --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h @@ -0,0 +1,172 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief USB Controller Interrupt definitions for the AVR XMEGA microcontrollers. + * + *  This file contains definitions required for the correct handling of low level USB service routine interrupts + *  from the USB controller. + * + *  \note This file should not be included directly. It is automatically included as needed by the USB driver + *        dispatch header located in LUFA/Drivers/USB/USB.h. + */ + +#ifndef __USBINTERRUPT_XMEGA_H__ +#define __USBINTERRUPT_XMEGA_H__ + +	/* Includes: */ +		#include "../../../../Common/Common.h" + +	/* Enable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			extern "C" { +		#endif + +	/* Preprocessor Checks: */ +		#if !defined(__INCLUDE_FROM_USB_DRIVER) +			#error Do not include this file directly. Include LUFA/Drivers/USB/USB.h instead. +		#endif + +	/* Private Interface - For use in library only: */ +	#if !defined(__DOXYGEN__) +		/* Enums: */ +			enum USB_Interrupts_t +			{ +				USB_INT_BUSEVENTI         = 1, +				USB_INT_BUSEVENTI_Suspend = 2, +				USB_INT_BUSEVENTI_Resume  = 3, +				USB_INT_BUSEVENTI_Reset   = 4, +				USB_INT_SOFI              = 5, +			}; + +		/* Inline Functions: */ +			static inline void USB_INT_Enable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE; +			static inline void USB_INT_Enable(const uint8_t Interrupt) +			{ +				switch (Interrupt) +				{ +					case USB_INT_BUSEVENTI: +						USB.INTCTRLA |= USB_BUSEVIE_bm; +						break; +					case USB_INT_SOFI: +						USB.INTCTRLA |= USB_SOFIE_bm; +						break; +					default: +						break; +				} +			} + +			static inline void USB_INT_Disable(const uint8_t Interrupt) ATTR_ALWAYS_INLINE; +			static inline void USB_INT_Disable(const uint8_t Interrupt) +			{ +				switch (Interrupt) +				{ +					case USB_INT_BUSEVENTI: +						USB.INTCTRLA &= ~USB_BUSEVIE_bm; +						break; +					case USB_INT_SOFI: +						USB.INTCTRLA &= ~USB_SOFIE_bm; +						break; +					default: +						break; +				} +			} + +			static inline void USB_INT_Clear(const uint8_t Interrupt) ATTR_ALWAYS_INLINE; +			static inline void USB_INT_Clear(const uint8_t Interrupt) +			{ +				switch (Interrupt) +				{ +					case USB_INT_BUSEVENTI_Suspend: +						USB.INTFLAGSACLR = USB_SUSPENDIF_bm; +						break; +					case USB_INT_BUSEVENTI_Resume: +						USB.INTFLAGSACLR = USB_RESUMEIF_bm; +						break; +					case USB_INT_BUSEVENTI_Reset: +						USB.INTFLAGSACLR = USB_RSTIF_bm; +						break; +					case USB_INT_SOFI: +						USB.INTFLAGSACLR = USB_SOFIF_bm; +						break; +					default: +						break; +				} +			} + +			static inline bool USB_INT_IsEnabled(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline bool USB_INT_IsEnabled(const uint8_t Interrupt) +			{ +				switch (Interrupt) +				{ +					case USB_INT_BUSEVENTI: +						return ((USB.INTCTRLA & USB_BUSEVIE_bm) ? true : false); +					case USB_INT_SOFI: +						return ((USB.INTCTRLA & USB_SOFIE_bm) ? true : false); +					default: +						return false; +				} +			} + +			static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) ATTR_ALWAYS_INLINE ATTR_WARN_UNUSED_RESULT; +			static inline bool USB_INT_HasOccurred(const uint8_t Interrupt) +			{ +				switch (Interrupt) +				{ +					case USB_INT_BUSEVENTI_Suspend: +						return ((USB.INTFLAGSACLR & USB_SUSPENDIF_bm) ? true : false); +					case USB_INT_BUSEVENTI_Resume: +						return ((USB.INTFLAGSACLR & USB_RESUMEIF_bm) ? true : false); +					case USB_INT_BUSEVENTI_Reset: +						return ((USB.INTFLAGSACLR & USB_RSTIF_bm) ? true : false); +					case USB_INT_SOFI: +						return ((USB.INTFLAGSACLR & USB_SOFIF_bm) ? true : false); +					default: +						return false; +				} +			} + +		/* Includes: */ +			#include "../USBMode.h" +			#include "../Events.h" +			#include "../USBController.h" + +		/* Function Prototypes: */ +			void USB_INT_ClearAllInterrupts(void); +			void USB_INT_DisableAllInterrupts(void); +	#endif + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + diff --git a/lib/lufa/LUFA/Drivers/USB/USB.h b/lib/lufa/LUFA/Drivers/USB/USB.h new file mode 100644 index 0000000000..87c098cb9d --- /dev/null +++ b/lib/lufa/LUFA/Drivers/USB/USB.h @@ -0,0 +1,422 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Master include file for the library USB functionality. + * + *  Master include file for the library USB functionality. + * + *  This file should be included in all user projects making use of the USB portions of the library, instead of + *  the individual USB driver submodule headers. + */ + +/** \defgroup Group_USB USB Core - LUFA/Drivers/USB/USB.h + * + *  \brief Core driver for the microcontroller hardware USB module + * + *  \section Sec_USB_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Drivers/USB/Core/ConfigDescriptors.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + *    - LUFA/Drivers/USB/Core/DeviceStandardReq.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + *    - LUFA/Drivers/USB/Core/Events.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + *    - LUFA/Drivers/USB/Core/HostStandardReq.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + *    - LUFA/Drivers/USB/Core/USBTask.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Device_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Endpoint_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/EndpointStream_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Host_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/Pipe_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/PipeStream_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/USBController_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + *    - LUFA/Drivers/USB/Core/<i>ARCH</i>/USBInterrupt_<i>ARCH</i>.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + *    - LUFA/Drivers/USB/Class/Common/HIDParser.c <i>(Makefile source module name: LUFA_SRC_USB)</i> + * + *  \section Sec_USB_ModDescription Module Description + *  Driver and framework for the USB controller of the selected architecture and microcontroller model. This module + *  consists of many submodules, and is designed to provide an easy way to configure and control USB host, device + *  or OTG mode USB applications. + * + *  The USB stack requires the sole control over the USB controller in the microcontroller only; i.e. it does not + *  require any additional timers or other peripherals to operate. This ensures that the USB stack requires as few + *  resources as possible. + * + *  The USB stack can be used in Device Mode for connections to USB Hosts (see \ref Group_Device), in Host mode for + *  hosting of other USB devices (see \ref Group_Host), or as a dual role device which can either act as a USB host + *  or device depending on what peripheral is connected (see \ref Group_OTG). Both modes also require a common set + *  of USB management functions found \ref Group_USBManagement. + */ + +/** \defgroup Group_USBClassDrivers USB Class Drivers + * + *  \brief Drivers for the various standardized USB device classes + * + *  Drivers for both host and device mode of the standard USB classes, for rapid application development. + *  Class drivers give a framework which sits on top of the low level library API, allowing for standard + *  USB classes to be implemented in a project with minimal user code. These drivers can be used in + *  conjunction with the library low level APIs to implement interfaces both via the class drivers and via + *  the standard library APIs. + * + *  Multiple device mode class drivers can be used within a project, including multiple instances of the + *  same class driver. In this way, USB Hosts and Devices can be made quickly using the internal class drivers + *  so that more time and effort can be put into the end application instead of the USB protocol. + * + *  The available class drivers and their modes are listed below. + * + *  <table> + *  <tr> + *   <th width="200px">USB Class</th> + *   <th width="90px">Device Mode</th> + *   <th width="90px">Host Mode</th> + *  </tr> + *  <tr> + *   <td>Android Open Accessory</td> + *   <td bgcolor="#EE0000">No</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>Audio 1.0</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>CDC-ACM</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>HID</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>MIDI</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>Mass Storage</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>Printer</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>RNDIS</td> + *   <td bgcolor="#00EE00">Yes</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  <tr> + *   <td>Still Image</td> + *   <td bgcolor="#EE0000">No</td> + *   <td bgcolor="#00EE00">Yes</td> + *  </tr> + *  </table> + * + * + *  \section Sec_USB_UsingClassDrivers Using the Class Drivers + *  To make the Class drivers easy to integrate into a user application, they all implement a standardized + *  design with similarly named/used function, enums, defines and types. The two different modes are implemented + *  slightly differently, and thus will be explained separately. For information on a specific class driver, read + *  the class driver's module documentation. + * + *  \subsection Sec_USB_ClassDriverDevice Device Mode Class Drivers + *  Implementing a Device Mode Class Driver in a user application requires a number of steps to be followed. Firstly, + *  the module configuration and state structure must be added to the project source. These structures are named in a + *  similar manner between classes, that of <tt>USB_ClassInfo_<i>{Class Name}</i>_Device_t</tt>, and are used to hold the + *  complete state and configuration for each class instance. Multiple class instances is where the power of the class + *  drivers lie; multiple interfaces of the same class simply require more instances of the Class Driver's \c USB_ClassInfo_* + *  structure. + * + *  Inside the ClassInfo structure lies two sections, a \c Config section, and a \c State section. The \c Config + *  section contains the instance's configuration parameters, and <b>must have all fields set by the user application</b> + *  before the class driver is used. Each Device mode Class driver typically contains a set of configuration parameters + *  for the endpoint size/number of the associated logical USB interface, plus any class-specific configuration parameters. + * + *  The following is an example of a properly initialized instance of the Audio Class Driver structure: + * + *  \code + *  USB_ClassInfo_Audio_Device_t My_Audio_Interface = + *  { + *      .Config = + *          { + *              .StreamingInterfaceNumber = 1, + *              .DataINEndpoint           = + *                  { + *                      .Address          = (ENDPOINT_DIR_IN | 1), + *                      .Size             = 64, + *                      .Banks            = 1, + *                  }, + *          }, + *  }; + *  \endcode + * + *  \note The class driver's configuration parameters should match those used in the device's descriptors that are + *  sent to the host. + * + *  To initialize the Class driver instance, the driver's <tt><i>{Class Name}</i>_Device_ConfigureEndpoints()</tt> function + *  should be called in response to the \ref EVENT_USB_Device_ConfigurationChanged() event. This function will return a + *  boolean true value if the driver successfully initialized the instance. Like all the class driver functions, this function + *  takes in the address of the specific instance you wish to initialize - in this manner, multiple separate instances of + *  the same class type can be initialized like this: + * + *  \code + *  void EVENT_USB_Device_ConfigurationChanged(void) + *  { + *      LEDs_SetAllLEDs(LEDMASK_USB_READY); + * + *      if (!(Audio_Device_ConfigureEndpoints(&My_Audio_Interface))) + *          LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + *  } + *  \endcode + * + *  Once initialized, it is important to maintain the class driver's state by repeatedly calling the Class Driver's + *  <tt><i>{Class Name}</i>_Device_USBTask()</tt> function in the main program loop. The exact implementation of this + *  function varies between class drivers, and can be used for any internal class driver purpose to maintain each + *  instance. Again, this function uses the address of the instance to operate on, and thus needs to be called for each + *  separate instance, just like the main USB maintenance routine \ref USB_USBTask(): + * + *  \code + *  int main(void) + *  { + *      SetupHardware(); + * + *      LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); + * + *      for (;;) + *      { + *          if (USB_DeviceState != DEVICE_STATE_Configured) + *            Create_And_Process_Samples(); + * + *          Audio_Device_USBTask(&My_Audio_Interface); + *          USB_USBTask(); + *      } + *  } + *  \endcode + * + *  The final standardized Device Class Driver function is the Control Request handler function + *  <tt><i>{Class Name}</i>_Device_ProcessControlRequest()</tt>, which should be called when the + *  \ref EVENT_USB_Device_ControlRequest() event fires. This function should also be called for + *  each class driver instance, using the address of the instance to operate on as the function's + *  parameter. The request handler will abort if it is determined that the current request is not + *  targeted at the given class driver instance, thus these methods can safely be called + *  one-after-another in the event handler with no form of error checking: + * + *  \code + *  void EVENT_USB_Device_ControlRequest(void) + *  { + *      Audio_Device_ProcessControlRequest(&My_Audio_Interface); + *  } + *  \endcode + * + *  Each class driver may also define a set of callback functions (which are prefixed by \c CALLBACK_* + *  in the function's name) which <b>must</b> also be added to the user application - refer to each + *  individual class driver's documentation for mandatory callbacks. In addition, each class driver may + *  also define a set of events (identifiable by their prefix of \c EVENT_* in the function's name), which + *  the user application <b>may</b> choose to implement, or ignore if not needed. + * + *  The individual Device Mode Class Driver documentation contains more information on the non-standardized, + *  class-specific functions which the user application can then use on the driver instances, such as data + *  read and write routines. See each driver's individual documentation for more information on the + *  class-specific functions. + * + *  \subsection Sec_USB_ClassDriverHost Host Mode Class Drivers + *  Implementing a Host Mode Class Driver in a user application requires a number of steps to be followed. Firstly, + *  the module configuration and state structure must be added to the project source. These structures are named in a + *  similar manner between classes, that of <tt>USB_ClassInfo_<b>{Class Name}</b>_Host_t</tt>, and are used to hold the + *  complete state and configuration for each class instance. Multiple class instances is where the power of the class + *  drivers lie; multiple interfaces of the same class simply require more instances of the Class Driver's \c USB_ClassInfo_* + *  structure. + * + *  Inside the \c USB_ClassInfo_* structure lies two sections, a \c Config section, and a \c State section. The \c Config + *  section contains the instance's configuration parameters, and <b>must have all fields set by the user application</b> + *  before the class driver is used. Each Device mode Class driver typically contains a set of configuration parameters + *  for the endpoint size/number of the associated logical USB interface, plus any class-specific configuration parameters. + * + *  The following is an example of a properly initialized instance of the MIDI Host Class Driver structure: + * + *  \code + *  USB_ClassInfo_MIDI_Host_t My_MIDI_Interface = + *  { + *      .Config = + *          { + *              .DataINPipe             = + *                  { + *                      .Address        = (PIPE_DIR_IN  | 1), + *                      .Size           = 64, + *                      .Banks          = 1, + *                  }, + *              .DataOUTPipe            = + *                  { + *                      .Address        = (PIPE_DIR_OUT | 2), + *                      .Size           = 64, + *                      .Banks          = 1, + *                  }, + *          }, + *  }; + *  \endcode + * + *  To initialize the Class driver instance, the driver's <tt><b>{Class Name}</b>_Host_ConfigurePipes()</tt> function + *  should be called in response to the \c EVENT_USB_Host_DeviceEnumerationComplete() event firing. This function will + *  will return an error code from the class driver's <tt><b>{Class Name}</b>_EnumerationFailure_ErrorCodes_t</tt> enum + *  to indicate if the driver successfully initialized the instance and bound it to an interface in the attached device. + *  Like all the class driver functions, this function takes in the address of the specific instance you wish to initialize - + *  in this manner, multiple separate instances of the same class type can be initialized. A fragment of a Class Driver + *  based Host mode application may look like the following: + * + *  \code + *  void EVENT_USB_Host_DeviceEnumerationComplete(void) + *  { + *      LEDs_SetAllLEDs(LEDMASK_USB_ENUMERATING); + * + *      uint16_t ConfigDescriptorSize; + *      uint8_t  ConfigDescriptorData[512]; + * + *      if (USB_Host_GetDeviceConfigDescriptor(1, &ConfigDescriptorSize, ConfigDescriptorData, + *                                             sizeof(ConfigDescriptorData)) != HOST_GETCONFIG_Successful) + *      { + *          LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + *          return; + *      } + * + *      if (MIDI_Host_ConfigurePipes(&Keyboard_MIDI_Interface, + *                                   ConfigDescriptorSize, ConfigDescriptorData) != MIDI_ENUMERROR_NoError) + *      { + *          LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + *          return; + *      } + * + *      if (USB_Host_SetDeviceConfiguration(1) != HOST_SENDCONTROL_Successful) + *      { + *          LEDs_SetAllLEDs(LEDMASK_USB_ERROR); + *          return; + *      } + * + *      LEDs_SetAllLEDs(LEDMASK_USB_READY); + *  } + *  \endcode + * + *  Note that the function also requires the device's configuration descriptor so that it can determine which interface + *  in the device to bind to - this can be retrieved as shown in the above fragment using the + *  \ref USB_Host_GetDeviceConfigDescriptor() function. If the device does not implement the interface the class driver + *  is looking for, if all the matching interfaces are already bound to class driver instances or if an error occurs while + *  binding to a device interface (for example, a device endpoint bank larger that the maximum supported bank size is used) + *  the configuration will fail. + * + *  To complete the device enumeration after binding the host mode Class Drivers to the attached device, a call to + *  \c USB_Host_SetDeviceConfiguration() must be made. If the device configuration is not set within the + *  \c EVENT_USB_Host_DeviceEnumerationComplete() event, the host still will assume the device enumeration has failed. + * + *  Once initialized, it is important to maintain the class driver's state by repeatedly calling the Class Driver's + *  <tt><b>{Class Name}</b>_Host_USBTask()</tt> function in the main program loop. The exact implementation of this + *  function varies between class drivers, and can be used for any internal class driver purpose to maintain each + *  instance. Again, this function uses the address of the instance to operate on, and thus needs to be called for each + *  separate instance, just like the main USB maintenance routine \ref USB_USBTask(): + * + *  \code + *  int main(void) + *  { + *      SetupHardware(); + * + *      LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); + * + *      for (;;) + *      { + *          if (USB_HostState != HOST_STATE_Configured) + *              Create_And_Process_Samples(); + * + *          MIDI_Host_USBTask(&My_Audio_Interface); + *          USB_USBTask(); + *      } + *  } + *  \endcode + * + *  Each class driver may also define a set of callback functions (which are prefixed by \c CALLBACK_* + *  in the function's name) which <b>must</b> also be added to the user application - refer to each + *  individual class driver's documentation for mandatory callbacks. In addition, each class driver may + *  also define a set of events (identifiable by their prefix of \c EVENT_* in the function's name), which + *  the user application <b>may</b> choose to implement, or ignore if not needed. + * + *  The individual Host Mode Class Driver documentation contains more information on the non-standardized, + *  class-specific functions which the user application can then use on the driver instances, such as data + *  read and write routines. See each driver's individual documentation for more information on the + *  class-specific functions. + */ + +#ifndef __USB_H__ +#define __USB_H__ + +	/* Macros: */ +		#define __INCLUDE_FROM_USB_DRIVER + +	/* Includes: */ +		#include "../../Common/Common.h" +		#include "Core/USBMode.h" + +	/* Includes: */ +		#include "Core/USBTask.h" +		#include "Core/Events.h" +		#include "Core/StdDescriptors.h" +		#include "Core/ConfigDescriptors.h" +		#include "Core/USBController.h" +		#include "Core/USBInterrupt.h" + +		#if defined(USB_CAN_BE_HOST) || defined(__DOXYGEN__) +			#include "Core/Host.h" +			#include "Core/Pipe.h" +			#include "Core/HostStandardReq.h" +			#include "Core/PipeStream.h" +		#endif + +		#if defined(USB_CAN_BE_DEVICE) || defined(__DOXYGEN__) +			#include "Core/Device.h" +			#include "Core/Endpoint.h" +			#include "Core/DeviceStandardReq.h" +			#include "Core/EndpointStream.h" +		#endif + +		#if defined(USB_CAN_BE_BOTH) || defined(__DOXYGEN__) +			#include "Core/OTG.h" +		#endif + +		#include "Class/AndroidAccessoryClass.h" +		#include "Class/AudioClass.h" +		#include "Class/CDCClass.h" +		#include "Class/HIDClass.h" +		#include "Class/MassStorageClass.h" +		#include "Class/MIDIClass.h" +		#include "Class/PrinterClass.h" +		#include "Class/RNDISClass.h" +		#include "Class/StillImageClass.h" + +#endif + diff --git a/lib/lufa/LUFA/License.txt b/lib/lufa/LUFA/License.txt new file mode 100644 index 0000000000..f89d606d2e --- /dev/null +++ b/lib/lufa/LUFA/License.txt @@ -0,0 +1,24 @@ +                  LUFA Library +        Copyright (C) Dean Camera, 2017. + +     dean [at] fourwalledcubicle [dot] com +                www.lufa-lib.org + + +Permission to use, copy, modify, and distribute this software +and its documentation for any purpose is hereby granted without +fee, provided that the above copyright notice appear in all +copies and that both that the copyright notice and this +permission notice and warranty disclaimer appear in supporting +documentation, and that the name of the author not be used in +advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +The author disclaims all warranties with regard to this +software, including all implied warranties of merchantability +and fitness.  In no event shall the author be liable for any +special, indirect or consequential damages or any damages +whatsoever resulting from loss of use, data or profits, whether +in an action of contract, negligence or other tortious action, +arising out of or in connection with the use or performance of +this software. diff --git a/lib/lufa/LUFA/Platform/Platform.h b/lib/lufa/LUFA/Platform/Platform.h new file mode 100644 index 0000000000..9997d797f7 --- /dev/null +++ b/lib/lufa/LUFA/Platform/Platform.h @@ -0,0 +1,80 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief Architecture Specific Hardware Platform Drivers. + * + *  This file is the master dispatch header file for the device-specific hardware platform drivers, for low level + *  hardware configuration and management. The platform drivers are a set of drivers which are designed to provide + *  a high level management layer for the various low level system functions such as clock control and interrupt + *  management. + * + *  User code may choose to either include this master dispatch header file to include all available platform + *  driver header files for the current architecture, or may choose to only include the specific platform driver + *  modules required for a particular application. + */ + +/** \defgroup Group_PlatformDrivers System Platform Drivers - LUFA/Platform/Platform.h + *  \brief Hardware platform drivers. + * + *  \section Sec_PlatformDrivers_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - <b>UC3 Architecture Only:</b> LUFA/Platform/UC3/InterruptManagement.c <i>(Makefile source module name: LUFA_SRC_PLATFORM)</i> + *    - <b>UC3 Architecture Only:</b> LUFA/Platform/UC3/Exception.S <i>(Makefile source module name: LUFA_SRC_PLATFORM)</i> + * + *  \section Sec_PlatformDrivers_ModDescription Module Description + *  Device-specific hardware platform drivers, for low level hardware configuration and management. The platform + *  drivers are a set of drivers which are designed to provide a high level management layer for the various low level + *  system functions such as clock control and interrupt management. + * + *  User code may choose to either include this master dispatch header file to include all available platform + *  driver header files for the current architecture, or may choose to only include the specific platform driver + *  modules required for a particular application. + * + *  \note The exact APIs and availability of sub-modules within the platform driver group may vary depending on the + *        target used - see individual target module documentation for the API specific to your target processor. + */ + +#ifndef __LUFA_PLATFORM_H__ +#define __LUFA_PLATFORM_H__ + +	/* Includes: */ +		#include "../Common/Common.h" + +	/* Includes: */ +		#if (ARCH == ARCH_UC3) +			#include "UC3/ClockManagement.h" +			#include "UC3/InterruptManagement.h" +		#elif (ARCH == ARCH_XMEGA) +			#include "XMEGA/ClockManagement.h" +		#endif + +#endif + diff --git a/lib/lufa/LUFA/Platform/UC3/ClockManagement.h b/lib/lufa/LUFA/Platform/UC3/ClockManagement.h new file mode 100644 index 0000000000..5f286d51d5 --- /dev/null +++ b/lib/lufa/LUFA/Platform/UC3/ClockManagement.h @@ -0,0 +1,338 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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_UC3 + *  \defgroup Group_PlatformDrivers_UC3Clocks Clock Management Driver - LUFA/Platform/UC3/ClockManagement.h + *  \brief Module Clock Driver for the AVR32 UC3 microcontrollers. + * + *  \section Sec_PlatformDrivers_UC3Clocks_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - None + * + *  \section Sec_PlatformDrivers_UC3Clocks_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 + *			UC3CLK_StartExternalOscillator(0, EXOSC_MODE_8MHZ_OR_MORE, EXOSC_START_0CLK); + * + *			// Start the PLL for the CPU clock, switch CPU to it + *			UC3CLK_StartPLL(0, CLOCK_SRC_OSC0, 12000000, F_CPU); + *			UC3CLK_SetCPUClockSource(CLOCK_SRC_PLL0, F_CPU); + * + *			// Start the PLL for the USB Generic Clock module + *			UC3CLK_StartPLL(1, CLOCK_SRC_OSC0, 12000000, 48000000); + *		} + *  \endcode + * + *  @{ + */ + +#ifndef _UC3_CLOCK_MANAGEMENT_H_ +#define _UC3_CLOCK_MANAGEMENT_H_ + +	/* Includes: */ +		#include "../../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 startup 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 cycles before startup for stability. */ +				EXOSC_START_128CLK       = AVR32_PM_OSCCTRL0_STARTUP_128_RCOSC,   /**< Wait 128 clock cycles before startup for stability. */ +				EXOSC_START_2048CLK      = AVR32_PM_OSCCTRL0_STARTUP_2048_RCOSC,  /**< Wait 2048 clock cycles before startup for stability. */ +				EXOSC_START_4096CLK      = AVR32_PM_OSCCTRL0_STARTUP_4096_RCOSC,  /**< Wait 4096 clock cycles before startup for stability. */ +				EXOSC_START_8192CLK      = AVR32_PM_OSCCTRL0_STARTUP_8192_RCOSC,  /**< Wait 8192 clock cycles before startup for stability. */ +				EXOSC_START_16384CLK     = AVR32_PM_OSCCTRL0_STARTUP_16384_RCOSC, /**< Wait 16384 clock cycles 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  Startup 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 UC3CLK_StartExternalOscillator(const uint8_t Channel, +			                                                  const uint8_t Type, +			                                                  const uint8_t Startup) ATTR_ALWAYS_INLINE; +			static inline bool UC3CLK_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 UC3CLK_StopExternalOscillator(const uint8_t Channel) ATTR_ALWAYS_INLINE; +			static inline void UC3CLK_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. +			 * +			 *  \attention 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 UC3CLK_StartPLL(const uint8_t Channel, +			                                   const uint8_t Source, +			                                   const uint32_t SourceFreq, +			                                   const uint32_t Frequency) ATTR_ALWAYS_INLINE; +			static inline bool UC3CLK_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 UC3CLK_StopPLL(const uint8_t Channel) ATTR_ALWAYS_INLINE; +			static inline void UC3CLK_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 UC3CLK_StartGenericClock(const uint8_t Channel, +			                                            const uint8_t Source, +			                                            const uint32_t SourceFreq, +			                                            const uint32_t Frequency) ATTR_ALWAYS_INLINE; +			static inline bool UC3CLK_StartGenericClock(const uint8_t Channel, +			                                            const uint8_t Source, +			                                            const uint32_t SourceFreq, +			                                            const uint32_t Frequency) +			{ +				if (Channel >= AVR32_PM_GCLK_NUM) +				  return false; + +				if (SourceFreq < Frequency) +				  return false; + +				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; +				} + +				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. +			 * +			 *  \return Boolean \c true if the generic clock was successfully stopped, \c false if invalid parameters specified. +			 */ +			static inline bool UC3CLK_StopGenericClock(const uint8_t Channel) ATTR_ALWAYS_INLINE; +			static inline bool UC3CLK_StopGenericClock(const uint8_t Channel) +			{ +				if (Channel >= AVR32_PM_GCLK_NUM) +				  return false; + +				AVR32_PM.GCCTRL[Channel].cen = false; + +				return true; +			} + +			/** 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 successfully altered, \c false if invalid parameters specified. +			 */ +			static inline bool UC3CLK_SetCPUClockSource(const uint8_t Source, +			                                            const uint32_t SourceFreq) ATTR_ALWAYS_INLINE; +			static inline bool UC3CLK_SetCPUClockSource(const uint8_t Source, +			                                            const uint32_t SourceFreq) +			{ +				if (SourceFreq > AVR32_PM_CPU_MAX_FREQ) +				  return false; + +				AVR32_FLASHC.FCR.fws = (SourceFreq > AVR32_FLASHC_FWS_0_MAX_FREQ) ? 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/lib/lufa/LUFA/Platform/UC3/Exception.S b/lib/lufa/LUFA/Platform/UC3/Exception.S new file mode 100644 index 0000000000..59f16f16f1 --- /dev/null +++ b/lib/lufa/LUFA/Platform/UC3/Exception.S @@ -0,0 +1,128 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#if defined(__AVR32__) +#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 === + +#endif diff --git a/lib/lufa/LUFA/Platform/UC3/InterruptManagement.c b/lib/lufa/LUFA/Platform/UC3/InterruptManagement.c new file mode 100644 index 0000000000..b99be24b97 --- /dev/null +++ b/lib/lufa/LUFA/Platform/UC3/InterruptManagement.c @@ -0,0 +1,62 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +#include "../../Common/Common.h" +#if (ARCH == ARCH_UC3) + +#define  __INCLUDE_FROM_INTMANAGEMENT_C +#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 (;;); +} + +InterruptHandlerPtr_t INTC_GetInterruptHandler(const uint_reg_t InterruptLevel) +{ +	return InterruptHandlers[AVR32_INTC.icr[AVR32_INTC_INT3 - InterruptLevel]]; +} + +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); +} + +#endif diff --git a/lib/lufa/LUFA/Platform/UC3/InterruptManagement.h b/lib/lufa/LUFA/Platform/UC3/InterruptManagement.h new file mode 100644 index 0000000000..b051930370 --- /dev/null +++ b/lib/lufa/LUFA/Platform/UC3/InterruptManagement.h @@ -0,0 +1,174 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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_UC3 + *  \defgroup Group_PlatformDrivers_UC3Interrupts Interrupt Controller Driver - LUFA/Platform/UC3/InterruptManagement.h + *  \brief Interrupt Controller Driver for the AVR32 UC3 microcontrollers. + * + *  \section Sec_PlatformDrivers_UC3Interrupts_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - LUFA/Platform/UC3/InterruptManagement.c <i>(Makefile source module name: LUFA_SRC_PLATFORM)</i> + *    - LUFA/Platform/UC3/Exception.S <i>(Makefile source module name: LUFA_SRC_PLATFORM)</i> + * + *  \section Sec_PlatformDrivers_UC3Interrupts_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 "../../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: */ +			#if defined(__INCLUDE_FROM_INTMANAGEMENT_C) +				extern const void        EVBA_Table; +			#endif +			extern InterruptHandlerPtr_t InterruptHandlers[AVR32_INTC_NUM_INT_GRPS]; +			extern const uint32_t        Autovector_Table[]; +	#endif + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** Converts a given interrupt index into its associated 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 associated 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 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); + +			/** 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. +			 * +			 *  \param[in] InterruptLevel  Priority level of the interrupt. +			 * +			 *  \return Pointer to the associated interrupt handler function, or NULL if no handler set. +			 */ +			InterruptHandlerPtr_t INTC_GetInterruptHandler(const uint_reg_t InterruptLevel); + +		/* 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/lib/lufa/LUFA/Platform/UC3/UC3ExperimentalInfo.txt b/lib/lufa/LUFA/Platform/UC3/UC3ExperimentalInfo.txt new file mode 100644 index 0000000000..8aadb3ed79 --- /dev/null +++ b/lib/lufa/LUFA/Platform/UC3/UC3ExperimentalInfo.txt @@ -0,0 +1 @@ +Please note that the UC3 architecture support is EXPERIMENTAL at this time, and may be non-functional/incomplete in some areas. Please refer to the Known Issues section of the LUFA manual.
\ No newline at end of file diff --git a/lib/lufa/LUFA/Platform/XMEGA/ClockManagement.h b/lib/lufa/LUFA/Platform/XMEGA/ClockManagement.h new file mode 100644 index 0000000000..eb941d9a30 --- /dev/null +++ b/lib/lufa/LUFA/Platform/XMEGA/ClockManagement.h @@ -0,0 +1,397 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + *  \brief 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_XMEGA + *  \defgroup Group_PlatformDrivers_XMEGAClocks Clock Management Driver - LUFA/Platform/XMEGA/ClockManagement.h + *  \brief Module Clock Driver for the AVR USB XMEGA microcontrollers. + * + *  \section Sec_PlatformDrivers_XMEGAClocks_Dependencies Module Source Dependencies + *  The following files must be built with any user project that uses this module: + *    - None + * + *  \section Sec_PlatformDrivers_XMEGAClocks_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 PLL to multiply the 2MHz RC oscillator to F_CPU and switch the CPU core to run from it + *   		XMEGACLK_StartPLL(CLOCK_SRC_INT_RC2MHZ, 2000000, F_CPU); + *   		XMEGACLK_SetCPUClockSource(CLOCK_SRC_PLL); + * + *   		// Start the 32MHz internal RC oscillator and start the DFLL to increase it to F_USB using the USB SOF as a reference + *   		XMEGACLK_StartInternalOscillator(CLOCK_SRC_INT_RC32MHZ); + *   		XMEGACLK_StartDFLL(CLOCK_SRC_INT_RC32MHZ, DFLL_REF_INT_USBSOF, F_USB); + *   	} + *  \endcode + * + *  @{ + */ + +#ifndef _XMEGA_CLOCK_MANAGEMENT_H_ +#define _XMEGA_CLOCK_MANAGEMENT_H_ + +	/* Includes: */ +		#include "../../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 startup 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. */ +			}; + +			/** Enum for the possible DFLL clock reference sources. */ +			enum XMEGA_System_DFLLReference_t +			{ +				DFLL_REF_INT_RC32KHZ   = 0, /**< Reference clock sourced from the Internal 32KHz RC Oscillator clock. */ +				DFLL_REF_EXT_RC32KHZ   = 1, /**< Reference clock sourced from the External 32KHz RC Oscillator clock connected to TOSC pins. */ +				DFLL_REF_INT_USBSOF    = 2, /**< Reference clock sourced from the USB Start Of Frame packets. */ +			}; + +		/* Inline Functions: */ +			/** Write a value to a location protected by the XMEGA CCP protection mechanism. This function uses inline assembly to ensure that +			 *  the protected address is written to within four clock cycles of the CCP key being written. +			 * +			 *  \param[in] Address  Address to write to, a memory address protected by the CCP mechanism +			 *  \param[in] Value    Value to write to the protected location +			 */ +			static inline void XMEGACLK_CCP_Write(volatile void* Address, const uint8_t Value) ATTR_NON_NULL_PTR_ARG(1) ATTR_ALWAYS_INLINE; +			static inline void XMEGACLK_CCP_Write(volatile void* Address, const uint8_t Value) +			{ +				__asm__ __volatile__ ( +					"out %0, __zero_reg__" "\n\t" /* Zero RAMPZ using fixed zero value register */ +					"movw r30, %1"         "\n\t" /* Copy address to Z register pair */ +					"out %2, %3"           "\n\t" /* Write key to CCP register */ +					"st Z, %4"             "\n\t" /* Indirectly write value to address */ +					: /* No output operands */ +					: /* Input operands: */ "m" (RAMPZ), "e" (Address), "m" (CCP), "r" (CCP_IOREG_gc), "r" (Value) +					: /* Clobbered registers: */ "r30", "r31" +				); +			} + +			/** 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    Startup 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 XMEGACLK_StartExternalOscillator(const uint8_t FreqRange, +			                                                    const uint8_t Startup) ATTR_ALWAYS_INLINE; +			static inline bool XMEGACLK_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 XMEGACLK_StopExternalOscillator(void) ATTR_ALWAYS_INLINE; +			static inline void XMEGACLK_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 bool XMEGACLK_StartInternalOscillator(const uint8_t Source) ATTR_ALWAYS_INLINE; +			static inline bool XMEGACLK_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; +					default: +						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 XMEGACLK_StopInternalOscillator(const uint8_t Source) ATTR_ALWAYS_INLINE; +			static inline bool XMEGACLK_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; +					default: +						return false; +				} +			} + +			/** Starts the PLL of the XMEGA microcontroller, with the given options. This routine blocks until the PLL is ready for use. +			 * +			 *  \attention 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 XMEGACLK_StartPLL(const uint8_t Source, +			                                     const uint32_t SourceFreq, +			                                     const uint32_t Frequency) ATTR_ALWAYS_INLINE; +			static inline bool XMEGACLK_StartPLL(const uint8_t Source, +			                                     const uint32_t SourceFreq, +			                                     const uint32_t Frequency) +			{ +				uint8_t MulFactor = (Frequency / SourceFreq); + +				if (SourceFreq > Frequency) +				  return false; + +				if (MulFactor > 31) +				  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 XMEGACLK_StopPLL(void) ATTR_ALWAYS_INLINE; +			static inline void XMEGACLK_StopPLL(void) +			{ +				OSC.CTRL &= ~OSC_PLLEN_bm; +			} + +			/** Starts the DFLL of the XMEGA microcontroller, with the given options. +			 * +			 *  \param[in] Source     RC Clock source for the DFLL, a value from \ref XMEGA_System_ClockSource_t. +			 *  \param[in] Reference  Reference clock source for the DFLL, an value from \ref XMEGA_System_DFLLReference_t. +			 *  \param[in] Frequency  Target frequency of the DFLL's output. +			 * +			 *  \return Boolean \c true if the DFLL was successfully started, \c false if invalid parameters specified. +			 */ +			static inline bool XMEGACLK_StartDFLL(const uint8_t Source, +			                                      const uint8_t Reference, +			                                      const uint32_t Frequency) ATTR_ALWAYS_INLINE; +			static inline bool XMEGACLK_StartDFLL(const uint8_t Source, +			                                      const uint8_t Reference, +			                                      const uint32_t Frequency) +			{ +				uint16_t DFLLCompare = (Frequency / 1024); + +				switch (Source) +				{ +					case CLOCK_SRC_INT_RC2MHZ: +						OSC.DFLLCTRL   |= (Reference << OSC_RC2MCREF_bp); +						DFLLRC2M.COMP1  = (DFLLCompare & 0xFF); +						DFLLRC2M.COMP2  = (DFLLCompare >> 8); +						DFLLRC2M.CTRL   = DFLL_ENABLE_bm; +						break; +					case CLOCK_SRC_INT_RC32MHZ: +						OSC.DFLLCTRL   |= (Reference << OSC_RC32MCREF_gp); +						DFLLRC32M.COMP1 = (DFLLCompare & 0xFF); +						DFLLRC32M.COMP2 = (DFLLCompare >> 8); + +						if (Reference == DFLL_REF_INT_USBSOF) +						{ +							NVM.CMD        = NVM_CMD_READ_CALIB_ROW_gc; +							DFLLRC32M.CALA = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBRCOSCA)); +							DFLLRC32M.CALB = pgm_read_byte(offsetof(NVM_PROD_SIGNATURES_t, USBRCOSC)); +							NVM.CMD        = 0; +						} + +						DFLLRC32M.CTRL  = DFLL_ENABLE_bm; +						break; +					default: +						return false; +				} + +				return true; +			} + +			/** Stops the given DFLL of the XMEGA microcontroller. +			 * +			 *  \param[in] Source  RC Clock source for the DFLL to be stopped, a value from \ref XMEGA_System_ClockSource_t. +			 * +			 *  \return Boolean \c true if the DFLL was successfully stopped, \c false if invalid parameters specified. +			 */ +			static inline bool XMEGACLK_StopDFLL(const uint8_t Source) ATTR_ALWAYS_INLINE; +			static inline bool XMEGACLK_StopDFLL(const uint8_t Source) +			{ +				switch (Source) +				{ +					case CLOCK_SRC_INT_RC2MHZ: +						DFLLRC2M.CTRL = 0; +						break; +					case CLOCK_SRC_INT_RC32MHZ: +						DFLLRC32M.CTRL = 0; +						break; +					default: +						return false; +				} + +				return true; +			} + +			/** 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. +			 * +			 *  \return Boolean \c true if the CPU core clock was successfully altered, \c false if invalid parameters specified. +			 */ +			static inline bool XMEGACLK_SetCPUClockSource(const uint8_t Source) ATTR_ALWAYS_INLINE; +			static inline bool XMEGACLK_SetCPUClockSource(const uint8_t Source) +			{ +				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(); + +				XMEGACLK_CCP_Write(&CLK.CTRL, ClockSourceMask); + +				SetGlobalInterruptMask(CurrentGlobalInt); + +				Delay_MS(1); +				return (CLK.CTRL == ClockSourceMask); +			} + +	/* Disable C linkage for C++ Compilers: */ +		#if defined(__cplusplus) +			} +		#endif + +#endif + +/** @} */ + diff --git a/lib/lufa/LUFA/Platform/XMEGA/XMEGAExperimentalInfo.txt b/lib/lufa/LUFA/Platform/XMEGA/XMEGAExperimentalInfo.txt new file mode 100644 index 0000000000..42144aac48 --- /dev/null +++ b/lib/lufa/LUFA/Platform/XMEGA/XMEGAExperimentalInfo.txt @@ -0,0 +1 @@ +Please note that the XMEGA architecture support is EXPERIMENTAL at this time, and may be non-functional/incomplete in some areas. Please refer to the Known Issues section of the LUFA manual.
\ No newline at end of file diff --git a/lib/lufa/LUFA/StudioIntegration/Docbook/mshelp/README.txt b/lib/lufa/LUFA/StudioIntegration/Docbook/mshelp/README.txt new file mode 100644 index 0000000000..4f251cc0b8 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/Docbook/mshelp/README.txt @@ -0,0 +1,13 @@ +This is a modified/updated version of the Microsoft HV1 Docbook transform, written by Morten Engelhardt Olsen, + +Originally posted at http://sourceforge.net/p/docbook/feature-requests/461/, this has been further updated by Morten to make it compatible with more recent DocBook versions. + + --------------------------- +/ This documentation system \ +\   is udderly ridiculous!  / + --------------------------- +        \   ^__^ +         \  (oo)\_______ +            (__)\       )\/\ +                ||----w | +                ||     || diff --git a/lib/lufa/LUFA/StudioIntegration/Docbook/mshelp/docbook.xsl b/lib/lufa/LUFA/StudioIntegration/Docbook/mshelp/docbook.xsl new file mode 100644 index 0000000000..03b81feafc --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/Docbook/mshelp/docbook.xsl @@ -0,0 +1,58 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet  +    xmlns:xsl="http://www.w3.org/1999/XSL/Transform" +    xmlns:d="http://docbook.org/ns/docbook" +	xmlns="http://www.w3.org/1999/xhtml" +    exclude-result-prefixes="xsl d"    +    version="1.0"> + +	<xsl:import href="../xhtml/chunk.xsl"/> +	<xsl:import href="../xhtml/highlight.xsl"/> +	 +	<!--  +		Based on the normal xhtml templates, all overrides applicable to  +		xhtml is applicable to HV1. +	--> +	 +	<xsl:import href="hv1-common.xsl"/> + +	<!--  +		Choose if links should be generated using ms-xhelp (default) or  +		the more verbose ms.help type. The latter requires product.name,  +		product.version and product.locale to be set +	--> +	<xsl:param name="use.mshelp.links" select="0"/> +	 +	<!--  +		Name of target product. If specified then each page is  +		marked with this product. This is usualy set during  +		install time. +	--> +	<xsl:param name="product.name" select="''" /> +	 +	<!--  +		Name of target version. If specified then each page is  +		marked with this version. This is usualy set during  +		install time. +	--> +	<xsl:param name="product.version" select="''" /> +	 +	<!--  +		Locale for the help. Should always be set +	--> +	<xsl:param name="product.locale" select="'en-US'" /> +	 +	<!--  +		Self branding. Gives access for chunks to load  +		it's own branding package during runtime +	--> +	<xsl:param name="topic.selfbrand" select="1"/> + + +	<!-- Use doctitle for olinks --> +	<xsl:param name="olink.doctitle" select="'yes'" /> + +	<!-- Enable source code highlighting--> +	<xsl:param name="highlight.source" select="1"/> +	 +</xsl:stylesheet> diff --git a/lib/lufa/LUFA/StudioIntegration/Docbook/mshelp/hv1-common.xsl b/lib/lufa/LUFA/StudioIntegration/Docbook/mshelp/hv1-common.xsl new file mode 100644 index 0000000000..b6f2610680 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/Docbook/mshelp/hv1-common.xsl @@ -0,0 +1,664 @@ +<?xml version="1.0" encoding="UTF-8"?> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" +				xmlns:d="http://docbook.org/ns/docbook" +				xmlns="http://www.w3.org/1999/xhtml" +				exclude-result-prefixes="d" +    			version="1.0"> + + +	<!-- no separate HTML page with index as this is binary in hv1 --> +	<xsl:param name="generate.index" select="0"/> + + +	<!-- Generate help tags in header --> +	<xsl:template name="user.head.content"> +		<xsl:param name="node" select="''" /> +		<xsl:variable name="up" select="parent::*"/> + +		<!-- Locale should be first Help tag--> +		<meta name="Microsoft.Help.Locale"> +			<xsl:attribute name="content"> +				<xsl:choose> +					<xsl:when test="$product.locale and product.locale != ''"> +						<xsl:value-of select="$product.locale"/> +					</xsl:when> +					<xsl:otherwise> +						<xsl:text>en-US</xsl:text> +					</xsl:otherwise> +				</xsl:choose> +			</xsl:attribute> +		</meta> + +		<!-- Specify locale for this chunk. Should probably query xml:lang --> +		<meta name="Microsoft.Help.TopicLocale"> +			<xsl:attribute name="content"> +				<xsl:choose> +					<xsl:when test="@xml:lang"> +						<xsl:value-of select="@xml:lang"/> +					</xsl:when> +					<xsl:when test="$product.locale and product.locale != ''"> +						<xsl:value-of select="$product.locale"/> +					</xsl:when> +					<xsl:otherwise> +						<xsl:text>en-US</xsl:text> +					</xsl:otherwise> +				</xsl:choose> +			</xsl:attribute> +		</meta> + +		<!-- This is the unique ID for this page --> +		<meta name="Microsoft.Help.Id"> +			<xsl:attribute name="content"> +				<xsl:call-template name="hv1.toc.id"/> +			</xsl:attribute> +		</meta> + +		<!-- The ID of the parent TOC node (-1 is root) --> +		<meta name="Microsoft.Help.TocParent"> +			<xsl:attribute name="content"> +				<xsl:call-template name="hv1.toc.parent.id"> +					<xsl:with-param name="up" select="$up"/> +				</xsl:call-template> +			</xsl:attribute> +		</meta> + +		<!-- For all pages with the same parent, the order is set by TocOrder --> +		<meta name="Microsoft.Help.TocOrder"> +			<xsl:attribute name="content"> +				<xsl:value-of select="1+count(preceding-sibling::chapter|preceding-sibling::section)"/> +			</xsl:attribute> +		</meta> + +		<!-- boolean to indicate if this page is allowed to load custom branding --> +		<meta name="Microsoft.Help.SelfBranded"> +			<xsl:attribute name="content"> +				<xsl:choose> +					<xsl:when test="$topic.selfbrand"> +						<xsl:text>true</xsl:text> +					</xsl:when> +					<xsl:otherwise> +						<xsl:text>false</xsl:text> +					</xsl:otherwise> +				</xsl:choose> +			</xsl:attribute> +		</meta> + +		<!-- +			Insert description meta element. This is shown in searches and indexes +		--> + +		<xsl:variable name="description"> +			<xsl:call-template name="hv1.description"/> +		</xsl:variable> +		<xsl:if test="$description != ''"> +			<meta name="Description"> +				<xsl:attribute name="content"> +					<xsl:call-template name="hv1.description"/> +				</xsl:attribute> +			</meta> +		</xsl:if> + +		<!-- Display version of page --> +		<xsl:variable name="display.version"> +			<xsl:call-template name="hv1.display.version"/> +		</xsl:variable> +		<xsl:if test="$display.version != ''"> +			<meta name="Microsoft.Help.DisplayVersion"> +				<xsl:attribute name="content"> +					<xsl:value-of select="$display.version"/> +				</xsl:attribute> +			</meta> +		</xsl:if> + +		<!-- +			Content type is used to distinguish between multiple topics with same id. +			Usualy to have multiple versions available +		--> +		<!-- +		<meta name="Microsoft.Help.ContentType"> +			<xsl:attribute name="content"> +				TODO: implement +			</xsl:attribute> +		</meta> +		--> + + +		<!-- If a product name is given, then mark each header with this name--> +		<xsl:if test="$product.name and $product.name != ''"> +			<meta name="Microsoft.Help.Product"> +				<xsl:attribute name="content"> +					<xsl:value-of select="$product.name"/> +				</xsl:attribute> +			</meta> +		</xsl:if> + +		<!-- If a version is given, then mark each header with version--> +		<xsl:if test="$product.version and $product.version != ''"> +			<meta name="Microsoft.Help.ProductVersion"> +				<xsl:attribute name="content"> +					<xsl:value-of select="$product.version"/> +				</xsl:attribute> +			</meta> +		</xsl:if> + +		<!-- +			Insert all keywords for this chunk. These are used +			by the help runtime to generate indexes and refine search +		--> +		<xsl:call-template name="hv1.keywords" /> + +		<!-- +			Insert all F1 ids for this chunk. This is used +			by the help runtime to resolve F1 queries +		--> +		<xsl:call-template name="hv1.f1" /> +	</xsl:template> + + +	<!-- There are links from ToC pane to bibliodivs, so there must be anchor --> +	<xsl:template match="bibliodiv/title"> +		<h3 class="{name(.)}"> +			<xsl:call-template name="anchor"> +				<xsl:with-param name="node" select=".."/> +				<xsl:with-param name="conditional" select="0"/> +			</xsl:call-template> +			<xsl:apply-templates/> +		</h3> +	</xsl:template> + +	<!-- +		Template to get a page id. + +		Needs to be unique in the target help system; microsoft uses UUIDs for this. +		To avoid UUIDs and generate-id (only unique in current xml fragment), +		we do +			<root.filename> + +				<last ancestor title> + +					<second last ancestor title> + +						.... +						<self title>, 	where different types of sections/fragments +											may be prefixed with a type identifier. + +		This should generate a fairly specific/unique ID. +		--> +	<xsl:template name="get.id.from.pagename"> +		<xsl:param name="target" /> +		<xsl:value-of select="$root.filename"/> +		<xsl:variable name="id.of.document"> +			<xsl:apply-templates select="$target" mode="recursive-chunk-id"/> +		</xsl:variable> +		<xsl:variable name="titleWithSpace"> +			<xsl:value-of select="key('id',$id.of.document)/title"/> +		</xsl:variable> +		<xsl:value-of select="translate($id.of.document,' ','')" /> +	</xsl:template> + +	<!-- template that returns the page id used above --> +	<xsl:template match="*" mode="recursive-chunk-id"> +		<xsl:param name="recursive" select="false()"/> + +		<!-- returns the filename of a chunk --> +		<xsl:variable name="ischunk"> +			<xsl:call-template name="chunk"/> +		</xsl:variable> + +		<xsl:variable name="dbhtml-filename"> +			<xsl:call-template name="pi.dbhtml_filename"/> +		</xsl:variable> + +		<xsl:variable name="filename"> +			<xsl:choose> +				<xsl:when test="$dbhtml-filename != ''"> +					<xsl:value-of select="$dbhtml-filename"/> +				</xsl:when> +				<!-- if this is the root element, use the root.filename --> +				<xsl:when test="not(parent::*) and $root.filename != ''"> +					<xsl:value-of select="$root.filename"/> +					<!-- <xsl:value-of select="$html.ext"/> --> +				</xsl:when> +				<!-- Special case --> +				<xsl:when test="self::legalnotice and not($generate.legalnotice.link = 0)"> +					<xsl:choose> +						<xsl:when test="(@id or @xml:id) and not($use.id.as.filename = 0)"> +							<!-- * if this legalnotice has an ID, then go ahead and use --> +							<!-- * just the value of that ID as the basename for the file --> +							<!-- * (that is, without prepending an "ln-" too it) --> +							<xsl:value-of select="(@id|@xml:id)[1]"/> +							<!-- <xsl:value-of select="$html.ext"/>--> +						</xsl:when> +						<xsl:otherwise> +							<!-- * otherwise, if this legalnotice does not have an ID, --> +							<!-- * then we generate an ID... --> +							<xsl:variable name="id"> +								<xsl:call-template name="object.id"/> +							</xsl:variable> +							<!-- * ...and then we take that generated ID, prepend an --> +							<!-- * "ln-" to it, and use that as the basename for the file --> +							<!-- <xsl:value-of select="concat('ln-',$id,$html.ext)"/>--> +						</xsl:otherwise> +					</xsl:choose> +				</xsl:when> +				<!-- if there's no dbhtml filename, and if we're to use IDs as --> +				<!-- filenames, then use the ID to generate the filename. --> +				<xsl:when test="(@id or @xml:id) and $use.id.as.filename != 0"> +					<xsl:value-of select="(@id|@xml:id)[1]"/> +					<!-- <xsl:value-of select="$html.ext"/>--> +				</xsl:when> +				<xsl:otherwise/> +			</xsl:choose> +		</xsl:variable> + +		<xsl:choose> +			<xsl:when test="$ischunk='0'"> +				<!-- if called on something that isn't a chunk, walk up... --> +				<xsl:choose> +					<xsl:when test="count(parent::*)>0"> +						<xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> +							<xsl:with-param name="recursive" select="$recursive"/> +						</xsl:apply-templates> +					</xsl:when> +					<!-- unless there is no up, in which case return "" --> +					<xsl:otherwise/> +				</xsl:choose> +			</xsl:when> + +			<xsl:when test="not($recursive) and $filename != ''"> +				<!-- if this chunk has an explicit name, use it --> +				<xsl:value-of select="$filename"/> +			</xsl:when> + +			<xsl:when test="self::set"> +				<xsl:value-of select="$root.filename"/> +			</xsl:when> + +			<xsl:when test="self::book"> +				<xsl:text>bk</xsl:text> +				<xsl:number level="any" format="01"/> +			</xsl:when> + +			<xsl:when test="self::article"> +				<xsl:if test="/set"> +					<!-- in a set, make sure we inherit the right book info... --> +					<xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> +						<xsl:with-param name="recursive" select="true()"/> +					</xsl:apply-templates> +				</xsl:if> + +				<xsl:text>ar</xsl:text> +				<xsl:number level="any" format="01" from="book"/> +			</xsl:when> + +			<xsl:when test="self::preface"> +				<xsl:if test="/set"> +					<!-- in a set, make sure we inherit the right book info... --> +					<xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> +						<xsl:with-param name="recursive" select="true()"/> +					</xsl:apply-templates> +				</xsl:if> + +				<xsl:text>pr</xsl:text> +				<xsl:number level="any" format="01" from="book"/> +			</xsl:when> + +			<xsl:when test="self::chapter"> +				<xsl:if test="/set"> +					<!-- in a set, make sure we inherit the right book info... --> +					<xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> +						<xsl:with-param name="recursive" select="true()"/> +					</xsl:apply-templates> +				</xsl:if> + +				<xsl:text>ch</xsl:text> +				<xsl:number level="any" format="01" from="book"/> +			</xsl:when> + +			<xsl:when test="self::appendix"> +				<xsl:if test="/set"> +					<!-- in a set, make sure we inherit the right book info... --> +					<xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> +						<xsl:with-param name="recursive" select="true()"/> +					</xsl:apply-templates> +				</xsl:if> + +				<xsl:text>ap</xsl:text> +				<xsl:number level="any" format="a" from="book"/> +			</xsl:when> + +			<xsl:when test="self::part"> +				<xsl:choose> +					<xsl:when test="/set"> +						<!-- in a set, make sure we inherit the right book info... --> +						<xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> +							<xsl:with-param name="recursive" select="true()"/> +						</xsl:apply-templates> +					</xsl:when> +					<xsl:otherwise> +					</xsl:otherwise> +				</xsl:choose> + +				<xsl:text>pt</xsl:text> +				<xsl:number level="any" format="01" from="book"/> +			</xsl:when> + +			<xsl:when test="self::reference"> +				<xsl:choose> +					<xsl:when test="/set"> +						<!-- in a set, make sure we inherit the right book info... --> +						<xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> +							<xsl:with-param name="recursive" select="true()"/> +						</xsl:apply-templates> +					</xsl:when> +					<xsl:otherwise> +					</xsl:otherwise> +				</xsl:choose> + +				<xsl:text>rn</xsl:text> +				<xsl:number level="any" format="01" from="book"/> +			</xsl:when> + +			<xsl:when test="self::refentry"> +				<xsl:choose> +					<xsl:when test="parent::reference"> +						<xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> +							<xsl:with-param name="recursive" select="true()"/> +						</xsl:apply-templates> +					</xsl:when> +					<xsl:otherwise> +					</xsl:otherwise> +				</xsl:choose> + +				<xsl:text>re</xsl:text> +				<xsl:number level="any" format="01" from="book"/> +			</xsl:when> + +			<xsl:when test="self::colophon"> +				<xsl:choose> +					<xsl:when test="/set"> +						<!-- in a set, make sure we inherit the right book info... --> +						<xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> +							<xsl:with-param name="recursive" select="true()"/> +						</xsl:apply-templates> +					</xsl:when> +					<xsl:otherwise> +					</xsl:otherwise> +				</xsl:choose> + +				<xsl:text>co</xsl:text> +				<xsl:number level="any" format="01" from="book"/> +			</xsl:when> + +			<xsl:when test="self::sect1 +									or self::sect2 +									or self::sect3 +									or self::sect4 +									or self::sect5 +									or self::section"> +				<xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> +					<xsl:with-param name="recursive" select="true()"/> +				</xsl:apply-templates> +				<xsl:text>s</xsl:text> +				<xsl:number format="01"/> +			</xsl:when> + +			<xsl:when test="self::bibliography"> +				<xsl:choose> +					<xsl:when test="/set"> +						<!-- in a set, make sure we inherit the right book info... --> +						<xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> +							<xsl:with-param name="recursive" select="true()"/> +						</xsl:apply-templates> +					</xsl:when> +					<xsl:otherwise> +					</xsl:otherwise> +				</xsl:choose> + +				<xsl:text>bi</xsl:text> +				<xsl:number level="any" format="01" from="book"/> +			</xsl:when> + +			<xsl:when test="self::glossary"> +				<xsl:choose> +					<xsl:when test="/set"> +						<!-- in a set, make sure we inherit the right book info... --> +						<xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> +							<xsl:with-param name="recursive" select="true()"/> +						</xsl:apply-templates> +					</xsl:when> +					<xsl:otherwise> +					</xsl:otherwise> +				</xsl:choose> + +				<xsl:text>go</xsl:text> +				<xsl:number level="any" format="01" from="book"/> +			</xsl:when> + +			<xsl:when test="self::index"> +				<xsl:choose> +					<xsl:when test="/set"> +						<!-- in a set, make sure we inherit the right book info... --> +						<xsl:apply-templates mode="recursive-chunk-id" select="parent::*"> +							<xsl:with-param name="recursive" select="true()"/> +						</xsl:apply-templates> +					</xsl:when> +					<xsl:otherwise> +					</xsl:otherwise> +				</xsl:choose> + +				<xsl:text>ix</xsl:text> +				<xsl:number level="any" format="01" from="book"/> +			</xsl:when> + +			<xsl:when test="self::setindex"> +				<xsl:text>si</xsl:text> +				<xsl:number level="any" format="01" from="set"/> +			</xsl:when> + +			<xsl:otherwise> +				<xsl:text>chunk-filename-error-</xsl:text> +				<xsl:value-of select="name(.)"/> +				<xsl:number level="any" format="01" from="set"/> +			</xsl:otherwise> +		</xsl:choose> +	</xsl:template> + +	<!-- Main template that generates internal links --> +	<xsl:template name="href.target"> +		<xsl:param name="context" select="."/> +		<xsl:param name="object" select="."/> +		<xsl:param name="toc-context" select="."/> + +		<xsl:variable name="id"> +			<xsl:call-template name="get.id.from.pagename"> +				<xsl:with-param name="target" select="$object"/> +			</xsl:call-template> +		</xsl:variable> + +		<xsl:variable name="href"> +			<xsl:choose> +				<xsl:when test="$use.mshelp.links"> +					<!-- Generate a ms.help type link--> +					<xsl:if test="$product.name = ''"> +						<xsl:message terminate="yes"> +							$product.name needs to be set to generate ms.help style links +						</xsl:message> +					</xsl:if> +					<xsl:if test="$product.version = ''"> +						<xsl:message terminate="yes"> +							$product.version needs to be set to generate ms.help style links +						</xsl:message> +					</xsl:if> +					<xsl:if test="$product.locale = ''"> +						<xsl:message terminate="yes"> +							$product.locale needs to be set to generate ms.help style links +						</xsl:message> +					</xsl:if> + +					<xsl:text>ms.help?method=page&id=</xsl:text> +					<xsl:value-of select="$id"/> +					<xsl:text>&product=</xsl:text> +					<xsl:value-of select="$product.name"/> +					<xsl:text>&productVersion=</xsl:text> +					<xsl:value-of select="$product.version"/> +					<xsl:text>&locale=</xsl:text> +					<xsl:value-of select="$product.locale"/> +					<!-- Append the jump id if the current object has an id--> +					<xsl:if test="$object[@id or @xml:id]"> +						<xsl:text>#</xsl:text> +						<xsl:value-of select="$object/@id|$object/@xml:id"/> +					</xsl:if> +				</xsl:when> +				<xsl:otherwise> +					<!-- Generate ms-xhelp type links. Default--> +					<xsl:text>ms-xhelp:///?Id=</xsl:text> +					<xsl:value-of select="$id"/> +				</xsl:otherwise> +			</xsl:choose> +		</xsl:variable> +		<xsl:value-of select="$href"/> +	</xsl:template> + +	<xsl:template match="*" mode="common.html.attributes"> +		<xsl:param name="class" select="local-name(.)"/> +		<xsl:param name="inherit" select="0"/> + +		<!-- +			Workaround for known issue with HelpLibAgent +			Comment from Bruce Belson: +			<pre> tags get their whitespace mangled by the Help Library Agent, +			unless the non-standard attribute xml:space="preserve" is added to the pre element. +		--> +		<xsl:if test="$class = 'programlisting' or $class = 'verbatim' or $class = 'litterallayout' or $class = 'screen'"> +			<xsl:attribute name="xml:space">preserve</xsl:attribute> +		</xsl:if> + +		<xsl:call-template name="generate.html.lang"/> +		<xsl:call-template name="dir"> +			<xsl:with-param name="inherit" select="$inherit"/> +		</xsl:call-template> +		<xsl:apply-templates select="." mode="class.attribute"> +			<xsl:with-param name="class" select="$class"/> +		</xsl:apply-templates> +	</xsl:template> + + +	<xsl:template name="hv1.display.version"> +		<xsl:apply-templates mode="title.markup" select="ancestor-or-self::book"/> +		<xsl:if test="ancestor-or-self::chapter"> +			<xsl:text> - </xsl:text> +			<xsl:apply-templates mode="title.markup" select="ancestor-or-self::chapter"/> +		</xsl:if> +	</xsl:template> + + +	<!-- Generate a meta element for each keyword in chunk --> +	<xsl:template name="hv1.keywords"> +		<xsl:variable name="is.chunk"> +			<xsl:call-template name="chunk"> +				<xsl:with-param name="node" select="."/> +			</xsl:call-template> +		</xsl:variable> + +		<xsl:for-each select=".//indexterm[$is.chunk = '0'] | +			(./indexterm | *[not(self::section or self::preface or self::book or self::chapter)]//indexterm)[$is.chunk = '1']"> +			<xsl:choose> +				<xsl:when test="primary != ''"> +					<meta name="Microsoft.Help.Keywords"> +						<xsl:attribute name="content"> +							<xsl:choose> +								<!-- This concats the primary and secondary togheter, separated by colon if there exists +								a tertiary element --> +								<xsl:when test="tertiary"> +									<xsl:value-of select="primary/text()" /> +									<xsl:text>: </xsl:text> +									<xsl:value-of select="secondary/text()" /> +									<xsl:text>, </xsl:text> +									<xsl:value-of select="tertiary/text()" /> +								</xsl:when> + +								<xsl:otherwise> +									<xsl:for-each select="primary/text() | secondary/text()"> +										<xsl:value-of select="." /> +										<xsl:if test="not(position() = last())">, </xsl:if> +									</xsl:for-each> +								</xsl:otherwise> +							</xsl:choose> +						</xsl:attribute> +					</meta> +				</xsl:when> +				<xsl:otherwise/> +			</xsl:choose> +		</xsl:for-each> +	</xsl:template> + +	<!-- Generate a F1 meta element for each indexterm with an ID (used as F1 id) --> +	<xsl:template name="hv1.f1"> +		<xsl:variable name="is.chunk"> +			<xsl:call-template name="chunk"> +				<xsl:with-param name="node" select="."/> +			</xsl:call-template> +		</xsl:variable> + +		<xsl:variable name="id"> +			<xsl:call-template name="hv1.toc.id"/> +		</xsl:variable> + +		<xsl:for-each select=".//indexterm[$is.chunk = '0'] | +			(./indexterm | *[not(self::section or self::preface or self::book or self::chapter)]//indexterm)[$is.chunk = '1']"> +			<xsl:if test="@id|@xml:id"> +				<meta name="Microsoft.Help.F1"> +					<xsl:attribute name="content"> +						<xsl:value-of select="(@id|@xml:id)[1]" /> +					</xsl:attribute> +				</meta> +			</xsl:if> +		</xsl:for-each> +	</xsl:template> + +	<!-- ID used for to resolution. Using default ID --> +	<xsl:template name="hv1.toc.id"> +		<xsl:variable name="href"> +			<xsl:call-template name="get.id.from.pagename"> +				<xsl:with-param name="target" select="."/> +			</xsl:call-template> +		</xsl:variable> +		<xsl:value-of select="$href"/> +	</xsl:template> + +	<!-- Determine parent id (if top level -> -1) --> +	<xsl:template name="hv1.toc.parent.id"> +		<xsl:param name="up" select="''"/> +		<xsl:variable name="href"> +			<xsl:choose> +				<xsl:when test="$up"> +					<!-- I have a parent --> +					<xsl:call-template name="get.id.from.pagename"> +						<xsl:with-param name="target" select="$up"/> +					</xsl:call-template> +				</xsl:when> +				<xsl:otherwise> +					<xsl:text>-1</xsl:text> +				</xsl:otherwise> +			</xsl:choose> +		</xsl:variable> +		<xsl:value-of select="$href"/> +	</xsl:template> + +	<xsl:template name="hv1.description"> +		<xsl:variable name="content"> +			<xsl:choose> +				<xsl:when test="abstract|d:abstract|d:info/d:abstract|bookinfo/abstract|sectioninfo/abstract|articleinfo/abstract|partinfo/abstract"> +					<xsl:value-of select="(abstract|d:abstract|d:info/d:abstract|bookinfo/abstract|sectioninfo/abstract|articleinfo/abstract|partinfo/abstract)[1]"/> +				</xsl:when> +				<xsl:when test="child::para"> +					<xsl:value-of select="substring(normalize-space(child::para[1]), 0, 150)"/> +				</xsl:when> +				<xsl:otherwise/> +			</xsl:choose> +		</xsl:variable> +		<xsl:if test="$content != ''"> +			<xsl:value-of select="concat($content, '...')"/> +		</xsl:if> +	</xsl:template> + + +</xsl:stylesheet> diff --git a/lib/lufa/LUFA/StudioIntegration/Docbook/placeholder.txt b/lib/lufa/LUFA/StudioIntegration/Docbook/placeholder.txt new file mode 100644 index 0000000000..dd69b7e0bd --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/Docbook/placeholder.txt @@ -0,0 +1 @@ +Copy the Docbook XSLT docbook-xsl-1.78.1 release contents into this directory (i.e. with the root Docbook files in the current folder). The Docbook releases can be found at http://sourceforge.net/projects/docbook/files/docbook-xsl/ . diff --git a/lib/lufa/LUFA/StudioIntegration/HV1/helpcontentsetup.msha b/lib/lufa/LUFA/StudioIntegration/HV1/helpcontentsetup.msha new file mode 100644 index 0000000000..bd1d7ee219 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/HV1/helpcontentsetup.msha @@ -0,0 +1,27 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<html xmlns="http://www.w3.org/1999/xhtml"> +	<head> +		<title>LUFA Help</title> +	</head> +	<body class="vendor-book"> +		<div class="details"> +			<span class="vendor">FourWalledCubicle</span> +			<span class="product">LUFA</span> +			<span class="name">LUFA Help</span> +			<span class="locale">en-us</span> +		</div> +		<div class="package-list"> +			<div class="package"> +				<span class="name">lufa_studio_help.mshc</span> +				<a class="current-link" href="lufa_studio_help.mshc">lufa_studio_help.mshc</a> +			</div> +		</div> +	</body> +</html> diff --git a/lib/lufa/LUFA/StudioIntegration/HV1/lufa_docbook_transform.xslt b/lib/lufa/LUFA/StudioIntegration/HV1/lufa_docbook_transform.xslt new file mode 100644 index 0000000000..26c1d378e2 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/HV1/lufa_docbook_transform.xslt @@ -0,0 +1,806 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> + +	<xsl:output method="xml" indent="no"/> + +	<xsl:template name="generate.book.title"> +		<xsl:text>LUFA Library</xsl:text> +	</xsl:template> + +	<xsl:template name="generate.book.id"> +		<xsl:param name="book.title"/> +		<xsl:choose> +			<xsl:when test="@id"> +				<xsl:value-of select="@id"/> +			</xsl:when> +			<xsl:otherwise> +				<xsl:value-of select="translate($book.title, ' ','')"/> +			</xsl:otherwise> +		</xsl:choose> +	</xsl:template> + +	<xsl:template name="generate.index.id"> +		<xsl:param name="name"/> +		<xsl:variable name="book.title"> +			<xsl:call-template name="generate.book.title"/> +		</xsl:variable> +		<xsl:variable name="book.id"> +			<xsl:call-template name="generate.book.id"> +				<xsl:with-param name="book.title" select="$book.title"/> +			</xsl:call-template> +		</xsl:variable> + +		<indexterm id="{$name}"> +			<primary> +				<xsl:value-of select="$book.title"/> +			</primary> +			<secondary> +				<xsl:value-of select="$name"/> +			</secondary> +		</indexterm> +	</xsl:template> + +	<xsl:template match="doxygen"> +		<xsl:variable name="book.title"> +			<xsl:call-template name="generate.book.title"/> +		</xsl:variable> + +		<xsl:variable name="book.id"> +			<xsl:call-template name="generate.book.id"> +				<xsl:with-param name="book.title" select="$book.title"/> +			</xsl:call-template> +		</xsl:variable> + +		<book id="{$book.id}"> +			<title> +				<xsl:value-of select="$book.title"/> +			</title> + +			<!-- Add index chapter --> +			<xsl:apply-templates select="compounddef[@kind = 'page' and @id = 'indexpage']"> +				<xsl:with-param name="element.type" select="'chapter'"/> +				<xsl:with-param name="page.title"   select="'Library Information'"/> +			</xsl:apply-templates> + +			<!-- Add free-floating chapters --> +			<xsl:apply-templates select="compounddef[@kind = 'page' and not(@id = 'indexpage') and not(//innerpage/@refid = @id)]"> +				<xsl:with-param name="element.type" select="'chapter'"/> +			</xsl:apply-templates> + +			<!-- Add Modules chapter --> +			<chapter> +				<title>Modules</title> +				<xsl:apply-templates select="compounddef[@kind = 'group' and not(//innergroup/@refid = @id)]"/> +			</chapter> +		</book> +	</xsl:template> + +	<xsl:template match="compounddef[@kind = 'page']"> +		<xsl:param name="element.type" select="'section'"/> +		<xsl:param name="page.title"   select="title"/> + +		<xsl:element name="{$element.type}"> +			<xsl:attribute name="id"> +				<xsl:value-of select="@id"/> +			</xsl:attribute> + +			<xsl:variable name="name"> +				<xsl:text>LUFA.</xsl:text> +				<xsl:value-of select="translate(compoundname, '_', '.')"/> +			</xsl:variable> + +			<xsl:call-template name="generate.index.id"> +				<xsl:with-param name="name" select="$name"/> +			</xsl:call-template> + +			<title> +				<xsl:value-of select="$page.title"/> +			</title> + +			<xsl:apply-templates select="detaileddescription"/> + +			<xsl:if test="not(innerpage) and count(detaileddescription//sect1)"> +				<para> +					<emphasis role="bold">Subsections:</emphasis> +					<itemizedlist> +						<xsl:for-each select="detaileddescription//sect1"> +							<listitem> +								<link linkend="{@id}"> +									<xsl:value-of select="title"/> +								</link> +							</listitem> +						</xsl:for-each> +					</itemizedlist> +				</para> +			</xsl:if> + +			<xsl:for-each select="innerpage"> +				<xsl:apply-templates select="ancestor::*/compounddef[@kind = 'page' and @id = current()/@refid]"/> +			</xsl:for-each> +		</xsl:element> +	</xsl:template> + +	<xsl:template match="compounddef[@kind = 'group']"> +		<section id="{@id}"> +			<title> +				<xsl:value-of select="title"/> +			</title> + +			<xsl:variable name="name"> +				<xsl:text>LUFA.</xsl:text> +				<xsl:value-of select="translate(compoundname, '_', '.')"/> +			</xsl:variable> + +			<xsl:call-template name="generate.index.id"> +				<xsl:with-param name="name" select="$name"/> +			</xsl:call-template> + +			<xsl:apply-templates select="detaileddescription"/> + +			<xsl:if test="count(innergroup)"> +				<para> +					<emphasis role="bold">Subgroups:</emphasis> +					<itemizedlist> +						<xsl:for-each select="innergroup"> +							<listitem> +								<link linkend="{@refid}"> +									<xsl:value-of select="text()"/> +								</link> +							</listitem> +						</xsl:for-each> +					</itemizedlist> +				</para> +			</xsl:if> + +			<xsl:apply-templates select="sectiondef"/> + +			<xsl:for-each select="innerclass"> +				<xsl:apply-templates select="ancestor::*/compounddef[@id = current()/@refid]"/> +			</xsl:for-each> + +			<xsl:for-each select="innergroup"> +				<xsl:apply-templates select="ancestor::*/compounddef[@kind = 'group' and @id = current()/@refid]"/> +			</xsl:for-each> +		</section> +	</xsl:template> + +	<xsl:template match="compounddef[@kind = 'struct' or @kind = 'union']"> +		<xsl:variable name="name" select="compoundname"/> + +		<section id="{@id}" xreflabel="{$name}"> +			<title> +				<xsl:choose> +					<xsl:when test="@kind = 'struct'"> +						<xsl:text>Struct </xsl:text> +					</xsl:when> + +					<xsl:when test="@kind = 'union'"> +						<xsl:text>Union </xsl:text> +					</xsl:when> +				</xsl:choose> + +				<xsl:value-of select="$name"/> +			</title> + +			<xsl:call-template name="generate.index.id"> +				<xsl:with-param name="name" select="$name"/> +			</xsl:call-template> + +			<xsl:apply-templates select="detaileddescription"/> + +			<xsl:for-each select="sectiondef[@kind = 'public-attrib']"> +				<table> +					<title> +						<xsl:value-of select="$name"/> +					</title> + +					<tgroup cols="3"> +						<thead> +							<row> +								<entry>Type</entry> +								<entry>Name</entry> +								<entry>Description</entry> +							</row> +						</thead> + +						<tbody> +							<xsl:for-each select="memberdef"> +								<row id="{@id}" xreflabel="{name}"> +									<entry> +										<xsl:value-of select="type"/> +									</entry> +									<entry> +										<xsl:value-of select="name"/> +										<xsl:if test="starts-with(argsstring, '[')"> +											<xsl:text>[]</xsl:text> +										</xsl:if> + +										<xsl:variable name="struct.element.name"> +											<xsl:value-of select="$name"/> +											<xsl:text>.</xsl:text> +											<xsl:value-of select="name"/> +										</xsl:variable> + +										<xsl:call-template name="generate.index.id"> +											<xsl:with-param name="name" select="$struct.element.name"/> +										</xsl:call-template> +									</entry> +									<entry> +										<xsl:apply-templates select="detaileddescription"/> +									</entry> +								</row> +							</xsl:for-each> +						</tbody> +					</tgroup> +				</table> +			</xsl:for-each> +		</section> +	</xsl:template> + +	<xsl:template match="memberdef[@kind = 'function']"> +		<section id="{@id}" xreflabel="{name}"> +			<title> +				<xsl:text>Function </xsl:text> +				<xsl:value-of select="name"/> +				<xsl:text>()</xsl:text> +			</title> + +			<xsl:call-template name="generate.index.id"> +				<xsl:with-param name="name" select="name"/> +			</xsl:call-template> + +			<para> +				<emphasis role="italic"> +					<xsl:value-of select="briefdescription"/> +				</emphasis> +			</para> + +			<programlisting language="c"> +				<emphasis role="keyword"> +					<xsl:value-of select="type"/> +				</emphasis> +				<xsl:text> </xsl:text> +				<xsl:value-of select="name"/> +				<xsl:text>(</xsl:text> + +				<xsl:choose> +					<xsl:when test="not(param[1]/declname)"> +						<emphasis role="keyword">void</emphasis> +					</xsl:when> + +					<xsl:otherwise> +						<xsl:for-each select="param"> +							<xsl:if test="position() > 1"> +								<xsl:text>,</xsl:text> +							</xsl:if> +							<xsl:text>
	</xsl:text> +							<emphasis role="keyword"> +								<xsl:value-of select="type"/> +							</emphasis> +							<xsl:text> </xsl:text> +							<xsl:value-of select="declname"/> +						</xsl:for-each> +					</xsl:otherwise> +				</xsl:choose> + +				<xsl:text>)</xsl:text> +			</programlisting> + +			<xsl:apply-templates select="detaileddescription"/> +		</section> +	</xsl:template> + +	<xsl:template match="memberdef[@kind = 'enum']"> +		<section id="{@id}" xreflabel="{name}"> +			<title> +				<xsl:text>Enum </xsl:text> +				<xsl:value-of select="name"/> +			</title> + +			<xsl:call-template name="generate.index.id"> +				<xsl:with-param name="name" select="name"/> +			</xsl:call-template> + +			<xsl:apply-templates select="detaileddescription"/> + +			<table> +				<title>Members</title> +				<tgroup cols="2"> +					<thead> +						<row> +							<entry>Enum Value</entry> +							<entry>Description</entry> +						</row> +					</thead> + +					<tbody> +						<xsl:for-each select="enumvalue"> +							<row> +								<entry> +									<para id="{@id}" xreflabel="{name}"> +										<xsl:value-of select="name"/> + +										<xsl:call-template name="generate.index.id"> +											<xsl:with-param name="name" select="name"/> +										</xsl:call-template> +									</para> +								</entry> +								<entry> +									<xsl:apply-templates select="detaileddescription"/> +								</entry> +							</row> +						</xsl:for-each> +					</tbody> +				</tgroup> +			</table> +		</section> +	</xsl:template> + +	<xsl:template match="memberdef[@kind = 'define']"> +		<section id="{@id}" xreflabel="{name}"> +			<title> +				<xsl:text>Macro </xsl:text> +				<xsl:value-of select="name"/> +			</title> + +			<xsl:call-template name="generate.index.id"> +				<xsl:with-param name="name" select="name"/> +			</xsl:call-template> + +			<programlisting language="c"> +				<emphasis role="preprocessor"> +					<xsl:text>#define </xsl:text> +					<xsl:value-of select="name"/> +					<xsl:if test="count(param) > 0"> +						<xsl:text>(</xsl:text> +						<xsl:for-each select="param/defname"> +							<xsl:if test="position() > 1"> +								<xsl:text>,</xsl:text> +							</xsl:if> +							<xsl:value-of select="."/> +						</xsl:for-each> +						<xsl:text>)</xsl:text> +					</xsl:if> +					<xsl:text> </xsl:text> + +					<!-- Split long macro definitions across multiple lines --> +					<xsl:if test="(string-length(initializer) > 50) or (count(param) > 0)"> +						<xsl:text>\
	</xsl:text> +					</xsl:if> + +					<xsl:value-of select="initializer"/> +				</emphasis> +				<xsl:text> </xsl:text> +			</programlisting> + +			<xsl:apply-templates select="detaileddescription"/> +		</section> +	</xsl:template> + +	<xsl:template match="memberdef[@kind = 'typedef']"> +		<section id="{@id}" xreflabel="{name}"> +			<title> +				<xsl:text>Type </xsl:text> +				<xsl:value-of select="name"/> +			</title> + +			<xsl:call-template name="generate.index.id"> +				<xsl:with-param name="name" select="name"/> +			</xsl:call-template> + +			<programlisting language="c"> +				<emphasis role="keyword"> +					<xsl:text>typedef </xsl:text> +					<xsl:value-of select="type"/> +				</emphasis> +				<xsl:text> </xsl:text> +				<xsl:value-of select="name"/> +				<xsl:text> </xsl:text> +				<xsl:value-of select="argsstring"/> +			</programlisting> + +			<xsl:apply-templates select="detaileddescription"/> +		</section> +	</xsl:template> + + +	<xsl:template match="memberdef[@kind = 'variable']"> +		<section id="{@id}" xreflabel="{name}"> +			<title> +				<xsl:text>Variable </xsl:text> +				<xsl:value-of select="name"/> +			</title> + +			<xsl:call-template name="generate.index.id"> +				<xsl:with-param name="name" select="name"/> +			</xsl:call-template> + +			<programlisting language="c"> +				<emphasis role="keyword"> +					<xsl:value-of select="type"/> +				</emphasis> +				<xsl:text> </xsl:text> +				<xsl:value-of select="name"/> +			</programlisting> + +			<xsl:apply-templates select="detaileddescription"/> +		</section> +	</xsl:template> + +	<xsl:template match="linebreak | simplesectsep"> +		<!-- MUST be on two separate lines, as this is a *literal* newline --> +		<literallayout> +		</literallayout> +	</xsl:template> + +	<xsl:template match="verbatim"> +		<programlisting> +			<xsl:apply-templates/> +		</programlisting> +	</xsl:template> + +	<xsl:template match="sectiondef"> +		<para> +			<xsl:value-of select="description"/> +		</para> + +		<xsl:apply-templates select="memberdef"/> +	</xsl:template> + +	<xsl:template match="simplesect" mode="struct"> +		<footnote> +			<xsl:apply-templates/> +		</footnote> +	</xsl:template> + +	<xsl:template match="simplesect"> +		<xsl:choose> +			<xsl:when test="@kind = 'par'"> +				<note> +					<title> +						<xsl:value-of select="title"/> +					</title> +					<xsl:apply-templates/> +				</note> +			</xsl:when> + +			<xsl:when test="@kind = 'return'"> +				<note> +					<title>Returns</title> +					<xsl:apply-templates/> +				</note> +			</xsl:when> + +			<xsl:when test="@kind = 'warning'"> +				<warning> +					<title>Warning</title> +					<xsl:apply-templates/> +				</warning> +			</xsl:when> + +			<xsl:when test="@kind = 'pre'"> +				<note> +					<title>Precondition</title> +					<xsl:apply-templates/> +				</note> +			</xsl:when> + +			<xsl:when test="@kind = 'see'"> +				<note> +					<title>See also</title> +					<xsl:apply-templates/> +				</note> +			</xsl:when> + +			<xsl:when test="@kind = 'note'"> +				<note> +					<title>Note</title> +					<xsl:apply-templates/> +				</note> +			</xsl:when> + +		</xsl:choose> +	</xsl:template> + +	<xsl:template match="parameterlist[@kind = 'param']"> +		<table> +			<title>Parameters</title> +			<tgroup cols="3"> +				<thead> +					<row> +						<entry>Data Direction</entry> +						<entry>Parameter Name</entry> +						<entry>Description</entry> +					</row> +				</thead> +				<tbody> +					<xsl:for-each select="parameteritem"> +						<row> +							<xsl:apply-templates select="."/> +						</row> +					</xsl:for-each> +				</tbody> +			</tgroup> +		</table> +	</xsl:template> + +	<xsl:template match="parameterlist[@kind = 'retval']"> +		<table> +			<title>Return Values</title> +			<tgroup cols="2"> +				<thead> +					<row> +						<entry>Return Value</entry> +						<entry>Description</entry> +					</row> +				</thead> +				<tbody> +					<xsl:for-each select="parameteritem"> +						<row> +							<xsl:apply-templates select="."/> +						</row> +					</xsl:for-each> +				</tbody> +			</tgroup> +		</table> +	</xsl:template> + +	<xsl:template match="parameteritem"> +		<xsl:if test="parent::parameterlist/@kind = 'param'"> +			<entry> +				<para> +					<xsl:choose> +						<xsl:when test="not(descendant::parametername/@direction)"> +							<emphasis role="italic">?</emphasis> +						</xsl:when> + +						<xsl:otherwise> +							<emphasis role="bold"> +								[<xsl:value-of select="descendant::parametername/@direction"/>] +							</emphasis> +						</xsl:otherwise> +					</xsl:choose> +				</para> +			</entry> +		</xsl:if> + +		<entry> +			<para> +				<xsl:value-of select="parameternamelist/parametername"/> +			</para> +		</entry> + +		<entry> +			<xsl:apply-templates select="parameterdescription"/> +		</entry> +	</xsl:template> + +	<xsl:template match="parameterdescription"> +		<para> +			<xsl:apply-templates/> +		</para> +	</xsl:template> + +	<xsl:template match="type"> +		<xsl:apply-templates/> +	</xsl:template> + +	<xsl:template match="bold"> +		<emphasis role="bold"> +			<xsl:apply-templates/> +		</emphasis> +	</xsl:template> + +	<xsl:template match="emphasis"> +		<emphasis role="italic"> +			<xsl:apply-templates/> +		</emphasis> +	</xsl:template> + +	<xsl:template match="small"> +		<xsl:apply-templates/> +	</xsl:template> + +	<xsl:template match="mdash | ndash"> +		<!-- Doxygen bug; double dashed are replaced with single HTML dash +		     entities, even in verbatim-like <tt> sections --> +		<xsl:text>--</xsl:text> +	</xsl:template> + +	<xsl:template match="computeroutput | preformatted"> +		<computeroutput> +			<xsl:apply-templates/> +		</computeroutput> +	</xsl:template> + +	<xsl:template match="codeline"> +			<xsl:apply-templates/> +	</xsl:template> + +	<xsl:template match="ulink"> +		<ulink url="{@url}"> +			<xsl:value-of select="."/> +		</ulink> +	</xsl:template> + +	<xsl:template match="superscript"> +		<superscript> +			<xsl:apply-templates/> +		</superscript> +	</xsl:template> + +	<xsl:template match="subscript"> +		<subscript> +			<xsl:apply-templates/> +		</subscript> +	</xsl:template> + +	<xsl:template match="para"> +		<para> +			<xsl:apply-templates/> +		</para> +	</xsl:template> + +	<xsl:template match="ref"> +		<xsl:choose> +			<!-- Don't show links inside program listings --> +			<xsl:when test="ancestor::programlisting"> +				<xsl:value-of select="."/> +			</xsl:when> + +			<!-- Don't show links to file compound definitions, as they are discarded --> +			<xsl:when test="ancestor::*/compounddef[@kind = 'file' and @id = current()/@refid]"> +				<xsl:value-of select="."/> +			</xsl:when> + +			<!-- Show links outside program listings --> +			<xsl:otherwise> +				<link linkend="{@refid}"> +					<xsl:value-of select="text()"/> +				</link> +			</xsl:otherwise> +		</xsl:choose> +	</xsl:template> + +	<xsl:template match="entry"> +		<entry> +			<xsl:apply-templates/> +		</entry> +	</xsl:template> + +	<xsl:template match="table[caption]"> +		<table> +			<title> +				<xsl:value-of select="caption"/> +			</title> + +			<tgroup cols="{@cols}"> +				<thead> +					<xsl:apply-templates select="row[entry/@thead = 'yes']"/> +				</thead> + +				<tbody> +					<xsl:apply-templates select="row[entry/@thead != 'yes']"/> +				</tbody> +			</tgroup> +		</table> +	</xsl:template> + +	<xsl:template match="table[not(caption)]"> +		<informaltable> +			<tgroup cols="{@cols}"> +				<thead> +					<xsl:apply-templates select="row[entry/@thead = 'yes']"/> +				</thead> + +				<tbody> +					<xsl:apply-templates select="row[entry/@thead != 'yes']"/> +				</tbody> +			</tgroup> +		</informaltable> +	</xsl:template> + +	<xsl:template match="row"> +		<row> +			<xsl:apply-templates/> +		</row> +	</xsl:template> + +	<xsl:template match="itemizedlist"> +		<itemizedlist> +			<xsl:apply-templates/> +		</itemizedlist> +	</xsl:template> + +	<xsl:template match="orderedlist"> +		<orderedlist> +			<xsl:apply-templates/> +		</orderedlist> +	</xsl:template> + +	<xsl:template match="listitem"> +		<listitem> +			<xsl:apply-templates/> +		</listitem> +	</xsl:template> + +	<xsl:template match="programlisting"> +		<programlisting language="c"> +			<xsl:for-each select="codeline[position() > 1 or highlight]"> +				<xsl:apply-templates select="."/> +				<xsl:text>
</xsl:text> +			</xsl:for-each> +		</programlisting> +	</xsl:template> + +	<xsl:template match="highlight"> +		<emphasis role="{@class}"> +			<xsl:apply-templates/> +		</emphasis> +	</xsl:template> + +	<xsl:template match="highlight[1]/text()"> +		<xsl:choose> +			<xsl:when test="substring(., 1, 1) = '*'"> +				<xsl:value-of select="substring(., 2)"/> +			</xsl:when> + +			<xsl:otherwise> +				<xsl:value-of select="."/> +			</xsl:otherwise> +		</xsl:choose> +	</xsl:template> + +	<xsl:template match="sp[ancestor::codeline]"> +		<xsl:text> </xsl:text> +	</xsl:template> + +	<xsl:template match="image"> +		<mediaobject> +			<imageobject> +				<imagedata align="center"> +					<xsl:attribute name="fileref"> +						<xsl:text>images/</xsl:text> +						<xsl:value-of select="@name"/> +					</xsl:attribute> +				</imagedata> +			</imageobject> +		</mediaobject> +	</xsl:template> + +	<xsl:template match="detaileddescription"> +		<xsl:apply-templates/> +	</xsl:template> + +	<xsl:template match="sect1 | sect2 | sect3 | sect4 | sect5 | sect6 | sect7 | sect8 | sect9"> +		<section> +			<xsl:if test="@id"> +				<xsl:attribute name="id"> +					<xsl:value-of select="@id"/> +				</xsl:attribute> +			</xsl:if> + +			<title> +				<xsl:value-of select="title"/> +			</title> + +			<xsl:apply-templates/> +		</section> +	</xsl:template> + +	<xsl:template match="anchor"> +		<xsl:if test="@id"> +			<indexterm id="{@id}"/> +		</xsl:if> +	</xsl:template> + +	<xsl:template match="title"/> + +	<xsl:template match="htmlonly"/> + +	<xsl:template match="*"> +		<xsl:message>NO XSL TEMPLATE MATCH: <xsl:value-of select="local-name()"/></xsl:message> +	</xsl:template> + +</xsl:stylesheet> diff --git a/lib/lufa/LUFA/StudioIntegration/HV1/lufa_helpcontentsetup_transform.xslt b/lib/lufa/LUFA/StudioIntegration/HV1/lufa_helpcontentsetup_transform.xslt new file mode 100644 index 0000000000..c9ff58f597 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/HV1/lufa_helpcontentsetup_transform.xslt @@ -0,0 +1,47 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio HV1 Setup XHTML transform file --> + +<!-- Updates a helpcontentsetup.msha document to add appropriate version +     information. --> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:xhtml="http://www.w3.org/1999/xhtml" version="1.0"> +	<xsl:output method="xml" omit-xml-declaration="yes"/> + +	<!-- Need to input the LUFA help package filename for later use --> +	<xsl:param name="help-package-filename"/> + +	<!-- Recursively match and copy/process all nodes/attributes --> +	<xsl:template match="node()"> +		<xsl:copy> +			<xsl:copy-of select="@*"/> +			<xsl:apply-templates select="node()"/> +		</xsl:copy> +	</xsl:template> + +	<!-- Update the LUFA help package file name --> +	<xsl:template match="xhtml:div[@class='package']/xhtml:span[@class='name']"> +		<xsl:copy> +			<xsl:copy-of select="@class"/> + +			<xsl:value-of select="$help-package-filename"/> +		</xsl:copy> +	</xsl:template> + +	<xsl:template match="xhtml:div[@class='package']/xhtml:a[@class='current-link']"> +		<xsl:copy> +			<xsl:copy-of select="@class"/> + +			<xsl:attribute name="href"> +				<xsl:value-of select="$help-package-filename"/> +			</xsl:attribute> + +			<xsl:value-of select="$help-package-filename"/> +		</xsl:copy> +	</xsl:template> +</xsl:stylesheet> diff --git a/lib/lufa/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt b/lib/lufa/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt new file mode 100644 index 0000000000..e7b57ab641 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/HV1/lufa_hv1_transform.xslt @@ -0,0 +1,45 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Docbook XML to Microsoft Help Viewer 1.0 transform file --> + +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> + +	<xsl:import href="../Docbook/mshelp/docbook.xsl"/> + +	<xsl:output method="xml" indent="no"/> + +	<xsl:template match="emphasis[@role = 'keyword' or @role = 'keywordtype' or @role = 'keywordflow']"> +		<span class="hl-keyword" style="color: #0079C1"> +			<xsl:apply-templates/> +		</span> +	</xsl:template> + +	<xsl:template match="emphasis[@role = 'stringliteral' or @role = 'charliteral']"> +		<span class="hl-string" style="color: #800000"> +			<xsl:apply-templates/> +		</span> +	</xsl:template> + +	<xsl:template match="emphasis[@role = 'comment']"> +		<em class="hl-comment" style="color: #008000"> +			<xsl:apply-templates/> +		</em> +	</xsl:template> + +	<xsl:template match="emphasis[@role = 'preprocessor']"> +		<span class="hl-preprocessor" style="color: #A000A0"> +			<xsl:apply-templates/> +		</span> +	</xsl:template> + +	<xsl:template match="emphasis[@role = 'normal' and ancestor::programlisting]"> +		<xsl:apply-templates /> +	</xsl:template> + +</xsl:stylesheet> diff --git a/lib/lufa/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css b/lib/lufa/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css new file mode 100644 index 0000000000..b1b9cafd19 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/HV1/lufa_studio_help_styling.css @@ -0,0 +1,53 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +.programlisting { + 	display: block; + 	margin-left: 15px; + 	padding: 10px; + 	background-color: #f4f4f4; + 	border: 1px solid #aaaaaa; + 	font-family: "Consolas", "Courier New", sans-serif; + } + + code { + 	background-color: #f4f4f4; + 	font-family: "Consolas", "Courier New", sans-serif; + } + +.note, .warning, .tip { +	display: block; + 	margin-left: 15px; + 	padding-left: 10px; + 	padding-bottom: 5px; + 	background-color: #f4f4f4; + 	border: 1px solid #aaaaaa; +} + +table { +	border: 1px solid #aaaaaa; +	border-collapse: collapse; +	margin-left: 15px; +	font-size: 10pt; +} + +table thead { + 	background-color: #f4f4f4; +} + +table thead th { +	padding: 5px; +} + +table tbody td { +	padding: 5px; +} + +ul { +	padding-left: 20px; +} diff --git a/lib/lufa/LUFA/StudioIntegration/VSIX/LUFA.dll b/lib/lufa/LUFA/StudioIntegration/VSIX/LUFA.dll Binary files differnew file mode 100644 index 0000000000..369c78178b --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/VSIX/LUFA.dll diff --git a/lib/lufa/LUFA/StudioIntegration/VSIX/LUFA.pkgdef b/lib/lufa/LUFA/StudioIntegration/VSIX/LUFA.pkgdef Binary files differnew file mode 100644 index 0000000000..b1b2f943b8 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/VSIX/LUFA.pkgdef diff --git a/lib/lufa/LUFA/StudioIntegration/VSIX/[Content_Types].xml b/lib/lufa/LUFA/StudioIntegration/VSIX/[Content_Types].xml new file mode 100644 index 0000000000..112d169942 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/VSIX/[Content_Types].xml @@ -0,0 +1,13 @@ +<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types"> +	<Default Extension="vsixmanifest" ContentType="text/xml"/> +	<Default Extension="cache" ContentType="text/xml"/> +	<Default Extension="png" ContentType="application/octet-stream"/> +	<Default Extension="txt" ContentType="text/plain"/> +	<Default Extension="xml" ContentType="text/xml"/> +	<Default Extension="zip" ContentType="application/octet-stream"/> +	<Default Extension="dll" ContentType="application/octet-stream" /> +	<Default Extension="pkgdef" ContentType="text/plain" /> +	<Default Extension="htm" ContentType="text/html" /> +	<Default Extension="msha" ContentType="text/html" /> +	<Default Extension="mshc" ContentType="application/octet-stream"/> +</Types> diff --git a/lib/lufa/LUFA/StudioIntegration/VSIX/asf-manifest.xml b/lib/lufa/LUFA/StudioIntegration/VSIX/asf-manifest.xml new file mode 100644 index 0000000000..bd969518a1 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/VSIX/asf-manifest.xml @@ -0,0 +1,18 @@ +<AsfContentProvider Version="1.0.0"> +	<Identifier Id="0e160d5c-e331-48d9-850b-e0387912171b"> +		<Org>FourWalledCubicle</Org> +		<ShortName>LUFA</ShortName> +		<Author>Dean Camera</Author> +		<Description/> +		<FollowFolderStructure>True</FollowFolderStructure> +	</Identifier> +	<AsfContent Type="zip" Path="contents.zip"> +		<Content> +			<Version>0</Version> +			<HelpURL/> +			<Locator/> +			<DbXMLPath>content.xml.cache</DbXMLPath> +			<Description/> +		</Content> +	</AsfContent> +</AsfContentProvider> diff --git a/lib/lufa/LUFA/StudioIntegration/VSIX/extension.vsixmanifest b/lib/lufa/LUFA/StudioIntegration/VSIX/extension.vsixmanifest new file mode 100644 index 0000000000..a1901cb567 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/VSIX/extension.vsixmanifest @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> + +<Vsix xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2010"> +	<Identifier Id="FourWalledCubicle.LUFA.0e160d5c-e331-48d9-850b-e0387912171b"> +		<Name>LUFA Library</Name> +		<Author>Dean Camera</Author> +		<Version>0</Version> +		<MoreInfoUrl>http://www.lufa-lib.org</MoreInfoUrl> +		<Description xml:space="preserve">LUFA, the Lightweight USB Framework for AVRs.</Description> + +		<License>License.txt</License> +		<Icon>LUFA_thumb.png</Icon> +		<PreviewImage>LUFA.png</PreviewImage> + +		<SupportedProducts> +			<IsolatedShell Version="7.0">AtmelStudio</IsolatedShell> +		</SupportedProducts> + +		<SupportedFrameworkRuntimeEdition MinVersion="4.0" MaxVersion="4.5"/> +		<Locale>1033</Locale> + +		<AllUsers>false</AllUsers> +	</Identifier> + +	<References/> + +	<Content> +		<VsPackage>LUFA.pkgdef</VsPackage> +		<CustomExtension Type="MSHelp">helpcontentsetup.msha</CustomExtension> +		<CustomExtension Type="asf-manifest">asf-manifest.xml</CustomExtension> +	</Content> +</Vsix> diff --git a/lib/lufa/LUFA/StudioIntegration/VSIX/generate_caches.py b/lib/lufa/LUFA/StudioIntegration/VSIX/generate_caches.py new file mode 100644 index 0000000000..671bed9d56 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/VSIX/generate_caches.py @@ -0,0 +1,38 @@ +""" +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +""" + +import sys +sys.path.append("ProjectGenerator") + + +def show_message(message): +    print("[Project Generator] %s" % message) +    sys.stdout.flush() + + +def main(lufa_root_path): +    try: +        from asf_avrstudio5_interface import PythonFacade +    except ImportError: +        print("Fatal Error: The ASF project generator is missing.") +        return 1 + +    p = PythonFacade(lufa_root_path) + +    show_message("Checking database sanity...") +    p.check_extension_database_sanity(lufa_root_path) + +    show_message("Building cache files...") +    p.generate_extension_cache_files(lufa_root_path) + +    show_message("Cache files created.") +    return 0 + + +if __name__ == "__main__": +    sys.exit(main(sys.argv[1])) diff --git a/lib/lufa/LUFA/StudioIntegration/VSIX/lufa_asfmanifest_transform.xslt b/lib/lufa/LUFA/StudioIntegration/VSIX/lufa_asfmanifest_transform.xslt new file mode 100644 index 0000000000..00f552c9c9 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/VSIX/lufa_asfmanifest_transform.xslt @@ -0,0 +1,36 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework VSIX XML transform file --> + +<!-- Updates an asf-manifest.xml document to add appropriate version +     information. --> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> +	<xsl:output method="xml" omit-xml-declaration="yes"/> + +	<!-- Need to input the LUFA version for later use --> +	<xsl:param name="lufa-version"/> + +	<!-- Recursively match and copy/process all nodes/attributes --> +	<xsl:template match="@*|node()"> +		<xsl:copy> +			<xsl:apply-templates select="@*|node()"/> +		</xsl:copy> +	</xsl:template> + +	<!-- Update the LUFA version to the version passed as a parameter --> +	<xsl:template match="Version"> +		<xsl:copy> +			<xsl:value-of select="substring($lufa-version, 1, 2)"/> +			<xsl:text>.</xsl:text> +			<xsl:value-of select="substring($lufa-version, 3, 2)"/> +			<xsl:text>.</xsl:text> +			<xsl:value-of select="substring($lufa-version, 5, 2)"/> +		</xsl:copy> +	</xsl:template> +</xsl:stylesheet> diff --git a/lib/lufa/LUFA/StudioIntegration/VSIX/lufa_vsmanifest_transform.xslt b/lib/lufa/LUFA/StudioIntegration/VSIX/lufa_vsmanifest_transform.xslt new file mode 100644 index 0000000000..1198dd9dd6 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/VSIX/lufa_vsmanifest_transform.xslt @@ -0,0 +1,33 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework VSIX XML transform file --> + +<!-- Updates the version element of a Visual Studio VSIX manifest file to the +     value passed as a parameter to the stylesheet transform --> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:vs="http://schemas.microsoft.com/developer/vsx-schema/2010" version="1.0"> +	<xsl:output method="xml" omit-xml-declaration="yes"/> + +	<!-- Need to input the extension version for later use --> +	<xsl:param name="extension-version"/> + +	<!-- Recursively match and copy/process all nodes/attributes --> +	<xsl:template match="@*|node()"> +		<xsl:copy> +			<xsl:apply-templates select="@*|node()"/> +		</xsl:copy> +	</xsl:template> + +	<!-- Update the extension version to the version passed as a parameter --> +	<xsl:template match="vs:Version"> +		<xsl:copy> +			<xsl:value-of select="$extension-version"/> +		</xsl:copy> +	</xsl:template> + +</xsl:stylesheet> diff --git a/lib/lufa/LUFA/StudioIntegration/XDK/lufa_extension_transform.xslt b/lib/lufa/LUFA/StudioIntegration/XDK/lufa_extension_transform.xslt new file mode 100644 index 0000000000..c3fb82294a --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/XDK/lufa_extension_transform.xslt @@ -0,0 +1,68 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework Extension XML transform file --> + +<!-- Creates an extension.xml document from a given manifest list of XML files, +     and adds appropriate documentation base URI entries and version +     information. --> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> +	<xsl:output method="xml" omit-xml-declaration="yes"/> + +	<!-- Store the LUFA version mentioned in the root node for later use --> +	<xsl:param name="lufa-version" select="lufa-manifest/@version"/> + +	<!-- Read manifest list and then process all FDK nodes in the referenced +	     document --> +	<xsl:template match="lufa-manifest"> +		<xsl:comment>This file has been automatically generated from the LUFA Atmel Studio integration XML files.</xsl:comment> + +		<extension-container xmlversion="2.0"> +			<xsl:for-each select="xml-source"> +				<xsl:apply-templates select="document(@filename)/lufa/extension-container/*"/> +			</xsl:for-each> +		</extension-container> +	</xsl:template> + +	<!-- Recursively match and copy/process all nodes/attributes --> +	<xsl:template match="@*|node()"> +		<xsl:copy> +			<xsl:apply-templates select="@*|node()"/> +		</xsl:copy> +	</xsl:template> + +	<!-- Update the extension version to the version of LUFA being used --> +	<xsl:template match="extension/@version"> +		<xsl:attribute name="version"> +			<xsl:value-of select="substring($lufa-version, 1, 2)"/> +			<xsl:text>.</xsl:text> +			<xsl:value-of select="substring($lufa-version, 3, 2)"/> +			<xsl:text>.</xsl:text> +			<xsl:value-of select="substring($lufa-version, 5, 2)"/> +		</xsl:attribute> +	</xsl:template> + +	<!-- Update the extension online help URLs to the version of LUFA being +	     used --> +	<xsl:template match="online-help/*/@baseurl"> +		<xsl:attribute name="baseurl"> +			<xsl:value-of select="current()"/> +			<xsl:value-of select="$lufa-version"/> +			<xsl:text>/html/</xsl:text> +		</xsl:attribute> +	</xsl:template> + +	<xsl:template match="online-help/index-page/@url"> +		<xsl:attribute name="url"> +			<xsl:value-of select="current()"/> +			<xsl:value-of select="$lufa-version"/> +			<xsl:text>/html/</xsl:text> +		</xsl:attribute> +	</xsl:template> + +</xsl:stylesheet> diff --git a/lib/lufa/LUFA/StudioIntegration/XDK/lufa_filelist_transform.xslt b/lib/lufa/LUFA/StudioIntegration/XDK/lufa_filelist_transform.xslt new file mode 100644 index 0000000000..2998b879f0 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/XDK/lufa_filelist_transform.xslt @@ -0,0 +1,35 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework Module XML transform file --> + +<!-- Outputs a flat file list of all source files referenced in all modules of +     the input manifest XML file, so that they can be checked for existence. --> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> +	<xsl:output method="xml" omit-xml-declaration="yes"/> + +	<!-- Read manifest list, add a comment to indicate the source filename +	     and then process all ASF nodes in the referenced document --> +	<xsl:template match="lufa-manifest"> +		<xsl:for-each select="xml-source"> +			<xsl:comment>Sourced from <xsl:value-of select="@filename"/></xsl:comment> +			<xsl:apply-templates select="document(@filename)/lufa/asf/*"/> +		</xsl:for-each> +	</xsl:template> + +	<!-- Recursively match and process all nodes/attributes --> +	<xsl:template match="@*|node()"> +		<xsl:apply-templates select="@*|node()"/> +	</xsl:template> + +	<!-- Match source file nodes, output filename --> +	<xsl:template match="build[@type='c-source']|build[@type='header-file']|build[@type='distribute']"> +		<xsl:value-of select="@value"/> +		<xsl:text>
</xsl:text> +	</xsl:template> +</xsl:stylesheet> diff --git a/lib/lufa/LUFA/StudioIntegration/XDK/lufa_indent_transform.xslt b/lib/lufa/LUFA/StudioIntegration/XDK/lufa_indent_transform.xslt new file mode 100644 index 0000000000..6c22ff94cc --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/XDK/lufa_indent_transform.xslt @@ -0,0 +1,23 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework XML transform file --> + +<!-- Indents a given XML document to match the node hierarchy. --> +<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> +	<xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/> + +	<!-- Remove all white-space on all elements so that they can be indented --> +	<xsl:strip-space elements="*"/> + +	<!-- Match the root node and copy, so that the output will be a correctly +	     indented version of the input document --> +	<xsl:template match="/"> +		<xsl:copy-of select="."/> +	</xsl:template> +</xsl:stylesheet> diff --git a/lib/lufa/LUFA/StudioIntegration/XDK/lufa_module_transform.xslt b/lib/lufa/LUFA/StudioIntegration/XDK/lufa_module_transform.xslt new file mode 100644 index 0000000000..0ab44e7a18 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/XDK/lufa_module_transform.xslt @@ -0,0 +1,66 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework Module XML transform file --> + +<!-- Creates an asf.xml module document from a given manifest list of XML files, +     and adds appropriate documentation links by cross-referencing the Doxygen +     tag output file to map Doxygen group names to generated filenames. --> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> +	<xsl:output method="xml" omit-xml-declaration="yes"/> + +	<!-- Store the LUFA Doxygen tag filename mentioned in the root node for later use --> +	<xsl:param name="lufa-doxygen-tagfile" select="lufa-manifest/@tagfile"/> + +	<!-- Store the LUFA Doxygen documentation filename mentioned in the root node for later use --> +	<xsl:param name="lufa-doxygen-docfile" select="lufa-manifest/@docfile"/> + +	<!-- Read manifest list, add a comment to indicate the source filename +	     and then copy/process all ASF nodes in the referenced document --> +	<xsl:template match="lufa-manifest"> +		<xsl:comment>This file has been automatically generated from the LUFA Atmel Studio integration XML files.</xsl:comment> + +		<asf xmlversion="1.0"> +			<xsl:for-each select="xml-source"> +				<xsl:comment>Sourced from <xsl:value-of select="@filename"/></xsl:comment> +				<xsl:apply-templates select="document(@filename)/lufa/asf/*"/> +			</xsl:for-each> +		</asf> +	</xsl:template> + +	<!-- Recursively match and copy/process all nodes/attributes --> +	<xsl:template match="@*|node()"> +		<xsl:copy> +			<xsl:apply-templates select="@*|node()"/> +		</xsl:copy> +	</xsl:template> + +	<!-- For Doxygen entry point nodes we need to convert them into help link +	     nodes instead and add descriptions, so that they show up as links in +	     Studio correctly --> +	<xsl:template match="build[@type='doxygen-entry-point']"> +		<!-- select-by-config entries should not have a help link --> +		<xsl:if test="not(parent::select-by-config)"> +			<build type="online-help" subtype="module-help-page-append"> +			 	<xsl:attribute name="value"> +			 		<!-- Extract filename of the HTML file that contains the documentation for this module from the Doxgen tag file --> +				    <xsl:value-of select="document($lufa-doxygen-tagfile)/tagfile/compound[name=current()/@value]/filename"/> +	  			</xsl:attribute> +	  		</build> +	  	</xsl:if> + +		<!-- Modules inside a select-by-config entries should not have a help link --> +		<xsl:if test="not(parent::module and ../parent::select-by-config)"> +			<info type="description" value="summary"> +			 	<!-- Extract brief description of the module from the Doxygen combined XML documentation file --> +				<xsl:value-of select="document($lufa-doxygen-docfile)/doxygen/compounddef[compoundname=current()/@value]/briefdescription/para"/> +			</info> +	  	</xsl:if> +	</xsl:template> + +</xsl:stylesheet> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa.xml b/lib/lufa/LUFA/StudioIntegration/lufa.xml new file mode 100644 index 0000000000..d7ac1ca859 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa.xml @@ -0,0 +1,96 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<extension-container> +		<extension uuid="0e160d5c-e331-48d9-850b-e0387912171b" org="FourWalledCubicle" shortname="LUFA" version="" fullname="Lightweight USB Framework for AVRs (LUFA)"> +			<author name="Dean Camera" website="http://www.lufa-lib.org/" email="dean@fourwalledcubicle.com"/> +			<description>Lightweight USB Framework for AVRs (LUFA), a USB software stack/framework.</description> +			<icon-image path="LUFA/DoxygenPages/Images/LUFA_thumb.png"/> +			<preview-image path="LUFA/DoxygenPages/Images/LUFA.png"/> +			<license caption="LUFA License" path="LUFA/License.txt"/> +			<release-notes caption="LUFA Information" url="http://www.lufa-lib.org"/> +			<online-help> +				<index-page caption="LUFA Documentation" url="http://www.lufa-lib.org/documentation/"/> +				<module-help-page scheme="append" baseurl="http://www.lufa-lib.org/documentation/"/> +				<module-guide-page scheme="append" baseurl="http://www.lufa-lib.org/documentation/"/> +			</online-help> +			<dependencies/> +		</extension> +	</extension-container> + +	<asf> +		<device-alias-map name="lufa_avr8"> +			<device-support value="at90usb82"/> +			<device-support value="atmega8u2"/> +			<device-support value="at90usb162"/> +			<device-support value="atmega16u2"/> +			<device-support value="atmega16u4"/> +			<device-support value="atmega32u2"/> +			<device-support value="atmega32u4"/> +			<device-support value="at90usb646"/> +			<device-support value="at90usb647"/> +			<device-support value="at90usb1286"/> +			<device-support value="at90usb1287"/> +		</device-alias-map> + +		<device-alias-map name="lufa_xmega"> +			<device-support value="atxmega16a4u"/> +			<device-support value="atxmega32a4u"/> +			<device-support value="atxmega64a4u"/> +			<device-support value="atxmega128a4u"/> +			<device-support value="atxmega64a3u"/> +			<device-support value="atxmega128a3u"/> +			<device-support value="atxmega192a3u"/> +			<device-support value="atxmega256a3u"/> +			<device-support value="atxmega256a3bu"/> +			<device-support value="atxmega128a1u"/> +			<device-support value="atxmega64b3"/> +			<device-support value="atxmega128b3"/> +			<device-support value="atxmega64b1"/> +			<device-support value="atxmega128b1"/> +			<device-support value="atxmega64c3"/> +			<device-support value="atxmega128c3"/> +			<device-support value="atxmega192c3"/> +			<device-support value="atxmega256c3"/> +			<device-support value="atxmega384c3"/> +			<device-support value="atxmega16c4"/> +		</device-alias-map> + +		<device-alias-map name="lufa_uc3"> +			<device-support value="at32uc3a364"/> +			<device-support value="at32uc3a364s"/> +			<device-support value="at32uc3a464"/> +			<device-support value="at32uc3a464s"/> +			<device-support value="at32uc3b064"/> +			<device-support value="at32uc3b164"/> +			<device-support value="at32uc3a0128"/> +			<device-support value="at32uc3a1128"/> +			<device-support value="at32uc3a3128"/> +			<device-support value="at32uc3a3128s"/> +			<device-support value="at32uc3a4128"/> +			<device-support value="at32uc3a4128s"/> +			<device-support value="at32uc3b0128"/> +			<device-support value="at32uc3b1128"/> +			<device-support value="at32uc3a0256"/> +			<device-support value="at32uc3a1256"/> +			<device-support value="at32uc3a3256"/> +			<device-support value="at32uc3a3256s"/> +			<device-support value="at32uc3a4256"/> +			<device-support value="at32uc3a4256s"/> +			<device-support value="at32uc3b0256"/> +			<device-support value="at32uc3b1256"/> +			<device-support value="at32uc3a0512"/> +			<device-support value="at32uc3a1512"/> +			<device-support value="at32uc3b0512"/> +			<device-support value="at32uc3b1512"/> +		</device-alias-map> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_common.xml b/lib/lufa/LUFA/StudioIntegration/lufa_common.xml new file mode 100644 index 0000000000..e5e1074348 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_common.xml @@ -0,0 +1,34 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<module type="service" id="lufa.common" caption="LUFA Common Infrastructure"> +			<device-support-alias value="lufa_avr8"/> +			<device-support-alias value="lufa_xmega"/> +			<device-support-alias value="lufa_uc3"/> + +			<info type="gui-flag" value="hidden"/> +			<build type="doxygen-entry-point" value="Group_Common"/> + +			<build type="include-path" value=".."/> +			<build type="header-file" subtype="api" value="Version.h"/> +			<build type="distribute" subtype="license" value="License.txt"/> + +			<build type="header-file" subtype="api" value="Common/Common.h"/> +			<build type="header-file" value="Common/Architectures.h"/> +			<build type="header-file" value="Common/ArchitectureSpecific.h"/> +			<build type="header-file" value="Common/Attributes.h"/> +			<build type="header-file" value="Common/BoardTypes.h"/> +			<build type="header-file" value="Common/CompilerSpecific.h"/> +			<build type="header-file" value="Common/Endianness.h"/> +		</module> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_board.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_board.xml new file mode 100644 index 0000000000..faaf56bfc1 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_board.xml @@ -0,0 +1,114 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<board id="lufa.boards.dummy.avr8" vendor="LUFA" caption="AVR8 Architecture"> +			<device-support value="mega"/> + +			<require idref="lufa.drivers.board"/> +			<require idref="lufa.drivers.board.info"/> +		</board> + +		<board id="lufa.boards.dummy.xmega" vendor="LUFA" caption="XMEGA Architecture"> +			<device-support value="xmega"/> + +			<require idref="lufa.drivers.board"/> +			<require idref="lufa.drivers.board.info"/> +		</board> + +		<board id="lufa.boards.dummy.uc3" vendor="LUFA" caption="UC3 Architecture"> +			<device-support value="uc3"/> + +			<require idref="lufa.drivers.board"/> +			<require idref="lufa.drivers.board.info"/> +		</board> + +		<module type="driver" id="lufa.drivers.board.info" caption="LUFA Board Hardware Information Driver"> +			<device-support-alias value="lufa_avr8"/> +			<device-support-alias value="lufa_xmega"/> +			<device-support-alias value="lufa_uc3"/> + +			<build type="doxygen-entry-point" value="Group_BoardInfo"/> + +			<require idref="lufa.common"/> + +			<build type="include-path" value=".."/> +			<build type="header-file"  subtype="api" value="Drivers/Board/Board.h"/> +		</module> + +		<module type="driver" id="lufa.drivers.board.leds" caption="LUFA Board LED Driver"> +			<device-support-alias value="lufa_avr8"/> +			<device-support-alias value="lufa_xmega"/> +			<device-support-alias value="lufa_uc3"/> + +			<build type="doxygen-entry-point" value="Group_LEDs"/> + +			<require idref="lufa.common"/> + +			<build type="include-path" value=".."/> +			<build type="header-file"  subtype="api" value="Drivers/Board/LEDs.h"/> +		</module> + +		<module type="driver" id="lufa.drivers.board.buttons" caption="LUFA Board Buttons Driver"> +			<device-support-alias value="lufa_avr8"/> +			<device-support-alias value="lufa_xmega"/> +			<device-support-alias value="lufa_uc3"/> + +			<build type="doxygen-entry-point" value="Group_Buttons"/> + +			<require idref="lufa.common"/> + +			<build type="include-path" value=".."/> +			<build type="header-file"  subtype="api" value="Drivers/Board/Buttons.h"/> +		</module> + +		<module type="driver" id="lufa.drivers.board.dataflash" caption="LUFA Board Dataflash Driver"> +			<device-support-alias value="lufa_avr8"/> +			<device-support-alias value="lufa_xmega"/> +			<device-support-alias value="lufa_uc3"/> + +			<build type="doxygen-entry-point" value="Group_Dataflash"/> + +			<require idref="lufa.common"/> + +			<build type="include-path" value=".."/> +			<build type="header-file"  subtype="api" value="Drivers/Board/Dataflash.h"/> +		</module> + +		<module type="driver" id="lufa.drivers.board.joystick" caption="LUFA Board Joystick Driver"> +			<device-support-alias value="lufa_avr8"/> +			<device-support-alias value="lufa_xmega"/> +			<device-support-alias value="lufa_uc3"/> + +			<build type="doxygen-entry-point" value="Group_Joystick"/> + +			<require idref="lufa.common"/> + +			<build type="include-path" value=".."/> +			<build type="header-file"  subtype="api" value="Drivers/Board/Joystick.h"/> +		</module> + +		<module type="driver" id="lufa.drivers.board.temperature" caption="LUFA Board Temperature Sensor Driver"> +			<device-support-alias value="lufa_avr8"/> +			<device-support-alias value="lufa_xmega"/> +			<device-support-alias value="lufa_uc3"/> + +			<build type="doxygen-entry-point" value="Group_Temperature"/> + +			<require idref="lufa.common"/> +			<require idref="lufa.drivers.peripheral.adc"/> + +			<build type="c-source"     value="Drivers/Board/Temperature.c"/> +			<build type="include-path" value=".."/> +			<build type="header-file"  subtype="api" value="Drivers/Board/Temperature.h"/> +		</module> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_board_names.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_board_names.xml new file mode 100644 index 0000000000..bd1d4bdfd1 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_board_names.xml @@ -0,0 +1,853 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<select-by-config id="lufa.drivers.board" name="lufa.drivers.board.name" default="none" caption="LUFA Board Support"> +			<info type="description" value="summary"> +				Board hardware (LEDs, Buttons, etc.) drivers for the preconfigured LUFA boards. Note that only the boards +				compatible with the currently selected device will be shown. + +				To disable all hardware drivers silently, use NONE. To supply customer drivers, use USER (see manual). +			</info> + +			<module type="driver" id="lufa.drivers.board#none" caption="Board Support - None"> +				<device-support value="avr"/> +				<build type="define" name="BOARD" value="BOARD_NONE"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#user" caption="Board Support - User Supplied"> +				<device-support value="avr"/> +				<build type="define" name="BOARD" value="BOARD_USER"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#adafruit_u4" caption="Board Support - ADAFRUITU4"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_ADAFRUITU4"/> + +				<device-support value="atmega32u4"/> +				<build type="define" name="BOARD" value="BOARD_ADAFRUITU4"/> + +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/ADAFRUITU4/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/ADAFRUITU4/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#atavrusbrf01" caption="Board Support - ATAVRUSBRF01"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_ATAVRUSBRF01"/> + +				<device-support value="at90usb1287"/> +				<build type="define" name="BOARD" value="BOARD_ATAVRUSBRF01"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/ATAVRUSBRF01/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/ATAVRUSBRF01/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/ATAVRUSBRF01/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#benito" caption="Board Support - BENITO"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_BENITO"/> + +				<device-support value="at90usb162"/> +				<build type="define" name="BOARD" value="BOARD_BENITO"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/BENITO/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/BENITO/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/BENITO/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#big_multio" caption="Board Support - BIGMULTIO"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_BIGMULTIO"/> + +				<device-support value="atmega32u4"/> +				<build type="define" name="BOARD" value="BOARD_BIGMULTIO"/> + +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/BIGMULTIO/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/BIGMULTIO/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#blackcat" caption="Board Support - BLACKCAT"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_BLACKCAT"/> + +				<device-support value="at90usb162"/> +				<build type="define" name="BOARD" value="BOARD_BLACKCAT"/> + +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/BLACKCAT/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/BLACKCAT/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#bui" caption="Board Support - BUI"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_BUI"/> + +				<device-support value="at90usb646"/> +				<build type="define" name="BOARD" value="BOARD_BUI"/> + +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/BUI/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/BUI/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#bumbleb" caption="Board Support - BUMBLEB"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_BUMBLEB"/> + +				<device-support value="at90usb162"/> +				<build type="define" name="BOARD" value="BOARD_BUMBLEB"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> +				<require idref="lufa.drivers.board.joystick"/> + +				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/Joystick.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/BUMBLEB/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#culv3" caption="Board Support - CULV3"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_CULV3"/> + +				<device-support value="atmega32u4"/> +				<build type="define" name="BOARD" value="BOARD_CULV3"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/CULV3/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/CULV3/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/CULV3/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#duce" caption="Board Support - DUCE"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_DUCE"/> + +				<device-support value="atmega32u2"/> +				<build type="define" name="BOARD" value="BOARD_DUCE"/> + +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/DUCE/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/DUCE/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#evk527" caption="Board Support - EVK527"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK527"/> + +				<device-support value="atmega32u4"/> +				<build type="define" name="BOARD" value="BOARD_EVK527"/> + +				<require idref="lufa.drivers.misc.at45db321c"/> +				<require idref="lufa.drivers.peripheral.spi"/> +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.dataflash"/> +				<require idref="lufa.drivers.board.joystick"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Dataflash.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/EVK527/Joystick.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/EVK527/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#jm_db_u2" caption="Board Support - JMDBU2"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_JMDBU2"/> + +				<device-support value="atmega32u2"/> +				<build type="define" name="BOARD" value="BOARD_JMDBU2"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/JMDBU2/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/JMDBU2/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/JMDBU2/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#leonardo" caption="Board Support - LEONARDO"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_LEONARDO"/> + +				<device-support value="atmega32u4"/> +				<build type="define" name="BOARD" value="BOARD_LEONARDO"/> + +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/LEONARDO/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/LEONARDO/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#maximus" caption="Board Support - MAXIMUS"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_MAXIMUS"/> + +				<device-support value="at90usb162"/> +				<build type="define" name="BOARD" value="BOARD_MAXIMUS"/> + +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/MAXIMUS/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MAXIMUS/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#micropendous_32u2" caption="Board Support - MICROPENDOUS_32U2"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_32U2"/> + +				<device-support value="atmega32u2"/> +				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_32U2"/> + +				<require idref="lufa.drivers.board.leds"/> +				<require idref="lufa.drivers.board.buttons"/> + +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/LEDs.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#micropendous_a" caption="Board Support - MICROPENDOUS_A"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_A"/> + +				<device-support value="at90usb1287"/> +				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_A"/> + +				<require idref="lufa.drivers.board.buttons"/> + +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#micropendous_1" caption="Board Support - MICROPENDOUS_1"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_1"/> + +				<device-support value="at90usb162"/> +				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_1"/> + +				<require idref="lufa.drivers.board.buttons"/> + +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#micropendous_2" caption="Board Support - MICROPENDOUS_2"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_2"/> + +				<device-support value="atmega32u4"/> +				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_2"/> + +				<require idref="lufa.drivers.board.buttons"/> + +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#micropendous_3" caption="Board Support - MICROPENDOUS_3"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_3"/> + +				<device-support value="at90usb1287"/> +				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_3"/> + +				<require idref="lufa.drivers.board.buttons"/> + +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#micropendous_4" caption="Board Support - MICROPENDOUS_4"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_4"/> + +				<device-support value="at90usb1287"/> +				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_4"/> + +				<require idref="lufa.drivers.board.buttons"/> + +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#micropendous_dip" caption="Board Support - MICROPENDOUS_DIP"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_DIP"/> + +				<device-support value="at90usb1287"/> +				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_DIP"/> + +				<require idref="lufa.drivers.board.buttons"/> + +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#micropendous_rev1" caption="Board Support - MICROPENDOUS_REV1"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_REV1"/> + +				<device-support value="at90usb1287"/> +				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_REV1"/> + +				<require idref="lufa.drivers.board.leds"/> +				<require idref="lufa.drivers.board.buttons"/> + +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/LEDs.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#micropendous_rev2" caption="Board Support - MICROPENDOUS_REV2"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROPENDOUS_REV2"/> + +				<device-support value="at90usb1287"/> +				<build type="define" name="BOARD" value="BOARD_MICROPENDOUS_REV2"/> + +				<require idref="lufa.drivers.board.leds"/> +				<require idref="lufa.drivers.board.buttons"/> + +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/LEDs.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MICROPENDOUS/Buttons.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#microsin_162" caption="Board Support - MICROSIN162"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_MICROSIN162"/> + +				<device-support value="atmega162"/> +				<build type="define" name="BOARD" value="BOARD_MICROSIN162"/> + +				<require idref="lufa.drivers.board.leds"/> +				<require idref="lufa.drivers.board.buttons"/> + +				<build type="header-file" value="Drivers/Board/AVR8/MICROSIN162/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MICROSIN162/LEDs.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MICROSIN162/Buttons.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#minimus" caption="Board Support - MINIMUS"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_MINIMUS"/> + +				<device-support value="atmega32u2"/> +				<build type="define" name="BOARD" value="BOARD_MINIMUS"/> + +				<require idref="lufa.drivers.board.leds"/> +				<require idref="lufa.drivers.board.buttons"/> + +				<build type="header-file" value="Drivers/Board/AVR8/MINIMUS/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MINIMUS/LEDs.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MINIMUS/Buttons.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#multio" caption="Board Support - MULTIO"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_MULTIO"/> + +				<device-support value="at90usb162"/> +				<build type="define" name="BOARD" value="BOARD_MULTIO"/> + +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/MULTIO/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MULTIO/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#olimex_162" caption="Board Support - OLIMEX162"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEX162"/> + +				<device-support value="at90usb162"/> +				<build type="define" name="BOARD" value="BOARD_OLIMEX162"/> + +				<require idref="lufa.drivers.board.leds"/> +				<require idref="lufa.drivers.board.buttons"/> + +				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX162/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX162/LEDs.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX162/Buttons.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#olimex_32u4" caption="Board Support - OLIMEX32U4"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEX32U4"/> + +				<device-support value="atmega32u4"/> +				<build type="define" name="BOARD" value="BOARD_OLIMEX32U4"/> + +				<require idref="lufa.drivers.board.leds"/> +				<require idref="lufa.drivers.board.buttons"/> + +				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX32U4/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX32U4/LEDs.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/OLIMEX32U4/Buttons.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#olimex_isp_mkii" caption="Board Support - OLIMEXISPMK2"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEXISPMK2"/> + +				<device-support value="at90usb162"/> +				<build type="define" name="BOARD" value="BOARD_OLIMEXISPMK2"/> + +				<require idref="lufa.drivers.board.leds"/> +				<require idref="lufa.drivers.board.buttons"/> + +				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXISPMK2/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXISPMK2/LEDs.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXISPMK2/Buttons.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#olimex_t32u4" caption="Board Support - OLIMEX_T32U4"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_OLIMEXT32U4"/> + +				<device-support value="atmega32u4"/> +				<build type="define" name="BOARD" value="BOARD_OLIMEXT32U4"/> + +				<require idref="lufa.drivers.board.leds"/> +				<require idref="lufa.drivers.board.buttons"/> + +				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXT32U4/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXT32U4/LEDs.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/OLIMEXT32U4/Buttons.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#rzusbstick" caption="Board Support - RZUSBSTICK"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_RZUSBSTICK"/> + +				<device-support value="at90usb1287"/> +				<build type="define" name="BOARD" value="BOARD_RZUSBSTICK"/> + +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/RZUSBSTICK/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/RZUSBSTICK/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#sparkfun_8u2" caption="Board Support - SPARKFUN8U2"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_SPARKFUN8U2"/> + +				<device-support value="atmega8u2"/> +				<build type="define" name="BOARD" value="BOARD_SPARKFUN8U2"/> + +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/SPARKFUN8U2/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/SPARKFUN8U2/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#stk525" caption="Board Support - STK525"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_STK525"/> + +				<device-support value="at90usb1287"/> +				<device-support value="at90usb1286"/> +				<device-support value="at90usb647"/> +				<device-support value="at90usb646"/> +				<build type="define" name="BOARD" value="BOARD_STK525"/> + +				<require idref="lufa.drivers.misc.at45db321c"/> +				<require idref="lufa.drivers.peripheral.spi"/> +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.dataflash"/> +				<require idref="lufa.drivers.board.joystick"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/STK525/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/STK525/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/STK525/Dataflash.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/STK525/Joystick.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/STK525/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#stk526" caption="Board Support - STK526"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_STK526"/> + +				<device-support value="at90usb162"/> +				<device-support value="at90usb82"/> +				<device-support value="atmega32u2"/> +				<device-support value="atmega16u2"/> +				<device-support value="atmega8u2"/> +				<build type="define" name="BOARD" value="BOARD_STK526"/> + +				<require idref="lufa.drivers.misc.at45db642d"/> +				<require idref="lufa.drivers.peripheral.spi"/> +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.dataflash"/> +				<require idref="lufa.drivers.board.joystick"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/STK526/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/STK526/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/STK526/Dataflash.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/STK526/Joystick.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/STK526/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#teensy" caption="Board Support - TEENSY"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_TEENSY"/> + +				<device-support value="at90usb162"/> +				<build type="define" name="BOARD" value="BOARD_TEENSY"/> + +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#teensy2" caption="Board Support - TEENSY2"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_TEENSY2"/> + +				<device-support value="at90usb646"/> +				<build type="define" name="BOARD" value="BOARD_TEENSY2"/> + +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/TEENSY/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#tul" caption="Board Support - TUL"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_TUL"/> + +				<device-support value="atmega32u4"/> +				<build type="define" name="BOARD" value="BOARD_TUL"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/TUL/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/TUL/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/TUL/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#udip" caption="Board Support - UDIP"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_UDIP"/> + +				<device-support value="atmega32u2"/> +				<build type="define" name="BOARD" value="BOARD_UDIP"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/UDIP/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/UDIP/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/UDIP/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#uno" caption="Board Support - UNO"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_UNO"/> + +				<device-support value="atmega8u2"/> +				<device-support value="atmega16u2"/> +				<build type="define" name="BOARD" value="BOARD_UNO"/> + +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/UNO/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/UNO/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#usb2ax" caption="Board Support - USB2AX"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_USB2AX"/> + +				<device-support value="atmega32u2"/> +				<build type="define" name="BOARD" value="BOARD_USB2AX"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#usb2ax_v3" caption="Board Support - USB2AX_V3"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_USB2AX_V3"/> + +				<device-support value="atmega32u2"/> +				<build type="define" name="BOARD" value="BOARD_USB2AX_V3"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#usb2ax_v3_1" caption="Board Support - USB2AX_V31"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_USB2AX_V31"/> + +				<device-support value="atmega32u2"/> +				<build type="define" name="BOARD" value="BOARD_USB2AX_V31"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/USB2AX/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#usbfoo" caption="Board Support - USBFOO"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_USBFOO"/> + +				<device-support value="atmega162"/> +				<build type="define" name="BOARD" value="BOARD_USBFOO"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/USBFOO/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/USBFOO/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/USBFOO/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#usbkey" caption="Board Support - USBKEY"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_USBKEY"/> + +				<device-support value="at90usb1287"/> +				<build type="define" name="BOARD" value="BOARD_USBKEY"/> + +				<require idref="lufa.drivers.misc.at45db642d"/> +				<require idref="lufa.drivers.peripheral.spi"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.dataflash"/> +				<require idref="lufa.drivers.board.joystick"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Dataflash.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/Joystick.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/USBKEY/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#usbtiny_mkii" caption="Board Support - USBTINYMKII"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_USBTINYMKII"/> + +				<device-support value="at90usb162"/> +				<build type="define" name="BOARD" value="BOARD_USBTINYMKII"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/USBTINYMKII/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/USBTINYMKII/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/USBTINYMKII/LEDs.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#xplain_rev1" caption="Board Support - XPLAIN (HW Rev 1)"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_XPLAIN_REV1"/> + +				<device-support value="at90usb1287"/> + +				<require idref="lufa.drivers.misc.at45db642d"/> +				<require idref="lufa.drivers.peripheral.spi"/> +				<require idref="lufa.drivers.board.dataflash"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Dataflash.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/LEDs.h"/> + +				<build type="define" name="BOARD" value="BOARD_XPLAIN_REV1"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#xplain" caption="Board Support - XPLAIN (HW Rev 2+)"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_XPLAIN"/> + +				<device-support value="at90usb1287"/> + +				<require idref="lufa.drivers.misc.at45db642d"/> +				<require idref="lufa.drivers.peripheral.spi"/> +				<require idref="lufa.drivers.board.dataflash"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/Dataflash.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/XPLAIN/LEDs.h"/> + +				<build type="define" name="BOARD" value="BOARD_XPLAIN"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#a3bu_xplained" caption="Board Support - A3BU_XPLAINED"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_A3BU_XPLAINED"/> + +				<device-support value="atxmega256a3bu"/> + +				<require idref="lufa.drivers.misc.at45db642d"/> +				<require idref="lufa.drivers.peripheral.usart_spi"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.dataflash"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/Board.h"/> +				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/Dataflash.h"/> +				<build type="header-file" value="Drivers/Board/XMEGA/A3BU_XPLAINED/LEDs.h"/> + +				<build type="define" name="BOARD" value="BOARD_A3BU_XPLAINED"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#b1_xplained" caption="Board Support - B1_XPLAINED"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_B1_XPLAINED"/> + +				<device-support value="atxmega128b1"/> + +				<require idref="lufa.drivers.misc.at45db642d"/> +				<require idref="lufa.drivers.peripheral.usart_spi"/> +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.dataflash"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/Board.h"/> +				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/Dataflash.h"/> +				<build type="header-file" value="Drivers/Board/XMEGA/B1_XPLAINED/LEDs.h"/> + +				<build type="define" name="BOARD" value="BOARD_B1_XPLAINED"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#evk1100" caption="Board Support - EVK1100"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK1100"/> + +				<device-support value="at32uc3a0512"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.joystick"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/UC3/EVK1100/Board.h"/> +				<build type="header-file" value="Drivers/Board/UC3/EVK1100/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/UC3/EVK1100/Joystick.h"/> +				<build type="header-file" value="Drivers/Board/UC3/EVK1100/LEDs.h"/> + +				<build type="define" name="BOARD" value="BOARD_EVK1100"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#evk1101" caption="Board Support - EVK1101"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK1101"/> + +				<device-support value="at32uc3b0256"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.joystick"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/UC3/EVK1101/Board.h"/> +				<build type="header-file" value="Drivers/Board/UC3/EVK1101/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/UC3/EVK1101/Joystick.h"/> +				<build type="header-file" value="Drivers/Board/UC3/EVK1101/LEDs.h"/> + +				<build type="define" name="BOARD" value="BOARD_EVK1101"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#evk1104" caption="Board Support - EVK1104"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_EVK1104"/> + +				<device-support value="at32uc3a3256"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/UC3/EVK1104/Board.h"/> +				<build type="header-file" value="Drivers/Board/UC3/EVK1104/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/UC3/EVK1104/LEDs.h"/> + +				<build type="define" name="BOARD" value="BOARD_EVK1104"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#uc3a3_xplained" caption="Board Support - UC3A3_XPLAINED"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_UC3_A3_XPLAINED"/> + +				<device-support value="at32uc3a3256"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/UC3/UC3A3_XPLAINED/Board.h"/> +				<build type="header-file" value="Drivers/Board/UC3/UC3A3_XPLAINED/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/UC3/UC3A3_XPLAINED/LEDs.h"/> + +				<build type="define" name="BOARD" value="BOARD_UC3A3_XPLAINED"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#stange_isp" caption="Board Support - STANGE_ISP"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_STANGE_ISP"/> + +				<device-support value="at90usb162"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/STANGE_ISP/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/STANGE_ISP/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/STANGE_ISP/LEDs.h"/> + +				<build type="define" name="BOARD" value="BOARD_STANGE_ISP"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#c3_xplained" caption="Board Support - C3_XPLAINED"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_C3_XPLAINED"/> + +				<device-support value="atxmega384c3"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/XMEGA/C3_XPLAINED/Board.h"/> +				<build type="header-file" value="Drivers/Board/XMEGA/C3_XPLAINED/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/XMEGA/C3_XPLAINED/LEDs.h"/> + +				<build type="define" name="BOARD" value="BOARD_C3_XPLAINED"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#u2s" caption="Board Support - U2S"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_U2S"/> + +				<device-support value="atmega32u2"/> + +				<require idref="lufa.drivers.board.buttons"/> +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/U2S/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/U2S/Buttons.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/U2S/LEDs.h"/> + +				<build type="define" name="BOARD" value="BOARD_U2S"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#yun" caption="Board Support - YUN"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_YUN"/> + +				<device-support value="atmega32u4"/> + +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/YUN/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/YUN/LEDs.h"/> + +				<build type="define" name="BOARD" value="BOARD_YUN"/> +			</module> + +			<module type="driver" id="lufa.drivers.board#micro" caption="Board Support - MICRO"> +				<build type="doxygen-entry-point" value="Group_BoardInfo_MICRO"/> + +				<device-support value="atmega32u4"/> + +				<require idref="lufa.drivers.board.leds"/> + +				<build type="header-file" value="Drivers/Board/AVR8/MICRO/Board.h"/> +				<build type="header-file" value="Drivers/Board/AVR8/MICRO/LEDs.h"/> + +				<build type="define" name="BOARD" value="BOARD_MICRO"/> +			</module> +		</select-by-config> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_misc.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_misc.xml new file mode 100644 index 0000000000..4585887742 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_misc.xml @@ -0,0 +1,57 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<module type="component" id="lufa.drivers.misc.at45db321c" caption="LUFA AT45DB321C Dataflash Commands"> +			<device-support-alias value="lufa_avr8"/> +			<device-support-alias value="lufa_xmega"/> +			<device-support-alias value="lufa_uc3"/> + +			<build type="doxygen-entry-point" value="Group_AT45DB321C"/> + +			<build type="include-path" value=".."/> +			<build type="header-file" subtype="api" value="Drivers/Misc/AT45DB321C.h"/> +		</module> + +		<module type="component" id="lufa.drivers.misc.at45db642d" caption="LUFA AT45DB642D Dataflash Commands"> +			<device-support-alias value="lufa_avr8"/> +			<device-support-alias value="lufa_xmega"/> +			<device-support-alias value="lufa_uc3"/> + +			<build type="doxygen-entry-point" value="Group_AT45DB321C"/> + +			<build type="include-path" value=".."/> +			<build type="header-file" subtype="api" value="Drivers/Misc/AT45DB642D.h"/> +		</module> + +		<module type="service" id="lufa.drivers.misc.ringbuffer" caption="LUFA Ring Buffer"> +			<device-support-alias value="lufa_avr8"/> +			<device-support-alias value="lufa_xmega"/> +			<device-support-alias value="lufa_uc3"/> + +			<build type="doxygen-entry-point" value="Group_RingBuff"/> + +			<build type="include-path" value=".."/> +			<build type="header-file" subtype="api" value="Drivers/Misc/RingBuffer.h"/> +		</module> + +		<module type="service" id="lufa.drivers.misc.ansi" caption="LUFA ANSI Terminal Commands"> +			<device-support-alias value="lufa_avr8"/> +			<device-support-alias value="lufa_xmega"/> +			<device-support-alias value="lufa_uc3"/> + +			<build type="doxygen-entry-point" value="Group_Terminal"/> + +			<build type="include-path" value=".."/> +			<build type="header-file" subtype="api" value="Drivers/Misc/TerminalCodes.h"/> +		</module> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_peripheral.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_peripheral.xml new file mode 100644 index 0000000000..55cf3fa889 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_peripheral.xml @@ -0,0 +1,198 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<select-by-device id="lufa.drivers.peripheral.usart" caption="LUFA USART Driver"> +			<module type="driver" id="lufa.drivers.peripheral.usart#avr8" caption="LUFA USART Driver - AVR8"> +				<device-support-alias value="lufa_avr8"/> + +				<build type="doxygen-entry-point" value="Group_Serial"/> + +				<require idref="lufa.common"/> +				<require idref="lufa.drivers.misc.ansi"/> + +				<build type="c-source" value="Drivers/Peripheral/AVR8/Serial_AVR8.c"/> +				<build type="header-file" value="Drivers/Peripheral/AVR8/Serial_AVR8.h"/> +				<build type="include-path" value=".."/> +				<build type="header-file" subtype="api" value="Drivers/Peripheral/Serial.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.peripheral.usart#xmega" caption="LUFA USART Driver - AVR8"> +				<device-support-alias value="lufa_xmega"/> + +				<build type="doxygen-entry-point" value="Group_Serial"/> + +				<require idref="lufa.common"/> +				<require idref="lufa.drivers.misc.ansi"/> + +				<build type="c-source" value="Drivers/Peripheral/XMEGA/Serial_XMEGA.c"/> +				<build type="header-file" value="Drivers/Peripheral/XMEGA/Serial_XMEGA.h"/> +				<build type="include-path" value=".."/> +				<build type="header-file" subtype="api" value="Drivers/Peripheral/Serial.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.peripheral.usart#uc3" caption="LUFA USART Driver - UC3"> +				<device-support-alias value="lufa_uc3"/> + +				<build type="doxygen-entry-point" value="Group_Serial"/> + +				<require idref="lufa.common"/> +				<require idref="lufa.drivers.misc.ansi"/> + +				<info type="gui-flag" value="hidden"/> +			</module> +		</select-by-device> + +		<select-by-device id="lufa.drivers.peripheral.spi" caption="LUFA SPI Driver"> +			<module type="driver" id="lufa.drivers.peripheral.spi#avr8" caption="LUFA SPI Driver - AVR8"> +				<device-support-alias value="lufa_avr8"/> + +				<build type="doxygen-entry-point" value="Group_SPI"/> + +				<require idref="lufa.common"/> + +				<build type="header-file" value="Drivers/Peripheral/AVR8/SPI_AVR8.h"/> +				<build type="include-path" value=".."/> +				<build type="header-file" subtype="api" value="Drivers/Peripheral/SPI.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.peripheral.spi#xmega" caption="LUFA SPI Driver - XMEGA"> +				<device-support-alias value="lufa_xmega"/> + +				<build type="doxygen-entry-point" value="Group_SPI"/> + +				<require idref="lufa.common"/> + +				<build type="header-file" value="Drivers/Peripheral/XMEGA/SPI_XMEGA.h"/> +				<build type="include-path" value=".."/> +				<build type="header-file" subtype="api" value="Drivers/Peripheral/SPI.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.peripheral.spi#uc3" caption="LUFA SPI Driver - UC3"> +				<device-support-alias value="lufa_uc3"/> + +				<build type="doxygen-entry-point" value="Group_SPI"/> + +				<require idref="lufa.common"/> + +				<info type="gui-flag" value="hidden"/> +			</module> +		</select-by-device> + +		<select-by-device id="lufa.drivers.peripheral.usart_spi" caption="LUFA USART SPI Driver"> +			<module type="driver" id="lufa.drivers.peripheral.usart_spi#avr8" caption="LUFA USART SPI Driver - AVR8"> +				<device-support-alias value="lufa_avr8"/> + +				<build type="doxygen-entry-point" value="Group_SerialSPI"/> + +				<require idref="lufa.common"/> + +				<build type="header-file" value="Drivers/Peripheral/AVR8/SerialSPI_AVR8.h"/> +				<build type="include-path" value=".."/> +				<build type="header-file" subtype="api"  value="Drivers/Peripheral/SerialSPI.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.peripheral.usart_spi#xmega" caption="LUFA USART SPI Driver - XMEGA"> +				<device-support-alias value="lufa_xmega"/> + +				<build type="doxygen-entry-point" value="Group_SerialSPI"/> + +				<require idref="lufa.common"/> + +				<build type="header-file" value="Drivers/Peripheral/XMEGA/SerialSPI_XMEGA.h"/> +				<build type="include-path" value=".."/> +				<build type="header-file" subtype="api" value="Drivers/Peripheral/SerialSPI.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.peripheral.usart_spi#uc3" caption="LUFA USART SPI Driver - UC3"> +				<device-support-alias value="lufa_uc3"/> + +				<build type="doxygen-entry-point" value="Group_SerialSPI"/> + +				<require idref="lufa.common"/> + +				<info type="gui-flag" value="hidden"/> +			</module> +		</select-by-device> + +		<select-by-device id="lufa.drivers.peripheral.twi" caption="LUFA TWI Master Driver"> +			<module type="driver" id="lufa.drivers.peripheral.twi#avr8" caption="LUFA TWI Master Driver - AVR8"> +				<device-support-alias value="lufa_avr8"/> + +				<build type="doxygen-entry-point" value="Group_TWI"/> + +				<require idref="lufa.common"/> + +				<build type="c-source" value="Drivers/Peripheral/AVR8/TWI_AVR8.c"/> +				<build type="header-file" value="Drivers/Peripheral/AVR8/TWI_AVR8.h"/> +				<build type="include-path" value=".."/> +				<build type="header-file" subtype="api" value="Drivers/Peripheral/TWI.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.peripheral.twi#xmega" caption="LUFA TWI Master Driver - XMEGA"> +				<device-support-alias value="lufa_xmega"/> + +				<build type="doxygen-entry-point" value="Group_TWI"/> + +				<require idref="lufa.common"/> + +				<build type="c-source" value="Drivers/Peripheral/XMEGA/TWI_XMEGA.c"/> +				<build type="header-file" value="Drivers/Peripheral/XMEGA/TWI_XMEGA.h"/> +				<build type="include-path" value=".."/> +				<build type="header-file" subtype="api" value="Drivers/Peripheral/TWI.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.peripheral.twi#uc3" caption="LUFA TWI Master Driver - UC3"> +				<device-support-alias value="lufa_uc3"/> + +				<build type="doxygen-entry-point" value="Group_TWI"/> + +				<require idref="lufa.common"/> + +				<info type="gui-flag" value="hidden"/> +			</module> +		</select-by-device> + +		<select-by-device id="lufa.drivers.peripheral.adc" caption="LUFA ADC Driver"> +			<module type="driver" id="lufa.drivers.peripheral.adc#avr8" caption="LUFA ADC Driver - AVR8"> +				<device-support-alias value="lufa_avr8"/> + +				<build type="doxygen-entry-point" value="Group_ADC"/> + +				<require idref="lufa.common"/> + +				<build type="header-file" value="Drivers/Peripheral/AVR8/ADC_AVR8.h"/> +				<build type="include-path" value=".."/> +				<build type="header-file" subtype="api" value="Drivers/Peripheral/ADC.h"/> +			</module> + +			<module type="driver" id="lufa.drivers.peripheral.adc#xmega" caption="LUFA ADC Driver - XMEGA"> +				<device-support-alias value="lufa_xmega"/> + +				<build type="doxygen-entry-point" value="Group_ADC"/> + +				<require idref="lufa.common"/> + +				<info type="gui-flag" value="hidden"/> +			</module> + +			<module type="driver" id="lufa.drivers.peripheral.adc#uc3" caption="LUFA ADC Driver - UC3"> +				<device-support-alias value="lufa_uc3"/> + +				<build type="doxygen-entry-point" value="Group_ADC"/> + +				<require idref="lufa.common"/> + +				<info type="gui-flag" value="hidden"/> +			</module> +		</select-by-device> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb.xml new file mode 100644 index 0000000000..15c65bf861 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb.xml @@ -0,0 +1,32 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<module type="driver" id="lufa.drivers.usb" caption="LUFA USB Driver"> +			<device-support-alias value="lufa_avr8"/> +			<device-support-alias value="lufa_xmega"/> +			<device-support-alias value="lufa_uc3"/> + +			<build type="doxygen-entry-point" value="Group_USB"/> + +			<build type="define" name="USE_LUFA_CONFIG_HEADER" value=""/> +			<build type="module-config" subtype="path" value="CodeTemplates"/> +			<build type="module-config" subtype="required-header-file" value="LUFAConfig.h"/> + +			<build type="include-path" value=".."/> +			<build type="header-file" subtype="api" value="Drivers/USB/USB.h"/> + +			<require idref="lufa.common"/> +			<require idref="lufa.drivers.usb.class"/> +			<require idref="lufa.drivers.usb.core"/> +		</module> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class.xml new file mode 100644 index 0000000000..5d07af05ea --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class.xml @@ -0,0 +1,32 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<module type="service" id="lufa.drivers.usb.class" caption="LUFA USB Class Drivers"> +			<device-support-alias value="lufa_avr8"/> +			<device-support-alias value="lufa_xmega"/> +			<device-support-alias value="lufa_uc3"/> + +			<info type="gui-flag" value="hidden"/> +			<build type="doxygen-entry-point" value="Group_USBClassDrivers"/> + +			<require idref="lufa.drivers.usb.class.android"/> +			<require idref="lufa.drivers.usb.class.audio"/> +			<require idref="lufa.drivers.usb.class.cdc"/> +			<require idref="lufa.drivers.usb.class.hid"/> +			<require idref="lufa.drivers.usb.class.ms"/> +			<require idref="lufa.drivers.usb.class.midi"/> +			<require idref="lufa.drivers.usb.class.printer"/> +			<require idref="lufa.drivers.usb.class.rndis"/> +			<require idref="lufa.drivers.usb.class.si"/> +		</module> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_android.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_android.xml new file mode 100644 index 0000000000..3ec06ed6cb --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_android.xml @@ -0,0 +1,54 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<select-by-config id="lufa.drivers.usb.class.android" name="lufa.drivers.usb.class.android.mode" default="host" caption="LUFA USB Class Driver - Android Accessory"> +			<build type="doxygen-entry-point" value="Group_USBClassAOA"/> + +			<module type="service" id="lufa.drivers.usb.class.android#host" caption="LUFA USB Class Driver - Android Accessory (Host)"> +				<info type="description" value="summary"> +					Common definitions and Host mode implementation of the Android Open Accessory USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassAOA"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/AndroidAccessoryClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/AndroidAccessoryClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/AndroidAccessoryClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/AndroidAccessoryClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.android#definitions_only" caption="LUFA USB Class Driver - Android Accessory (Definitions Only)"> +				<info type="description" value="summary"> +					Common definitions only (no implementations) of the Android Open Accessory USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassAOA"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/AndroidAccessoryClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/AndroidAccessoryClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/AndroidAccessoryClassHost.h"/> +			</module> +		</select-by-config> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_audio.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_audio.xml new file mode 100644 index 0000000000..d93925dab1 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_audio.xml @@ -0,0 +1,109 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<select-by-config id="lufa.drivers.usb.class.audio" name="lufa.drivers.usb.class.audio.mode" default="host_device" caption="LUFA USB Class Driver - Audio 1.0"> +			<build type="doxygen-entry-point" value="Group_USBClassAudio"/> + +			<info type="gui-flag" value="hidden"/> + +			<module type="service" id="lufa.drivers.usb.class.audio#host_device" caption="LUFA USB Class Driver - Audio 1.0 (Host/Device)"> +				<info type="description" value="summary"> +					Common definitions and Host/Device mode implementations of the Audio 1.0 USB class. +				</info> + +				<info type="gui-flag" value="hidden"/> + +				<build type="doxygen-entry-point" value="Group_USBClassAudio"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/AudioClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/AudioClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/AudioClassDevice.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Device/AudioClassDevice.c"/> +				<build type="header-file" value="Drivers/USB/Class/Host/AudioClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/AudioClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.audio#host" caption="LUFA USB Class Driver - Audio 1.0 (Host)"> +				<info type="description" value="summary"> +					Common definitions and Host mode implementation of the Audio 1.0 USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassAudio"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/AudioClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/AudioClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/AudioClassDevice.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/AudioClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/AudioClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.audio#device" caption="LUFA USB Class Driver - Audio 1.0 (Device)"> +				<info type="description" value="summary"> +					Common definitions and Device mode implementation of the Audio 1.0 USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassAudio"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/AudioClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/AudioClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/AudioClassDevice.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Device/AudioClassDevice.c"/> +				<build type="header-file" value="Drivers/USB/Class/Host/AudioClassHost.h"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.audio#definitions_only" caption="LUFA USB Class Driver - Audio 1.0 (Definitions Only)"> +				<info type="description" value="summary"> +					Common definitions only (no implementations) of the Audio 1.0 USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassAudio"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/AudioClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/AudioClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/AudioClassDevice.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/AudioClassHost.h"/> +			</module> +		</select-by-config> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_cdc.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_cdc.xml new file mode 100644 index 0000000000..6c4f678d3e --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_cdc.xml @@ -0,0 +1,99 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<select-by-config id="lufa.drivers.usb.class.cdc" name="lufa.drivers.usb.class.cdc.mode" default="host_device" caption="LUFA USB Class Driver - CDC"> +			<build type="doxygen-entry-point" value="Group_USBClassCDC"/> + +			<info type="gui-flag" value="hidden"/> + +			<module type="service" id="lufa.drivers.usb.class.cdc#host_device" caption="LUFA USB Class Driver - CDC (Host/Device)"> +				<info type="description" value="summary"> +					Common definitions and Host/Device mode implementations of the CDC USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassCDC"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/CDCClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/CDCClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/CDCClassDevice.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Device/CDCClassDevice.c"/> +				<build type="header-file" value="Drivers/USB/Class/Host/CDCClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/CDCClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.cdc#host" caption="LUFA USB Class Driver - CDC (Host)"> +				<info type="description" value="summary"> +					Common definitions and Host mode implementation of the CDC USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassCDC"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/CDCClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/CDCClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/CDCClassDevice.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/CDCClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/CDCClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.cdc#device" caption="LUFA USB Class Driver - CDC (Device)"> +				<info type="description" value="summary"> +					Common definitions and Device mode implementation of the CDC USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassCDC"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/CDCClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/CDCClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/CDCClassDevice.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Device/CDCClassDevice.c"/> +				<build type="header-file" value="Drivers/USB/Class/Host/CDCClassHost.h"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.cdc#definitions_only" caption="LUFA USB Class Driver - CDC (Definitions Only)"> +				<info type="description" value="summary"> +					Common definitions only (no implementations) of the CDC USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassCDC"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/CDCClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/CDCClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/CDCClassDevice.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/CDCClassHost.h"/> +			</module> +		</select-by-config> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_hid.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_hid.xml new file mode 100644 index 0000000000..d9e70a97c4 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_hid.xml @@ -0,0 +1,99 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<select-by-config id="lufa.drivers.usb.class.hid" name="lufa.drivers.usb.class.hid.mode" default="host_device" caption="LUFA USB Class Driver - HID"> +			<build type="doxygen-entry-point" value="Group_USBClassHID"/> + +			<info type="gui-flag" value="hidden"/> + +			<module type="service" id="lufa.drivers.usb.class.hid#host_device" caption="LUFA USB Class Driver - HID (Host/Device)"> +				<info type="description" value="summary"> +					Common definitions and Host/Device mode implementations of the HID USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassHID"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/HIDClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/HIDClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/HIDClassDevice.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Device/HIDClassDevice.c"/> +				<build type="header-file" value="Drivers/USB/Class/Host/HIDClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/HIDClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.hid#host" caption="LUFA USB Class Driver - HID (Host)"> +				<info type="description" value="summary"> +					Common definitions and Host mode implementation of the HID USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassHID"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/HIDClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/HIDClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/HIDClassDevice.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/HIDClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/HIDClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.hid#device" caption="LUFA USB Class Driver - HID (Device)"> +				<info type="description" value="summary"> +					Common definitions and Device mode implementation of the HID USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassHID"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/HIDClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/HIDClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/HIDClassDevice.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Device/HIDClassDevice.c"/> +				<build type="header-file" value="Drivers/USB/Class/Host/HIDClassHost.h"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.hid#definitions_only" caption="LUFA USB Class Driver - HID (Definitions Only)"> +				<info type="description" value="summary"> +					Common definitions only (no implementations) of the HID USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassHID"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/HIDClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/HIDClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/HIDClassDevice.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/HIDClassHost.h"/> +			</module> +		</select-by-config> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_midi.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_midi.xml new file mode 100644 index 0000000000..c127ae2cea --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_midi.xml @@ -0,0 +1,99 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<select-by-config id="lufa.drivers.usb.class.midi" name="lufa.drivers.usb.class.midi.mode" default="host_device" caption="LUFA USB Class Driver - MIDI"> +			<build type="doxygen-entry-point" value="Group_USBClassMIDI"/> + +			<info type="gui-flag" value="hidden"/> + +			<module type="service" id="lufa.drivers.usb.class.midi#host_device" caption="LUFA USB Class Driver - MIDI (Host/Device)"> +				<info type="description" value="summary"> +					Common definitions and Host/Device mode implementations of the MIDI USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassMIDI"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/MIDIClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/MIDIClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/MIDIClassDevice.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Device/MIDIClassDevice.c"/> +				<build type="header-file" value="Drivers/USB/Class/Host/MIDIClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/MIDIClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.midi#host" caption="LUFA USB Class Driver - MIDI (Host)"> +				<info type="description" value="summary"> +					Common definitions and Host mode implementation of the MIDI USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassMIDI"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/MIDIClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/MIDIClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/MIDIClassDevice.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/MIDIClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/MIDIClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.midi#device" caption="LUFA USB Class Driver - MIDI (Device)"> +				<info type="description" value="summary"> +					Common definitions and Device mode implementation of the MIDI USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassMIDI"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/MIDIClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/MIDIClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/MIDIClassDevice.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Device/MIDIClassDevice.c"/> +				<build type="header-file" value="Drivers/USB/Class/Host/MIDIClassHost.h"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.midi#definitions_only" caption="LUFA USB Class Driver - MIDI (Definitions Only)"> +				<info type="description" value="summary"> +					Common definitions only (no implementations) of the MIDI USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassMIDI"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/MIDIClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/MIDIClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/MIDIClassDevice.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/MIDIClassHost.h"/> +			</module> +		</select-by-config> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_ms.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_ms.xml new file mode 100644 index 0000000000..1be340310d --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_ms.xml @@ -0,0 +1,99 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<select-by-config id="lufa.drivers.usb.class.ms" name="lufa.drivers.usb.class.ms.mode" default="host_device" caption="LUFA USB Class Driver - Mass Storage"> +			<build type="doxygen-entry-point" value="Group_USBClassMS"/> + +			<info type="gui-flag" value="hidden"/> + +			<module type="service" id="lufa.drivers.usb.class.ms#host_device" caption="LUFA USB Class Driver - Mass Storage (Host/Device)"> +				<info type="description" value="summary"> +					Common definitions and Host/Device mode implementations of the Mass Storage USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassMS"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/MassStorageClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/MassStorageClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/MassStorageClassDevice.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Device/MassStorageClassDevice.c"/> +				<build type="header-file" value="Drivers/USB/Class/Host/MassStorageClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/MassStorageClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.ms#host" caption="LUFA USB Class Driver - Mass Storage (Host)"> +				<info type="description" value="summary"> +					Common definitions and Host mode implementation of the Mass Storage USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassMS"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/MassStorageClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/MassStorageClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/MassStorageClassDevice.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/MassStorageClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/MassStorageClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.ms#device" caption="LUFA USB Class Driver - Mass Storage (Device)"> +				<info type="description" value="summary"> +					Common definitions and Device mode implementation of the Mass Storage USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassMS"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/MassStorageClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/MassStorageClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/MassStorageClassDevice.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Device/MassStorageClassDevice.c"/> +				<build type="header-file" value="Drivers/USB/Class/Host/MassStorageClassHost.h"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.ms#definitions_only" caption="LUFA USB Class Driver - Mass Storage (Definitions Only)"> +				<info type="description" value="summary"> +					Common definitions only (no implementations) of the Mass Storage USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassMS"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/MassStorageClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/MassStorageClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/MassStorageClassDevice.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/MassStorageClassHost.h"/> +			</module> +		</select-by-config> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_printer.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_printer.xml new file mode 100644 index 0000000000..3b1fbe60ad --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_printer.xml @@ -0,0 +1,99 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<select-by-config id="lufa.drivers.usb.class.printer" name="lufa.drivers.usb.class.printer.mode" default="host_device" caption="LUFA USB Class Driver - Printer"> +			<build type="doxygen-entry-point" value="Group_USBClassPrinter"/> + +			<info type="gui-flag" value="hidden"/> + +			<module type="service" id="lufa.drivers.usb.class.printer#host_device" caption="LUFA USB Class Driver - Printer (Host/Device)"> +				<info type="description" value="summary"> +					Common definitions and Host/Device mode implementations of the Printer USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassPrinter"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/PrinterClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/PrinterClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/PrinterClassDevice.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Device/PrinterClassDevice.c"/> +				<build type="header-file" value="Drivers/USB/Class/Host/PrinterClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/PrinterClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.printer#host" caption="LUFA USB Class Driver - Printer (Host)"> +				<info type="description" value="summary"> +					Common definitions and Host mode implementation of the Printer USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassPrinter"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/PrinterClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/PrinterClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/PrinterClassDevice.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/PrinterClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/PrinterClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.printer#device" caption="LUFA USB Class Driver - Printer (Device)"> +				<info type="description" value="summary"> +					Common definitions and Device mode implementation of the Printer USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassPrinter"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/PrinterClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/PrinterClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/PrinterClassDevice.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Device/PrinterClassDevice.c"/> +				<build type="header-file" value="Drivers/USB/Class/Host/PrinterClassHost.h"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.printer#definitions_only" caption="LUFA USB Class Driver - Printer (Definitions Only)"> +				<info type="description" value="summary"> +					Common definitions only (no implementations) of the Printer USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassPrinter"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/PrinterClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/PrinterClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/PrinterClassDevice.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/PrinterClassHost.h"/> +			</module> +		</select-by-config> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_rndis.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_rndis.xml new file mode 100644 index 0000000000..09e86fbf0e --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_rndis.xml @@ -0,0 +1,99 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<select-by-config id="lufa.drivers.usb.class.rndis" name="lufa.drivers.usb.class.rndis.mode" default="host_device" caption="LUFA USB Class Driver - RNDIS Ethernet"> +			<build type="doxygen-entry-point" value="Group_USBClassRNDIS"/> + +			<info type="gui-flag" value="hidden"/> + +			<module type="service" id="lufa.drivers.usb.class.rndis#host_device" caption="LUFA USB Class Driver - RNDIS Ethernet (Host/Device)"> +				<info type="description" value="summary"> +					Common definitions and Host/Device mode implementations of the RNDIS Ethernet USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassRNDIS"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/RNDISClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/RNDISClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/RNDISClassDevice.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Device/RNDISClassDevice.c"/> +				<build type="header-file" value="Drivers/USB/Class/Host/RNDISClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/RNDISClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.rndis#host" caption="LUFA USB Class Driver - RNDIS Ethernet (Host)"> +				<info type="description" value="summary"> +					Common definitions and Host mode implementation of the RNDIS Ethernet USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassRNDIS"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/RNDISClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/RNDISClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/RNDISClassDevice.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/RNDISClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/RNDISClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.rndis#device" caption="LUFA USB Class Driver - RNDIS Ethernet (Device)"> +				<info type="description" value="summary"> +					Common definitions and Device mode implementation of the RNDIS Ethernet USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassRNDIS"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/RNDISClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/RNDISClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/RNDISClassDevice.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Device/RNDISClassDevice.c"/> +				<build type="header-file" value="Drivers/USB/Class/Host/RNDISClassHost.h"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.rndis#definitions_only" caption="LUFA USB Class Driver - RNDIS Ethernet (Definitions Only)"> +				<info type="description" value="summary"> +					Common definitions only (no implementations) of the RNDIS Ethernet USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassRNDIS"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/RNDISClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/RNDISClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Device/RNDISClassDevice.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/RNDISClassHost.h"/> +			</module> +		</select-by-config> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_si.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_si.xml new file mode 100644 index 0000000000..eb0786ceae --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_class_si.xml @@ -0,0 +1,56 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<select-by-config id="lufa.drivers.usb.class.si" name="lufa.drivers.usb.class.si.mode" default="host" caption="LUFA USB Class Driver - Still Image"> +			<build type="doxygen-entry-point" value="Group_USBClassSI"/> + +			<info type="gui-flag" value="hidden"/> + +			<module type="service" id="lufa.drivers.usb.class.si#host" caption="LUFA USB Class Driver - Still Image (Host)"> +				<info type="description" value="summary"> +					Common definitions and Host mode implementation of the Still Image USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassSI"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/StillImageClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/StillImageClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/StillImageClassHost.h"/> +				<build type="c-source"    value="Drivers/USB/Class/Host/StillImageClassHost.c"/> +			</module> + +			<module type="service" id="lufa.drivers.usb.class.si#definitions_only" caption="LUFA USB Class Driver - Still Image (Definitions Only)"> +				<info type="description" value="summary"> +					Common definitions only (no implementations) of the Still Image USB class. +				</info> + +				<build type="doxygen-entry-point" value="Group_USBClassSI"/> + +				<info type="gui-flag" value="hidden"/> + +				<device-support-alias value="lufa_avr8"/> +				<device-support-alias value="lufa_xmega"/> +				<device-support-alias value="lufa_uc3"/> + +				<build type="header-file" value="Drivers/USB/Class/StillImageClass.h"/> +				<build type="header-file" value="Drivers/USB/Class/Common/StillImageClassCommon.h"/> +				<build type="header-file" value="Drivers/USB/Class/Host/StillImageClassHost.h"/> +			</module> +		</select-by-config> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_core.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_core.xml new file mode 100644 index 0000000000..bfcd0f1e8d --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_core.xml @@ -0,0 +1,85 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<module type="driver" id="lufa.drivers.usb.core.common" caption="LUFA USB Core Driver - Common"> +			<device-support-alias value="lufa_avr8"/> +			<device-support-alias value="lufa_xmega"/> +			<device-support-alias value="lufa_uc3"/> + +			<build type="doxygen-entry-point" value="Group_USBManagement"/> + +			<info type="gui-flag" value="hidden"/> + +			<build type="header-file" value="Drivers/USB/Core/Device.h"/> +			<build type="header-file" value="Drivers/USB/Core/Endpoint.h"/> +			<build type="header-file" value="Drivers/USB/Core/Host.h"/> +			<build type="header-file" value="Drivers/USB/Core/Pipe.h"/> +			<build type="header-file" value="Drivers/USB/Core/OTG.h"/> +			<build type="header-file" value="Drivers/USB/Core/USBController.h"/> +			<build type="header-file" value="Drivers/USB/Core/USBInterrupt.h"/> +			<build type="header-file" value="Drivers/USB/Core/EndpointStream.h"/> +			<build type="header-file" value="Drivers/USB/Core/PipeStream.h"/> +	        <build type="c-source"    value="Drivers/USB/Core/ConfigDescriptors.c"/> +			<build type="header-file" value="Drivers/USB/Core/ConfigDescriptors.h"/> +	        <build type="c-source"    value="Drivers/USB/Core/DeviceStandardReq.c"/> +			<build type="header-file" value="Drivers/USB/Core/DeviceStandardReq.h"/> +	        <build type="c-source"    value="Drivers/USB/Core/Events.c"/> +			<build type="header-file" value="Drivers/USB/Core/Events.h"/> +	        <build type="c-source"    value="Drivers/USB/Core/HostStandardReq.c"/> +			<build type="header-file" value="Drivers/USB/Core/HostStandardReq.h"/> +	        <build type="c-source"    value="Drivers/USB/Core/USBTask.c"/> +			<build type="header-file" value="Drivers/USB/Core/USBTask.h"/> +			<build type="header-file" value="Drivers/USB/Core/USBMode.h"/> +			<build type="header-file" value="Drivers/USB/Core/StdDescriptors.h"/> +			<build type="header-file" value="Drivers/USB/Core/StdRequestType.h"/> + +	        <build type="c-source"    value="Drivers/USB/Class/Common/HIDParser.c"/> +	        <build type="header-file" value="Drivers/USB/Class/Common/HIDParser.h"/> +	        <build type="header-file" value="Drivers/USB/Class/Common/HIDReportData.h"/> +	    </module> + +		<select-by-device id="lufa.drivers.usb.core" caption="LUFA USB Core Driver"> +			<module type="driver" id="lufa.drivers.usb.core#avr8" caption="LUFA USB Core Driver - AVR8"> +				<device-support-alias value="lufa_avr8"/> + +				<info type="gui-flag" value="hidden"/> + +				<build type="doxygen-entry-point" value="Group_USBManagement_AVR8"/> + +				<require idref="lufa.drivers.usb.core.common"/> +				<require idref="lufa.drivers.usb.core.avr8"/> +			</module> + +			<module type="driver" id="lufa.drivers.usb.core#xmega" caption="LUFA USB Core Driver - XMEGA"> +				<device-support-alias value="lufa_xmega"/> + +				<info type="gui-flag" value="hidden"/> + +				<build type="doxygen-entry-point" value="Group_USBManagement_XMEGA"/> + +				<require idref="lufa.drivers.usb.core.common"/> +				<require idref="lufa.drivers.usb.core.xmega"/> +			</module> + +			<module type="driver" id="lufa.drivers.usb.core#uc3" caption="LUFA USB Core Driver - UC3"> +				<device-support-alias value="lufa_uc3"/> + +				<info type="gui-flag" value="hidden"/> + +				<build type="doxygen-entry-point" value="Group_USBManagement_UC3"/> + +				<require idref="lufa.drivers.usb.core.common"/> +				<require idref="lufa.drivers.usb.core.uc3"/> +			</module> +		</select-by-device> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml new file mode 100644 index 0000000000..51493b460a --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_core_avr8.xml @@ -0,0 +1,43 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<module type="driver" id="lufa.drivers.usb.core.avr8" caption="LUFA USB Core Driver for AVR8"> +			<device-support-alias value="lufa_avr8"/> + +			<info type="gui-flag" value="hidden"/> + +			<build type="doxygen-entry-point" value="Group_USBManagement_AVR8"/> + +			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_R.c"/> +			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Endpoint_Control_W.c"/> +			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Endpoint_RW.c"/> +			<build type="c-source"    value="Drivers/USB/Core/AVR8/Template/Template_Pipe_RW.c"/> +			<build type="c-source"    value="Drivers/USB/Core/AVR8/Device_AVR8.c"/> +			<build type="header-file" value="Drivers/USB/Core/AVR8/Device_AVR8.h"/> +			<build type="c-source"    value="Drivers/USB/Core/AVR8/Endpoint_AVR8.c"/> +			<build type="header-file" value="Drivers/USB/Core/AVR8/Endpoint_AVR8.h"/> +			<build type="c-source"    value="Drivers/USB/Core/AVR8/Host_AVR8.c"/> +			<build type="header-file" value="Drivers/USB/Core/AVR8/Host_AVR8.h"/> +			<build type="c-source"    value="Drivers/USB/Core/AVR8/Pipe_AVR8.c"/> +			<build type="header-file" value="Drivers/USB/Core/AVR8/Pipe_AVR8.h"/> +			<build type="header-file" value="Drivers/USB/Core/AVR8/OTG_AVR8.h"/> +			<build type="c-source"    value="Drivers/USB/Core/AVR8/USBController_AVR8.c"/> +			<build type="header-file" value="Drivers/USB/Core/AVR8/USBController_AVR8.h"/> +			<build type="c-source"    value="Drivers/USB/Core/AVR8/USBInterrupt_AVR8.c"/> +			<build type="header-file" value="Drivers/USB/Core/AVR8/USBInterrupt_AVR8.h"/> +			<build type="c-source"    value="Drivers/USB/Core/AVR8/EndpointStream_AVR8.c"/> +			<build type="header-file" value="Drivers/USB/Core/AVR8/EndpointStream_AVR8.h"/> +			<build type="c-source"    value="Drivers/USB/Core/AVR8/PipeStream_AVR8.c"/> +			<build type="header-file" value="Drivers/USB/Core/AVR8/PipeStream_AVR8.h"/> +		</module> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml new file mode 100644 index 0000000000..055ebde23f --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_core_uc3.xml @@ -0,0 +1,42 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<module type="driver" id="lufa.drivers.usb.core.uc3" caption="LUFA USB Core Driver for UC3"> +			<device-support-alias value="lufa_uc3"/> + +			<info type="gui-flag" value="hidden"/> + +			<build type="doxygen-entry-point" value="Group_USBManagement_UC3"/> + +			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_R.c"/> +			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Endpoint_Control_W.c"/> +			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Endpoint_RW.c"/> +			<build type="c-source"    value="Drivers/USB/Core/UC3/Template/Template_Pipe_RW.c"/> +			<build type="c-source"    value="Drivers/USB/Core/UC3/Device_UC3.c"/> +			<build type="header-file" value="Drivers/USB/Core/UC3/Device_UC3.h"/> +			<build type="c-source"    value="Drivers/USB/Core/UC3/Endpoint_UC3.c"/> +			<build type="header-file" value="Drivers/USB/Core/UC3/Endpoint_UC3.h"/> +			<build type="c-source"    value="Drivers/USB/Core/UC3/Host_UC3.c"/> +			<build type="header-file" value="Drivers/USB/Core/UC3/Host_UC3.h"/> +			<build type="c-source"    value="Drivers/USB/Core/UC3/Pipe_UC3.c"/> +			<build type="header-file" value="Drivers/USB/Core/UC3/Pipe_UC3.h"/> +			<build type="c-source"    value="Drivers/USB/Core/UC3/USBController_UC3.c"/> +			<build type="header-file" value="Drivers/USB/Core/UC3/USBController_UC3.h"/> +			<build type="c-source"    value="Drivers/USB/Core/UC3/USBInterrupt_UC3.c"/> +			<build type="header-file" value="Drivers/USB/Core/UC3/USBInterrupt_UC3.h"/> +			<build type="c-source"    value="Drivers/USB/Core/UC3/EndpointStream_UC3.c"/> +			<build type="header-file" value="Drivers/USB/Core/UC3/EndpointStream_UC3.h"/> +			<build type="c-source"    value="Drivers/USB/Core/UC3/PipeStream_UC3.c"/> +			<build type="header-file" value="Drivers/USB/Core/UC3/PipeStream_UC3.h"/> +		</module> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml new file mode 100644 index 0000000000..085fe85e82 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_drivers_usb_core_xmega.xml @@ -0,0 +1,36 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<module type="driver" id="lufa.drivers.usb.core.xmega" caption="LUFA USB Core Driver for XMEGA"> +			<device-support-alias value="lufa_xmega"/> + +			<info type="gui-flag" value="hidden"/> + +			<build type="doxygen-entry-point" value="Group_USBManagement_XMEGA"/> + +			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_R.c"/> +			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Template/Template_Endpoint_Control_W.c"/> +			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Template/Template_Endpoint_RW.c"/> +			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Device_XMEGA.c"/> +			<build type="header-file" value="Drivers/USB/Core/XMEGA/Device_XMEGA.h"/> +			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Endpoint_XMEGA.c"/> +			<build type="header-file" value="Drivers/USB/Core/XMEGA/Endpoint_XMEGA.h"/> +			<build type="c-source"    value="Drivers/USB/Core/XMEGA/Pipe_XMEGA.c"/> +			<build type="c-source"    value="Drivers/USB/Core/XMEGA/USBController_XMEGA.c"/> +			<build type="header-file" value="Drivers/USB/Core/XMEGA/USBController_XMEGA.h"/> +			<build type="c-source"    value="Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.c"/> +			<build type="header-file" value="Drivers/USB/Core/XMEGA/USBInterrupt_XMEGA.h"/> +			<build type="c-source"    value="Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.c"/> +			<build type="header-file" value="Drivers/USB/Core/XMEGA/EndpointStream_XMEGA.h"/> +		</module> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_platform.xml b/lib/lufa/LUFA/StudioIntegration/lufa_platform.xml new file mode 100644 index 0000000000..d33f435c6a --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_platform.xml @@ -0,0 +1,60 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<select-by-device id="lufa.platform" caption="LUFA Platform Specific Support"> +			<module type="service" id="lufa.platform#avr8" caption="LUFA Platform Specific Support - AVR8"> +				<device-support-alias value="lufa_avr8"/> + +				<build type="define" name="ARCH" value="ARCH_AVR8"/> + +				<build type="doxygen-entry-point" value="Group_PlatformDrivers"/> + +				<build type="include-path" value=".."/> +				<build type="header-file" subtype="api" value="Platform/Platform.h"/> + +				<require idref="lufa.common"/> +			</module> + +			<module type="service" id="lufa.platform#xmega" caption="LUFA Platform Specific Support - XMEGA"> +				<device-support-alias value="lufa_xmega"/> + +				<build type="define" name="ARCH" value="ARCH_XMEGA"/> + +				<build type="doxygen-entry-point" value="Group_PlatformDrivers"/> + +				<build type="include-path" value=".."/> +				<build type="header-file" subtype="api" value="Platform/Platform.h"/> + +				<build type="distribute" value="Platform/XMEGA/XMEGAExperimentalInfo.txt" subtype="license"/> + +				<require idref="lufa.platform.xmega"/> +				<require idref="lufa.common"/> +			</module> + +			<module type="service" id="lufa.platform#uc3" caption="LUFA Platform Specific Support - UC3"> +				<device-support-alias value="lufa_uc3"/> + +				<build type="define" name="ARCH" value="ARCH_UC3"/> + +				<build type="doxygen-entry-point" value="Group_PlatformDrivers"/> + +				<build type="include-path" value=".."/> +				<build type="header-file" subtype="api" value="Platform/Platform.h"/> + +				<build type="distribute" value="Platform/UC3/UC3ExperimentalInfo.txt" subtype="license"/> + +				<require idref="lufa.platform.uc3"/> +				<require idref="lufa.common"/> +			</module> +		</select-by-device> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_platform_uc3.xml b/lib/lufa/LUFA/StudioIntegration/lufa_platform_uc3.xml new file mode 100644 index 0000000000..3e875699ae --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_platform_uc3.xml @@ -0,0 +1,26 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<module type="driver" id="lufa.platform.uc3" caption="LUFA UC3 Platform Drivers"> +			<device-support-alias value="lufa_uc3"/> + +			<info type="gui-flag" value="hidden"/> + +			<build type="doxygen-entry-point" value="Group_PlatformDrivers_UC3"/> + +			<build type="header-file" value="Platform/UC3/ClockManagement.h"/> +			<build type="header-file" value="Platform/UC3/InterruptManagement.h"/> +			<build type="c-source" value="Platform/UC3/InterruptManagement.c"/> +			<build type="asm-source" value="Platform/UC3/Exception.S"/> +		</module> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_platform_xmega.xml b/lib/lufa/LUFA/StudioIntegration/lufa_platform_xmega.xml new file mode 100644 index 0000000000..2704bcf005 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_platform_xmega.xml @@ -0,0 +1,23 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf xmlversion="1.0"> +		<module type="driver" id="lufa.platform.xmega" caption="LUFA XMEGA Platform Drivers"> +			<device-support-alias value="lufa_xmega"/> + +			<info type="gui-flag" value="hidden"/> + +			<build type="doxygen-entry-point" value="Group_PlatformDrivers_XMEGA"/> + +			<build type="header-file" value="Platform/XMEGA/ClockManagement.h"/> +		</module> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/lufa_toolchain.xml b/lib/lufa/LUFA/StudioIntegration/lufa_toolchain.xml new file mode 100644 index 0000000000..b1f4062d55 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/lufa_toolchain.xml @@ -0,0 +1,45 @@ +<!-- +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +--> + +<!-- Atmel Studio framework integration file --> + +<lufa> +	<asf> +		<select-by-device id="common.utils.toolchain_config" caption="Toolchain configuration defaults"> +			<module type="build-specific" id="common.utils.toolchain_config#avr" caption="Toolchain configuration defaults for 8-bit AVR"> +				<info type="gui-flag" value="hidden"/> +				<device-support value="avr"/> + +				<toolchain-config name="avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned" value="True" toolchain="avrgcc"/> +				<toolchain-config name="avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned" value="True" toolchain="avrgcc"/> +				<toolchain-config name="avrgcc.compiler.optimization.OtherFlags" value="-fdata-sections" toolchain="avrgcc"/> +				<toolchain-config name="avrgcc.compiler.optimization.PrepareFunctionsForGarbageCollection" value="True" toolchain="avrgcc"/> +				<toolchain-config name="avrgcc.compiler.warnings.AllWarnings" value="True" toolchain="avrgcc"/> +				<toolchain-config name="avrgcc.compiler.miscellaneous.OtherFlags" value="-mrelax -std=gnu99 -fno-strict-aliasing -fno-jump-tables" toolchain="avrgcc"/> +				<toolchain-config name="avrgcc.linker.optimization.GarbageCollectUnusedSections" value="True" toolchain="avrgcc"/> +				<toolchain-config name="avrgcc.linker.optimization.RelaxBranches" value="True" toolchain="avrgcc"/> +				<toolchain-config name="avrgcc.linker.miscellaneous.LinkerFlags" value="-Wl,--relax" toolchain="avrgcc"/> +			</module> +		</select-by-device> + +		<module type="build-specific" id="common.utils.toolchain_config#uc3" caption="Toolchain configuration defaults for 32-bit AVR"> +			<info type="gui-flag" value="hidden"/> +			<device-support value="uc3"/> + +			<toolchain-config name="avrgcc.compiler.general.ChangeDefaultBitFieldUnsigned" value="True" toolchain="avr32gcc"/> +			<toolchain-config name="avrgcc.compiler.general.ChangeDefaultCharTypeUnsigned" value="True" toolchain="avr32gcc"/> +			<toolchain-config name="avr32gcc.compiler.optimization.OtherFlags" value="-fdata-sections" toolchain="avr32gcc"/> +			<toolchain-config name="avr32gcc.compiler.optimization.PrepareFunctionsForGarbageCollection" value="True" toolchain="avr32gcc"/> +			<toolchain-config name="avr32gcc.compiler.warnings.AllWarnings" value="True" toolchain="avr32gcc"/> +			<toolchain-config name="avr32gcc.compiler.miscellaneous.OtherFlags" value="-mrelax -std=gnu99 -fno-strict-aliasing -mno-cond-exec-before-reload" toolchain="avr32gcc"/> +			<toolchain-config name="avr32gcc.linker.optimization.GarbageCollectUnusedSections" value="True" toolchain="avr32gcc"/> +			<toolchain-config name="avr32gcc.linker.optimization.RelaxBranches" value="True" toolchain="avr32gcc"/> +			<toolchain-config name="avr32gcc.linker.miscellaneous.LinkerFlags" value="-Wl,--relax" toolchain="avr32gcc"/> +		</module> +	</asf> +</lufa> diff --git a/lib/lufa/LUFA/StudioIntegration/makefile b/lib/lufa/LUFA/StudioIntegration/makefile new file mode 100644 index 0000000000..30483e9cb5 --- /dev/null +++ b/lib/lufa/LUFA/StudioIntegration/makefile @@ -0,0 +1,142 @@ +# +#             LUFA Library +#     Copyright (C) Dean Camera, 2017. +# +#  dean [at] fourwalledcubicle [dot] com +#           www.lufa-lib.org +# +# --------------------------------------- +#  Makefile for the LUFA Atmel Studio Integration. +# --------------------------------------- + +LUFA_ROOT            := .. +LUFA_VERSION_NUM     := $(shell grep -e "\#define *LUFA_VERSION_STRING " $(LUFA_ROOT)/Version.h | cut -d'"' -f2) +LUFA_VERSION_TYPE    := $(shell grep -e "\#define *LUFA_VERSION_RELEASE_TYPE " $(LUFA_ROOT)/Version.h) + +ifneq ($(findstring LUFA_VERSION_RELEASE_TYPE_DEVELOPMENT, $(LUFA_VERSION_TYPE)),LUFA_VERSION_RELEASE_TYPE_DEVELOPMENT) +  EXT_VERSION_NUM    := $(shell date +"%y.%m.%d").$(LUFA_VERSION_NUM) +  EXT_VSIX_NAME      := LUFA-RELEASE-$(LUFA_VERSION_NUM).vsix +else +  EXT_VERSION_NUM    := 0.$(shell date +"%y%m%d.%H%M%S") +  EXT_VSIX_NAME      := LUFA-TESTING-$(shell date +"%y.%m.%d-%H.%M.%S").vsix + +  $(warning Development mode set - assuming a test version should be created.) +endif + +DOXYGEN_TAG_FILE_XML := $(LUFA_ROOT)/Documentation/lufa_doc_tags.xml +DOXYGEN_COMBINED_XML := $(LUFA_ROOT)/Documentation/xml/lufa_doc.xml +TEMP_MANIFEST_XML    := manifest.xml +EXTENSION_OUTPUT_XML := $(LUFA_ROOT)/../extension.xml +MODULE_OUTPUT_XML    := $(LUFA_ROOT)/asf.xml +MSHELP_OUTPUT_XML    := $(LUFA_ROOT)/../lufa_help_$(subst .,_,$(EXT_VERSION_NUM)).mshc +XML_FILES            := $(filter-out $(TEMP_MANIFEST_FILE), $(shell ls *.xml)) +VSIX_ASSETS          := $(LUFA_ROOT)/DoxygenPages/Images/LUFA_thumb.png     \ +                        $(LUFA_ROOT)/DoxygenPages/Images/LUFA.png           \ +                        $(LUFA_ROOT)/License.txt                            \ +                        VSIX/"[Content_Types].xml"                          \ +                        VSIX/LUFA.dll                                       \ +                        VSIX/LUFA.pkgdef +VSIX_GEN_PARAMS     := --stringparam extension-version "$(EXT_VERSION_NUM)" \ +                       --stringparam lufa-version "$(LUFA_VERSION_NUM)"     \ +                       --stringparam help-package-filename "$(notdir $(MSHELP_OUTPUT_XML))" +MSHELP_GEN_PARAMS   := --stringparam generate.toc "book toc"                \ +                       --stringparam chunk.quietly "1"                      \ +                       --stringparam chunk.section.depth "3"                \ +                       --stringparam chunk.first.sections "1"               \ +                       --stringparam chapter.autolabel "0"                  \ +                       --stringparam root.filename "LUFA"                   \ +                       --stringparam html.stylesheet "lufa_studio_help_styling.css" + +all: clear_project_dirs generate_xml check_filenames generate_vsix + +clear_project_dirs: +	@make -s -C $(LUFA_ROOT)/.. clean + +clean: +	@rm -f $(TEMP_MANIFEST_XML) $(MODULE_OUTPUT_XML) $(EXTENSION_OUTPUT_XML) $(DOXYGEN_TAG_FILE_XML) $(DOXYGEN_COMBINED_XML) $(MSHELP_OUTPUT_XML) +	@rm -rf mshelp +	@cd $(LUFA_ROOT)/.. && rm -f contents.zip exampleProjects.xml content.xml.cache extension.vsixmanifest asf-manifest.xml extension.xml helpcontentsetup.msha $(notdir $(VSIX_ASSETS)) *.vsix *.mshc + +$(DOXYGEN_TAG_FILE_XML): +	@make -C ../ doxygen DOXYGEN_OVERRIDE_PARAMS="GENERATE_TAGFILE=Documentation/lufa_doc_tags.xml GENERATE_HTML=no GENERATE_XML=yes" + +$(DOXYGEN_COMBINED_XML): $(DOXYGEN_TAG_FILE_XML) +	@xsltproc $(dir $@)/combine.xslt $(dir $@)/index.xml > $(DOXYGEN_COMBINED_XML) + +$(TEMP_MANIFEST_XML): $(DOXYGEN_TAG_FILE_XML) $(DOXYGEN_COMBINED_XML) +	@echo Generating temporary module manifest XML... + +	@printf "<lufa-manifest version=\"%s\" tagfile=\"%s\" docfile=\"%s\">\n" $(LUFA_VERSION_NUM) $(DOXYGEN_TAG_FILE_XML) $(DOXYGEN_COMBINED_XML) > $@ +	@for i in $(XML_FILES); do \ +		printf "\t<xml-source filename=\"%s\"/>\n" $$i >> $@; \ +	done; +	@echo '</lufa-manifest>' >> $@ + +$(MODULE_OUTPUT_XML): $(TEMP_MANIFEST_XML) +	@echo Generating library core XDK module manifest file... +	@xsltproc XDK/lufa_module_transform.xslt $< | xsltproc XDK/lufa_indent_transform.xslt - > $(MODULE_OUTPUT_XML) + +$(EXTENSION_OUTPUT_XML): $(TEMP_MANIFEST_XML) +	@echo Generating library XDK extension manifest file... +	@xsltproc XDK/lufa_extension_transform.xslt $< | xsltproc XDK/lufa_indent_transform.xslt - > $(EXTENSION_OUTPUT_XML) + +$(MSHELP_OUTPUT_XML): $(DOXYGEN_COMBINED_XML) +	@echo Converting Doxygen XML to DocBook... +	@-mkdir mshelp 2> /dev/null +	@xsltproc HV1/lufa_docbook_transform.xslt $(DOXYGEN_COMBINED_XML) > mshelp/lufa_docbook.xml + +	@echo Converting DocBook XML to Microsoft Help 1.0... +	@cd mshelp && xsltproc $(MSHELP_GEN_PARAMS) ../HV1/lufa_hv1_transform.xslt lufa_docbook.xml + +	@echo Copying help assets... +	@cp HV1/lufa_studio_help_styling.css mshelp +	@-mkdir mshelp/images 2> /dev/null +	@cp `find $(LUFA_ROOT)/DoxygenPages/Images -type f` mshelp/images + +	@echo Archiving help content... +	@cd mshelp && zip ../$(MSHELP_OUTPUT_XML) -q -0  -r *.html *.css images + +	@echo Generating HV1 manifest... +	@xsltproc $(VSIX_GEN_PARAMS) HV1/lufa_helpcontentsetup_transform.xslt HV1/helpcontentsetup.msha > $(LUFA_ROOT)/../helpcontentsetup.msha + +generate_help: $(MSHELP_OUTPUT_XML) + +generate_xml: $(EXTENSION_OUTPUT_XML) $(MODULE_OUTPUT_XML) + +generate_vsix: $(EXTENSION_OUTPUT_XML) $(MODULE_OUTPUT_XML) $(MSHELP_OUTPUT_XML) +	@echo Generating XDK cache files... +	@rm -f $(LUFA_ROOT)/../content.xml.cache +	@rm -f $(LUFA_ROOT)/../ExampleProjects.xml +	@python VSIX/generate_caches.py $(LUFA_ROOT)/../ + +	@echo Archiving XDK content... +	@rm -f contents.zip +	@cd $(LUFA_ROOT)/../ && zip contents.zip -q -0 -r --exclude=*Documentation* --exclude=*StudioIntegration* LUFA Bootloaders Demos Projects README.txt + +	@echo Creating VSIX dependencies... +	@cp $(VSIX_ASSETS) $(LUFA_ROOT)/.. +	@xsltproc $(VSIX_GEN_PARAMS) VSIX/lufa_vsmanifest_transform.xslt VSIX/extension.vsixmanifest > $(LUFA_ROOT)/../extension.vsixmanifest +	@xsltproc $(VSIX_GEN_PARAMS) VSIX/lufa_asfmanifest_transform.xslt VSIX/asf-manifest.xml > $(LUFA_ROOT)/../asf-manifest.xml + +	@echo Generating Atmel Studio VSIX file... +	cd $(LUFA_ROOT)/../ && zip $(EXT_VSIX_NAME) -q -9 contents.zip exampleProjects.xml content.xml.cache extension.vsixmanifest asf-manifest.xml extension.xml helpcontentsetup.msha $(notdir $(MSHELP_OUTPUT_XML)) $(notdir $(VSIX_ASSETS)) + +	@echo "Atmel Studio VSIX extension file generated." + +check_filenames: $(MODULE_OUTPUT_XML) +	@echo Verifying referenced filenames of XDK modules... +	@for f in `find $(LUFA_ROOT)/../ -name "asf.xml"`; do \ +		echo "Checking $$f..."; \ +		asf_file_dir=`dirname $$f`; \ +		xsltproc XDK/lufa_filelist_transform.xslt $$f | sed -e "/^$$/d" | while read -r i; do \ +			if ( ( ! test -f "$$asf_file_dir/$$i" ) && ( ! test -d "$$asf_file_dir/$$i" ) ); then \ +				echo "Source file \"$$i\" referenced in $$f does not exist!"; \ +				exit 1; \ +			fi; \ +		done || exit 1; \ +	done; + +check_database: +	python ProjectGenerator/project_generator.py -b $(LUFA_ROOT)/../ --main-ext-uuid=0e160d5c-e331-48d9-850b-e0387912171b CHECK + +.PHONY: all clean generate_help generate_xml generate_vsix check_filenames check_database diff --git a/lib/lufa/LUFA/Version.h b/lib/lufa/LUFA/Version.h new file mode 100644 index 0000000000..03cb08406a --- /dev/null +++ b/lib/lufa/LUFA/Version.h @@ -0,0 +1,67 @@ +/* +             LUFA Library +     Copyright (C) Dean Camera, 2017. + +  dean [at] fourwalledcubicle [dot] com +           www.lufa-lib.org +*/ + +/* +  Copyright 2017  Dean Camera (dean [at] fourwalledcubicle [dot] com) + +  Permission to use, copy, modify, distribute, and sell this +  software and its documentation for any purpose is hereby granted +  without fee, provided that the above copyright notice appear in +  all copies and that both that the copyright notice and this +  permission notice and warranty disclaimer appear in supporting +  documentation, and that the name of the author not be used in +  advertising or publicity pertaining to distribution of the +  software without specific, written prior permission. + +  The author disclaims all warranties with regard to this +  software, including all implied warranties of merchantability +  and fitness.  In no event shall the author be liable for any +  special, indirect or consequential damages or any damages +  whatsoever resulting from loss of use, data or profits, whether +  in an action of contract, negligence or other tortious action, +  arising out of or in connection with the use or performance of +  this software. +*/ + +/** \file + * + *  \brief LUFA library version constants. + * + *  Version constants for informational purposes and version-specific macro creation. This header file contains the + *  current LUFA version number in several forms, for use in the user-application (for example, for printing out + *  whilst debugging, or for testing for version compatibility). + */ + +#ifndef __LUFA_VERSION_H__ +#define __LUFA_VERSION_H__ + +	/* Public Interface - May be used in end-application: */ +		/* Macros: */ +			/** \name LUFA Release Type Constants */ +			//@{ +				/** Constant for \ref LUFA_VERSION_RELEASE_TYPE indicating a development release. */ +				#define LUFA_VERSION_RELEASE_TYPE_DEVELOPMENT   0 + +				/** Constant for \ref LUFA_VERSION_RELEASE_TYPE indicating a beta release. */ +				#define LUFA_VERSION_RELEASE_TYPE_BETA          1 + +				/** Constant for \ref LUFA_VERSION_RELEASE_TYPE indicating a full official release. */ +				#define LUFA_VERSION_RELEASE_TYPE_FULL          2 +			//@} + +			/** Indicates the version number of the library, as an integer. \note This value is only updates in non-development releases. */ +			#define LUFA_VERSION_INTEGER              0x170418 + +			/** Indicates the version number of the library, as a string. \note This value is only updates in non-development releases. */ +			#define LUFA_VERSION_STRING               "170418" + +			/** Indicates the release type of the library. */ +			#define LUFA_VERSION_RELEASE_TYPE         LUFA_VERSION_RELEASE_TYPE_FULL + +#endif + diff --git a/lib/lufa/LUFA/doxyfile b/lib/lufa/LUFA/doxyfile new file mode 100644 index 0000000000..90b8ca2f76 --- /dev/null +++ b/lib/lufa/LUFA/doxyfile @@ -0,0 +1,2400 @@ +# Doxyfile 1.8.9 + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project. +# +# All text after a double hash (##) is considered a comment and is placed in +# front of the TAG it is preceding. +# +# All text after a single hash (#) is considered a comment and will be ignored. +# The format is: +# TAG = value [value, ...] +# For lists, items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (\" \"). + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all text +# before the first occurrence of this tag. Doxygen uses libiconv (or the iconv +# built into libc) for the transcoding. See http://www.gnu.org/software/libiconv +# for the list of possible encodings. +# The default value is: UTF-8. + +DOXYFILE_ENCODING      = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by +# double-quotes, unless you are using Doxywizard) that should identify the +# project for which the documentation is generated. This name is used in the +# title of most generated pages and in a few other places. +# The default value is: My Project. + +PROJECT_NAME           = "LUFA Library" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. This +# could be handy for archiving the generated documentation or if some version +# control system is used. + +PROJECT_NUMBER         = 000000 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer a +# quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF          = + +# With the PROJECT_LOGO tag one can specify a logo or an icon that is included +# in the documentation. The maximum height of the logo should not exceed 55 +# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy +# the logo to the output directory. + +PROJECT_LOGO           = ./DoxygenPages/Images/LUFA_thumb.png + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path +# into which the generated documentation will be written. If a relative path is +# entered, it will be relative to the location where doxygen was started. If +# left blank the current directory will be used. + +OUTPUT_DIRECTORY       = ./Documentation/ + +# If the CREATE_SUBDIRS tag is set to YES then doxygen will create 4096 sub- +# directories (in 2 levels) under the output directory of each output format and +# will distribute the generated files over these directories. Enabling this +# option can be useful when feeding doxygen a huge amount of source files, where +# putting all generated files in the same directory would otherwise causes +# performance problems for the file system. +# The default value is: NO. + +CREATE_SUBDIRS         = NO + +# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII +# characters to appear in the names of generated files. If set to NO, non-ASCII +# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode +# U+3044. +# The default value is: NO. + +ALLOW_UNICODE_NAMES    = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Catalan, Chinese, +# Chinese-Traditional, Croatian, Czech, Danish, Dutch, English (United States), +# Esperanto, Farsi (Persian), Finnish, French, German, Greek, Hungarian, +# Indonesian, Italian, Japanese, Japanese-en (Japanese with English messages), +# Korean, Korean-en (Korean with English messages), Latvian, Lithuanian, +# Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese, Romanian, Russian, +# Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish, Swedish, Turkish, +# Ukrainian and Vietnamese. +# The default value is: English. + +OUTPUT_LANGUAGE        = English + +# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member +# descriptions after the members that are listed in the file and class +# documentation (similar to Javadoc). Set to NO to disable this. +# The default value is: YES. + +BRIEF_MEMBER_DESC      = YES + +# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief +# description of a member or function before the detailed description +# +# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. +# The default value is: YES. + +REPEAT_BRIEF           = NO + +# This tag implements a quasi-intelligent brief description abbreviator that is +# used to form the text in various listings. Each string in this list, if found +# as the leading text of the brief description, will be stripped from the text +# and the result, after processing the whole list, is used as the annotated +# text. Otherwise, the brief description is used as-is. If left blank, the +# following values are used ($name is automatically replaced with the name of +# the entity):The $name class, The $name widget, The $name file, is, provides, +# specifies, contains, represents, a, an and the. + +ABBREVIATE_BRIEF       = "The $name class" \ +                         "The $name widget" \ +                         "The $name file" \ +                         is \ +                         provides \ +                         specifies \ +                         contains \ +                         represents \ +                         a \ +                         an \ +                         the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# doxygen will generate a detailed section even if there is only a brief +# description. +# The default value is: NO. + +ALWAYS_DETAILED_SEC    = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. +# The default value is: NO. + +INLINE_INHERITED_MEMB  = NO + +# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path +# before files name in the file list and in the header files. If set to NO the +# shortest path that makes the file name unique will be used +# The default value is: YES. + +FULL_PATH_NAMES        = YES + +# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path. +# Stripping is only done if one of the specified strings matches the left-hand +# part of the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the path to +# strip. +# +# Note that you can specify absolute paths here, but also relative paths, which +# will be relative from the directory where doxygen is started. +# This tag requires that the tag FULL_PATH_NAMES is set to YES. + +STRIP_FROM_PATH        = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the +# path mentioned in the documentation of a class, which tells the reader which +# header file to include in order to use a class. If left blank only the name of +# the header file containing the class definition is used. Otherwise one should +# specify the list of include paths that are normally passed to the compiler +# using the -I flag. + +STRIP_FROM_INC_PATH    = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but +# less readable) file names. This can be useful is your file systems doesn't +# support long names like on DOS, Mac, or CD-ROM. +# The default value is: NO. + +SHORT_NAMES            = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the +# first line (until the first dot) of a Javadoc-style comment as the brief +# description. If set to NO, the Javadoc-style will behave just like regular Qt- +# style comments (thus requiring an explicit @brief command for a brief +# description.) +# The default value is: NO. + +JAVADOC_AUTOBRIEF      = NO + +# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first +# line (until the first dot) of a Qt-style comment as the brief description. If +# set to NO, the Qt-style will behave just like regular Qt-style comments (thus +# requiring an explicit \brief command for a brief description.) +# The default value is: NO. + +QT_AUTOBRIEF           = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a +# multi-line C++ special comment block (i.e. a block of //! or /// comments) as +# a brief description. This used to be the default behavior. The new default is +# to treat a multi-line C++ comment block as a detailed description. Set this +# tag to YES if you prefer the old behavior instead. +# +# Note that setting this tag to YES also means that rational rose comments are +# not recognized any more. +# The default value is: NO. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the +# documentation from any documented member that it re-implements. +# The default value is: YES. + +INHERIT_DOCS           = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new +# page for each member. If set to NO, the documentation of a member will be part +# of the file/class/namespace that contains it. +# The default value is: NO. + +SEPARATE_MEMBER_PAGES  = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen +# uses this value to replace tabs by spaces in code fragments. +# Minimum value: 1, maximum value: 16, default value: 4. + +TAB_SIZE               = 4 + +# This tag can be used to specify a number of aliases that act as commands in +# the documentation. An alias has the form: +# name=value +# For example adding +# "sideeffect=@par Side Effects:\n" +# will allow you to put the command \sideeffect (or @sideeffect) in the +# documentation, which will result in a user-defined paragraph with heading +# "Side Effects:". You can put \n's in the value part of an alias to insert +# newlines. + +ALIASES                = + +# This tag can be used to specify a number of word-keyword mappings (TCL only). +# A mapping has the form "name=value". For example adding "class=itcl::class" +# will allow you to use the command class in the itcl::class meaning. + +TCL_SUBST              = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources +# only. Doxygen will then generate output that is more tailored for C. For +# instance, some of the names that are used will be different. The list of all +# members will be omitted, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_FOR_C  = YES + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or +# Python sources only. Doxygen will then generate output that is more tailored +# for that language. For instance, namespaces will be presented as packages, +# qualified scopes will look different, etc. +# The default value is: NO. + +OPTIMIZE_OUTPUT_JAVA   = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources. Doxygen will then generate output that is tailored for Fortran. +# The default value is: NO. + +OPTIMIZE_FOR_FORTRAN   = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for VHDL. +# The default value is: NO. + +OPTIMIZE_OUTPUT_VHDL   = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given +# extension. Doxygen has a built-in mapping, but you can override or extend it +# using this tag. The format is ext=language, where ext is a file extension, and +# language is one of the parsers supported by doxygen: IDL, Java, Javascript, +# C#, C, C++, D, PHP, Objective-C, Python, Fortran (fixed format Fortran: +# FortranFixed, free formatted Fortran: FortranFree, unknown formatted Fortran: +# Fortran. In the later case the parser tries to guess whether the code is fixed +# or free formatted code, this is the default for Fortran type files), VHDL. For +# instance to make doxygen treat .inc files as Fortran files (default is PHP), +# and .f files as C (default is Fortran), use: inc=Fortran f=C. +# +# Note: For files without extension you can use no_extension as a placeholder. +# +# Note that for custom extensions you also need to set FILE_PATTERNS otherwise +# the files are not read by doxygen. + +EXTENSION_MAPPING      = + +# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments +# according to the Markdown format, which allows for more readable +# documentation. See http://daringfireball.net/projects/markdown/ for details. +# The output of markdown processing is further processed by doxygen, so you can +# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in +# case of backward compatibilities issues. +# The default value is: YES. + +MARKDOWN_SUPPORT       = NO + +# When enabled doxygen tries to link words that correspond to documented +# classes, or namespaces to their corresponding documentation. Such a link can +# be prevented in individual cases by putting a % sign in front of the word or +# globally by setting AUTOLINK_SUPPORT to NO. +# The default value is: YES. + +AUTOLINK_SUPPORT       = YES + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should set this +# tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); +# versus func(std::string) {}). This also make the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. +# The default value is: NO. + +BUILTIN_STL_SUPPORT    = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. +# The default value is: NO. + +CPP_CLI_SUPPORT        = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip (see: +# http://www.riverbankcomputing.co.uk/software/sip/intro) sources only. Doxygen +# will parse them like normal C++ but will assume all classes use public instead +# of private inheritance when no explicit protection keyword is present. +# The default value is: NO. + +SIP_SUPPORT            = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate +# getter and setter methods for a property. Setting this option to YES will make +# doxygen to replace the get and set methods by a property in the documentation. +# This will only work if the methods are indeed getting or setting a simple +# type. If this is not the case, or you want to show the methods anyway, you +# should set this option to NO. +# The default value is: YES. + +IDL_PROPERTY_SUPPORT   = NO + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. +# The default value is: NO. + +DISTRIBUTE_GROUP_DOC   = NO + +# Set the SUBGROUPING tag to YES to allow class member groups of the same type +# (for instance a group of public functions) to be put as a subgroup of that +# type (e.g. under the Public Functions section). Set it to NO to prevent +# subgrouping. Alternatively, this can be done per class using the +# \nosubgrouping command. +# The default value is: YES. + +SUBGROUPING            = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions +# are shown inside the group in which they are included (e.g. using \ingroup) +# instead of on a separate page (for HTML and Man pages) or section (for LaTeX +# and RTF). +# +# Note that this feature does not work in combination with +# SEPARATE_MEMBER_PAGES. +# The default value is: NO. + +INLINE_GROUPED_CLASSES = NO + +# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions +# with only public data fields or simple typedef fields will be shown inline in +# the documentation of the scope in which they are defined (i.e. file, +# namespace, or group documentation), provided this scope is documented. If set +# to NO, structs, classes, and unions are shown on a separate page (for HTML and +# Man pages) or section (for LaTeX and RTF). +# The default value is: NO. + +INLINE_SIMPLE_STRUCTS  = NO + +# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or +# enum is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically be +# useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. +# The default value is: NO. + +TYPEDEF_HIDES_STRUCT   = YES + +# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This +# cache is used to resolve symbols given their name and scope. Since this can be +# an expensive process and often the same symbol appears multiple times in the +# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small +# doxygen will become slower. If the cache is too large, memory is wasted. The +# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range +# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536 +# symbols. At the end of a run doxygen will report the cache usage and suggest +# the optimal cache size from a speed point of view. +# Minimum value: 0, maximum value: 9, default value: 0. + +LOOKUP_CACHE_SIZE      = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in +# documentation are documented, even if no documentation was available. Private +# class members and static file members will be hidden unless the +# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES. +# Note: This will also disable the warnings about undocumented members that are +# normally produced when WARNINGS is set to YES. +# The default value is: NO. + +EXTRACT_ALL            = YES + +# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will +# be included in the documentation. +# The default value is: NO. + +EXTRACT_PRIVATE        = YES + +# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal +# scope will be included in the documentation. +# The default value is: NO. + +EXTRACT_PACKAGE        = NO + +# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be +# included in the documentation. +# The default value is: NO. + +EXTRACT_STATIC         = YES + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined +# locally in source files will be included in the documentation. If set to NO, +# only classes defined in header files are included. Does not have any effect +# for Java sources. +# The default value is: YES. + +EXTRACT_LOCAL_CLASSES  = YES + +# This flag is only useful for Objective-C code. If set to YES, local methods, +# which are defined in the implementation section but not in the interface are +# included in the documentation. If set to NO, only methods in the interface are +# included. +# The default value is: NO. + +EXTRACT_LOCAL_METHODS  = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base name of +# the file that contains the anonymous namespace. By default anonymous namespace +# are hidden. +# The default value is: NO. + +EXTRACT_ANON_NSPACES   = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all +# undocumented members inside documented classes or files. If set to NO these +# members will be included in the various overviews, but no documentation +# section is generated. This option has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_MEMBERS     = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. If set +# to NO, these classes will be included in the various overviews. This option +# has no effect if EXTRACT_ALL is enabled. +# The default value is: NO. + +HIDE_UNDOC_CLASSES     = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend +# (class|struct|union) declarations. If set to NO, these declarations will be +# included in the documentation. +# The default value is: NO. + +HIDE_FRIEND_COMPOUNDS  = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any +# documentation blocks found inside the body of a function. If set to NO, these +# blocks will be appended to the function's detailed documentation block. +# The default value is: NO. + +HIDE_IN_BODY_DOCS      = NO + +# The INTERNAL_DOCS tag determines if documentation that is typed after a +# \internal command is included. If the tag is set to NO then the documentation +# will be excluded. Set it to YES to include the internal documentation. +# The default value is: NO. + +INTERNAL_DOCS          = NO + +# If the CASE_SENSE_NAMES tag is set to NO then doxygen will only generate file +# names in lower-case letters. If set to YES, upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. +# The default value is: system dependent. + +CASE_SENSE_NAMES       = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with +# their full class and namespace scopes in the documentation. If set to YES, the +# scope will be hidden. +# The default value is: NO. + +HIDE_SCOPE_NAMES       = NO + +# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will +# append additional text to a page's title, such as Class Reference. If set to +# YES the compound reference will be hidden. +# The default value is: NO. + +HIDE_COMPOUND_REFERENCE= NO + +# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of +# the files that are included by a file in the documentation of that file. +# The default value is: YES. + +SHOW_INCLUDE_FILES     = YES + +# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each +# grouped member an include statement to the documentation, telling the reader +# which file to include in order to use the member. +# The default value is: NO. + +SHOW_GROUPED_MEMB_INC  = NO + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include +# files with double quotes in the documentation rather than with sharp brackets. +# The default value is: NO. + +FORCE_LOCAL_INCLUDES   = NO + +# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the +# documentation for inline members. +# The default value is: YES. + +INLINE_INFO            = YES + +# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the +# (detailed) documentation of file and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. +# The default value is: YES. + +SORT_MEMBER_DOCS       = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief +# descriptions of file, namespace and class members alphabetically by member +# name. If set to NO, the members will appear in declaration order. Note that +# this will also influence the order of the classes in the class list. +# The default value is: NO. + +SORT_BRIEF_DOCS        = YES + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the +# (brief and detailed) documentation of class members so that constructors and +# destructors are listed first. If set to NO the constructors will appear in the +# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS. +# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief +# member documentation. +# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting +# detailed member documentation. +# The default value is: NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy +# of group names into alphabetical order. If set to NO the group names will +# appear in their defined order. +# The default value is: NO. + +SORT_GROUP_NAMES       = YES + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by +# fully-qualified names, including namespaces. If set to NO, the class list will +# be sorted only by class name, not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the alphabetical +# list. +# The default value is: NO. + +SORT_BY_SCOPE_NAME     = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper +# type resolution of all parameters of a function it will reject a match between +# the prototype and the implementation of a member function even if there is +# only one candidate or it is obvious which candidate to choose by doing a +# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still +# accept a match between prototype and implementation in such cases. +# The default value is: NO. + +STRICT_PROTO_MATCHING  = YES + +# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo +# list. This list is created by putting \todo commands in the documentation. +# The default value is: YES. + +GENERATE_TODOLIST      = NO + +# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test +# list. This list is created by putting \test commands in the documentation. +# The default value is: YES. + +GENERATE_TESTLIST      = NO + +# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug +# list. This list is created by putting \bug commands in the documentation. +# The default value is: YES. + +GENERATE_BUGLIST       = NO + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO) +# the deprecated list. This list is created by putting \deprecated commands in +# the documentation. +# The default value is: YES. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional documentation +# sections, marked by \if <section_label> ... \endif and \cond <section_label> +# ... \endcond blocks. + +ENABLED_SECTIONS       = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the +# initial value of a variable or macro / define can have for it to appear in the +# documentation. If the initializer consists of more lines than specified here +# it will be hidden. Use a value of 0 to hide initializers completely. The +# appearance of the value of individual variables and macros / defines can be +# controlled using \showinitializer or \hideinitializer command in the +# documentation regardless of this setting. +# Minimum value: 0, maximum value: 10000, default value: 30. + +MAX_INITIALIZER_LINES  = 1 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at +# the bottom of the documentation of classes and structs. If set to YES, the +# list will mention the files that were used to generate the documentation. +# The default value is: YES. + +SHOW_USED_FILES        = YES + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This +# will remove the Files entry from the Quick Index and from the Folder Tree View +# (if specified). +# The default value is: YES. + +SHOW_FILES             = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces +# page. This will remove the Namespaces entry from the Quick Index and from the +# Folder Tree View (if specified). +# The default value is: YES. + +SHOW_NAMESPACES        = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command command input-file, where command is the value of the +# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided +# by doxygen. Whatever the program writes to standard output is used as the file +# version. For an example see the documentation. + +FILE_VERSION_FILTER    = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. To create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. You can +# optionally specify a file name after the option, if omitted DoxygenLayout.xml +# will be used as the name of the layout file. +# +# Note that if you run doxygen from a directory containing a file called +# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE +# tag is left empty. + +LAYOUT_FILE            = + +# The CITE_BIB_FILES tag can be used to specify one or more bib files containing +# the reference definitions. This must be a list of .bib files. The .bib +# extension is automatically appended if omitted. This requires the bibtex tool +# to be installed. See also http://en.wikipedia.org/wiki/BibTeX for more info. +# For LaTeX the style of the bibliography can be controlled using +# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the +# search path. See also \cite for info how to create references. + +CITE_BIB_FILES         = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated to +# standard output by doxygen. If QUIET is set to YES this implies that the +# messages are off. +# The default value is: NO. + +QUIET                  = YES + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES +# this implies that the warnings are on. +# +# Tip: Turn warnings on while writing the documentation. +# The default value is: YES. + +WARNINGS               = YES + +# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate +# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag +# will automatically be disabled. +# The default value is: YES. + +WARN_IF_UNDOCUMENTED   = YES + +# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some parameters +# in a documented function, or documenting parameters that don't exist or using +# markup commands wrongly. +# The default value is: YES. + +WARN_IF_DOC_ERROR      = YES + +# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that +# are documented, but have no documentation for their parameters or return +# value. If set to NO, doxygen will only warn about wrong or incomplete +# parameter documentation, but not about the absence of documentation. +# The default value is: NO. + +WARN_NO_PARAMDOC       = YES + +# The WARN_FORMAT tag determines the format of the warning messages that doxygen +# can produce. The string should contain the $file, $line, and $text tags, which +# will be replaced by the file and line number from which the warning originated +# and the warning text. Optionally the format may contain $version, which will +# be replaced by the version of the file (if it could be obtained via +# FILE_VERSION_FILTER) +# The default value is: $file:$line: $text. + +WARN_FORMAT            = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning and error +# messages should be written. If left blank the output is written to standard +# error (stderr). + +WARN_LOGFILE           = + +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag is used to specify the files and/or directories that contain +# documented source files. You may enter file names like myfile.cpp or +# directories like /usr/src/myproject. Separate the files or directories with +# spaces. +# Note: If this tag is empty the current directory is searched. + +INPUT                  = ./ + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses +# libiconv (or the iconv built into libc) for the transcoding. See the libiconv +# documentation (see: http://www.gnu.org/software/libiconv) for the list of +# possible encodings. +# The default value is: UTF-8. + +INPUT_ENCODING         = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank the +# following patterns are tested:*.c, *.cc, *.cxx, *.cpp, *.c++, *.java, *.ii, +# *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h, *.hh, *.hxx, *.hpp, +# *.h++, *.cs, *.d, *.php, *.php4, *.php5, *.phtml, *.inc, *.m, *.markdown, +# *.md, *.mm, *.dox, *.py, *.f90, *.f, *.for, *.tcl, *.vhd, *.vhdl, *.ucf, +# *.qsf, *.as and *.js. + +FILE_PATTERNS          = *.h \ +                         *.txt + +# The RECURSIVE tag can be used to specify whether or not subdirectories should +# be searched for input files as well. +# The default value is: NO. + +RECURSIVE              = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should be +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. +# +# Note that relative paths are relative to the directory from which doxygen is +# run. + +EXCLUDE                = Documentation/ \ +                         StudioIntegration/ \ +                         Build/ \ +                         License.txt + +# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. +# The default value is: NO. + +EXCLUDE_SYMLINKS       = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories for example use the pattern */test/* + +EXCLUDE_PATTERNS       = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test +# +# Note that the wildcards are matched against the file with absolute path, so to +# exclude all test directories use the pattern */test/* + +EXCLUDE_SYMBOLS        = _* \ +                         __* + +# The EXAMPLE_PATH tag can be used to specify one or more files or directories +# that contain example code fragments that are included (see the \include +# command). + +EXAMPLE_PATH           = ./ \ +                         CodeTemplates/ + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and +# *.h) to filter out the source-files in the directories. If left blank all +# files are included. + +EXAMPLE_PATTERNS       = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude commands +# irrespective of the value of the RECURSIVE tag. +# The default value is: NO. + +EXAMPLE_RECURSIVE      = NO + +# The IMAGE_PATH tag can be used to specify one or more files or directories +# that contain images that are to be included in the documentation (see the +# \image command). + +IMAGE_PATH             = ./ + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command: +# +# <filter> <input-file> +# +# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the +# name of an input file. Doxygen will then use the output that the filter +# program writes to standard output. If FILTER_PATTERNS is specified, this tag +# will be ignored. +# +# Note that the filter must not add or remove lines; it is applied before the +# code is scanned, but not when the output code is generated. If lines are added +# or removed, the anchors will not be placed correctly. + +INPUT_FILTER           = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: pattern=filter +# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how +# filters are used. If the FILTER_PATTERNS tag is empty or if none of the +# patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS        = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will also be used to filter the input files that are used for +# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES). +# The default value is: NO. + +FILTER_SOURCE_FILES    = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and +# it is also possible to disable source filtering for a specific pattern using +# *.ext= (so without naming a filter). +# This tag requires that the tag FILTER_SOURCE_FILES is set to YES. + +FILTER_SOURCE_PATTERNS = + +# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that +# is part of the input, its contents will be placed on the main page +# (index.html). This can be useful if you have a project on for instance GitHub +# and want to reuse the introduction page also for the doxygen output. + +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will be +# generated. Documented entities will be cross-referenced with these sources. +# +# Note: To get rid of all source code in the generated output, make sure that +# also VERBATIM_HEADERS is set to NO. +# The default value is: NO. + +SOURCE_BROWSER         = NO + +# Setting the INLINE_SOURCES tag to YES will include the body of functions, +# classes and enums directly into the documentation. +# The default value is: NO. + +INLINE_SOURCES         = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any +# special comment blocks from generated source code fragments. Normal C, C++ and +# Fortran comments will always remain visible. +# The default value is: YES. + +STRIP_CODE_COMMENTS    = YES + +# If the REFERENCED_BY_RELATION tag is set to YES then for each documented +# function all documented functions referencing it will be listed. +# The default value is: NO. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES then for each documented function +# all documented entities called/used by that function will be listed. +# The default value is: NO. + +REFERENCES_RELATION    = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set +# to YES then the hyperlinks from functions in REFERENCES_RELATION and +# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will +# link to the documentation. +# The default value is: YES. + +REFERENCES_LINK_SOURCE = NO + +# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the +# source code will show a tooltip with additional information such as prototype, +# brief description and links to the definition and documentation. Since this +# will make the HTML file larger and loading of large files a bit slower, you +# can opt to disable this feature. +# The default value is: YES. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +SOURCE_TOOLTIPS        = YES + +# If the USE_HTAGS tag is set to YES then the references to source code will +# point to the HTML generated by the htags(1) tool instead of doxygen built-in +# source browser. The htags tool is part of GNU's global source tagging system +# (see http://www.gnu.org/software/global/global.html). You will need version +# 4.8.6 or higher. +# +# To use it do the following: +# - Install the latest version of global +# - Enable SOURCE_BROWSER and USE_HTAGS in the config file +# - Make sure the INPUT points to the root of the source tree +# - Run doxygen as normal +# +# Doxygen will invoke htags (and that will in turn invoke gtags), so these +# tools must be available from the command line (i.e. in the search path). +# +# The result: instead of the source browser generated by doxygen, the links to +# source code will now point to the output of htags. +# The default value is: NO. +# This tag requires that the tag SOURCE_BROWSER is set to YES. + +USE_HTAGS              = NO + +# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a +# verbatim copy of the header file for each class for which an include is +# specified. Set to NO to disable this. +# See also: Section \class. +# The default value is: YES. + +VERBATIM_HEADERS       = NO + +# If the CLANG_ASSISTED_PARSING tag is set to YES then doxygen will use the +# clang parser (see: http://clang.llvm.org/) for more accurate parsing at the +# cost of reduced performance. This can be particularly helpful with template +# rich C++ code for which doxygen's built-in parser lacks the necessary type +# information. +# Note: The availability of this option depends on whether or not doxygen was +# compiled with the --with-libclang option. +# The default value is: NO. + +CLANG_ASSISTED_PARSING = NO + +# If clang assisted parsing is enabled you can provide the compiler with command +# line options that you would normally use when invoking the compiler. Note that +# the include paths will already be set by doxygen for the files and directories +# specified with INPUT and INCLUDE_PATH. +# This tag requires that the tag CLANG_ASSISTED_PARSING is set to YES. + +CLANG_OPTIONS          = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all +# compounds will be generated. Enable this if the project contains a lot of +# classes, structs, unions or interfaces. +# The default value is: YES. + +ALPHABETICAL_INDEX     = YES + +# The COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns in +# which the alphabetical index list will be split. +# Minimum value: 1, maximum value: 20, default value: 5. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +COLS_IN_ALPHA_INDEX    = 5 + +# In case all classes in a project start with a common prefix, all classes will +# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag +# can be used to specify a prefix (or a list of prefixes) that should be ignored +# while generating the index headers. +# This tag requires that the tag ALPHABETICAL_INDEX is set to YES. + +IGNORE_PREFIX          = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output +# The default value is: YES. + +GENERATE_HTML          = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_OUTPUT            = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each +# generated HTML page (for example: .htm, .php, .asp). +# The default value is: .html. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FILE_EXTENSION    = .html + +# The HTML_HEADER tag can be used to specify a user-defined HTML header file for +# each generated HTML page. If the tag is left blank doxygen will generate a +# standard header. +# +# To get valid HTML the header file that includes any scripts and style sheets +# that doxygen needs, which is dependent on the configuration options used (e.g. +# the setting GENERATE_TREEVIEW). It is highly recommended to start with a +# default header using +# doxygen -w html new_header.html new_footer.html new_stylesheet.css +# YourConfigFile +# and then modify the file new_header.html. See also section "Doxygen usage" +# for information on how to generate the default header that doxygen normally +# uses. +# Note: The header is subject to change so you typically have to regenerate the +# default header when upgrading to a newer version of doxygen. For a description +# of the possible markers and block names see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_HEADER            = + +# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each +# generated HTML page. If the tag is left blank doxygen will generate a standard +# footer. See HTML_HEADER for more information on how to generate a default +# footer and what special commands can be used inside the footer. See also +# section "Doxygen usage" for information on how to generate the default footer +# that doxygen normally uses. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_FOOTER            = ./DoxygenPages/Style/Footer.htm + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style +# sheet that is used by each HTML page. It can be used to fine-tune the look of +# the HTML output. If left blank doxygen will generate a default style sheet. +# See also section "Doxygen usage" for information on how to generate the style +# sheet that doxygen normally uses. +# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as +# it is more robust and this tag (HTML_STYLESHEET) will in the future become +# obsolete. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_STYLESHEET        = + +# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# cascading style sheets that are included after the standard style sheets +# created by doxygen. Using this option one can overrule certain style aspects. +# This is preferred over using HTML_STYLESHEET since it does not replace the +# standard style sheet and is therefore more robust against future updates. +# Doxygen will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). For an example see the documentation. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_STYLESHEET  = ./DoxygenPages/Style/Style.css + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that the +# files will be copied as-is; there are no commands or markers available. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_EXTRA_FILES       = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen +# will adjust the colors in the style sheet and background images according to +# this color. Hue is specified as an angle on a colorwheel, see +# http://en.wikipedia.org/wiki/Hue for more information. For instance the value +# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300 +# purple, and 360 is red again. +# Minimum value: 0, maximum value: 359, default value: 220. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_HUE    = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors +# in the HTML output. For a value of 0 the output will use grayscales only. A +# value of 255 will produce the most vivid colors. +# Minimum value: 0, maximum value: 255, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_SAT    = 120 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the +# luminance component of the colors in the HTML output. Values below 100 +# gradually make the output lighter, whereas values above 100 make the output +# darker. The value divided by 100 is the actual gamma applied, so 80 represents +# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not +# change the gamma. +# Minimum value: 40, maximum value: 240, default value: 80. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_COLORSTYLE_GAMMA  = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting this +# to NO can help when comparing the output of multiple runs. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_TIMESTAMP         = NO + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_DYNAMIC_SECTIONS  = YES + +# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries +# shown in the various tree structured indices initially; the user can expand +# and collapse entries dynamically later on. Doxygen will expand the tree to +# such a level that at most the specified number of entries are visible (unless +# a fully collapsed tree already exceeds this amount). So setting the number of +# entries 1 will produce a full collapsed tree by default. 0 is a special value +# representing an infinite number of entries and will result in a full expanded +# tree by default. +# Minimum value: 0, maximum value: 9999, default value: 100. +# This tag requires that the tag GENERATE_HTML is set to YES. + +HTML_INDEX_NUM_ENTRIES = 100 + +# If the GENERATE_DOCSET tag is set to YES, additional index files will be +# generated that can be used as input for Apple's Xcode 3 integrated development +# environment (see: http://developer.apple.com/tools/xcode/), introduced with +# OSX 10.5 (Leopard). To create a documentation set, doxygen will generate a +# Makefile in the HTML output directory. Running make will produce the docset in +# that directory and running make install will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at +# startup. See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_DOCSET        = NO + +# This tag determines the name of the docset feed. A documentation feed provides +# an umbrella under which multiple documentation sets from a single provider +# (such as a company or product suite) can be grouped. +# The default value is: Doxygen generated docs. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_FEEDNAME        = "Doxygen generated docs" + +# This tag specifies a string that should uniquely identify the documentation +# set bundle. This should be a reverse domain-name style string, e.g. +# com.mycompany.MyDocSet. Doxygen will append .docset to the name. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_BUNDLE_ID       = org.doxygen.Project + +# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. +# The default value is: org.doxygen.Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_ID    = com.lufa-lib.library.documentation + +# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher. +# The default value is: Publisher. +# This tag requires that the tag GENERATE_DOCSET is set to YES. + +DOCSET_PUBLISHER_NAME  = DeanCamera + +# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three +# additional HTML index files: index.hhp, index.hhc, and index.hhk. The +# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop +# (see: http://www.microsoft.com/en-us/download/details.aspx?id=21138) on +# Windows. +# +# The HTML Help Workshop contains a compiler that can convert all HTML output +# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML +# files are now used as the Windows 98 help format, and will replace the old +# Windows help format (.hlp) on all Windows platforms in the future. Compressed +# HTML files also contain an index, a table of contents, and you can search for +# words in the documentation. The HTML workshop also contains a viewer for +# compressed HTML files. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_HTMLHELP      = NO + +# The CHM_FILE tag can be used to specify the file name of the resulting .chm +# file. You can add a path in front of the file if the result should not be +# written to the html output directory. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_FILE               = ../LUFA.chm + +# The HHC_LOCATION tag can be used to specify the location (absolute path +# including file name) of the HTML help compiler (hhc.exe). If non-empty, +# doxygen will try to run the HTML help compiler on the generated index.hhp. +# The file has to be specified with full path. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +HHC_LOCATION           = + +# The GENERATE_CHI flag controls if a separate .chi index file is generated +# (YES) or that it should be included in the master .chm file (NO). +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +GENERATE_CHI           = NO + +# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc) +# and project file content. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +CHM_INDEX_ENCODING     = + +# The BINARY_TOC flag controls whether a binary table of contents is generated +# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it +# enables the Previous and Next buttons. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +BINARY_TOC             = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members to +# the table of contents of the HTML help documentation and to the tree view. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTMLHELP is set to YES. + +TOC_EXPAND             = YES + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that +# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help +# (.qch) of the generated HTML documentation. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_QHP           = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify +# the file name of the resulting .qch file. The path specified is relative to +# the HTML output folder. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QCH_FILE               = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help +# Project output. For more information please see Qt Help Project / Namespace +# (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#namespace). +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_NAMESPACE          = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt +# Help Project output. For more information please see Qt Help Project / Virtual +# Folders (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#virtual- +# folders). +# The default value is: doc. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_VIRTUAL_FOLDER     = doc + +# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom +# filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_NAME   = + +# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see Qt Help Project / Custom +# Filters (see: http://qt-project.org/doc/qt-4.8/qthelpproject.html#custom- +# filters). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_CUST_FILTER_ATTRS  = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's filter section matches. Qt Help Project / Filter Attributes (see: +# http://qt-project.org/doc/qt-4.8/qthelpproject.html#filter-attributes). +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHP_SECT_FILTER_ATTRS  = + +# The QHG_LOCATION tag can be used to specify the location of Qt's +# qhelpgenerator. If non-empty doxygen will try to run qhelpgenerator on the +# generated .qhp file. +# This tag requires that the tag GENERATE_QHP is set to YES. + +QHG_LOCATION           = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be +# generated, together with the HTML files, they form an Eclipse help plugin. To +# install this plugin and make it available under the help contents menu in +# Eclipse, the contents of the directory containing the HTML and XML files needs +# to be copied into the plugins directory of eclipse. The name of the directory +# within the plugins directory should be the same as the ECLIPSE_DOC_ID value. +# After copying Eclipse needs to be restarted before the help appears. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_ECLIPSEHELP   = NO + +# A unique identifier for the Eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have this +# name. Each documentation set should have its own identifier. +# The default value is: org.doxygen.Project. +# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES. + +ECLIPSE_DOC_ID         = org.doxygen.Project + +# If you want full control over the layout of the generated HTML pages it might +# be necessary to disable the index and replace it with your own. The +# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top +# of each HTML page. A value of NO enables the index and the value YES disables +# it. Since the tabs in the index contain the same information as the navigation +# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +DISABLE_INDEX          = YES + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. If the tag +# value is set to YES, a side panel will be generated containing a tree-like +# index structure (just like the one that is generated for HTML Help). For this +# to work a browser that supports JavaScript, DHTML, CSS and frames is required +# (i.e. any modern browser). Windows users are probably better off using the +# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can +# further fine-tune the look of the index. As an example, the default style +# sheet generated by doxygen has an example that shows how to put an image at +# the root of the tree instead of the PROJECT_NAME. Since the tree basically has +# the same information as the tab index, you could consider setting +# DISABLE_INDEX to YES when enabling this option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +GENERATE_TREEVIEW      = YES + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that +# doxygen will group on one line in the generated HTML documentation. +# +# Note that a value of 0 will completely suppress the enum values from appearing +# in the overview section. +# Minimum value: 0, maximum value: 20, default value: 4. +# This tag requires that the tag GENERATE_HTML is set to YES. + +ENUM_VALUES_PER_LINE   = 1 + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used +# to set the initial width (in pixels) of the frame in which the tree is shown. +# Minimum value: 0, maximum value: 1500, default value: 250. +# This tag requires that the tag GENERATE_HTML is set to YES. + +TREEVIEW_WIDTH         = 300 + +# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to +# external symbols imported via tag files in a separate window. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +EXT_LINKS_IN_WINDOW    = NO + +# Use this tag to change the font size of LaTeX formulas included as images in +# the HTML documentation. When you change the font size after a successful +# doxygen run you need to manually remove any form_*.png images from the HTML +# output directory to force them to be regenerated. +# Minimum value: 8, maximum value: 50, default value: 10. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_FONTSIZE       = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are not +# supported properly for IE 6.0, but are supported on all modern browsers. +# +# Note that when changing this option you need to delete any form_*.png files in +# the HTML output directory before the changes have effect. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +FORMULA_TRANSPARENT    = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see +# http://www.mathjax.org) which uses client side Javascript for the rendering +# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX +# installed or if you want to formulas look prettier in the HTML output. When +# enabled you may also need to install MathJax separately and configure the path +# to it using the MATHJAX_RELPATH option. +# The default value is: NO. +# This tag requires that the tag GENERATE_HTML is set to YES. + +USE_MATHJAX            = NO + +# When MathJax is enabled you can set the default output format to be used for +# the MathJax output. See the MathJax site (see: +# http://docs.mathjax.org/en/latest/output.html) for more details. +# Possible values are: HTML-CSS (which is slower, but has the best +# compatibility), NativeMML (i.e. MathML) and SVG. +# The default value is: HTML-CSS. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_FORMAT         = HTML-CSS + +# When MathJax is enabled you need to specify the location relative to the HTML +# output directory using the MATHJAX_RELPATH option. The destination directory +# should contain the MathJax.js script. For instance, if the mathjax directory +# is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax +# Content Delivery Network so you can quickly see the result without installing +# MathJax. However, it is strongly recommended to install a local copy of +# MathJax from http://www.mathjax.org before deployment. +# The default value is: http://cdn.mathjax.org/mathjax/latest. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_RELPATH        = http://www.mathjax.org/mathjax + +# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax +# extension names that should be enabled during MathJax rendering. For example +# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_EXTENSIONS     = + +# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces +# of code that will be used on startup of the MathJax code. See the MathJax site +# (see: http://docs.mathjax.org/en/latest/output.html) for more details. For an +# example see the documentation. +# This tag requires that the tag USE_MATHJAX is set to YES. + +MATHJAX_CODEFILE       = + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box for +# the HTML output. The underlying search engine uses javascript and DHTML and +# should work on any modern browser. Note that when using HTML help +# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET) +# there is already a search function so this one should typically be disabled. +# For large projects the javascript based search engine can be slow, then +# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to +# search using the keyboard; to jump to the search box use <access key> + S +# (what the <access key> is depends on the OS and browser, but it is typically +# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down +# key> to jump into the search results window, the results can be navigated +# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel +# the search. The filter options can be selected when the cursor is inside the +# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys> +# to select a filter and <Enter> or <escape> to activate or cancel the filter +# option. +# The default value is: YES. +# This tag requires that the tag GENERATE_HTML is set to YES. + +SEARCHENGINE           = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a web server instead of a web client using Javascript. There +# are two flavors of web server based searching depending on the EXTERNAL_SEARCH +# setting. When disabled, doxygen will generate a PHP script for searching and +# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing +# and searching needs to be provided by external tools. See the section +# "External Indexing and Searching" for details. +# The default value is: NO. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SERVER_BASED_SEARCH    = NO + +# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP +# script for searching. Instead the search results are written to an XML file +# which needs to be processed by an external indexer. Doxygen will invoke an +# external search engine pointed to by the SEARCHENGINE_URL option to obtain the +# search results. +# +# Doxygen ships with an example indexer (doxyindexer) and search engine +# (doxysearch.cgi) which are based on the open source search engine library +# Xapian (see: http://xapian.org/). +# +# See the section "External Indexing and Searching" for details. +# The default value is: NO. +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTERNAL_SEARCH        = NO + +# The SEARCHENGINE_URL should point to a search engine hosted by a web server +# which will return the search results when EXTERNAL_SEARCH is enabled. +# +# Doxygen ships with an example indexer (doxyindexer) and search engine +# (doxysearch.cgi) which are based on the open source search engine library +# Xapian (see: http://xapian.org/). See the section "External Indexing and +# Searching" for details. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SEARCHENGINE_URL       = + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed +# search data is written to a file for indexing by an external tool. With the +# SEARCHDATA_FILE tag the name of this file can be specified. +# The default file is: searchdata.xml. +# This tag requires that the tag SEARCHENGINE is set to YES. + +SEARCHDATA_FILE        = searchdata.xml + +# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the +# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is +# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple +# projects and redirect the results back to the right project. +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTERNAL_SEARCH_ID     = + +# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen +# projects other than the one defined by this configuration file, but that are +# all added to the same external search index. Each project needs to have a +# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of +# to a relative location where the documentation can be found. The format is: +# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ... +# This tag requires that the tag SEARCHENGINE is set to YES. + +EXTRA_SEARCH_MAPPINGS  = + +#--------------------------------------------------------------------------- +# Configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output. +# The default value is: YES. + +GENERATE_LATEX         = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: latex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_OUTPUT           = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. +# +# Note that when enabling USE_PDFLATEX this option is only used for generating +# bitmaps for formulas in the HTML output, but not in the Makefile that is +# written to the output directory. +# The default file is: latex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_CMD_NAME         = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate +# index for LaTeX. +# The default file is: makeindex. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +MAKEINDEX_CMD_NAME     = makeindex + +# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX +# documents. This may be useful for small projects and may help to save some +# trees in general. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +COMPACT_LATEX          = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used by the +# printer. +# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x +# 14 inches) and executive (7.25 x 10.5 inches). +# The default value is: a4. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +PAPER_TYPE             = a4wide + +# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names +# that should be included in the LaTeX output. To get the times font for +# instance you can specify +# EXTRA_PACKAGES=times +# If left blank no extra packages will be included. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +EXTRA_PACKAGES         = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for the +# generated LaTeX document. The header should contain everything until the first +# chapter. If it is left blank doxygen will generate a standard header. See +# section "Doxygen usage" for information on how to let doxygen write the +# default header to a separate file. +# +# Note: Only use a user-defined header if you know what you are doing! The +# following commands have a special meaning inside the header: $title, +# $datetime, $date, $doxygenversion, $projectname, $projectnumber, +# $projectbrief, $projectlogo. Doxygen will replace $title with the empty +# string, for the replacement values of the other commands the user is referred +# to HTML_HEADER. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_HEADER           = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for the +# generated LaTeX document. The footer should contain everything after the last +# chapter. If it is left blank doxygen will generate a standard footer. See +# LATEX_HEADER for more information on how to generate a default footer and what +# special commands can be used inside the footer. +# +# Note: Only use a user-defined footer if you know what you are doing! +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_FOOTER           = + +# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined +# LaTeX style sheets that are included after the standard style sheets created +# by doxygen. Using this option one can overrule certain style aspects. Doxygen +# will copy the style sheet files to the output directory. +# Note: The order of the extra style sheet files is of importance (e.g. the last +# style sheet in the list overrules the setting of the previous ones in the +# list). +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EXTRA_STYLESHEET = + +# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the LATEX_OUTPUT output +# directory. Note that the files will be copied as-is; there are no commands or +# markers available. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_EXTRA_FILES      = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is +# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will +# contain links (just like the HTML output) instead of page references. This +# makes the output suitable for online browsing using a PDF viewer. +# The default value is: YES. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +PDF_HYPERLINKS         = YES + +# If the USE_PDFLATEX tag is set to YES, doxygen will use pdflatex to generate +# the PDF file directly from the LaTeX files. Set this option to YES, to get a +# higher quality PDF documentation. +# The default value is: YES. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +USE_PDFLATEX           = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode +# command to the generated LaTeX files. This will instruct LaTeX to keep running +# if errors occur, instead of asking the user for help. This option is also used +# when generating formulas in HTML. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_BATCHMODE        = NO + +# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the +# index chapters (such as File Index, Compound Index, etc.) in the output. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_HIDE_INDICES     = NO + +# If the LATEX_SOURCE_CODE tag is set to YES then doxygen will include source +# code with syntax highlighting in the LaTeX output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_SOURCE_CODE      = NO + +# The LATEX_BIB_STYLE tag can be used to specify the style to use for the +# bibliography, e.g. plainnat, or ieeetr. See +# http://en.wikipedia.org/wiki/BibTeX and \cite for more info. +# The default value is: plain. +# This tag requires that the tag GENERATE_LATEX is set to YES. + +LATEX_BIB_STYLE        = plain + +#--------------------------------------------------------------------------- +# Configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The +# RTF output is optimized for Word 97 and may not look too pretty with other RTF +# readers/editors. +# The default value is: NO. + +GENERATE_RTF           = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: rtf. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_OUTPUT             = rtf + +# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF +# documents. This may be useful for small projects and may help to save some +# trees in general. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +COMPACT_RTF            = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will +# contain hyperlink fields. The RTF file will contain links (just like the HTML +# output) instead of page references. This makes the output suitable for online +# browsing using Word or some other Word compatible readers that support those +# fields. +# +# Note: WordPad (write) and others do not support links. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_HYPERLINKS         = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's config +# file, i.e. a series of assignments. You only have to provide replacements, +# missing definitions are set to their default value. +# +# See also section "Doxygen usage" for information on how to generate the +# default style sheet that doxygen normally uses. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_STYLESHEET_FILE    = + +# Set optional variables used in the generation of an RTF document. Syntax is +# similar to doxygen's config file. A template extensions file can be generated +# using doxygen -e rtf extensionFile. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_EXTENSIONS_FILE    = + +# If the RTF_SOURCE_CODE tag is set to YES then doxygen will include source code +# with syntax highlighting in the RTF output. +# +# Note that which sources are shown also depends on other settings such as +# SOURCE_BROWSER. +# The default value is: NO. +# This tag requires that the tag GENERATE_RTF is set to YES. + +RTF_SOURCE_CODE        = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for +# classes and files. +# The default value is: NO. + +GENERATE_MAN           = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. A directory man3 will be created inside the directory specified by +# MAN_OUTPUT. +# The default directory is: man. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_OUTPUT             = man + +# The MAN_EXTENSION tag determines the extension that is added to the generated +# man pages. In case the manual section does not start with a number, the number +# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is +# optional. +# The default value is: .3. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_EXTENSION          = .3 + +# The MAN_SUBDIR tag determines the name of the directory created within +# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by +# MAN_EXTENSION with the initial . removed. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_SUBDIR             = + +# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it +# will generate one additional man file for each entity documented in the real +# man page(s). These additional files only source the real man page, but without +# them the man command would be unable to find the correct page. +# The default value is: NO. +# This tag requires that the tag GENERATE_MAN is set to YES. + +MAN_LINKS              = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that +# captures the structure of the code including all documentation. +# The default value is: NO. + +GENERATE_XML           = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a +# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of +# it. +# The default directory is: xml. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_OUTPUT             = xml + +# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program +# listings (including syntax highlighting and cross-referencing information) to +# the XML output. Note that enabling this will significantly increase the size +# of the XML output. +# The default value is: YES. +# This tag requires that the tag GENERATE_XML is set to YES. + +XML_PROGRAMLISTING     = YES + +#--------------------------------------------------------------------------- +# Configuration options related to the DOCBOOK output +#--------------------------------------------------------------------------- + +# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files +# that can be used to generate PDF. +# The default value is: NO. + +GENERATE_DOCBOOK       = NO + +# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in +# front of it. +# The default directory is: docbook. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. + +DOCBOOK_OUTPUT         = docbook + +# If the DOCBOOK_PROGRAMLISTING tag is set to YES, doxygen will include the +# program listings (including syntax highlighting and cross-referencing +# information) to the DOCBOOK output. Note that enabling this will significantly +# increase the size of the DOCBOOK output. +# The default value is: NO. +# This tag requires that the tag GENERATE_DOCBOOK is set to YES. + +DOCBOOK_PROGRAMLISTING = NO + +#--------------------------------------------------------------------------- +# Configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an +# AutoGen Definitions (see http://autogen.sf.net) file that captures the +# structure of the code including all documentation. Note that this feature is +# still experimental and incomplete at the moment. +# The default value is: NO. + +GENERATE_AUTOGEN_DEF   = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module +# file that captures the structure of the code including all documentation. +# +# Note that this feature is still experimental and incomplete at the moment. +# The default value is: NO. + +GENERATE_PERLMOD       = NO + +# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary +# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI +# output from the Perl module output. +# The default value is: NO. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. + +PERLMOD_LATEX          = NO + +# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely +# formatted so it can be parsed by a human reader. This is useful if you want to +# understand what is going on. On the other hand, if this tag is set to NO, the +# size of the Perl module output will be much smaller and Perl will parse it +# just the same. +# The default value is: YES. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. + +PERLMOD_PRETTY         = YES + +# The names of the make variables in the generated doxyrules.make file are +# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful +# so different doxyrules.make files included by the same Makefile don't +# overwrite each other's variables. +# This tag requires that the tag GENERATE_PERLMOD is set to YES. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all +# C-preprocessor directives found in the sources and include files. +# The default value is: YES. + +ENABLE_PREPROCESSING   = YES + +# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names +# in the source code. If set to NO, only conditional compilation will be +# performed. Macro expansion can be done in a controlled way by setting +# EXPAND_ONLY_PREDEF to YES. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +MACRO_EXPANSION        = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then +# the macro expansion is limited to the macros specified with the PREDEFINED and +# EXPAND_AS_DEFINED tags. +# The default value is: NO. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +EXPAND_ONLY_PREDEF     = YES + +# If the SEARCH_INCLUDES tag is set to YES, the include files in the +# INCLUDE_PATH will be searched if a #include is found. +# The default value is: YES. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +SEARCH_INCLUDES        = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by the +# preprocessor. +# This tag requires that the tag SEARCH_INCLUDES is set to YES. + +INCLUDE_PATH           = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will be +# used. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +INCLUDE_FILE_PATTERNS  = + +# The PREDEFINED tag can be used to specify one or more macro names that are +# defined before the preprocessor is started (similar to the -D option of e.g. +# gcc). The argument of the tag is a list of macros of the form: name or +# name=definition (no spaces). If the definition and the "=" are omitted, "=1" +# is assumed. To prevent a macro definition from being undefined via #undef or +# recursively expanded use the := operator instead of the = operator. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +PREDEFINED             = __DOXYGEN__ \ +                         PROGMEM \ +                         EEMEM \ +                         ATTR_PACKED + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this +# tag can be used to specify a list of macro names that should be expanded. The +# macro definition that is found in the sources will be used. Use the PREDEFINED +# tag if you want to use a different macro definition that overrules the +# definition found in the source code. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +EXPAND_AS_DEFINED      = + +# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will +# remove all references to function-like macros that are alone on a line, have +# an all uppercase name, and do not end with a semicolon. Such function macros +# are typically used for boiler-plate code, and will confuse the parser if not +# removed. +# The default value is: YES. +# This tag requires that the tag ENABLE_PREPROCESSING is set to YES. + +SKIP_FUNCTION_MACROS   = YES + +#--------------------------------------------------------------------------- +# Configuration options related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES tag can be used to specify one or more tag files. For each tag +# file the location of the external documentation should be added. The format of +# a tag file without this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where loc1 and loc2 can be relative or absolute paths or URLs. See the +# section "Linking to external documentation" for more information about the use +# of tag files. +# Note: Each tag file must have a unique name (where the name does NOT include +# the path). If a tag file is not located in the directory in which doxygen is +# run, you must also specify the path to the tagfile here. + +TAGFILES               = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create a +# tag file that is based on the input files it reads. See section "Linking to +# external documentation" for more information about the usage of tag files. + +GENERATE_TAGFILE       = + +# If the ALLEXTERNALS tag is set to YES, all external class will be listed in +# the class index. If set to NO, only the inherited external classes will be +# listed. +# The default value is: NO. + +ALLEXTERNALS           = NO + +# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will be +# listed. +# The default value is: YES. + +EXTERNAL_GROUPS        = YES + +# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in +# the related pages index. If set to NO, only the current project's pages will +# be listed. +# The default value is: YES. + +EXTERNAL_PAGES         = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of 'which perl'). +# The default file (with absolute path) is: /usr/bin/perl. + +PERL_PATH              = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES, doxygen will generate a class diagram +# (in HTML and LaTeX) for classes with base or super classes. Setting the tag to +# NO turns the diagrams off. Note that this option also works with HAVE_DOT +# disabled, but it is recommended to install and use dot, since it yields more +# powerful graphs. +# The default value is: YES. + +CLASS_DIAGRAMS         = NO + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see: +# http://www.mcternan.me.uk/mscgen/)) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH            = + +# You can include diagrams made with dia in doxygen documentation. Doxygen will +# then run dia to produce the diagram and insert it in the documentation. The +# DIA_PATH tag allows you to specify the directory where the dia binary resides. +# If left empty dia is assumed to be found in the default search path. + +DIA_PATH               = + +# If set to YES the inheritance and collaboration graphs will hide inheritance +# and usage relations if the target is undocumented or is not a class. +# The default value is: YES. + +HIDE_UNDOC_RELATIONS   = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz (see: +# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent +# Bell Labs. The other options in this section have no effect if this option is +# set to NO +# The default value is: NO. + +HAVE_DOT               = NO + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed +# to run in parallel. When set to 0 doxygen will base this on the number of +# processors available in the system. You can set it explicitly to a value +# larger than 0 to get control over the balance between CPU load and processing +# speed. +# Minimum value: 0, maximum value: 32, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_NUM_THREADS        = 0 + +# When you want a differently looking font in the dot files that doxygen +# generates you can specify the font name using DOT_FONTNAME. You need to make +# sure dot is able to find the font, which can be done by putting it in a +# standard location or by setting the DOTFONTPATH environment variable or by +# setting DOT_FONTPATH to the directory containing the font. +# The default value is: Helvetica. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTNAME           = + +# The DOT_FONTSIZE tag can be used to set the size (in points) of the font of +# dot graphs. +# Minimum value: 4, maximum value: 24, default value: 10. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTSIZE           = 10 + +# By default doxygen will tell dot to use the default font as specified with +# DOT_FONTNAME. If you specify a different font using DOT_FONTNAME you can set +# the path where dot can find it using this tag. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_FONTPATH           = + +# If the CLASS_GRAPH tag is set to YES then doxygen will generate a graph for +# each documented class showing the direct and indirect inheritance relations. +# Setting this tag to YES will force the CLASS_DIAGRAMS tag to NO. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +CLASS_GRAPH            = NO + +# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a +# graph for each documented class showing the direct and indirect implementation +# dependencies (inheritance, containment, and class references variables) of the +# class with other documented classes. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +COLLABORATION_GRAPH    = NO + +# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for +# groups, showing the direct groups dependencies. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GROUP_GRAPHS           = YES + +# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LOOK               = NO + +# If the UML_LOOK tag is enabled, the fields and methods are shown inside the +# class node. If there are many fields or methods and many nodes the graph may +# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the +# number of items for each type to make the size more manageable. Set this to 0 +# for no limit. Note that the threshold may be exceeded by 50% before the limit +# is enforced. So when you set the threshold to 10, up to 15 fields may appear, +# but if the number exceeds 15, the total amount of fields shown is limited to +# 10. +# Minimum value: 0, maximum value: 100, default value: 10. +# This tag requires that the tag HAVE_DOT is set to YES. + +UML_LIMIT_NUM_FIELDS   = 10 + +# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and +# collaboration graphs will show the relations between templates and their +# instances. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +TEMPLATE_RELATIONS     = NO + +# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to +# YES then doxygen will generate a graph for each documented file showing the +# direct and indirect include dependencies of the file with other documented +# files. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDE_GRAPH          = YES + +# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are +# set to YES then doxygen will generate a graph for each documented file showing +# the direct and indirect include dependencies of the file with other documented +# files. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +INCLUDED_BY_GRAPH      = YES + +# If the CALL_GRAPH tag is set to YES then doxygen will generate a call +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable call graphs for selected +# functions only using the \callgraph command. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALL_GRAPH             = NO + +# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller +# dependency graph for every global function or class method. +# +# Note that enabling this option will significantly increase the time of a run. +# So in most cases it will be better to enable caller graphs for selected +# functions only using the \callergraph command. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +CALLER_GRAPH           = NO + +# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical +# hierarchy of all classes instead of a textual one. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GRAPHICAL_HIERARCHY    = NO + +# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the +# dependencies a directory has on other directories in a graphical way. The +# dependency relations are determined by the #include relations between the +# files in the directories. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +DIRECTORY_GRAPH        = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. +# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order +# to make the SVG files visible in IE 9+ (other browsers do not have this +# requirement). +# Possible values are: png, jpg, gif and svg. +# The default value is: png. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_IMAGE_FORMAT       = png + +# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to +# enable generation of interactive SVG images that allow zooming and panning. +# +# Note that this requires a modern browser other than Internet Explorer. Tested +# and working are Firefox, Chrome, Safari, and Opera. +# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make +# the SVG files visible. Older versions of IE do not have SVG support. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +INTERACTIVE_SVG        = NO + +# The DOT_PATH tag can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_PATH               = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the \dotfile +# command). +# This tag requires that the tag HAVE_DOT is set to YES. + +DOTFILE_DIRS           = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the \mscfile +# command). + +MSCFILE_DIRS           = + +# The DIAFILE_DIRS tag can be used to specify one or more directories that +# contain dia files that are included in the documentation (see the \diafile +# command). + +DIAFILE_DIRS           = + +# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the +# path where java can find the plantuml.jar file. If left blank, it is assumed +# PlantUML is not used or called during a preprocessing step. Doxygen will +# generate a warning when it encounters a \startuml command in this case and +# will not generate output for the diagram. + +PLANTUML_JAR_PATH      = + +# When using plantuml, the specified paths are searched for files specified by +# the !include statement in a plantuml block. + +PLANTUML_INCLUDE_PATH  = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes +# that will be shown in the graph. If the number of nodes in a graph becomes +# larger than this value, doxygen will truncate the graph, which is visualized +# by representing a node as a red box. Note that doxygen if the number of direct +# children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that +# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. +# Minimum value: 0, maximum value: 10000, default value: 50. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_GRAPH_MAX_NODES    = 15 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs +# generated by dot. A depth value of 3 means that only nodes reachable from the +# root by following a path via at most 3 edges will be shown. Nodes that lay +# further from the root node will be omitted. Note that setting this option to 1 +# or 2 may greatly reduce the computation time needed for large code bases. Also +# note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. +# Minimum value: 0, maximum value: 1000, default value: 0. +# This tag requires that the tag HAVE_DOT is set to YES. + +MAX_DOT_GRAPH_DEPTH    = 2 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not seem +# to support this out of the box. +# +# Warning: Depending on the platform used, enabling this option may lead to +# badly anti-aliased labels on the edges of a graph (i.e. they become hard to +# read). +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_TRANSPARENT        = YES + +# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) support +# this, this feature is disabled by default. +# The default value is: NO. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_MULTI_TARGETS      = NO + +# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page +# explaining the meaning of the various boxes and arrows in the dot generated +# graphs. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +GENERATE_LEGEND        = YES + +# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate dot +# files that are used to generate the various graphs. +# The default value is: YES. +# This tag requires that the tag HAVE_DOT is set to YES. + +DOT_CLEANUP            = YES diff --git a/lib/lufa/LUFA/makefile b/lib/lufa/LUFA/makefile new file mode 100644 index 0000000000..7e7a9c3afb --- /dev/null +++ b/lib/lufa/LUFA/makefile @@ -0,0 +1,40 @@ +# +#             LUFA Library +#     Copyright (C) Dean Camera, 2017. +# +#  dean [at] fourwalledcubicle [dot] com +#           www.lufa-lib.org +# +# --------------------------------------- +#  Makefile for the LUFA library itself. +# --------------------------------------- + +LUFA_VERSION_NUM := $(shell grep LUFA_VERSION_STRING $(LUFA_PATH)/Version.h | cut -d'"' -f2) + +# Default target - no default action when attempting to build the core directly +all: + +# Display the LUFA version of this library copy +version: +	@echo "LUFA $(LUFA_VERSION_NUM)" + +LUFA_PATH               := . +ARCH                    := {AVR8,UC3,XMEGA} +DOXYGEN_OVERRIDE_PARAMS := QUIET=YES PROJECT_NUMBER=$(LUFA_VERSION_NUM) + +# Remove all object and associated files from the LUFA library core +clean: +	rm -f $(LUFA_SRC_ALL_FILES:%.c=%.o) +	rm -f $(LUFA_SRC_ALL_FILES:%.c=%.d) +	rm -f $(LUFA_SRC_ALL_FILES:%.c=%.lst) + +# Include LUFA-specific DMBS extension modules +DMBS_LUFA_PATH ?= $(LUFA_PATH)/Build/LUFA +include $(DMBS_LUFA_PATH)/lufa-sources.mk + +# Include common DMBS build system modules +DMBS_PATH      ?= $(LUFA_PATH)/Build/DMBS/DMBS +include $(DMBS_PATH)/core.mk +include $(DMBS_PATH)/doxygen.mk + +.PHONY: all version  | 
