Port of TI's CC3100 Websock camera demo. Using FreeRTOS, mbedTLS, also parts of Arducam for cams ov5642 and 0v2640. Can also use MT9D111. Work in progress. Be warned some parts maybe a bit flacky. This is for Seeed Arch max only, for an M3, see the demo for CM3 using the 0v5642 aducam mini.

Dependencies:   mbed

Committer:
dflet
Date:
Tue Sep 15 16:45:04 2015 +0000
Revision:
22:f9b5e0b80bf2
Parent:
0:50cedd586816
Removed some debug.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:50cedd586816 1 //*****************************************************************************
dflet 0:50cedd586816 2 // osi_freertos.c
dflet 0:50cedd586816 3 //
dflet 0:50cedd586816 4 // Interface APIs for free-rtos function calls
dflet 0:50cedd586816 5 //
dflet 0:50cedd586816 6 // Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:50cedd586816 7 //
dflet 0:50cedd586816 8 //
dflet 0:50cedd586816 9 // Redistribution and use in source and binary forms, with or without
dflet 0:50cedd586816 10 // modification, are permitted provided that the following conditions
dflet 0:50cedd586816 11 // are met:
dflet 0:50cedd586816 12 //
dflet 0:50cedd586816 13 // Redistributions of source code must retain the above copyright
dflet 0:50cedd586816 14 // notice, this list of conditions and the following disclaimer.
dflet 0:50cedd586816 15 //
dflet 0:50cedd586816 16 // Redistributions in binary form must reproduce the above copyright
dflet 0:50cedd586816 17 // notice, this list of conditions and the following disclaimer in the
dflet 0:50cedd586816 18 // documentation and/or other materials provided with the
dflet 0:50cedd586816 19 // distribution.
dflet 0:50cedd586816 20 //
dflet 0:50cedd586816 21 // Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:50cedd586816 22 // its contributors may be used to endorse or promote products derived
dflet 0:50cedd586816 23 // from this software without specific prior written permission.
dflet 0:50cedd586816 24 //
dflet 0:50cedd586816 25 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:50cedd586816 26 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:50cedd586816 27 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:50cedd586816 28 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:50cedd586816 29 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:50cedd586816 30 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:50cedd586816 31 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:50cedd586816 32 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:50cedd586816 33 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:50cedd586816 34 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:50cedd586816 35 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:50cedd586816 36 //
dflet 0:50cedd586816 37 //*****************************************************************************
dflet 0:50cedd586816 38
dflet 0:50cedd586816 39
dflet 0:50cedd586816 40 #include <stdio.h>
dflet 0:50cedd586816 41 #include <stdlib.h>
dflet 0:50cedd586816 42 #include <string.h>
dflet 0:50cedd586816 43 #include "FreeRTOS.h"
dflet 0:50cedd586816 44 #include "task.h"
dflet 0:50cedd586816 45 #include "semphr.h"
dflet 0:50cedd586816 46 #include "portmacro.h"
dflet 0:50cedd586816 47 #include <osi.h>
dflet 0:50cedd586816 48
dflet 0:50cedd586816 49
dflet 0:50cedd586816 50
dflet 0:50cedd586816 51 portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
dflet 0:50cedd586816 52 //Local function definition
dflet 0:50cedd586816 53 static void vSimpleLinkSpawnTask( void *pvParameters );
dflet 0:50cedd586816 54 //Queue Handler
dflet 0:50cedd586816 55 xQueueHandle xSimpleLinkSpawnQueue = NULL;
dflet 0:50cedd586816 56 xTaskHandle xSimpleLinkSpawnTaskHndl = NULL;
dflet 0:50cedd586816 57 // Queue size
dflet 0:50cedd586816 58 #define slQUEUE_SIZE ( 3 )
dflet 0:50cedd586816 59
dflet 0:50cedd586816 60
dflet 0:50cedd586816 61
dflet 0:50cedd586816 62
dflet 0:50cedd586816 63
dflet 0:50cedd586816 64 /*!
dflet 0:50cedd586816 65 \brief This function creates a sync object
dflet 0:50cedd586816 66
dflet 0:50cedd586816 67 The sync object is used for synchronization between different thread or ISR and
dflet 0:50cedd586816 68 a thread.
dflet 0:50cedd586816 69
dflet 0:50cedd586816 70 \param pSyncObj - pointer to the sync object control block
dflet 0:50cedd586816 71
dflet 0:50cedd586816 72 \return upon successful creation the function should return 0
dflet 0:50cedd586816 73 Otherwise, a negative value indicating the error code shall be returned
dflet 0:50cedd586816 74 \note
dflet 0:50cedd586816 75 \warning
dflet 0:50cedd586816 76 */
dflet 0:50cedd586816 77 OsiReturnVal_e osi_SyncObjCreate(OsiSyncObj_t* pSyncObj)
dflet 0:50cedd586816 78 {
dflet 0:50cedd586816 79 //Check for NULL
dflet 0:50cedd586816 80 if(NULL == pSyncObj)
dflet 0:50cedd586816 81 {
dflet 0:50cedd586816 82 return OSI_INVALID_PARAMS;
dflet 0:50cedd586816 83 }
dflet 0:50cedd586816 84 xSemaphoreHandle *pl_SyncObj = (xSemaphoreHandle *)pSyncObj;
dflet 0:50cedd586816 85
dflet 0:50cedd586816 86 *pl_SyncObj = xSemaphoreCreateBinary();
dflet 0:50cedd586816 87
dflet 0:50cedd586816 88 if((xSemaphoreHandle)(*pSyncObj) != NULL)
dflet 0:50cedd586816 89 {
dflet 0:50cedd586816 90 return OSI_OK;
dflet 0:50cedd586816 91 }
dflet 0:50cedd586816 92 else
dflet 0:50cedd586816 93 {
dflet 0:50cedd586816 94 return OSI_OPERATION_FAILED;
dflet 0:50cedd586816 95 }
dflet 0:50cedd586816 96 }
dflet 0:50cedd586816 97
dflet 0:50cedd586816 98 /*!
dflet 0:50cedd586816 99 \brief This function deletes a sync object
dflet 0:50cedd586816 100
dflet 0:50cedd586816 101 \param pSyncObj - pointer to the sync object control block
dflet 0:50cedd586816 102
dflet 0:50cedd586816 103 \return upon successful deletion the function should return 0
dflet 0:50cedd586816 104 Otherwise, a negative value indicating the error code shall be returned
dflet 0:50cedd586816 105 \note
dflet 0:50cedd586816 106 \warning
dflet 0:50cedd586816 107 */
dflet 0:50cedd586816 108 OsiReturnVal_e osi_SyncObjDelete(OsiSyncObj_t* pSyncObj)
dflet 0:50cedd586816 109 {
dflet 0:50cedd586816 110 //Check for NULL
dflet 0:50cedd586816 111 if(NULL == pSyncObj)
dflet 0:50cedd586816 112 {
dflet 0:50cedd586816 113 return OSI_INVALID_PARAMS;
dflet 0:50cedd586816 114 }
dflet 0:50cedd586816 115 vSemaphoreDelete(*pSyncObj );
dflet 0:50cedd586816 116 return OSI_OK;
dflet 0:50cedd586816 117 }
dflet 0:50cedd586816 118
dflet 0:50cedd586816 119 /*!
dflet 0:50cedd586816 120 \brief This function generates a sync signal for the object.
dflet 0:50cedd586816 121
dflet 0:50cedd586816 122 All suspended threads waiting on this sync object are resumed
dflet 0:50cedd586816 123
dflet 0:50cedd586816 124 \param pSyncObj - pointer to the sync object control block
dflet 0:50cedd586816 125
dflet 0:50cedd586816 126 \return upon successful signaling the function should return 0
dflet 0:50cedd586816 127 Otherwise, a negative value indicating the error code shall be returned
dflet 0:50cedd586816 128 \note the function could be called from ISR context
dflet 0:50cedd586816 129 \warning
dflet 0:50cedd586816 130 */
dflet 0:50cedd586816 131 OsiReturnVal_e osi_SyncObjSignal(OsiSyncObj_t* pSyncObj)
dflet 0:50cedd586816 132 {
dflet 0:50cedd586816 133 //Check for NULL
dflet 0:50cedd586816 134 if(NULL == pSyncObj)
dflet 0:50cedd586816 135 {
dflet 0:50cedd586816 136 return OSI_INVALID_PARAMS;
dflet 0:50cedd586816 137 }
dflet 0:50cedd586816 138
dflet 0:50cedd586816 139 if(pdTRUE != xSemaphoreGive( *pSyncObj ))
dflet 0:50cedd586816 140 {
dflet 0:50cedd586816 141 //In case of Semaphore, you are expected to get this if multiple sem
dflet 0:50cedd586816 142 // give is called before sem take
dflet 0:50cedd586816 143 return OSI_OK;
dflet 0:50cedd586816 144 }
dflet 0:50cedd586816 145
dflet 0:50cedd586816 146 return OSI_OK;
dflet 0:50cedd586816 147 }
dflet 0:50cedd586816 148 /*!
dflet 0:50cedd586816 149 \brief This function generates a sync signal for the object
dflet 0:50cedd586816 150 from ISR context.
dflet 0:50cedd586816 151
dflet 0:50cedd586816 152 All suspended threads waiting on this sync object are resumed
dflet 0:50cedd586816 153
dflet 0:50cedd586816 154 \param pSyncObj - pointer to the sync object control block
dflet 0:50cedd586816 155
dflet 0:50cedd586816 156 \return upon successful signalling the function should return 0
dflet 0:50cedd586816 157 Otherwise, a negative value indicating the error code shall be returned
dflet 0:50cedd586816 158 \note the function is called from ISR context
dflet 0:50cedd586816 159 \warning
dflet 0:50cedd586816 160 */
dflet 0:50cedd586816 161 OsiReturnVal_e osi_SyncObjSignalFromISR(OsiSyncObj_t* pSyncObj)
dflet 0:50cedd586816 162 {
dflet 0:50cedd586816 163 //Check for NULL
dflet 0:50cedd586816 164 if(NULL == pSyncObj)
dflet 0:50cedd586816 165 {
dflet 0:50cedd586816 166 return OSI_INVALID_PARAMS;
dflet 0:50cedd586816 167 }
dflet 0:50cedd586816 168 xHigherPriorityTaskWoken = pdFALSE;
dflet 0:50cedd586816 169 if(pdTRUE == xSemaphoreGiveFromISR( *pSyncObj, &xHigherPriorityTaskWoken ))
dflet 0:50cedd586816 170 {
dflet 0:50cedd586816 171 if( xHigherPriorityTaskWoken )
dflet 0:50cedd586816 172 {
dflet 0:50cedd586816 173 taskYIELD ();
dflet 0:50cedd586816 174 }
dflet 0:50cedd586816 175 return OSI_OK;
dflet 0:50cedd586816 176 }
dflet 0:50cedd586816 177 else
dflet 0:50cedd586816 178 {
dflet 0:50cedd586816 179 //In case of Semaphore, you are expected to get this if multiple sem
dflet 0:50cedd586816 180 // give is called before sem take
dflet 0:50cedd586816 181 return OSI_OK;
dflet 0:50cedd586816 182 }
dflet 0:50cedd586816 183 }
dflet 0:50cedd586816 184
dflet 0:50cedd586816 185 /*!
dflet 0:50cedd586816 186 \brief This function waits for a sync signal of the specific sync object
dflet 0:50cedd586816 187
dflet 0:50cedd586816 188 \param pSyncObj - pointer to the sync object control block
dflet 0:50cedd586816 189 \param Timeout - numeric value specifies the maximum number of mSec to
dflet 0:50cedd586816 190 stay suspended while waiting for the sync signal
dflet 0:50cedd586816 191 Currently, the simple link driver uses only two values:
dflet 0:50cedd586816 192 - OSI_WAIT_FOREVER
dflet 0:50cedd586816 193 - OSI_NO_WAIT
dflet 0:50cedd586816 194
dflet 0:50cedd586816 195 \return upon successful reception of the signal within the timeout window return 0
dflet 0:50cedd586816 196 Otherwise, a negative value indicating the error code shall be returned
dflet 0:50cedd586816 197 \note
dflet 0:50cedd586816 198 \warning
dflet 0:50cedd586816 199 */
dflet 0:50cedd586816 200 OsiReturnVal_e osi_SyncObjWait(OsiSyncObj_t* pSyncObj , OsiTime_t Timeout)
dflet 0:50cedd586816 201 {
dflet 0:50cedd586816 202 //Check for NULL
dflet 0:50cedd586816 203 if(NULL == pSyncObj)
dflet 0:50cedd586816 204 {
dflet 0:50cedd586816 205 return OSI_INVALID_PARAMS;
dflet 0:50cedd586816 206 }
dflet 0:50cedd586816 207 if(pdTRUE == xSemaphoreTake( (xSemaphoreHandle)*pSyncObj, ( portTickType )(Timeout/portTICK_RATE_MS) ))
dflet 0:50cedd586816 208 {
dflet 0:50cedd586816 209 return OSI_OK;
dflet 0:50cedd586816 210 }
dflet 0:50cedd586816 211 else
dflet 0:50cedd586816 212 {
dflet 0:50cedd586816 213 return OSI_OPERATION_FAILED;
dflet 0:50cedd586816 214 }
dflet 0:50cedd586816 215 }
dflet 0:50cedd586816 216
dflet 0:50cedd586816 217 /*!
dflet 0:50cedd586816 218 \brief This function clears a sync object
dflet 0:50cedd586816 219
dflet 0:50cedd586816 220 \param pSyncObj - pointer to the sync object control block
dflet 0:50cedd586816 221
dflet 0:50cedd586816 222 \return upon successful clearing the function should return 0
dflet 0:50cedd586816 223 Otherwise, a negative value indicating the error code shall be returned
dflet 0:50cedd586816 224 \note
dflet 0:50cedd586816 225 \warning
dflet 0:50cedd586816 226 */
dflet 0:50cedd586816 227 OsiReturnVal_e osi_SyncObjClear(OsiSyncObj_t* pSyncObj)
dflet 0:50cedd586816 228 {
dflet 0:50cedd586816 229 //Check for NULL
dflet 0:50cedd586816 230 if(NULL == pSyncObj)
dflet 0:50cedd586816 231 {
dflet 0:50cedd586816 232 return OSI_INVALID_PARAMS;
dflet 0:50cedd586816 233 }
dflet 0:50cedd586816 234
dflet 0:50cedd586816 235 if (OSI_OK == osi_SyncObjWait(pSyncObj,0) )
dflet 0:50cedd586816 236 {
dflet 0:50cedd586816 237 return OSI_OK;
dflet 0:50cedd586816 238 }
dflet 0:50cedd586816 239 else
dflet 0:50cedd586816 240 {
dflet 0:50cedd586816 241 return OSI_OPERATION_FAILED;
dflet 0:50cedd586816 242 }
dflet 0:50cedd586816 243 }
dflet 0:50cedd586816 244
dflet 0:50cedd586816 245 /*!
dflet 0:50cedd586816 246 \brief This function creates a locking object.
dflet 0:50cedd586816 247
dflet 0:50cedd586816 248 The locking object is used for protecting a shared resources between different
dflet 0:50cedd586816 249 threads.
dflet 0:50cedd586816 250
dflet 0:50cedd586816 251 \param pLockObj - pointer to the locking object control block
dflet 0:50cedd586816 252
dflet 0:50cedd586816 253 \return upon successful creation the function should return 0
dflet 0:50cedd586816 254 Otherwise, a negative value indicating the error code shall be returned
dflet 0:50cedd586816 255 \note
dflet 0:50cedd586816 256 \warning
dflet 0:50cedd586816 257 */
dflet 0:50cedd586816 258 OsiReturnVal_e osi_LockObjCreate(OsiLockObj_t* pLockObj)
dflet 0:50cedd586816 259 {
dflet 0:50cedd586816 260 //Check for NULL
dflet 0:50cedd586816 261 if(NULL == pLockObj)
dflet 0:50cedd586816 262 {
dflet 0:50cedd586816 263 return OSI_INVALID_PARAMS;
dflet 0:50cedd586816 264 }
dflet 0:50cedd586816 265 *pLockObj = (OsiLockObj_t)xSemaphoreCreateMutex();
dflet 0:50cedd586816 266 if(pLockObj != NULL)
dflet 0:50cedd586816 267 {
dflet 0:50cedd586816 268 return OSI_OK;
dflet 0:50cedd586816 269 }
dflet 0:50cedd586816 270 else
dflet 0:50cedd586816 271 {
dflet 0:50cedd586816 272 return OSI_OPERATION_FAILED;
dflet 0:50cedd586816 273 }
dflet 0:50cedd586816 274 }
dflet 0:50cedd586816 275
dflet 0:50cedd586816 276 /*!
dflet 0:50cedd586816 277 \brief This function creates a Task.
dflet 0:50cedd586816 278
dflet 0:50cedd586816 279 Creates a new Task and add it to the last of tasks that are ready to run
dflet 0:50cedd586816 280
dflet 0:50cedd586816 281 \param pEntry - pointer to the Task Function
dflet 0:50cedd586816 282 \param pcName - Task Name String
dflet 0:50cedd586816 283 \param usStackDepth - Stack Size in bytes
dflet 0:50cedd586816 284 \param pvParameters - pointer to structure to be passed to the Task Function
dflet 0:50cedd586816 285 \param uxPriority - Task Priority
dflet 0:50cedd586816 286
dflet 0:50cedd586816 287 \return upon successful creation the function should return 0
dflet 0:50cedd586816 288 Otherwise, a negative value indicating the error code shall be returned
dflet 0:50cedd586816 289 \note
dflet 0:50cedd586816 290 \warning
dflet 0:50cedd586816 291 */
dflet 0:50cedd586816 292 OsiReturnVal_e osi_TaskCreate(P_OSI_TASK_ENTRY pEntry,const signed char * const pcName,
dflet 0:50cedd586816 293 unsigned short usStackDepth, void *pvParameters,
dflet 0:50cedd586816 294 uint32_t uxPriority,OsiTaskHandle* pTaskHandle)
dflet 0:50cedd586816 295 {
dflet 0:50cedd586816 296 if(pdPASS == xTaskCreate( pEntry, (const char *)pcName,
dflet 0:50cedd586816 297 (usStackDepth/(sizeof( portSTACK_TYPE ))),
dflet 0:50cedd586816 298 pvParameters,(unsigned portBASE_TYPE)uxPriority,
dflet 0:50cedd586816 299 (xTaskHandle*)pTaskHandle ))
dflet 0:50cedd586816 300 {
dflet 0:50cedd586816 301 return OSI_OK;
dflet 0:50cedd586816 302 }
dflet 0:50cedd586816 303
dflet 0:50cedd586816 304 return OSI_OPERATION_FAILED;
dflet 0:50cedd586816 305 }
dflet 0:50cedd586816 306
dflet 0:50cedd586816 307
dflet 0:50cedd586816 308 /*!
dflet 0:50cedd586816 309 \brief This function Deletes a Task.
dflet 0:50cedd586816 310
dflet 0:50cedd586816 311 Deletes a Task and remove it from list of running task
dflet 0:50cedd586816 312
dflet 0:50cedd586816 313 \param pTaskHandle - Task Handle
dflet 0:50cedd586816 314
dflet 0:50cedd586816 315 \note
dflet 0:50cedd586816 316 \warning
dflet 0:50cedd586816 317 */
dflet 0:50cedd586816 318 void osi_TaskDelete(OsiTaskHandle* pTaskHandle)
dflet 0:50cedd586816 319 {
dflet 0:50cedd586816 320 vTaskDelete((xTaskHandle)*pTaskHandle);
dflet 0:50cedd586816 321 }
dflet 0:50cedd586816 322
dflet 0:50cedd586816 323
dflet 0:50cedd586816 324
dflet 0:50cedd586816 325 /*!
dflet 0:50cedd586816 326 \brief This function deletes a locking object.
dflet 0:50cedd586816 327
dflet 0:50cedd586816 328 \param pLockObj - pointer to the locking object control block
dflet 0:50cedd586816 329
dflet 0:50cedd586816 330 \return upon successful deletion the function should return 0
dflet 0:50cedd586816 331 Otherwise, a negative value indicating the error code shall be returned
dflet 0:50cedd586816 332 \note
dflet 0:50cedd586816 333 \warning
dflet 0:50cedd586816 334 */
dflet 0:50cedd586816 335 OsiReturnVal_e osi_LockObjDelete(OsiLockObj_t* pLockObj)
dflet 0:50cedd586816 336 {
dflet 0:50cedd586816 337 vSemaphoreDelete((xSemaphoreHandle)*pLockObj );
dflet 0:50cedd586816 338 return OSI_OK;
dflet 0:50cedd586816 339 }
dflet 0:50cedd586816 340
dflet 0:50cedd586816 341 /*!
dflet 0:50cedd586816 342 \brief This function locks a locking object.
dflet 0:50cedd586816 343
dflet 0:50cedd586816 344 All other threads that call this function before this thread calls
dflet 0:50cedd586816 345 the osi_LockObjUnlock would be suspended
dflet 0:50cedd586816 346
dflet 0:50cedd586816 347 \param pLockObj - pointer to the locking object control block
dflet 0:50cedd586816 348 \param Timeout - numeric value specifies the maximum number of mSec to
dflet 0:50cedd586816 349 stay suspended while waiting for the locking object
dflet 0:50cedd586816 350 Currently, the simple link driver uses only two values:
dflet 0:50cedd586816 351 - OSI_WAIT_FOREVER
dflet 0:50cedd586816 352 - OSI_NO_WAIT
dflet 0:50cedd586816 353
dflet 0:50cedd586816 354
dflet 0:50cedd586816 355 \return upon successful reception of the locking object the function should return 0
dflet 0:50cedd586816 356 Otherwise, a negative value indicating the error code shall be returned
dflet 0:50cedd586816 357 \note
dflet 0:50cedd586816 358 \warning
dflet 0:50cedd586816 359 */
dflet 0:50cedd586816 360 OsiReturnVal_e osi_LockObjLock(OsiLockObj_t* pLockObj , OsiTime_t Timeout)
dflet 0:50cedd586816 361 {
dflet 0:50cedd586816 362 //Check for NULL
dflet 0:50cedd586816 363 if(NULL == pLockObj)
dflet 0:50cedd586816 364 {
dflet 0:50cedd586816 365 return OSI_INVALID_PARAMS;
dflet 0:50cedd586816 366 }
dflet 0:50cedd586816 367 //Take Semaphore
dflet 0:50cedd586816 368 if(pdTRUE == xSemaphoreTake( *pLockObj, ( portTickType ) (Timeout/portTICK_RATE_MS) ))
dflet 0:50cedd586816 369 {
dflet 0:50cedd586816 370 return OSI_OK;
dflet 0:50cedd586816 371 }
dflet 0:50cedd586816 372 else
dflet 0:50cedd586816 373 {
dflet 0:50cedd586816 374 return OSI_OPERATION_FAILED;
dflet 0:50cedd586816 375 }
dflet 0:50cedd586816 376 }
dflet 0:50cedd586816 377
dflet 0:50cedd586816 378 /*!
dflet 0:50cedd586816 379 \brief This function unlock a locking object.
dflet 0:50cedd586816 380
dflet 0:50cedd586816 381 \param pLockObj - pointer to the locking object control block
dflet 0:50cedd586816 382
dflet 0:50cedd586816 383 \return upon successful unlocking the function should return 0
dflet 0:50cedd586816 384 Otherwise, a negative value indicating the error code shall be returned
dflet 0:50cedd586816 385 \note
dflet 0:50cedd586816 386 \warning
dflet 0:50cedd586816 387 */
dflet 0:50cedd586816 388 OsiReturnVal_e osi_LockObjUnlock(OsiLockObj_t* pLockObj)
dflet 0:50cedd586816 389 {
dflet 0:50cedd586816 390 //Check for NULL
dflet 0:50cedd586816 391 if(NULL == pLockObj)
dflet 0:50cedd586816 392 {
dflet 0:50cedd586816 393 return OSI_INVALID_PARAMS;
dflet 0:50cedd586816 394 }
dflet 0:50cedd586816 395 //Release Semaphore
dflet 0:50cedd586816 396 if(pdTRUE == xSemaphoreGive( *pLockObj ))
dflet 0:50cedd586816 397 {
dflet 0:50cedd586816 398 return OSI_OK;
dflet 0:50cedd586816 399 }
dflet 0:50cedd586816 400 else
dflet 0:50cedd586816 401 {
dflet 0:50cedd586816 402 return OSI_OPERATION_FAILED;
dflet 0:50cedd586816 403 }
dflet 0:50cedd586816 404 }
dflet 0:50cedd586816 405
dflet 0:50cedd586816 406
dflet 0:50cedd586816 407 /*!
dflet 0:50cedd586816 408 \brief This function call the pEntry callback from a different context
dflet 0:50cedd586816 409
dflet 0:50cedd586816 410 \param pEntry - pointer to the entry callback function
dflet 0:50cedd586816 411
dflet 0:50cedd586816 412 \param pValue - pointer to any type of memory structure that would be
dflet 0:50cedd586816 413 passed to pEntry callback from the execution thread.
dflet 0:50cedd586816 414
dflet 0:50cedd586816 415 \param flags - execution flags - reserved for future usage
dflet 0:50cedd586816 416
dflet 0:50cedd586816 417 \return upon successful registration of the spawn the function should return 0
dflet 0:50cedd586816 418 (the function is not blocked till the end of the execution of the function
dflet 0:50cedd586816 419 and could be returned before the execution is actually completed)
dflet 0:50cedd586816 420 Otherwise, a negative value indicating the error code shall be returned
dflet 0:50cedd586816 421 \note
dflet 0:50cedd586816 422 \warning
dflet 0:50cedd586816 423 */
dflet 0:50cedd586816 424
dflet 0:50cedd586816 425 OsiReturnVal_e osi_Spawn(P_OSI_SPAWN_ENTRY pEntry , void* pValue , uint32_t flags)
dflet 0:50cedd586816 426 {
dflet 0:50cedd586816 427
dflet 0:50cedd586816 428 tSimpleLinkSpawnMsg Msg;
dflet 0:50cedd586816 429 Msg.pEntry = pEntry;
dflet 0:50cedd586816 430 Msg.pValue = pValue;
dflet 0:50cedd586816 431 xHigherPriorityTaskWoken = pdFALSE;
dflet 0:50cedd586816 432
dflet 0:50cedd586816 433 if(pdTRUE == xQueueSendFromISR( xSimpleLinkSpawnQueue, &Msg, &xHigherPriorityTaskWoken ))
dflet 0:50cedd586816 434 {
dflet 0:50cedd586816 435 if( xHigherPriorityTaskWoken )
dflet 0:50cedd586816 436 {
dflet 0:50cedd586816 437 taskYIELD ();
dflet 0:50cedd586816 438 }
dflet 0:50cedd586816 439
dflet 0:50cedd586816 440 return OSI_OK;
dflet 0:50cedd586816 441 }
dflet 0:50cedd586816 442 return OSI_OPERATION_FAILED;
dflet 0:50cedd586816 443 }
dflet 0:50cedd586816 444
dflet 0:50cedd586816 445
dflet 0:50cedd586816 446 /*!
dflet 0:50cedd586816 447 \brief This is the simplelink spawn task to call SL callback from a different context
dflet 0:50cedd586816 448
dflet 0:50cedd586816 449 \param pvParameters - pointer to the task parameter
dflet 0:50cedd586816 450
dflet 0:50cedd586816 451 \return void
dflet 0:50cedd586816 452 \note
dflet 0:50cedd586816 453 \warning
dflet 0:50cedd586816 454 */
dflet 0:50cedd586816 455 void vSimpleLinkSpawnTask(void *pvParameters)
dflet 0:50cedd586816 456 {
dflet 0:50cedd586816 457 tSimpleLinkSpawnMsg Msg;
dflet 0:50cedd586816 458 portBASE_TYPE ret=pdFAIL;
dflet 0:50cedd586816 459
dflet 0:50cedd586816 460 for(;;)
dflet 0:50cedd586816 461 {
dflet 0:50cedd586816 462 ret = xQueueReceive( xSimpleLinkSpawnQueue, &Msg, portMAX_DELAY );
dflet 0:50cedd586816 463 if(ret == pdPASS)
dflet 0:50cedd586816 464 {
dflet 0:50cedd586816 465 Msg.pEntry(Msg.pValue);
dflet 0:50cedd586816 466 }
dflet 0:50cedd586816 467 }
dflet 0:50cedd586816 468 }
dflet 0:50cedd586816 469
dflet 0:50cedd586816 470 /*!
dflet 0:50cedd586816 471 \brief This is the API to create SL spawn task and create the SL queue
dflet 0:50cedd586816 472
dflet 0:50cedd586816 473 \param uxPriority - task priority
dflet 0:50cedd586816 474
dflet 0:50cedd586816 475 \return void
dflet 0:50cedd586816 476 \note
dflet 0:50cedd586816 477 \warning
dflet 0:50cedd586816 478 */
dflet 0:50cedd586816 479 OsiReturnVal_e VStartSimpleLinkSpawnTask(unsigned portBASE_TYPE uxPriority)
dflet 0:50cedd586816 480 {
dflet 0:50cedd586816 481 xSimpleLinkSpawnQueue = xQueueCreate( slQUEUE_SIZE, sizeof( tSimpleLinkSpawnMsg ) );
dflet 0:50cedd586816 482 if(0 == xSimpleLinkSpawnQueue)
dflet 0:50cedd586816 483 {
dflet 0:50cedd586816 484 return OSI_OPERATION_FAILED;
dflet 0:50cedd586816 485 }
dflet 0:50cedd586816 486 if(pdPASS == xTaskCreate( vSimpleLinkSpawnTask, /*( portCHAR * )*/ "SLSPAWN",\
dflet 0:50cedd586816 487 (512/sizeof( portSTACK_TYPE )), NULL, uxPriority, &xSimpleLinkSpawnTaskHndl ))
dflet 0:50cedd586816 488 {
dflet 0:50cedd586816 489 return OSI_OK;
dflet 0:50cedd586816 490 }
dflet 0:50cedd586816 491
dflet 0:50cedd586816 492 return OSI_OPERATION_FAILED;
dflet 0:50cedd586816 493 }
dflet 0:50cedd586816 494
dflet 0:50cedd586816 495 /*!
dflet 0:50cedd586816 496 \brief This is the API to delete SL spawn task and delete the SL queue
dflet 0:50cedd586816 497
dflet 0:50cedd586816 498 \param none
dflet 0:50cedd586816 499
dflet 0:50cedd586816 500 \return void
dflet 0:50cedd586816 501 \note
dflet 0:50cedd586816 502 \warning
dflet 0:50cedd586816 503 */
dflet 0:50cedd586816 504 void VDeleteSimpleLinkSpawnTask( void )
dflet 0:50cedd586816 505 {
dflet 0:50cedd586816 506 if(0 != xSimpleLinkSpawnTaskHndl)
dflet 0:50cedd586816 507 {
dflet 0:50cedd586816 508 vTaskDelete( xSimpleLinkSpawnTaskHndl );
dflet 0:50cedd586816 509 xSimpleLinkSpawnTaskHndl = 0;
dflet 0:50cedd586816 510 }
dflet 0:50cedd586816 511
dflet 0:50cedd586816 512 if(0 !=xSimpleLinkSpawnQueue)
dflet 0:50cedd586816 513 {
dflet 0:50cedd586816 514 vQueueDelete( xSimpleLinkSpawnQueue );
dflet 0:50cedd586816 515 xSimpleLinkSpawnQueue = 0;
dflet 0:50cedd586816 516 }
dflet 0:50cedd586816 517 }
dflet 0:50cedd586816 518
dflet 0:50cedd586816 519 /*!
dflet 0:50cedd586816 520 \brief This function is used to create the MsgQ
dflet 0:50cedd586816 521
dflet 0:50cedd586816 522 \param pMsgQ - pointer to the message queue
dflet 0:50cedd586816 523 \param pMsgQName - msg queue name
dflet 0:50cedd586816 524 \param MsgSize - size of message on the queue
dflet 0:50cedd586816 525 \param MaxMsgs - max. number of msgs that the queue can hold
dflet 0:50cedd586816 526
dflet 0:50cedd586816 527 \return - OsiReturnVal_e
dflet 0:50cedd586816 528 \note
dflet 0:50cedd586816 529 \warning
dflet 0:50cedd586816 530 */
dflet 0:50cedd586816 531 OsiReturnVal_e osi_MsgQCreate(OsiMsgQ_t* pMsgQ ,
dflet 0:50cedd586816 532 char* pMsgQName,
dflet 0:50cedd586816 533 uint32_t MsgSize,
dflet 0:50cedd586816 534 uint32_t MaxMsgs)
dflet 0:50cedd586816 535 {
dflet 0:50cedd586816 536 //Check for NULL
dflet 0:50cedd586816 537 if(NULL == pMsgQ)
dflet 0:50cedd586816 538 {
dflet 0:50cedd586816 539 return OSI_INVALID_PARAMS;
dflet 0:50cedd586816 540 }
dflet 0:50cedd586816 541
dflet 0:50cedd586816 542 xQueueHandle handle =0;
dflet 0:50cedd586816 543
dflet 0:50cedd586816 544 //Create Queue
dflet 0:50cedd586816 545 handle = xQueueCreate( MaxMsgs, MsgSize );
dflet 0:50cedd586816 546 if (handle==0)
dflet 0:50cedd586816 547 {
dflet 0:50cedd586816 548 return OSI_OPERATION_FAILED;
dflet 0:50cedd586816 549 }
dflet 0:50cedd586816 550
dflet 0:50cedd586816 551 *pMsgQ = (OsiMsgQ_t)handle;
dflet 0:50cedd586816 552 return OSI_OK;
dflet 0:50cedd586816 553 }
dflet 0:50cedd586816 554 /*!
dflet 0:50cedd586816 555 \brief This function is used to delete the MsgQ
dflet 0:50cedd586816 556
dflet 0:50cedd586816 557 \param pMsgQ - pointer to the message queue
dflet 0:50cedd586816 558
dflet 0:50cedd586816 559 \return - OsiReturnVal_e
dflet 0:50cedd586816 560 \note
dflet 0:50cedd586816 561 \warning
dflet 0:50cedd586816 562 */
dflet 0:50cedd586816 563 OsiReturnVal_e osi_MsgQDelete(OsiMsgQ_t* pMsgQ)
dflet 0:50cedd586816 564 {
dflet 0:50cedd586816 565 //Check for NULL
dflet 0:50cedd586816 566 if(NULL == pMsgQ)
dflet 0:50cedd586816 567 {
dflet 0:50cedd586816 568 return OSI_INVALID_PARAMS;
dflet 0:50cedd586816 569 }
dflet 0:50cedd586816 570 vQueueDelete((xQueueHandle) *pMsgQ );
dflet 0:50cedd586816 571 return OSI_OK;
dflet 0:50cedd586816 572 }
dflet 0:50cedd586816 573 /*!
dflet 0:50cedd586816 574 \brief This function is used to write data to the MsgQ
dflet 0:50cedd586816 575
dflet 0:50cedd586816 576 \param pMsgQ - pointer to the message queue
dflet 0:50cedd586816 577 \param pMsg - pointer to the Msg strut to read into
dflet 0:50cedd586816 578 \param Timeout - timeout to wait for the Msg to be available
dflet 0:50cedd586816 579
dflet 0:50cedd586816 580 \return - OsiReturnVal_e
dflet 0:50cedd586816 581 \note
dflet 0:50cedd586816 582 \warning
dflet 0:50cedd586816 583 */
dflet 0:50cedd586816 584
dflet 0:50cedd586816 585 OsiReturnVal_e osi_MsgQWrite(OsiMsgQ_t* pMsgQ, void* pMsg , OsiTime_t Timeout)
dflet 0:50cedd586816 586 {
dflet 0:50cedd586816 587 //Check for NULL
dflet 0:50cedd586816 588 if(NULL == pMsgQ)
dflet 0:50cedd586816 589 {
dflet 0:50cedd586816 590 return OSI_INVALID_PARAMS;
dflet 0:50cedd586816 591 }
dflet 0:50cedd586816 592
dflet 0:50cedd586816 593 if(pdPASS == xQueueSendFromISR((xQueueHandle) *pMsgQ, pMsg, &xHigherPriorityTaskWoken ))
dflet 0:50cedd586816 594 {
dflet 0:50cedd586816 595 taskYIELD ();
dflet 0:50cedd586816 596 return OSI_OK;
dflet 0:50cedd586816 597 }
dflet 0:50cedd586816 598 else
dflet 0:50cedd586816 599 {
dflet 0:50cedd586816 600 return OSI_OPERATION_FAILED;
dflet 0:50cedd586816 601 }
dflet 0:50cedd586816 602 }
dflet 0:50cedd586816 603 /*!
dflet 0:50cedd586816 604 \brief This function is used to read data from the MsgQ
dflet 0:50cedd586816 605
dflet 0:50cedd586816 606 \param pMsgQ - pointer to the message queue
dflet 0:50cedd586816 607 \param pMsg - pointer to the Msg strut to read into
dflet 0:50cedd586816 608 \param Timeout - timeout to wait for the Msg to be available
dflet 0:50cedd586816 609
dflet 0:50cedd586816 610 \return - OsiReturnVal_e
dflet 0:50cedd586816 611 \note
dflet 0:50cedd586816 612 \warning
dflet 0:50cedd586816 613 */
dflet 0:50cedd586816 614
dflet 0:50cedd586816 615 OsiReturnVal_e osi_MsgQRead(OsiMsgQ_t* pMsgQ, void* pMsg , OsiTime_t Timeout)
dflet 0:50cedd586816 616 {
dflet 0:50cedd586816 617 //Check for NULL
dflet 0:50cedd586816 618 if(NULL == pMsgQ)
dflet 0:50cedd586816 619 {
dflet 0:50cedd586816 620 printf("OSI_INVALID_PARAMS\r\n");
dflet 0:50cedd586816 621 return OSI_INVALID_PARAMS;
dflet 0:50cedd586816 622 }
dflet 0:50cedd586816 623
dflet 0:50cedd586816 624 if ( Timeout == (OsiTime_t) OSI_WAIT_FOREVER )
dflet 0:50cedd586816 625 {
dflet 0:50cedd586816 626 Timeout = portMAX_DELAY ;
dflet 0:50cedd586816 627 }
dflet 0:50cedd586816 628
dflet 0:50cedd586816 629 //Receive Item from Queue
dflet 0:50cedd586816 630 if( pdTRUE == xQueueReceive((xQueueHandle)*pMsgQ,pMsg,Timeout) )
dflet 0:50cedd586816 631 {
dflet 0:50cedd586816 632 return OSI_OK;
dflet 0:50cedd586816 633 }
dflet 0:50cedd586816 634 else
dflet 0:50cedd586816 635 {
dflet 0:50cedd586816 636 return OSI_OPERATION_FAILED;
dflet 0:50cedd586816 637 }
dflet 0:50cedd586816 638 }
dflet 0:50cedd586816 639
dflet 0:50cedd586816 640 /*!
dflet 0:50cedd586816 641 \brief This function to call the memory de-allocation function of the FREERTOS
dflet 0:50cedd586816 642
dflet 0:50cedd586816 643 \param Size - size of memory to alloc in bytes
dflet 0:50cedd586816 644
dflet 0:50cedd586816 645 \return - void *
dflet 0:50cedd586816 646 \note
dflet 0:50cedd586816 647 \warning
dflet 0:50cedd586816 648 */
dflet 0:50cedd586816 649
dflet 0:50cedd586816 650 void * mem_Malloc(uint32_t Size)
dflet 0:50cedd586816 651 {
dflet 0:50cedd586816 652
dflet 0:50cedd586816 653 return ( void * ) pvPortMalloc( (size_t)Size );
dflet 0:50cedd586816 654 }
dflet 0:50cedd586816 655
dflet 0:50cedd586816 656 /*!
dflet 0:50cedd586816 657 \brief This function to call the memory de-allocation function of the FREERTOS
dflet 0:50cedd586816 658
dflet 0:50cedd586816 659 \param pMem - pointer to the memory which needs to be freed
dflet 0:50cedd586816 660
dflet 0:50cedd586816 661 \return - void
dflet 0:50cedd586816 662 \note
dflet 0:50cedd586816 663 \warning
dflet 0:50cedd586816 664 */
dflet 0:50cedd586816 665 void mem_Free(void *pMem)
dflet 0:50cedd586816 666 {
dflet 0:50cedd586816 667 vPortFree( pMem );
dflet 0:50cedd586816 668 }
dflet 0:50cedd586816 669
dflet 0:50cedd586816 670 /*!
dflet 0:50cedd586816 671 \brief This function call the memset function
dflet 0:50cedd586816 672 \param pBuf - pointer to the memory to be fill
dflet 0:50cedd586816 673 \param Val - Value to be fill
dflet 0:50cedd586816 674 \param Size - Size of the memory which needs to be fill
dflet 0:50cedd586816 675 \return - void
dflet 0:50cedd586816 676 \note
dflet 0:50cedd586816 677 \warning
dflet 0:50cedd586816 678 */
dflet 0:50cedd586816 679
dflet 0:50cedd586816 680 void mem_set(void *pBuf,int Val,size_t Size)
dflet 0:50cedd586816 681 {
dflet 0:50cedd586816 682 memset( pBuf,Val,Size);
dflet 0:50cedd586816 683
dflet 0:50cedd586816 684 }
dflet 0:50cedd586816 685
dflet 0:50cedd586816 686 /*!
dflet 0:50cedd586816 687 \brief This function call the memcopy function
dflet 0:50cedd586816 688 \param pDst - pointer to the destination
dflet 0:50cedd586816 689 \param pSrc - pointer to the source
dflet 0:50cedd586816 690 \param Size - Size of the memory which needs to be copy
dflet 0:50cedd586816 691
dflet 0:50cedd586816 692 \return - void
dflet 0:50cedd586816 693 \note
dflet 0:50cedd586816 694 \warning
dflet 0:50cedd586816 695 */
dflet 0:50cedd586816 696 void mem_copy(void *pDst, void *pSrc,size_t Size)
dflet 0:50cedd586816 697 {
dflet 0:50cedd586816 698 memcpy(pDst,pSrc,Size);
dflet 0:50cedd586816 699 }
dflet 0:50cedd586816 700
dflet 0:50cedd586816 701
dflet 0:50cedd586816 702 /*!
dflet 0:50cedd586816 703 \brief This function use to entering into critical section
dflet 0:50cedd586816 704 \param void
dflet 0:50cedd586816 705 \return - void
dflet 0:50cedd586816 706 \note
dflet 0:50cedd586816 707 \warning
dflet 0:50cedd586816 708 */
dflet 0:50cedd586816 709
dflet 0:50cedd586816 710 uint32_t osi_EnterCritical(void)
dflet 0:50cedd586816 711 {
dflet 0:50cedd586816 712 portENTER_CRITICAL();
dflet 0:50cedd586816 713 return 0;
dflet 0:50cedd586816 714 }
dflet 0:50cedd586816 715
dflet 0:50cedd586816 716 /*!
dflet 0:50cedd586816 717 \brief This function use to exit critical section
dflet 0:50cedd586816 718 \param void
dflet 0:50cedd586816 719 \return - void
dflet 0:50cedd586816 720 \note
dflet 0:50cedd586816 721 \warning
dflet 0:50cedd586816 722 */
dflet 0:50cedd586816 723
dflet 0:50cedd586816 724 void osi_ExitCritical(uint32_t ulKey)
dflet 0:50cedd586816 725 {
dflet 0:50cedd586816 726 portENTER_CRITICAL();
dflet 0:50cedd586816 727 }
dflet 0:50cedd586816 728 /*!
dflet 0:50cedd586816 729 \brief This function used to start the scheduler
dflet 0:50cedd586816 730 \param void
dflet 0:50cedd586816 731 \return - void
dflet 0:50cedd586816 732 \note
dflet 0:50cedd586816 733 \warning
dflet 0:50cedd586816 734 */
dflet 0:50cedd586816 735 void osi_start()
dflet 0:50cedd586816 736 {
dflet 0:50cedd586816 737 vTaskStartScheduler();
dflet 0:50cedd586816 738 }
dflet 0:50cedd586816 739 /*!
dflet 0:50cedd586816 740 \brief This function used to suspend the task for the specified number of milli secs
dflet 0:50cedd586816 741 \param MilliSecs - Time in millisecs to suspend the task
dflet 0:50cedd586816 742 \return - void
dflet 0:50cedd586816 743 \note
dflet 0:50cedd586816 744 \warning
dflet 0:50cedd586816 745 */
dflet 0:50cedd586816 746 void osi_Sleep(unsigned int MilliSecs)
dflet 0:50cedd586816 747 {
dflet 0:50cedd586816 748 portTickType xDelay = MilliSecs / portTICK_RATE_MS;
dflet 0:50cedd586816 749 vTaskDelay(xDelay);
dflet 0:50cedd586816 750 }
dflet 0:50cedd586816 751
dflet 0:50cedd586816 752
dflet 0:50cedd586816 753 /*!
dflet 0:50cedd586816 754 \brief This function used to disable the tasks
dflet 0:50cedd586816 755 \param - void
dflet 0:50cedd586816 756 \return - Key with the suspended tasks
dflet 0:50cedd586816 757 \note
dflet 0:50cedd586816 758 \warning
dflet 0:50cedd586816 759 */
dflet 0:50cedd586816 760 uint32_t osi_TaskDisable(void)
dflet 0:50cedd586816 761 {
dflet 0:50cedd586816 762 vTaskSuspendAll();
dflet 0:50cedd586816 763
dflet 0:50cedd586816 764 return OSI_OK;
dflet 0:50cedd586816 765 }
dflet 0:50cedd586816 766
dflet 0:50cedd586816 767
dflet 0:50cedd586816 768 /*!
dflet 0:50cedd586816 769 \brief This function used to resume all the tasks
dflet 0:50cedd586816 770 \param key - returned from suspend tasks
dflet 0:50cedd586816 771 \return - void
dflet 0:50cedd586816 772 \note
dflet 0:50cedd586816 773 \warning
dflet 0:50cedd586816 774 */
dflet 0:50cedd586816 775 void osi_TaskEnable(uint32_t key)
dflet 0:50cedd586816 776 {
dflet 0:50cedd586816 777 xTaskResumeAll();
dflet 0:50cedd586816 778 }
dflet 0:50cedd586816 779
dflet 0:50cedd586816 780 /*!
dflet 0:50cedd586816 781 \brief This function used to save the OS context before sleep
dflet 0:50cedd586816 782 \param void
dflet 0:50cedd586816 783 \return - void
dflet 0:50cedd586816 784 \note
dflet 0:50cedd586816 785 \warning
dflet 0:50cedd586816 786 */
dflet 0:50cedd586816 787 void osi_ContextSave()
dflet 0:50cedd586816 788 {
dflet 0:50cedd586816 789
dflet 0:50cedd586816 790 }
dflet 0:50cedd586816 791 /*!
dflet 0:50cedd586816 792 \brief This function used to restore the OS context after sleep
dflet 0:50cedd586816 793 \param void
dflet 0:50cedd586816 794 \return - void
dflet 0:50cedd586816 795 \note
dflet 0:50cedd586816 796 \warning
dflet 0:50cedd586816 797 */
dflet 0:50cedd586816 798 void osi_ContextRestore()
dflet 0:50cedd586816 799 {
dflet 0:50cedd586816 800
dflet 0:50cedd586816 801 }
dflet 0:50cedd586816 802