2017-12-21 06:42:46 +01:00
|
|
|
/**
|
|
|
|
* \file
|
|
|
|
*
|
|
|
|
* \brief Interface of the USB Device Controller (UDC)
|
|
|
|
*
|
|
|
|
* Copyright (c) 2009-2015 Atmel Corporation. All rights reserved.
|
|
|
|
*
|
|
|
|
* \asf_license_start
|
|
|
|
*
|
|
|
|
* \page License
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions are met:
|
|
|
|
*
|
|
|
|
* 1. Redistributions of source code must retain the above copyright notice,
|
|
|
|
* this list of conditions and the following disclaimer.
|
|
|
|
*
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright notice,
|
|
|
|
* this list of conditions and the following disclaimer in the documentation
|
|
|
|
* and/or other materials provided with the distribution.
|
|
|
|
*
|
|
|
|
* 3. The name of Atmel may not be used to endorse or promote products derived
|
|
|
|
* from this software without specific prior written permission.
|
|
|
|
*
|
|
|
|
* 4. This software may only be redistributed and used in connection with an
|
|
|
|
* Atmel microcontroller product.
|
|
|
|
*
|
|
|
|
* 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
|
|
|
|
* EXPRESSLY AND SPECIFICALLY 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.
|
|
|
|
*
|
|
|
|
* \asf_license_stop
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
/*
|
|
|
|
* Support and FAQ: visit <a href="http://www.atmel.com/design-support/">Atmel Support</a>
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _UDC_H_
|
|
|
|
#define _UDC_H_
|
|
|
|
|
|
|
|
#include "conf_usb.h"
|
|
|
|
#include "usb_protocol.h"
|
|
|
|
#include "udc_desc.h"
|
|
|
|
#include "udd.h"
|
|
|
|
|
|
|
|
#if USB_DEVICE_VENDOR_ID == 0
|
|
|
|
# error USB_DEVICE_VENDOR_ID cannot be equal to 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#if USB_DEVICE_PRODUCT_ID == 0
|
|
|
|
# error USB_DEVICE_PRODUCT_ID cannot be equal to 0
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \ingroup usb_device_group
|
|
|
|
* \defgroup udc_group USB Device Controller (UDC)
|
|
|
|
*
|
|
|
|
* The UDC provides a high-level abstraction of the usb device.
|
|
|
|
* You can use these functions to control the main device state
|
|
|
|
* (start/attach/wakeup).
|
|
|
|
*
|
|
|
|
* \section USB_DEVICE_CONF USB Device Custom configuration
|
|
|
|
* The following USB Device configuration must be included in the conf_usb.h
|
|
|
|
* file of the application.
|
|
|
|
*
|
|
|
|
* USB_DEVICE_VENDOR_ID (Word)<br>
|
|
|
|
* Vendor ID provided by USB org (ATMEL 0x03EB).
|
|
|
|
*
|
|
|
|
* USB_DEVICE_PRODUCT_ID (Word)<br>
|
|
|
|
* Product ID (Referenced in usb_atmel.h).
|
|
|
|
*
|
|
|
|
* USB_DEVICE_MAJOR_VERSION (Byte)<br>
|
|
|
|
* Major version of the device
|
|
|
|
*
|
|
|
|
* USB_DEVICE_MINOR_VERSION (Byte)<br>
|
|
|
|
* Minor version of the device
|
|
|
|
*
|
|
|
|
* USB_DEVICE_MANUFACTURE_NAME (string)<br>
|
|
|
|
* ASCII name for the manufacture
|
|
|
|
*
|
|
|
|
* USB_DEVICE_PRODUCT_NAME (string)<br>
|
|
|
|
* ASCII name for the product
|
|
|
|
*
|
|
|
|
* USB_DEVICE_SERIAL_NAME (string)<br>
|
|
|
|
* ASCII name to enable and set a serial number
|
|
|
|
*
|
|
|
|
* USB_DEVICE_POWER (Numeric)<br>
|
|
|
|
* (unit mA) Maximum device power
|
|
|
|
*
|
|
|
|
* USB_DEVICE_ATTR (Byte)<br>
|
|
|
|
* USB attributes available:
|
|
|
|
* - USB_CONFIG_ATTR_SELF_POWERED
|
|
|
|
* - USB_CONFIG_ATTR_REMOTE_WAKEUP
|
|
|
|
* Note: if remote wake enabled then defines remotewakeup callbacks,
|
|
|
|
* see Table 5-2. External API from UDC - Callback
|
|
|
|
*
|
|
|
|
* USB_DEVICE_LOW_SPEED (Only defined)<br>
|
|
|
|
* Force the USB Device to run in low speed
|
|
|
|
*
|
|
|
|
* USB_DEVICE_HS_SUPPORT (Only defined)<br>
|
|
|
|
* Authorize the USB Device to run in high speed
|
|
|
|
*
|
|
|
|
* USB_DEVICE_MAX_EP (Byte)<br>
|
|
|
|
* Define the maximum endpoint number used by the USB Device.<br>
|
|
|
|
* This one is already defined in UDI default configuration.
|
|
|
|
* Ex:
|
|
|
|
* - When endpoint control 0x00, endpoint 0x01 and
|
|
|
|
* endpoint 0x82 is used then USB_DEVICE_MAX_EP=2
|
|
|
|
* - When only endpoint control 0x00 is used then USB_DEVICE_MAX_EP=0
|
|
|
|
* - When endpoint 0x01 and endpoint 0x81 is used then USB_DEVICE_MAX_EP=1<br>
|
|
|
|
* (configuration not possible on USBB interface)
|
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Authorizes the VBUS event
|
|
|
|
*
|
|
|
|
* \return true, if the VBUS monitoring is possible.
|
|
|
|
*
|
|
|
|
* \section udc_vbus_monitoring VBus monitoring used cases
|
|
|
|
*
|
|
|
|
* The VBus monitoring is used only for USB SELF Power application.
|
|
|
|
*
|
|
|
|
* - By default the USB device is automatically attached when Vbus is high
|
|
|
|
* or when USB is start for devices without internal Vbus monitoring.
|
|
|
|
* conf_usb.h file does not contains define USB_DEVICE_ATTACH_AUTO_DISABLE.
|
|
|
|
* \code //#define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode
|
|
|
|
*
|
|
|
|
* - Add custom VBUS monitoring. conf_usb.h file contains define
|
|
|
|
* USB_DEVICE_ATTACH_AUTO_DISABLE:
|
|
|
|
* \code #define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode
|
|
|
|
* User C file contains:
|
2018-01-05 17:10:55 +01:00
|
|
|
* \code
|
2017-12-21 06:42:46 +01:00
|
|
|
// Authorize VBUS monitoring
|
|
|
|
if (!udc_include_vbus_monitoring()) {
|
|
|
|
// Implement custom VBUS monitoring via GPIO or other
|
|
|
|
}
|
|
|
|
Event_VBUS_present() // VBUS interrupt or GPIO interrupt or other
|
|
|
|
{
|
|
|
|
// Attach USB Device
|
|
|
|
udc_attach();
|
|
|
|
}
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* - Case of battery charging. conf_usb.h file contains define
|
|
|
|
* USB_DEVICE_ATTACH_AUTO_DISABLE:
|
|
|
|
* \code #define USB_DEVICE_ATTACH_AUTO_DISABLE \endcode
|
|
|
|
* User C file contains:
|
2018-01-05 17:10:55 +01:00
|
|
|
* \code
|
2017-12-21 06:42:46 +01:00
|
|
|
Event VBUS present() // VBUS interrupt or GPIO interrupt or ..
|
|
|
|
{
|
|
|
|
// Authorize battery charging, but wait key press to start USB.
|
|
|
|
}
|
|
|
|
Event Key press()
|
|
|
|
{
|
|
|
|
// Stop batteries charging
|
|
|
|
// Start USB
|
|
|
|
udc_attach();
|
|
|
|
}
|
|
|
|
\endcode
|
|
|
|
*/
|
|
|
|
static inline bool udc_include_vbus_monitoring(void)
|
|
|
|
{
|
|
|
|
return udd_include_vbus_monitoring();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*! \brief Start the USB Device stack
|
|
|
|
*/
|
|
|
|
void udc_start(void);
|
|
|
|
|
|
|
|
/*! \brief Stop the USB Device stack
|
|
|
|
*/
|
|
|
|
void udc_stop(void);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Attach device to the bus when possible
|
|
|
|
*
|
|
|
|
* \warning If a VBus control is included in driver,
|
|
|
|
* then it will attach device when an acceptable Vbus
|
|
|
|
* level from the host is detected.
|
|
|
|
*/
|
|
|
|
static inline void udc_attach(void)
|
|
|
|
{
|
|
|
|
udd_attach();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Detaches the device from the bus
|
|
|
|
*
|
|
|
|
* The driver must remove pull-up on USB line D- or D+.
|
|
|
|
*/
|
|
|
|
static inline void udc_detach(void)
|
|
|
|
{
|
|
|
|
udd_detach();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/*! \brief The USB driver sends a resume signal called \e "Upstream Resume"
|
|
|
|
* This is authorized only when the remote wakeup feature is enabled by host.
|
|
|
|
*/
|
|
|
|
static inline void udc_remotewakeup(void)
|
|
|
|
{
|
|
|
|
udd_send_remotewakeup();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \brief Returns a pointer on the current interface descriptor
|
|
|
|
*
|
|
|
|
* \return pointer on the current interface descriptor.
|
|
|
|
*/
|
|
|
|
usb_iface_desc_t UDC_DESC_STORAGE *udc_get_interface_desc(void);
|
|
|
|
|
|
|
|
//@}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \ingroup usb_group
|
|
|
|
* \defgroup usb_device_group USB Stack Device
|
|
|
|
*
|
|
|
|
* This module includes USB Stack Device implementation.
|
|
|
|
* The stack is divided in three parts:
|
|
|
|
* - USB Device Controller (UDC) provides USB chapter 9 compliance
|
|
|
|
* - USB Device Interface (UDI) provides USB Class compliance
|
|
|
|
* - USB Device Driver (UDD) provides USB Driver for each Atmel MCU
|
|
|
|
|
|
|
|
* Many USB Device applications can be implemented on Atmel MCU.
|
|
|
|
* Atmel provides many application notes for different applications:
|
|
|
|
* - AVR4900, provides general information about Device Stack
|
|
|
|
* - AVR4901, explains how to create a new class
|
|
|
|
* - AVR4902, explains how to create a composite device
|
|
|
|
* - AVR49xx, all device classes provided in ASF have an application note
|
|
|
|
*
|
|
|
|
* A basic USB knowledge is required to understand the USB Device
|
|
|
|
* Class application notes (HID,MS,CDC,PHDC,...).
|
|
|
|
* Then, to create an USB device with
|
|
|
|
* only one class provided by ASF, refer directly to the application note
|
|
|
|
* corresponding to this USB class. The USB Device application note for
|
|
|
|
* New Class and Composite is dedicated to advanced USB users.
|
|
|
|
*
|
|
|
|
* @{
|
|
|
|
*/
|
|
|
|
|
|
|
|
//! @}
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \ingroup udc_group
|
|
|
|
* \defgroup udc_basic_use_case_setup_prereq USB Device Controller (UDC) - Prerequisites
|
|
|
|
* Common prerequisites for all USB devices.
|
|
|
|
*
|
|
|
|
* This module is based on USB device stack full interrupt driven, and supporting
|
|
|
|
* \ref sleepmgr_group sleepmgr. For AVR and SAM3/4 devices the \ref clk_group clock services
|
|
|
|
* is supported. For SAMD devices the \ref asfdoc_sam0_system_clock_group clock driver is supported.
|
|
|
|
*
|
|
|
|
* The following procedure must be executed to setup the project correctly:
|
|
|
|
* - Specify the clock configuration:
|
|
|
|
* - XMEGA USB devices need 48MHz clock input.\n
|
|
|
|
* XMEGA USB devices need CPU frequency higher than 12MHz.\n
|
|
|
|
* You can use either an internal RC48MHz auto calibrated by Start of Frames
|
|
|
|
* or an external OSC.
|
|
|
|
* - UC3 and SAM3/4 devices without USB high speed support need 48MHz clock input.\n
|
|
|
|
* You must use a PLL and an external OSC.
|
|
|
|
* - UC3 and SAM3/4 devices with USB high speed support need 12MHz clock input.\n
|
|
|
|
* You must use an external OSC.
|
|
|
|
* - UC3 devices with USBC hardware need CPU frequency higher than 25MHz.
|
|
|
|
* - SAMD devices without USB high speed support need 48MHz clock input.\n
|
|
|
|
* You should use DFLL with USBCRM.
|
|
|
|
* - In conf_board.h, the define CONF_BOARD_USB_PORT must be added to enable USB lines.
|
|
|
|
* (Not mandatory for all boards)
|
|
|
|
* - Enable interrupts
|
|
|
|
* - Initialize the clock service
|
|
|
|
*
|
|
|
|
* The usage of \ref sleepmgr_group sleepmgr service is optional, but recommended to reduce power
|
|
|
|
* consumption:
|
|
|
|
* - Initialize the sleep manager service
|
|
|
|
* - Activate sleep mode when the application is in IDLE state
|
|
|
|
*
|
|
|
|
* \subpage udc_conf_clock.
|
|
|
|
*
|
|
|
|
* for AVR and SAM3/4 devices, add to the initialization code:
|
|
|
|
* \code
|
|
|
|
sysclk_init();
|
|
|
|
irq_initialize_vectors();
|
|
|
|
cpu_irq_enable();
|
|
|
|
board_init();
|
|
|
|
sleepmgr_init(); // Optional
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* For SAMD devices, add to the initialization code:
|
|
|
|
* \code
|
|
|
|
system_init();
|
|
|
|
irq_initialize_vectors();
|
|
|
|
cpu_irq_enable();
|
|
|
|
sleepmgr_init(); // Optional
|
|
|
|
\endcode
|
|
|
|
* Add to the main IDLE loop:
|
|
|
|
* \code
|
|
|
|
sleepmgr_enter_sleep(); // Optional
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \ingroup udc_group
|
|
|
|
* \defgroup udc_basic_use_case_setup_code USB Device Controller (UDC) - Example code
|
|
|
|
* Common example code for all USB devices.
|
|
|
|
*
|
|
|
|
* Content of conf_usb.h:
|
|
|
|
* \code
|
|
|
|
#define USB_DEVICE_VENDOR_ID 0x03EB
|
|
|
|
#define USB_DEVICE_PRODUCT_ID 0xXXXX
|
|
|
|
#define USB_DEVICE_MAJOR_VERSION 1
|
|
|
|
#define USB_DEVICE_MINOR_VERSION 0
|
|
|
|
#define USB_DEVICE_POWER 100
|
|
|
|
#define USB_DEVICE_ATTR USB_CONFIG_ATTR_BUS_POWERED
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* Add to application C-file:
|
|
|
|
* \code
|
|
|
|
void usb_init(void)
|
|
|
|
{
|
|
|
|
udc_start();
|
|
|
|
}
|
|
|
|
\endcode
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \ingroup udc_group
|
|
|
|
* \defgroup udc_basic_use_case_setup_flow USB Device Controller (UDC) - Workflow
|
|
|
|
* Common workflow for all USB devices.
|
|
|
|
*
|
|
|
|
* -# Ensure that conf_usb.h is available and contains the following configuration
|
|
|
|
* which is the main USB device configuration:
|
|
|
|
* - \code // Vendor ID provided by USB org (ATMEL 0x03EB)
|
|
|
|
#define USB_DEVICE_VENDOR_ID 0x03EB // Type Word
|
|
|
|
// Product ID (Atmel PID referenced in usb_atmel.h)
|
|
|
|
#define USB_DEVICE_PRODUCT_ID 0xXXXX // Type Word
|
|
|
|
// Major version of the device
|
|
|
|
#define USB_DEVICE_MAJOR_VERSION 1 // Type Byte
|
|
|
|
// Minor version of the device
|
|
|
|
#define USB_DEVICE_MINOR_VERSION 0 // Type Byte
|
|
|
|
// Maximum device power (mA)
|
|
|
|
#define USB_DEVICE_POWER 100 // Type 9-bits
|
|
|
|
// USB attributes to enable features
|
|
|
|
#define USB_DEVICE_ATTR USB_CONFIG_ATTR_BUS_POWERED // Flags \endcode
|
|
|
|
* -# Call the USB device stack start function to enable stack and start USB:
|
|
|
|
* - \code udc_start(); \endcode
|
|
|
|
* \note In case of USB dual roles (Device and Host) managed through USB OTG connector
|
|
|
|
* (USB ID pin), the call of udc_start() must be removed and replaced by uhc_start().
|
|
|
|
* SeRefer to "AVR4950 section 6.1 Dual roles" for further information about dual roles.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \page udc_conf_clock conf_clock.h examples with USB support
|
|
|
|
*
|
|
|
|
* Content of XMEGA conf_clock.h:
|
|
|
|
* \code
|
|
|
|
// Configuration based on internal RC:
|
|
|
|
// USB clock need of 48Mhz
|
|
|
|
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_RCOSC
|
|
|
|
#define CONFIG_OSC_RC32_CAL 48000000UL
|
|
|
|
#define CONFIG_OSC_AUTOCAL_RC32MHZ_REF_OSC OSC_ID_USBSOF
|
|
|
|
// CPU clock need of clock > 12MHz to run with USB (Here 24MHz)
|
|
|
|
#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_RC32MHZ
|
|
|
|
#define CONFIG_SYSCLK_PSADIV SYSCLK_PSADIV_2
|
|
|
|
#define CONFIG_SYSCLK_PSBCDIV SYSCLK_PSBCDIV_1_1
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* Content of conf_clock.h for AT32UC3A0, AT32UC3A1, AT32UC3B devices (USBB):
|
|
|
|
* \code
|
|
|
|
// Configuration based on 12MHz external OSC:
|
|
|
|
#define CONFIG_PLL1_SOURCE PLL_SRC_OSC0
|
|
|
|
#define CONFIG_PLL1_MUL 8
|
|
|
|
#define CONFIG_PLL1_DIV 2
|
|
|
|
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1
|
|
|
|
#define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div)
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* Content of conf_clock.h for AT32UC3A3, AT32UC3A4 devices (USBB with high speed support):
|
|
|
|
* \code
|
|
|
|
// Configuration based on 12MHz external OSC:
|
|
|
|
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_OSC0
|
|
|
|
#define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div)
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* Content of conf_clock.h for AT32UC3C, ATUCXXD, ATUCXXL3U, ATUCXXL4U devices (USBC):
|
|
|
|
* \code
|
|
|
|
// Configuration based on 12MHz external OSC:
|
|
|
|
#define CONFIG_PLL1_SOURCE PLL_SRC_OSC0
|
|
|
|
#define CONFIG_PLL1_MUL 8
|
|
|
|
#define CONFIG_PLL1_DIV 2
|
|
|
|
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1
|
|
|
|
#define CONFIG_USBCLK_DIV 1 // Fusb = Fsys/(2 ^ USB_div)
|
|
|
|
// CPU clock need of clock > 25MHz to run with USBC
|
|
|
|
#define CONFIG_SYSCLK_SOURCE SYSCLK_SRC_PLL1
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* Content of conf_clock.h for SAM3S, SAM3SD, SAM4S devices (UPD: USB Peripheral Device):
|
|
|
|
* \code
|
|
|
|
// PLL1 (B) Options (Fpll = (Fclk * PLL_mul) / PLL_div)
|
|
|
|
#define CONFIG_PLL1_SOURCE PLL_SRC_MAINCK_XTAL
|
|
|
|
#define CONFIG_PLL1_MUL 16
|
|
|
|
#define CONFIG_PLL1_DIV 2
|
|
|
|
// USB Clock Source Options (Fusb = FpllX / USB_div)
|
|
|
|
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_PLL1
|
|
|
|
#define CONFIG_USBCLK_DIV 2
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* Content of conf_clock.h for SAM3U device (UPDHS: USB Peripheral Device High Speed):
|
|
|
|
* \code
|
|
|
|
// USB Clock Source fixed at UPLL.
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* Content of conf_clock.h for SAM3X, SAM3A devices (UOTGHS: USB OTG High Speed):
|
|
|
|
* \code
|
|
|
|
// USB Clock Source fixed at UPLL.
|
|
|
|
#define CONFIG_USBCLK_SOURCE USBCLK_SRC_UPLL
|
|
|
|
#define CONFIG_USBCLK_DIV 1
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* Content of conf_clocks.h for SAMD devices (USB):
|
|
|
|
* \code
|
|
|
|
// System clock bus configuration
|
|
|
|
# define CONF_CLOCK_FLASH_WAIT_STATES 2
|
|
|
|
|
|
|
|
// USB Clock Source fixed at DFLL.
|
|
|
|
// SYSTEM_CLOCK_SOURCE_DFLL configuration - Digital Frequency Locked Loop
|
|
|
|
# define CONF_CLOCK_DFLL_ENABLE true
|
|
|
|
# define CONF_CLOCK_DFLL_LOOP_MODE SYSTEM_CLOCK_DFLL_LOOP_MODE_USB_RECOVERY
|
|
|
|
# define CONF_CLOCK_DFLL_ON_DEMAND true
|
|
|
|
|
2018-01-05 17:10:55 +01:00
|
|
|
// Set this to true to configure the GCLK when running clocks_init.
|
2017-12-21 06:42:46 +01:00
|
|
|
// If set to false, none of the GCLK generators will be configured in clocks_init().
|
|
|
|
# define CONF_CLOCK_CONFIGURE_GCLK true
|
|
|
|
|
|
|
|
// Configure GCLK generator 0 (Main Clock)
|
|
|
|
# define CONF_CLOCK_GCLK_0_ENABLE true
|
|
|
|
# define CONF_CLOCK_GCLK_0_RUN_IN_STANDBY true
|
|
|
|
# define CONF_CLOCK_GCLK_0_CLOCK_SOURCE SYSTEM_CLOCK_SOURCE_DFLL
|
|
|
|
# define CONF_CLOCK_GCLK_0_PRESCALER 1
|
|
|
|
# define CONF_CLOCK_GCLK_0_OUTPUT_ENABLE false
|
|
|
|
\endcode
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \page udc_use_case_1 Change USB speed
|
|
|
|
*
|
|
|
|
* In this use case, the USB device is used with different USB speeds.
|
|
|
|
*
|
|
|
|
* \section udc_use_case_1_setup Setup steps
|
|
|
|
*
|
|
|
|
* Prior to implement this use case, be sure to have already
|
|
|
|
* apply the UDI module "basic use case".
|
|
|
|
*
|
|
|
|
* \section udc_use_case_1_usage Usage steps
|
|
|
|
*
|
|
|
|
* \subsection udc_use_case_1_usage_code Example code
|
|
|
|
* Content of conf_usb.h:
|
|
|
|
* \code
|
|
|
|
#if // Low speed
|
|
|
|
#define USB_DEVICE_LOW_SPEED
|
|
|
|
// #define USB_DEVICE_HS_SUPPORT
|
|
|
|
|
|
|
|
#elif // Full speed
|
|
|
|
// #define USB_DEVICE_LOW_SPEED
|
|
|
|
// #define USB_DEVICE_HS_SUPPORT
|
|
|
|
|
|
|
|
#elif // High speed
|
|
|
|
// #define USB_DEVICE_LOW_SPEED
|
|
|
|
#define USB_DEVICE_HS_SUPPORT
|
|
|
|
|
|
|
|
#endif
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* \subsection udc_use_case_1_usage_flow Workflow
|
|
|
|
* -# Ensure that conf_usb.h is available and contains the following parameters
|
|
|
|
* required for a USB device low speed (1.5Mbit/s):
|
|
|
|
* - \code #define USB_DEVICE_LOW_SPEED
|
|
|
|
//#define USB_DEVICE_HS_SUPPORT \endcode
|
|
|
|
* -# Ensure that conf_usb.h contains the following parameters
|
|
|
|
* required for a USB device full speed (12Mbit/s):
|
|
|
|
* - \code //#define USB_DEVICE_LOW_SPEED
|
|
|
|
//#define USB_DEVICE_HS_SUPPORT \endcode
|
|
|
|
* -# Ensure that conf_usb.h contains the following parameters
|
|
|
|
* required for a USB device high speed (480Mbit/s):
|
|
|
|
* - \code //#define USB_DEVICE_LOW_SPEED
|
|
|
|
#define USB_DEVICE_HS_SUPPORT \endcode
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \page udc_use_case_2 Use USB strings
|
|
|
|
*
|
|
|
|
* In this use case, the usual USB strings is added in the USB device.
|
|
|
|
*
|
|
|
|
* \section udc_use_case_2_setup Setup steps
|
|
|
|
* Prior to implement this use case, be sure to have already
|
|
|
|
* apply the UDI module "basic use case".
|
|
|
|
*
|
|
|
|
* \section udc_use_case_2_usage Usage steps
|
|
|
|
*
|
|
|
|
* \subsection udc_use_case_2_usage_code Example code
|
|
|
|
* Content of conf_usb.h:
|
|
|
|
* \code
|
|
|
|
#define USB_DEVICE_MANUFACTURE_NAME "Manufacture name"
|
|
|
|
#define USB_DEVICE_PRODUCT_NAME "Product name"
|
|
|
|
#define USB_DEVICE_SERIAL_NAME "12...EF"
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* \subsection udc_use_case_2_usage_flow Workflow
|
|
|
|
* -# Ensure that conf_usb.h is available and contains the following parameters
|
|
|
|
* required to enable different USB strings:
|
|
|
|
* - \code // Static ASCII name for the manufacture
|
|
|
|
#define USB_DEVICE_MANUFACTURE_NAME "Manufacture name" \endcode
|
|
|
|
* - \code // Static ASCII name for the product
|
|
|
|
#define USB_DEVICE_PRODUCT_NAME "Product name" \endcode
|
|
|
|
* - \code // Static ASCII name to enable and set a serial number
|
|
|
|
#define USB_DEVICE_SERIAL_NAME "12...EF" \endcode
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \page udc_use_case_3 Use USB remote wakeup feature
|
|
|
|
*
|
|
|
|
* In this use case, the USB remote wakeup feature is enabled.
|
|
|
|
*
|
|
|
|
* \section udc_use_case_3_setup Setup steps
|
|
|
|
* Prior to implement this use case, be sure to have already
|
|
|
|
* apply the UDI module "basic use case".
|
|
|
|
*
|
|
|
|
* \section udc_use_case_3_usage Usage steps
|
|
|
|
*
|
|
|
|
* \subsection udc_use_case_3_usage_code Example code
|
|
|
|
* Content of conf_usb.h:
|
|
|
|
* \code
|
|
|
|
#define USB_DEVICE_ATTR \
|
|
|
|
(USB_CONFIG_ATTR_REMOTE_WAKEUP | USB_CONFIG_ATTR_..._POWERED)
|
|
|
|
#define UDC_REMOTEWAKEUP_ENABLE() my_callback_remotewakeup_enable()
|
|
|
|
extern void my_callback_remotewakeup_enable(void);
|
|
|
|
#define UDC_REMOTEWAKEUP_DISABLE() my_callback_remotewakeup_disable()
|
|
|
|
extern void my_callback_remotewakeup_disable(void);
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* Add to application C-file:
|
|
|
|
* \code
|
|
|
|
void my_callback_remotewakeup_enable(void)
|
|
|
|
{
|
|
|
|
// Enable application wakeup events (e.g. enable GPIO interrupt)
|
|
|
|
}
|
|
|
|
void my_callback_remotewakeup_disable(void)
|
|
|
|
{
|
|
|
|
// Disable application wakeup events (e.g. disable GPIO interrupt)
|
|
|
|
}
|
|
|
|
|
|
|
|
void my_interrupt_event(void)
|
|
|
|
{
|
|
|
|
udc_remotewakeup();
|
|
|
|
}
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* \subsection udc_use_case_3_usage_flow Workflow
|
|
|
|
* -# Ensure that conf_usb.h is available and contains the following parameters
|
|
|
|
* required to enable remote wakeup feature:
|
|
|
|
* - \code // Authorizes the remote wakeup feature
|
|
|
|
#define USB_DEVICE_ATTR (USB_CONFIG_ATTR_REMOTE_WAKEUP | USB_CONFIG_ATTR_..._POWERED) \endcode
|
|
|
|
* - \code // Define callback called when the host enables the remotewakeup feature
|
|
|
|
#define UDC_REMOTEWAKEUP_ENABLE() my_callback_remotewakeup_enable()
|
|
|
|
extern void my_callback_remotewakeup_enable(void); \endcode
|
|
|
|
* - \code // Define callback called when the host disables the remotewakeup feature
|
|
|
|
#define UDC_REMOTEWAKEUP_DISABLE() my_callback_remotewakeup_disable()
|
|
|
|
extern void my_callback_remotewakeup_disable(void); \endcode
|
|
|
|
* -# Send a remote wakeup (USB upstream):
|
|
|
|
* - \code udc_remotewakeup(); \endcode
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \page udc_use_case_5 Bus power application recommendations
|
|
|
|
*
|
|
|
|
* In this use case, the USB device BUS power feature is enabled.
|
|
|
|
* This feature requires a correct power consumption management.
|
|
|
|
*
|
|
|
|
* \section udc_use_case_5_setup Setup steps
|
|
|
|
* Prior to implement this use case, be sure to have already
|
|
|
|
* apply the UDI module "basic use case".
|
|
|
|
*
|
|
|
|
* \section udc_use_case_5_usage Usage steps
|
|
|
|
*
|
|
|
|
* \subsection udc_use_case_5_usage_code Example code
|
|
|
|
* Content of conf_usb.h:
|
|
|
|
* \code
|
|
|
|
#define USB_DEVICE_ATTR (USB_CONFIG_ATTR_BUS_POWERED)
|
|
|
|
#define UDC_SUSPEND_EVENT() user_callback_suspend_action()
|
|
|
|
extern void user_callback_suspend_action(void)
|
|
|
|
#define UDC_RESUME_EVENT() user_callback_resume_action()
|
|
|
|
extern void user_callback_resume_action(void)
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* Add to application C-file:
|
|
|
|
* \code
|
|
|
|
void user_callback_suspend_action(void)
|
|
|
|
{
|
|
|
|
// Disable hardware component to reduce power consumption
|
|
|
|
}
|
|
|
|
void user_callback_resume_action(void)
|
|
|
|
{
|
|
|
|
// Re-enable hardware component
|
|
|
|
}
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* \subsection udc_use_case_5_usage_flow Workflow
|
|
|
|
* -# Ensure that conf_usb.h is available and contains the following parameters:
|
|
|
|
* - \code // Authorizes the BUS power feature
|
|
|
|
#define USB_DEVICE_ATTR (USB_CONFIG_ATTR_BUS_POWERED) \endcode
|
|
|
|
* - \code // Define callback called when the host suspend the USB line
|
|
|
|
#define UDC_SUSPEND_EVENT() user_callback_suspend_action()
|
|
|
|
extern void user_callback_suspend_action(void); \endcode
|
|
|
|
* - \code // Define callback called when the host or device resume the USB line
|
|
|
|
#define UDC_RESUME_EVENT() user_callback_resume_action()
|
|
|
|
extern void user_callback_resume_action(void); \endcode
|
|
|
|
* -# Reduce power consumption in suspend mode (max. 2.5mA on Vbus):
|
|
|
|
* - \code void user_callback_suspend_action(void)
|
|
|
|
{
|
|
|
|
turn_off_components();
|
|
|
|
} \endcode
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* \page udc_use_case_6 USB dynamic serial number
|
|
|
|
*
|
|
|
|
* In this use case, the USB serial strings is dynamic.
|
|
|
|
* For a static serial string refer to \ref udc_use_case_2.
|
|
|
|
*
|
|
|
|
* \section udc_use_case_6_setup Setup steps
|
|
|
|
* Prior to implement this use case, be sure to have already
|
|
|
|
* apply the UDI module "basic use case".
|
|
|
|
*
|
|
|
|
* \section udc_use_case_6_usage Usage steps
|
|
|
|
*
|
|
|
|
* \subsection udc_use_case_6_usage_code Example code
|
|
|
|
* Content of conf_usb.h:
|
|
|
|
* \code
|
|
|
|
#define USB_DEVICE_SERIAL_NAME
|
|
|
|
#define USB_DEVICE_GET_SERIAL_NAME_POINTER serial_number
|
|
|
|
#define USB_DEVICE_GET_SERIAL_NAME_LENGTH 12
|
|
|
|
extern uint8_t serial_number[];
|
|
|
|
\endcode
|
|
|
|
*
|
|
|
|
* Add to application C-file:
|
|
|
|
* \code
|
|
|
|
uint8_t serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH];
|
|
|
|
|
|
|
|
void init_build_usb_serial_number(void)
|
|
|
|
{
|
|
|
|
serial_number[0] = 'A';
|
|
|
|
serial_number[1] = 'B';
|
|
|
|
...
|
|
|
|
serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH-1] = 'C';
|
|
|
|
} \endcode
|
|
|
|
*
|
|
|
|
* \subsection udc_use_case_6_usage_flow Workflow
|
|
|
|
* -# Ensure that conf_usb.h is available and contains the following parameters
|
|
|
|
* required to enable a USB serial number strings dynamically:
|
|
|
|
* - \code #define USB_DEVICE_SERIAL_NAME // Define this empty
|
|
|
|
#define USB_DEVICE_GET_SERIAL_NAME_POINTER serial_number // Give serial array pointer
|
|
|
|
#define USB_DEVICE_GET_SERIAL_NAME_LENGTH 12 // Give size of serial array
|
|
|
|
extern uint8_t serial_number[]; // Declare external serial array \endcode
|
|
|
|
* -# Before start USB stack, initialize the serial array
|
|
|
|
* - \code
|
|
|
|
uint8_t serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH];
|
|
|
|
|
|
|
|
void init_build_usb_serial_number(void)
|
|
|
|
{
|
|
|
|
serial_number[0] = 'A';
|
|
|
|
serial_number[1] = 'B';
|
|
|
|
...
|
|
|
|
serial_number[USB_DEVICE_GET_SERIAL_NAME_LENGTH-1] = 'C';
|
|
|
|
} \endcode
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif // _UDC_H_
|