/***********************************************************************************

    Filename:     usb_suspend.h

    Description:  Handle the USB suspend state.

***********************************************************************************/

#ifndef USBSUSPEND_H
#define USBSUSPEND_H
/** \addtogroup module_usb_suspend USB Suspend (usbsusp)
 * \brief This module contains the functionality for USB suspend, USB resume and USB remote wakeup.
 *
 * All USB devices must support the suspended state to fully comply with the USB specification. Special
 * care must be taken to implement this functionality correctly, so follow the instructions below
 * carefully. Refer to the USB specification for detailed information on current consumption in suspend
 * mode (how power consumption shall be measured, averaging, peak value etc.).
 *
 * \section usb_suspend_resume USB Suspend and Resume
 * If there is no activity on the USB bus for a period longer than 3 ms, the MCU will generate a
 * \ref USBIRQ_EVENT_SUSPEND event. The USB device must then enter suspend mode within 10 ms, where it
 * draws no more than:
 * \li 500 uA for low-power devices or high-power devices operating at lower-power
 * \li 2.5 mA for high-power devices with remote wake-up enabled
 *
 * The library supports the USB suspend and resume functionality through a simple interface:
 * \li Make sure that the 48 MHz XOSC is never turned off anywhere in the application.
 * \li In the call to \ref usbirqInit(), add \ref USBIRQ_EVENT_SUSPEND and \ref USBIRQ_EVENT_RESUME
 *     (optional) to the interrupt mask.
 * \li Do NOT process \ref USBIRQ_EVENT_SUSPEND in \ref usbirqHookProcessEvents() or in any other
 *     interrupt service routine. This may (or in most cases will) prevent the USB device from getting
 *     out of suspend mode.
 *
 * \li In the main loop, add the code shown below. Make sure that this code is visited at least every
 *     10 ms. If the worst-case path through the main loop uses more than 10 ms, the code block can be
 *     inserted in multiple places in the loop until the requirement is met.
 * \code
 * // Process USB suspend events
 * if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_SUSPEND) {
 *
 *    // Clear the suspend event
 *    USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_SUSPEND);
 *
 *    ... Do what needs to be done before entering power mode 1 here (e.g. turn off the radio, configure
 *        I/O to minimize power consumption, start the sleep timer etc.) ...
 *
 *    // This function call will take the USB device into power mode 1. It will not return until resume
 *    // signaling has been detected on the bus, or the remote wake-up function has been used. Other
 *    // interrupts (for instance from I/O ports or the sleep timer) can be used during this period. When
 *    // returning from these interrupts, the \ref usbsuspEnter() function (running here) will put the
 *    // MCU back into power mode 1.
 *    usbsuspEnter();
 *
 *    // At this point the event handler is up and running again. Clear the resume event.
 *    USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESUME);
 *
 *    ... If a USBIRQ_EVENT_RESET event will affect the code that follows (before the event is processed
 *        elsewhere), then make sure to handle it here also ...
 *
 *    ... Do what needs to be done to wake up from suspend mode (e.g. turn on the radio, reactivate I/O
 *        and peripherals, turn off the sleep timer ...
 * }
 * \endcode
 *
 * \li All interrupts that run during suspension mode must start with the following code:
 * \code
 * while (!XOSC_STABLE);
 * \endcode
 *
 * \section usb_remote_wakeup USB Remote Wakeup:
 * Remote wakeup should be used when the USB device desires to initiate the resume process and wake up
 * the host. In a radio application this may happen when a particular radio packet is received, for
 * instance from a wireless keyboard or mouse.
 *
 * USB remote wakeup can only be performed if the host has given the device the privilege to do so. The
 * privilege to perform remote wakeup is requested by setting bit 5 in the \c bmAttributes field in
 * the \ref USB_CONFIGURATION_DESCRIPTOR. The host will then grant or recall the privilege through a
 * SET_FEATURE request, which is communicated through a \ref USBSR_EVENT_REMOTE_WAKEUP_ENABLED or
 * \ref USBSR_EVENT_REMOTE_WAKEUP_DISABLED event, respectively.
 *
 * The USB library handles the remote wakeup sequence automatically. Do the following to incorporate it
 * into the application:
 * \li Implement suspend and resume as described above.
 * \li In the USB descriptor, set bit 5 in bmAttributes in the configuration descriptor.
 * \li While the USB MCU is in USB suspend mode, remote wakeup can be performed from interrupt context
 *     (e.g. the sleep timer interrupt) by calling \ref usbsuspDoRemoteWakeup(). This function will
 *     return TRUE if successful or FALSE if remote wakeup is not permitted (by the host).
 * @{
 */
#include "usb_firmware_library_headers.h"

typedef void (*VFPTR)(void);

//-------------------------------------------------------------------------------------------------------
// Suspend enter/exit hooks
extern __xdata VFPTR pFnSuspendEnterHook;
extern __xdata VFPTR pFnSuspendExitHook;

//-------------------------------------------------------------------------------------------------------
// Function prototypes
void usbsuspEnter(void);
uint8 usbsuspDoRemoteWakeup(void);
void usbsuspStopPm1(void);
//-------------------------------------------------------------------------------------------------------

//@}

/*
+------------------------------------------------------------------------------
|  Copyright 2004-2007 Texas Instruments Incorporated. All rights reserved.
|
|  IMPORTANT: Your use of this Software is limited to those specific rights
|  granted under the terms of a software license agreement between the user who
|  downloaded the software, his/her employer (which must be your employer) and
|  Texas Instruments Incorporated (the "License"). You may not use this Software
|  unless you agree to abide by the terms of the License. The License limits
|  your use, and you acknowledge, that the Software may not be modified, copied
|  or distributed unless embedded on a Texas Instruments microcontroller or used
|  solely and exclusively in conjunction with a Texas Instruments radio
|  frequency transceiver, which is integrated into your product. Other than for
|  the foregoing purpose, you may not use, reproduce, copy, prepare derivative
|  works of, modify, distribute, perform, display or sell this Software and/or
|  its documentation for any purpose.
|
|  YOU FURTHER ACKNOWLEDGE AND AGREE THAT THE SOFTWARE AND DOCUMENTATION ARE
|  PROVIDED “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED,
|  INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY, TITLE,
|  NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL
|  TEXAS INSTRUMENTS OR ITS LICENSORS BE LIABLE OR OBLIGATED UNDER CONTRACT,
|  NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, BREACH OF WARRANTY, OR OTHER
|  LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT DAMAGES OR EXPENSES INCLUDING
|  BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, INDIRECT, PUNITIVE OR
|  CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, COST OF PROCUREMENT OF
|  SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY CLAIMS BY THIRD PARTIES
|  (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), OR OTHER SIMILAR COSTS.
|
|  Should you have any questions regarding your right to use this Software,
|  contact Texas Instruments Incorporated at www.TI.com.
|
+------------------------------------------------------------------------------
*/

#endif
