123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697 |
- /**
- * \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="https://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:
- * \code
- // 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:
- * \code
- 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
-
- // Set this to true to configure the GCLK when running clocks_init.
- // 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_
|