start with USB CDC echo example

this is the Atmel START USB CDC Echo example project for the
SAM E54 Xplained Pro board using an Atmel ATSAME54P20A
microcontroller.
Atmel START information:
- Version: 1.4.1810 (Dec 18, 2018, 5:52 AM GMT+1)
- Server: 1.4.93
- Content version: 1.0.1340

This will serve as basis for the sysmoOCTSIM project

A jenkins contrib script has also been added to the
osmo-ccid-firmware project to build the sysmoOCTSIM firmware

Change-Id: I356de75e7b730d63fb819248e71d36f785932199
diff --git a/sysmoOCTSIM/hal/include/hpl_usb.h b/sysmoOCTSIM/hal/include/hpl_usb.h
new file mode 100644
index 0000000..2e165d7
--- /dev/null
+++ b/sysmoOCTSIM/hal/include/hpl_usb.h
@@ -0,0 +1,270 @@
+/**
+ * \file
+ *
+ * \brief SAM USB HPL
+ *
+ * Copyright (c) 2015-2018 Microchip Technology Inc. and its subsidiaries.
+ *
+ * \asf_license_start
+ *
+ * \page License
+ *
+ * Subject to your compliance with these terms, you may use Microchip
+ * software and any derivatives exclusively with Microchip products.
+ * It is your responsibility to comply with third party license terms applicable
+ * to your use of third party software (including open source software) that
+ * may accompany Microchip software.
+ *
+ * THIS SOFTWARE IS SUPPLIED BY MICROCHIP "AS IS". NO WARRANTIES,
+ * WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS SOFTWARE,
+ * INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY,
+ * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT WILL MICROCHIP BE
+ * LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE, INCIDENTAL OR CONSEQUENTIAL
+ * LOSS, DAMAGE, COST OR EXPENSE OF ANY KIND WHATSOEVER RELATED TO THE
+ * SOFTWARE, HOWEVER CAUSED, EVEN IF MICROCHIP HAS BEEN ADVISED OF THE
+ * POSSIBILITY OR THE DAMAGES ARE FORESEEABLE.  TO THE FULLEST EXTENT
+ * ALLOWED BY LAW, MICROCHIP'S TOTAL LIABILITY ON ALL CLAIMS IN ANY WAY
+ * RELATED TO THIS SOFTWARE WILL NOT EXCEED THE AMOUNT OF FEES, IF ANY,
+ * THAT YOU HAVE PAID DIRECTLY TO MICROCHIP FOR THIS SOFTWARE.
+ *
+ * \asf_license_stop
+ *
+ */
+
+#ifndef _HPL_USB_H_INCLUDED
+#define _HPL_USB_H_INCLUDED
+
+#include <compiler.h>
+#include <utils.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** \name USB Spec definitions */
+/*@{*/
+
+/** Return 8-bit unsigned USB data. */
+#define USB_GET_U8(addr, offset) (((uint8_t *)(addr))[(offset)])
+
+/** Return 16-bit unsigned USB data. */
+#define USB_GET_U16(addr, offset) ((((uint8_t *)(addr))[(offset) + 0] << 0) + (((uint8_t *)(addr))[(offset) + 1] << 8))
+
+/** Return 32-bit unsigned USB data. */
+#define USB_GET_U32(addr, offset)                                                                                      \
+	((((uint8_t *)(addr))[(offset) + 0] << 0) + (((uint8_t *)(addr))[(offset) + 1] << 8)                               \
+	 + (((uint8_t *)(addr))[(offset) + 2] << 16) + (((uint8_t *)(addr))[(offset) + 3] << 32))
+
+/** Offset of bmRequestType in USB request buffer. */
+#define USB_bmRequestType_Offset 0
+
+/** Offset of bRequest in USB request buffer. */
+#define USB_bRequest_Offset 1
+
+/** Offset of wValue in USB request buffer. */
+#define USB_wValue_Offset 2
+
+/** Offset of wIndex in USB request buffer. */
+#define USB_wIndex_Offset 4
+
+/** Offset of wLength in USB request buffer. */
+#define USB_wLength_Offset 6
+
+/** Get value of bmRequestType from USB request. */
+#define USB_GET_bmRequestType(req) USB_GET_U8((req), USB_bmRequestType_Offset)
+
+/** Get value of bRequest from USB request. */
+#define USB_GET_bRequest(req) USB_GET_U8((req), USB_bRequest_Offset)
+
+/** Get value of wValue from USB request. */
+#define USB_GET_wValue(req) USB_GET_U16((req), USB_wValue_Offset)
+
+/** Get value of wIndex from USB request. */
+#define USB_GET_wIndex(req) USB_GET_U16((req), USB_wIndex_Offset)
+
+/** Get value of wLength from USB request. */
+#define USB_GET_wLength(req) USB_GET_U16((req), USB_wLength_Offset)
+
+/** USB request IN indication of bmRequestType. */
+#define USB_REQ_TYPE_IN 0x80u
+
+/** USB endpoint number mask of bEndpointAddress. */
+#define USB_EP_N_MASK 0x0Fu
+
+/** USB endpoint direction bit of bEndpointAddress. */
+#define USB_EP_DIR 0x80u
+
+/** Get USB endpoint direction from endpoint address. */
+#define USB_EP_GET_DIR(ep_addr) ((ep_addr)&USB_EP_DIR)
+
+/** Get USB endpoint number from endpoint address. */
+#define USB_EP_GET_N(ep_addr) ((ep_addr)&USB_EP_N_MASK)
+
+/** Transfer type in EP descriptor bmAttributes: Control. */
+#define USB_EP_XTYPE_CTRL 0x0
+
+/** Transfer type in EP descriptor bmAttributes: Isochronous. */
+#define USB_EP_XTYPE_ISOCH 0x1
+
+/** Transfer type in EP descriptor bmAttributes: Bulk. */
+#define USB_EP_XTYPE_BULK 0x2
+
+/** Transfer type in EP descriptor bmAttributes: Interrupt. */
+#define USB_EP_XTYPE_INTERRUPT 0x3
+
+/** Transfer type mask in EP descriptor bmAttributes. */
+#define USB_EP_XTYPE_MASK 0x3u
+
+/*@}*/
+
+/** \name USB status codes
+ *@{
+ */
+/** USB operation is done successfully. */
+#define USB_OK 0
+/** USB (endpoint) is busy. */
+#define USB_BUSY 1
+/** USB (endpoint) is halted. */
+#define USB_HALTED 2
+
+/** General error. */
+#define USB_ERROR 0x10
+/** Operation is denied by hardware (e.g., syncing). */
+#define USB_ERR_DENIED 0x11
+/** Input parameter error. */
+#define USB_ERR_PARAM 0x12
+/** Functionality is not supported (e.g., initialize endpoint without cache to be control). */
+#define USB_ERR_FUNC 0x13
+/** Re-initialize, re-enable ... */
+#define USB_ERR_REDO 0x14
+/** Not enough resource (memory, endpoints ...). */
+#define USB_ERR_ALLOC_FAIL 0x15
+/*@}*/
+
+/** USB speed. */
+enum usb_speed {
+	/** USB Low Speed. */
+	USB_SPEED_LS,
+	/** USB Full Speed. */
+	USB_SPEED_FS,
+	/** USB High Speed. */
+	USB_SPEED_HS,
+	/** USB Super Speed. */
+	USB_SPEED_SS
+};
+
+/** USB transaction type. */
+enum usb_trans_type {
+	/** USB SETUP transaction. */
+	USB_TRANS_SETUP,
+	/** USB IN transaction. */
+	USB_TRANS_IN,
+	/** USB OUT transaction. */
+	USB_TRANS_OUT
+};
+
+/** USB events that generates the device callbacks. */
+enum usb_event {
+	/** USB VBus changed, with parameter as present/not present. */
+	USB_EV_VBUS,
+	/** USB RESET detected on bus. */
+	USB_EV_RESET,
+	/** USB wakeup. */
+	USB_EV_WAKEUP,
+	/** USB LPM suspend, with parameter as \ref usb_lpm_attributes. */
+	USB_EV_LPM_SUSPEND,
+	/** USB suspend. */
+	USB_EV_SUSPEND,
+	/** USB error, with parameter as error code. */
+	USB_EV_ERROR,
+	/** Number of USB event types. */
+	USB_EV_N
+};
+
+/** Control action for USB device endpoint stall. */
+enum usb_ep_stall_ctrl {
+	/** Clear stall of the endpoint. */
+	USB_EP_STALL_CLR,
+	/** Stall the endpoint. */
+	USB_EP_STALL_SET,
+	/** Return the stall status. */
+	USB_EP_STALL_GET
+};
+
+/** Control action for USB device endpoint halt. */
+enum usb_ep_halt_ctrl {
+	/** Clear halt of the endpoint. */
+	USB_EP_HALT_CLR = USB_EP_STALL_CLR,
+	/** Stall the endpoint. */
+	USB_EP_HALT_SET = USB_EP_STALL_SET,
+	/** Return the halt status. */
+	USB_EP_HALT_GET = USB_EP_STALL_GET
+};
+
+/** USB transactions status codes. */
+enum usb_trans_code {
+	/** TX or RX has been done without error. */
+	USB_TRANS_DONE,
+	/** The endpoint is stalled. */
+	USB_TRANS_STALL,
+	/** The endpoint transactions are aborted (cancel, control setup/status). */
+	USB_TRANS_ABORT,
+	/** The endpoint transactions are aborted by reset/disable. */
+	USB_TRANS_RESET,
+	/** Error is reported on the endpoint. */
+	USB_TRANS_ERROR
+};
+
+/** Transfer status codes. */
+enum usb_xfer_code {
+	/** Transfer is done without error, for ctrl it means status packet done. */
+	USB_XFER_DONE,
+	/** For control transfer only, data stage is done without error. */
+	USB_XFER_DATA,
+	/** Endpoint stall is set. */
+	USB_XFER_HALT,
+	/** Endpoint stall is cleared. */
+	USB_XFER_UNHALT,
+	/** Transfer is aborted. */
+	USB_XFER_ABORT,
+	/** Transfer is aborted because endpoint reset/disable. */
+	USB_XFER_RESET,
+	/** There was an error. */
+	USB_XFER_ERROR
+};
+
+/** USB endpoint errors. */
+enum usb_ep_error {
+	/** No error. */
+	USB_EP_NO_ERROR,
+	/** CRC error. */
+	USB_EP_ERR_CRC,
+	/** Endpoint transfer overflow. */
+	USB_EP_ERR_OVERFLOW,
+	/** Other endpoint errors. */
+	USB_EP_ERR_GENERAL
+};
+
+/** Endpoint transfer state. */
+enum usb_ep_state {
+	/** Endpoint is disabled. */
+	USB_EP_S_DISABLED,
+	/** Endpoint is not busy. */
+	USB_EP_S_IDLE,
+	/** Control transfer only, endpoint is transferring setup packet. */
+	USB_EP_S_X_SETUP,
+	/** Endpoint is transferring data. */
+	USB_EP_S_X_DATA,
+	/** Control transfer only, endpoint is in status stage. */
+	USB_EP_S_X_STATUS,
+	/** Endpoint is halted. */
+	USB_EP_S_HALTED,
+	/** Endpoint error. */
+	USB_EP_S_ERROR
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _HPL_USB_H_INCLUDED */