SimpleLink CC3120/CC3220 Host Driver  Version 2.0.1.15
Simplifies the implementation of Internet connectivity
driver.h
1 /*
2  * Copyright (C) 2016 Texas Instruments Incorporated
3  *
4  * All rights reserved. Property of Texas Instruments Incorporated.
5  * Restricted rights to use, duplicate or disclose this code are
6  * granted through contract.
7  *
8  * The program may not be used without the written permission of
9  * Texas Instruments Incorporated or against the terms and conditions
10  * stipulated in the agreement under which this program has been supplied,
11  * and under no circumstances can it be used with non-TI connectivity device.
12  *
13  */
14 
15 #ifndef __DRIVER_INT_H__
16 #define __DRIVER_INT_H__
17 
18 #include <ti/drivers/net/wifi/source/protocol.h>
19 
20 #define TIMEOUT_STATE_EXPIRY (0)
21 #define TIMEOUT_ONE_MORE_SHOT (1)
22 #define TIMEOUT_STATE_INIT_VAL (2)
23 
24 /* Timeouts for the sync objects */
25 #ifndef SL_DRIVER_TIMEOUT_SHORT
26 #define SL_DRIVER_TIMEOUT_SHORT (10000) /* msec units */
27 #endif
28 #ifndef SL_DRIVER_TIMEOUT_LONG
29 #define SL_DRIVER_TIMEOUT_LONG (65535) /* msec units */
30 #endif
31 
32 #define INIT_COMPLETE_TIMEOUT SL_DRIVER_TIMEOUT_LONG
33 #define STOP_DEVICE_TIMEOUT SL_DRIVER_TIMEOUT_LONG
34 
35 #ifndef SYNC_PATTERN_TIMEOUT_IN_MSEC
36 #define SYNC_PATTERN_TIMEOUT_IN_MSEC (50) /* the sync patttern timeout in milliseconds units */
37 #endif
38 /*****************************************************************************/
39 /* Macro declarations */
40 /*****************************************************************************/
41 
42 #ifndef CPU_FREQ_IN_MHZ
43  #define CPU_FREQ_IN_MHZ (200)
44 #endif
45 #define USEC_DELAY (50)
46 
47 #define SL_DRV_PROTECTION_OBJ_UNLOCK() (void)_SlDrvProtectionObjUnLock();
48 #define SL_DRV_PROTECTION_OBJ_LOCK_FOREVER() (void)_SlDrvProtectionObjLockWaitForever();
49 #define SL_DRV_OBJ_UNLOCK(pObj) (void)_SlDrvObjUnLock(pObj);
50 #define SL_DRV_OBJ_LOCK_FOREVER(pObj) (void)_SlDrvObjLockWaitForever(pObj);
51 #define SL_DRV_SYNC_OBJ_SIGNAL(pObj) (void)_SlDrvSyncObjSignal(pObj);
52 #define SL_DRV_SYNC_OBJ_CLEAR(pObj) (void)sl_SyncObjWait(pObj,SL_OS_NO_WAIT);
53 
54 
55 #ifdef SL_TINY
56 #define SL_DRV_SYNC_OBJ_WAIT_FOREVER(SyncObj) (void)_SlDrvSyncObjWaitForever(SyncObj);
57 #define SL_DRV_LOCK_GLOBAL_LOCK_FOREVER(Flags) (void)_SlDrvObjGlobalLockWaitForever(Flags);
58 #define SL_DRV_LOCK_GLOBAL_UNLOCK(bDecrementApiInProgress) (void)_SlDrvGlobalObjUnLock(bDecrementApiInProgress);
59 #else
60 #define SL_DRV_SYNC_OBJ_WAIT_FOREVER(SyncObj) { \
61 if (SL_API_ABORTED == _SlDrvSyncObjWaitForever(SyncObj)) \
62 { \
63  return SL_API_ABORTED; \
64 } \
65 }
66 #define SL_DRV_SYNC_OBJ_WAIT_TIMEOUT(SyncObj, timeoutVal, opcode) { \
67 if (SL_API_ABORTED == _SlDrvSyncObjWaitTimeout(SyncObj, timeoutVal, opcode)) \
68 { \
69  return SL_API_ABORTED; \
70 } \
71 }
72 #define SL_DRV_LOCK_GLOBAL_LOCK_FOREVER(Flags) { \
73 _SlReturnVal_t retVal; \
74  \
75 retVal = _SlDrvObjGlobalLockWaitForever(Flags); \
76 if (retVal) \
77 { \
78  return retVal; \
79 } \
80 }
81 
82 #define SL_DRV_LOCK_GLOBAL_UNLOCK(bDecrementApiInProgress) { \
83 _SlReturnVal_t retVal; \
84  \
85 retVal = _SlDrvGlobalObjUnLock(bDecrementApiInProgress); \
86 if (retVal) \
87 { \
88  return retVal; \
89 } \
90 }
91 #endif
92 
93 #define SL_IS_RESTART_REQUIRED (g_SlDeviceStatus & _SL_DRV_STATUS_BIT_RESTART_REQUIRED) /* bit 8 indicates restart is required due to fatal error */
94 #define SL_IS_DEVICE_STARTED (g_SlDeviceStatus & _SL_DRV_STATUS_BIT_DEVICE_STARTED) /* bit 9 indicates device is started */
95 #define SL_IS_DEVICE_LOCKED (g_SlDeviceStatus & _SL_DEV_STATUS_BIT_LOCKED) /* bits 0-7 devStatus from NWP, bit 2 = device locked */
96 #define SL_IS_PROVISIONING_ACTIVE (!!(g_SlDeviceStatus & _SL_DEV_STATUS_BIT_PROVISIONING_ACTIVE)) /* bits 0-7 devStatus from NWP, bit 3 = provisioning active */
97 #define SL_IS_PROVISIONING_INITIATED_BY_USER (!!(g_SlDeviceStatus & _SL_DEV_STATUS_BIT_PROVISIONING_USER_INITIATED)) /* bits 0-7 devStatus from NWP, bit 4 = provisioning initiated by the user */
98 #define SL_IS_PROVISIONING_API_ALLOWED (!!(g_SlDeviceStatus & _SL_DEV_STATUS_BIT_PROVISIONING_ENABLE_API))
99 #define SL_IS_DEVICE_STOP_IN_PROGRESS (!!(g_SlDeviceStatus & _SL_DRV_STATUS_BIT_STOP_IN_PROGRESS))
100 #define SL_IS_DEVICE_START_IN_PROGRESS (!!(g_SlDeviceStatus & _SL_DRV_STATUS_BIT_START_IN_PROGRESS))
101 
102 #define SL_IS_PROVISIONING_IN_PROGRESS (!!(g_SlDeviceStatus & ( _SL_DEV_STATUS_BIT_PROVISIONING_USER_INITIATED | _SL_DEV_STATUS_BIT_PROVISIONING_ACTIVE)))
103 /* Check the following conditions:
104  1. Device started
105  2. Restart device is not required
106  3. Provisioning is active
107  4. Provisioning was already initiated by the user
108  5. Device is not locked
109 */
110 #define SL_IS_COMMAND_ALLOWED ((g_SlDeviceStatus & (_SL_DRV_STATUS_BIT_DEVICE_STARTED | \
111  _SL_DRV_STATUS_BIT_RESTART_REQUIRED | \
112  _SL_DEV_STATUS_BIT_PROVISIONING_ACTIVE | \
113  _SL_DEV_STATUS_BIT_PROVISIONING_USER_INITIATED | \
114  _SL_DRV_STATUS_BIT_STOP_IN_PROGRESS | \
115  _SL_DEV_STATUS_BIT_LOCKED)) == 0x200)
116 
117 #define SL_SET_RESTART_REQUIRED (g_SlDeviceStatus |= _SL_DRV_STATUS_BIT_RESTART_REQUIRED) /* bit 8 indicates restart is required due to fatal error */
118 #define SL_UNSET_RESTART_REQUIRED (g_SlDeviceStatus &= (~_SL_DRV_STATUS_BIT_RESTART_REQUIRED)) /* bit 8 indicates restart is required due to fatal error */
119 #define SL_SET_DEVICE_STARTED (g_SlDeviceStatus |= _SL_DRV_STATUS_BIT_DEVICE_STARTED) /* bit 9 indicates device is started */
120 #define SL_UNSET_DEVICE_STARTED (g_SlDeviceStatus &= (~_SL_DRV_STATUS_BIT_DEVICE_STARTED)) /* bit 9 indicates device is started */
121 
122 #define SL_SET_DEVICE_STOP_IN_PROGRESS (g_SlDeviceStatus |= _SL_DRV_STATUS_BIT_STOP_IN_PROGRESS) /* bit 10 indicates there is stop in progress */
123 #define SL_UNSET_DEVICE_STOP_IN_PROGRESS (g_SlDeviceStatus &= (~_SL_DRV_STATUS_BIT_STOP_IN_PROGRESS)) /* bit 10 indicates there is stop in progress */
124 
125 /* Start in progress */
126 #define SL_SET_DEVICE_START_IN_PROGRESS (g_SlDeviceStatus |= _SL_DRV_STATUS_BIT_START_IN_PROGRESS) /* bit 11 indicates there is start in progress */
127 #define SL_UNSET_DEVICE_START_IN_PROGRESS (g_SlDeviceStatus &= (~_SL_DRV_STATUS_BIT_START_IN_PROGRESS)) /* bit 11 indicates there is start in progress */
128 
129 
130 #define SL_SET_DEVICE_STATUS(x) (g_SlDeviceStatus = ((g_SlDeviceStatus & 0xFF00) | (_u16)x) ) /* bits 0-7 devStatus from NWP */
131 
132 #define _SL_PENDING_RX_MSG(pDriverCB) (RxIrqCnt != (pDriverCB)->RxDoneCnt)
133 
134 /*****************************************************************************/
135 /* Structure/Enum declarations */
136 /*****************************************************************************/
137 
138 typedef struct
139 {
140  _u32 TSPrev;
141  _u32 TSCurr;
142  _u32 DeltaTicks;
143  _u32 DeltaTicksReminder;
144  _i32 Total10MSecUnits;
146 
147 
148 typedef struct
149 {
150  _u8 *pAsyncMsgBuff;
151  _u8 bInCmdContext;
153 
154 typedef struct
155 {
156  _SlOpcode_t Opcode;
157  _SlArgSize_t TxDescLen;
158  _SlArgSize_t RxDescLen;
159 }_SlCmdCtrl_t;
160 
161 typedef struct
162 {
163  _u16 TxPayload1Len;
164  _u16 TxPayload2Len;
165  _i16 RxPayloadLen;
166  _i16 ActualRxPayloadLen;
167  _u8 *pTxPayload1;
168  _u8 *pTxPayload2;
169  _u8 *pRxPayload;
170 }_SlCmdExt_t;
171 
172 
173 typedef struct _SlArgsData_t
174 {
175  _u8 *pArgs;
176  _u8 *pData;
177 } _SlArgsData_t;
178 
179 
180 typedef struct _SlPoolObj_t
181 {
182  _SlSyncObj_t SyncObj;
183  _u8 *pRespArgs;
184  _u8 ActionID;
185  _u8 AdditionalData; /* use for socketID and one bit which indicate supprt IPV6 or not (1=support, 0 otherwise) */
186  _u8 NextIndex;
187 
188 } _SlPoolObj_t;
189 
190 
191 typedef enum
192 {
193  SOCKET_0,
194  SOCKET_1,
195  SOCKET_2,
196  SOCKET_3,
197  SOCKET_4,
198  SOCKET_5,
199  SOCKET_6,
200  SOCKET_7,
201  SOCKET_8,
202  SOCKET_9,
203  SOCKET_10,
204  SOCKET_11,
205  SOCKET_12,
206  SOCKET_13,
207  SOCKET_14,
208  SOCKET_15,
209  MAX_SOCKET_ENUM_IDX,
210 #ifndef SL_TINY
211  ACCEPT_ID = MAX_SOCKET_ENUM_IDX,
212  CONNECT_ID,
213 #else
214  CONNECT_ID = MAX_SOCKET_ENUM_IDX,
215 #endif
216 #ifndef SL_TINY
217  SELECT_ID,
218 #endif
219  GETHOSYBYNAME_ID,
220 #ifndef SL_TINY
221  GETHOSYBYSERVICE_ID,
222  PING_ID,
223  NETAPP_RECEIVE_ID,
224 #endif
225  START_STOP_ID,
226  NETUTIL_CMD_ID,
227  CLOSE_ID,
228  /**********/
229  RECV_ID /* Please note!! this member must be the last in this action enum */
230 }_SlActionID_e;
231 
232 typedef struct _SlActionLookup_t
233 {
234  _u8 ActionID;
235  _u16 ActionAsyncOpcode;
236  _SlSpawnEntryFunc_t AsyncEventHandler;
237 
239 
240 
241 typedef struct
242 {
243  _u8 TxPoolCnt;
244  _u16 MinTxPayloadSize;
245  _SlLockObj_t TxLockObj;
246  _SlSyncObj_t TxSyncObj;
248 
249 typedef enum
250 {
251  RECV_RESP_CLASS,
252  CMD_RESP_CLASS,
253  ASYNC_EVT_CLASS,
254  DUMMY_MSG_CLASS
255 }_SlRxMsgClass_e;
256 
257 typedef struct
258 {
259  _u8 *pAsyncBuf; /* place to write pointer to buffer with CmdResp's Header + Arguments */
260  _u8 ActionIndex;
261  _SlSpawnEntryFunc_t AsyncEvtHandler; /* place to write pointer to AsyncEvent handler (calc-ed by Opcode) */
262  _SlRxMsgClass_e RxMsgClass; /* type of Rx message */
263 } AsyncExt_t;
264 
265 typedef _u8 _SlSd_t;
266 
267 typedef struct
268 {
269  _SlCmdCtrl_t *pCmdCtrl;
270  _u8 *pTxRxDescBuff;
271  _SlCmdExt_t *pCmdExt;
272  AsyncExt_t AsyncExt;
274 
275 
276 typedef enum
277 {
278  SOCK_TRIGGER_READY,
279  SOCK_TRIGGER_WAITING_FOR_RESP,
280  SOCK_TRIGGER_RESP_RECEIVED
281 
282 } _SlSockTriggerState_e;
283 
284 
285 typedef struct
286 {
287  _SlSockTriggerState_e State;
288  _u8 ObjPoolIdx;
290 
291 typedef struct
292 {
296 
297 
298 #ifdef SL_INC_INTERNAL_ERRNO
299 
300 #define SL_DRVER_ERRNO_FLAGS_UNREAD (1)
301 
302 typedef struct
303 {
304 #ifdef SL_PLATFORM_MULTI_THREADED
305  _i32 Id;
306 #endif
307  _i32 Errno;
308 #ifdef SL_PLATFORM_MULTI_THREADED
309  _u8 Index;
310  _u8 Flags;
311 #endif
312 
314 #endif
315 typedef struct
316 {
317  _SlFd_t FD;
318  _SlCommandHeader_t TempProtocolHeader;
319  P_INIT_CALLBACK pInitCallback;
320 
321  _SlPoolObj_t ObjPool[MAX_CONCURRENT_ACTIONS];
322  _u8 FreePoolIdx;
323  _u8 PendingPoolIdx;
324  _u8 ActivePoolIdx;
325  _u32 ActiveActionsBitmap;
326  _SlLockObj_t ProtectionLockObj;
327 
328  _SlSyncObj_t CmdSyncObj;
329  _u8 WaitForCmdResp;
330  _SlFlowContCB_t FlowContCB;
331  _u8 TxSeqNum;
332  _u8 RxDoneCnt;
333  _u16 SocketNonBlocking;
334  _u16 SocketTXFailure;
335  /* for stack reduction the parameters are globals */
336  _SlFunctionParams_t FunctionParams;
337 
338  _u8 ActionIndex;
339  _i8 ApiInProgressCnt; /* Counts how many APIs are in progress */
340 
341 #if ((defined(SL_RUNTIME_EVENT_REGISTERATION) || defined(slcb_SocketTriggerEventHandler)))
342  _SlSockTriggerSelect_t SocketTriggerSelect;
343 #endif
344 #ifdef SL_INC_INTERNAL_ERRNO
345  _SlDrvErrno_t Errno[MAX_CONCURRENT_ACTIONS];
346 #ifdef SL_PLATFORM_MULTI_THREADED
347  _SlLockObj_t ErrnoLockObj;
348  _u8 ErrnoIndex;
349 #endif
350 #endif
351 
353 
354 extern _volatile _u8 RxIrqCnt;
355 
356 extern _SlLockObj_t GlobalLockObj;
357 extern _u16 g_SlDeviceStatus;
358 
359 extern _SlDriverCb_t* g_pCB;
360 extern P_SL_DEV_PING_CALLBACK pPingCallBackFunc;
361 
362 /*****************************************************************************/
363 /* Function prototypes */
364 /*****************************************************************************/
365 extern _SlReturnVal_t _SlDrvDriverCBInit(void);
366 extern _SlReturnVal_t _SlDrvDriverCBDeinit(void);
367 extern _SlReturnVal_t _SlDrvRxIrqHandler(void *pValue);
368 extern _SlReturnVal_t _SlDrvCmdOp(_SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);
369 extern _SlReturnVal_t _SlDrvCmdSend_noLock(_SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);
370 extern _SlReturnVal_t _SlDrvCmdSend(_SlCmdCtrl_t *pCmdCtrl , void *pTxRxDescBuff , _SlCmdExt_t *pCmdExt);
371 extern _SlReturnVal_t _SlDrvDataReadOp(_SlSd_t Sd, _SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);
372 extern _SlReturnVal_t _SlDrvDataWriteOp(_SlSd_t Sd, _SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);
373 extern _SlReturnVal_t _SlDeviceHandleAsync_InitComplete(void *pVoidBuf);
374 extern _SlReturnVal_t _SlSocketHandleAsync_Connect(void *pVoidBuf);
375 extern _SlReturnVal_t _SlSocketHandleAsync_Close(void *pVoidBuf);
376 extern _SlReturnVal_t _SlDrvGlobalObjUnLock(_u8 bDecrementApiInProgress);
377 extern _SlReturnVal_t _SlDrvDriverIsApiAllowed(_u16 Silo);
378 extern _SlReturnVal_t _SlDrvMsgReadSpawnCtx(void *pValue);
379 
380 
381 #ifndef SL_TINY
382 extern _i16 _SlDrvBasicCmd(_SlOpcode_t Opcode);
383 extern _SlReturnVal_t _SlSocketHandleAsync_Accept(void *pVoidBuf);
384 extern _SlReturnVal_t _SlNetAppHandleAsync_DnsGetHostByService(void *pVoidBuf);
385 extern _SlReturnVal_t _SlSocketHandleAsync_Select(void *pVoidBuf);
386 
387 #ifdef slcb_GetTimestamp
388 extern void _SlDrvStartMeasureTimeout(_SlTimeoutParams_t *pTimeoutInfo, _u32 TimeoutInMsec);
389 extern _u8 _SlDrvIsTimeoutExpired(_SlTimeoutParams_t *pTimeoutInfo);
390 extern void _SlDrvSleep(_u16 DurationInMsec);
391 #endif
392 
393 #endif
394 
395 
396 extern _SlReturnVal_t _SlNetAppHandleAsync_DnsGetHostByName(void *pVoidBuf);
397 extern _SlReturnVal_t _SlNetAppHandleAsync_DnsGetHostByAddr(void *pVoidBuf);
398 extern _SlReturnVal_t _SlNetAppHandleAsync_PingResponse(void *pVoidBuf);
399 extern _SlReturnVal_t _SlNetAppEventHandler(void* pArgs);
400 
401 #if defined(slcb_NetAppHttpServerHdlr) || defined(EXT_LIB_REGISTERED_HTTP_SERVER_EVENTS)
402 extern void _SlDrvDispatchHttpServerEvents(SlNetAppHttpServerEvent_t *slHttpServerEvent, SlNetAppHttpServerResponse_t *slHttpServerResponse);
403 #endif
404 
405 #if defined(slcb_NetAppRequestHdlr) || defined(EXT_LIB_REGISTERED_NETAPP_REQUEST_EVENTS)
406 extern void _SlDrvDispatchNetAppRequestEvents(SlNetAppRequest_t *slNetAppRequestEvent, SlNetAppResponse_t *slNetAppResponse);
407 #endif
408 
409 extern void _SlDeviceHandleAsync_Stop(void *pVoidBuf);
410 extern void _SlNetUtilHandleAsync_Cmd(void *pVoidBuf);
411 extern _u8 _SlDrvWaitForPoolObj(_u8 ActionID, _u8 SocketID);
412 extern void _SlDrvReleasePoolObj(_u8 pObj);
413 extern _u16 _SlDrvAlignSize(_u16 msgLen);
414 extern _u8 _SlDrvProtectAsyncRespSetting(_u8 *pAsyncRsp, _SlActionID_e ActionID, _u8 SocketID);
415 extern void _SlNetAppHandleAsync_NetAppReceive(void *pVoidBuf);
416 
417 
418 extern _SlReturnVal_t _SlDeviceEventHandler(void* pEventInfo);
419 extern _SlReturnVal_t _SlDrvSyncObjWaitForever(_SlSyncObj_t *pSyncObj);
420 extern _SlReturnVal_t _SlDrvObjLockWaitForever(_SlLockObj_t *pLockObj);
421 extern _SlReturnVal_t _SlDrvSyncObjWaitTimeout(_SlSyncObj_t *pSyncObj,
422  _u32 timeoutVal,
423  _u32 asyncEventOpcode);
424 
425 extern _SlReturnVal_t _SlDrvSyncObjSignal(_SlSyncObj_t *pSyncObj);
426 extern _SlReturnVal_t _SlDrvObjLock(_SlLockObj_t *pLockObj, _SlTime_t Timeout);
427 extern _SlReturnVal_t _SlDrvProtectionObjLockWaitForever(void);
428 extern _SlReturnVal_t _SlDrvObjUnLock(_SlLockObj_t *pLockObj);
429 extern _SlReturnVal_t _SlDrvProtectionObjUnLock(void);
430 
431 extern void _SlDrvMemZero(void* Addr, _u16 size);
432 extern void _SlDrvResetCmdExt(_SlCmdExt_t* pCmdExt);
433 
434 extern _i8 _SlDrvIsApiInProgress(void);
435 extern void _SlDrvHandleResetRequest(const void* pIfHdl, _i8* pDevName);
436 
437 #ifndef SL_TINY
438 extern void _SlDrvHandleFatalError(_u32 errorId, _u32 info1, _u32 info2);
439 extern void _SlDrvHandleAssert(void);
440 
441 #endif
442 
443 _i32 _SlDrvSetErrno(_i32 Errno);
444 _i32* _SlDrvallocateErrno(_i32 Errno);
445 
446 #ifndef SL_INC_INTERNAL_ERRNO
447 extern int slcb_SetErrno(int Errno);
448 #endif
449 
450 #define _SL_PROTOCOL_ALIGN_SIZE(msgLen) (((msgLen)+3) & (~3))
451 #define _SL_IS_PROTOCOL_ALIGNED_SIZE(msgLen) (!((msgLen) & 3))
452 
453 
454 #define _SL_PROTOCOL_CALC_LEN(pCmdCtrl,pCmdExt) ((pCmdExt) ? \
455  (_SL_PROTOCOL_ALIGN_SIZE(pCmdCtrl->TxDescLen) + _SL_PROTOCOL_ALIGN_SIZE(pCmdExt->TxPayload1Len + pCmdExt->TxPayload2Len)) : \
456  (_SL_PROTOCOL_ALIGN_SIZE(pCmdCtrl->TxDescLen)))
457 #endif /* __DRIVER_INT_H__ */