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:
19:3dd3e7f30f8b
Removed some debug.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:50cedd586816 1 /*
dflet 0:50cedd586816 2 * driver.c - CC31xx/CC32xx Host Driver Implementation
dflet 0:50cedd586816 3 *
dflet 0:50cedd586816 4 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:50cedd586816 5 *
dflet 0:50cedd586816 6 *
dflet 0:50cedd586816 7 * Redistribution and use in source and binary forms, with or without
dflet 0:50cedd586816 8 * modification, are permitted provided that the following conditions
dflet 0:50cedd586816 9 * are met:
dflet 0:50cedd586816 10 *
dflet 0:50cedd586816 11 * Redistributions of source code must retain the above copyright
dflet 0:50cedd586816 12 * notice, this list of conditions and the following disclaimer.
dflet 0:50cedd586816 13 *
dflet 0:50cedd586816 14 * Redistributions in binary form must reproduce the above copyright
dflet 0:50cedd586816 15 * notice, this list of conditions and the following disclaimer in the
dflet 0:50cedd586816 16 * documentation and/or other materials provided with the
dflet 0:50cedd586816 17 * distribution.
dflet 0:50cedd586816 18 *
dflet 0:50cedd586816 19 * Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:50cedd586816 20 * its contributors may be used to endorse or promote products derived
dflet 0:50cedd586816 21 * from this software without specific prior written permission.
dflet 0:50cedd586816 22 *
dflet 0:50cedd586816 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:50cedd586816 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:50cedd586816 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:50cedd586816 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:50cedd586816 27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:50cedd586816 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:50cedd586816 29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:50cedd586816 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:50cedd586816 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:50cedd586816 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:50cedd586816 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:50cedd586816 34 *
dflet 0:50cedd586816 35 */
dflet 0:50cedd586816 36
dflet 0:50cedd586816 37 /*****************************************************************************/
dflet 0:50cedd586816 38 /* Include files */
dflet 0:50cedd586816 39 /*****************************************************************************/
dflet 0:50cedd586816 40 #include "cc3100_simplelink.h"
dflet 0:50cedd586816 41 #include "cc3100_protocol.h"
dflet 0:50cedd586816 42 #include "cc3100_driver.h"
dflet 0:50cedd586816 43
dflet 0:50cedd586816 44 #include "fPtr_func.h"
dflet 0:50cedd586816 45 #include "cli_uart.h"
dflet 0:50cedd586816 46
dflet 0:50cedd586816 47 #if (defined (SL_PLATFORM_MULTI_THREADED)) || (defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 48 #include "osi.h"
dflet 0:50cedd586816 49 #endif
dflet 0:50cedd586816 50
dflet 0:50cedd586816 51 /*****************************************************************************/
dflet 0:50cedd586816 52 /* Macro declarations */
dflet 0:50cedd586816 53 /*****************************************************************************/
dflet 0:50cedd586816 54
dflet 0:50cedd586816 55 namespace mbed_cc3100 {
dflet 0:50cedd586816 56
dflet 0:50cedd586816 57 #ifndef SL_MEMORY_MGMT_DYNAMIC
dflet 0:50cedd586816 58 typedef struct {
dflet 0:50cedd586816 59 uint32_t Align;
dflet 0:50cedd586816 60 _SlDriverCb_t DriverCB;
dflet 0:50cedd586816 61 uint8_t AsyncRespBuf[SL_ASYNC_MAX_MSG_LEN];
dflet 0:50cedd586816 62 } _SlStatMem_t;
dflet 0:50cedd586816 63
dflet 0:50cedd586816 64 _SlStatMem_t g_StatMem;
dflet 0:50cedd586816 65 #endif
dflet 0:50cedd586816 66
dflet 0:50cedd586816 67
dflet 0:50cedd586816 68 _SlDriverCb_t* g_pCB = NULL;
dflet 0:50cedd586816 69
dflet 0:50cedd586816 70 uint8_t gFirstCmdMode = 0;
dflet 0:50cedd586816 71
dflet 0:50cedd586816 72 const _SlSyncPattern_t g_H2NSyncPattern = H2N_SYNC_PATTERN;
dflet 0:50cedd586816 73 const _SlSyncPattern_t g_H2NCnysPattern = H2N_CNYS_PATTERN;
dflet 0:50cedd586816 74 volatile uint8_t RxIrqCnt;
dflet 0:50cedd586816 75
dflet 0:50cedd586816 76 #ifndef SL_TINY_EXT
dflet 0:50cedd586816 77 const _SlActionLookup_t _SlActionLookupTable[] = {
dflet 0:50cedd586816 78 {ACCEPT_ID, SL_OPCODE_SOCKET_ACCEPTASYNCRESPONSE, (_SlSpawnEntryFunc_t) &_sl_HandleAsync_Accept},
dflet 0:50cedd586816 79 {CONNECT_ID, SL_OPCODE_SOCKET_CONNECTASYNCRESPONSE,(_SlSpawnEntryFunc_t) &_sl_HandleAsync_Connect},
dflet 0:50cedd586816 80 {SELECT_ID, SL_OPCODE_SOCKET_SELECTASYNCRESPONSE,(_SlSpawnEntryFunc_t) &_sl_HandleAsync_Select},
dflet 0:50cedd586816 81 {GETHOSYBYNAME_ID, SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE,(_SlSpawnEntryFunc_t) &_sl_HandleAsync_DnsGetHostByName},
dflet 0:50cedd586816 82 {GETHOSYBYSERVICE_ID, SL_OPCODE_NETAPP_MDNSGETHOSTBYSERVICEASYNCRESPONSE,(_SlSpawnEntryFunc_t) &_sl_HandleAsync_DnsGetHostByService},
dflet 0:50cedd586816 83 {PING_ID, SL_OPCODE_NETAPP_PINGREPORTREQUESTRESPONSE, (_SlSpawnEntryFunc_t) &_sl_HandleAsync_PingResponse},
dflet 0:50cedd586816 84 {START_STOP_ID, SL_OPCODE_DEVICE_STOP_ASYNC_RESPONSE,(_SlSpawnEntryFunc_t) &_sl_HandleAsync_Stop}
dflet 0:50cedd586816 85
dflet 0:50cedd586816 86 };
dflet 0:50cedd586816 87 #else
dflet 0:50cedd586816 88 const _SlActionLookup_t _SlActionLookupTable[] =
dflet 0:50cedd586816 89 {
dflet 0:50cedd586816 90 {CONNECT_ID, SL_OPCODE_SOCKET_CONNECTASYNCRESPONSE,(_SlSpawnEntryFunc_t)_sl_HandleAsync_Connect},
dflet 0:50cedd586816 91 {GETHOSYBYNAME_ID, SL_OPCODE_NETAPP_DNSGETHOSTBYNAMEASYNCRESPONSE,(_SlSpawnEntryFunc_t)_sl_HandleAsync_DnsGetHostByName},
dflet 0:50cedd586816 92 {START_STOP_ID, SL_OPCODE_DEVICE_STOP_ASYNC_RESPONSE,(_SlSpawnEntryFunc_t)_sl_HandleAsync_Stop}
dflet 0:50cedd586816 93 };
dflet 0:50cedd586816 94 #endif
dflet 0:50cedd586816 95
dflet 0:50cedd586816 96 typedef struct
dflet 0:50cedd586816 97 {
dflet 0:50cedd586816 98 uint16_t opcode;
dflet 0:50cedd586816 99 uint8_t event;
dflet 0:50cedd586816 100 } OpcodeKeyVal_t;
dflet 0:50cedd586816 101
dflet 0:50cedd586816 102 /* The table translates opcode to user's event type */
dflet 0:50cedd586816 103 const OpcodeKeyVal_t OpcodeTranslateTable[] =
dflet 0:50cedd586816 104 {
dflet 0:50cedd586816 105 {SL_OPCODE_WLAN_SMART_CONFIG_START_ASYNC_RESPONSE, SL_WLAN_SMART_CONFIG_COMPLETE_EVENT},
dflet 0:50cedd586816 106 {SL_OPCODE_WLAN_SMART_CONFIG_STOP_ASYNC_RESPONSE,SL_WLAN_SMART_CONFIG_STOP_EVENT},
dflet 0:50cedd586816 107 {SL_OPCODE_WLAN_STA_CONNECTED, SL_WLAN_STA_CONNECTED_EVENT},
dflet 0:50cedd586816 108 {SL_OPCODE_WLAN_STA_DISCONNECTED,SL_WLAN_STA_DISCONNECTED_EVENT},
dflet 0:50cedd586816 109 {SL_OPCODE_WLAN_P2P_DEV_FOUND,SL_WLAN_P2P_DEV_FOUND_EVENT},
dflet 0:50cedd586816 110 {SL_OPCODE_WLAN_P2P_NEG_REQ_RECEIVED, SL_WLAN_P2P_NEG_REQ_RECEIVED_EVENT},
dflet 0:50cedd586816 111 {SL_OPCODE_WLAN_CONNECTION_FAILED, SL_WLAN_CONNECTION_FAILED_EVENT},
dflet 0:50cedd586816 112 {SL_OPCODE_WLAN_WLANASYNCCONNECTEDRESPONSE, SL_WLAN_CONNECT_EVENT},
dflet 0:50cedd586816 113 {SL_OPCODE_WLAN_WLANASYNCDISCONNECTEDRESPONSE, SL_WLAN_DISCONNECT_EVENT},
dflet 0:50cedd586816 114 {SL_OPCODE_NETAPP_IPACQUIRED, SL_NETAPP_IPV4_IPACQUIRED_EVENT},
dflet 0:50cedd586816 115 {SL_OPCODE_NETAPP_IPACQUIRED_V6, SL_NETAPP_IPV6_IPACQUIRED_EVENT},
dflet 0:50cedd586816 116 {SL_OPCODE_NETAPP_IP_LEASED, SL_NETAPP_IP_LEASED_EVENT},
dflet 0:50cedd586816 117 {SL_OPCODE_NETAPP_IP_RELEASED, SL_NETAPP_IP_RELEASED_EVENT},
dflet 0:50cedd586816 118 {SL_OPCODE_SOCKET_TXFAILEDASYNCRESPONSE, SL_SOCKET_TX_FAILED_EVENT},
dflet 0:50cedd586816 119 {SL_OPCODE_SOCKET_SOCKETASYNCEVENT, SL_SOCKET_ASYNC_EVENT}
dflet 0:50cedd586816 120 };
dflet 0:50cedd586816 121
dflet 0:50cedd586816 122 /*
dflet 0:50cedd586816 123
dflet 0:50cedd586816 124 #define SL_OPCODE_SILO_DEVICE ( 0x0 << SL_OPCODE_SILO_OFFSET )
dflet 0:50cedd586816 125 #define SL_OPCODE_SILO_WLAN ( 0x1 << SL_OPCODE_SILO_OFFSET )
dflet 0:50cedd586816 126 #define SL_OPCODE_SILO_SOCKET ( 0x2 << SL_OPCODE_SILO_OFFSET )
dflet 0:50cedd586816 127 #define SL_OPCODE_SILO_NETAPP ( 0x3 << SL_OPCODE_SILO_OFFSET )
dflet 0:50cedd586816 128 #define SL_OPCODE_SILO_NVMEM ( 0x4 << SL_OPCODE_SILO_OFFSET )
dflet 0:50cedd586816 129 #define SL_OPCODE_SILO_NETCFG ( 0x5 << SL_OPCODE_SILO_OFFSET )
dflet 0:50cedd586816 130
dflet 0:50cedd586816 131
dflet 0:50cedd586816 132 */
dflet 0:50cedd586816 133
dflet 0:50cedd586816 134 /* The Lookup table below holds the event handlers to be called according to the incoming
dflet 0:50cedd586816 135 RX message SILO type */
dflet 0:50cedd586816 136 const _SlSpawnEntryFunc_t RxMsgClassLUT[] = {
dflet 0:50cedd586816 137 (_SlSpawnEntryFunc_t)_SlDrvDeviceEventHandler, /* SL_OPCODE_SILO_DEVICE */
dflet 0:50cedd586816 138 #if defined(sl_WlanEvtHdlr) || defined(EXT_LIB_REGISTERED_WLAN_EVENTS)
dflet 0:50cedd586816 139 (_SlSpawnEntryFunc_t)_SlDrvHandleWlanEvents, /* SL_OPCODE_SILO_WLAN */
dflet 0:50cedd586816 140 #else
dflet 0:50cedd586816 141 NULL,
dflet 0:50cedd586816 142 #endif
dflet 0:50cedd586816 143 #if defined (sl_SockEvtHdlr) || defined(EXT_LIB_REGISTERED_SOCK_EVENTS)
dflet 0:50cedd586816 144 (_SlSpawnEntryFunc_t)_SlDrvHandleSockEvents, /* SL_OPCODE_SILO_SOCKET */
dflet 0:50cedd586816 145 #else
dflet 0:50cedd586816 146 NULL,
dflet 0:50cedd586816 147 #endif
dflet 0:50cedd586816 148
dflet 0:50cedd586816 149 #if defined(sl_NetAppEvtHdlr) || defined(EXT_LIB_REGISTERED_NETAPP_EVENTS)
dflet 0:50cedd586816 150 (_SlSpawnEntryFunc_t)_SlDrvHandleNetAppEvents, /* SL_OPCODE_SILO_NETAPP */
dflet 0:50cedd586816 151 #else
dflet 0:50cedd586816 152 NULL,
dflet 0:50cedd586816 153 #endif
dflet 0:50cedd586816 154 NULL, /* SL_OPCODE_SILO_NVMEM */
dflet 0:50cedd586816 155 NULL, /* SL_OPCODE_SILO_NETCFG */
dflet 0:50cedd586816 156 NULL,
dflet 0:50cedd586816 157 NULL
dflet 0:50cedd586816 158 };
dflet 0:50cedd586816 159
dflet 19:3dd3e7f30f8b 160 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 161 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 162 cc3100_driver::cc3100_driver(cc3100_spi &spi, cc3100_nonos &nonos, cc3100_netapp &netapp, cc3100_flowcont &flowcont)
dflet 0:50cedd586816 163 : _spi(spi), _nonos(nonos), _netapp(netapp), _flowcont(flowcont)
dflet 0:50cedd586816 164 {
dflet 0:50cedd586816 165 }
dflet 0:50cedd586816 166 #else
dflet 0:50cedd586816 167
dflet 0:50cedd586816 168 cc3100_driver::cc3100_driver(cc3100_spi &spi, cc3100_netapp &netapp, cc3100_flowcont &flowcont)
dflet 0:50cedd586816 169 : _spi(spi), _netapp(netapp), _flowcont(flowcont)
dflet 0:50cedd586816 170 {
dflet 0:50cedd586816 171 }
dflet 0:50cedd586816 172 #endif
dflet 0:50cedd586816 173
dflet 0:50cedd586816 174 cc3100_driver::~cc3100_driver()
dflet 0:50cedd586816 175 {
dflet 0:50cedd586816 176
dflet 0:50cedd586816 177 }
dflet 0:50cedd586816 178
dflet 0:50cedd586816 179 /*****************************************************************************/
dflet 0:50cedd586816 180 /* Variables */
dflet 0:50cedd586816 181 /*****************************************************************************/
dflet 0:50cedd586816 182
dflet 0:50cedd586816 183 /********************************************************************************/
dflet 0:50cedd586816 184
dflet 0:50cedd586816 185 uint8_t cc3100_driver::_SlDrvProtectAsyncRespSetting(uint8_t *pAsyncRsp, uint8_t ActionID, uint8_t SocketID)
dflet 0:50cedd586816 186 {
dflet 0:50cedd586816 187 uint8_t ObjIdx;
dflet 0:50cedd586816 188
dflet 0:50cedd586816 189
dflet 0:50cedd586816 190 /* Use Obj to issue the command, if not available try later */
dflet 0:50cedd586816 191 ObjIdx = _SlDrvWaitForPoolObj(ActionID, SocketID);
dflet 0:50cedd586816 192
dflet 0:50cedd586816 193 if (MAX_CONCURRENT_ACTIONS != ObjIdx)
dflet 0:50cedd586816 194 {
dflet 0:50cedd586816 195 _SlDrvProtectionObjLockWaitForever();
dflet 0:50cedd586816 196 g_pCB->ObjPool[ObjIdx].pRespArgs = pAsyncRsp;
dflet 0:50cedd586816 197 _SlDrvProtectionObjUnLock();
dflet 0:50cedd586816 198 }
dflet 0:50cedd586816 199
dflet 0:50cedd586816 200 return ObjIdx;
dflet 0:50cedd586816 201 }
dflet 0:50cedd586816 202
dflet 0:50cedd586816 203
dflet 0:50cedd586816 204 /*****************************************************************************/
dflet 0:50cedd586816 205 /* Internal functions */
dflet 0:50cedd586816 206 /*****************************************************************************/
dflet 0:50cedd586816 207 bool cc3100_driver::_SL_PENDING_RX_MSG(pDriver* pDriverCB){
dflet 0:50cedd586816 208
dflet 0:50cedd586816 209 if(RxIrqCnt != (pDriverCB)->RxDoneCnt){
dflet 0:50cedd586816 210 return TRUE;
dflet 0:50cedd586816 211 }else{
dflet 0:50cedd586816 212 return FALSE;
dflet 0:50cedd586816 213 }
dflet 0:50cedd586816 214 }
dflet 0:50cedd586816 215
dflet 0:50cedd586816 216 /*****************************************************************************
dflet 0:50cedd586816 217 _SlDrvDriverCBInit - init Driver Control Block
dflet 0:50cedd586816 218 *****************************************************************************/
dflet 0:50cedd586816 219 void cc3100_driver::_SlDrvDriverCBInit(void)
dflet 0:50cedd586816 220 {
dflet 0:50cedd586816 221
dflet 0:50cedd586816 222 uint8_t Idx = 0;
dflet 0:50cedd586816 223
dflet 0:50cedd586816 224 #ifdef SL_MEMORY_MGMT_DYNAMIC
dflet 0:50cedd586816 225
dflet 0:50cedd586816 226 g_pCB = sl_Malloc(sizeof(_SlDriverCb_t));
dflet 0:50cedd586816 227 #else
dflet 0:50cedd586816 228 g_pCB = &(g_StatMem.DriverCB);
dflet 0:50cedd586816 229 #endif
dflet 0:50cedd586816 230
dflet 0:50cedd586816 231 MALLOC_OK_CHECK(g_pCB);
dflet 0:50cedd586816 232 _SlDrvMemZero(g_pCB, sizeof(_SlDriverCb_t));
dflet 0:50cedd586816 233 RxIrqCnt = 0;
dflet 19:3dd3e7f30f8b 234 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 235 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 236 OSI_RET_OK_CHECK( _nonos.sl_SyncObjCreate(&g_pCB->CmdSyncObj, "CmdSyncObj") );
dflet 0:50cedd586816 237 _nonos.sl_SyncObjClear(&g_pCB->CmdSyncObj);
dflet 0:50cedd586816 238 OSI_RET_OK_CHECK( _nonos.sl_LockObjCreate(&g_pCB->GlobalLockObj, "GlobalLockObj") );
dflet 0:50cedd586816 239 OSI_RET_OK_CHECK( _nonos.sl_LockObjCreate(&g_pCB->ProtectionLockObj, "ProtectionLockObj") );
dflet 0:50cedd586816 240 #else
dflet 0:50cedd586816 241 OSI_RET_OK_CHECK( sl_SyncObjCreate(&g_pCB->CmdSyncObj, "CmdSyncObj") );
dflet 0:50cedd586816 242 sl_SyncObjClear(&g_pCB->CmdSyncObj);
dflet 0:50cedd586816 243 OSI_RET_OK_CHECK( sl_LockObjCreate(&g_pCB->GlobalLockObj, "GlobalLockObj") );
dflet 0:50cedd586816 244 OSI_RET_OK_CHECK( sl_LockObjCreate(&g_pCB->ProtectionLockObj, "ProtectionLockObj") );
dflet 0:50cedd586816 245 #endif
dflet 0:50cedd586816 246 /* Init Drv object */
dflet 0:50cedd586816 247 _SlDrvMemZero(&g_pCB->ObjPool[0], MAX_CONCURRENT_ACTIONS*sizeof(_SlPoolObj_t));
dflet 0:50cedd586816 248
dflet 0:50cedd586816 249 /* place all Obj in the free list*/
dflet 0:50cedd586816 250 g_pCB->FreePoolIdx = 0;
dflet 0:50cedd586816 251
dflet 0:50cedd586816 252 for (Idx = 0 ; Idx < MAX_CONCURRENT_ACTIONS ; Idx++)
dflet 0:50cedd586816 253 {
dflet 0:50cedd586816 254 g_pCB->ObjPool[Idx].NextIndex = Idx + 1;
dflet 0:50cedd586816 255 g_pCB->ObjPool[Idx].AdditionalData = SL_MAX_SOCKETS;
dflet 19:3dd3e7f30f8b 256 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 257 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 258 OSI_RET_OK_CHECK( _nonos.sl_SyncObjCreate(&g_pCB->ObjPool[Idx].SyncObj, "SyncObj"));
dflet 0:50cedd586816 259 _nonos.sl_SyncObjClear(&g_pCB->ObjPool[Idx].SyncObj);
dflet 0:50cedd586816 260 #else
dflet 0:50cedd586816 261 OSI_RET_OK_CHECK( sl_SyncObjCreate(&g_pCB->ObjPool[Idx].SyncObj, "SyncObj"));
dflet 0:50cedd586816 262 sl_SyncObjClear(&g_pCB->ObjPool[Idx].SyncObj);
dflet 0:50cedd586816 263 #endif
dflet 0:50cedd586816 264 }
dflet 0:50cedd586816 265
dflet 0:50cedd586816 266 g_pCB->ActivePoolIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:50cedd586816 267 g_pCB->PendingPoolIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:50cedd586816 268
dflet 0:50cedd586816 269 /* Flow control init */
dflet 0:50cedd586816 270 g_pCB->FlowContCB.TxPoolCnt = FLOW_CONT_MIN;
dflet 19:3dd3e7f30f8b 271 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 272 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 273 OSI_RET_OK_CHECK(_nonos.sl_LockObjCreate(&g_pCB->FlowContCB.TxLockObj, "TxLockObj"));
dflet 0:50cedd586816 274 OSI_RET_OK_CHECK(_nonos.sl_SyncObjCreate(&g_pCB->FlowContCB.TxSyncObj, "TxSyncObj"));
dflet 0:50cedd586816 275 #else
dflet 0:50cedd586816 276 OSI_RET_OK_CHECK(sl_LockObjCreate(&g_pCB->FlowContCB.TxLockObj, "TxLockObj"));
dflet 0:50cedd586816 277 OSI_RET_OK_CHECK(sl_SyncObjCreate(&g_pCB->FlowContCB.TxSyncObj, "TxSyncObj"));
dflet 0:50cedd586816 278 #endif
dflet 0:50cedd586816 279 gFirstCmdMode = 0;
dflet 0:50cedd586816 280 }
dflet 0:50cedd586816 281
dflet 0:50cedd586816 282 /*****************************************************************************
dflet 0:50cedd586816 283 _SlDrvDriverCBDeinit - De init Driver Control Block
dflet 0:50cedd586816 284 *****************************************************************************/
dflet 0:50cedd586816 285 void cc3100_driver::_SlDrvDriverCBDeinit()
dflet 0:50cedd586816 286 {
dflet 0:50cedd586816 287 uint8_t Idx = 0;
dflet 0:50cedd586816 288
dflet 0:50cedd586816 289 /* Flow control de-init */
dflet 0:50cedd586816 290 g_pCB->FlowContCB.TxPoolCnt = 0;
dflet 19:3dd3e7f30f8b 291 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 292 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 293 OSI_RET_OK_CHECK(_nonos.sl_LockObjDelete(&g_pCB->FlowContCB.TxLockObj));
dflet 0:50cedd586816 294 OSI_RET_OK_CHECK(_nonos.sl_SyncObjDelete(&g_pCB->FlowContCB.TxSyncObj));
dflet 0:50cedd586816 295
dflet 0:50cedd586816 296 OSI_RET_OK_CHECK( _nonos.sl_SyncObjDelete(&g_pCB->CmdSyncObj) );
dflet 0:50cedd586816 297 OSI_RET_OK_CHECK( _nonos.sl_LockObjDelete(&g_pCB->GlobalLockObj) );
dflet 0:50cedd586816 298 OSI_RET_OK_CHECK( _nonos.sl_LockObjDelete(&g_pCB->ProtectionLockObj) );
dflet 0:50cedd586816 299 #else
dflet 0:50cedd586816 300 OSI_RET_OK_CHECK(sl_LockObjDelete(&g_pCB->FlowContCB.TxLockObj));
dflet 0:50cedd586816 301 OSI_RET_OK_CHECK(sl_SyncObjDelete(&g_pCB->FlowContCB.TxSyncObj));
dflet 0:50cedd586816 302
dflet 0:50cedd586816 303 OSI_RET_OK_CHECK( sl_SyncObjDelete(&g_pCB->CmdSyncObj) );
dflet 0:50cedd586816 304 OSI_RET_OK_CHECK( sl_LockObjDelete(&g_pCB->GlobalLockObj) );
dflet 0:50cedd586816 305 OSI_RET_OK_CHECK( sl_LockObjDelete(&g_pCB->ProtectionLockObj) );
dflet 0:50cedd586816 306 #endif
dflet 0:50cedd586816 307
dflet 0:50cedd586816 308 #ifndef SL_TINY_EXT
dflet 0:50cedd586816 309 for (Idx = 0; Idx < MAX_CONCURRENT_ACTIONS; Idx++)
dflet 0:50cedd586816 310 #endif
dflet 0:50cedd586816 311
dflet 0:50cedd586816 312 g_pCB->FreePoolIdx = 0;
dflet 0:50cedd586816 313 g_pCB->PendingPoolIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:50cedd586816 314 g_pCB->ActivePoolIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:50cedd586816 315
dflet 0:50cedd586816 316 #ifdef SL_MEMORY_MGMT_DYNAMIC
dflet 0:50cedd586816 317 sl_Free(g_pCB);
dflet 0:50cedd586816 318 #else
dflet 0:50cedd586816 319 g_pCB = NULL;
dflet 0:50cedd586816 320 #endif
dflet 0:50cedd586816 321
dflet 0:50cedd586816 322 g_pCB = NULL;
dflet 0:50cedd586816 323 }
dflet 0:50cedd586816 324
dflet 0:50cedd586816 325 /*****************************************************************************
dflet 0:50cedd586816 326 _SlDrvRxIrqHandler - Interrupt handler
dflet 0:50cedd586816 327 *****************************************************************************/
dflet 0:50cedd586816 328
dflet 0:50cedd586816 329 void cc3100_driver::_SlDrvRxIrqHandler(void *pValue)
dflet 0:50cedd586816 330 {
dflet 0:50cedd586816 331
dflet 0:50cedd586816 332 int32_t rv = 0;
dflet 0:50cedd586816 333 _spi.MaskIntHdlr();
dflet 0:50cedd586816 334
dflet 0:50cedd586816 335 RxIrqCnt++;
dflet 0:50cedd586816 336
dflet 0:50cedd586816 337 if (TRUE == g_pCB->IsCmdRespWaited) {
dflet 19:3dd3e7f30f8b 338 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 339 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 340 OSI_RET_OK_CHECK( _nonos.sl_SyncObjSignalFromIRQ(&g_pCB->CmdSyncObj) );
dflet 0:50cedd586816 341 #else
dflet 0:50cedd586816 342 OSI_RET_OK_CHECK( sl_SyncObjSignalFromIRQ(&g_pCB->CmdSyncObj) );
dflet 0:50cedd586816 343 #endif
dflet 0:50cedd586816 344 } else {
dflet 0:50cedd586816 345 #if (defined (SL_PLATFORM_MULTI_THREADED)) || (defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 346 rv = sl_Spawn((_SlSpawnEntryFunc_t)_SlDrvMsgReadSpawnCtx, NULL, 0);
dflet 0:50cedd586816 347
dflet 0:50cedd586816 348 if(rv <0){
dflet 0:50cedd586816 349 Uart_Write((uint8_t*)"\n\r OSI_OPERATION_FAILED \n\r");
dflet 0:50cedd586816 350 }
dflet 0:50cedd586816 351 #else
dflet 0:50cedd586816 352 _nonos._SlNonOsSpawn((_SlSpawnEntryFunc_t)&_SlDrvMsgReadSpawnCtx, NULL, 0);
dflet 0:50cedd586816 353 #endif
dflet 0:50cedd586816 354 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 0:50cedd586816 355 // _nonos._SlNonOsSpawn((_SlSpawnEntryFunc_t)&_SlDrvMsgReadSpawnCtx, NULL, 0);
dflet 0:50cedd586816 356 //#else
dflet 0:50cedd586816 357 // sl_Spawn((_SlSpawnEntryFunc_t)&_SlDrvMsgReadSpawnCtx, NULL, 0);
dflet 0:50cedd586816 358 //#endif
dflet 0:50cedd586816 359 }
dflet 0:50cedd586816 360 }
dflet 0:50cedd586816 361
dflet 0:50cedd586816 362 /*****************************************************************************
dflet 0:50cedd586816 363 _SlDrvCmdOp
dflet 0:50cedd586816 364 *****************************************************************************/
dflet 0:50cedd586816 365 _SlReturnVal_t cc3100_driver::_SlDrvCmdOp(_SlCmdCtrl_t *pCmdCtrl,void* pTxRxDescBuff, _SlCmdExt_t *pCmdExt)
dflet 0:50cedd586816 366 {
dflet 0:50cedd586816 367 _SlReturnVal_t RetVal;
dflet 0:50cedd586816 368
dflet 0:50cedd586816 369 _SlDrvObjLockWaitForever(&g_pCB->GlobalLockObj);
dflet 0:50cedd586816 370 g_pCB->IsCmdRespWaited = TRUE;
dflet 0:50cedd586816 371 SL_TRACE0(DBG_MSG, MSG_312, "_SlDrvCmdOp: call _SlDrvMsgWrite");
dflet 0:50cedd586816 372
dflet 0:50cedd586816 373 /* send the message */
dflet 0:50cedd586816 374 RetVal = _SlDrvMsgWrite(pCmdCtrl, pCmdExt, (uint8_t*)pTxRxDescBuff);
dflet 0:50cedd586816 375
dflet 0:50cedd586816 376 if(SL_OS_RET_CODE_OK == RetVal) {
dflet 0:50cedd586816 377
dflet 0:50cedd586816 378 #ifndef SL_IF_TYPE_UART
dflet 0:50cedd586816 379 /* Waiting for SPI to stabilize after first command */
dflet 0:50cedd586816 380 if( 0 == gFirstCmdMode ) {
dflet 0:50cedd586816 381 gFirstCmdMode = 1;
dflet 0:50cedd586816 382 wait_ms(2);
dflet 0:50cedd586816 383 }
dflet 0:50cedd586816 384 #endif
dflet 0:50cedd586816 385
dflet 0:50cedd586816 386 /* wait for respond */
dflet 0:50cedd586816 387 RetVal = _SlDrvMsgReadCmdCtx(); /* will free global lock */
dflet 0:50cedd586816 388 SL_TRACE0(DBG_MSG, MSG_314, "_SlDrvCmdOp: exited _SlDrvMsgReadCmdCtx");
dflet 0:50cedd586816 389 } else
dflet 0:50cedd586816 390 {
dflet 0:50cedd586816 391 _SlDrvObjUnLock(&g_pCB->GlobalLockObj);
dflet 0:50cedd586816 392 }
dflet 0:50cedd586816 393 return RetVal;
dflet 0:50cedd586816 394 }
dflet 0:50cedd586816 395
dflet 0:50cedd586816 396 /*****************************************************************************
dflet 0:50cedd586816 397 _SlDrvDataReadOp
dflet 0:50cedd586816 398 *****************************************************************************/
dflet 0:50cedd586816 399 _SlReturnVal_t cc3100_driver::_SlDrvDataReadOp(_SlSd_t Sd, _SlCmdCtrl_t *pCmdCtrl, void* pTxRxDescBuff, _SlCmdExt_t *pCmdExt)
dflet 0:50cedd586816 400 {
dflet 0:50cedd586816 401 _SlReturnVal_t RetVal;
dflet 0:50cedd586816 402 uint8_t ObjIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:50cedd586816 403 _SlArgsData_t pArgsData;
dflet 0:50cedd586816 404
dflet 0:50cedd586816 405 /* Validate input arguments */
dflet 0:50cedd586816 406 VERIFY_PROTOCOL(NULL != pCmdExt->pRxPayload);
dflet 0:50cedd586816 407
dflet 0:50cedd586816 408 /* If zero bytes is requested, return error. */
dflet 0:50cedd586816 409 /* This allows us not to fill remote socket's IP address in return arguments */
dflet 0:50cedd586816 410 VERIFY_PROTOCOL(0 != pCmdExt->RxPayloadLen);
dflet 0:50cedd586816 411
dflet 0:50cedd586816 412 /* Validate socket */
dflet 0:50cedd586816 413 if((Sd & BSD_SOCKET_ID_MASK) >= SL_MAX_SOCKETS) {
dflet 0:50cedd586816 414 return SL_EBADF;
dflet 0:50cedd586816 415 }
dflet 0:50cedd586816 416
dflet 0:50cedd586816 417 /*Use Obj to issue the command, if not available try later*/
dflet 0:50cedd586816 418 ObjIdx = (uint8_t)_SlDrvWaitForPoolObj(RECV_ID, Sd & BSD_SOCKET_ID_MASK);
dflet 0:50cedd586816 419
dflet 0:50cedd586816 420 if (MAX_CONCURRENT_ACTIONS == ObjIdx) {
dflet 0:50cedd586816 421 return SL_POOL_IS_EMPTY;
dflet 0:50cedd586816 422 }
dflet 0:50cedd586816 423
dflet 0:50cedd586816 424 _SlDrvProtectionObjLockWaitForever();
dflet 0:50cedd586816 425
dflet 0:50cedd586816 426 pArgsData.pData = pCmdExt->pRxPayload;
dflet 0:50cedd586816 427 pArgsData.pArgs = (uint8_t *)pTxRxDescBuff;
dflet 0:50cedd586816 428 g_pCB->ObjPool[ObjIdx].pRespArgs = (uint8_t *)&pArgsData;
dflet 0:50cedd586816 429 _SlDrvProtectionObjUnLock();
dflet 0:50cedd586816 430
dflet 0:50cedd586816 431 /* Do Flow Control check/update for DataWrite operation */
dflet 0:50cedd586816 432 _SlDrvObjLockWaitForever(&g_pCB->FlowContCB.TxLockObj);
dflet 0:50cedd586816 433
dflet 0:50cedd586816 434 /* Clear SyncObj for the case it was signalled before TxPoolCnt */
dflet 0:50cedd586816 435 /* dropped below '1' (last Data buffer was taken) */
dflet 0:50cedd586816 436 /* OSI_RET_OK_CHECK( sl_SyncObjClear(&g_pCB->FlowContCB.TxSyncObj) ); */
dflet 19:3dd3e7f30f8b 437 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 438 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 439 _nonos.sl_SyncObjClear(&g_pCB->FlowContCB.TxSyncObj);
dflet 0:50cedd586816 440 #else
dflet 0:50cedd586816 441 sl_SyncObjClear(&g_pCB->FlowContCB.TxSyncObj);
dflet 0:50cedd586816 442 #endif
dflet 0:50cedd586816 443 if(g_pCB->FlowContCB.TxPoolCnt <= FLOW_CONT_MIN) {
dflet 0:50cedd586816 444
dflet 0:50cedd586816 445 /* If TxPoolCnt was increased by other thread at this moment,
dflet 0:50cedd586816 446 TxSyncObj won't wait here */
dflet 0:50cedd586816 447 _SlDrvSyncObjWaitForever(&g_pCB->FlowContCB.TxSyncObj);
dflet 0:50cedd586816 448
dflet 0:50cedd586816 449 }
dflet 0:50cedd586816 450
dflet 0:50cedd586816 451 _SlDrvObjLockWaitForever(&g_pCB->GlobalLockObj);
dflet 0:50cedd586816 452
dflet 0:50cedd586816 453 VERIFY_PROTOCOL(g_pCB->FlowContCB.TxPoolCnt > FLOW_CONT_MIN);
dflet 0:50cedd586816 454 g_pCB->FlowContCB.TxPoolCnt--;
dflet 0:50cedd586816 455
dflet 0:50cedd586816 456 _SlDrvObjUnLock(&g_pCB->FlowContCB.TxLockObj);
dflet 0:50cedd586816 457
dflet 0:50cedd586816 458 /* send the message */
dflet 0:50cedd586816 459 RetVal = _SlDrvMsgWrite(pCmdCtrl, pCmdExt, (uint8_t *)pTxRxDescBuff);
dflet 0:50cedd586816 460
dflet 0:50cedd586816 461 _SlDrvObjUnLock(&g_pCB->GlobalLockObj);
dflet 0:50cedd586816 462
dflet 0:50cedd586816 463 if(SL_OS_RET_CODE_OK == RetVal) {
dflet 0:50cedd586816 464 /* Wait for response message. Will be signaled by _SlDrvMsgRead. */
dflet 0:50cedd586816 465 _SlDrvSyncObjWaitForever(&g_pCB->ObjPool[ObjIdx].SyncObj);
dflet 0:50cedd586816 466 }
dflet 0:50cedd586816 467
dflet 0:50cedd586816 468 _SlDrvReleasePoolObj(ObjIdx);
dflet 0:50cedd586816 469 return RetVal;
dflet 0:50cedd586816 470 }
dflet 0:50cedd586816 471
dflet 0:50cedd586816 472 /* ******************************************************************************/
dflet 0:50cedd586816 473 /* _SlDrvDataWriteOp */
dflet 0:50cedd586816 474 /* ******************************************************************************/
dflet 0:50cedd586816 475 _SlReturnVal_t cc3100_driver::_SlDrvDataWriteOp(_SlSd_t Sd, _SlCmdCtrl_t *pCmdCtrl, void* pTxRxDescBuff, _SlCmdExt_t *pCmdExt)
dflet 0:50cedd586816 476 {
dflet 0:50cedd586816 477 _SlReturnVal_t RetVal = SL_EAGAIN; /* initiated as SL_EAGAIN for the non blocking mode */
dflet 0:50cedd586816 478 while( 1 ) {
dflet 0:50cedd586816 479 /* Do Flow Control check/update for DataWrite operation */
dflet 0:50cedd586816 480 _SlDrvObjLockWaitForever(&g_pCB->FlowContCB.TxLockObj);
dflet 0:50cedd586816 481
dflet 0:50cedd586816 482 /* Clear SyncObj for the case it was signalled before TxPoolCnt */
dflet 0:50cedd586816 483 /* dropped below '1' (last Data buffer was taken) */
dflet 0:50cedd586816 484 /* OSI_RET_OK_CHECK( sl_SyncObjClear(&g_pCB->FlowContCB.TxSyncObj) ); */
dflet 19:3dd3e7f30f8b 485 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 486 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 487 _nonos.sl_SyncObjClear(&g_pCB->FlowContCB.TxSyncObj);
dflet 0:50cedd586816 488 #else
dflet 0:50cedd586816 489 sl_SyncObjClear(&g_pCB->FlowContCB.TxSyncObj);
dflet 0:50cedd586816 490 #endif
dflet 0:50cedd586816 491 /* we have indication that the last send has failed - socket is no longer valid for operations */
dflet 0:50cedd586816 492 if(g_pCB->SocketTXFailure & (1<<(Sd & BSD_SOCKET_ID_MASK))) {
dflet 0:50cedd586816 493 _SlDrvObjUnLock(&g_pCB->FlowContCB.TxLockObj);
dflet 0:50cedd586816 494 return SL_SOC_ERROR;
dflet 0:50cedd586816 495 }
dflet 0:50cedd586816 496
dflet 0:50cedd586816 497 if(g_pCB->FlowContCB.TxPoolCnt <= FLOW_CONT_MIN + 1) {
dflet 0:50cedd586816 498 /* we have indication that this socket is set as blocking and we try to */
dflet 0:50cedd586816 499 /* unblock it - return an error */
dflet 0:50cedd586816 500 if( g_pCB->SocketNonBlocking & (1<< (Sd & BSD_SOCKET_ID_MASK)))
dflet 0:50cedd586816 501 {
dflet 0:50cedd586816 502 _SlDrvObjUnLock(&g_pCB->FlowContCB.TxLockObj);
dflet 0:50cedd586816 503 return RetVal;
dflet 0:50cedd586816 504 }
dflet 0:50cedd586816 505 /* If TxPoolCnt was increased by other thread at this moment, */
dflet 0:50cedd586816 506 /* TxSyncObj won't wait here */
dflet 0:50cedd586816 507 _SlDrvSyncObjWaitForever(&g_pCB->FlowContCB.TxSyncObj);
dflet 0:50cedd586816 508 }
dflet 0:50cedd586816 509
dflet 0:50cedd586816 510 if(g_pCB->FlowContCB.TxPoolCnt > FLOW_CONT_MIN + 1 ) {
dflet 0:50cedd586816 511 break;
dflet 0:50cedd586816 512 }
dflet 0:50cedd586816 513 else
dflet 0:50cedd586816 514 {
dflet 0:50cedd586816 515 _SlDrvObjUnLock(&g_pCB->FlowContCB.TxLockObj);
dflet 0:50cedd586816 516 }
dflet 0:50cedd586816 517 }
dflet 0:50cedd586816 518
dflet 0:50cedd586816 519 _SlDrvObjLockWaitForever(&g_pCB->GlobalLockObj);
dflet 0:50cedd586816 520
dflet 0:50cedd586816 521
dflet 0:50cedd586816 522 VERIFY_PROTOCOL(g_pCB->FlowContCB.TxPoolCnt > FLOW_CONT_MIN + 1 );
dflet 0:50cedd586816 523 g_pCB->FlowContCB.TxPoolCnt--;
dflet 0:50cedd586816 524
dflet 0:50cedd586816 525 _SlDrvObjUnLock(&g_pCB->FlowContCB.TxLockObj);
dflet 18:3f1b52616d00 526
dflet 0:50cedd586816 527 /* send the message */
dflet 0:50cedd586816 528 RetVal = _SlDrvMsgWrite(pCmdCtrl, pCmdExt, (uint8_t*)pTxRxDescBuff);
dflet 18:3f1b52616d00 529
dflet 0:50cedd586816 530 _SlDrvObjUnLock(&g_pCB->GlobalLockObj);
dflet 0:50cedd586816 531
dflet 0:50cedd586816 532 return RetVal;
dflet 0:50cedd586816 533 }
dflet 0:50cedd586816 534
dflet 0:50cedd586816 535 /* ******************************************************************************/
dflet 0:50cedd586816 536 /* _SlDrvMsgWrite */
dflet 0:50cedd586816 537 /* ******************************************************************************/
dflet 0:50cedd586816 538 _SlReturnVal_t cc3100_driver::_SlDrvMsgWrite(_SlCmdCtrl_t *pCmdCtrl, _SlCmdExt_t *pCmdExt, uint8_t *pTxRxDescBuff)
dflet 0:50cedd586816 539 {
dflet 0:50cedd586816 540 //printf("_SlDrvMsgWrite\r\n");
dflet 0:50cedd586816 541 uint8_t sendRxPayload = FALSE;
dflet 0:50cedd586816 542 VERIFY_PROTOCOL(NULL != pCmdCtrl);
dflet 0:50cedd586816 543
dflet 0:50cedd586816 544 g_pCB->FunctionParams.pCmdCtrl = pCmdCtrl;
dflet 0:50cedd586816 545 g_pCB->FunctionParams.pTxRxDescBuff = pTxRxDescBuff;
dflet 0:50cedd586816 546 g_pCB->FunctionParams.pCmdExt = pCmdExt;
dflet 0:50cedd586816 547
dflet 0:50cedd586816 548 g_pCB->TempProtocolHeader.Opcode = pCmdCtrl->Opcode;
dflet 0:50cedd586816 549 g_pCB->TempProtocolHeader.Len = _SL_PROTOCOL_CALC_LEN(pCmdCtrl, pCmdExt);
dflet 0:50cedd586816 550
dflet 0:50cedd586816 551 if (pCmdExt && pCmdExt->RxPayloadLen < 0 && pCmdExt->TxPayloadLen)
dflet 0:50cedd586816 552 {
dflet 0:50cedd586816 553 pCmdExt->RxPayloadLen = pCmdExt->RxPayloadLen * (-1); /* change sign */
dflet 0:50cedd586816 554 sendRxPayload = TRUE;
dflet 0:50cedd586816 555 g_pCB->TempProtocolHeader.Len = g_pCB->TempProtocolHeader.Len + pCmdExt->RxPayloadLen;
dflet 0:50cedd586816 556 }
dflet 0:50cedd586816 557
dflet 0:50cedd586816 558 #ifdef SL_START_WRITE_STAT
dflet 0:50cedd586816 559 sl_IfStartWriteSequence(g_pCB->FD);
dflet 0:50cedd586816 560 #endif
dflet 0:50cedd586816 561
dflet 0:50cedd586816 562 #ifdef SL_IF_TYPE_UART
dflet 0:50cedd586816 563 /* Write long sync pattern */
dflet 19:3dd3e7f30f8b 564 NWP_IF_WRITE_CHECK(g_pCB->FD, (uint8_t *)&g_H2NSyncPattern.Long, 2*SYNC_PATTERN_LEN);
dflet 0:50cedd586816 565 #else
dflet 0:50cedd586816 566 /* Write short sync pattern */
dflet 19:3dd3e7f30f8b 567 NWP_IF_WRITE_CHECK(g_pCB->FD, (uint8_t *)&g_H2NSyncPattern.Short, SYNC_PATTERN_LEN);
dflet 0:50cedd586816 568 #endif
dflet 0:50cedd586816 569 /* Header */
dflet 19:3dd3e7f30f8b 570 NWP_IF_WRITE_CHECK(g_pCB->FD, (uint8_t *)&g_pCB->TempProtocolHeader, _SL_CMD_HDR_SIZE);
dflet 0:50cedd586816 571
dflet 0:50cedd586816 572 /* Descriptors */
dflet 0:50cedd586816 573 if (pTxRxDescBuff && pCmdCtrl->TxDescLen > 0)
dflet 0:50cedd586816 574 {
dflet 19:3dd3e7f30f8b 575 NWP_IF_WRITE_CHECK(g_pCB->FD, pTxRxDescBuff,
dflet 0:50cedd586816 576 _SL_PROTOCOL_ALIGN_SIZE(pCmdCtrl->TxDescLen));
dflet 0:50cedd586816 577 }
dflet 0:50cedd586816 578
dflet 0:50cedd586816 579 /* A special mode where Rx payload and Rx length are used as Tx as well */
dflet 0:50cedd586816 580 /* This mode requires no Rx payload on the response and currently used by fs_Close and sl_Send on */
dflet 0:50cedd586816 581 /* transceiver mode */
dflet 0:50cedd586816 582 if (sendRxPayload == TRUE )
dflet 0:50cedd586816 583 {
dflet 19:3dd3e7f30f8b 584 NWP_IF_WRITE_CHECK(g_pCB->FD, pCmdExt->pRxPayload, _SL_PROTOCOL_ALIGN_SIZE(pCmdExt->RxPayloadLen));
dflet 0:50cedd586816 585 }
dflet 0:50cedd586816 586
dflet 0:50cedd586816 587 /* Payload */
dflet 0:50cedd586816 588 if (pCmdExt && pCmdExt->TxPayloadLen > 0)
dflet 0:50cedd586816 589 {
dflet 0:50cedd586816 590 /* If the message has payload, it is mandatory that the message's arguments are protocol aligned. */
dflet 0:50cedd586816 591 /* Otherwise the aligning of arguments will create a gap between arguments and payload. */
dflet 0:50cedd586816 592 VERIFY_PROTOCOL(_SL_IS_PROTOCOL_ALIGNED_SIZE(pCmdCtrl->TxDescLen));
dflet 0:50cedd586816 593
dflet 19:3dd3e7f30f8b 594 NWP_IF_WRITE_CHECK(g_pCB->FD, pCmdExt->pTxPayload, _SL_PROTOCOL_ALIGN_SIZE(pCmdExt->TxPayloadLen));
dflet 0:50cedd586816 595 }
dflet 0:50cedd586816 596
dflet 0:50cedd586816 597 _SL_DBG_CNT_INC(MsgCnt.Write);
dflet 0:50cedd586816 598
dflet 0:50cedd586816 599 #ifdef SL_START_WRITE_STAT
dflet 0:50cedd586816 600 sl_IfEndWriteSequence(g_pCB->FD);
dflet 0:50cedd586816 601 #endif
dflet 0:50cedd586816 602
dflet 0:50cedd586816 603 return SL_OS_RET_CODE_OK;
dflet 0:50cedd586816 604 }
dflet 0:50cedd586816 605
dflet 0:50cedd586816 606 /* ******************************************************************************/
dflet 0:50cedd586816 607 /* _SlDrvMsgRead */
dflet 0:50cedd586816 608 /* ******************************************************************************/
dflet 0:50cedd586816 609 _SlReturnVal_t cc3100_driver::_SlDrvMsgRead(void)
dflet 0:50cedd586816 610 {
dflet 0:50cedd586816 611 /* alignment for small memory models */
dflet 0:50cedd586816 612 union {
dflet 0:50cedd586816 613 uint8_t TempBuf[_SL_RESP_HDR_SIZE];
dflet 0:50cedd586816 614 uint32_t DummyBuf[2];
dflet 0:50cedd586816 615 } uBuf;
dflet 0:50cedd586816 616 uint8_t TailBuffer[4];
dflet 0:50cedd586816 617 uint16_t LengthToCopy;
dflet 0:50cedd586816 618 uint16_t AlignedLengthRecv;
dflet 0:50cedd586816 619 uint8_t AlignSize;
dflet 0:50cedd586816 620 uint8_t *pAsyncBuf = NULL;
dflet 0:50cedd586816 621 uint16_t OpCode;
dflet 0:50cedd586816 622 uint16_t RespPayloadLen;
dflet 0:50cedd586816 623 uint8_t sd = SL_MAX_SOCKETS;
dflet 0:50cedd586816 624 _SlRxMsgClass_e RxMsgClass;
dflet 0:50cedd586816 625
dflet 0:50cedd586816 626
dflet 0:50cedd586816 627 /* save params in global CB */
dflet 0:50cedd586816 628 g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL;
dflet 0:50cedd586816 629 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler= NULL;
dflet 0:50cedd586816 630
dflet 0:50cedd586816 631
dflet 0:50cedd586816 632 VERIFY_RET_OK(_SlDrvRxHdrRead((uint8_t*)(uBuf.TempBuf), &AlignSize));
dflet 0:50cedd586816 633 OpCode = OPCODE(uBuf.TempBuf);
dflet 0:50cedd586816 634 RespPayloadLen = RSP_PAYLOAD_LEN(uBuf.TempBuf);
dflet 0:50cedd586816 635
dflet 0:50cedd586816 636
dflet 0:50cedd586816 637 /* 'Init Compelete' message bears no valid FlowControl info */
dflet 0:50cedd586816 638 if(SL_OPCODE_DEVICE_INITCOMPLETE != OpCode) {
dflet 0:50cedd586816 639 g_pCB->FlowContCB.TxPoolCnt = ((_SlResponseHeader_t *)uBuf.TempBuf)->TxPoolCnt;
dflet 0:50cedd586816 640 g_pCB->SocketNonBlocking = ((_SlResponseHeader_t *)uBuf.TempBuf)->SocketNonBlocking;
dflet 0:50cedd586816 641 g_pCB->SocketTXFailure = ((_SlResponseHeader_t *)uBuf.TempBuf)->SocketTXFailure;
dflet 0:50cedd586816 642
dflet 0:50cedd586816 643 if(g_pCB->FlowContCB.TxPoolCnt > FLOW_CONT_MIN) {
dflet 0:50cedd586816 644 _SlDrvSyncObjSignal(&g_pCB->FlowContCB.TxSyncObj);
dflet 0:50cedd586816 645 }
dflet 0:50cedd586816 646 }
dflet 16:7e5aab2fabba 647
dflet 0:50cedd586816 648 /* Find the RX messaage class and set its async event handler */
dflet 0:50cedd586816 649 _SlDrvClassifyRxMsg(OpCode);
dflet 0:50cedd586816 650 RxMsgClass = g_pCB->FunctionParams.AsyncExt.RxMsgClass;
dflet 0:50cedd586816 651
dflet 0:50cedd586816 652
dflet 0:50cedd586816 653 switch(RxMsgClass)
dflet 0:50cedd586816 654 {
dflet 0:50cedd586816 655 case ASYNC_EVT_CLASS:
dflet 0:50cedd586816 656
dflet 0:50cedd586816 657 VERIFY_PROTOCOL(NULL == pAsyncBuf);
dflet 0:50cedd586816 658
dflet 0:50cedd586816 659 #ifdef SL_MEMORY_MGMT_DYNAMIC
dflet 0:50cedd586816 660 g_pCB->FunctionParams.AsyncExt.pAsyncBuf = sl_Malloc(SL_ASYNC_MAX_MSG_LEN);
dflet 0:50cedd586816 661 #else
dflet 0:50cedd586816 662 g_pCB->FunctionParams.AsyncExt.pAsyncBuf = g_StatMem.AsyncRespBuf;
dflet 0:50cedd586816 663 #endif
dflet 0:50cedd586816 664 /* set the local pointer to the allocated one */
dflet 0:50cedd586816 665 pAsyncBuf = g_pCB->FunctionParams.AsyncExt.pAsyncBuf;
dflet 0:50cedd586816 666
dflet 0:50cedd586816 667 /* clear the async buffer */
dflet 0:50cedd586816 668 _SlDrvMemZero(pAsyncBuf, SL_ASYNC_MAX_MSG_LEN);
dflet 0:50cedd586816 669
dflet 0:50cedd586816 670 MALLOC_OK_CHECK(pAsyncBuf);
dflet 0:50cedd586816 671
dflet 0:50cedd586816 672 memcpy(pAsyncBuf, uBuf.TempBuf, _SL_RESP_HDR_SIZE);
dflet 0:50cedd586816 673 if (_SL_PROTOCOL_ALIGN_SIZE(RespPayloadLen) <= SL_ASYNC_MAX_PAYLOAD_LEN)
dflet 0:50cedd586816 674 {
dflet 0:50cedd586816 675 AlignedLengthRecv = _SL_PROTOCOL_ALIGN_SIZE(RespPayloadLen);
dflet 0:50cedd586816 676 }
dflet 0:50cedd586816 677 else
dflet 0:50cedd586816 678 {
dflet 0:50cedd586816 679 AlignedLengthRecv = _SL_PROTOCOL_ALIGN_SIZE(SL_ASYNC_MAX_PAYLOAD_LEN);
dflet 0:50cedd586816 680 }
dflet 0:50cedd586816 681 if (RespPayloadLen > 0)
dflet 0:50cedd586816 682 {
dflet 19:3dd3e7f30f8b 683 NWP_IF_READ_CHECK(g_pCB->FD, pAsyncBuf + _SL_RESP_HDR_SIZE, AlignedLengthRecv);
dflet 0:50cedd586816 684 }
dflet 0:50cedd586816 685 /* In case ASYNC RX buffer length is smaller then the received data length, dump the rest */
dflet 0:50cedd586816 686 if ((_SL_PROTOCOL_ALIGN_SIZE(RespPayloadLen) > SL_ASYNC_MAX_PAYLOAD_LEN))
dflet 0:50cedd586816 687 {
dflet 0:50cedd586816 688 AlignedLengthRecv = _SL_PROTOCOL_ALIGN_SIZE(RespPayloadLen) - SL_ASYNC_MAX_PAYLOAD_LEN;
dflet 0:50cedd586816 689 while (AlignedLengthRecv > 0)
dflet 0:50cedd586816 690 {
dflet 19:3dd3e7f30f8b 691 NWP_IF_READ_CHECK(g_pCB->FD,TailBuffer,4);
dflet 0:50cedd586816 692 AlignedLengthRecv = AlignedLengthRecv - 4;
dflet 0:50cedd586816 693 }
dflet 0:50cedd586816 694 }
dflet 0:50cedd586816 695
dflet 0:50cedd586816 696 _SlDrvProtectionObjLockWaitForever();
dflet 0:50cedd586816 697
dflet 0:50cedd586816 698 if (
dflet 0:50cedd586816 699 #ifndef SL_TINY_EXT
dflet 0:50cedd586816 700 (SL_OPCODE_SOCKET_ACCEPTASYNCRESPONSE == OpCode) || (SL_OPCODE_SOCKET_ACCEPTASYNCRESPONSE_V6 == OpCode) ||
dflet 0:50cedd586816 701 #endif
dflet 0:50cedd586816 702 (SL_OPCODE_SOCKET_CONNECTASYNCRESPONSE == OpCode)
dflet 0:50cedd586816 703 )
dflet 0:50cedd586816 704 {
dflet 0:50cedd586816 705 /* go over the active list if exist to find obj waiting for this Async event */
dflet 0:50cedd586816 706 sd = ((((_SocketResponse_t *)(pAsyncBuf + _SL_RESP_HDR_SIZE))->sd) & BSD_SOCKET_ID_MASK);
dflet 0:50cedd586816 707 }
dflet 0:50cedd586816 708 _SlFindAndSetActiveObj(OpCode, sd);
dflet 0:50cedd586816 709 _SlDrvProtectionObjUnLock();
dflet 0:50cedd586816 710
dflet 0:50cedd586816 711 break;
dflet 0:50cedd586816 712 case RECV_RESP_CLASS:
dflet 0:50cedd586816 713 {
dflet 0:50cedd586816 714 uint8_t ExpArgSize; /* Expected size of Recv/Recvfrom arguments */
dflet 0:50cedd586816 715
dflet 0:50cedd586816 716 switch(OpCode)
dflet 0:50cedd586816 717 {
dflet 0:50cedd586816 718 case SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE:
dflet 0:50cedd586816 719 ExpArgSize = RECVFROM_IPV4_ARGS_SIZE;
dflet 0:50cedd586816 720 break;
dflet 0:50cedd586816 721 #ifndef SL_TINY_EXT
dflet 0:50cedd586816 722 case SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE_V6:
dflet 0:50cedd586816 723 ExpArgSize = RECVFROM_IPV6_ARGS_SIZE;
dflet 0:50cedd586816 724 break;
dflet 0:50cedd586816 725 #endif
dflet 0:50cedd586816 726 default:
dflet 0:50cedd586816 727 /* SL_OPCODE_SOCKET_RECVASYNCRESPONSE: */
dflet 0:50cedd586816 728 ExpArgSize = RECV_ARGS_SIZE;
dflet 0:50cedd586816 729 }
dflet 0:50cedd586816 730
dflet 0:50cedd586816 731 /* Read first 4 bytes of Recv/Recvfrom response to get SocketId and actual */
dflet 0:50cedd586816 732 /* response data length */
dflet 19:3dd3e7f30f8b 733 NWP_IF_READ_CHECK(g_pCB->FD, &uBuf.TempBuf[4], RECV_ARGS_SIZE);
dflet 0:50cedd586816 734
dflet 0:50cedd586816 735 /* Validate Socket ID and Received Length value. */
dflet 0:50cedd586816 736 VERIFY_PROTOCOL((SD(&uBuf.TempBuf[4])& BSD_SOCKET_ID_MASK) < SL_MAX_SOCKETS);
dflet 0:50cedd586816 737
dflet 0:50cedd586816 738 _SlDrvProtectionObjLockWaitForever();
dflet 0:50cedd586816 739
dflet 0:50cedd586816 740 /* go over the active list if exist to find obj waiting for this Async event */
dflet 0:50cedd586816 741 VERIFY_RET_OK(_SlFindAndSetActiveObj(OpCode,SD(&uBuf.TempBuf[4]) & BSD_SOCKET_ID_MASK));
dflet 0:50cedd586816 742
dflet 0:50cedd586816 743 /* Verify data is waited on this socket. The pArgs should have been set by _SlDrvDataReadOp(). */
dflet 0:50cedd586816 744 VERIFY_SOCKET_CB(NULL != ((_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pData))->pArgs);
dflet 0:50cedd586816 745
dflet 0:50cedd586816 746 memcpy( ((_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pArgs, &uBuf.TempBuf[4], RECV_ARGS_SIZE);
dflet 0:50cedd586816 747
dflet 0:50cedd586816 748 if(ExpArgSize > RECV_ARGS_SIZE)
dflet 0:50cedd586816 749 {
dflet 19:3dd3e7f30f8b 750 NWP_IF_READ_CHECK(g_pCB->FD,
dflet 0:50cedd586816 751 ((_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pArgs + RECV_ARGS_SIZE,
dflet 0:50cedd586816 752 ExpArgSize - RECV_ARGS_SIZE);
dflet 0:50cedd586816 753 }
dflet 0:50cedd586816 754
dflet 0:50cedd586816 755 /* Here g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pData contains requested(expected) Recv/Recvfrom DataSize. */
dflet 0:50cedd586816 756 /* Overwrite requested DataSize with actual one. */
dflet 0:50cedd586816 757 /* If error is received, this information will be read from arguments. */
dflet 0:50cedd586816 758 if(ACT_DATA_SIZE(&uBuf.TempBuf[4]) > 0)
dflet 0:50cedd586816 759 {
dflet 0:50cedd586816 760 VERIFY_SOCKET_CB(NULL != ((_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pData);
dflet 0:50cedd586816 761
dflet 0:50cedd586816 762 /* Read 4 bytes aligned from interface */
dflet 0:50cedd586816 763 /* therefore check the requested length and read only */
dflet 0:50cedd586816 764 /* 4 bytes aligned data. The rest unaligned (if any) will be read */
dflet 0:50cedd586816 765 /* and copied to a TailBuffer */
dflet 0:50cedd586816 766 LengthToCopy = ACT_DATA_SIZE(&uBuf.TempBuf[4]) & (3);
dflet 0:50cedd586816 767 AlignedLengthRecv = ACT_DATA_SIZE(&uBuf.TempBuf[4]) & (~3);
dflet 0:50cedd586816 768 if( AlignedLengthRecv >= 4)
dflet 0:50cedd586816 769 {
dflet 19:3dd3e7f30f8b 770 NWP_IF_READ_CHECK(g_pCB->FD,((_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pData,AlignedLengthRecv );
dflet 0:50cedd586816 771 }
dflet 0:50cedd586816 772 /* copy the unaligned part, if any */
dflet 0:50cedd586816 773 if( LengthToCopy > 0)
dflet 0:50cedd586816 774 {
dflet 19:3dd3e7f30f8b 775 NWP_IF_READ_CHECK(g_pCB->FD,TailBuffer,4);
dflet 0:50cedd586816 776 /* copy TailBuffer unaligned part (1/2/3 bytes) */
dflet 0:50cedd586816 777 memcpy(((_SlArgsData_t *)(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs))->pData + AlignedLengthRecv,TailBuffer,LengthToCopy);
dflet 0:50cedd586816 778 }
dflet 0:50cedd586816 779 }
dflet 0:50cedd586816 780 _SlDrvSyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
dflet 0:50cedd586816 781 _SlDrvProtectionObjUnLock();
dflet 0:50cedd586816 782 }
dflet 0:50cedd586816 783 break;
dflet 0:50cedd586816 784
dflet 0:50cedd586816 785 case CMD_RESP_CLASS:
dflet 0:50cedd586816 786
dflet 0:50cedd586816 787 /* Some commands pass a maximum arguments size. */
dflet 0:50cedd586816 788 /* In this case Driver will send extra dummy patterns to NWP if */
dflet 0:50cedd586816 789 /* the response message is smaller than maximum. */
dflet 0:50cedd586816 790 /* When RxDescLen is not exact, using RxPayloadLen is forbidden! */
dflet 0:50cedd586816 791 /* If such case cannot be avoided - parse message here to detect */
dflet 0:50cedd586816 792 /* arguments/payload border. */
dflet 19:3dd3e7f30f8b 793 NWP_IF_READ_CHECK(g_pCB->FD, g_pCB->FunctionParams.pTxRxDescBuff, _SL_PROTOCOL_ALIGN_SIZE(g_pCB->FunctionParams.pCmdCtrl->RxDescLen));
dflet 0:50cedd586816 794
dflet 0:50cedd586816 795 if((NULL != g_pCB->FunctionParams.pCmdExt) && (0 != g_pCB->FunctionParams.pCmdExt->RxPayloadLen)) {
dflet 0:50cedd586816 796 /* Actual size of command's response payload: <msg_payload_len> - <rsp_args_len> */
dflet 0:50cedd586816 797 int16_t ActDataSize = RSP_PAYLOAD_LEN(uBuf.TempBuf) - g_pCB->FunctionParams.pCmdCtrl->RxDescLen;
dflet 0:50cedd586816 798
dflet 0:50cedd586816 799 g_pCB->FunctionParams.pCmdExt->ActualRxPayloadLen = ActDataSize;
dflet 0:50cedd586816 800
dflet 0:50cedd586816 801 /* Check that the space prepared by user for the response data is sufficient. */
dflet 0:50cedd586816 802 if(ActDataSize <= 0) {
dflet 0:50cedd586816 803 g_pCB->FunctionParams.pCmdExt->RxPayloadLen = 0;
dflet 0:50cedd586816 804 } else {
dflet 0:50cedd586816 805 /* In case the user supplied Rx buffer length which is smaller then the received data length, copy according to user length */
dflet 0:50cedd586816 806 if (ActDataSize > g_pCB->FunctionParams.pCmdExt->RxPayloadLen) {
dflet 0:50cedd586816 807 LengthToCopy = g_pCB->FunctionParams.pCmdExt->RxPayloadLen & (3);
dflet 0:50cedd586816 808 AlignedLengthRecv = g_pCB->FunctionParams.pCmdExt->RxPayloadLen & (~3);
dflet 0:50cedd586816 809 } else {
dflet 0:50cedd586816 810 LengthToCopy = ActDataSize & (3);
dflet 0:50cedd586816 811 AlignedLengthRecv = ActDataSize & (~3);
dflet 0:50cedd586816 812 }
dflet 0:50cedd586816 813 /* Read 4 bytes aligned from interface */
dflet 0:50cedd586816 814 /* therefore check the requested length and read only */
dflet 0:50cedd586816 815 /* 4 bytes aligned data. The rest unaligned (if any) will be read */
dflet 0:50cedd586816 816 /* and copied to a TailBuffer */
dflet 0:50cedd586816 817
dflet 0:50cedd586816 818 if( AlignedLengthRecv >= 4) {
dflet 19:3dd3e7f30f8b 819 NWP_IF_READ_CHECK(g_pCB->FD,
dflet 0:50cedd586816 820 g_pCB->FunctionParams.pCmdExt->pRxPayload,
dflet 0:50cedd586816 821 AlignedLengthRecv );
dflet 0:50cedd586816 822
dflet 0:50cedd586816 823 }
dflet 0:50cedd586816 824 /* copy the unaligned part, if any */
dflet 0:50cedd586816 825 if( LengthToCopy > 0) {
dflet 19:3dd3e7f30f8b 826 NWP_IF_READ_CHECK(g_pCB->FD,TailBuffer,4);
dflet 0:50cedd586816 827 /* copy TailBuffer unaligned part (1/2/3 bytes) */
dflet 0:50cedd586816 828 memcpy(g_pCB->FunctionParams.pCmdExt->pRxPayload + AlignedLengthRecv,
dflet 0:50cedd586816 829 TailBuffer,
dflet 0:50cedd586816 830 LengthToCopy);
dflet 0:50cedd586816 831 ActDataSize = ActDataSize-4;
dflet 0:50cedd586816 832 }
dflet 0:50cedd586816 833 /* In case the user supplied Rx buffer length which is smaller then the received data length, dump the rest */
dflet 0:50cedd586816 834 if (ActDataSize > g_pCB->FunctionParams.pCmdExt->RxPayloadLen) {
dflet 0:50cedd586816 835 /* calculate the rest of the data size to dump */
dflet 0:50cedd586816 836 AlignedLengthRecv = ActDataSize - (g_pCB->FunctionParams.pCmdExt->RxPayloadLen & (~3));
dflet 0:50cedd586816 837 while( AlignedLengthRecv > 0) {
dflet 19:3dd3e7f30f8b 838 NWP_IF_READ_CHECK(g_pCB->FD,TailBuffer, 4 );
dflet 0:50cedd586816 839 AlignedLengthRecv = AlignedLengthRecv - 4;
dflet 0:50cedd586816 840 }
dflet 0:50cedd586816 841 }
dflet 0:50cedd586816 842 }
dflet 0:50cedd586816 843 }
dflet 0:50cedd586816 844 break;
dflet 0:50cedd586816 845
dflet 0:50cedd586816 846 default:
dflet 0:50cedd586816 847 /* DUMMY_MSG_CLASS: Flow control message has no payload. */
dflet 0:50cedd586816 848 break;
dflet 0:50cedd586816 849 }
dflet 0:50cedd586816 850
dflet 0:50cedd586816 851 if(AlignSize > 0) {
dflet 19:3dd3e7f30f8b 852 NWP_IF_READ_CHECK(g_pCB->FD, uBuf.TempBuf, AlignSize);
dflet 0:50cedd586816 853 }
dflet 0:50cedd586816 854
dflet 0:50cedd586816 855 _SL_DBG_CNT_INC(MsgCnt.Read);
dflet 0:50cedd586816 856
dflet 0:50cedd586816 857 /* Unmask Interrupt call */
dflet 0:50cedd586816 858 _spi.UnMaskIntHdlr();
dflet 0:50cedd586816 859
dflet 0:50cedd586816 860 return SL_OS_RET_CODE_OK;
dflet 0:50cedd586816 861 }
dflet 0:50cedd586816 862
dflet 0:50cedd586816 863 /* ******************************************************************************/
dflet 0:50cedd586816 864 /* _SlAsyncEventGenericHandler */
dflet 0:50cedd586816 865 /* ******************************************************************************/
dflet 0:50cedd586816 866 void cc3100_driver::_SlAsyncEventGenericHandler(void)
dflet 0:50cedd586816 867 {
dflet 0:50cedd586816 868 uint32_t SlAsyncEvent = 0;
dflet 0:50cedd586816 869 uint8_t OpcodeFound = FALSE;
dflet 0:50cedd586816 870 uint8_t i;
dflet 0:50cedd586816 871
dflet 0:50cedd586816 872 uint32_t* pEventLocation = NULL; /* This pointer will override the async buffer with the translated event type */
dflet 0:50cedd586816 873 _SlResponseHeader_t *pHdr = (_SlResponseHeader_t *)g_pCB->FunctionParams.AsyncExt.pAsyncBuf;
dflet 0:50cedd586816 874
dflet 0:50cedd586816 875
dflet 0:50cedd586816 876 /* if no async event registered nothing to do..*/
dflet 0:50cedd586816 877 if (g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler == NULL)
dflet 0:50cedd586816 878 return;
dflet 0:50cedd586816 879
dflet 0:50cedd586816 880 /* Iterate through all the opcode in the table */
dflet 0:50cedd586816 881 for (i=0; i< (sizeof(OpcodeTranslateTable) / sizeof(OpcodeKeyVal_t)); i++)
dflet 0:50cedd586816 882 {
dflet 0:50cedd586816 883 if (OpcodeTranslateTable[i].opcode == pHdr->GenHeader.Opcode)
dflet 0:50cedd586816 884 {
dflet 0:50cedd586816 885 SlAsyncEvent = OpcodeTranslateTable[i].event;
dflet 0:50cedd586816 886 OpcodeFound = TRUE;
dflet 0:50cedd586816 887 break;
dflet 0:50cedd586816 888 }
dflet 0:50cedd586816 889 }
dflet 0:50cedd586816 890
dflet 0:50cedd586816 891 /* No Async event found in the table */
dflet 0:50cedd586816 892 if (OpcodeFound == FALSE)
dflet 0:50cedd586816 893 {
dflet 0:50cedd586816 894 /* This case handles all the async events handlers of the DEVICE & SOCK Silos which are handled internally.
dflet 0:50cedd586816 895 For these cases we send the async even buffer as is */
dflet 0:50cedd586816 896 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(g_pCB->FunctionParams.AsyncExt.pAsyncBuf);
dflet 0:50cedd586816 897 }
dflet 0:50cedd586816 898 else
dflet 0:50cedd586816 899 {
dflet 0:50cedd586816 900 /* calculate the event type location to be filled in the async buffer */
dflet 0:50cedd586816 901 pEventLocation = (uint32_t*)(g_pCB->FunctionParams.AsyncExt.pAsyncBuf + sizeof (_SlResponseHeader_t) - sizeof(SlAsyncEvent) );
dflet 0:50cedd586816 902
dflet 0:50cedd586816 903 /* Override the async buffer (before the data starts ) with our event type */
dflet 0:50cedd586816 904 *pEventLocation = SlAsyncEvent;
dflet 0:50cedd586816 905
dflet 0:50cedd586816 906 /* call the event handler registered by the user with our async buffer which now holds
dflet 0:50cedd586816 907 the User's event type and its related data */
dflet 0:50cedd586816 908 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler(pEventLocation);
dflet 0:50cedd586816 909 }
dflet 0:50cedd586816 910
dflet 0:50cedd586816 911 }
dflet 0:50cedd586816 912
dflet 0:50cedd586816 913
dflet 0:50cedd586816 914 /* ******************************************************************************/
dflet 0:50cedd586816 915 /* _SlDrvMsgReadCmdCtx */
dflet 0:50cedd586816 916 /* ******************************************************************************/
dflet 0:50cedd586816 917 _SlReturnVal_t cc3100_driver::_SlDrvMsgReadCmdCtx(void)
dflet 0:50cedd586816 918 {
dflet 0:50cedd586816 919 /* after command response is received and isCmdRespWaited */
dflet 0:50cedd586816 920 /* flag is set FALSE, it is necessary to read out all */
dflet 0:50cedd586816 921 /* Async messages in Commands context, because ssiDma_IsrHandleSignalFromSlave */
dflet 0:50cedd586816 922 /* could have dispatched some Async messages to g_NwpIf.CmdSyncObj */
dflet 0:50cedd586816 923 /* after command response but before this response has been processed */
dflet 0:50cedd586816 924 /* by spi_singleRead and isCmdRespWaited was set FALSE. */
dflet 0:50cedd586816 925
dflet 0:50cedd586816 926 while (TRUE == g_pCB->IsCmdRespWaited) {
dflet 0:50cedd586816 927
dflet 0:50cedd586816 928 if(_SL_PENDING_RX_MSG(g_pCB)) {
dflet 0:50cedd586816 929
dflet 0:50cedd586816 930 VERIFY_RET_OK(_SlDrvMsgRead());
dflet 0:50cedd586816 931 g_pCB->RxDoneCnt++;
dflet 16:7e5aab2fabba 932
dflet 0:50cedd586816 933 if (CMD_RESP_CLASS == g_pCB->FunctionParams.AsyncExt.RxMsgClass) {
dflet 0:50cedd586816 934 g_pCB->IsCmdRespWaited = FALSE;
dflet 0:50cedd586816 935
dflet 0:50cedd586816 936 /* In case CmdResp has been read without waiting on CmdSyncObj - that */
dflet 0:50cedd586816 937 /* Sync object. That to prevent old signal to be processed. */
dflet 19:3dd3e7f30f8b 938 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 939 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 940 _nonos.sl_SyncObjClear(&g_pCB->CmdSyncObj);
dflet 0:50cedd586816 941 #else
dflet 0:50cedd586816 942 sl_SyncObjClear(&g_pCB->CmdSyncObj);
dflet 0:50cedd586816 943 #endif
dflet 0:50cedd586816 944 } else if (ASYNC_EVT_CLASS == g_pCB->FunctionParams.AsyncExt.RxMsgClass) {
dflet 0:50cedd586816 945 /* If Async event has been read in CmdResp context, check whether */
dflet 0:50cedd586816 946 /* there is a handler for this event. If there is, spawn specific */
dflet 0:50cedd586816 947 /* handler. Otherwise free the event's buffer. */
dflet 0:50cedd586816 948 /* This way there will be no "dry shots" from CmdResp context to */
dflet 0:50cedd586816 949 /* temporary context, i.e less waste of CPU and faster buffer */
dflet 0:50cedd586816 950 /* release. */
dflet 0:50cedd586816 951 _SlAsyncEventGenericHandler();
dflet 16:7e5aab2fabba 952
dflet 0:50cedd586816 953 #ifdef SL_MEMORY_MGMT_DYNAMIC
dflet 0:50cedd586816 954 sl_Free(g_pCB->FunctionParams.AsyncExt.pAsyncBuf);
dflet 0:50cedd586816 955 #else
dflet 0:50cedd586816 956 g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL;
dflet 0:50cedd586816 957 #endif
dflet 0:50cedd586816 958 }
dflet 0:50cedd586816 959 } else {
dflet 0:50cedd586816 960 /* CmdSyncObj will be signaled by IRQ */
dflet 0:50cedd586816 961 _SlDrvSyncObjWaitForever(&g_pCB->CmdSyncObj);
dflet 0:50cedd586816 962 }
dflet 0:50cedd586816 963 }
dflet 0:50cedd586816 964
dflet 0:50cedd586816 965 /* If there are more pending Rx Msgs after CmdResp is received, */
dflet 0:50cedd586816 966 /* that means that these are Async, Dummy or Read Data Msgs. */
dflet 0:50cedd586816 967 /* Spawn _SlDrvMsgReadSpawnCtx to trigger reading these messages from */
dflet 0:50cedd586816 968 /* Temporary context. */
dflet 0:50cedd586816 969 /* sl_Spawn is activated, using a different context */
dflet 0:50cedd586816 970 _SlDrvObjUnLock(&g_pCB->GlobalLockObj);
dflet 0:50cedd586816 971
dflet 0:50cedd586816 972 if(_SL_PENDING_RX_MSG(g_pCB)) {
dflet 19:3dd3e7f30f8b 973 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 974 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 975 _nonos._SlNonOsSpawn((_SlSpawnEntryFunc_t)&_SlDrvMsgReadSpawnCtx, NULL, 0);
dflet 0:50cedd586816 976 #else
dflet 0:50cedd586816 977 sl_Spawn((_SlSpawnEntryFunc_t)&_SlDrvMsgReadSpawnCtx, NULL, 0);
dflet 0:50cedd586816 978 #endif
dflet 0:50cedd586816 979 }
dflet 0:50cedd586816 980
dflet 0:50cedd586816 981 return SL_OS_RET_CODE_OK;
dflet 0:50cedd586816 982 }
dflet 0:50cedd586816 983
dflet 0:50cedd586816 984 /* ******************************************************************************/
dflet 0:50cedd586816 985 /* _SlDrvMsgReadSpawnCtx */
dflet 0:50cedd586816 986 /* ******************************************************************************/
dflet 0:50cedd586816 987 /*
dflet 0:50cedd586816 988 _SlReturnVal_t cc3100_driver::_SlDrvMsgReadSpawnCtx_(void *pValue)
dflet 0:50cedd586816 989 {
dflet 0:50cedd586816 990
dflet 0:50cedd586816 991 #ifdef SL_POLLING_MODE_USED
dflet 0:50cedd586816 992 int16_t retCode = OSI_OK;
dflet 0:50cedd586816 993 // for polling based systems
dflet 0:50cedd586816 994 do {
dflet 0:50cedd586816 995 retCode = sl_LockObjLock(&g_pCB->GlobalLockObj, 0);
dflet 0:50cedd586816 996 if ( OSI_OK != retCode ) {
dflet 0:50cedd586816 997 if (TRUE == g_pCB->IsCmdRespWaited) {
dflet 0:50cedd586816 998 _SlDrvSyncObjSignal(&g_pCB->CmdSyncObj);
dflet 0:50cedd586816 999 return SL_RET_CODE_OK;
dflet 0:50cedd586816 1000 }
dflet 0:50cedd586816 1001 }
dflet 0:50cedd586816 1002
dflet 0:50cedd586816 1003 } while (OSI_OK != retCode);
dflet 0:50cedd586816 1004
dflet 0:50cedd586816 1005 #else
dflet 0:50cedd586816 1006 _SlDrvObjLockWaitForever(&g_pCB->GlobalLockObj);
dflet 0:50cedd586816 1007 #endif
dflet 0:50cedd586816 1008
dflet 0:50cedd586816 1009 // Messages might have been read by CmdResp context. Therefore after
dflet 0:50cedd586816 1010 // getting LockObj, check again where the Pending Rx Msg is still present.
dflet 0:50cedd586816 1011 if(FALSE == (_SL_PENDING_RX_MSG(g_pCB))) {
dflet 0:50cedd586816 1012 _SlDrvObjUnLock(&g_pCB->GlobalLockObj);
dflet 0:50cedd586816 1013 return SL_RET_CODE_OK;
dflet 0:50cedd586816 1014 }
dflet 0:50cedd586816 1015
dflet 0:50cedd586816 1016 VERIFY_RET_OK(_SlDrvMsgRead());
dflet 0:50cedd586816 1017
dflet 0:50cedd586816 1018 g_pCB->RxDoneCnt++;
dflet 0:50cedd586816 1019
dflet 0:50cedd586816 1020 switch(g_pCB->FunctionParams.AsyncExt.RxMsgClass) {
dflet 0:50cedd586816 1021 case ASYNC_EVT_CLASS:
dflet 0:50cedd586816 1022 // If got here and protected by LockObj a message is waiting
dflet 0:50cedd586816 1023 // to be read
dflet 0:50cedd586816 1024 VERIFY_PROTOCOL(NULL != g_pCB->FunctionParams.AsyncExt.pAsyncBuf);
dflet 0:50cedd586816 1025
dflet 0:50cedd586816 1026 _SlAsyncEventGenericHandler();
dflet 0:50cedd586816 1027
dflet 0:50cedd586816 1028 #ifdef SL_MEMORY_MGMT_DYNAMIC
dflet 0:50cedd586816 1029 sl_Free(g_pCB->FunctionParams.AsyncExt.pAsyncBuf);
dflet 0:50cedd586816 1030 #else
dflet 0:50cedd586816 1031 g_pCB->FunctionParams.AsyncExt.pAsyncBuf = NULL;
dflet 0:50cedd586816 1032 #endif
dflet 0:50cedd586816 1033 break;
dflet 0:50cedd586816 1034 case DUMMY_MSG_CLASS:
dflet 0:50cedd586816 1035 case RECV_RESP_CLASS:
dflet 0:50cedd586816 1036 // These types are legal in this context. Do nothing
dflet 0:50cedd586816 1037 break;
dflet 0:50cedd586816 1038 case CMD_RESP_CLASS:
dflet 0:50cedd586816 1039 // Command response is illegal in this context.
dflet 0:50cedd586816 1040 // No 'break' here: Assert!
dflet 0:50cedd586816 1041 default:
dflet 0:50cedd586816 1042 VERIFY_PROTOCOL(0);
dflet 0:50cedd586816 1043 }
dflet 0:50cedd586816 1044
dflet 0:50cedd586816 1045 _SlDrvObjUnLock(&g_pCB->GlobalLockObj);
dflet 0:50cedd586816 1046
dflet 0:50cedd586816 1047 return(SL_RET_CODE_OK);
dflet 0:50cedd586816 1048 }
dflet 0:50cedd586816 1049 */
dflet 0:50cedd586816 1050 /* ******************************************************************************/
dflet 0:50cedd586816 1051 /* _SlDrvClassifyRxMsg */
dflet 0:50cedd586816 1052 /* ******************************************************************************/
dflet 0:50cedd586816 1053 void cc3100_driver::_SlDrvClassifyRxMsg(_SlOpcode_t Opcode)
dflet 0:50cedd586816 1054 {
dflet 0:50cedd586816 1055 _SlSpawnEntryFunc_t AsyncEvtHandler = NULL;
dflet 0:50cedd586816 1056 _SlRxMsgClass_e RxMsgClass = CMD_RESP_CLASS;
dflet 0:50cedd586816 1057 uint8_t Silo;
dflet 0:50cedd586816 1058
dflet 0:50cedd586816 1059
dflet 0:50cedd586816 1060 if (0 == (SL_OPCODE_SYNC & Opcode))
dflet 0:50cedd586816 1061 { /* Async event has received */
dflet 0:50cedd586816 1062
dflet 0:50cedd586816 1063 if (SL_OPCODE_DEVICE_DEVICEASYNCDUMMY == Opcode)
dflet 0:50cedd586816 1064 {
dflet 0:50cedd586816 1065 RxMsgClass = DUMMY_MSG_CLASS;
dflet 0:50cedd586816 1066 }
dflet 0:50cedd586816 1067 else if ( (SL_OPCODE_SOCKET_RECVASYNCRESPONSE == Opcode) || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE == Opcode)
dflet 0:50cedd586816 1068 #ifndef SL_TINY_EXT
dflet 0:50cedd586816 1069 || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE_V6 == Opcode)
dflet 0:50cedd586816 1070 #endif
dflet 0:50cedd586816 1071 )
dflet 0:50cedd586816 1072 {
dflet 0:50cedd586816 1073 RxMsgClass = RECV_RESP_CLASS;
dflet 0:50cedd586816 1074 }
dflet 0:50cedd586816 1075 else
dflet 0:50cedd586816 1076 {
dflet 0:50cedd586816 1077 /* This is Async Event class message */
dflet 0:50cedd586816 1078 RxMsgClass = ASYNC_EVT_CLASS;
dflet 0:50cedd586816 1079
dflet 0:50cedd586816 1080 /* Despite the fact that 4 bits are allocated in the SILO field, we actually have only 6 SILOs
dflet 0:50cedd586816 1081 So we can use the 8 options of SILO in look up table */
dflet 0:50cedd586816 1082 Silo = ((Opcode >> SL_OPCODE_SILO_OFFSET) & 0x7);
dflet 0:50cedd586816 1083
dflet 0:50cedd586816 1084 VERIFY_PROTOCOL(Silo < (sizeof(RxMsgClassLUT)/sizeof(_SlSpawnEntryFunc_t)));
dflet 0:50cedd586816 1085
dflet 0:50cedd586816 1086 /* Set the async event hander according to the LUT */
dflet 0:50cedd586816 1087 AsyncEvtHandler = RxMsgClassLUT[Silo];
dflet 0:50cedd586816 1088
dflet 0:50cedd586816 1089 if ((SL_OPCODE_NETAPP_HTTPGETTOKENVALUE == Opcode) || (SL_OPCODE_NETAPP_HTTPPOSTTOKENVALUE == Opcode))
dflet 0:50cedd586816 1090 {
dflet 0:50cedd586816 1091 AsyncEvtHandler = _SlDrvNetAppEventHandler;
dflet 0:50cedd586816 1092 }
dflet 0:50cedd586816 1093 #ifndef SL_TINY_EXT
dflet 0:50cedd586816 1094 else if (SL_OPCODE_NETAPP_PINGREPORTREQUESTRESPONSE == Opcode)
dflet 0:50cedd586816 1095 {
dflet 0:50cedd586816 1096 AsyncEvtHandler = (_SlSpawnEntryFunc_t)_sl_HandleAsync_PingResponse;
dflet 0:50cedd586816 1097 }
dflet 0:50cedd586816 1098 #endif
dflet 0:50cedd586816 1099 }
dflet 0:50cedd586816 1100 }
dflet 0:50cedd586816 1101
dflet 0:50cedd586816 1102 g_pCB->FunctionParams.AsyncExt.RxMsgClass = RxMsgClass;
dflet 0:50cedd586816 1103 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = AsyncEvtHandler;
dflet 0:50cedd586816 1104
dflet 0:50cedd586816 1105 }
dflet 0:50cedd586816 1106
dflet 0:50cedd586816 1107 /* ******************************************************************************/
dflet 0:50cedd586816 1108 /* _SlDrvRxHdrRead */
dflet 0:50cedd586816 1109 /* ******************************************************************************/
dflet 0:50cedd586816 1110 _SlReturnVal_t cc3100_driver::_SlDrvRxHdrRead(uint8_t *pBuf, uint8_t *pAlignSize)
dflet 0:50cedd586816 1111 {
dflet 0:50cedd586816 1112 uint32_t SyncCnt = 0;
dflet 16:7e5aab2fabba 1113 uint8_t ShiftIdx;
dflet 0:50cedd586816 1114
dflet 0:50cedd586816 1115 #ifndef SL_IF_TYPE_UART
dflet 0:50cedd586816 1116 /* 1. Write CNYS pattern to NWP when working in SPI mode only */
dflet 19:3dd3e7f30f8b 1117 NWP_IF_WRITE_CHECK(g_pCB->FD, (uint8_t *)&g_H2NCnysPattern.Short, SYNC_PATTERN_LEN);
dflet 0:50cedd586816 1118 #endif
dflet 16:7e5aab2fabba 1119
dflet 0:50cedd586816 1120 /* 2. Read 4 bytes (protocol aligned) */
dflet 19:3dd3e7f30f8b 1121 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[0], 4);
dflet 0:50cedd586816 1122 _SL_DBG_SYNC_LOG(SyncCnt,pBuf);
dflet 16:7e5aab2fabba 1123
dflet 0:50cedd586816 1124 /* Wait for SYNC_PATTERN_LEN from the device */
dflet 0:50cedd586816 1125 while ( ! N2H_SYNC_PATTERN_MATCH(pBuf, g_pCB->TxSeqNum) ) {
dflet 0:50cedd586816 1126 /* 3. Debug limit of scan */
dflet 16:7e5aab2fabba 1127 if(SyncCnt >= SL_SYNC_SCAN_THRESHOLD){
dflet 16:7e5aab2fabba 1128 printf("SPI Sync pattern match fault\n\r");
dflet 16:7e5aab2fabba 1129 }
dflet 0:50cedd586816 1130 VERIFY_PROTOCOL(SyncCnt < SL_SYNC_SCAN_THRESHOLD);
dflet 0:50cedd586816 1131
dflet 0:50cedd586816 1132 /* 4. Read next 4 bytes to Low 4 bytes of buffer */
dflet 0:50cedd586816 1133 if(0 == (SyncCnt % (uint32_t)SYNC_PATTERN_LEN)) {
dflet 19:3dd3e7f30f8b 1134 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[4], 4);
dflet 0:50cedd586816 1135 _SL_DBG_SYNC_LOG(SyncCnt,pBuf);
dflet 0:50cedd586816 1136 }
dflet 0:50cedd586816 1137
dflet 0:50cedd586816 1138 /* 5. Shift Buffer Up for checking if the sync is shifted */
dflet 0:50cedd586816 1139 for(ShiftIdx = 0; ShiftIdx< 7; ShiftIdx++)
dflet 0:50cedd586816 1140 {
dflet 0:50cedd586816 1141 pBuf[ShiftIdx] = pBuf[ShiftIdx+1];
dflet 0:50cedd586816 1142 }
dflet 0:50cedd586816 1143 pBuf[7] = 0;
dflet 0:50cedd586816 1144
dflet 0:50cedd586816 1145 SyncCnt++;
dflet 0:50cedd586816 1146 }
dflet 0:50cedd586816 1147
dflet 0:50cedd586816 1148 /* 5. Sync pattern found. If needed, complete number of read bytes to multiple of 4 (protocol align) */
dflet 0:50cedd586816 1149 SyncCnt %= SYNC_PATTERN_LEN;
dflet 0:50cedd586816 1150
dflet 0:50cedd586816 1151 if(SyncCnt > 0) {
dflet 0:50cedd586816 1152 *(uint32_t *)&pBuf[0] = *(uint32_t *)&pBuf[4];
dflet 19:3dd3e7f30f8b 1153 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[SYNC_PATTERN_LEN - SyncCnt], (uint16_t)SyncCnt);
dflet 0:50cedd586816 1154 } else {
dflet 19:3dd3e7f30f8b 1155 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[0], 4);
dflet 0:50cedd586816 1156 }
dflet 0:50cedd586816 1157
dflet 0:50cedd586816 1158 /* 6. Scan for Double pattern. */
dflet 0:50cedd586816 1159 while ( N2H_SYNC_PATTERN_MATCH(pBuf, g_pCB->TxSeqNum) ) {
dflet 0:50cedd586816 1160 _SL_DBG_CNT_INC(Work.DoubleSyncPattern);
dflet 19:3dd3e7f30f8b 1161 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[0], SYNC_PATTERN_LEN);
dflet 0:50cedd586816 1162 }
dflet 0:50cedd586816 1163 g_pCB->TxSeqNum++;
dflet 0:50cedd586816 1164
dflet 0:50cedd586816 1165 /* 7. Here we've read Generic Header (4 bytes). Read the Resp Specific header (4 more bytes). */
dflet 19:3dd3e7f30f8b 1166 NWP_IF_READ_CHECK(g_pCB->FD, &pBuf[SYNC_PATTERN_LEN], _SL_RESP_SPEC_HDR_SIZE);
dflet 0:50cedd586816 1167
dflet 0:50cedd586816 1168 /* 8. Here we've read the entire Resp Header. */
dflet 0:50cedd586816 1169 /* Return number bytes needed to be sent after read for NWP Rx 4-byte alignment (protocol alignment) */
dflet 0:50cedd586816 1170 *pAlignSize = (uint8_t)((SyncCnt > 0) ? (SYNC_PATTERN_LEN - SyncCnt) : 0);
dflet 0:50cedd586816 1171
dflet 0:50cedd586816 1172 return SL_RET_CODE_OK;
dflet 0:50cedd586816 1173 }
dflet 0:50cedd586816 1174
dflet 0:50cedd586816 1175 /* ***************************************************************************** */
dflet 0:50cedd586816 1176 /* _SlDrvBasicCmd */
dflet 0:50cedd586816 1177 /* ***************************************************************************** */
dflet 0:50cedd586816 1178 typedef union {
dflet 0:50cedd586816 1179 _BasicResponse_t Rsp;
dflet 0:50cedd586816 1180 } _SlBasicCmdMsg_u;
dflet 0:50cedd586816 1181
dflet 0:50cedd586816 1182 #ifndef SL_TINY_EXT
dflet 0:50cedd586816 1183 int16_t cc3100_driver::_SlDrvBasicCmd(_SlOpcode_t Opcode)
dflet 0:50cedd586816 1184 {
dflet 0:50cedd586816 1185 _SlBasicCmdMsg_u Msg = {0};
dflet 0:50cedd586816 1186 _SlCmdCtrl_t CmdCtrl;
dflet 0:50cedd586816 1187
dflet 0:50cedd586816 1188 CmdCtrl.Opcode = Opcode;
dflet 0:50cedd586816 1189 CmdCtrl.TxDescLen = 0;
dflet 0:50cedd586816 1190 CmdCtrl.RxDescLen = sizeof(_BasicResponse_t);
dflet 0:50cedd586816 1191
dflet 0:50cedd586816 1192
dflet 0:50cedd586816 1193 VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&CmdCtrl, &Msg, NULL));
dflet 0:50cedd586816 1194
dflet 0:50cedd586816 1195 return (int16_t)Msg.Rsp.status;
dflet 0:50cedd586816 1196 }
dflet 0:50cedd586816 1197
dflet 0:50cedd586816 1198 /*****************************************************************************
dflet 0:50cedd586816 1199 _SlDrvCmdSend
dflet 0:50cedd586816 1200 Send SL command without waiting for command response
dflet 0:50cedd586816 1201 This function is unprotected and the caller should make
dflet 0:50cedd586816 1202 sure global lock is active
dflet 0:50cedd586816 1203 *****************************************************************************/
dflet 0:50cedd586816 1204 _SlReturnVal_t cc3100_driver::_SlDrvCmdSend(_SlCmdCtrl_t *pCmdCtrl, void *pTxRxDescBuff, _SlCmdExt_t *pCmdExt)
dflet 0:50cedd586816 1205 {
dflet 0:50cedd586816 1206 _SlReturnVal_t RetVal;
dflet 0:50cedd586816 1207 uint8_t IsCmdRespWaitedOriginalVal;
dflet 0:50cedd586816 1208
dflet 0:50cedd586816 1209 _SlFunctionParams_t originalFuncParms;
dflet 0:50cedd586816 1210
dflet 0:50cedd586816 1211 /* save the current RespWait flag before clearing it */
dflet 0:50cedd586816 1212 IsCmdRespWaitedOriginalVal = g_pCB->IsCmdRespWaited;
dflet 0:50cedd586816 1213
dflet 0:50cedd586816 1214 /* save the current command parameters */
dflet 0:50cedd586816 1215 memcpy(&originalFuncParms, &g_pCB->FunctionParams, sizeof(_SlFunctionParams_t));
dflet 0:50cedd586816 1216
dflet 0:50cedd586816 1217 g_pCB->IsCmdRespWaited = FALSE;
dflet 0:50cedd586816 1218
dflet 0:50cedd586816 1219 SL_TRACE0(DBG_MSG, MSG_312, "_SlDrvCmdSend: call _SlDrvMsgWrite");
dflet 0:50cedd586816 1220
dflet 0:50cedd586816 1221 /* send the message */
dflet 0:50cedd586816 1222 RetVal = _SlDrvMsgWrite(pCmdCtrl, pCmdExt, (uint8_t*)pTxRxDescBuff);
dflet 0:50cedd586816 1223
dflet 0:50cedd586816 1224 /* restore the original RespWait flag */
dflet 0:50cedd586816 1225 g_pCB->IsCmdRespWaited = IsCmdRespWaitedOriginalVal;
dflet 0:50cedd586816 1226
dflet 0:50cedd586816 1227 /* restore the original command parameters */
dflet 0:50cedd586816 1228 memcpy(&g_pCB->FunctionParams, &originalFuncParms, sizeof(_SlFunctionParams_t));
dflet 0:50cedd586816 1229
dflet 0:50cedd586816 1230 return RetVal;
dflet 0:50cedd586816 1231
dflet 0:50cedd586816 1232
dflet 0:50cedd586816 1233 }
dflet 0:50cedd586816 1234 #endif
dflet 0:50cedd586816 1235
dflet 0:50cedd586816 1236 /* ***************************************************************************** */
dflet 0:50cedd586816 1237 /* _SlDrvWaitForPoolObj */
dflet 0:50cedd586816 1238 /* ***************************************************************************** */
dflet 0:50cedd586816 1239 uint8_t cc3100_driver::_SlDrvWaitForPoolObj(uint8_t ActionID, uint8_t SocketID)
dflet 0:50cedd586816 1240 {
dflet 0:50cedd586816 1241 uint8_t CurrObjIndex = MAX_CONCURRENT_ACTIONS;
dflet 0:50cedd586816 1242
dflet 0:50cedd586816 1243 /* Get free object */
dflet 0:50cedd586816 1244 _SlDrvProtectionObjLockWaitForever();
dflet 0:50cedd586816 1245 if (MAX_CONCURRENT_ACTIONS > g_pCB->FreePoolIdx) {
dflet 0:50cedd586816 1246 /* save the current obj index */
dflet 0:50cedd586816 1247 CurrObjIndex = g_pCB->FreePoolIdx;
dflet 0:50cedd586816 1248 /* set the new free index */
dflet 0:50cedd586816 1249 #ifndef SL_TINY_EXT
dflet 0:50cedd586816 1250 if (MAX_CONCURRENT_ACTIONS > g_pCB->ObjPool[CurrObjIndex].NextIndex) {
dflet 0:50cedd586816 1251 g_pCB->FreePoolIdx = g_pCB->ObjPool[CurrObjIndex].NextIndex;
dflet 0:50cedd586816 1252 }
dflet 0:50cedd586816 1253 else
dflet 0:50cedd586816 1254 #endif
dflet 0:50cedd586816 1255 {
dflet 0:50cedd586816 1256 /* No further free actions available */
dflet 0:50cedd586816 1257 g_pCB->FreePoolIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:50cedd586816 1258 }
dflet 0:50cedd586816 1259 } else {
dflet 0:50cedd586816 1260 _SlDrvProtectionObjUnLock();
dflet 0:50cedd586816 1261 return CurrObjIndex;
dflet 0:50cedd586816 1262 }
dflet 0:50cedd586816 1263 g_pCB->ObjPool[CurrObjIndex].ActionID = (uint8_t)ActionID;
dflet 0:50cedd586816 1264 if (SL_MAX_SOCKETS > SocketID) {
dflet 0:50cedd586816 1265 g_pCB->ObjPool[CurrObjIndex].AdditionalData = SocketID;
dflet 0:50cedd586816 1266 }
dflet 0:50cedd586816 1267 #ifndef SL_TINY_EXT
dflet 0:50cedd586816 1268 /*In case this action is socket related, SocketID bit will be on
dflet 0:50cedd586816 1269 In case SocketID is set to SL_MAX_SOCKETS, the socket is not relevant to the action. In that case ActionID bit will be on */
dflet 0:50cedd586816 1270 while ( ( (SL_MAX_SOCKETS > SocketID) && (g_pCB->ActiveActionsBitmap & (1<<SocketID)) ) ||
dflet 0:50cedd586816 1271 ( (g_pCB->ActiveActionsBitmap & (1<<ActionID)) && (SL_MAX_SOCKETS == SocketID) ) )
dflet 0:50cedd586816 1272 {
dflet 0:50cedd586816 1273 /* action in progress - move to pending list */
dflet 0:50cedd586816 1274 g_pCB->ObjPool[CurrObjIndex].NextIndex = g_pCB->PendingPoolIdx;
dflet 0:50cedd586816 1275 g_pCB->PendingPoolIdx = CurrObjIndex;
dflet 0:50cedd586816 1276 _SlDrvProtectionObjUnLock();
dflet 0:50cedd586816 1277
dflet 0:50cedd586816 1278 /* wait for action to be free */
dflet 0:50cedd586816 1279 _SlDrvSyncObjWaitForever(&g_pCB->ObjPool[CurrObjIndex].SyncObj);
dflet 0:50cedd586816 1280
dflet 0:50cedd586816 1281 /* set params and move to active (remove from pending list at _SlDrvReleasePoolObj) */
dflet 0:50cedd586816 1282 _SlDrvProtectionObjLockWaitForever();
dflet 0:50cedd586816 1283 }
dflet 0:50cedd586816 1284 #endif
dflet 0:50cedd586816 1285 /* mark as active. Set socket as active if action is on socket, otherwise mark action as active */
dflet 0:50cedd586816 1286 if (SL_MAX_SOCKETS > SocketID) {
dflet 0:50cedd586816 1287 g_pCB->ActiveActionsBitmap |= (1<<SocketID);
dflet 0:50cedd586816 1288 } else {
dflet 0:50cedd586816 1289 g_pCB->ActiveActionsBitmap |= (1<<ActionID);
dflet 0:50cedd586816 1290 }
dflet 0:50cedd586816 1291 /* move to active list */
dflet 0:50cedd586816 1292 g_pCB->ObjPool[CurrObjIndex].NextIndex = g_pCB->ActivePoolIdx;
dflet 0:50cedd586816 1293 g_pCB->ActivePoolIdx = CurrObjIndex;
dflet 0:50cedd586816 1294 /* unlock */
dflet 0:50cedd586816 1295 _SlDrvProtectionObjUnLock();
dflet 0:50cedd586816 1296 return CurrObjIndex;
dflet 0:50cedd586816 1297 }
dflet 0:50cedd586816 1298
dflet 0:50cedd586816 1299 /* ******************************************************************************/
dflet 0:50cedd586816 1300 /* _SlDrvReleasePoolObj */
dflet 0:50cedd586816 1301 /* ******************************************************************************/
dflet 0:50cedd586816 1302 void cc3100_driver::_SlDrvReleasePoolObj(uint8_t ObjIdx)
dflet 0:50cedd586816 1303 {
dflet 0:50cedd586816 1304 #ifndef SL_TINY_EXT
dflet 0:50cedd586816 1305 uint8_t PendingIndex;
dflet 0:50cedd586816 1306 #endif
dflet 0:50cedd586816 1307
dflet 0:50cedd586816 1308 _SlDrvProtectionObjLockWaitForever();
dflet 0:50cedd586816 1309
dflet 0:50cedd586816 1310 /* In Tiny mode, there is only one object pool so no pending actions are available */
dflet 0:50cedd586816 1311 #ifndef SL_TINY_EXT
dflet 0:50cedd586816 1312 /* go over the pending list and release other pending action if needed */
dflet 0:50cedd586816 1313 PendingIndex = g_pCB->PendingPoolIdx;
dflet 0:50cedd586816 1314
dflet 0:50cedd586816 1315 while(MAX_CONCURRENT_ACTIONS > PendingIndex)
dflet 0:50cedd586816 1316 {
dflet 0:50cedd586816 1317 /* In case this action is socket related, SocketID is in use, otherwise will be set to SL_MAX_SOCKETS */
dflet 0:50cedd586816 1318 if ( (g_pCB->ObjPool[PendingIndex].ActionID == g_pCB->ObjPool[ObjIdx].ActionID) &&
dflet 0:50cedd586816 1319 ( (SL_MAX_SOCKETS == (g_pCB->ObjPool[PendingIndex].AdditionalData & BSD_SOCKET_ID_MASK)) ||
dflet 0:50cedd586816 1320 ((SL_MAX_SOCKETS > (g_pCB->ObjPool[ObjIdx].AdditionalData & BSD_SOCKET_ID_MASK)) && ( (g_pCB->ObjPool[PendingIndex].AdditionalData & BSD_SOCKET_ID_MASK) == (g_pCB->ObjPool[ObjIdx].AdditionalData & BSD_SOCKET_ID_MASK) ))) )
dflet 0:50cedd586816 1321 {
dflet 0:50cedd586816 1322 /* remove from pending list */
dflet 0:50cedd586816 1323 _SlRemoveFromList(&g_pCB->PendingPoolIdx, PendingIndex);
dflet 0:50cedd586816 1324 _SlDrvSyncObjSignal(&g_pCB->ObjPool[PendingIndex].SyncObj);
dflet 0:50cedd586816 1325 break;
dflet 0:50cedd586816 1326 }
dflet 0:50cedd586816 1327 PendingIndex = g_pCB->ObjPool[PendingIndex].NextIndex;
dflet 0:50cedd586816 1328 }
dflet 0:50cedd586816 1329 #endif
dflet 0:50cedd586816 1330
dflet 0:50cedd586816 1331 if (SL_MAX_SOCKETS > (g_pCB->ObjPool[ObjIdx].AdditionalData & BSD_SOCKET_ID_MASK))
dflet 0:50cedd586816 1332 {
dflet 0:50cedd586816 1333 /* unset socketID */
dflet 0:50cedd586816 1334 g_pCB->ActiveActionsBitmap &= ~(1<<(g_pCB->ObjPool[ObjIdx].AdditionalData & BSD_SOCKET_ID_MASK));
dflet 0:50cedd586816 1335 }
dflet 0:50cedd586816 1336 else
dflet 0:50cedd586816 1337 {
dflet 0:50cedd586816 1338 /* unset actionID */
dflet 0:50cedd586816 1339 g_pCB->ActiveActionsBitmap &= ~(1<<g_pCB->ObjPool[ObjIdx].ActionID);
dflet 0:50cedd586816 1340 }
dflet 0:50cedd586816 1341
dflet 0:50cedd586816 1342 /* delete old data */
dflet 0:50cedd586816 1343 g_pCB->ObjPool[ObjIdx].pRespArgs = NULL;
dflet 0:50cedd586816 1344 g_pCB->ObjPool[ObjIdx].ActionID = 0;
dflet 0:50cedd586816 1345 g_pCB->ObjPool[ObjIdx].AdditionalData = SL_MAX_SOCKETS;
dflet 0:50cedd586816 1346
dflet 0:50cedd586816 1347 /* remove from active list */
dflet 0:50cedd586816 1348 _SlRemoveFromList(&g_pCB->ActivePoolIdx, ObjIdx);
dflet 0:50cedd586816 1349 /* move to free list */
dflet 0:50cedd586816 1350 g_pCB->ObjPool[ObjIdx].NextIndex = g_pCB->FreePoolIdx;
dflet 0:50cedd586816 1351 g_pCB->FreePoolIdx = ObjIdx;
dflet 0:50cedd586816 1352
dflet 0:50cedd586816 1353 _SlDrvProtectionObjUnLock();
dflet 0:50cedd586816 1354 }
dflet 0:50cedd586816 1355
dflet 0:50cedd586816 1356 /* ******************************************************************************/
dflet 0:50cedd586816 1357 /* _SlRemoveFromList */
dflet 0:50cedd586816 1358 /* ******************************************************************************/
dflet 0:50cedd586816 1359 void cc3100_driver::_SlRemoveFromList(uint8_t *ListIndex, uint8_t ItemIndex)
dflet 0:50cedd586816 1360 {
dflet 0:50cedd586816 1361 #ifndef SL_TINY_EXT
dflet 0:50cedd586816 1362 uint8_t Idx;
dflet 0:50cedd586816 1363 #endif
dflet 0:50cedd586816 1364
dflet 0:50cedd586816 1365 if (MAX_CONCURRENT_ACTIONS == g_pCB->ObjPool[*ListIndex].NextIndex)
dflet 0:50cedd586816 1366 {
dflet 0:50cedd586816 1367 *ListIndex = MAX_CONCURRENT_ACTIONS;
dflet 0:50cedd586816 1368 }
dflet 0:50cedd586816 1369 /* As MAX_CONCURRENT_ACTIONS is equal to 1 in Tiny mode */
dflet 0:50cedd586816 1370 #ifndef SL_TINY_EXT
dflet 0:50cedd586816 1371 /* need to remove the first item in the list and therefore update the global which holds this index */
dflet 0:50cedd586816 1372 else if (*ListIndex == ItemIndex)
dflet 0:50cedd586816 1373 {
dflet 0:50cedd586816 1374 *ListIndex = g_pCB->ObjPool[ItemIndex].NextIndex;
dflet 0:50cedd586816 1375 }
dflet 0:50cedd586816 1376 else
dflet 0:50cedd586816 1377 {
dflet 0:50cedd586816 1378 Idx = *ListIndex;
dflet 0:50cedd586816 1379
dflet 0:50cedd586816 1380 while(MAX_CONCURRENT_ACTIONS > Idx)
dflet 0:50cedd586816 1381 {
dflet 0:50cedd586816 1382 /* remove from list */
dflet 0:50cedd586816 1383 if (g_pCB->ObjPool[Idx].NextIndex == ItemIndex)
dflet 0:50cedd586816 1384 {
dflet 0:50cedd586816 1385 g_pCB->ObjPool[Idx].NextIndex = g_pCB->ObjPool[ItemIndex].NextIndex;
dflet 0:50cedd586816 1386 break;
dflet 0:50cedd586816 1387 }
dflet 0:50cedd586816 1388
dflet 0:50cedd586816 1389 Idx = g_pCB->ObjPool[Idx].NextIndex;
dflet 0:50cedd586816 1390 }
dflet 0:50cedd586816 1391 }
dflet 0:50cedd586816 1392 #endif
dflet 0:50cedd586816 1393 }
dflet 0:50cedd586816 1394
dflet 0:50cedd586816 1395 /* ******************************************************************************/
dflet 0:50cedd586816 1396 /* _SlFindAndSetActiveObj */
dflet 0:50cedd586816 1397 /* ******************************************************************************/
dflet 0:50cedd586816 1398 _SlReturnVal_t cc3100_driver::_SlFindAndSetActiveObj(_SlOpcode_t Opcode, uint8_t Sd)
dflet 0:50cedd586816 1399 {
dflet 0:50cedd586816 1400 uint8_t ActiveIndex;
dflet 0:50cedd586816 1401
dflet 0:50cedd586816 1402 ActiveIndex = g_pCB->ActivePoolIdx;
dflet 0:50cedd586816 1403 /* go over the active list if exist to find obj waiting for this Async event */
dflet 0:50cedd586816 1404 #ifndef SL_TINY_EXT
dflet 0:50cedd586816 1405 while (MAX_CONCURRENT_ACTIONS > ActiveIndex){
dflet 0:50cedd586816 1406 #else
dflet 0:50cedd586816 1407 /* Only one Active action is availabe in tiny mode, so we can replace the loop with if condition */
dflet 0:50cedd586816 1408 if (MAX_CONCURRENT_ACTIONS > ActiveIndex)
dflet 0:50cedd586816 1409 #endif
dflet 0:50cedd586816 1410 /* unset the Ipv4\IPv6 bit in the opcode if family bit was set */
dflet 0:50cedd586816 1411 if (g_pCB->ObjPool[ActiveIndex].AdditionalData & SL_NETAPP_FAMILY_MASK) {
dflet 0:50cedd586816 1412 Opcode &= ~SL_OPCODE_IPV6;
dflet 0:50cedd586816 1413 }
dflet 0:50cedd586816 1414
dflet 0:50cedd586816 1415 if ((g_pCB->ObjPool[ActiveIndex].ActionID == RECV_ID) && (Sd == g_pCB->ObjPool[ActiveIndex].AdditionalData) &&
dflet 0:50cedd586816 1416 ( (SL_OPCODE_SOCKET_RECVASYNCRESPONSE == Opcode) || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE == Opcode)
dflet 0:50cedd586816 1417 #ifndef SL_TINY_EXT
dflet 0:50cedd586816 1418 || (SL_OPCODE_SOCKET_RECVFROMASYNCRESPONSE_V6 == Opcode)
dflet 0:50cedd586816 1419 #endif
dflet 0:50cedd586816 1420 )
dflet 0:50cedd586816 1421
dflet 0:50cedd586816 1422 )
dflet 0:50cedd586816 1423 {
dflet 0:50cedd586816 1424 g_pCB->FunctionParams.AsyncExt.ActionIndex = ActiveIndex;
dflet 0:50cedd586816 1425 return SL_RET_CODE_OK;
dflet 0:50cedd586816 1426 }
dflet 0:50cedd586816 1427 /* In case this action is socket related, SocketID is in use, otherwise will be set to SL_MAX_SOCKETS */
dflet 0:50cedd586816 1428 if ( (_SlActionLookupTable[ g_pCB->ObjPool[ActiveIndex].ActionID - MAX_SOCKET_ENUM_IDX].ActionAsyncOpcode == Opcode) &&
dflet 0:50cedd586816 1429 ( ((Sd == (g_pCB->ObjPool[ActiveIndex].AdditionalData & BSD_SOCKET_ID_MASK) ) && (SL_MAX_SOCKETS > Sd)) || (SL_MAX_SOCKETS == (g_pCB->ObjPool[ActiveIndex].AdditionalData & BSD_SOCKET_ID_MASK)) ) ) {
dflet 0:50cedd586816 1430 /* set handler */
dflet 0:50cedd586816 1431 g_pCB->FunctionParams.AsyncExt.AsyncEvtHandler = _SlActionLookupTable[ g_pCB->ObjPool[ActiveIndex].ActionID - MAX_SOCKET_ENUM_IDX].AsyncEventHandler;
dflet 0:50cedd586816 1432 g_pCB->FunctionParams.AsyncExt.ActionIndex = ActiveIndex;
dflet 0:50cedd586816 1433 return SL_RET_CODE_OK;
dflet 0:50cedd586816 1434 }
dflet 0:50cedd586816 1435 ActiveIndex = g_pCB->ObjPool[ActiveIndex].NextIndex;
dflet 0:50cedd586816 1436 }
dflet 0:50cedd586816 1437
dflet 0:50cedd586816 1438 return SL_RET_CODE_SELF_ERROR;
dflet 0:50cedd586816 1439
dflet 0:50cedd586816 1440 }
dflet 0:50cedd586816 1441
dflet 0:50cedd586816 1442 /* Wrappers for the object functions */
dflet 0:50cedd586816 1443
dflet 0:50cedd586816 1444 void cc3100_driver::_SlDrvSyncObjWaitForever(_SlSyncObj_t *pSyncObj)
dflet 0:50cedd586816 1445 {
dflet 19:3dd3e7f30f8b 1446 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 1447 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 1448 OSI_RET_OK_CHECK(_nonos.sl_SyncObjWait(pSyncObj, SL_OS_WAIT_FOREVER));
dflet 0:50cedd586816 1449 #else
dflet 0:50cedd586816 1450 OSI_RET_OK_CHECK(sl_SyncObjWait(pSyncObj, SL_OS_WAIT_FOREVER));
dflet 0:50cedd586816 1451 #endif
dflet 0:50cedd586816 1452 }
dflet 0:50cedd586816 1453
dflet 0:50cedd586816 1454 void cc3100_driver::_SlDrvSyncObjSignal(_SlSyncObj_t *pSyncObj)
dflet 0:50cedd586816 1455 {
dflet 19:3dd3e7f30f8b 1456 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 1457 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 1458 OSI_RET_OK_CHECK(_nonos.sl_SyncObjSignal(pSyncObj));
dflet 0:50cedd586816 1459 #else
dflet 0:50cedd586816 1460 OSI_RET_OK_CHECK(sl_SyncObjSignal(pSyncObj));
dflet 0:50cedd586816 1461 #endif
dflet 0:50cedd586816 1462 }
dflet 0:50cedd586816 1463
dflet 0:50cedd586816 1464 void cc3100_driver::_SlDrvObjLockWaitForever(_SlLockObj_t *pLockObj)
dflet 0:50cedd586816 1465 {
dflet 19:3dd3e7f30f8b 1466 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 1467 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 1468 OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(pLockObj, SL_OS_WAIT_FOREVER));
dflet 0:50cedd586816 1469 #else
dflet 0:50cedd586816 1470 OSI_RET_OK_CHECK(sl_LockObjLock(pLockObj, SL_OS_WAIT_FOREVER));
dflet 0:50cedd586816 1471 #endif
dflet 0:50cedd586816 1472 }
dflet 0:50cedd586816 1473
dflet 0:50cedd586816 1474 void cc3100_driver::_SlDrvProtectionObjLockWaitForever()
dflet 0:50cedd586816 1475 {
dflet 19:3dd3e7f30f8b 1476 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 1477 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 1478 OSI_RET_OK_CHECK(_nonos.sl_LockObjLock(&g_pCB->ProtectionLockObj, SL_OS_WAIT_FOREVER));
dflet 0:50cedd586816 1479 #else
dflet 0:50cedd586816 1480 OSI_RET_OK_CHECK(sl_LockObjLock(&g_pCB->ProtectionLockObj, SL_OS_WAIT_FOREVER));
dflet 0:50cedd586816 1481 #endif
dflet 0:50cedd586816 1482 }
dflet 0:50cedd586816 1483
dflet 0:50cedd586816 1484 void cc3100_driver::_SlDrvObjUnLock(_SlLockObj_t *pLockObj)
dflet 0:50cedd586816 1485 {
dflet 19:3dd3e7f30f8b 1486 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 1487 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 1488 OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(pLockObj));
dflet 0:50cedd586816 1489 #else
dflet 0:50cedd586816 1490 OSI_RET_OK_CHECK(sl_LockObjUnlock(pLockObj));
dflet 0:50cedd586816 1491 #endif
dflet 0:50cedd586816 1492 }
dflet 0:50cedd586816 1493
dflet 0:50cedd586816 1494 void cc3100_driver::_SlDrvProtectionObjUnLock()
dflet 0:50cedd586816 1495 {
dflet 19:3dd3e7f30f8b 1496 //#ifndef SL_PLATFORM_MULTI_THREADED
dflet 19:3dd3e7f30f8b 1497 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
dflet 0:50cedd586816 1498 OSI_RET_OK_CHECK(_nonos.sl_LockObjUnlock(&g_pCB->ProtectionLockObj));
dflet 0:50cedd586816 1499 #else
dflet 0:50cedd586816 1500 OSI_RET_OK_CHECK(sl_LockObjUnlock(&g_pCB->ProtectionLockObj));
dflet 0:50cedd586816 1501 #endif
dflet 0:50cedd586816 1502 }
dflet 0:50cedd586816 1503
dflet 0:50cedd586816 1504
dflet 0:50cedd586816 1505 void cc3100_driver::_SlDrvMemZero(void* Addr, uint16_t size)
dflet 0:50cedd586816 1506 {
dflet 0:50cedd586816 1507 memset(Addr, 0, size);
dflet 0:50cedd586816 1508 }
dflet 0:50cedd586816 1509
dflet 0:50cedd586816 1510
dflet 0:50cedd586816 1511 void cc3100_driver::_SlDrvResetCmdExt(_SlCmdExt_t* pCmdExt)
dflet 0:50cedd586816 1512 {
dflet 0:50cedd586816 1513 _SlDrvMemZero(pCmdExt, sizeof (_SlCmdExt_t));
dflet 0:50cedd586816 1514 }
dflet 0:50cedd586816 1515
dflet 0:50cedd586816 1516 }//namespace mbed_cc3100
dflet 0:50cedd586816 1517
dflet 0:50cedd586816 1518