TI's CC3100 host driver and demo. Experimental and a work in progress.

Dependencies:   mbed

Committer:
dflet
Date:
Wed Nov 19 23:04:04 2014 +0000
Revision:
2:a3e52cf86086
Parent:
0:bbe98578d4c0
Added more boards!

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:bbe98578d4c0 1 /*
dflet 0:bbe98578d4c0 2 * device.c - CC31xx/CC32xx Host Driver Implementation
dflet 0:bbe98578d4c0 3 *
dflet 0:bbe98578d4c0 4 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
dflet 0:bbe98578d4c0 5 *
dflet 0:bbe98578d4c0 6 *
dflet 0:bbe98578d4c0 7 * Redistribution and use in source and binary forms, with or without
dflet 0:bbe98578d4c0 8 * modification, are permitted provided that the following conditions
dflet 0:bbe98578d4c0 9 * are met:
dflet 0:bbe98578d4c0 10 *
dflet 0:bbe98578d4c0 11 * Redistributions of source code must retain the above copyright
dflet 0:bbe98578d4c0 12 * notice, this list of conditions and the following disclaimer.
dflet 0:bbe98578d4c0 13 *
dflet 0:bbe98578d4c0 14 * Redistributions in binary form must reproduce the above copyright
dflet 0:bbe98578d4c0 15 * notice, this list of conditions and the following disclaimer in the
dflet 0:bbe98578d4c0 16 * documentation and/or other materials provided with the
dflet 0:bbe98578d4c0 17 * distribution.
dflet 0:bbe98578d4c0 18 *
dflet 0:bbe98578d4c0 19 * Neither the name of Texas Instruments Incorporated nor the names of
dflet 0:bbe98578d4c0 20 * its contributors may be used to endorse or promote products derived
dflet 0:bbe98578d4c0 21 * from this software without specific prior written permission.
dflet 0:bbe98578d4c0 22 *
dflet 0:bbe98578d4c0 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
dflet 0:bbe98578d4c0 24 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
dflet 0:bbe98578d4c0 25 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
dflet 0:bbe98578d4c0 26 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
dflet 0:bbe98578d4c0 27 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
dflet 0:bbe98578d4c0 28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
dflet 0:bbe98578d4c0 29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
dflet 0:bbe98578d4c0 30 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
dflet 0:bbe98578d4c0 31 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
dflet 0:bbe98578d4c0 32 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
dflet 0:bbe98578d4c0 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
dflet 0:bbe98578d4c0 34 *
dflet 0:bbe98578d4c0 35 */
dflet 0:bbe98578d4c0 36
dflet 0:bbe98578d4c0 37
dflet 0:bbe98578d4c0 38
dflet 0:bbe98578d4c0 39 /*****************************************************************************/
dflet 0:bbe98578d4c0 40 /* Include files */
dflet 0:bbe98578d4c0 41 /*****************************************************************************/
dflet 0:bbe98578d4c0 42 #include "cc3100_simplelink.h"
dflet 0:bbe98578d4c0 43 #include "cc3100_protocol.h"
dflet 0:bbe98578d4c0 44 #include "cc3100_flowcont.h"
dflet 0:bbe98578d4c0 45 #include "cc3100_driver.h"
dflet 0:bbe98578d4c0 46
dflet 0:bbe98578d4c0 47
dflet 0:bbe98578d4c0 48 /*****************************************************************************/
dflet 0:bbe98578d4c0 49 /* Internal functions */
dflet 0:bbe98578d4c0 50 /*****************************************************************************/
dflet 0:bbe98578d4c0 51
dflet 0:bbe98578d4c0 52 _i16 _sl_GetStartResponseConvert(_u32 Status)
dflet 0:bbe98578d4c0 53 {
dflet 0:bbe98578d4c0 54 switch(Status)
dflet 0:bbe98578d4c0 55 {
dflet 0:bbe98578d4c0 56 case INIT_STA_OK:
dflet 0:bbe98578d4c0 57 return ROLE_STA;
dflet 0:bbe98578d4c0 58 case INIT_STA_ERR:
dflet 0:bbe98578d4c0 59 return ROLE_STA_ERR;
dflet 0:bbe98578d4c0 60 case INIT_AP_OK:
dflet 0:bbe98578d4c0 61 return ROLE_AP;
dflet 0:bbe98578d4c0 62 case INIT_AP_ERR:
dflet 0:bbe98578d4c0 63 return ROLE_AP_ERR;
dflet 0:bbe98578d4c0 64 case INIT_P2P_OK:
dflet 0:bbe98578d4c0 65 return ROLE_P2P;
dflet 0:bbe98578d4c0 66 case INIT_P2P_ERR:
dflet 0:bbe98578d4c0 67 return ROLE_P2P_ERR;
dflet 0:bbe98578d4c0 68 default:
dflet 0:bbe98578d4c0 69 return (_i16)Status;
dflet 0:bbe98578d4c0 70 }
dflet 0:bbe98578d4c0 71 }
dflet 0:bbe98578d4c0 72
dflet 0:bbe98578d4c0 73 /*****************************************************************************/
dflet 0:bbe98578d4c0 74 /* API Functions */
dflet 0:bbe98578d4c0 75 /*****************************************************************************/
dflet 0:bbe98578d4c0 76
dflet 0:bbe98578d4c0 77
dflet 0:bbe98578d4c0 78
dflet 0:bbe98578d4c0 79 /*****************************************************************************/
dflet 0:bbe98578d4c0 80 /* sl_Task */
dflet 0:bbe98578d4c0 81 /*****************************************************************************/
dflet 0:bbe98578d4c0 82 #if _SL_INCLUDE_FUNC(sl_Task)
dflet 0:bbe98578d4c0 83 void sl_Task(void)
dflet 0:bbe98578d4c0 84 {
dflet 0:bbe98578d4c0 85 #ifdef _SlTaskEntry
dflet 0:bbe98578d4c0 86 _SlTaskEntry();
dflet 0:bbe98578d4c0 87 #endif
dflet 0:bbe98578d4c0 88 }
dflet 0:bbe98578d4c0 89 #endif
dflet 0:bbe98578d4c0 90
dflet 0:bbe98578d4c0 91 /*****************************************************************************/
dflet 0:bbe98578d4c0 92 /* sl_Start */
dflet 0:bbe98578d4c0 93 /*****************************************************************************/
dflet 0:bbe98578d4c0 94 #if _SL_INCLUDE_FUNC(sl_Start)
dflet 0:bbe98578d4c0 95 _i16 sl_Start(const void* pIfHdl, _i8* pDevName, const P_INIT_CALLBACK pInitCallBack)
dflet 0:bbe98578d4c0 96 {
dflet 0:bbe98578d4c0 97 _i16 ObjIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:bbe98578d4c0 98 InitComplete_t AsyncRsp;
dflet 0:bbe98578d4c0 99
dflet 0:bbe98578d4c0 100 /* Perform any preprocessing before enable networking services */
dflet 0:bbe98578d4c0 101 sl_DeviceEnablePreamble();
dflet 0:bbe98578d4c0 102
dflet 0:bbe98578d4c0 103 /* ControlBlock init */
dflet 0:bbe98578d4c0 104 _SlDrvDriverCBInit();
dflet 0:bbe98578d4c0 105
dflet 0:bbe98578d4c0 106 /* open the interface: usually SPI or UART */
dflet 0:bbe98578d4c0 107 if (NULL == pIfHdl)
dflet 0:bbe98578d4c0 108 {
dflet 0:bbe98578d4c0 109 g_pCB->FD = sl_IfOpen((char *)pDevName, 0);//char* replaced void*
dflet 0:bbe98578d4c0 110 }
dflet 0:bbe98578d4c0 111 else
dflet 0:bbe98578d4c0 112 {
dflet 0:bbe98578d4c0 113 g_pCB->FD = (_SlFd_t)pIfHdl;
dflet 0:bbe98578d4c0 114 }
dflet 0:bbe98578d4c0 115 /* Use Obj to issue the command, if not available try later */
dflet 0:bbe98578d4c0 116 ObjIdx = _SlDrvWaitForPoolObj(START_STOP_ID,SL_MAX_SOCKETS);
dflet 0:bbe98578d4c0 117 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
dflet 0:bbe98578d4c0 118 {
dflet 0:bbe98578d4c0 119 return SL_POOL_IS_EMPTY;
dflet 0:bbe98578d4c0 120 }
dflet 0:bbe98578d4c0 121 OSI_RET_OK_CHECK(sl_LockObjLock(&g_pCB->ProtectionLockObj, SL_OS_WAIT_FOREVER));
dflet 0:bbe98578d4c0 122 g_pCB->ObjPool[ObjIdx].pRespArgs = (_u8 *)&AsyncRsp;
dflet 0:bbe98578d4c0 123 OSI_RET_OK_CHECK(sl_LockObjUnlock(&g_pCB->ProtectionLockObj));
dflet 0:bbe98578d4c0 124
dflet 0:bbe98578d4c0 125 if( g_pCB->FD >= 0)
dflet 0:bbe98578d4c0 126 {
dflet 0:bbe98578d4c0 127 sl_DeviceDisable();
dflet 0:bbe98578d4c0 128
dflet 0:bbe98578d4c0 129 sl_IfRegIntHdlr((SL_P_EVENT_HANDLER)_SlDrvRxIrqHandler, NULL);
dflet 0:bbe98578d4c0 130
dflet 0:bbe98578d4c0 131 if(NULL != pInitCallBack)
dflet 0:bbe98578d4c0 132 {
dflet 0:bbe98578d4c0 133 g_pCB->pInitCallback = pInitCallBack;
dflet 0:bbe98578d4c0 134 }
dflet 0:bbe98578d4c0 135 sl_DeviceEnable();
dflet 0:bbe98578d4c0 136
dflet 0:bbe98578d4c0 137 if (NULL == pInitCallBack)
dflet 0:bbe98578d4c0 138 {
dflet 0:bbe98578d4c0 139 OSI_RET_OK_CHECK(sl_SyncObjWait(&g_pCB->ObjPool[ObjIdx].SyncObj, SL_OS_WAIT_FOREVER));
dflet 0:bbe98578d4c0 140 /*release Pool Object*/
dflet 0:bbe98578d4c0 141 _SlDrvReleasePoolObj(g_pCB->FunctionParams.AsyncExt.ActionIndex);
dflet 0:bbe98578d4c0 142 return _sl_GetStartResponseConvert(AsyncRsp.Status);
dflet 0:bbe98578d4c0 143 }
dflet 0:bbe98578d4c0 144 }
dflet 0:bbe98578d4c0 145
dflet 0:bbe98578d4c0 146 return (_i16)g_pCB->FD;
dflet 0:bbe98578d4c0 147
dflet 0:bbe98578d4c0 148 }
dflet 0:bbe98578d4c0 149 #endif
dflet 0:bbe98578d4c0 150
dflet 0:bbe98578d4c0 151 /***************************************************************************
dflet 0:bbe98578d4c0 152 _sl_HandleAsync_InitComplete - handles init complete signalling to
dflet 0:bbe98578d4c0 153 a waiting object
dflet 0:bbe98578d4c0 154 ****************************************************************************/
dflet 0:bbe98578d4c0 155 void _sl_HandleAsync_InitComplete(void *pVoidBuf)
dflet 0:bbe98578d4c0 156 {
dflet 0:bbe98578d4c0 157 InitComplete_t *pMsgArgs = (InitComplete_t *)_SL_RESP_ARGS_START(pVoidBuf);
dflet 0:bbe98578d4c0 158
dflet 0:bbe98578d4c0 159 OSI_RET_OK_CHECK(sl_LockObjLock(&g_pCB->ProtectionLockObj, SL_OS_WAIT_FOREVER));
dflet 0:bbe98578d4c0 160
dflet 0:bbe98578d4c0 161 if(g_pCB->pInitCallback)
dflet 0:bbe98578d4c0 162 {
dflet 0:bbe98578d4c0 163 g_pCB->pInitCallback(_sl_GetStartResponseConvert(pMsgArgs->Status));
dflet 0:bbe98578d4c0 164 }
dflet 0:bbe98578d4c0 165 else
dflet 0:bbe98578d4c0 166 {
dflet 0:bbe98578d4c0 167 sl_Memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(InitComplete_t));
dflet 0:bbe98578d4c0 168 OSI_RET_OK_CHECK(sl_SyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj));
dflet 0:bbe98578d4c0 169 }
dflet 0:bbe98578d4c0 170 OSI_RET_OK_CHECK(sl_LockObjUnlock(&g_pCB->ProtectionLockObj));
dflet 0:bbe98578d4c0 171
dflet 0:bbe98578d4c0 172 if(g_pCB->pInitCallback)
dflet 0:bbe98578d4c0 173 {
dflet 0:bbe98578d4c0 174 _SlDrvReleasePoolObj(g_pCB->FunctionParams.AsyncExt.ActionIndex);
dflet 0:bbe98578d4c0 175 }
dflet 0:bbe98578d4c0 176
dflet 0:bbe98578d4c0 177 }
dflet 0:bbe98578d4c0 178
dflet 0:bbe98578d4c0 179 /***************************************************************************
dflet 0:bbe98578d4c0 180 _sl_HandleAsync_Stop - handles stop signalling to
dflet 0:bbe98578d4c0 181 a waiting object
dflet 0:bbe98578d4c0 182 ****************************************************************************/
dflet 0:bbe98578d4c0 183 void _sl_HandleAsync_Stop(void *pVoidBuf)
dflet 0:bbe98578d4c0 184 {
dflet 0:bbe98578d4c0 185 _BasicResponse_t *pMsgArgs = (_BasicResponse_t *)_SL_RESP_ARGS_START(pVoidBuf);
dflet 0:bbe98578d4c0 186
dflet 0:bbe98578d4c0 187 VERIFY_SOCKET_CB(NULL != g_pCB->StopCB.pAsyncRsp);
dflet 0:bbe98578d4c0 188
dflet 0:bbe98578d4c0 189 OSI_RET_OK_CHECK(sl_LockObjLock(&g_pCB->ProtectionLockObj, SL_OS_WAIT_FOREVER));
dflet 0:bbe98578d4c0 190
dflet 0:bbe98578d4c0 191 sl_Memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs, sizeof(_BasicResponse_t));
dflet 0:bbe98578d4c0 192 OSI_RET_OK_CHECK(sl_SyncObjSignal(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj));
dflet 0:bbe98578d4c0 193 OSI_RET_OK_CHECK(sl_LockObjUnlock(&g_pCB->ProtectionLockObj));
dflet 0:bbe98578d4c0 194 return;
dflet 0:bbe98578d4c0 195 }
dflet 0:bbe98578d4c0 196
dflet 0:bbe98578d4c0 197
dflet 0:bbe98578d4c0 198 /*****************************************************************************
dflet 0:bbe98578d4c0 199 sl_stop
dflet 0:bbe98578d4c0 200 ******************************************************************************/
dflet 0:bbe98578d4c0 201 typedef union
dflet 0:bbe98578d4c0 202 {
dflet 0:bbe98578d4c0 203 _DevStopCommand_t Cmd;
dflet 0:bbe98578d4c0 204 _BasicResponse_t Rsp;
dflet 0:bbe98578d4c0 205 }_SlStopMsg_u;
dflet 0:bbe98578d4c0 206
dflet 0:bbe98578d4c0 207 const _SlCmdCtrl_t _SlStopCmdCtrl =
dflet 0:bbe98578d4c0 208 {
dflet 0:bbe98578d4c0 209 SL_OPCODE_DEVICE_STOP_COMMAND,
dflet 0:bbe98578d4c0 210 sizeof(_DevStopCommand_t),
dflet 0:bbe98578d4c0 211 sizeof(_BasicResponse_t)
dflet 0:bbe98578d4c0 212 };
dflet 0:bbe98578d4c0 213
dflet 0:bbe98578d4c0 214 #if _SL_INCLUDE_FUNC(sl_Stop)
dflet 0:bbe98578d4c0 215 _i16 sl_Stop(_u16 timeout)
dflet 0:bbe98578d4c0 216 {
dflet 0:bbe98578d4c0 217 _i16 RetVal=0;
dflet 0:bbe98578d4c0 218 _SlStopMsg_u Msg;
dflet 0:bbe98578d4c0 219 _BasicResponse_t AsyncRsp;
dflet 0:bbe98578d4c0 220 _i16 ObjIdx = MAX_CONCURRENT_ACTIONS;
dflet 0:bbe98578d4c0 221 /* if timeout is 0 the shutdown is forced immediately */
dflet 0:bbe98578d4c0 222 if( 0 == timeout )
dflet 0:bbe98578d4c0 223 {
dflet 0:bbe98578d4c0 224 sl_IfRegIntHdlr(NULL, NULL);
dflet 0:bbe98578d4c0 225 sl_DeviceDisable();
dflet 0:bbe98578d4c0 226 RetVal = sl_IfClose(g_pCB->FD);
dflet 0:bbe98578d4c0 227
dflet 0:bbe98578d4c0 228 }
dflet 0:bbe98578d4c0 229 else
dflet 0:bbe98578d4c0 230 {
dflet 0:bbe98578d4c0 231 /* let the device make the shutdown using the defined timeout */
dflet 0:bbe98578d4c0 232 Msg.Cmd.Timeout = timeout;
dflet 0:bbe98578d4c0 233 /* Use Obj to issue the command, if not available try later */
dflet 0:bbe98578d4c0 234 ObjIdx = _SlDrvWaitForPoolObj(START_STOP_ID,SL_MAX_SOCKETS);
dflet 0:bbe98578d4c0 235 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
dflet 0:bbe98578d4c0 236 {
dflet 0:bbe98578d4c0 237 return SL_POOL_IS_EMPTY;
dflet 0:bbe98578d4c0 238 }
dflet 0:bbe98578d4c0 239 OSI_RET_OK_CHECK(sl_LockObjLock(&g_pCB->ProtectionLockObj, SL_OS_WAIT_FOREVER));
dflet 0:bbe98578d4c0 240
dflet 0:bbe98578d4c0 241 g_pCB->ObjPool[ObjIdx].pRespArgs = (_u8 *)&AsyncRsp;
dflet 0:bbe98578d4c0 242
dflet 0:bbe98578d4c0 243 OSI_RET_OK_CHECK(sl_LockObjUnlock(&g_pCB->ProtectionLockObj));
dflet 0:bbe98578d4c0 244
dflet 0:bbe98578d4c0 245 VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlStopCmdCtrl, &Msg, NULL));
dflet 0:bbe98578d4c0 246
dflet 0:bbe98578d4c0 247 if(SL_OS_RET_CODE_OK == (_i16)Msg.Rsp.status)
dflet 0:bbe98578d4c0 248 {
dflet 0:bbe98578d4c0 249 OSI_RET_OK_CHECK(sl_SyncObjWait(&g_pCB->ObjPool[ObjIdx].SyncObj, SL_OS_WAIT_FOREVER));
dflet 0:bbe98578d4c0 250 Msg.Rsp.status = AsyncRsp.status;
dflet 0:bbe98578d4c0 251 RetVal = Msg.Rsp.status;
dflet 0:bbe98578d4c0 252 }
dflet 0:bbe98578d4c0 253
dflet 0:bbe98578d4c0 254 _SlDrvReleasePoolObj((_u8)ObjIdx);
dflet 0:bbe98578d4c0 255
dflet 0:bbe98578d4c0 256 sl_IfRegIntHdlr(NULL, NULL);
dflet 0:bbe98578d4c0 257 sl_DeviceDisable();
dflet 0:bbe98578d4c0 258 sl_IfClose(g_pCB->FD);
dflet 0:bbe98578d4c0 259 }
dflet 0:bbe98578d4c0 260 _SlDrvDriverCBDeinit();
dflet 0:bbe98578d4c0 261
dflet 0:bbe98578d4c0 262 return RetVal;
dflet 0:bbe98578d4c0 263 }
dflet 0:bbe98578d4c0 264 #endif
dflet 0:bbe98578d4c0 265
dflet 0:bbe98578d4c0 266
dflet 0:bbe98578d4c0 267 /*****************************************************************************
dflet 0:bbe98578d4c0 268 sl_EventMaskSet
dflet 0:bbe98578d4c0 269 *****************************************************************************/
dflet 0:bbe98578d4c0 270 typedef union
dflet 0:bbe98578d4c0 271 {
dflet 0:bbe98578d4c0 272 _DevMaskEventSetCommand_t Cmd;
dflet 0:bbe98578d4c0 273 _BasicResponse_t Rsp;
dflet 0:bbe98578d4c0 274 }_SlEventMaskSetMsg_u;
dflet 0:bbe98578d4c0 275
dflet 0:bbe98578d4c0 276 const _SlCmdCtrl_t _SlEventMaskSetCmdCtrl =
dflet 0:bbe98578d4c0 277 {
dflet 0:bbe98578d4c0 278 SL_OPCODE_DEVICE_EVENTMASKSET,
dflet 0:bbe98578d4c0 279 sizeof(_DevMaskEventSetCommand_t),
dflet 0:bbe98578d4c0 280 sizeof(_BasicResponse_t)
dflet 0:bbe98578d4c0 281 };
dflet 0:bbe98578d4c0 282
dflet 0:bbe98578d4c0 283 #if _SL_INCLUDE_FUNC(sl_EventMaskSet)
dflet 0:bbe98578d4c0 284 _i16 sl_EventMaskSet(_u8 EventClass , _u32 Mask)
dflet 0:bbe98578d4c0 285 {
dflet 0:bbe98578d4c0 286 _SlEventMaskSetMsg_u Msg;
dflet 0:bbe98578d4c0 287
dflet 0:bbe98578d4c0 288 Msg.Cmd.group = EventClass;
dflet 0:bbe98578d4c0 289 Msg.Cmd.mask = Mask;
dflet 0:bbe98578d4c0 290
dflet 0:bbe98578d4c0 291 VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlEventMaskSetCmdCtrl, &Msg, NULL));
dflet 0:bbe98578d4c0 292
dflet 0:bbe98578d4c0 293 return (_i16)Msg.Rsp.status;
dflet 0:bbe98578d4c0 294 }
dflet 0:bbe98578d4c0 295 #endif
dflet 0:bbe98578d4c0 296
dflet 0:bbe98578d4c0 297 /******************************************************************************
dflet 0:bbe98578d4c0 298 sl_EventMaskGet
dflet 0:bbe98578d4c0 299 ******************************************************************************/
dflet 0:bbe98578d4c0 300 typedef union
dflet 0:bbe98578d4c0 301 {
dflet 0:bbe98578d4c0 302 _DevMaskEventGetCommand_t Cmd;
dflet 0:bbe98578d4c0 303 _DevMaskEventGetResponse_t Rsp;
dflet 0:bbe98578d4c0 304 }_SlEventMaskGetMsg_u;
dflet 0:bbe98578d4c0 305
dflet 0:bbe98578d4c0 306 const _SlCmdCtrl_t _SlEventMaskGetCmdCtrl =
dflet 0:bbe98578d4c0 307 {
dflet 0:bbe98578d4c0 308 SL_OPCODE_DEVICE_EVENTMASKGET,
dflet 0:bbe98578d4c0 309 sizeof(_DevMaskEventGetCommand_t),
dflet 0:bbe98578d4c0 310 sizeof(_DevMaskEventGetResponse_t)
dflet 0:bbe98578d4c0 311 };
dflet 0:bbe98578d4c0 312
dflet 0:bbe98578d4c0 313 #if _SL_INCLUDE_FUNC(sl_EventMaskGet)
dflet 0:bbe98578d4c0 314 _i16 sl_EventMaskGet(_u8 EventClass, _u32 *pMask)
dflet 0:bbe98578d4c0 315 {
dflet 0:bbe98578d4c0 316 _SlEventMaskGetMsg_u Msg;
dflet 0:bbe98578d4c0 317
dflet 0:bbe98578d4c0 318 Msg.Cmd.group = EventClass;
dflet 0:bbe98578d4c0 319
dflet 0:bbe98578d4c0 320 VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlEventMaskGetCmdCtrl, &Msg, NULL));
dflet 0:bbe98578d4c0 321
dflet 0:bbe98578d4c0 322 *pMask = Msg.Rsp.mask;
dflet 0:bbe98578d4c0 323 return SL_RET_CODE_OK;
dflet 0:bbe98578d4c0 324 }
dflet 0:bbe98578d4c0 325 #endif
dflet 0:bbe98578d4c0 326
dflet 0:bbe98578d4c0 327
dflet 0:bbe98578d4c0 328
dflet 0:bbe98578d4c0 329 /******************************************************************************
dflet 0:bbe98578d4c0 330 sl_DevGet
dflet 0:bbe98578d4c0 331 ******************************************************************************/
dflet 0:bbe98578d4c0 332
dflet 0:bbe98578d4c0 333 typedef union
dflet 0:bbe98578d4c0 334 {
dflet 0:bbe98578d4c0 335 _DeviceSetGet_t Cmd;
dflet 0:bbe98578d4c0 336 _DeviceSetGet_t Rsp;
dflet 0:bbe98578d4c0 337 }_SlDeviceMsgGet_u;
dflet 0:bbe98578d4c0 338
dflet 0:bbe98578d4c0 339 const _SlCmdCtrl_t _SlDeviceGetCmdCtrl =
dflet 0:bbe98578d4c0 340 {
dflet 0:bbe98578d4c0 341 SL_OPCODE_DEVICE_DEVICEGET,
dflet 0:bbe98578d4c0 342 sizeof(_DeviceSetGet_t),
dflet 0:bbe98578d4c0 343 sizeof(_DeviceSetGet_t)
dflet 0:bbe98578d4c0 344 };
dflet 0:bbe98578d4c0 345
dflet 0:bbe98578d4c0 346 #if _SL_INCLUDE_FUNC(sl_DevGet)
dflet 0:bbe98578d4c0 347 _i32 sl_DevGet(_u8 DeviceGetId, _u8 *pOption,_u8 *pConfigLen, _u8 *pValues)
dflet 0:bbe98578d4c0 348 {
dflet 0:bbe98578d4c0 349 _SlDeviceMsgGet_u Msg;
dflet 0:bbe98578d4c0 350 _SlCmdExt_t CmdExt;
dflet 0:bbe98578d4c0 351
dflet 0:bbe98578d4c0 352 if (*pConfigLen == 0)
dflet 0:bbe98578d4c0 353 {
dflet 0:bbe98578d4c0 354 return SL_EZEROLEN;
dflet 0:bbe98578d4c0 355 }
dflet 0:bbe98578d4c0 356
dflet 0:bbe98578d4c0 357 if( pOption )
dflet 0:bbe98578d4c0 358 {
dflet 0:bbe98578d4c0 359 CmdExt.TxPayloadLen = 0;
dflet 0:bbe98578d4c0 360 CmdExt.RxPayloadLen = *pConfigLen;
dflet 0:bbe98578d4c0 361 CmdExt.pTxPayload = NULL;
dflet 0:bbe98578d4c0 362 CmdExt.pRxPayload = (_u8 *)pValues;
dflet 0:bbe98578d4c0 363 CmdExt.ActualRxPayloadLen = 0;
dflet 0:bbe98578d4c0 364
dflet 0:bbe98578d4c0 365 Msg.Cmd.DeviceSetId = DeviceGetId;
dflet 0:bbe98578d4c0 366
dflet 0:bbe98578d4c0 367 Msg.Cmd.Option = (_u16)*pOption;
dflet 0:bbe98578d4c0 368
dflet 0:bbe98578d4c0 369 VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlDeviceGetCmdCtrl, &Msg, &CmdExt));
dflet 0:bbe98578d4c0 370
dflet 0:bbe98578d4c0 371 if( pOption )
dflet 0:bbe98578d4c0 372 {
dflet 0:bbe98578d4c0 373 *pOption = (_u8)Msg.Rsp.Option;
dflet 0:bbe98578d4c0 374 }
dflet 0:bbe98578d4c0 375
dflet 0:bbe98578d4c0 376 if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen)
dflet 0:bbe98578d4c0 377 {
dflet 0:bbe98578d4c0 378 *pConfigLen = (_u8)CmdExt.RxPayloadLen;
dflet 0:bbe98578d4c0 379 return SL_ESMALLBUF;
dflet 0:bbe98578d4c0 380 }
dflet 0:bbe98578d4c0 381 else
dflet 0:bbe98578d4c0 382 {
dflet 0:bbe98578d4c0 383 *pConfigLen = (_u8)CmdExt.ActualRxPayloadLen;
dflet 0:bbe98578d4c0 384 }
dflet 0:bbe98578d4c0 385
dflet 0:bbe98578d4c0 386 return (_i16)Msg.Rsp.Status;
dflet 0:bbe98578d4c0 387 }
dflet 0:bbe98578d4c0 388 else
dflet 0:bbe98578d4c0 389 {
dflet 0:bbe98578d4c0 390 return -1;
dflet 0:bbe98578d4c0 391 }
dflet 0:bbe98578d4c0 392 }
dflet 0:bbe98578d4c0 393 #endif
dflet 0:bbe98578d4c0 394
dflet 0:bbe98578d4c0 395 /******************************************************************************
dflet 0:bbe98578d4c0 396 sl_DevSet
dflet 0:bbe98578d4c0 397 ******************************************************************************/
dflet 0:bbe98578d4c0 398 typedef union
dflet 0:bbe98578d4c0 399 {
dflet 0:bbe98578d4c0 400 _DeviceSetGet_t Cmd;
dflet 0:bbe98578d4c0 401 _BasicResponse_t Rsp;
dflet 0:bbe98578d4c0 402 }_SlDeviceMsgSet_u;
dflet 0:bbe98578d4c0 403
dflet 0:bbe98578d4c0 404 const _SlCmdCtrl_t _SlDeviceSetCmdCtrl =
dflet 0:bbe98578d4c0 405 {
dflet 0:bbe98578d4c0 406 SL_OPCODE_DEVICE_DEVICESET,
dflet 0:bbe98578d4c0 407 sizeof(_DeviceSetGet_t),
dflet 0:bbe98578d4c0 408 sizeof(_BasicResponse_t)
dflet 0:bbe98578d4c0 409 };
dflet 0:bbe98578d4c0 410
dflet 0:bbe98578d4c0 411 #if _SL_INCLUDE_FUNC(sl_DevSet)
dflet 0:bbe98578d4c0 412 _i32 sl_DevSet(_u8 DeviceSetId ,_u8 Option,_u8 ConfigLen, _u8 *pValues)
dflet 0:bbe98578d4c0 413 {
dflet 0:bbe98578d4c0 414 _SlDeviceMsgSet_u Msg;
dflet 0:bbe98578d4c0 415 _SlCmdExt_t CmdExt;
dflet 0:bbe98578d4c0 416
dflet 0:bbe98578d4c0 417 CmdExt.TxPayloadLen = (ConfigLen+3) & (~3);
dflet 0:bbe98578d4c0 418 CmdExt.RxPayloadLen = 0;
dflet 0:bbe98578d4c0 419 CmdExt.pTxPayload = (_u8 *)pValues;
dflet 0:bbe98578d4c0 420 CmdExt.pRxPayload = NULL;
dflet 0:bbe98578d4c0 421
dflet 0:bbe98578d4c0 422
dflet 0:bbe98578d4c0 423 Msg.Cmd.DeviceSetId = DeviceSetId;
dflet 0:bbe98578d4c0 424 Msg.Cmd.ConfigLen = ConfigLen;
dflet 0:bbe98578d4c0 425 Msg.Cmd.Option = Option;
dflet 0:bbe98578d4c0 426
dflet 0:bbe98578d4c0 427 VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlDeviceSetCmdCtrl, &Msg, &CmdExt));
dflet 0:bbe98578d4c0 428
dflet 0:bbe98578d4c0 429 return (_i16)Msg.Rsp.status;
dflet 0:bbe98578d4c0 430 }
dflet 0:bbe98578d4c0 431 #endif
dflet 0:bbe98578d4c0 432
dflet 0:bbe98578d4c0 433
dflet 0:bbe98578d4c0 434 /******************************************************************************
dflet 0:bbe98578d4c0 435 _SlDrvDeviceEventHandler - handles internally device async events
dflet 0:bbe98578d4c0 436 ******************************************************************************/
dflet 0:bbe98578d4c0 437 void _SlDrvDeviceEventHandler(void *pArgs)
dflet 0:bbe98578d4c0 438 {
dflet 0:bbe98578d4c0 439 _SlResponseHeader_t *pHdr = (_SlResponseHeader_t *)pArgs;
dflet 0:bbe98578d4c0 440
dflet 0:bbe98578d4c0 441 switch(pHdr->GenHeader.Opcode)
dflet 0:bbe98578d4c0 442 {
dflet 0:bbe98578d4c0 443 case SL_OPCODE_DEVICE_INITCOMPLETE:
dflet 0:bbe98578d4c0 444 _sl_HandleAsync_InitComplete(pHdr);
dflet 0:bbe98578d4c0 445 break;
dflet 0:bbe98578d4c0 446 case SL_OPCODE_DEVICE_STOP_ASYNC_RESPONSE:
dflet 0:bbe98578d4c0 447 _sl_HandleAsync_Stop(pHdr);
dflet 0:bbe98578d4c0 448 break;
dflet 0:bbe98578d4c0 449 case SL_OPCODE_DEVICE_DEVICEASYNCFATALERROR:
dflet 0:bbe98578d4c0 450 #ifdef sl_GeneralEvtHdlr
dflet 0:bbe98578d4c0 451 {
dflet 0:bbe98578d4c0 452 _BasicResponse_t *pMsgArgs = (_BasicResponse_t *)_SL_RESP_ARGS_START(pHdr);
dflet 0:bbe98578d4c0 453 SlDeviceEvent_t devHandler;
dflet 0:bbe98578d4c0 454 devHandler.Event = SL_DEVICE_FATAL_ERROR_EVENT;
dflet 0:bbe98578d4c0 455 devHandler.EventData.deviceEvent.status = pMsgArgs->status & 0xFF;
dflet 0:bbe98578d4c0 456 devHandler.EventData.deviceEvent.sender = (SlErrorSender_e)((pMsgArgs->status >> 8) & 0xFF);
dflet 0:bbe98578d4c0 457 sl_GeneralEvtHdlr(&devHandler);
dflet 0:bbe98578d4c0 458 }
dflet 0:bbe98578d4c0 459 #endif
dflet 0:bbe98578d4c0 460 break;
dflet 0:bbe98578d4c0 461 default:
dflet 0:bbe98578d4c0 462 SL_ERROR_TRACE2(MSG_306, "ASSERT: _SlDrvDeviceEventHandler : invalid opcode = 0x%x = %1", pHdr->GenHeader.Opcode, pHdr->GenHeader.Opcode);
dflet 0:bbe98578d4c0 463 VERIFY_PROTOCOL(0);
dflet 0:bbe98578d4c0 464 }
dflet 0:bbe98578d4c0 465 }
dflet 0:bbe98578d4c0 466
dflet 0:bbe98578d4c0 467
dflet 0:bbe98578d4c0 468 /******************************************************************************
dflet 0:bbe98578d4c0 469 sl_UartSetMode
dflet 0:bbe98578d4c0 470 ******************************************************************************/
dflet 0:bbe98578d4c0 471 #ifdef SL_IF_TYPE_UART
dflet 0:bbe98578d4c0 472 typedef union
dflet 0:bbe98578d4c0 473 {
dflet 0:bbe98578d4c0 474 _DevUartSetModeCommand_t Cmd;
dflet 0:bbe98578d4c0 475 _DevUartSetModeResponse_t Rsp;
dflet 0:bbe98578d4c0 476 }_SlUartSetModeMsg_u;
dflet 0:bbe98578d4c0 477
dflet 0:bbe98578d4c0 478 const _SlCmdCtrl_t _SlUartSetModeCmdCtrl =
dflet 0:bbe98578d4c0 479 {
dflet 0:bbe98578d4c0 480 SL_OPCODE_DEVICE_SETUARTMODECOMMAND,
dflet 0:bbe98578d4c0 481 sizeof(_DevUartSetModeCommand_t),
dflet 0:bbe98578d4c0 482 sizeof(_DevUartSetModeResponse_t)
dflet 0:bbe98578d4c0 483 };
dflet 0:bbe98578d4c0 484
dflet 0:bbe98578d4c0 485
dflet 0:bbe98578d4c0 486 #if _SL_INCLUDE_FUNC(sl_UartSetMode)
dflet 0:bbe98578d4c0 487 _i16 sl_UartSetMode(const SlUartIfParams_t* pUartParams)
dflet 0:bbe98578d4c0 488 {
dflet 0:bbe98578d4c0 489 _SlUartSetModeMsg_u Msg;
dflet 0:bbe98578d4c0 490 _u32 magicCode = 0xFFFFFFFF;
dflet 0:bbe98578d4c0 491
dflet 0:bbe98578d4c0 492 Msg.Cmd.BaudRate = pUartParams->BaudRate;
dflet 0:bbe98578d4c0 493 Msg.Cmd.FlowControlEnable = pUartParams->FlowControlEnable;
dflet 0:bbe98578d4c0 494
dflet 0:bbe98578d4c0 495
dflet 0:bbe98578d4c0 496 VERIFY_RET_OK(_SlDrvCmdOp((_SlCmdCtrl_t *)&_SlUartSetModeCmdCtrl, &Msg, NULL));
dflet 0:bbe98578d4c0 497
dflet 0:bbe98578d4c0 498 /* cmd response OK, we can continue with the handshake */
dflet 0:bbe98578d4c0 499 if (SL_RET_CODE_OK == Msg.Rsp.status)
dflet 0:bbe98578d4c0 500 {
dflet 0:bbe98578d4c0 501 sl_IfMaskIntHdlr();
dflet 0:bbe98578d4c0 502
dflet 0:bbe98578d4c0 503 /* Close the comm port */
dflet 0:bbe98578d4c0 504 sl_IfClose(g_pCB->FD);
dflet 0:bbe98578d4c0 505
dflet 0:bbe98578d4c0 506 /* Re-open the comm port */
dflet 0:bbe98578d4c0 507 sl_IfOpen((void * )pUartParams, UART_IF_OPEN_FLAG_RE_OPEN);
dflet 0:bbe98578d4c0 508
dflet 0:bbe98578d4c0 509 sl_IfUnMaskIntHdlr();
dflet 0:bbe98578d4c0 510
dflet 0:bbe98578d4c0 511 /* send the magic code and wait for the response */
dflet 0:bbe98578d4c0 512 sl_IfWrite(g_pCB->FD, (_u8* )&magicCode, 4);
dflet 0:bbe98578d4c0 513
dflet 0:bbe98578d4c0 514 magicCode = UART_SET_MODE_MAGIC_CODE;
dflet 0:bbe98578d4c0 515 sl_IfWrite(g_pCB->FD, (_u8* )&magicCode, 4);
dflet 0:bbe98578d4c0 516
dflet 0:bbe98578d4c0 517 /* clear magic code */
dflet 0:bbe98578d4c0 518 magicCode = 0;
dflet 0:bbe98578d4c0 519
dflet 0:bbe98578d4c0 520 /* wait (blocking) till the magic code to be returned from device */
dflet 0:bbe98578d4c0 521 sl_IfRead(g_pCB->FD, (_u8* )&magicCode, 4);
dflet 0:bbe98578d4c0 522
dflet 0:bbe98578d4c0 523 /* check for the received magic code matching */
dflet 0:bbe98578d4c0 524 if (UART_SET_MODE_MAGIC_CODE != magicCode)
dflet 0:bbe98578d4c0 525 {
dflet 0:bbe98578d4c0 526 _SL_ASSERT(0);
dflet 0:bbe98578d4c0 527 }
dflet 0:bbe98578d4c0 528 }
dflet 0:bbe98578d4c0 529
dflet 0:bbe98578d4c0 530 return (_i16)Msg.Rsp.status;
dflet 0:bbe98578d4c0 531 }
dflet 0:bbe98578d4c0 532 #endif
dflet 0:bbe98578d4c0 533 #endif
dflet 0:bbe98578d4c0 534
dflet 0:bbe98578d4c0 535 /*!
dflet 0:bbe98578d4c0 536 \brief This function handles general error events indication
dflet 0:bbe98578d4c0 537
dflet 0:bbe98578d4c0 538 \param[in] pDevEvent is the event passed to the handler
dflet 0:bbe98578d4c0 539
dflet 0:bbe98578d4c0 540 \return None
dflet 0:bbe98578d4c0 541 */
dflet 0:bbe98578d4c0 542 void SimpleLinkGeneralEventHandler(SlDeviceEvent_t *pDevEvent)
dflet 0:bbe98578d4c0 543 {
dflet 0:bbe98578d4c0 544 /*
dflet 0:bbe98578d4c0 545 * Most of the general errors are not FATAL are are to be handled
dflet 0:bbe98578d4c0 546 * appropriately by the application
dflet 0:bbe98578d4c0 547 */
dflet 0:bbe98578d4c0 548 // CLI_Write((_u8 *)" [GENERAL EVENT] \n\r");
dflet 0:bbe98578d4c0 549 printf(" [GENERAL EVENT] \n\r");
dflet 0:bbe98578d4c0 550 }