123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- /***********************************************************************************
- 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
|