TI's CC3100. A test demo with very little testing done!

Dependencies:   mbed

Fork of cc3100_Test_Demo2 by 高 杨

Committer:
dflet
Date:
Sun Feb 15 11:01:37 2015 +0000
Revision:
2:b3fd5b3d9860
Parent:
0:e89ba455dbcf
Removed more debug comments, defined sl_Free & sl_Malloc. Also remove some duplicate #defines

Who changed what in which revision?

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