123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- /***********************************************************************************
- Filename: usb_interrupt.h
- Description: USB library interrupt initialisation and ISR.
- ***********************************************************************************/
- #ifndef USBINTERRUPT_H
- #define USBINTERRUPT_H
- /** \addtogroup module_usb_interrupt USB Interrupt (usbirq)
- * \brief This module contains the USB interrupt handler, which converts USB interrupts to USBIRQ events.
- *
- * This module contains two interrupt service routines:
- * \li P0 ISR
- * \li P2 ISR
- * Both these are used by the USB part of the MCU. Hence it is recommended to only use P1 for
- * interrupts from any peripherals connected to the MCU. Unless running low on GPIO pins, one should
- * generally avoid using the P0 and P2 pins at all.
- *
- * The MCU contains three interrupt flag registers, USBCIE, USBIIE and USBOIE, which are all cleared
- * upon read access. The \ref module_usb_interrupt module encapsulates the USB interrupts, and saves the
- * three flag registers in a single 16-bit word. By doing that it becomes possible to process
- * high-priority events in the interrupt context, and low-priority events in the main loop.
- *
- * \section section_usbirq_initialization Initialization
- * After initializing the \ref module_usb_framework module, \c main() must call \ref usbirqInit(). The
- * \c irqMask parameter of this function shall contain all \c USBIRQ_EVENT bits that will be handled
- * either in the interrupt or in \c main(). Note, however, that the event reporting may not always be
- * necessary. For instance, there is usually no reason to enable \c USBIRQ_EVENT_EPxIN or
- * \c USBIRQ_EVENT_EPxOUT events when handling low-priority transfers in the \c main() loop. In these
- * cases it is simpler and more efficient to check the arming condition of the endpoint in question.
- *
- * The following example enables the setup and reset events (which must always be enabled!), and turns on
- * global interrupts:
- * \code
- * void main(void) {
- *
- * ... Initialize the crystal oscillator and USB framework first ...
- *
- * // Initialize the USB Interrupt module
- * usbirqInit(USBIRQ_EVENT_RESET | USBIRQ_EVENT_SUSPEND | USBIRQ_EVENT_RESUME | USBIRQ_EVENT_SETUP);
- *
- * // Turn on interrupts
- * INT_GLOBAL_ENABLE();
- *
- * // Main loop
- * while (1) {
- * ...
- * }
- * \endcode
- *
- * \section section_usbirq_event_processing Event Processing
- * Regardless of whether the interrupt event is processed in the interrupt or in the main loop, the code
- * piece for doing it is the same (this example illustrates the processing of \ref USBIRQ_EVENT_RESET
- * events):
- * \code
- * // Let the framework handle reset events :)
- * if (USBIRQ_GET_EVENT_MASK() & USBIRQ_EVENT_RESET) {
- * USBIRQ_CLEAR_EVENTS(USBIRQ_EVENT_RESET);
- * usbfwResetHandler();
- * }
- * \endcode
- *
- * \section Hooks
- * The following hook is called from the USB interrupt, and allows for event processing in the interrupt
- * context:
- * \code
- * void usbirqHookProcessEvents(void) {
- * // Process high-priority events here, or simply return if there are none
- * }
- * \endcode
- * @{
- */
- #include "usb_framework_structs.h"
- #ifdef EXTERN
- #undef EXTERN
- #endif
- #ifdef USBINTERRUPT_C
- #define EXTERN ///< Definition used only for usb_interrupt.c to declare variable
- #else
- #define EXTERN extern ///< Definition used in other source files to declare external
- #endif
- //-------------------------------------------------------------------------------------------------------
- /// USBIRQ internal module data
- /*typedef struct {
- uint16 eventMask; ///< Bit mask containing all pending events (see the \c USBIRQ_EVENT definitions)
- BOOL inSuspend; ///< Is currently in suspend?
- uint16 irqMask; ///< USB interrupts to be enabled
- } USBIRQ_DATA;*/
- #ifdef USBIRQ_DATA_ADDR
- EXTERN __no_init __data USBIRQ_DATA usbirqData @ USBIRQ_DATA_ADDR; ///< USBIRQ internal module data at fixed address
- #else
- EXTERN USBIRQ_DATA __data usbirqData; ///< USBIRQ internal module data
- #endif
- //-------------------------------------------------------------------------------------------------------
- //-------------------------------------------------------------------------------------------------------
- /// \name USB Interrupt Events
- //@{
- /// Suspend signaling detected on the USB bus
- /// Note that the chip should not enter PM1 while still in the interrupt routine (inside the usbirqHookProcessEvents() function )
- #define USBIRQ_EVENT_SUSPEND 0x0001
- /// Resume signaling detected on the USB bus
- #define USBIRQ_EVENT_RESUME 0x0002
- /// Reset signaling detected on the USB bus (call \ref usbfwResetHandler() for processing)
- #define USBIRQ_EVENT_RESET 0x0004
- /// Start of frame token received (synthesized by hardware when the next SOF token is expected, so that missing or corrupted tokens have no effect)
- #define USBIRQ_EVENT_START_OF_FRAME 0x0008
- /// Endpoint 0 IN/OUT setup/data transfer complete / stall sent / premature completion (call \ref usbfwSetupHandler() for processing)
- #define USBIRQ_EVENT_SETUP 0x0010
- /// Endpoint 1 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent
- #define USBIRQ_EVENT_EP1IN 0x0020
- /// Endpoint 2 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent
- #define USBIRQ_EVENT_EP2IN 0x0040
- /// Endpoint 3 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent
- #define USBIRQ_EVENT_EP3IN 0x0080
- /// Endpoint 4 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent
- #define USBIRQ_EVENT_EP4IN 0x0100
- /// Endpoint 5 IN data successfully transmitted to host (FIFO disarmed) / FIFO flushed / stall sent
- #define USBIRQ_EVENT_EP5IN 0x0200
- /// Endpoint 1 OUT data received from host (FIFO disarmed) / stall sent
- #define USBIRQ_EVENT_EP1OUT 0x0400
- /// Endpoint 2 OUT data received from host (FIFO disarmed) / stall sent
- #define USBIRQ_EVENT_EP2OUT 0x0800
- /// Endpoint 3 OUT data received from host (FIFO disarmed) / stall sent
- #define USBIRQ_EVENT_EP3OUT 0x1000
- /// Endpoint 4 OUT data received from host (FIFO disarmed) / stall sent
- #define USBIRQ_EVENT_EP4OUT 0x2000
- /// Endpoint 5 OUT data received from host (FIFO disarmed) / stall sent
- #define USBIRQ_EVENT_EP5OUT 0x4000
- //@}
- //-------------------------------------------------------------------------------------------------------
- //-------------------------------------------------------------------------------------------------------
- /// \name Interrupt Mask Access Macros
- //@{
- /// Clears one or more events (use one or more \c USBIRQ_EVENT bits OR'ed together)
- #define USBIRQ_CLEAR_EVENTS(mask) (usbirqData.eventMask &= ~(mask))
- /// Get the bit mask containing all pending events
- #define USBIRQ_GET_EVENT_MASK() (usbirqData.eventMask)
- //@}
- //-------------------------------------------------------------------------------------------------------
- //-------------------------------------------------------------------------------------------------------
- /// \name Interrupt Event Hooks
- //@{
- /// Called upon all USB interrupts for high-priority event processing
- void usbirqHookProcessEvents(void);
- //@}
- //-------------------------------------------------------------------------------------------------------
- //-------------------------------------------------------------------------------------------------------
- // Function prototypes
- void usbirqInit(uint16 irqMask);
- #if defined HAL_SB_BOOT_CODE
- void usbirqHandler(void);
- #else
- __interrupt void usbirqHandler(void);
- #endif
- //-------------------------------------------------------------------------------------------------------
- //@}
- /*
- +------------------------------------------------------------------------------
- | 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
|