18 #include <ti/drivers/net/wifi/simplelink.h>
19 #include <ti/drivers/net/wifi/source/protocol.h>
20 #include <ti/drivers/net/wifi/source/driver.h>
21 #include <ti/drivers/net/wifi/source/flowcont.h>
27 static _i16 _SlDeviceGetStartResponseConvert(_i32 Status);
28 void _SlDeviceHandleResetRequestInternally(
void);
29 void _SlDeviceResetRequestInitCompletedCB(_u32 Status,
SlDeviceInitInfo_t *DeviceInitInfo);
31 #define RESET_REQUEST_STOP_TIMEOUT (300)
33 #ifndef SL_IF_OPEN_FLAGS
34 #define SL_IF_OPEN_FLAGS (0x0)
37 #ifndef SL_IF_UART_REOPEN_FLAGS
38 #define SL_IF_UART_REOPEN_FLAGS (0x1)
45 _u32 ResetRequestSessionNumber;
48 _SlDeviceCb_t DeviceCB;
51 static const _i16 StartResponseLUT[16] =
55 SL_ERROR_ROLE_STA_ERR,
59 SL_ERROR_ROLE_P2P_ERR,
61 SL_ERROR_FS_CORRUPTED_ERR,
62 SL_ERROR_FS_ALERT_ERR,
63 SL_ERROR_RESTORE_IMAGE_COMPLETE,
64 SL_ERROR_INCOMPLETE_PROGRAMMING,
71 static _i16 _SlDeviceGetStartResponseConvert(_i32 Status)
73 return StartResponseLUT[Status & 0xF];
86 #if _SL_INCLUDE_FUNC(sl_Task)
90 return (
void*)_SlTaskEntry();
101 #if _SL_INCLUDE_FUNC(sl_Start)
102 _i16
sl_Start(
const void* pIfHdl, _i8* pDevName,
const P_INIT_CALLBACK pInitCallBack)
104 _u8 ObjIdx = MAX_CONCURRENT_ACTIONS;
109 VERIFY_NO_ERROR_HANDLING_IN_PROGRESS();
110 if (SL_IS_DEVICE_STARTED)
112 return SL_RET_CODE_DEV_ALREADY_STARTED;
115 #ifdef sl_DeviceEnablePreamble
116 sl_DeviceEnablePreamble();
120 (void)_SlDrvDriverCBInit();
125 g_pCB->FD = sl_IfOpen((
void *)pDevName, SL_IF_OPEN_FLAGS);
129 g_pCB->FD = (_SlFd_t)pIfHdl;
132 ObjIdx = _SlDrvProtectAsyncRespSetting((_u8 *)&AsyncRsp, START_STOP_ID, SL_MAX_SOCKETS);
134 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
136 return SL_POOL_IS_EMPTY;
139 if( g_pCB->FD >= (_SlFd_t)0)
143 DeviceCB.pIfHdl = pIfHdl;
144 DeviceCB.pDevName = pDevName;
147 SL_SET_DEVICE_START_IN_PROGRESS;
151 sl_IfRegIntHdlr((SL_P_EVENT_HANDLER)_SlDrvRxIrqHandler, NULL);
153 g_pCB->pInitCallback = pInitCallBack;
156 if (NULL == pInitCallBack)
159 _SlDrvSyncObjWaitForever(&g_pCB->ObjPool[ObjIdx].SyncObj);
161 SL_DRV_SYNC_OBJ_WAIT_TIMEOUT(&g_pCB->ObjPool[ObjIdx].SyncObj,
162 INIT_COMPLETE_TIMEOUT,
163 SL_OPCODE_DEVICE_INITCOMPLETE);
166 SL_UNSET_DEVICE_START_IN_PROGRESS;
168 SL_SET_DEVICE_STARTED;
171 _SlDrvReleasePoolObj(g_pCB->FunctionParams.AsyncExt.ActionIndex);
172 return _SlDeviceGetStartResponseConvert(AsyncRsp.Status);
176 return SL_RET_CODE_OK;
179 return SL_BAD_INTERFACE;
187 _SlReturnVal_t _SlDeviceHandleAsync_InitComplete(
void *pVoidBuf)
192 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
194 if(g_pCB->pInitCallback)
196 DeviceInitInfo.ChipId = pMsgArgs->ChipId;
197 DeviceInitInfo.MoreData = pMsgArgs->MoreData;
198 g_pCB->pInitCallback(_SlDeviceGetStartResponseConvert(pMsgArgs->Status), &DeviceInitInfo);
202 sl_Memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs,
sizeof(
InitComplete_t));
203 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
206 SL_DRV_PROTECTION_OBJ_UNLOCK();
207 if(g_pCB->pInitCallback)
209 SL_SET_DEVICE_STARTED;
210 SL_UNSET_DEVICE_START_IN_PROGRESS;
211 _SlDrvReleasePoolObj(g_pCB->FunctionParams.AsyncExt.ActionIndex);
216 return SL_OS_RET_CODE_OK;
224 void _SlDeviceHandleAsync_Stop(
void *pVoidBuf)
228 VERIFY_SOCKET_CB(NULL != g_pCB->StopCB.pAsyncRsp);
230 SL_DRV_PROTECTION_OBJ_LOCK_FOREVER();
232 if (g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs != NULL)
234 sl_Memcpy(g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].pRespArgs, pMsgArgs,
sizeof(
_BasicResponse_t));
235 SL_DRV_SYNC_OBJ_SIGNAL(&g_pCB->ObjPool[g_pCB->FunctionParams.AsyncExt.ActionIndex].SyncObj);
238 SL_DRV_PROTECTION_OBJ_UNLOCK();
255 SL_OPCODE_DEVICE_STOP_COMMAND,
260 #if _SL_INCLUDE_FUNC(sl_Stop)
266 _u8 ObjIdx = MAX_CONCURRENT_ACTIONS;
267 _u8 ReleasePoolObject = FALSE;
268 _u8 IsProvInProgress = FALSE;
278 && (!SL_IS_RESTART_REQUIRED)
283 Msg.Cmd.Timeout = Timeout;
285 IsProvInProgress = SL_IS_PROVISIONING_IN_PROGRESS;
288 if (!IsProvInProgress)
290 ObjIdx = _SlDrvProtectAsyncRespSetting((_u8 *)&AsyncRsp, START_STOP_ID, SL_MAX_SOCKETS);
291 if (MAX_CONCURRENT_ACTIONS == ObjIdx)
293 return SL_POOL_IS_EMPTY;
296 ReleasePoolObject = TRUE;
300 SL_SET_DEVICE_STOP_IN_PROGRESS;
302 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&_SlStopCmdCtrl, &Msg, NULL));
306 if((SL_OS_RET_CODE_OK == (_i16)Msg.Rsp.status) && (!(IsProvInProgress)))
310 _SlDrvSyncObjWaitForever(&g_pCB->ObjPool[ObjIdx].SyncObj);
313 SL_DRV_SYNC_OBJ_WAIT_TIMEOUT(&g_pCB->ObjPool[ObjIdx].SyncObj,
315 SL_OPCODE_DEVICE_STOP_ASYNC_RESPONSE);
319 Msg.Rsp.status = AsyncRsp.status;
320 RetVal = Msg.Rsp.status;
324 if (ReleasePoolObject == TRUE)
326 _SlDrvReleasePoolObj(ObjIdx);
332 WAIT_NWP_SHUTDOWN_READY;
337 SL_SET_DEVICE_STOP_IN_PROGRESS;
340 sl_IfRegIntHdlr(NULL, NULL);
342 RetVal = sl_IfClose(g_pCB->FD);
344 (void)_SlDrvDriverCBDeinit();
346 SL_UNSET_DEVICE_STOP_IN_PROGRESS;
360 }_SlEventMaskSetMsg_u;
365 #if _SL_INCLUDE_FUNC(sl_DeviceEventMaskSet)
369 SL_OPCODE_DEVICE_EVENTMASKSET,
377 _SlEventMaskSetMsg_u Msg;
381 VERIFY_API_ALLOWED(SL_OPCODE_SILO_DEVICE);
383 Msg.Cmd.Group = EventClass;
386 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&_SlEventMaskSetCmdCtrl, &Msg, NULL));
388 return (_i16)Msg.Rsp.status;
399 }_SlEventMaskGetMsg_u;
403 #if _SL_INCLUDE_FUNC(sl_DeviceEventMaskGet)
407 SL_OPCODE_DEVICE_EVENTMASKGET,
415 _SlEventMaskGetMsg_u Msg;
419 VERIFY_API_ALLOWED(SL_OPCODE_SILO_DEVICE);
421 Msg.Cmd.Group = EventClass;
423 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&_SlEventMaskGetCmdCtrl, &Msg, NULL));
425 *pMask = Msg.Rsp.Mask;
427 return SL_RET_CODE_OK;
445 #if _SL_INCLUDE_FUNC(sl_DeviceGet)
449 SL_OPCODE_DEVICE_DEVICEGET,
454 _i16
sl_DeviceGet(
const _u8 DeviceGetId, _u8 *pOption,_u16 *pConfigLen, _u8 *pValues)
456 _SlDeviceMsgGet_u Msg;
461 VERIFY_API_ALLOWED(SL_OPCODE_SILO_DEVICE);
463 if (*pConfigLen == 0)
471 _SlDrvResetCmdExt(&CmdExt);
472 CmdExt.RxPayloadLen = (_i16)*pConfigLen;
473 CmdExt.pRxPayload = (_u8 *)pValues;
475 Msg.Cmd.DeviceSetId = DeviceGetId;
477 Msg.Cmd.Option = (_u16)*pOption;
479 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&_SlDeviceGetCmdCtrl, &Msg, &CmdExt));
483 *pOption = (_u8)Msg.Rsp.Option;
486 if (CmdExt.RxPayloadLen < CmdExt.ActualRxPayloadLen)
488 *pConfigLen = (_u16)CmdExt.RxPayloadLen;
494 *pConfigLen = (_u16)CmdExt.ActualRxPayloadLen;
497 return (_i16)Msg.Rsp.Status;
501 return SL_RET_CODE_INVALID_INPUT;
517 #if _SL_INCLUDE_FUNC(sl_DeviceSet)
521 SL_OPCODE_DEVICE_DEVICESET,
526 _i16
sl_DeviceSet(
const _u8 DeviceSetId ,
const _u8 Option,
const _u16 ConfigLen,
const _u8 *pValues)
528 _SlDeviceMsgSet_u Msg;
533 VERIFY_API_ALLOWED(SL_OPCODE_SILO_DEVICE);
535 _SlDrvResetCmdExt(&CmdExt);
537 CmdExt.TxPayload1Len = (ConfigLen+3) & (~3);
538 CmdExt.pTxPayload1 = (_u8 *)pValues;
540 Msg.Cmd.DeviceSetId = DeviceSetId;
541 Msg.Cmd.ConfigLen = ConfigLen;
542 Msg.Cmd.Option = Option;
544 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&_SlDeviceSetCmdCtrl, &Msg, &CmdExt));
546 return (_i16)Msg.Rsp.status;
554 _SlReturnVal_t _SlDeviceEventHandler(
void* pEventInfo)
561 _SlDrvMemZero(&DeviceEvent,
sizeof(DeviceEvent));
563 switch(pHdr->GenHeader.Opcode)
565 case SL_OPCODE_DEVICE_INITCOMPLETE:
566 _SlDeviceHandleAsync_InitComplete(pHdr);
568 case SL_OPCODE_DEVICE_STOP_ASYNC_RESPONSE:
569 _SlDeviceHandleAsync_Stop(pHdr);
571 case SL_OPCODE_DEVICE_RESET_REQUEST_ASYNC_EVENT:
575 #if defined(slcb_DeviceGeneralEvtHdlr) || defined (EXT_LIB_REGISTERED_GENERAL_EVENTS)
576 if (pResetRequestData->Caller == SL_DEVICE_RESET_REQUEST_CALLER_PROVISIONING_EXTERNAL_CONFIGURATION)
579 DeviceEvent.Id = SL_DEVICE_EVENT_RESET_REQUEST;
580 DeviceEvent.Data.ResetRequest.Status = 0;
581 DeviceEvent.Data.ResetRequest.Caller = pResetRequestData->Caller;
582 _SlDrvHandleGeneralEvents(&DeviceEvent);
587 if (!_SlDrvIsApiInProgress() && SL_IS_PROVISIONING_IN_PROGRESS)
591 if (pResetRequestData->SessionNumber != DeviceCB.ResetRequestSessionNumber)
594 DeviceCB.ResetRequestSessionNumber = pResetRequestData->SessionNumber;
597 _SlDeviceHandleResetRequestInternally();
604 case SL_OPCODE_DEVICE_ABORT:
607 if (pInfo->bInCmdContext == TRUE)
609 SL_DRV_LOCK_GLOBAL_UNLOCK(TRUE);
613 _SlDrvHandleFatalError(SL_DEVICE_EVENT_FATAL_DEVICE_ABORT,
615 *((_u32*)pMsgArgs + 1));
620 case SL_OPCODE_DEVICE_DEVICE_ASYNC_GENERAL_ERROR:
622 #if defined(slcb_DeviceGeneralEvtHdlr) || defined (EXT_LIB_REGISTERED_GENERAL_EVENTS)
624 DeviceEvent.Id = SL_DEVICE_EVENT_ERROR;
625 DeviceEvent.Data.Error.Code = pMsgArgs->status;
626 DeviceEvent.Data.Error.Source = (SlDeviceSource_e)pMsgArgs->sender;
627 _SlDrvHandleGeneralEvents(&DeviceEvent);
632 case SL_OPCODE_DEVICE_FLOW_CTRL_ASYNC_EVENT:
633 _SlFlowContSet((
void *)pHdr);
636 SL_ERROR_TRACE2(MSG_306,
"ASSERT: _SlDeviceEventHandler : invalid opcode = 0x%x = %1", pHdr->GenHeader.Opcode, pHdr->GenHeader.Opcode);
639 return SL_OS_RET_CODE_OK;
643 void _SlDeviceResetRequestInitCompletedCB(_u32 Status,
SlDeviceInitInfo_t *DeviceInitInfo)
650 void _SlDeviceHandleResetRequestInternally(
void)
652 _u8 irqCountLast = RxIrqCnt;
653 #if (!defined (SL_TINY)) && (defined(slcb_GetTimestamp))
656 _SlDrvStartMeasureTimeout(&TimeoutInfo, 2*RESET_REQUEST_STOP_TIMEOUT);
661 sl_Stop(RESET_REQUEST_STOP_TIMEOUT);
667 #if (!defined (SL_TINY)) && (defined(slcb_GetTimestamp))
668 if (_SlDrvIsTimeoutExpired(&TimeoutInfo))
674 while((RxIrqCnt - irqCountLast) < 2);
677 sl_Start(DeviceCB.pIfHdl, DeviceCB.pDevName ,_SlDeviceResetRequestInitCompletedCB);
687 #ifdef SL_IF_TYPE_UART
692 }_SlUartSetModeMsg_u;
695 #if _SL_INCLUDE_FUNC(sl_DeviceUartSetMode)
700 SL_OPCODE_DEVICE_SETUARTMODECOMMAND,
707 _SlUartSetModeMsg_u Msg;
708 _u32 magicCode = (_u32)0xFFFFFFFF;
710 Msg.Cmd.BaudRate = pUartParams->BaudRate;
711 Msg.Cmd.FlowControlEnable = pUartParams->FlowControlEnable;
714 VERIFY_RET_OK(_SlDrvCmdOp((
_SlCmdCtrl_t *)&_SlUartSetModeCmdCtrl, &Msg, NULL));
717 if (SL_RET_CODE_OK == Msg.Rsp.status)
722 sl_IfClose(g_pCB->FD);
725 sl_IfOpen((
void * )pUartParams, SL_IF_UART_REOPEN_FLAGS);
727 sl_IfUnMaskIntHdlr();
730 sl_IfWrite(g_pCB->FD, (_u8* )&magicCode, 4);
732 magicCode = UART_SET_MODE_MAGIC_CODE;
733 sl_IfWrite(g_pCB->FD, (_u8* )&magicCode, 4);
739 sl_IfRead(g_pCB->FD, (_u8* )&magicCode, 4);
742 if (UART_SET_MODE_MAGIC_CODE != magicCode)
748 return (_i16)Msg.Rsp.status;
_i16 sl_DeviceEventMaskSet(const _u8 EventClass, const _u32 Mask)
Set asynchronous event mask.
_i16 sl_DeviceGet(const _u8 DeviceGetId, _u8 *pOption, _u16 *pConfigLen, _u8 *pValues)
Internal function for getting device configurations.
void * sl_Task(void *pEntry)
The SimpleLink task entry.
_i16 sl_DeviceSet(const _u8 DeviceSetId, const _u8 Option, const _u16 ConfigLen, const _u8 *pValues)
Setting device configurations.
_i16 sl_Stop(const _u16 Timeout)
Stop the SimpleLink device.
_i16 sl_DeviceEventMaskGet(const _u8 EventClass, _u32 *pMask)
Get current event mask of the device.
_i16 sl_DeviceUartSetMode(const SlDeviceUartIfParams_t *pUartParams)
Setting the internal uart mode.
_i16 sl_Start(const void *pIfHdl, _i8 *pDevName, const P_INIT_CALLBACK pInitCallBack)
Start the SimpleLink device.