From 044ad7c3987460ede48ff27afd6bdb0ca05a0432 Mon Sep 17 00:00:00 2001
From: Harald Welte <laforge@gnumonks.org>
Date: Mon, 4 Jul 2011 20:52:54 +0200
Subject: import at91lib from at91lib_20100901_softpack_1_9_v_1_0_svn_v15011

it's sad to see that atmel doesn't publish their svn repo or has
a centralized location or even puts proper version/release info
into the library itself
---
 usb/common/core/USBConfigurationDescriptor.c       | 162 ++++++++++++++
 usb/common/core/USBConfigurationDescriptor.h       | 150 +++++++++++++
 usb/common/core/USBConfigurationOTG.c              |  51 +++++
 usb/common/core/USBConfigurationOTG.h              | 118 ++++++++++
 usb/common/core/USBDeviceDescriptor.h              | 125 +++++++++++
 usb/common/core/USBDeviceQualifierDescriptor.h     |  89 ++++++++
 usb/common/core/USBEndpointDescriptor.c            | 109 +++++++++
 usb/common/core/USBEndpointDescriptor.h            | 224 +++++++++++++++++++
 usb/common/core/USBFeatureRequest.c                |  70 ++++++
 usb/common/core/USBFeatureRequest.h                | 146 ++++++++++++
 usb/common/core/USBGenericDescriptor.c             |  80 +++++++
 usb/common/core/USBGenericDescriptor.h             | 133 +++++++++++
 usb/common/core/USBGenericRequest.c                | 138 ++++++++++++
 usb/common/core/USBGenericRequest.h                | 244 +++++++++++++++++++++
 usb/common/core/USBGetDescriptorRequest.c          |  72 ++++++
 usb/common/core/USBGetDescriptorRequest.h          |  67 ++++++
 .../core/USBInterfaceAssociationDescriptor.h       |  86 ++++++++
 usb/common/core/USBInterfaceDescriptor.h           |  87 ++++++++
 usb/common/core/USBInterfaceRequest.c              |  69 ++++++
 usb/common/core/USBInterfaceRequest.h              |  68 ++++++
 usb/common/core/USBIrqHandler.c                    |  62 ++++++
 usb/common/core/USBIrqHandler.h                    |  52 +++++
 usb/common/core/USBSetAddressRequest.c             |  56 +++++
 usb/common/core/USBSetAddressRequest.h             |  60 +++++
 usb/common/core/USBSetConfigurationRequest.c       |  58 +++++
 usb/common/core/USBSetConfigurationRequest.h       |  61 ++++++
 usb/common/core/USBStringDescriptor.h              |  74 +++++++
 usb/common/core/core.dir                           |  53 +++++
 28 files changed, 2764 insertions(+)
 create mode 100644 usb/common/core/USBConfigurationDescriptor.c
 create mode 100644 usb/common/core/USBConfigurationDescriptor.h
 create mode 100644 usb/common/core/USBConfigurationOTG.c
 create mode 100644 usb/common/core/USBConfigurationOTG.h
 create mode 100644 usb/common/core/USBDeviceDescriptor.h
 create mode 100644 usb/common/core/USBDeviceQualifierDescriptor.h
 create mode 100644 usb/common/core/USBEndpointDescriptor.c
 create mode 100644 usb/common/core/USBEndpointDescriptor.h
 create mode 100644 usb/common/core/USBFeatureRequest.c
 create mode 100644 usb/common/core/USBFeatureRequest.h
 create mode 100644 usb/common/core/USBGenericDescriptor.c
 create mode 100644 usb/common/core/USBGenericDescriptor.h
 create mode 100644 usb/common/core/USBGenericRequest.c
 create mode 100644 usb/common/core/USBGenericRequest.h
 create mode 100644 usb/common/core/USBGetDescriptorRequest.c
 create mode 100644 usb/common/core/USBGetDescriptorRequest.h
 create mode 100644 usb/common/core/USBInterfaceAssociationDescriptor.h
 create mode 100644 usb/common/core/USBInterfaceDescriptor.h
 create mode 100644 usb/common/core/USBInterfaceRequest.c
 create mode 100644 usb/common/core/USBInterfaceRequest.h
 create mode 100644 usb/common/core/USBIrqHandler.c
 create mode 100644 usb/common/core/USBIrqHandler.h
 create mode 100644 usb/common/core/USBSetAddressRequest.c
 create mode 100644 usb/common/core/USBSetAddressRequest.h
 create mode 100644 usb/common/core/USBSetConfigurationRequest.c
 create mode 100644 usb/common/core/USBSetConfigurationRequest.h
 create mode 100644 usb/common/core/USBStringDescriptor.h
 create mode 100644 usb/common/core/core.dir

(limited to 'usb/common/core')

diff --git a/usb/common/core/USBConfigurationDescriptor.c b/usb/common/core/USBConfigurationDescriptor.c
new file mode 100644
index 0000000..503dceb
--- /dev/null
+++ b/usb/common/core/USBConfigurationDescriptor.c
@@ -0,0 +1,162 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/*
+    Title: USBConfigurationDescriptor implementation
+
+    About: Purpose
+        Implementation of the USBConfigurationDescriptor class.
+*/
+
+//-----------------------------------------------------------------------------
+//         Headers
+//-----------------------------------------------------------------------------
+
+#include "USBConfigurationDescriptor.h"
+
+//-----------------------------------------------------------------------------
+//         Exported functions
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+/// Returns the total length of a configuration, i.e. including the 
+/// descriptors following it.
+/// \param configuration Pointer to a USBConfigurationDescriptor instance.
+/// \return Total length (in bytes) of the configuration.
+//-----------------------------------------------------------------------------
+unsigned int USBConfigurationDescriptor_GetTotalLength(
+    const USBConfigurationDescriptor *configuration)
+{
+    return configuration->wTotalLength;
+}
+
+//-----------------------------------------------------------------------------
+/// Returns the number of interfaces in a configuration.
+/// \param configuration Pointer to a USBConfigurationDescriptor instance.
+/// \return Number of interfaces in configuration.
+//-----------------------------------------------------------------------------
+unsigned char USBConfigurationDescriptor_GetNumInterfaces(
+    const USBConfigurationDescriptor *configuration)
+{
+    return configuration->bNumInterfaces;
+}
+
+//-----------------------------------------------------------------------------
+/// Indicates if the device is self-powered when in a given configuration.
+/// \param configuration Pointer to a USBConfigurationDescriptor instance.
+/// \return 1 if the device is self-powered when in the given configuration;
+///         otherwise 0.
+//-----------------------------------------------------------------------------
+unsigned char USBConfigurationDescriptor_IsSelfPowered(
+    const USBConfigurationDescriptor *configuration)
+{
+    if ((configuration->bmAttributes & (1 << 6)) != 0) {
+
+        return 1;
+    }
+    else {
+
+        return 0;
+    }
+}
+
+//-----------------------------------------------------------------------------
+/// Parses the given Configuration descriptor (followed by relevant
+/// interface, endpoint and class-specific descriptors) into three arrays.
+/// *Each array must have its size equal or greater to the number of
+/// descriptors it stores plus one*. A null-value is inserted after the last
+/// descriptor of each type to indicate the array end.
+///
+/// Note that if the pointer to an array is null (0), nothing is stored in
+/// it.
+/// \param configuration Pointer to the start of the whole Configuration 
+///                      descriptor.
+/// \param interfaces    Pointer to the Interface descriptor array.
+/// \param endpoints     Pointer to the Endpoint descriptor array.
+/// \param others        Pointer to the class-specific descriptor array.
+//-----------------------------------------------------------------------------
+void USBConfigurationDescriptor_Parse(
+    const USBConfigurationDescriptor *configuration,
+    USBInterfaceDescriptor **interfaces,
+    USBEndpointDescriptor **endpoints,
+    USBGenericDescriptor **others)
+{
+    // Get size of configuration to parse
+    int size = USBConfigurationDescriptor_GetTotalLength(configuration);
+    size -= sizeof(USBConfigurationDescriptor);
+
+    // Start parsing descriptors
+    USBGenericDescriptor *descriptor = (USBGenericDescriptor *) configuration;
+    while (size > 0) {
+
+        // Get next descriptor
+        descriptor = USBGenericDescriptor_GetNextDescriptor(descriptor);
+        size -= USBGenericDescriptor_GetLength(descriptor);
+
+        // Store descriptor in correponding array
+        if (USBGenericDescriptor_GetType(descriptor)
+             == USBGenericDescriptor_INTERFACE) {
+
+            if (interfaces) {
+            
+                *interfaces = (USBInterfaceDescriptor *) descriptor;
+                interfaces++;
+            }
+        }
+        else if (USBGenericDescriptor_GetType(descriptor)
+                  == USBGenericDescriptor_ENDPOINT) {
+
+            if (endpoints) {
+                
+                *endpoints = (USBEndpointDescriptor *) descriptor;
+                endpoints++;
+            }
+        }
+        else if (others) {
+
+            *others = descriptor;
+            others++;
+        }
+    }
+
+    // Null-terminate arrays
+    if (interfaces) {
+
+        *interfaces = 0;
+    }
+    if (endpoints) {
+
+        *endpoints = 0;
+    }
+    if (others) {
+
+        *others = 0;
+    }
+}
+
diff --git a/usb/common/core/USBConfigurationDescriptor.h b/usb/common/core/USBConfigurationDescriptor.h
new file mode 100644
index 0000000..150e656
--- /dev/null
+++ b/usb/common/core/USBConfigurationDescriptor.h
@@ -0,0 +1,150 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/**
+ \unit
+ !!!Purpose
+ 
+    Definitions and methods for USB configuration descriptor structures
+    described by the USB specification.
+
+ !!!Usage
+
+    -# Declare USBConfigurationDescriptor instance as a part
+       of the configuration descriptors of a USB device.
+    -# To get useful information (field values) from the defined USB device
+       configuration descriptor, use
+       - USBConfigurationDescriptor_GetTotalLength
+       - USBConfigurationDescriptor_GetNumInterfaces
+       - USBConfigurationDescriptor_IsSelfPowered
+    -# To pase the defined USB device configuration descriptor, use
+       - USBConfigurationDescriptor_Parse
+*/
+
+#ifndef USBCONFIGURATIONDESCRIPTOR_H
+#define USBCONFIGURATIONDESCRIPTOR_H
+
+//-----------------------------------------------------------------------------
+//         Headers
+//-----------------------------------------------------------------------------
+
+#include "USBGenericDescriptor.h"
+#include "USBInterfaceDescriptor.h"
+#include "USBEndpointDescriptor.h"
+
+//-----------------------------------------------------------------------------
+//         Definitions
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+/// \page "USB device Attributes"
+///
+/// This page lists the codes of the usb attributes.
+///
+/// !Attributes
+/// - USBConfigurationDescriptor_BUSPOWERED_NORWAKEUP
+/// - USBConfigurationDescriptor_SELFPOWERED_NORWAKEUP
+/// - USBConfigurationDescriptor_BUSPOWERED_RWAKEUP
+/// - USBConfigurationDescriptor_SELFPOWERED_RWAKEUP
+/// - USBConfigurationDescriptor_POWER
+
+/// Device is bus-powered and not support remote wake-up.
+#define USBConfigurationDescriptor_BUSPOWERED_NORWAKEUP  0x80
+/// Device is self-powered and not support remote wake-up.
+#define USBConfigurationDescriptor_SELFPOWERED_NORWAKEUP 0xC0
+/// Device is bus-powered  and supports remote wake-up.
+#define USBConfigurationDescriptor_BUSPOWERED_RWAKEUP    0xA0
+/// Device is self-powered and supports remote wake-up.
+#define USBConfigurationDescriptor_SELFPOWERED_RWAKEUP   0xE0
+
+/// Calculates the value of the power consumption field given the value in mA.
+/// \param power The power consumption value in mA
+/// \return The value that should be set to the field in descriptor
+#define USBConfigurationDescriptor_POWER(power)     (power / 2)
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+//         Types
+//-----------------------------------------------------------------------------
+
+#ifdef __ICCARM__          // IAR
+#pragma pack(1)            // IAR
+#define __attribute__(...) // IAR
+#endif                     // IAR
+
+//-----------------------------------------------------------------------------
+/// USB standard configuration descriptor structure.
+//-----------------------------------------------------------------------------
+typedef struct {
+
+   /// Size of the descriptor in bytes.
+   unsigned char bLength;
+   /// Descriptor type (USBDESC_CONFIGURATION of "USB Descriptor types").
+   unsigned char bDescriptorType;
+   /// Length of all descriptors returned along with this configuration
+   /// descriptor.
+   unsigned short wTotalLength;
+   /// Number of interfaces in this configuration.
+   unsigned char bNumInterfaces;
+   /// Value for selecting this configuration.
+   unsigned char bConfigurationValue; 
+   /// Index of the configuration string descriptor.
+   unsigned char iConfiguration;
+   /// Configuration characteristics.
+   unsigned char bmAttributes;
+   /// Maximum power consumption of the device when in this configuration.
+   unsigned char bMaxPower;           
+                                       
+} __attribute__ ((packed)) USBConfigurationDescriptor; // GCC
+
+#ifdef __ICCARM__          // IAR
+#pragma pack()             // IAR
+#endif                     // IAR
+
+//-----------------------------------------------------------------------------
+//         Exported functions
+//-----------------------------------------------------------------------------
+
+extern unsigned int USBConfigurationDescriptor_GetTotalLength(
+    const USBConfigurationDescriptor *configuration);
+
+extern unsigned char USBConfigurationDescriptor_GetNumInterfaces(
+    const USBConfigurationDescriptor *configuration);
+
+extern unsigned char USBConfigurationDescriptor_IsSelfPowered(
+    const USBConfigurationDescriptor *configuration);
+
+extern void USBConfigurationDescriptor_Parse(
+    const USBConfigurationDescriptor *configuration,
+    USBInterfaceDescriptor **interfaces,
+    USBEndpointDescriptor **endpoints,
+    USBGenericDescriptor **others);
+
+#endif //#ifndef USBCONFIGURATIONDESCRIPTOR_H
+
diff --git a/usb/common/core/USBConfigurationOTG.c b/usb/common/core/USBConfigurationOTG.c
new file mode 100644
index 0000000..c875790
--- /dev/null
+++ b/usb/common/core/USBConfigurationOTG.c
@@ -0,0 +1,51 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+//-----------------------------------------------------------------------------
+//      Includes
+//-----------------------------------------------------------------------------
+
+#include "USBConfigurationOTG.h"
+
+
+USBGenericOTGDescriptor *pOTGDescriptor;
+
+//-----------------------------------------------------------------------------
+//      Internal functions
+//-----------------------------------------------------------------------------
+
+//-----------------------------------------------------------------------------
+//      External functions
+//-----------------------------------------------------------------------------
+void OTG_Initialize(USBGenericOTGDescriptor *pOTGDesc)
+{
+    pOTGDescriptor = pOTGDesc;
+}
+
+
diff --git a/usb/common/core/USBConfigurationOTG.h b/usb/common/core/USBConfigurationOTG.h
new file mode 100644
index 0000000..d0d3b05
--- /dev/null
+++ b/usb/common/core/USBConfigurationOTG.h
@@ -0,0 +1,118 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+//------------------------------------------------------------------------------
+/// \unit
+///
+/// !Purpose
+/// 
+/// Methods and definitions for configuring OTG.
+/// 
+/// !Usage
+///
+/// -# 
+/// -# 
+///
+//------------------------------------------------------------------------------
+
+#ifndef USBCONFIGURATIONOTG_H
+#define USBCONFIGURATIONOTG_H
+
+#include <usb/otg/compiler.h>
+
+
+/// OTG specific configuration
+typedef struct {
+
+    /// USB MODE CONFIGURATION
+
+    /// ENABLE to activate the host software library support
+    /// Possible values ENABLE or DISABLE
+    unsigned char bOTGUsbHostFeature;
+
+    /// ENABLE to activate the device software library support
+    /// Possible values ENABLE or DISABLE
+    unsigned char bOTGUsbDeviceFeature;
+    /// OTG MODE CONFIGURATION
+    /// ENABLE to enable OTG module (support A- and B- Device roles)
+    /// Possible values ENABLE or DISABLE
+    unsigned char bOTGFeature;
+
+    /// For reduced host only allows to control VBUS generator with PIO PE.7
+    unsigned char bOTGSoftwareVbusCtrl;
+
+    /// Selects the messaging method for OTG No Silent Failure spec.
+    ///
+    /// A compliant OTG device must at least handle 3 Failure messages : 
+    ///   "Device No Response", "Unsupported Device" and "Unsupported Hub"
+    /// Functions must be defined for communicating messages to user (LCD display,
+    /// LEDs...)
+    /// The values available for this parameter are :
+    ///  - OTGMSG_ALL : all messages (events and failures) are displayed
+    ///     In this case, the following functions must be defined in user application firmware :
+    ///       # "void Otg_messaging_init(void)", this function is called at start up to initialize the messaging peripheral
+    ///       # "void Otg_output_failure_msg(U8)", displays the failure message choosen by ID number (see "usb_task.h")
+    ///       # "void Otg_output_failure_clear(void)", clears the current failure message
+    ///       # "void Otg_output_event_msg(U8)", displays the event message choosen by ID number
+    ///       # "void Otg_output_event_clear(void)", clears the current event message
+    ///  - OTGMSG_FAIL : only failure messages are displayed
+    ///     In this case, the following functions must be defined in user application firmware :
+    ///       # "void Otg_messaging_init(void)", this function is called at start up to initialize the messaging peripheral
+    ///       # "void Otg_output_failure_msg(U8)", displays the failure message choosen by ID number (see "usb_task.h")
+    ///       # "void Otg_output_failure_clear(void)", clears the current failure message
+    ///  - OTGMSG_NONE  : messages are not displayed (not OTG compliant device)
+    unsigned char bOTGMessagingOutput;
+
+    /// ENABLE to make the A-Device send a SetFeature(b_hnp_enable) just after a SRP
+    /// has been received
+    /// This feature must be ENABLE to pass the OTG compliance program
+    /// Possible values ENABLE or DISABLE
+    unsigned char bOTGEnableHNPAfterSRP;
+ 
+    /// Selects the SRP pulse for which the A Device will react and rise Vbus
+    /// The value is VBUS_PULSE or DATA_PULSE
+    unsigned char bOTGADevSRPReaction;
+
+} USBGenericOTGDescriptor;
+
+#define     OTGMSG_NONE     0   // no messages displayed
+#define     OTGMSG_FAIL     1   // only failure messages displayed
+#define     OTGMSG_ALL      2   // all messages displayed
+
+#define   VBUS_PULSE    1   // no more used
+#define   DATA_PULSE    0
+
+
+extern USBGenericOTGDescriptor *pOTGDescriptor;
+
+extern void OTG_Initialize(USBGenericOTGDescriptor *pOTGDesc);
+
+
+#endif //#ifndef USBCONFIGURATIONOTG_H
+
diff --git a/usb/common/core/USBDeviceDescriptor.h b/usb/common/core/USBDeviceDescriptor.h
new file mode 100644
index 0000000..ce8d199
--- /dev/null
+++ b/usb/common/core/USBDeviceDescriptor.h
@@ -0,0 +1,125 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/**
+ \unit
+ !!!Purpose
+
+    Class for manipulating USB device descriptors.
+
+ !!!Usage
+
+    - Declare a USBDeviceDescriptor instance as the device descriptor of a
+      USB device.
+*/
+
+#ifndef USBDEVICEDESCRIPTOR_H
+#define USBDEVICEDESCRIPTOR_H
+
+#include <board.h>
+//------------------------------------------------------------------------------
+//         Definitions
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "USB release numbers"
+///
+/// This page lists the codes of USB release numbers.
+///
+/// !Code
+/// - USBDeviceDescriptor_USB2_00
+
+/// The device supports USB 2.00.
+#define USBDeviceDescriptor_USB2_00         0x0200
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+//         Types
+//------------------------------------------------------------------------------
+
+#ifdef __ICCARM__          // IAR
+#pragma pack(1)            // IAR
+#define __attribute__(...) // IAR
+#endif                     // IAR
+
+//------------------------------------------------------------------------------
+/// USB standard device descriptor structure.
+//------------------------------------------------------------------------------
+typedef struct {
+
+   /// Size of this descriptor in bytes.
+   unsigned char bLength;
+   /// Descriptor type (USBGenericDescriptor_DEVICE).
+   unsigned char bDescriptorType;
+   /// USB specification release number in BCD format.
+   unsigned short bcdUSB;
+   /// Device class code.
+   unsigned char bDeviceClass;
+   /// Device subclass code.
+   unsigned char bDeviceSubClass;
+   /// Device protocol code.
+   unsigned char bDeviceProtocol;
+   /// Maximum packet size of endpoint 0 (in bytes).
+   unsigned char bMaxPacketSize0;
+   /// Vendor ID.
+   unsigned short idVendor;
+   /// Product ID.
+   unsigned short idProduct;
+   /// Device release number in BCD format.
+   unsigned short bcdDevice;
+   /// Index of the manufacturer string descriptor.
+   unsigned char iManufacturer;
+   /// Index of the product string descriptor.
+   unsigned char iProduct;
+   /// Index of the serial number string descriptor.
+   unsigned char iSerialNumber;
+   /// Number of possible configurations for the device.
+   unsigned char bNumConfigurations;
+
+} __attribute__ ((packed)) USBDeviceDescriptor; // GCC
+
+#if defined(CHIP_USB_OTGHS)
+typedef struct {
+
+   /// Size of this descriptor in bytes.
+   unsigned char bLength;
+   /// Descriptor type (USBGenericDescriptor_OTG).
+   unsigned char bDescriptorType;
+   /// Attribute Fields D7�2: Reserved D1: HNP support D0: SRP support
+   unsigned char bmAttributes;
+
+} __attribute__ ((packed)) USBOtgDescriptor; // GCC
+#endif
+
+#ifdef __ICCARM__          // IAR
+#pragma pack()             // IAR
+#endif                     // IAR
+
+#endif //#ifndef USBDEVICEDESCRIPTOR_H
+
diff --git a/usb/common/core/USBDeviceQualifierDescriptor.h b/usb/common/core/USBDeviceQualifierDescriptor.h
new file mode 100644
index 0000000..3728865
--- /dev/null
+++ b/usb/common/core/USBDeviceQualifierDescriptor.h
@@ -0,0 +1,89 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/**
+ \unit
+
+ !!!Purpose
+
+   Class for manipulating USB device qualifier descriptors.
+
+ !!!Usage
+
+   - Declare a USBDeviceQualifierDescriptor instance as the device qualifier
+     descriptor of a USB device.
+*/
+
+#ifndef USBDEVICEQUALIFIERDESCRIPTOR_H
+#define USBDEVICEQUALIFIERDESCRIPTOR_H
+
+//------------------------------------------------------------------------------
+//         Types
+//------------------------------------------------------------------------------
+
+#ifdef __ICCARM__          // IAR
+#pragma pack(1)            // IAR
+#define __attribute__(...) // IAR
+#endif                     // IAR
+
+//------------------------------------------------------------------------------
+/// Alternate device descriptor indicating the capabilities of the device
+/// in full-speed, if currently in high-speed; or in high-speed, if it is
+/// currently in full-speed. Only relevant for devices supporting the
+/// high-speed mode.
+//------------------------------------------------------------------------------
+typedef struct {
+
+   /// Size of the descriptor in bytes.
+   unsigned char bLength;
+   /// Descriptor type (USBDESC_DEVICE_QUALIFIER or "USB device types").
+   unsigned char bDescriptorType;
+   /// USB specification release number (in BCD format).
+   unsigned short bcdUSB;
+   /// Device class code.
+   unsigned char bDeviceClass;
+   /// Device subclass code.
+   unsigned char bDeviceSubClass;
+   /// Device protocol code.
+   unsigned char bDeviceProtocol;
+   /// Maximum packet size of endpoint 0.
+   unsigned char bMaxPacketSize0;
+   /// Number of possible configurations for the device.
+   unsigned char bNumConfigurations;
+   /// Reserved.
+   unsigned char bReserved;         
+
+} __attribute__ ((packed)) USBDeviceQualifierDescriptor; // GCC
+
+#ifdef __ICCARM__          // IAR
+#pragma pack()             // IAR
+#endif                     // IAR
+
+#endif //#ifndef USBDEVICEQUALIFIERDESCRIPTOR_H
+
diff --git a/usb/common/core/USBEndpointDescriptor.c b/usb/common/core/USBEndpointDescriptor.c
new file mode 100644
index 0000000..6300ade
--- /dev/null
+++ b/usb/common/core/USBEndpointDescriptor.c
@@ -0,0 +1,109 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/*
+    Title: USBEndpointDescriptor implementation
+
+    About: Purpose
+        Implementation of the USBEndpointDescriptor class.
+*/
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+
+#include "USBEndpointDescriptor.h"
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// Returns the number of an endpoint given its descriptor.
+/// \param endpoint Pointer to a USBEndpointDescriptor instance.
+/// \return Endpoint number.
+//------------------------------------------------------------------------------
+unsigned char USBEndpointDescriptor_GetNumber(
+    const USBEndpointDescriptor *endpoint)
+{
+    return endpoint->bEndpointAddress & 0xF;
+}
+
+//------------------------------------------------------------------------------
+/// Returns the direction of an endpoint given its descriptor.
+/// \param endpoint Pointer to a USBEndpointDescriptor instance.
+/// \return Endpoint direction (see <Endpoint directions>).
+//------------------------------------------------------------------------------
+unsigned char USBEndpointDescriptor_GetDirection(
+    const USBEndpointDescriptor *endpoint)
+{
+    if ((endpoint->bEndpointAddress & 0x80) != 0) {
+
+        return USBEndpointDescriptor_IN;
+    }
+    else {
+
+        return USBEndpointDescriptor_OUT;
+    }
+}
+
+//------------------------------------------------------------------------------
+/// Returns the type of an endpoint given its descriptor.
+/// \param endpoint Pointer to a USBEndpointDescriptor instance.
+/// \return Endpoint type (see <Endpoint types>).
+//------------------------------------------------------------------------------
+unsigned char USBEndpointDescriptor_GetType(
+    const USBEndpointDescriptor *endpoint)
+{
+    return endpoint->bmAttributes & 0x3;
+}
+
+//------------------------------------------------------------------------------
+/// Returns the maximum size of a packet (in bytes) on an endpoint given
+/// its descriptor.
+/// \param endpoint - Pointer to a USBEndpointDescriptor instance.
+/// \return Maximum packet size of endpoint.
+//------------------------------------------------------------------------------
+unsigned short USBEndpointDescriptor_GetMaxPacketSize(
+    const USBEndpointDescriptor *endpoint)
+{
+    return endpoint->wMaxPacketSize;
+}
+
+//------------------------------------------------------------------------------
+/// Returns the polling interval on an endpoint given its descriptor.
+/// \param endpoint - Pointer to a USBEndpointDescriptor instance.
+/// \return Polling interval of endpoint.
+//------------------------------------------------------------------------------
+unsigned char USBEndpointDescriptor_GetInterval(
+    const USBEndpointDescriptor *endpoint)
+{
+    return endpoint->bInterval;
+}
+
diff --git a/usb/common/core/USBEndpointDescriptor.h b/usb/common/core/USBEndpointDescriptor.h
new file mode 100644
index 0000000..d49e028
--- /dev/null
+++ b/usb/common/core/USBEndpointDescriptor.h
@@ -0,0 +1,224 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/**
+ \unit
+
+ !!!Purpose
+
+    Definition of a class for handling USB endpoint descriptors.
+
+ !!!Usage
+
+    -# Declare USBEndpointDescriptor instance as a part of the
+       configuration descriptors of a USB device.
+    -# To get useful information (field values) from the defined USB device
+       endpoint descriptor (to configure hardware for endpoints, etc), use
+       - USBEndpointDescriptor_GetNumber
+       - USBEndpointDescriptor_GetDirection
+       - USBEndpointDescriptor_GetType
+       - USBEndpointDescriptor_GetMaxPacketSize
+*/
+
+#ifndef USBENDPOINTDESCRIPTOR_H
+#define USBENDPOINTDESCRIPTOR_H
+
+//------------------------------------------------------------------------------
+//         Definitions
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "USB Endpoint definitions"
+///
+/// This page lists definitions and macro for endpoint descriptors.
+///
+/// - USB Endpoint directions
+///    - USBEndpointDescriptor_OUT 
+///    - USBEndpointDescriptor_IN
+///
+/// - USB Endpoint types
+///    - USBEndpointDescriptor_CONTROL
+///    - USBEndpointDescriptor_ISOCHRONOUS
+///    - USBEndpointDescriptor_BULK
+///    - USBEndpointDescriptor_INTERRUPT
+///
+/// - USB Endpoint maximun sizes
+///    - USBEndpointDescriptor_MAXCTRLSIZE_FS
+///    - USBEndpointDescriptor_MAXCTRLSIZE_HS
+///    - USBEndpointDescriptor_MAXBULKSIZE_FS
+///    - USBEndpointDescriptor_MAXBULKSIZE_HS
+///    - USBEndpointDescriptor_MAXINTERRUPTSIZE_FS
+///    - USBEndpointDescriptor_MAXINTERRUPTSIZE_HS
+///    - USBEndpointDescriptor_MAXISOCHRONOUSSIZE_FS
+///    - USBEndpointDescriptor_MAXISOCHRONOUSSIZE_HS
+///
+/// - USB Endpoint address define
+///    - USBEndpointDescriptor_ADDRESS
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "USB Endpoint directions"
+///
+/// This page lists definitions of USB endpoint directions.
+///
+/// !Directions
+/// - USBEndpointDescriptor_OUT
+/// - USBEndpointDescriptor_IN
+
+/// Endpoint receives data from the host.
+#define USBEndpointDescriptor_OUT           0
+/// Endpoint sends data to the host.
+#define USBEndpointDescriptor_IN            1
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "USB Endpoint types"
+///
+/// This page lists definitions of USB endpoint types.
+///
+/// !Types
+/// - USBEndpointDescriptor_CONTROL
+/// - USBEndpointDescriptor_ISOCHRONOUS
+/// - USBEndpointDescriptor_BULK
+/// - USBEndpointDescriptor_INTERRUPT
+
+/// Control endpoint type.
+#define USBEndpointDescriptor_CONTROL       0
+/// Isochronous endpoint type.
+#define USBEndpointDescriptor_ISOCHRONOUS   1
+/// Bulk endpoint type.
+#define USBEndpointDescriptor_BULK          2
+/// Interrupt endpoint type.
+#define USBEndpointDescriptor_INTERRUPT     3
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "USB Endpoint maximun sizes"
+///
+/// This page lists definitions of USB endpoint maximun sizes.
+///
+/// !Sizes
+/// - USBEndpointDescriptor_MAXCTRLSIZE_FS
+/// - USBEndpointDescriptor_MAXCTRLSIZE_HS
+/// - USBEndpointDescriptor_MAXBULKSIZE_FS
+/// - USBEndpointDescriptor_MAXBULKSIZE_HS
+/// - USBEndpointDescriptor_MAXINTERRUPTSIZE_FS
+/// - USBEndpointDescriptor_MAXINTERRUPTSIZE_HS
+/// - USBEndpointDescriptor_MAXISOCHRONOUSSIZE_FS
+/// - USBEndpointDescriptor_MAXISOCHRONOUSSIZE_HS
+
+/// Maximum size for a full-speed control endpoint.
+#define USBEndpointDescriptor_MAXCTRLSIZE_FS                64
+/// Maximum size for a high-speed control endpoint.
+#define USBEndpointDescriptor_MAXCTRLSIZE_HS                64
+/// Maximum size for a full-speed bulk endpoint.
+#define USBEndpointDescriptor_MAXBULKSIZE_FS                64
+/// Maximum size for a high-speed bulk endpoint.
+#define USBEndpointDescriptor_MAXBULKSIZE_HS                512
+/// Maximum size for a full-speed interrupt endpoint.
+#define USBEndpointDescriptor_MAXINTERRUPTSIZE_FS           64
+/// Maximum size for a high-speed interrupt endpoint.
+#define USBEndpointDescriptor_MAXINTERRUPTSIZE_HS           1024
+/// Maximum size for a full-speed isochronous endpoint.
+#define USBEndpointDescriptor_MAXISOCHRONOUSSIZE_FS         1023
+/// Maximum size for a high-speed isochronous endpoint.
+#define USBEndpointDescriptor_MAXISOCHRONOUSSIZE_HS         1024
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "USB Endpoint address define"
+///
+/// This page lists macro for USB endpoint address definition.
+///
+/// !Macro
+/// - USBEndpointDescriptor_ADDRESS
+
+/// Calculates the address of an endpoint given its number and direction
+/// \param direction USB endpoint direction definition
+/// \param number USB endpoint number
+/// \return The value used to set the endpoint descriptor based on input number
+///         and direction
+#define USBEndpointDescriptor_ADDRESS(direction, number) \
+    (((direction & 0x01) << 7) | (number & 0xF))
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+//         Types
+//------------------------------------------------------------------------------
+
+#ifdef __ICCARM__          // IAR
+#pragma pack(1)            // IAR
+#define __attribute__(...) // IAR
+#endif                     // IAR
+
+//------------------------------------------------------------------------------
+/// USB standard endpoint descriptor structure.
+//------------------------------------------------------------------------------
+typedef struct {
+
+   /// Size of the descriptor in bytes.
+   unsigned char bLength;
+   /// Descriptor type (<USBGenericDescriptor_ENDPOINT>).
+   unsigned char bDescriptorType;
+   /// Address and direction of the endpoint.
+   unsigned char bEndpointAddress;
+   /// Endpoint type and additional characteristics (for isochronous endpoints).
+   unsigned char bmAttributes;
+   /// Maximum packet size (in bytes) of the endpoint.
+   unsigned short wMaxPacketSize;
+   /// Polling rate of the endpoint.
+   unsigned char bInterval;
+
+} __attribute__ ((packed)) USBEndpointDescriptor; // GCC
+
+#ifdef __ICCARM__          // IAR
+#pragma pack()             // IAR
+#endif                     // IAR
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+
+extern unsigned char USBEndpointDescriptor_GetNumber(
+    const USBEndpointDescriptor *endpoint);
+
+extern unsigned char USBEndpointDescriptor_GetDirection(
+    const USBEndpointDescriptor *endpoint);
+
+extern unsigned char USBEndpointDescriptor_GetType(
+    const USBEndpointDescriptor *endpoint);
+
+extern unsigned short USBEndpointDescriptor_GetMaxPacketSize(
+    const USBEndpointDescriptor *endpoint);
+
+extern unsigned char USBEndpointDescriptor_GetInterval(
+    const USBEndpointDescriptor *endpoint);
+
+#endif //#ifndef USBENDPOINTDESCRIPTOR_H
+
diff --git a/usb/common/core/USBFeatureRequest.c b/usb/common/core/USBFeatureRequest.c
new file mode 100644
index 0000000..1e0422a
--- /dev/null
+++ b/usb/common/core/USBFeatureRequest.c
@@ -0,0 +1,70 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/*
+    Title: USBFeatureRequest implementation
+
+    About: Purpose
+        Implementation of the USBFeatureRequest class.
+*/
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+
+#include "USBFeatureRequest.h"
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// Returns the feature selector of a given CLEAR_FEATURE or SET_FEATURE
+/// request.
+/// \param request Pointer to a USBGenericRequest instance.
+/// \return Feature selector.
+//------------------------------------------------------------------------------
+unsigned char USBFeatureRequest_GetFeatureSelector(
+    const USBGenericRequest *request)
+{
+    return USBGenericRequest_GetValue(request);
+}
+
+//------------------------------------------------------------------------------
+/// Indicates the test that the device must undertake following a
+/// SET_FEATURE request.
+/// \param request Pointer to a USBGenericRequest instance.
+/// \return Test selector.
+//------------------------------------------------------------------------------
+unsigned char USBFeatureRequest_GetTestSelector(
+    const USBGenericRequest *request)
+{
+    return (USBGenericRequest_GetIndex(request) >> 8) & 0xFF;
+}
+
diff --git a/usb/common/core/USBFeatureRequest.h b/usb/common/core/USBFeatureRequest.h
new file mode 100644
index 0000000..0454ffb
--- /dev/null
+++ b/usb/common/core/USBFeatureRequest.h
@@ -0,0 +1,146 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/**
+ \unit
+
+ !!!Purpose
+
+    Definition of a class for manipulating CLEAR_FEATURE and SET_FEATURE
+    requests.
+
+ !!!Usage
+
+    - To get USB feature request information (field values) from the
+      USBGenericRequest instance, use
+       - USBFeatureRequest_GetFeatureSelector
+       - USBFeatureRequest_GetTestSelector
+*/
+
+#ifndef USBFEATUREREQUEST_H
+#define USBFEATUREREQUEST_H
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+
+#include "USBGenericRequest.h"
+
+//------------------------------------------------------------------------------
+//         Definitions
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "USB Feature Request definitions"
+///
+/// This page lists codes of USB Feature Request
+///
+/// - USB Feature selectors
+///    - USBFeatureRequest_ENDPOINTHALT
+///    - USBFeatureRequest_DEVICEREMOTEWAKEUP
+///    - USBFeatureRequest_TESTMODE
+///
+/// - USB Test mode selectors
+///    - USBFeatureRequest_TESTJ
+///    - USBFeatureRequest_TESTK
+///    - USBFeatureRequest_TESTSE0NAK
+///    - USBFeatureRequest_TESTPACKET
+///    - USBFeatureRequest_TESTFORCEENABLE
+///    - USBFeatureRequest_TESTSENDZLP
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "USB Feature selectors"
+///
+/// This page lists codes of USB feature selectors.
+///
+/// !Selectors
+/// - USBFeatureRequest_ENDPOINTHALT
+/// - USBFeatureRequest_DEVICEREMOTEWAKEUP
+/// - USBFeatureRequest_TESTMODE
+
+/// Halt feature of an endpoint.
+#define USBFeatureRequest_ENDPOINTHALT          0
+/// Remote wake-up feature of the device.
+#define USBFeatureRequest_DEVICEREMOTEWAKEUP    1
+/// Test mode of the device.
+#define USBFeatureRequest_TESTMODE              2
+/// OTG set feature
+#define USBFeatureRequest_OTG                0x0B
+//------------------------------------------------------------------------------
+
+/// On The Go Feature Selectors
+/// b_hnp_enable      3
+/// a_hnp_support     4
+/// a_alt_hnp_support 5
+#define USBFeatureRequest_OTG_B_HNP_ENABLE      3
+#define USBFeatureRequest_OTG_A_HNP_SUPPORT     4
+#define USBFeatureRequest_OTG_A_ALT_HNP_SUPPORT 5
+
+//------------------------------------------------------------------------------
+/// \page "USB Test mode selectors"
+///
+/// This page lists codes of USB high speed test mode selectors.
+///
+/// !Selectors
+/// - USBFeatureRequest_TESTJ
+/// - USBFeatureRequest_TESTK
+/// - USBFeatureRequest_TESTSE0NAK
+/// - USBFeatureRequest_TESTPACKET
+/// - USBFeatureRequest_TESTFORCEENABLE
+/// - USBFeatureRequest_TESTSENDZLP
+
+/// Tests the high-output drive level on the D+ line.
+#define USBFeatureRequest_TESTJ                 1
+/// Tests the high-output drive level on the D- line.
+#define USBFeatureRequest_TESTK                 2
+/// Tests the output impedance, low-level output voltage and loading
+/// characteristics.
+#define USBFeatureRequest_TESTSE0NAK            3
+/// Tests rise and fall times, eye patterns and jitter.
+#define USBFeatureRequest_TESTPACKET            4
+/// Tests the hub disconnect detection.
+#define USBFeatureRequest_TESTFORCEENABLE       5
+/// Send a ZLP in Test Mode.
+#define USBFeatureRequest_TESTSENDZLP           6
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+
+extern unsigned char USBFeatureRequest_GetFeatureSelector(
+    const USBGenericRequest *request);
+
+
+extern unsigned char USBFeatureRequest_GetTestSelector(
+    const USBGenericRequest *request);
+
+#endif //#ifndef USBFEATUREREQUEST_H
+
diff --git a/usb/common/core/USBGenericDescriptor.c b/usb/common/core/USBGenericDescriptor.c
new file mode 100644
index 0000000..99ed6f9
--- /dev/null
+++ b/usb/common/core/USBGenericDescriptor.c
@@ -0,0 +1,80 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/*
+    Title: USBGenericDescriptor implementation
+
+    About: Purpose
+        Implementation of the USBGenericDescriptor class.
+*/
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+
+#include "USBGenericDescriptor.h"
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// Returns the length of a descriptor.
+/// \param descriptor Pointer to a USBGenericDescriptor instance.
+/// \return Length of descriptor in bytes.
+//------------------------------------------------------------------------------
+unsigned int USBGenericDescriptor_GetLength(
+    const USBGenericDescriptor *descriptor)
+{
+    return descriptor->bLength;
+}
+
+//------------------------------------------------------------------------------
+/// Returns the type of a descriptor.
+/// \param descriptor Pointer to a USBGenericDescriptor instance.
+/// \return Type of descriptor.
+//------------------------------------------------------------------------------
+unsigned char USBGenericDescriptor_GetType(
+    const USBGenericDescriptor *descriptor)
+{
+    return descriptor->bDescriptorType;
+}
+
+//------------------------------------------------------------------------------
+/// Returns a pointer to the descriptor right after the given one, when
+/// parsing a Configuration descriptor.
+/// \param descriptor - Pointer to a USBGenericDescriptor instance.
+/// \return Pointer to the next descriptor.
+//------------------------------------------------------------------------------
+USBGenericDescriptor *USBGenericDescriptor_GetNextDescriptor(
+    const USBGenericDescriptor *descriptor)
+{
+    return (USBGenericDescriptor *)
+        (((char *) descriptor) + USBGenericDescriptor_GetLength(descriptor));
+}
diff --git a/usb/common/core/USBGenericDescriptor.h b/usb/common/core/USBGenericDescriptor.h
new file mode 100644
index 0000000..b1237ae
--- /dev/null
+++ b/usb/common/core/USBGenericDescriptor.h
@@ -0,0 +1,133 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+//------------------------------------------------------------------------------
+/// \unit
+///
+/// !!!Purpose
+///
+/// Definition of a generic USB descriptor class.
+///
+/// !!!Usage
+///
+/// -# Declare or access USB descriptors by USBGenericDescriptor instance.
+/// -# To get usful information (field values) from the USB descriptors, use
+///    - USBGenericDescriptor_GetLength
+///    - USBGenericDescriptor_GetType
+/// -# To scan the descriptors, use
+///    - USBGenericDescriptor_GetNextDescriptor
+//------------------------------------------------------------------------------
+
+#ifndef USBGENERICDESCRIPTOR_H
+#define USBGENERICDESCRIPTOR_H
+
+//------------------------------------------------------------------------------
+//         Definitions
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "USB Descriptor types"
+///
+/// This page lists the codes of the usb descriptor types
+///
+/// !Types
+/// - USBGenericDescriptor_DEVICE
+/// - USBGenericDescriptor_CONFIGURATION
+/// - USBGenericDescriptor_STRING
+/// - USBGenericDescriptor_INTERFACE
+/// - USBGenericDescriptor_ENDPOINT
+/// - USBGenericDescriptor_DEVICEQUALIFIER
+/// - USBGenericDescriptor_OTHERSPEEDCONFIGURATION
+/// - USBGenericDescriptor_INTERFACEPOWER
+/// - USBGenericDescriptor_OTG
+/// - USBGenericDescriptor_DEBUG
+/// - USBGenericDescriptor_INTERFACEASSOCIATION
+
+/// Device descriptor type.
+#define USBGenericDescriptor_DEVICE                     1
+/// Configuration descriptor type.
+#define USBGenericDescriptor_CONFIGURATION              2
+/// String descriptor type.
+#define USBGenericDescriptor_STRING                     3
+/// Interface descriptor type.
+#define USBGenericDescriptor_INTERFACE                  4
+/// Endpoint descriptor type.
+#define USBGenericDescriptor_ENDPOINT                   5
+/// Device qualifier descriptor type.
+#define USBGenericDescriptor_DEVICEQUALIFIER            6
+/// Other speed configuration descriptor type.
+#define USBGenericDescriptor_OTHERSPEEDCONFIGURATION    7
+/// Interface power descriptor type.
+#define USBGenericDescriptor_INTERFACEPOWER             8
+/// On-The-Go descriptor type.
+#define USBGenericDescriptor_OTG                        9
+/// Debug descriptor type.
+#define USBGenericDescriptor_DEBUG                      10
+/// Interface association descriptor type.
+#define USBGenericDescriptor_INTERFACEASSOCIATION       11
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+//         Types
+//------------------------------------------------------------------------------
+
+#ifdef __ICCARM__          // IAR
+#pragma pack(1)            // IAR
+#define __attribute__(...) // IAR
+#endif                     // IAR
+
+/// Holds the few fields shared by all USB descriptors.
+typedef struct {
+
+    /// Length of the descriptor in bytes.
+    unsigned char bLength;
+    /// Descriptor type.
+    unsigned char bDescriptorType;
+
+} __attribute__ ((packed)) USBGenericDescriptor; // GCC
+
+#ifdef __ICCARM__          // IAR
+#pragma pack()             // IAR
+#endif                     // IAR
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+
+extern unsigned int USBGenericDescriptor_GetLength(
+    const USBGenericDescriptor *descriptor);
+
+extern unsigned char USBGenericDescriptor_GetType(
+    const USBGenericDescriptor *descriptor);
+
+extern USBGenericDescriptor *USBGenericDescriptor_GetNextDescriptor(
+    const USBGenericDescriptor *descriptor);
+
+#endif //#ifndef USBGENERICDESCRIPTOR_H
+
diff --git a/usb/common/core/USBGenericRequest.c b/usb/common/core/USBGenericRequest.c
new file mode 100644
index 0000000..a3bbbfd
--- /dev/null
+++ b/usb/common/core/USBGenericRequest.c
@@ -0,0 +1,138 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/*
+    Title: USBGenericRequest implementation
+
+    About: Purpose
+        Implementation of the USBGenericRequest class.
+*/
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+
+#include "USBGenericRequest.h"
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+/// Returns the type of the given request.
+/// \param request Pointer to a USBGenericRequest instance.
+/// \return "USB Request Types"
+//------------------------------------------------------------------------------
+extern unsigned char USBGenericRequest_GetType(const USBGenericRequest *request)
+{
+    return ((request->bmRequestType >> 5) & 0x3);
+}
+
+//------------------------------------------------------------------------------
+/// Returns the request code of the given request.
+/// \param request Pointer to a USBGenericRequest instance.
+/// \return Request code.
+/// \sa "USB Request Codes"
+//------------------------------------------------------------------------------
+unsigned char USBGenericRequest_GetRequest(const USBGenericRequest *request)
+{
+    return request->bRequest;
+}
+
+//------------------------------------------------------------------------------
+/// Returns the wValue field of the given request.
+/// \param request - Pointer to a USBGenericRequest instance.
+/// \return Request value.
+//------------------------------------------------------------------------------
+unsigned short USBGenericRequest_GetValue(const USBGenericRequest *request)
+{
+    return request->wValue;
+}
+
+//------------------------------------------------------------------------------
+/// Returns the wIndex field of the given request.
+/// \param request Pointer to a USBGenericRequest instance.
+/// \return Request index;
+//------------------------------------------------------------------------------
+unsigned short USBGenericRequest_GetIndex(const USBGenericRequest *request)
+{
+    return request->wIndex;
+}
+
+//------------------------------------------------------------------------------
+/// Returns the expected length of the data phase following a request.
+/// \param request Pointer to a USBGenericRequest instance.
+/// \return Length of data phase.
+//------------------------------------------------------------------------------
+unsigned short USBGenericRequest_GetLength(const USBGenericRequest *request)
+{
+    return request->wLength;
+}
+
+//------------------------------------------------------------------------------
+/// Returns the endpoint number targetted by a given request.
+/// \param request Pointer to a USBGenericRequest instance.
+/// \return Endpoint number.
+//------------------------------------------------------------------------------
+unsigned char USBGenericRequest_GetEndpointNumber(
+    const USBGenericRequest *request)
+{
+    return USBGenericRequest_GetIndex(request) & 0xF;
+}
+
+//------------------------------------------------------------------------------
+/// Returns the intended recipient of a given request.
+/// \param request Pointer to a USBGenericRequest instance.
+/// \return Request recipient.
+/// \sa "USB Request Recipients"
+//------------------------------------------------------------------------------
+unsigned char USBGenericRequest_GetRecipient(const USBGenericRequest *request)
+{
+    // Recipient is in bits [0..4] of the bmRequestType field
+    return request->bmRequestType & 0xF;
+}
+
+//------------------------------------------------------------------------------
+/// Returns the direction of the data transfer following the given request.
+/// \param request Pointer to a USBGenericRequest instance.
+/// \return Transfer direction.
+/// \sa "USB Request Directions"
+//------------------------------------------------------------------------------
+unsigned char USBGenericRequest_GetDirection(const USBGenericRequest *request)
+{
+    // Transfer direction is located in bit D7 of the bmRequestType field
+    if ((request->bmRequestType & 0x80) != 0) {
+
+        return USBGenericRequest_IN;
+    }
+    else {
+
+        return USBGenericRequest_OUT;
+    }
+}
+
diff --git a/usb/common/core/USBGenericRequest.h b/usb/common/core/USBGenericRequest.h
new file mode 100644
index 0000000..77f8ca5
--- /dev/null
+++ b/usb/common/core/USBGenericRequest.h
@@ -0,0 +1,244 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/**
+ \unit
+
+ !!!Purpose
+
+    Definition of the USBGenericRequest class and its methods.
+
+ !!!Usage
+
+    -# Declare or access USB requests by USBGenericRequest instance.
+    -# To get usful information (field values) from the USB requests, use
+       - USBGenericRequest_GetType
+       - USBGenericRequest_GetRequest
+       - USBGenericRequest_GetValue
+       - USBGenericRequest_GetIndex
+       - USBGenericRequest_GetLength
+       - USBGenericRequest_GetEndpointNumber
+       - USBGenericRequest_GetRecipient
+       - USBGenericRequest_GetDirection
+*/
+
+#ifndef USBGENERICREQUEST_H
+#define USBGENERICREQUEST_H
+
+//------------------------------------------------------------------------------
+//         Definitions
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "USB Generic Request definitions"
+///
+/// This page lists the codes of USB generic request.
+///
+/// - USB Request codes
+///    - USBGenericRequest_GETSTATUS
+///    - USBGenericRequest_CLEARFEATURE
+///    - USBGenericRequest_SETFEATURE
+///    - USBGenericRequest_SETADDRESS
+///    - USBGenericRequest_GETDESCRIPTOR
+///    - USBGenericRequest_SETDESCRIPTOR
+///    - USBGenericRequest_GETCONFIGURATION
+///    - USBGenericRequest_SETCONFIGURATION
+///    - USBGenericRequest_GETINTERFACE
+///    - USBGenericRequest_SETINTERFACE
+///    - USBGenericRequest_SYNCHFRAME
+///
+/// - USB Request Recipients
+///    - USBGenericRequest_DEVICE
+///    - USBGenericRequest_INTERFACE
+///    - USBGenericRequest_ENDPOINT
+///    - USBGenericRequest_OTHER
+///
+/// - USB Request Types
+///    - USBGenericRequest_STANDARD
+///    - USBGenericRequest_CLASS
+///    - USBGenericRequest_VENDOR
+///
+/// - USB Request Directions
+///    - USBGenericRequest_IN
+///    - USBGenericRequest_OUT
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "USB Request codes"
+///
+/// This page lists the USB generic request codes.
+///
+/// !Codes
+/// - USBGenericRequest_GETSTATUS
+/// - USBGenericRequest_CLEARFEATURE
+/// - USBGenericRequest_SETFEATURE
+/// - USBGenericRequest_SETADDRESS
+/// - USBGenericRequest_GETDESCRIPTOR
+/// - USBGenericRequest_SETDESCRIPTOR
+/// - USBGenericRequest_GETCONFIGURATION
+/// - USBGenericRequest_SETCONFIGURATION
+/// - USBGenericRequest_GETINTERFACE
+/// - USBGenericRequest_SETINTERFACE
+/// - USBGenericRequest_SYNCHFRAME
+
+/// GET_STATUS request code.
+#define USBGenericRequest_GETSTATUS             0
+/// CLEAR_FEATURE request code.
+#define USBGenericRequest_CLEARFEATURE          1
+/// SET_FEATURE request code.
+#define USBGenericRequest_SETFEATURE            3
+/// SET_ADDRESS request code.
+#define USBGenericRequest_SETADDRESS            5
+/// GET_DESCRIPTOR request code.
+#define USBGenericRequest_GETDESCRIPTOR         6
+/// SET_DESCRIPTOR request code.
+#define USBGenericRequest_SETDESCRIPTOR         7
+/// GET_CONFIGURATION request code.
+#define USBGenericRequest_GETCONFIGURATION      8
+/// SET_CONFIGURATION request code.
+#define USBGenericRequest_SETCONFIGURATION      9
+/// GET_INTERFACE request code.
+#define USBGenericRequest_GETINTERFACE          10
+/// SET_INTERFACE request code.
+#define USBGenericRequest_SETINTERFACE          11
+/// SYNCH_FRAME request code.
+#define USBGenericRequest_SYNCHFRAME            12
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "USB Request Recipients"
+///
+/// This page lists codes of USB request recipients.
+///
+/// !Recipients
+/// - USBGenericRequest_DEVICE
+/// - USBGenericRequest_INTERFACE
+/// - USBGenericRequest_ENDPOINT
+/// - USBGenericRequest_OTHER
+
+/// Recipient is the whole device.
+#define USBGenericRequest_DEVICE                0
+/// Recipient is an interface.
+#define USBGenericRequest_INTERFACE             1
+/// Recipient is an endpoint.
+#define USBGenericRequest_ENDPOINT              2
+/// Recipient is another entity.
+#define USBGenericRequest_OTHER                 3
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "USB Request Types"
+///
+/// This page lists codes of USB request types.
+///
+/// !Types
+/// - USBGenericRequest_STANDARD
+/// - USBGenericRequest_CLASS
+/// - USBGenericRequest_VENDOR
+
+/// Request is standard.
+#define USBGenericRequest_STANDARD              0
+/// Request is class-specific.
+#define USBGenericRequest_CLASS                 1
+/// Request is vendor-specific.
+#define USBGenericRequest_VENDOR                2
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "USB Request Directions"
+///
+/// This page lists codes of USB request directions.
+///
+/// !Directions
+/// - USBGenericRequest_IN
+/// - USBGenericRequest_OUT
+
+/// Transfer occurs from device to the host.
+#define USBGenericRequest_OUT                   0
+/// Transfer occurs from the host to the device.
+#define USBGenericRequest_IN                    1
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+//         Types
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// Generic USB SETUP request sent over Control endpoints.
+//------------------------------------------------------------------------------
+typedef struct {
+
+    /// Type of request
+    /// \sa "USB Request Recipients"
+    /// \sa "USB Request Types"
+    /// \sa "USB Request Directions"
+    unsigned char bmRequestType:8;
+    /// Request code
+    /// \sa "USB Request Codes"
+    unsigned char bRequest:8;
+    /// Request-specific value parameter.
+    unsigned short wValue:16;
+    /// Request-specific index parameter.
+    unsigned short wIndex:16;
+    /// Expected length (in bytes) of the data phase.
+    unsigned short wLength:16;
+
+} USBGenericRequest;
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+
+extern unsigned char USBGenericRequest_GetType(
+    const USBGenericRequest *request);
+
+
+extern unsigned char USBGenericRequest_GetRequest(
+    const USBGenericRequest *request);
+
+extern unsigned short USBGenericRequest_GetValue(
+    const USBGenericRequest *request);
+
+extern unsigned short USBGenericRequest_GetIndex(
+    const USBGenericRequest *request);
+
+extern unsigned short USBGenericRequest_GetLength(
+    const USBGenericRequest *request);
+
+extern unsigned char USBGenericRequest_GetEndpointNumber(
+    const USBGenericRequest *request);
+
+extern unsigned char USBGenericRequest_GetRecipient(
+    const USBGenericRequest *request);
+
+extern unsigned char USBGenericRequest_GetDirection(
+    const USBGenericRequest *request);
+
+#endif //#ifndef USBGENERICREQUEST_H
+
diff --git a/usb/common/core/USBGetDescriptorRequest.c b/usb/common/core/USBGetDescriptorRequest.c
new file mode 100644
index 0000000..2937929
--- /dev/null
+++ b/usb/common/core/USBGetDescriptorRequest.c
@@ -0,0 +1,72 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/*
+    Title: USBGetDescriptorRequest implementation
+
+    About: Purpose
+        Implementation of the USBGetDescriptorRequest class.
+*/
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+
+#include "USBGetDescriptorRequest.h"
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// Returns the type of the descriptor requested by the host given the
+/// corresponding GET_DESCRIPTOR request.
+/// \param request Pointer to a USBGenericDescriptor instance.
+/// \return Type of the requested descriptor.
+//------------------------------------------------------------------------------
+unsigned char USBGetDescriptorRequest_GetDescriptorType(
+    const USBGenericRequest *request)
+{
+    // Requested descriptor type is in the high-byte of the wValue field
+    return (USBGenericRequest_GetValue(request) >> 8) & 0xFF;
+}
+
+//------------------------------------------------------------------------------
+/// Returns the index of the requested descriptor, given the corresponding
+/// GET_DESCRIPTOR request.
+/// \param request Pointer to a USBGenericDescriptor instance.
+/// \return Index of the requested descriptor.
+//------------------------------------------------------------------------------
+unsigned char USBGetDescriptorRequest_GetDescriptorIndex(
+    const USBGenericRequest *request)
+{
+    // Requested descriptor index if in the low byte of the wValue field
+    return USBGenericRequest_GetValue(request) & 0xFF;
+}
+
diff --git a/usb/common/core/USBGetDescriptorRequest.h b/usb/common/core/USBGetDescriptorRequest.h
new file mode 100644
index 0000000..43f6afd
--- /dev/null
+++ b/usb/common/core/USBGetDescriptorRequest.h
@@ -0,0 +1,67 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/**
+ \unit
+
+ !!!Purpose
+
+    Definition of the USBGetDescriptorRequest class.
+
+ !!!Usage
+
+    - After a GET_DESCRIPTOR request has been received, retrive the useful
+      values with following functions:
+      - USBGetDescriptorRequest_GetDescriptorType: the descriptor type
+      - USBGetDescriptorRequest_GetDescriptorIndex: the index of the requested
+        descriptor
+
+*/
+
+#ifndef USBGETDESCRIPTORREQUEST_H
+#define USBGETDESCRIPTORREQUEST_H
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+
+#include "USBGenericRequest.h"
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+
+extern unsigned char USBGetDescriptorRequest_GetDescriptorType(
+    const USBGenericRequest *request);
+
+extern unsigned char USBGetDescriptorRequest_GetDescriptorIndex(
+    const USBGenericRequest *request);
+
+#endif //#ifndef USBGETDESCRIPTORREQUEST_H
+
diff --git a/usb/common/core/USBInterfaceAssociationDescriptor.h b/usb/common/core/USBInterfaceAssociationDescriptor.h
new file mode 100644
index 0000000..5f3dd21
--- /dev/null
+++ b/usb/common/core/USBInterfaceAssociationDescriptor.h
@@ -0,0 +1,86 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/**
+ *  \page USBInterfaceAssociateDescriptor
+ *  !!!Purpose
+ * 
+ *      Class for manipulating USB IAD descriptors.
+ * 
+ *  !!!Usage
+ * 
+ *      -# Test
+ */
+
+#ifndef USBDIADDESCRIPTOR_H
+#define USBDIADDESCRIPTOR_H
+
+//------------------------------------------------------------------------------
+//         Types
+//------------------------------------------------------------------------------
+
+#ifdef __ICCARM__          // IAR
+#pragma pack(1)            // IAR
+#define __attribute__(...) // IAR
+#endif                     // IAR
+
+/*
+    Type: USBDeviceDescriptor
+        USB standard device descriptor structure.
+
+    Variables:
+        bLength - Size of this descriptor in bytes.
+        bDescriptorType - Descriptor type (<USBGenericDescriptor_IAD>).
+        bFirstInterface - Interface number of the first interface that is 
+                          associated with this function. 
+        bInterfaceCount - Number of contiguous interfaces that are 
+                          associated with this function. 
+        bFunctionClass - Class code (assigned by USB-IF).
+        bFunctionSubClass - Subclass code (assigned by USB-IF).
+        bFunctionProtocol - Protocol code (assigned by USB-IF)
+        iFunction - Index of string descriptor describing this function.
+*/
+typedef struct {
+
+   unsigned char bLength;
+   unsigned char bDescriptorType;
+   unsigned char bFirstInterface;
+   unsigned char bInterfaceCount;
+   unsigned char bFunctionClass;
+   unsigned char bFunctionSubClass;
+   unsigned char bFunctionProtocol;
+   unsigned char iFunction;
+} __attribute__ ((packed)) USBInterfaceAssociationDescriptor; // GCC
+
+#ifdef __ICCARM__          // IAR
+#pragma pack()             // IAR
+#endif                     // IAR
+
+#endif //#ifndef USBDIADDESCRIPTOR_H
+
diff --git a/usb/common/core/USBInterfaceDescriptor.h b/usb/common/core/USBInterfaceDescriptor.h
new file mode 100644
index 0000000..63910bf
--- /dev/null
+++ b/usb/common/core/USBInterfaceDescriptor.h
@@ -0,0 +1,87 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/**
+ \unit
+
+ !!!Purpose
+
+    Definition of a class for manipulating USB interface descriptors.
+
+ !!!Usage
+
+    - Declare USBInterfaceDescriptor instance as a part of the configuration
+      descriptors of a USB device.
+
+*/
+
+#ifndef USBINTERFACEDESCRIPTOR_H
+#define USBINTERFACEDESCRIPTOR_H
+
+//------------------------------------------------------------------------------
+//         Types
+//------------------------------------------------------------------------------
+
+#ifdef __ICCARM__          // IAR
+#pragma pack(1)            // IAR
+#define __attribute__(...) // IAR
+#endif                     // IAR
+
+//------------------------------------------------------------------------------
+/// USB standard interface descriptor structure.
+//------------------------------------------------------------------------------
+typedef struct {
+
+   /// Size of the descriptor in bytes.
+   unsigned char bLength;
+   /// Descriptor type (USBGenericDescriptor_INTERFACE).
+   unsigned char bDescriptorType;
+   /// Number of the interface in its configuration.
+   unsigned char bInterfaceNumber;
+   /// Value to select this alternate interface setting.
+   unsigned char bAlternateSetting;
+   /// Number of endpoints used by the inteface (excluding endpoint 0).
+   unsigned char bNumEndpoints;
+   /// Interface class code.
+   unsigned char bInterfaceClass;
+   /// Interface subclass code.
+   unsigned char bInterfaceSubClass;
+   /// Interface protocol code.
+   unsigned char bInterfaceProtocol;
+   /// Index of the interface string descriptor.
+   unsigned char iInterface;
+                                    
+} __attribute__ ((packed)) USBInterfaceDescriptor; // GCC
+
+#ifdef __ICCARM__          // IAR
+#pragma pack()             // IAR
+#endif                     // IAR
+
+#endif //#ifndef USBINTERFACEDESCRIPTOR_H
+
diff --git a/usb/common/core/USBInterfaceRequest.c b/usb/common/core/USBInterfaceRequest.c
new file mode 100644
index 0000000..61bf6ed
--- /dev/null
+++ b/usb/common/core/USBInterfaceRequest.c
@@ -0,0 +1,69 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/*
+    Title: USBInterfaceRequest
+
+    About: Purpose
+        Implementation of USBInterfaceRequest class methods.
+*/
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+
+#include "USBInterfaceRequest.h"
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// Indicates which interface is targetted by a GET_INTERFACE or
+/// SET_INTERFACE request.
+/// \param request Pointer to a USBGenericRequest instance.
+/// \return Interface number.
+//------------------------------------------------------------------------------
+unsigned char USBInterfaceRequest_GetInterface(const USBGenericRequest *request)
+{
+    return (USBGenericRequest_GetIndex(request) & 0xFF);
+}
+
+//------------------------------------------------------------------------------
+/// Indicates the new alternate setting that the interface targetted by a
+/// SET_INTERFACE request should use.
+/// \param request Pointer to a USBGenericRequest instance.
+/// \return New active setting for the interface.
+//------------------------------------------------------------------------------
+unsigned char USBInterfaceRequest_GetAlternateSetting(
+    const USBGenericRequest *request)
+{
+    return (USBGenericRequest_GetValue(request) & 0xFF);
+}
+
diff --git a/usb/common/core/USBInterfaceRequest.h b/usb/common/core/USBInterfaceRequest.h
new file mode 100644
index 0000000..bd4cddd
--- /dev/null
+++ b/usb/common/core/USBInterfaceRequest.h
@@ -0,0 +1,68 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/**
+ \unit
+
+ !!!Purpose
+
+    Definitions for manipulating SET_INTERFACE and GET_INTERFACE request.
+
+ !!!Usage
+
+    -# After a SET_INTERFACE request has been received, retrieve the
+       target interface using USBInterfaceRequest_GetInterface and its
+       new alternate setting with USBInterfaceRequest_GetAlternateSetting.
+    -# After a GET_INTERFACE request has been received, retrieve the target
+       interface using USBInterfaceRequest_GetInterface.
+
+*/
+
+#ifndef USBINTERFACEREQUEST_H
+#define USBINTERFACEREQUEST_H
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+
+#include "USBGenericRequest.h"
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+
+extern unsigned char USBInterfaceRequest_GetInterface(
+    const USBGenericRequest *request);
+
+
+extern unsigned char USBInterfaceRequest_GetAlternateSetting(
+    const USBGenericRequest *request);
+
+#endif //#ifndef USBINTERFACEREQUEST_H
+
diff --git a/usb/common/core/USBIrqHandler.c b/usb/common/core/USBIrqHandler.c
new file mode 100644
index 0000000..386ebd2
--- /dev/null
+++ b/usb/common/core/USBIrqHandler.c
@@ -0,0 +1,62 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/*
+    Title: USBIrqHandler implementation
+
+    About: Purpose
+        Implementation of the USB Interrupt Handler.
+*/
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+#include <board.h>
+#include <usb/device/core/USBD.h>
+
+#include <exceptions.h>
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+/// Call Arbitrer, device and host interrupt handler. 
+/// The IRQ functions are defined with weak and can be surcharged if needed.
+//------------------------------------------------------------------------------
+void USB_IrqHandler( void )
+{
+    // Most arbitrer interrupt
+    usb_general_interrupt();
+    // Device interrupt
+    USBD_IrqHandler();
+    // Host interrupt
+    usb_pipe_interrupt();
+}
+
+
diff --git a/usb/common/core/USBIrqHandler.h b/usb/common/core/USBIrqHandler.h
new file mode 100644
index 0000000..77d2679
--- /dev/null
+++ b/usb/common/core/USBIrqHandler.h
@@ -0,0 +1,52 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/**
+ \unit
+
+ !!!Purpose
+
+        Implementation of the USB Interrupt Handler.
+
+ !!!Usage
+
+    -# The IRQ functions are defined with weak and can be surcharged if needed.
+
+*/
+
+#ifndef USBIRQHANDLER_H
+#define USBIRQHANDLER_H
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+extern void USB_IrqHandler( void );
+
+#endif //#ifndef USBIRQHANDLER_H
+
diff --git a/usb/common/core/USBSetAddressRequest.c b/usb/common/core/USBSetAddressRequest.c
new file mode 100644
index 0000000..0e82a7f
--- /dev/null
+++ b/usb/common/core/USBSetAddressRequest.c
@@ -0,0 +1,56 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/*
+    Title: USBSetAddressRequest implementation
+
+    About: Purpose
+        Implementation of the USBSetAddressRequest class.    
+*/
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+
+#include "USBSetAddressRequest.h"
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+//------------------------------------------------------------------------------
+/// Returns the address that the device must take in response to a
+/// SET_ADDRESS request.
+/// \param request Pointer to a USBGenericRequest instance.
+/// \return New device address.
+//------------------------------------------------------------------------------
+unsigned char USBSetAddressRequest_GetAddress(const USBGenericRequest *request)
+{
+    return USBGenericRequest_GetValue(request) & 0x7F;
+}
+
diff --git a/usb/common/core/USBSetAddressRequest.h b/usb/common/core/USBSetAddressRequest.h
new file mode 100644
index 0000000..78034c3
--- /dev/null
+++ b/usb/common/core/USBSetAddressRequest.h
@@ -0,0 +1,60 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/**
+ \unit
+
+ !!!Purpose
+
+    Definition of a class for manipulating SET_ADDRESS USB requests.
+
+ !!!Usage
+
+    - After a SET_ADDRESS request has been received, retrive the new address
+      value with USBSetAddressRequest_GetAddress.
+*/
+
+#ifndef USBSETADDRESSREQUEST_H
+#define USBSETADDRESSREQUEST_H
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+
+#include "USBGenericRequest.h"
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+
+extern unsigned char USBSetAddressRequest_GetAddress(
+    const USBGenericRequest *request);
+
+#endif //#ifndef USBSETADDRESSREQUEST_H
+
diff --git a/usb/common/core/USBSetConfigurationRequest.c b/usb/common/core/USBSetConfigurationRequest.c
new file mode 100644
index 0000000..3aa747d
--- /dev/null
+++ b/usb/common/core/USBSetConfigurationRequest.c
@@ -0,0 +1,58 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/*
+    Title: USBSetConfigurationRequest implementation
+
+    About: Purpose
+        Implementation of the USBSetConfigurationRequest class.
+*/
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+
+#include "USBSetConfigurationRequest.h"
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// Returns the number of the configuration that should be set in response
+/// to the given SET_CONFIGURATION request.
+/// \param request Pointer to a USBGenericRequest instance.
+/// \return Number of the requested configuration.
+//------------------------------------------------------------------------------
+unsigned char USBSetConfigurationRequest_GetConfiguration(
+    const USBGenericRequest *request)
+{
+    return USBGenericRequest_GetValue(request);
+}
+
diff --git a/usb/common/core/USBSetConfigurationRequest.h b/usb/common/core/USBSetConfigurationRequest.h
new file mode 100644
index 0000000..aa1fa17
--- /dev/null
+++ b/usb/common/core/USBSetConfigurationRequest.h
@@ -0,0 +1,61 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+/**
+ \unit
+
+ !!!Purpose
+
+    Definition of a class for the Set Configuration request.
+
+ !!!Usage
+
+    - After a SET_CONFIGURATION request has been received, retrive the new
+      configuration value with USBSetConfigurationRequest_GetConfiguration.
+
+*/
+
+#ifndef USBSETCONFIGURATIONREQUEST_H
+#define USBSETCONFIGURATIONREQUEST_H
+
+//------------------------------------------------------------------------------
+//         Headers
+//------------------------------------------------------------------------------
+
+#include "USBGenericRequest.h"
+
+//------------------------------------------------------------------------------
+//         Exported functions
+//------------------------------------------------------------------------------
+
+extern unsigned char USBSetConfigurationRequest_GetConfiguration(
+    const USBGenericRequest *request);
+
+#endif //#ifndef USBSETCONFIGURATIONREQUEST_H
+
diff --git a/usb/common/core/USBStringDescriptor.h b/usb/common/core/USBStringDescriptor.h
new file mode 100644
index 0000000..bcf4b83
--- /dev/null
+++ b/usb/common/core/USBStringDescriptor.h
@@ -0,0 +1,74 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+//------------------------------------------------------------------------------
+/// \unit
+///
+/// !!!Purpose
+///
+/// Definition of a class for manipulating String descriptors.
+//------------------------------------------------------------------------------
+
+#ifndef USBSTRINGDESCRIPTOR_H
+#define USBSTRINGDESCRIPTOR_H
+
+//------------------------------------------------------------------------------
+//         Definitions
+//------------------------------------------------------------------------------
+
+//------------------------------------------------------------------------------
+/// \page "USB String Descriptor definitions"
+///
+/// This page lists the codes and macros for USB string descriptor definition.
+///
+/// !Language IDs
+/// - USBStringDescriptor_ENGLISH_US
+///
+/// !String Descriptor Length
+/// - USBStringDescriptor_LENGTH
+///
+/// !ASCII to UNICODE convertion
+/// - USBStringDescriptor_UNICODE
+
+/// Language ID for US english.
+#define USBStringDescriptor_ENGLISH_US          0x09, 0x04
+
+/// Calculates the length of a string descriptor given the number of ascii
+/// characters/language IDs in it.
+/// \param length The ascii format string length.
+/// \return The actual data length in bytes.
+#define USBStringDescriptor_LENGTH(length)      ((length) * 2 + 2)
+/// Converts an ascii character to its unicode representation.
+/// \param ascii The ASCII character to convert
+/// \return A 2-byte-array for the UNICODE based on given ASCII
+#define USBStringDescriptor_UNICODE(ascii)      (ascii), 0
+//------------------------------------------------------------------------------
+
+#endif //#ifndef USBSTRINGDESCRIPTOR_H
+
diff --git a/usb/common/core/core.dir b/usb/common/core/core.dir
new file mode 100644
index 0000000..7ac93c3
--- /dev/null
+++ b/usb/common/core/core.dir
@@ -0,0 +1,53 @@
+/* ----------------------------------------------------------------------------
+ *         ATMEL Microcontroller Software Support 
+ * ----------------------------------------------------------------------------
+ * Copyright (c) 2008, Atmel Corporation
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the disclaimer below.
+ *
+ * Atmel's name may not be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE
+ * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * ----------------------------------------------------------------------------
+ */
+
+//------------------------------------------------------------------------------
+/// \dir
+/// !!!Purpose
+///
+/// This directory contains definitions, structures and functions described by
+/// USB specification. They can be divided into two groups:
+/// - USB descriptors, prefixed with USB and suffixed with Descriptor.
+/// - USB requests, prefixed with USB and suffixed with Request.
+//------------------------------------------------------------------------------
+
+/**
+ \page "Standard USB Structures"
+
+ !!!Standard USB Structures
+ 
+ The following standard structures is implemented in the USB framework:
+ - Setup request data: USBGenericRequest
+ - Descriptor header: USBGenericDescriptor
+ - Device descriptor: USBDeviceDescriptor
+ - Configuration descriptor: USBConfigurationDescriptor
+ - Interface descriptor: USBInterfaceDescriptor
+ - %Endpoint descriptor: USBEndpointDescriptor
+ - Device_Qualifier descriptor: USBDeviceQualifierDescriptor
+*/
-- 
cgit v1.2.3