Adding HTML manifest
[transport-layer/transport-layer.git] / tl.c
1 /**************************************************************************************************
2   Filename:       peripheral.c
3   Revised:        $Date: 2015-01-23 11:01:40 -0800 (Fri, 23 Jan 2015) $
4   Revision:       $Revision: 41985 $
6   Description:    transport layer handling
9   Copyright (c) 2015, Texas Instruments
10   All rights reserved.
12   Redistribution and use in source and binary forms, with or without
13   modification, are permitted provided that the following conditions are met:
14   1. Redistributions of source code must retain the above copyright
15      notice, this list of conditions and the following disclaimer.
16   2. Redistributions in binary form must reproduce the above copyright
17      notice, this list of conditions and the following disclaimer in the
18      documentation and/or other materials provided with the distribution.
19   3. All advertising materials mentioning features or use of this software
20      must display the following acknowledgement:
21      This product includes software developed by the Texas Instruments.
22   4. Neither the name of the Texas Instruments nor the
23      names of its contributors may be used to endorse or promote products
24      derived from this software without specific prior written permission.
26   THIS SOFTWARE IS PROVIDED BY Texas Instruments ''AS IS'' AND ANY
27   EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
28   WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
29   DISCLAIMED. IN NO EVENT SHALL Texas Instruments BE LIABLE FOR ANY
30   DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
31   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
32   LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
33   ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
34   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36 **************************************************************************************************/
38 /*********************************************************************
39  * INCLUDES
40  */
41 #include <ti/sysbios/knl/Semaphore.h>   
42 #include <ti/sysbios/family/arm/m3/Hwi.h>
43 #include <ti/sysbios/knl/Task.h>
44    
45 #include "inc/npi_data.h"
46 #include "inc/npi_rxbuf.h"
47 #include "inc/npi_tl.h"
49 #include "tl.h"
50    
51 /*********************************************************************
52  * GLOBAL VARIABLES
53  */
55 //event flags
56 uint16_t TX_DONE_ISR_EVENT_FLAG = 0;
57 uint16_t MRDY_ISR_EVENT_FLAG = 0;
58 uint16_t TRANSPORT_RX_ISR_EVENT_FLAG = 0;
60 /*********************************************************************
61  * LOCAL VARIABLES
62  */
64 //stores any TL-related events
65 static uint16_t TL_events = 0;
67 //event values passed in from app
68 static uint16_t transport_tx_done_event = 0;
69 static uint16_t transport_rx_event = 0;
70 static uint16_t mrdy_event = 0;
72 //pointer to application's semaphore
73 static ICall_Semaphore *appSem = NULL;
74 //pointer to app callback function
75 static TLCBs_t *TL_AppCBs = NULL;
77 /*********************************************************************
78  * LOCAL FUNCTIONS
79  */
80 static void transportTxDoneCallBack(int size);
81 static void transportRXCallBack(int size);
82 static void MRDYEventCB(int size);
84 /*********************************************************************
85  *  FUNCTIONS DECLARATIONS
86  */
87 // -----------------------------------------------------------------------------
88 //! \brief      Call back function for TX Done event from driver.
89 //!
90 //! \param[in]  size    Number of bytes transmitted.
91 //!
92 //! \return     void
93 // -----------------------------------------------------------------------------
94 static void transportTxDoneCallBack(int size)
95 {
96   // Post the event to the task thread.
97   TX_DONE_ISR_EVENT_FLAG = transport_tx_done_event;
98   Semaphore_post(*appSem);
99 }
101 // -----------------------------------------------------------------------------
102 //! \brief      RX Callback provided to driver for RX Event (ie.Bytes
103 //!             received).
104 //!
105 //! \param[in]  size    Number of bytes received.
106 //!
107 //! \return     void
108 // -----------------------------------------------------------------------------
109 static void transportRXCallBack(int size)
111   //move bytes from driver buffer to TL circular buffer
112   NPIRxBuf_Read(size);
113   // Post the event to the task thread
114   TRANSPORT_RX_ISR_EVENT_FLAG = transport_rx_event;
115   Semaphore_post(*appSem);
118 // -----------------------------------------------------------------------------
119 //! \brief      RX Callback provided to driver for MRDY Event
120 //!
121 //! \param[in]  size    N/A
122 //!
123 //! \return     void
124 // -----------------------------------------------------------------------------
125 static void MRDYEventCB(int size)
127   //Post event to task thread
128   MRDY_ISR_EVENT_FLAG = mrdy_event;
129   Semaphore_post(*appSem);
132 /*********************************************************************
133  * GLOBAL FUNCTIONS
134  */
135 // -----------------------------------------------------------------------------
136 //! \brief      Perform any TL related processing of events
137 //!             posted from ISR's.
138 //!
139 //! \return     void
140 // -----------------------------------------------------------------------------
141 void TL_handleISRevent(void)
143   // Capture the ISR events flags now within a critical section.  
144   // We do this to avoid possible race conditions where the ISR is 
145   // modifying the event mask while the task is read/writing it.
146   UInt hwiKey = Hwi_disable(); 
147   UInt taskKey = Task_disable();
148   TL_events = TL_events | TX_DONE_ISR_EVENT_FLAG | 
149     MRDY_ISR_EVENT_FLAG | TRANSPORT_RX_ISR_EVENT_FLAG;
150   TX_DONE_ISR_EVENT_FLAG = 0;
151   MRDY_ISR_EVENT_FLAG = 0;
152   TRANSPORT_RX_ISR_EVENT_FLAG = 0;      
153   Task_restore(taskKey);
154   Hwi_restore(hwiKey);
155   
156   //handle driver events first to avoid race conditions
157   //MRDY event
158   if (TL_events & mrdy_event)
159   {
160     TL_events &= ~mrdy_event;
161 #ifdef POWER_SAVING
162     //perform handshaking
163     NPITL_handleMrdyEvent();
164 #endif //POWER_SAVING
165   }
166   
167   // The Transport Layer has received some bytes
168   if(TL_events & transport_rx_event)
169   {
170     //call application callback to parse data
171     if ((TL_AppCBs) && (TL_AppCBs->pfnTLpacketparser))
172     {
173       TL_AppCBs->pfnTLpacketparser();
174     }
175     
176     //continue reading if necessary
177     if (NPIRxBuf_GetRxBufCount() == 0)
178     {
179       // No additional bytes to collect, clear the read flag.
180       TL_events &= ~transport_rx_event;
181     }
182     else
183     {
184       // Additional bytes to collect, preserve the flag and repost
185       // to the semaphore to read again
186       Semaphore_post(*appSem);
187     }
188   }
189   
190   // The last transmission to the host has completed.
191   if(TL_events & transport_tx_done_event)
192   {
193     // Current TX is done.
194     TL_events &= ~transport_tx_done_event;
195   }    
198 // -----------------------------------------------------------------------------
199 //! \brief      Initialize TL 
200 //!
201 //! \param[in]  pAppSem    pointer to semaphore used by the application for ICall
202 //! \param[in]  appCallbacks    pointer to app callback to parse received data
203 //! \param[in]  TX_DONE_EVENT   value of transmission done event
204 //! \param[in]  RX_EVENT   value of data received event
205 //! \param[in]  MRDY_EVENT   value of MRDY event
206 //!
207 //! \return     void
208 // -----------------------------------------------------------------------------
209 void TLinit(ICall_Semaphore *pAppSem, TLCBs_t *appCallbacks, uint16_t TX_DONE_EVENT,
210             uint16_t RX_EVENT, uint16_t MRDY_EVENT)
212   // Initialize Network Processor Interface (NPI) which in turn will init driver
213   NPITL_initTL( &transportTxDoneCallBack,
214                &transportRXCallBack,
215                &MRDYEventCB );
216   
217   //store pointer to app's semaphore
218   appSem = pAppSem;
219   
220   //store pointer to application's callback function
221   TL_AppCBs = appCallbacks;
222   
223   //store event values passed from app so as not overlap app's events
224   transport_tx_done_event = TX_DONE_EVENT;
225   transport_rx_event = RX_EVENT;
226   mrdy_event = MRDY_EVENT;
229 // -----------------------------------------------------------------------------
230 //! \brief      Wrapper to NPI write function
231 //!
232 //! \param[in]  buf    pointer to data to write
233 //! \param[in]  len    length of data to write
234 //!
235 //! \return     void
236 // -----------------------------------------------------------------------------
237 void TLwrite (uint8_t *buf, uint8_t len)
239   NPITL_writeTL(buf, len);
242 // -----------------------------------------------------------------------------
243 //! \brief      Wrapper to NPI read function
244 //!
245 //! \param[in]  buf    pointer to place read data
246 //! \param[in]  len    length of data to read
247 //!
248 //! \return     void
249 // -----------------------------------------------------------------------------
250 void TLread (uint8_t *buf, uint8_t len)
252   NPIRxBuf_ReadFromRxBuf(buf, len);
255 // -----------------------------------------------------------------------------
256 //! \brief      Wrapper to NPI GetRxBufLen function
257 //!
258 //! \return     uint16_t amount of bytes in the NPI circular buffer
259 // -----------------------------------------------------------------------------
260 uint16_t TLgetRxBufLen(void)
262   return NPIRxBuf_GetRxBufCount();