| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- //*****************************************************************************
- //
- // usbtick.c - Functions related to USB stack tick timer handling.
- //
- // Copyright (c) 2008-2010 Texas Instruments Incorporated. All rights reserved.
- // Software License Agreement
- //
- // Texas Instruments (TI) is supplying this software for use solely and
- // exclusively on TI's microcontroller products. The software is owned by
- // TI and/or its suppliers, and is protected under applicable copyright
- // laws. You may not combine this software with "viral" open-source
- // software in order to form a larger program.
- //
- // THIS SOFTWARE IS PROVIDED "AS IS" AND WITH ALL FAULTS.
- // NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, INCLUDING, BUT
- // NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- // A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE. TI SHALL NOT, UNDER ANY
- // CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR CONSEQUENTIAL
- // DAMAGES, FOR ANY REASON WHATSOEVER.
- //
- // This is part of AM1808 Sitaraware USB Library and reused from revision 6288
- // of the Stellaris USB Library.
- //
- //*****************************************************************************
- #include "hw_types.h"
- #include "debug.h"
- #include "usblib.h"
- #include "usblibpriv.h"
- //*****************************************************************************
- //
- //! \addtogroup general_usblib_api
- //! @{
- //
- //*****************************************************************************
- //*****************************************************************************
- //
- // These are the internal timer tick handlers used by the USB stack. Handlers
- // in g_pfTickHandlers are called in the context of the USB SOF interrupt
- // every USB_SOF_TICK_DIVIDE milliseconds.
- //
- //*****************************************************************************
- tUSBTickHandler g_pfTickHandlers[USB_TICK_HANDLER_NUM];
- void *g_pvTickInstance[USB_TICK_HANDLER_NUM];
- //*****************************************************************************
- //
- // Flag to indicate whether or not we have been initialized.
- //
- //*****************************************************************************
- tBoolean g_bUSBTimerInitialized = false;
- //*****************************************************************************
- //
- // This is the current tick value in ms for the system. This is used for all
- // instances of USB controllers and for all timer tick handlers.
- //
- //*****************************************************************************
- unsigned int g_ulCurrentUSBTick = 0;
- //*****************************************************************************
- //
- // This is the total number of SOF interrupts received since the system
- // booted. The value is incremented by the low level device- or host-interrupt
- // handler functions.
- //
- //*****************************************************************************
- unsigned int g_ulUSBSOFCount = 0;
- //*****************************************************************************
- //
- // This internal function initializes the variables used in processing timer
- // ticks.
- //
- // This function should only be called from within the USB library. It is set
- // up to ensure that it can be called multiple times if necessary without
- // the previous configuration being erased (to cater for OTG mode switching).
- //
- // \return None.
- //
- //*****************************************************************************
- void
- InternalUSBTickInit(void)
- {
- unsigned int ulLoop;
- if(!g_bUSBTimerInitialized)
- {
- for(ulLoop = 0; ulLoop < USB_TICK_HANDLER_NUM; ulLoop++)
- {
- g_pfTickHandlers[ulLoop] = (tUSBTickHandler)0;
- g_pvTickInstance[ulLoop] = 0;
- }
- g_bUSBTimerInitialized = true;
- }
- }
- //*****************************************************************************
- //
- // This internal function handles registering OTG, Host, or Device SOF timer
- // handler functions.
- //
- // \param ulHandler specifies which type of handler to register.
- // \param pfHandler specifies the handler to call for the given type of
- // handler.
- //
- // This function should only be called inside the USB library and only as a
- // result to a call to reinitialize the stack in a new mode. Currently the
- // following 3 types of timer tick handlers can be registered:
- // TICK_HANDLER_OTG, TICK_HANDLER_HOST, or TICK_HANDLER_DEVICE. Handlers
- // registered via this function are called in the context of the SOF interrupt.
- //
- // \return None.
- //
- //*****************************************************************************
- void
- InternalUSBRegisterTickHandler(unsigned int ulHandler,
- tUSBTickHandler pfHandler,
- void *pvInstance)
- {
- ASSERT(ulHandler < USB_TICK_HANDLER_NUM);
- //
- // Save the handler.
- //
- g_pfTickHandlers[ulHandler] = pfHandler;
- //
- // Save the instance data.
- //
- g_pvTickInstance[ulHandler] = pvInstance;
- }
- //*****************************************************************************
- //
- //! \internal
- //!
- //! Calls internal handlers in response to a tick based on the start of frame
- //! interrupt.
- //!
- //! \param ulTicksmS specifies how many milliseconds have passed since the last
- //! call to this function.
- //!
- //! This function is called every 5mS in the context of the Start of Frame
- //! (SOF) interrupt. It is used to call any registered internal tick
- //! functions.
- //!
- //! This function should only be called from within the USB library.
- //!
- //! \return None.
- //
- //*****************************************************************************
- void InternalUSBStartOfFrameTick(unsigned int ulTicksmS,
- unsigned int ulIndex)
- {
- int iIdx;
- //
- // Advance time.
- //
- g_ulCurrentUSBTick += ulTicksmS;
- //
- // Call any registered SOF tick handlers.
- //
- for(iIdx = 0; iIdx < USB_TICK_HANDLER_NUM; iIdx++)
- {
- if(g_pfTickHandlers[iIdx])
- {
- g_pfTickHandlers[iIdx](g_pvTickInstance[iIdx], ulTicksmS, ulIndex);
- }
- }
- }
- //*****************************************************************************
- //
- // Close the Doxygen group.
- //! @}
- //
- //*****************************************************************************
|