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

Dependencies:   mbed

Fork of cc3100_Test_Demo2 by 高 杨

simplelink/cc3100_driver.h

Committer:
dflet
Date:
2015-02-10
Revision:
0:e89ba455dbcf

File content as of revision 0:e89ba455dbcf:

/*
 * driver.h - CC31xx/CC32xx Host Driver Implementation
 *
 * Copyright (C) 2014 Texas Instruments Incorporated - http://www.ti.com/
 *
 *
 *  Redistribution and use in source and binary forms, with or without
 *  modification, are permitted provided that the following conditions
 *  are met:
 *
 *    Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 *
 *    Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the
 *    distribution.
 *
 *    Neither the name of Texas Instruments Incorporated nor the names of
 *    its contributors may be used to endorse or promote products derived
 *    from this software without specific prior written permission.
 *
 *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 *  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 *  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 *  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 *  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 *  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 *  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 *  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
*/

#ifndef DRIVER_INT_H_
#define DRIVER_INT_H_

#include "cc3100_simplelink.h"

#include "cc3100_protocol.h"
#include "cc3100_nonos.h"
#include "cc3100_spi.h"
#include "cc3100_netapp.h"
#include "cc3100.h"


/*****************************************************************************/
/* Macro declarations                                                        */
/*****************************************************************************/

/*  2 LSB of the N2H_SYNC_PATTERN are for sequence number
only in SPI interface
support backward sync pattern */
#define N2H_SYNC_PATTERN_SEQ_NUM_BITS            ((uint32_t)0x00000003) /* Bits 0..1    - use the 2 LBS for seq num */
#define N2H_SYNC_PATTERN_SEQ_NUM_EXISTS          ((uint32_t)0x00000004) /* Bit  2       - sign that sequence number exists in the sync pattern */
#define N2H_SYNC_PATTERN_MASK                    ((uint32_t)0xFFFFFFF8) /* Bits 3..31   - constant SYNC PATTERN */
#define N2H_SYNC_SPI_BUGS_MASK                   ((uint32_t)0x7FFF7F7F) /* Bits 7,15,31 - ignore the SPI (8,16,32 bites bus) error bits  */
#define BUF_SYNC_SPIM(pBuf)                      ((*(uint32_t *)(pBuf)) & N2H_SYNC_SPI_BUGS_MASK)
#define N2H_SYNC_SPIM                            (N2H_SYNC_PATTERN    & N2H_SYNC_SPI_BUGS_MASK)
#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)))
#define MATCH_WOUT_SEQ_NUM(pBuf)                 ( BUF_SYNC_SPIM(pBuf) ==  N2H_SYNC_SPIM )
#define MATCH_WITH_SEQ_NUM(pBuf, TxSeqNum)       ( BUF_SYNC_SPIM(pBuf) == (N2H_SYNC_SPIM_WITH_SEQ(TxSeqNum)) )
#define N2H_SYNC_PATTERN_MATCH(pBuf, TxSeqNum) \
    ( \
    (  (*((uint32_t *)pBuf) & N2H_SYNC_PATTERN_SEQ_NUM_EXISTS) && ( MATCH_WITH_SEQ_NUM(pBuf, TxSeqNum) ) )	|| \
    ( !(*((uint32_t *)pBuf) & N2H_SYNC_PATTERN_SEQ_NUM_EXISTS) && ( MATCH_WOUT_SEQ_NUM(pBuf          ) ) )	   \
    )

#define OPCODE(_ptr)          (((_SlResponseHeader_t *)(_ptr))->GenHeader.Opcode)
#define RSP_PAYLOAD_LEN(_ptr) (((_SlResponseHeader_t *)(_ptr))->GenHeader.Len - _SL_RESP_SPEC_HDR_SIZE)
#define SD(_ptr)              (((_SocketAddrResponse_u *)(_ptr))->IpV4.sd)
/*  Actual size of Recv/Recvfrom response data  */
#define ACT_DATA_SIZE(_ptr)   (((_SocketAddrResponse_u *)(_ptr))->IpV4.statusOrLen)

#define _SL_PROTOCOL_ALIGN_SIZE(msgLen)             (((msgLen)+3) & (~3))
#define _SL_IS_PROTOCOL_ALIGNED_SIZE(msgLen)        (!((msgLen) & 3))
#define _SL_PROTOCOL_CALC_LEN(pCmdCtrl,pCmdExt)     ((pCmdExt) ? \
                                                     (_SL_PROTOCOL_ALIGN_SIZE(pCmdCtrl->TxDescLen) + _SL_PROTOCOL_ALIGN_SIZE(pCmdExt->TxPayloadLen)) : \
                                                     (_SL_PROTOCOL_ALIGN_SIZE(pCmdCtrl->TxDescLen)))
                                                     

namespace mbed_cc3100 {
	
class cc3100;
	
/*****************************************************************************/
/* Structure/Enum declarations                                               */
/*****************************************************************************/
//typedef void(*_SlSpawnEntryFunc_t)(void* pValue);

typedef struct {
    _SlOpcode_t      Opcode;
    _SlArgSize_t     TxDescLen;
    _SlArgSize_t     RxDescLen;
} _SlCmdCtrl_t;

typedef struct {
    uint16_t  TxPayloadLen;
    uint16_t  RxPayloadLen;
    uint16_t  ActualRxPayloadLen;
    uint8_t   *pTxPayload;
    uint8_t   *pRxPayload;
} _SlCmdExt_t;


typedef struct _SlArgsData_t {
    uint8_t	 *pArgs;
    uint8_t  *pData;
} _SlArgsData_t;


typedef struct _SlPoolObj_t {
    _SlSyncObj_t	      SyncObj;
    uint8_t               *pRespArgs;
    uint8_t			      ActionID;
    uint8_t			      AdditionalData; /* use for socketID and one bit which indicate supprt IPV6 or not (1=support, 0 otherwise) */
    uint8_t				  NextIndex;

} _SlPoolObj_t;


typedef enum {
    SOCKET_0,
    SOCKET_1,
    SOCKET_2,
    SOCKET_3,
    SOCKET_4,
    SOCKET_5,
    SOCKET_6,
    SOCKET_7,
    MAX_SOCKET_ENUM_IDX,
    ACCEPT_ID = MAX_SOCKET_ENUM_IDX,
    CONNECT_ID,
    SELECT_ID,
    GETHOSYBYNAME_ID,
    GETHOSYBYSERVICE_ID,
    PING_ID,
    START_STOP_ID,
    RECV_ID
} _SlActionID_e;

typedef struct _SlActionLookup_t {
    uint8_t					ActionID;
    uint16_t				ActionAsyncOpcode;
    _SlSpawnEntryFunc_t		AsyncEventHandler;

} _SlActionLookup_t;


typedef struct {
    uint8_t         TxPoolCnt;
    _SlLockObj_t    TxLockObj;
    _SlSyncObj_t    TxSyncObj;
} _SlFlowContCB_t;

typedef enum {
    RECV_RESP_CLASS,
    CMD_RESP_CLASS,
    ASYNC_EVT_CLASS,
    DUMMY_MSG_CLASS
} _SlRxMsgClass_e;

typedef struct {
    uint8_t                 *pAsyncBuf;         /* place to write pointer to buffer with CmdResp's Header + Arguments */
    uint8_t					ActionIndex;
    _SlSpawnEntryFunc_t     AsyncEvtHandler;    /* place to write pointer to AsyncEvent handler (calc-ed by Opcode)   */
    _SlRxMsgClass_e         RxMsgClass;         /* type of Rx message                                                 */
} AsyncExt_t;

typedef struct {
    _SlCmdCtrl_t         *pCmdCtrl;
    uint8_t              *pTxRxDescBuff;
    _SlCmdExt_t          *pCmdExt;
    AsyncExt_t           AsyncExt;
} _SlFunctionParams_t;

typedef void (*P_INIT_CALLBACK)(uint32_t Status);

typedef struct {
    _SlFd_t                    FD;
    _SlLockObj_t               GlobalLockObj;
    _SlCommandHeader_t         TempProtocolHeader;
    P_INIT_CALLBACK            pInitCallback;

    _SlPoolObj_t               ObjPool[MAX_CONCURRENT_ACTIONS];
    uint8_t					   FreePoolIdx;
    uint8_t					   PendingPoolIdx;
    uint8_t					   ActivePoolIdx;
    uint32_t				   ActiveActionsBitmap;
    _SlLockObj_t               ProtectionLockObj;

    _SlSyncObj_t               CmdSyncObj;
    uint8_t                    IsCmdRespWaited;

    _SlFlowContCB_t            FlowContCB;

    uint8_t                    TxSeqNum;
    volatile uint8_t           RxIrqCnt;
    uint8_t                    RxDoneCnt;
    uint8_t                    SocketNonBlocking;
    uint8_t                    SocketTXFailure;
    uint8_t                    RelayFlagsViaRxPayload;
    /* for stack reduction the parameters are globals */
    _SlFunctionParams_t        FunctionParams;

} _SlDriverCb_t;

extern _SlDriverCb_t* g_pCB;
typedef uint8_t _SlSd_t;

class cc3100_driver
{

public:

    cc3100_driver(cc3100_nonos &nonos, cc3100_netapp &netapp, cc3100_flowcont &flowcont, cc3100_spi &spi);

    ~cc3100_driver();


    /*****************************************************************************/
    /* Function prototypes                                                       */
    /*****************************************************************************/
    typedef _SlDriverCb_t pDriver;
    
    bool _SL_PENDING_RX_MSG(pDriver* pDriverCB);
    
    void _SlDrvDriverCBInit(void);

    void _SlDrvDriverCBDeinit(void);

    void _SlDrvRxIrqHandler(void *pValue);

    _SlReturnVal_t  _SlDrvCmdOp(_SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);

    _SlReturnVal_t  _SlDrvCmdSend(_SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);

    _SlReturnVal_t  _SlDrvDataReadOp(_SlSd_t Sd, _SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);

    _SlReturnVal_t  _SlDrvDataWriteOp(_SlSd_t Sd, _SlCmdCtrl_t *pCmdCtrl , void* pTxRxDescBuff , _SlCmdExt_t* pCmdExt);

    int16_t  _SlDrvBasicCmd(_SlOpcode_t Opcode);

    int16_t _SlDrvWaitForPoolObj(uint32_t ActionID, uint8_t SocketID);

    void _SlDrvReleasePoolObj(uint8_t pObj);

    void _SlDrvObjInit(void);

    _SlReturnVal_t   _SlDrvMsgRead(void);

    _SlReturnVal_t   _SlDrvMsgWrite(void);

    _SlReturnVal_t   _SlDrvMsgReadCmdCtx(void);

    _SlReturnVal_t   _SlDrvMsgReadSpawnCtx_(void *pValue);

    void             _SlDrvClassifyRxMsg(_SlOpcode_t Opcode );

    _SlReturnVal_t   _SlDrvRxHdrRead(uint8_t *pBuf, uint8_t *pAlignSize);

    void             _SlDrvShiftDWord(uint8_t *pBuf);

    void             _SlAsyncEventGenericHandler(void);

    void			 _SlDrvObjDeInit(void);

    void			 _SlRemoveFromList(uint8_t* ListIndex, uint8_t ItemIndex);

    _SlReturnVal_t	 _SlFindAndSetActiveObj(_SlOpcode_t  Opcode, uint8_t Sd);

private:

    cc3100_nonos      &_nonos;
    cc3100_netapp     &_netapp;
    cc3100_flowcont   &_flowcont;
    cc3100_spi        &_spi;

};//class

}//namespace mbed_cc3100

#endif /* __DRIVER_INT_H__ */