Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2010 NXP Semiconductors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /**
     18  * \file  phFriNfc_Llcp.h
     19  * \brief NFC LLCP core
     20  *
     21  * Project: NFC-FRI
     22  *
     23  */
     24 
     25 #ifndef PHFRINFC_LLCP_H
     26 #define PHFRINFC_LLCP_H
     27 
     28 /*include files*/
     29 #include <phNfcTypes.h>
     30 #include <phNfcLlcpTypes.h>
     31 #include <phNfcStatus.h>
     32 #include <phFriNfc.h>
     33 
     34 #include <phFriNfc_LlcpMac.h>
     35 
     36 /**
     37  * \name NFC Forum Logical Link Control Protocol
     38  *
     39  * File: \ref phFriNfc_Llcp.h
     40  *
     41  */
     42 
     43 
     44 /** \defgroup grp_fri_nfc_llcp NFC Forum Logical Link Control Protocol Component
     45  *
     46  *  TODO
     47  *
     48  */
     49 
     50 /*=========== DEBUG MACROS ===========*/
     51 
     52 /* LLCP TRACE Macros */
     53 #if defined(LLCP_TRACE)
     54 #include <phOsalNfc.h>
     55 #include <stdio.h>
     56 extern char phOsalNfc_DbgTraceBuffer[];
     57 #define LLCP_MAX_TRACE_BUFFER   150
     58 #define LLCP_PRINT( str )  phOsalNfc_DbgString(str)
     59 #define LLCP_DEBUG(str, arg) \
     60    {                                                                    \
     61       snprintf(phOsalNfc_DbgTraceBuffer,LLCP_MAX_TRACE_BUFFER,str,arg); \
     62       phOsalNfc_DbgString(phOsalNfc_DbgTraceBuffer);                    \
     63    }
     64 #define LLCP_PRINT_BUFFER(msg,buf,len) \
     65    {                                                                             \
     66       snprintf(phOsalNfc_DbgTraceBuffer,LLCP_MAX_TRACE_BUFFER,"\n\t %s:",msg);   \
     67       phOsalNfc_DbgString(phOsalNfc_DbgTraceBuffer);                             \
     68       phOsalNfc_DbgTrace(buf,len);                                               \
     69       phOsalNfc_DbgString("\r");                                                 \
     70    }
     71 #else
     72 #define LLCP_PRINT( str )
     73 #define LLCP_DEBUG(str, arg)
     74 #define LLCP_PRINT_BUFFER(msg,buf,len)
     75 #endif
     76 
     77 
     78 /*=========== CONSTANTS ===========*/
     79 
     80 /**
     81  *  \name LLCP local protocol version.
     82  *
     83  */
     84  /*@{*/
     85 #define PHFRINFC_LLCP_VERSION_MAJOR   0x01  /**< Major number of local LLCP version.*/
     86 #define PHFRINFC_LLCP_VERSION_MINOR   0x01  /**< Minor number of local LLCP version.*/
     87 #define PHFRINFC_LLCP_VERSION         ((PHFRINFC_LLCP_VERSION_MAJOR << 4) | PHFRINFC_LLCP_VERSION_MINOR) /**< Local LLCP version.*/
     88 /*@}*/
     89 
     90 /**
     91  *  \name LLCP packet types.
     92  *
     93  */
     94  /*@{*/
     95 #define PHFRINFC_LLCP_PTYPE_SYMM       0x00 /**< Symmetry.*/
     96 #define PHFRINFC_LLCP_PTYPE_PAX        0x01 /**< PArameter Exchange.*/
     97 #define PHFRINFC_LLCP_PTYPE_AGF        0x02 /**< AGgregated Frame.*/
     98 #define PHFRINFC_LLCP_PTYPE_UI         0x03 /**< Unnumbered Information.*/
     99 #define PHFRINFC_LLCP_PTYPE_CONNECT    0x04 /**< Connect.*/
    100 #define PHFRINFC_LLCP_PTYPE_DISC       0x05 /**< Disconnect.*/
    101 #define PHFRINFC_LLCP_PTYPE_CC         0x06 /**< Connection Complete.*/
    102 #define PHFRINFC_LLCP_PTYPE_DM         0x07 /**< Disconnected Mode.*/
    103 #define PHFRINFC_LLCP_PTYPE_FRMR       0x08 /**< FRaMe Reject.*/
    104 #define PHFRINFC_LLCP_PTYPE_SNL        0x09 /**< Service Name Lookup.*/
    105 #define PHFRINFC_LLCP_PTYPE_RESERVED1  0x0A /**< Reserved.*/
    106 #define PHFRINFC_LLCP_PTYPE_RESERVED2  0x0B /**< Reserved.*/
    107 #define PHFRINFC_LLCP_PTYPE_I          0x0C /**< Information.*/
    108 #define PHFRINFC_LLCP_PTYPE_RR         0x0D /**< Receive Ready.*/
    109 #define PHFRINFC_LLCP_PTYPE_RNR        0x0E /**< Receive Not Ready.*/
    110 #define PHFRINFC_LLCP_PTYPE_RESERVED3  0x0F /**< Reserved.*/
    111 /*@}*/
    112 
    113 /**
    114  *  \name LLCP well-known SAPs.
    115  *
    116  */
    117  /*@{*/
    118 #define PHFRINFC_LLCP_SAP_LINK                     0x00 /**< Link SAP.*/
    119 #define PHFRINFC_LLCP_SAP_SDP                      0x01 /**< Service Discovery Protocol SAP.*/
    120 #define PHFRINFC_LLCP_SAP_WKS_FIRST                0x02 /**< Other Well-Known Services defined by the NFC Forum.*/
    121 #define PHFRINFC_LLCP_SAP_SDP_ADVERTISED_FIRST     0x10 /**< First SAP number from SDP-avertised SAP range.*/
    122 #define PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST   0x20 /**< First SAP number from SDP-unavertised SAP range.*/
    123 #define PHFRINFC_LLCP_SAP_NUMBER                   0x40 /**< Number of possible SAP values (also first invalid value).*/
    124 #define PHFRINFC_LLCP_SAP_DEFAULT                  0xFF /**< Default number when a socket is created or reset */
    125 #define PHFRINFC_LLCP_SDP_ADVERTISED_NB            0x10 /**< Number of SDP advertised SAP slots */
    126 /*@}*/
    127 
    128 /**
    129  *  \name LLCP well-known SAPs.
    130  *
    131  */
    132  /*@{*/
    133 #define PHFRINFC_LLCP_SERVICENAME_SDP              "urn:nfc:sn:sdp" /**< Service Discovery Protocol name.*/
    134 /*@}*/
    135 
    136 /**
    137  *  \name Length value for DM opCode
    138  *
    139  */
    140  /*@{*/
    141 #define PHFRINFC_LLCP_DM_LENGTH                    0x01 /**< Length value for DM opCode */
    142 /*@}*/
    143 
    144 
    145 /**
    146  * \internal
    147  * \name Masks used with parameters value.
    148  *
    149  */
    150 /*@{*/
    151 #define PHFRINFC_LLCP_TLV_MIUX_MASK                 0x07FF   /**< \internal Mask to apply to MIUX TLV Value.*/
    152 #define PHFRINFC_LLCP_TLV_WKS_MASK                  0x0001   /**< \internal Minimal bits to be set in WKS TLV Value.*/
    153 #define PHFRINFC_LLCP_TLV_RW_MASK                   0x0F     /**< \internal Mask to apply to RW TLV Value.*/
    154 #define PHFRINFC_LLCP_TLV_OPT_MASK                  0x03     /**< \internal Mask to apply to OPT TLV Value.*/
    155 /*@}*/
    156 
    157 /**
    158  * \internal
    159  * \name Type codes for parameters in TLV.
    160  *
    161  */
    162 /*@{*/
    163 #define PHFRINFC_LLCP_TLV_TYPE_VERSION               0x01   /**< \internal VERSION parameter Type code.*/
    164 #define PHFRINFC_LLCP_TLV_TYPE_MIUX                  0x02   /**< \internal MIUX parameter Type code.*/
    165 #define PHFRINFC_LLCP_TLV_TYPE_WKS                   0x03   /**< \internal WKS parameter Type code.*/
    166 #define PHFRINFC_LLCP_TLV_TYPE_LTO                   0x04   /**< \internal LTO parameter Type code.*/
    167 #define PHFRINFC_LLCP_TLV_TYPE_RW                    0x05   /**< \internal RW parameter Type code.*/
    168 #define PHFRINFC_LLCP_TLV_TYPE_SN                    0x06   /**< \internal SN parameter Type code.*/
    169 #define PHFRINFC_LLCP_TLV_TYPE_OPT                   0x07   /**< \internal OPT parameter Type code.*/
    170 #define PHFRINFC_LLCP_TLV_TYPE_SDREQ                 0x08   /**< \internal SDREQ parameter Type code.*/
    171 #define PHFRINFC_LLCP_TLV_TYPE_SDRES                 0x09   /**< \internal SDRES parameter Type code.*/
    172 /*@}*/
    173 
    174 /**
    175  * \internal
    176  * \name Fixed Value length for parameters in TLV.
    177  *
    178  */
    179 /*@{*/
    180 #define PHFRINFC_LLCP_TLV_LENGTH_HEADER              2   /**< \internal Fixed length of Type and Length fields in TLV.*/
    181 #define PHFRINFC_LLCP_TLV_LENGTH_VERSION             1   /**< \internal Fixed length of VERSION parameter Value.*/
    182 #define PHFRINFC_LLCP_TLV_LENGTH_MIUX                2   /**< \internal Fixed length of MIUX parameter Value.*/
    183 #define PHFRINFC_LLCP_TLV_LENGTH_WKS                 2   /**< \internal Fixed length of WKS parameter Value.*/
    184 #define PHFRINFC_LLCP_TLV_LENGTH_LTO                 1   /**< \internal Fixed length of LTO parameter Value.*/
    185 #define PHFRINFC_LLCP_TLV_LENGTH_RW                  1   /**< \internal Fixed length of RW parameter Value.*/
    186 #define PHFRINFC_LLCP_TLV_LENGTH_OPT                 1   /**< \internal Fixed length of OPT parameter Value.*/
    187 /*@}*/
    188 
    189 /**
    190  *  \name LLCP packet field sizes.
    191  *
    192  */
    193  /*@{*/
    194 #define PHFRINFC_LLCP_PACKET_HEADER_SIZE     2 /**< Size of the general packet header (DSAP+PTYPE+SSAP).*/
    195 #define PHFRINFC_LLCP_PACKET_SEQUENCE_SIZE   1 /**< Size of the sequence field, if present.*/
    196 #define PHFRINFC_LLCP_PACKET_MAX_SIZE        (PHFRINFC_LLCP_PACKET_HEADER_SIZE + \
    197                                              PHFRINFC_LLCP_PACKET_SEQUENCE_SIZE + \
    198                                              PHFRINFC_LLCP_MIU_DEFAULT + \
    199                                              PHFRINFC_LLCP_TLV_MIUX_MASK) /**< Maximum size of a packet */
    200 /*@}*/
    201 
    202 /*========== MACROS ===========*/
    203 
    204 #define CHECK_SEND_RW(socket) ( (((socket)->socket_VS - (socket)->socket_VSA)  % 16) < (socket)->remoteRW )
    205 
    206 /*========== ENUMERATES ===========*/
    207 
    208 typedef phFriNfc_LlcpMac_ePeerType_t      phFriNfc_Llcp_eRole_t;
    209 
    210 typedef phFriNfc_LlcpMac_eLinkStatus_t    phFriNfc_Llcp_eLinkStatus_t;
    211 
    212 /*========== CALLBACKS ===========*/
    213 
    214 typedef void (*phFriNfc_Llcp_Check_CB_t) (
    215    void                             *pContext,
    216    NFCSTATUS                        status
    217 );
    218 
    219 typedef void (*phFriNfc_Llcp_LinkStatus_CB_t) (
    220    void                             *pContext,
    221    phFriNfc_Llcp_eLinkStatus_t      eLinkStatus
    222 );
    223 
    224 typedef void (*phFriNfc_Llcp_LinkSend_CB_t) (
    225    void                             *pContext,
    226    uint8_t                          socketIndex,
    227    NFCSTATUS                        status
    228 );
    229 
    230 typedef void (*phFriNfc_Llcp_Send_CB_t) (
    231    void                             *pContext,
    232    NFCSTATUS                        status
    233 );
    234 
    235 typedef void (*phFriNfc_Llcp_Recv_CB_t) (
    236    void                             *pContext,
    237    phNfc_sData_t                    *psData,
    238    NFCSTATUS                        status
    239 );
    240 
    241 /*========== STRUCTURES ===========*/
    242 
    243 typedef struct phFriNfc_Llcp_sPacketHeader
    244 {
    245    /**< The destination service access point*/
    246    unsigned   dsap : 6;
    247 
    248    /**< The packet type*/
    249    unsigned   ptype : 4;
    250 
    251    /**< The source service access point*/
    252    unsigned   ssap : 6;
    253 
    254 } phFriNfc_Llcp_sPacketHeader_t;
    255 
    256 typedef struct phFriNfc_Llcp_sPacketSequence
    257 {
    258    /**< Sequence number for sending*/
    259    unsigned   ns : 4;
    260 
    261    /**< Sequence number for reception*/
    262    unsigned   nr : 4;
    263 
    264 } phFriNfc_Llcp_sPacketSequence_t;
    265 
    266 typedef struct phFriNfc_Llcp_sSendOperation
    267 {
    268    /**< Sequence number for sending*/
    269    phFriNfc_Llcp_sPacketHeader_t    *psHeader;
    270 
    271    /**< Sequence number for sending*/
    272    phFriNfc_Llcp_sPacketSequence_t  *psSequence;
    273 
    274    /**< Sequence number for sending*/
    275    phNfc_sData_t                    *psInfo;
    276 
    277    /**< Sequence number for sending*/
    278    phFriNfc_Llcp_Send_CB_t          pfSend_CB;
    279 
    280    /**< Sequence number for sending*/
    281    void                             *pContext;
    282 
    283 } phFriNfc_Llcp_sSendOperation_t;
    284 
    285 typedef struct phFriNfc_Llcp_sRecvOperation
    286 {
    287    /**< Sequence number for sending*/
    288    uint8_t                    nSap;
    289 
    290    /**< Sequence number for sending*/
    291    phNfc_sData_t              *psBuffer;
    292 
    293    /**< Sequence number for sending*/
    294    phFriNfc_Llcp_Recv_CB_t    pfRecv_CB;
    295 
    296    /**< Sequence number for sending*/
    297    void                       *pContext;
    298 
    299 } phFriNfc_Llcp_sRecvOperation_t;
    300 
    301 typedef struct phFriNfc_Llcp
    302 {
    303    /**< The current state*/
    304    uint8_t                          state;
    305 
    306    /**< MAC mapping instance*/
    307    phFriNfc_LlcpMac_t               MAC;
    308 
    309    /**< Local LLC role*/
    310    phFriNfc_LlcpMac_ePeerType_t         eRole;
    311 
    312    /**< Local link parameters*/
    313    phFriNfc_Llcp_sLinkParameters_t  sLocalParams;
    314 
    315    /**< Remote link parameters*/
    316    phFriNfc_Llcp_sLinkParameters_t  sRemoteParams;
    317 
    318    /**< Negociated protocol version (major number on MSB, minor on LSB)*/
    319    uint8_t                          version;
    320 
    321    /**< Internal reception buffer, its size may vary during time but not exceed nRxBufferSize*/
    322    phNfc_sData_t                   sRxBuffer;
    323 
    324    /**< Actual size of reception buffer*/
    325    uint16_t                        nRxBufferLength;
    326 
    327    /**< Internal emission buffer, its size may vary during time but not exceed nTxBufferSize*/
    328    phNfc_sData_t                   sTxBuffer;
    329 
    330    /**< Actual size of emission buffer*/
    331    uint16_t                        nTxBufferLength;
    332 
    333    /**< Callback function for link status notification*/
    334    phFriNfc_Llcp_LinkStatus_CB_t    pfLink_CB;
    335 
    336    /**< Callback context for link status notification*/
    337    void                             *pLinkContext;
    338 
    339    /**< Callback function for compliance checking*/
    340    phFriNfc_Llcp_Check_CB_t         pfChk_CB;
    341 
    342    /**< Callback context for compliance checking*/
    343    void                             *pChkContext;
    344 
    345    /**< Symmetry timer*/
    346    uint32_t                         hSymmTimer;
    347 
    348    /**< Control frames buffer*/
    349    uint8_t                          pCtrlTxBuffer[10];
    350 
    351    /**< Control frames buffer size*/
    352    uint8_t                          pCtrlTxBufferLength;
    353 
    354    /**< DISC packet send pending flag*/
    355    bool_t                           bDiscPendingFlag;
    356 
    357    /**< FRMR packet send pending flag*/
    358    bool_t                           bFrmrPendingFlag;
    359 
    360    /**< Header of pending FRMR packet*/
    361    phFriNfc_Llcp_sPacketHeader_t    sFrmrHeader;
    362 
    363    /**< Info field of pending FRMR packet*/
    364    uint8_t                          pFrmrInfo[4];
    365 
    366    /**< Send callback*/
    367    phFriNfc_Llcp_Send_CB_t          pfSendCB;
    368 
    369    /**< Send callback*/
    370    void                             *pSendContext;
    371 
    372    /**< Pending send header*/
    373    phFriNfc_Llcp_sPacketHeader_t    *psSendHeader;
    374 
    375    /**< Pending send sequence*/
    376    phFriNfc_Llcp_sPacketSequence_t  *psSendSequence;
    377 
    378    /**< Pending send info*/
    379    phNfc_sData_t                    *psSendInfo;
    380 
    381    /**< Receive callback*/
    382    phFriNfc_Llcp_Recv_CB_t          pfRecvCB;
    383 
    384    /**< Receive callback*/
    385    void                             *pRecvContext;
    386 
    387 } phFriNfc_Llcp_t;
    388 
    389 /*========== UNIONS ===========*/
    390 
    391 
    392 /*========== FUNCTIONS ===========*/
    393 
    394 /*!
    395  * \brief TODO
    396  */
    397 NFCSTATUS phFriNfc_Llcp_EncodeLinkParams( phNfc_sData_t                   *psRawBuffer,
    398                                           phFriNfc_Llcp_sLinkParameters_t *psLinkParams,
    399                                           uint8_t                         nVersion );
    400 
    401 
    402 /*!
    403  * \brief TODO
    404  */
    405 NFCSTATUS phFriNfc_Llcp_Reset( phFriNfc_Llcp_t                 *Llcp,
    406                                void                            *LowerDevice,
    407                                phFriNfc_Llcp_sLinkParameters_t *psLinkParams,
    408                                void                            *pRxBuffer,
    409                                uint16_t                        nRxBufferLength,
    410                                void                            *pTxBuffer,
    411                                uint16_t                        nTxBufferLength,
    412                                phFriNfc_Llcp_LinkStatus_CB_t   pfLink_CB,
    413                                void                            *pContext );
    414 
    415 /*!
    416  * \brief TODO
    417  */
    418 NFCSTATUS phFriNfc_Llcp_ChkLlcp( phFriNfc_Llcp_t               *Llcp,
    419                                  phHal_sRemoteDevInformation_t *psRemoteDevInfo,
    420                                  phFriNfc_Llcp_Check_CB_t      pfCheck_CB,
    421                                  void                          *pContext );
    422 
    423 /*!
    424  * \brief TODO
    425  */
    426 NFCSTATUS phFriNfc_Llcp_Activate( phFriNfc_Llcp_t  *Llcp );
    427 
    428 /*!
    429  * \brief TODO
    430  */
    431 NFCSTATUS phFriNfc_Llcp_Deactivate( phFriNfc_Llcp_t *Llcp );
    432 
    433 /*!
    434  * \brief TODO
    435  */
    436 NFCSTATUS phFriNfc_Llcp_GetLocalInfo( phFriNfc_Llcp_t                   *Llcp,
    437                                       phFriNfc_Llcp_sLinkParameters_t   *pParams );
    438 
    439 /*!
    440  * \brief TODO
    441  */
    442 NFCSTATUS phFriNfc_Llcp_GetRemoteInfo( phFriNfc_Llcp_t                  *Llcp,
    443                                        phFriNfc_Llcp_sLinkParameters_t  *pParams );
    444 
    445 /*!
    446  * \brief TODO
    447  */
    448 NFCSTATUS phFriNfc_Llcp_Send( phFriNfc_Llcp_t                  *Llcp,
    449                               phFriNfc_Llcp_sPacketHeader_t    *psHeader,
    450                               phFriNfc_Llcp_sPacketSequence_t  *psSequence,
    451                               phNfc_sData_t                    *psInfo,
    452                               phFriNfc_Llcp_Send_CB_t          pfSend_CB,
    453                               void                             *pContext );
    454 
    455 /*!
    456  * \brief TODO
    457  */
    458 NFCSTATUS phFriNfc_Llcp_Recv( phFriNfc_Llcp_t            *Llcp,
    459                               phFriNfc_Llcp_Recv_CB_t    pfRecv_CB,
    460                               void                       *pContext );
    461 
    462 
    463 #endif /* PHFRINFC_LLCP_H */
    464