Port of TI's CC3100 Websock camera demo. Using FreeRTOS, mbedTLS, also parts of Arducam for cams ov5642 and 0v2640. Can also use MT9D111. Work in progress. Be warned some parts maybe a bit flacky. This is for Seeed Arch max only, for an M3, see the demo for CM3 using the 0v5642 aducam mini.

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers cc3100_driver.h Source File

cc3100_driver.h

00001 /*
00002  * driver.h - CC31xx/CC32xx Host Driver Implementation
00003  *
00004  * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
00005  *
00006  *
00007  *  Redistribution and use in source and binary forms, with or without
00008  *  modification, are permitted provided that the following conditions
00009  *  are met:
00010  *
00011  *    Redistributions of source code must retain the above copyright
00012  *    notice, this list of conditions and the following disclaimer.
00013  *
00014  *    Redistributions in binary form must reproduce the above copyright
00015  *    notice, this list of conditions and the following disclaimer in the
00016  *    documentation and/or other materials provided with the
00017  *    distribution.
00018  *
00019  *    Neither the name of Texas Instruments Incorporated nor the names of
00020  *    its contributors may be used to endorse or promote products derived
00021  *    from this software without specific prior written permission.
00022  *
00023  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00024  *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00025  *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
00026  *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
00027  *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00028  *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00029  *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
00030  *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
00031  *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00032  *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
00033  *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00034  *
00035 */
00036 
00037 #ifndef DRIVER_INT_H_
00038 #define DRIVER_INT_H_
00039 
00040 #include "mbed.h"
00041 #include "cc3100_simplelink.h"
00042 #include "cc3100_user.h"
00043 
00044 #include "cc3100_protocol.h"
00045 #include "cc3100_spi.h"
00046 //#include "cc3100_nonos.h"
00047 #include "cc3100_netapp.h"
00048 //#include "cc3100.h"
00049 
00050 //#ifdef SL_PLATFORM_MULTI_THREADED
00051 #if (defined (SL_PLATFORM_MULTI_THREADED)) || (defined (SL_PLATFORM_EXTERNAL_SPAWN))
00052 #include "osi.h"
00053 #endif
00054 
00055 /*****************************************************************************/
00056 /* Macro declarations                                                        */
00057 /*****************************************************************************/
00058 
00059 /*  2 LSB of the N2H_SYNC_PATTERN are for sequence number
00060 only in SPI interface
00061 support backward sync pattern */
00062 #define N2H_SYNC_PATTERN_SEQ_NUM_BITS            ((uint32_t)0x00000003) /* Bits 0..1    - use the 2 LBS for seq num */
00063 #define N2H_SYNC_PATTERN_SEQ_NUM_EXISTS          ((uint32_t)0x00000004) /* Bit  2       - sign that sequence number exists in the sync pattern */
00064 #define N2H_SYNC_PATTERN_MASK                    ((uint32_t)0xFFFFFFF8) /* Bits 3..31   - constant SYNC PATTERN */
00065 #define N2H_SYNC_SPI_BUGS_MASK                   ((uint32_t)0x7FFF7F7F) /* Bits 7,15,31 - ignore the SPI (8,16,32 bites bus) error bits  */
00066 #define BUF_SYNC_SPIM(pBuf)                      ((*(uint32_t *)(pBuf)) & N2H_SYNC_SPI_BUGS_MASK)
00067 #define N2H_SYNC_SPIM                            (N2H_SYNC_PATTERN    & N2H_SYNC_SPI_BUGS_MASK)
00068 #define N2H_SYNC_SPIM_WITH_SEQ(TxSeqNum)         ((N2H_SYNC_SPIM & N2H_SYNC_PATTERN_MASK) | N2H_SYNC_PATTERN_SEQ_NUM_EXISTS | ((TxSeqNum) & (N2H_SYNC_PATTERN_SEQ_NUM_BITS)))
00069 #define MATCH_WOUT_SEQ_NUM(pBuf)                 ( BUF_SYNC_SPIM(pBuf) ==  N2H_SYNC_SPIM )
00070 #define MATCH_WITH_SEQ_NUM(pBuf, TxSeqNum)       ( BUF_SYNC_SPIM(pBuf) == (N2H_SYNC_SPIM_WITH_SEQ(TxSeqNum)) )
00071 #define N2H_SYNC_PATTERN_MATCH(pBuf, TxSeqNum) \
00072     ( \
00073     (  (*((uint32_t *)pBuf) & N2H_SYNC_PATTERN_SEQ_NUM_EXISTS) && ( MATCH_WITH_SEQ_NUM(pBuf, TxSeqNum) ) )  || \
00074     ( !(*((uint32_t *)pBuf) & N2H_SYNC_PATTERN_SEQ_NUM_EXISTS) && ( MATCH_WOUT_SEQ_NUM(pBuf          ) ) )     \
00075     )
00076 
00077 #define OPCODE(_ptr)          (((_SlResponseHeader_t *)(_ptr))->GenHeader.Opcode)
00078 #define RSP_PAYLOAD_LEN(_ptr) (((_SlResponseHeader_t *)(_ptr))->GenHeader.Len - _SL_RESP_SPEC_HDR_SIZE)
00079 #define SD(_ptr)              (((_SocketAddrResponse_u *)(_ptr))->IpV4.sd)
00080 /*  Actual size of Recv/Recvfrom response data  */
00081 #define ACT_DATA_SIZE(_ptr)   (((_SocketAddrResponse_u *)(_ptr))->IpV4.statusOrLen)
00082 
00083 #define _SL_PROTOCOL_ALIGN_SIZE(msgLen)             (((msgLen)+3) & (~3))
00084 #define _SL_IS_PROTOCOL_ALIGNED_SIZE(msgLen)        (!((msgLen) & 3))
00085 #define _SL_PROTOCOL_CALC_LEN(pCmdCtrl,pCmdExt)     ((pCmdExt) ? \
00086                                                      (_SL_PROTOCOL_ALIGN_SIZE(pCmdCtrl->TxDescLen) + _SL_PROTOCOL_ALIGN_SIZE(pCmdExt->TxPayloadLen)) : \
00087                                                      (_SL_PROTOCOL_ALIGN_SIZE(pCmdCtrl->TxDescLen)))
00088                                                      
00089 
00090 namespace mbed_cc3100 {
00091     
00092 //class cc3100;
00093     
00094 /*****************************************************************************/
00095 /* Structure/Enum declarations                                               */
00096 /*****************************************************************************/
00097 //typedef void(*_SlSpawnEntryFunc_t)(void* pValue);
00098 
00099 typedef struct {
00100     _SlOpcode_t      Opcode;
00101     _SlArgSize_t     TxDescLen;
00102     _SlArgSize_t     RxDescLen;
00103 } _SlCmdCtrl_t;
00104 
00105 typedef struct {
00106     uint16_t  TxPayloadLen;
00107     int16_t   RxPayloadLen;
00108     int16_t   ActualRxPayloadLen;
00109     uint8_t   *pTxPayload;
00110     uint8_t   *pRxPayload;
00111 } _SlCmdExt_t;
00112 
00113 
00114 typedef struct _SlArgsData_t {
00115     uint8_t  *pArgs;
00116     uint8_t  *pData;
00117 } _SlArgsData_t;
00118 
00119 typedef struct {     
00120     _SlSyncObj_t          SyncObj;    
00121     uint8_t               *pRespArgs;
00122     uint8_t               ActionID;
00123     uint8_t               AdditionalData; /* use for socketID and one bit which indicate supprt IPV6 or not (1=support, 0 otherwise) */
00124     uint8_t               NextIndex;
00125 
00126 } _SlPoolObj_t;
00127 
00128 
00129 typedef enum {
00130     SOCKET_0,
00131     SOCKET_1,
00132     SOCKET_2,
00133     SOCKET_3,
00134     SOCKET_4,
00135     SOCKET_5,
00136     SOCKET_6,
00137     SOCKET_7,
00138     MAX_SOCKET_ENUM_IDX,
00139 #ifndef SL_TINY_EXT    
00140     ACCEPT_ID = MAX_SOCKET_ENUM_IDX,
00141     CONNECT_ID,
00142 #else
00143     CONNECT_ID = MAX_SOCKET_ENUM_IDX,
00144 #endif
00145 #ifndef SL_TINY_EXT    
00146     SELECT_ID,
00147 #endif
00148     GETHOSYBYNAME_ID,
00149 #ifndef SL_TINY_EXT    
00150     GETHOSYBYSERVICE_ID,
00151     PING_ID,
00152 #endif  
00153     START_STOP_ID,
00154     RECV_ID
00155 } _SlActionID_e;
00156 
00157 typedef struct _SlActionLookup_t {
00158     uint8_t                 ActionID;
00159     uint16_t                ActionAsyncOpcode;
00160     _SlSpawnEntryFunc_t     AsyncEventHandler;
00161 
00162 } _SlActionLookup_t;
00163 
00164 
00165 typedef struct {
00166     uint8_t         TxPoolCnt;    
00167     _SlLockObj_t    TxLockObj;
00168     _SlSyncObj_t    TxSyncObj;
00169 } _SlFlowContCB_t;
00170 
00171 typedef enum {
00172     RECV_RESP_CLASS,
00173     CMD_RESP_CLASS,
00174     ASYNC_EVT_CLASS,
00175     DUMMY_MSG_CLASS
00176 } _SlRxMsgClass_e;
00177 
00178 typedef struct {
00179     uint8_t                 *pAsyncBuf;         /* place to write pointer to buffer with CmdResp's Header + Arguments */
00180     uint8_t                 ActionIndex;
00181     _SlSpawnEntryFunc_t     AsyncEvtHandler;    /* place to write pointer to AsyncEvent handler (calc-ed by Opcode)   */
00182     _SlRxMsgClass_e         RxMsgClass;         /* type of Rx message                                                 */
00183 } AsyncExt_t;
00184 
00185 typedef struct {
00186     _SlCmdCtrl_t         *pCmdCtrl;
00187     uint8_t              *pTxRxDescBuff;
00188     _SlCmdExt_t          *pCmdExt;
00189     AsyncExt_t           AsyncExt;
00190 } _SlFunctionParams_t;
00191 
00192 typedef void (*P_INIT_CALLBACK)(uint32_t Status);
00193 
00194 typedef struct {
00195     _SlFd_t                    FD;
00196     _SlLockObj_t               GlobalLockObj;
00197     _SlCommandHeader_t         TempProtocolHeader;
00198     P_INIT_CALLBACK            pInitCallback;
00199 
00200     _SlPoolObj_t               ObjPool[MAX_CONCURRENT_ACTIONS];
00201     uint8_t                    FreePoolIdx;
00202     uint8_t                    PendingPoolIdx;
00203     uint8_t                    ActivePoolIdx;
00204     uint32_t                   ActiveActionsBitmap;
00205     _SlLockObj_t               ProtectionLockObj;
00206 
00207     _SlSyncObj_t               CmdSyncObj;
00208     uint8_t                    IsCmdRespWaited;
00209     _SlFlowContCB_t            FlowContCB;
00210     uint8_t                    TxSeqNum;
00211     uint8_t                    RxDoneCnt;
00212     uint8_t                    SocketNonBlocking;
00213     uint8_t                    SocketTXFailure;
00214     /* for stack reduction the parameters are globals */
00215     _SlFunctionParams_t        FunctionParams;
00216 
00217     uint8_t                    ActionIndex;
00218 }_SlDriverCb_t;
00219 
00220 extern volatile uint8_t RxIrqCnt;
00221 
00222 extern _SlDriverCb_t* g_pCB;
00223 typedef uint8_t _SlSd_t;
00224 
00225 class cc3100_driver
00226 {
00227 
00228 public:
00229 
00230 //#ifndef SL_PLATFORM_MULTI_THREADED
00231 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))
00232     cc3100_driver(cc3100_spi &spi, cc3100_nonos &nonos, cc3100_netapp &netapp, cc3100_flowcont &flowcont);
00233 #else 
00234     cc3100_driver(cc3100_spi &spi, cc3100_netapp &netapp, cc3100_flowcont &flowcont);
00235 #endif
00236     ~cc3100_driver();
00237 
00238 
00239     /*****************************************************************************/
00240     /* Function prototypes                                                       */
00241     /*****************************************************************************/
00242     typedef _SlDriverCb_t pDriver;
00243     
00244     uint8_t _SlDrvProtectAsyncRespSetting(uint8_t *pAsyncRsp, uint8_t ActionID, uint8_t SocketID);
00245     
00246     bool _SL_PENDING_RX_MSG(pDriver* pDriverCB);
00247     
00248     void _SlDrvDriverCBInit(void);
00249 
00250     void _SlDrvDriverCBDeinit(void);
00251 
00252     void _SlDrvRxIrqHandler(void *pValue);
00253 
00254     _SlReturnVal_t  _SlDrvCmdOp(_SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);
00255 
00256     _SlReturnVal_t  _SlDrvCmdSend(_SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);
00257 
00258     _SlReturnVal_t  _SlDrvDataReadOp(_SlSd_t Sd, _SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);
00259 
00260     _SlReturnVal_t  _SlDrvDataWriteOp(_SlSd_t Sd, _SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);
00261 #ifndef SL_TINY_EXT
00262     int16_t  _SlDrvBasicCmd(_SlOpcode_t Opcode);
00263 #endif
00264     uint8_t _SlDrvWaitForPoolObj(uint8_t ActionID, uint8_t SocketID);
00265 
00266     void _SlDrvReleasePoolObj(uint8_t pObj);
00267 
00268 //    void _SlDrvObjInit(void);
00269 
00270     _SlReturnVal_t   _SlDrvMsgRead(void);
00271     
00272     _SlReturnVal_t   _SlDrvMsgWrite(_SlCmdCtrl_t  *pCmdCtrl,_SlCmdExt_t  *pCmdExt, uint8_t *pTxRxDescBuff);
00273 
00274  //   _SlReturnVal_t   _SlDrvMsgWrite(void);
00275 
00276     _SlReturnVal_t   _SlDrvMsgReadCmdCtx(void);
00277 
00278     _SlReturnVal_t   _SlDrvMsgReadSpawnCtx_(void *pValue);
00279 
00280     void             _SlDrvClassifyRxMsg(_SlOpcode_t Opcode );
00281 
00282     _SlReturnVal_t   _SlDrvRxHdrRead(uint8_t *pBuf, uint8_t *pAlignSize);
00283 
00284     void             _SlDrvShiftDWord(uint8_t *pBuf);
00285 
00286     void             _SlAsyncEventGenericHandler(void);
00287 
00288     void             _SlDrvObjDeInit(void);
00289 
00290     void             _SlRemoveFromList(uint8_t* ListIndex, uint8_t ItemIndex);
00291 
00292     _SlReturnVal_t   _SlFindAndSetActiveObj(_SlOpcode_t  Opcode, uint8_t Sd);
00293     
00294     uint16_t _SlDrvAlignSize(uint16_t msgLen);     
00295     void  _SlDrvSyncObjWaitForever(_SlSyncObj_t *pSyncObj);
00296     void  _SlDrvSyncObjSignal(_SlSyncObj_t *pSyncObj);
00297     void  _SlDrvObjLock(_SlLockObj_t *pLockObj, _SlTime_t Timeout);
00298     void  _SlDrvObjLockWaitForever(_SlLockObj_t *pLockObj);
00299     void  _SlDrvObjUnLock(_SlLockObj_t *pLockObj);        
00300     void  _SlDrvProtectionObjLockWaitForever();
00301     void  _SlDrvProtectionObjUnLock();
00302     void  _SlDrvMemZero(void* Addr, uint16_t size);
00303     void  _SlDrvResetCmdExt(_SlCmdExt_t* pCmdExt);
00304 
00305 
00306 private:
00307 
00308     cc3100_spi        &_spi;
00309 //#ifndef SL_PLATFORM_MULTI_THREADED
00310 #if (!defined (SL_PLATFORM_MULTI_THREADED)) && (!defined (SL_PLATFORM_EXTERNAL_SPAWN))    
00311     cc3100_nonos      &_nonos;
00312 #endif    
00313     cc3100_netapp     &_netapp;
00314     cc3100_flowcont   &_flowcont;
00315 
00316 };//class
00317 
00318 
00319 
00320 }//namespace mbed_cc3100
00321 
00322 #endif /* __DRIVER_INT_H__ */
00323