| /* |
| * Copyright (C) 2010 NXP Semiconductors |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /** |
| * \file phFriNfc_Llcp.h |
| * \brief NFC LLCP core |
| * |
| * Project: NFC-FRI |
| * |
| */ |
| |
| #ifndef PHFRINFC_LLCP_H |
| #define PHFRINFC_LLCP_H |
| |
| /*include files*/ |
| #include <phNfcTypes.h> |
| #include <phNfcLlcpTypes.h> |
| #include <phNfcStatus.h> |
| #include <phFriNfc.h> |
| |
| #include <phFriNfc_LlcpMac.h> |
| |
| /** |
| * \name NFC Forum Logical Link Control Protocol |
| * |
| * File: \ref phFriNfc_Llcp.h |
| * |
| */ |
| |
| |
| /** \defgroup grp_fri_nfc_llcp NFC Forum Logical Link Control Protocol Component |
| * |
| * TODO |
| * |
| */ |
| |
| /*=========== DEBUG MACROS ===========*/ |
| |
| /* LLCP TRACE Macros */ |
| #if defined(LLCP_TRACE) |
| #include <phOsalNfc.h> |
| #include <stdio.h> |
| extern char phOsalNfc_DbgTraceBuffer[]; |
| #define LLCP_MAX_TRACE_BUFFER 150 |
| #define LLCP_PRINT( str ) phOsalNfc_DbgString(str) |
| #define LLCP_DEBUG(str, arg) \ |
| { \ |
| snprintf(phOsalNfc_DbgTraceBuffer,LLCP_MAX_TRACE_BUFFER,str,arg); \ |
| phOsalNfc_DbgString(phOsalNfc_DbgTraceBuffer); \ |
| } |
| #define LLCP_PRINT_BUFFER(msg,buf,len) \ |
| { \ |
| snprintf(phOsalNfc_DbgTraceBuffer,LLCP_MAX_TRACE_BUFFER,"\n\t %s:",msg); \ |
| phOsalNfc_DbgString(phOsalNfc_DbgTraceBuffer); \ |
| phOsalNfc_DbgTrace(buf,len); \ |
| phOsalNfc_DbgString("\r"); \ |
| } |
| #else |
| #define LLCP_PRINT( str ) |
| #define LLCP_DEBUG(str, arg) |
| #define LLCP_PRINT_BUFFER(msg,buf,len) |
| #endif |
| |
| |
| /*=========== CONSTANTS ===========*/ |
| |
| /** |
| * \name LLCP local protocol version. |
| * |
| */ |
| /*@{*/ |
| #define PHFRINFC_LLCP_VERSION_MAJOR 0x01 /**< Major number of local LLCP version.*/ |
| #define PHFRINFC_LLCP_VERSION_MINOR 0x00 /**< Minor number of local LLCP version.*/ |
| #define PHFRINFC_LLCP_VERSION ((PHFRINFC_LLCP_VERSION_MAJOR << 4) | PHFRINFC_LLCP_VERSION_MINOR) /**< Local LLCP version.*/ |
| /*@}*/ |
| |
| /** |
| * \name LLCP packet types. |
| * |
| */ |
| /*@{*/ |
| #define PHFRINFC_LLCP_PTYPE_SYMM 0x00 /**< Symmetry.*/ |
| #define PHFRINFC_LLCP_PTYPE_PAX 0x01 /**< PArameter Exchange.*/ |
| #define PHFRINFC_LLCP_PTYPE_AGF 0x02 /**< AGgregated Frame.*/ |
| #define PHFRINFC_LLCP_PTYPE_UI 0x03 /**< Unnumbered Information.*/ |
| #define PHFRINFC_LLCP_PTYPE_CONNECT 0x04 /**< Connect.*/ |
| #define PHFRINFC_LLCP_PTYPE_DISC 0x05 /**< Didconnect.*/ |
| #define PHFRINFC_LLCP_PTYPE_CC 0x06 /**< Connection Complete.*/ |
| #define PHFRINFC_LLCP_PTYPE_DM 0x07 /**< Disconnected Mode.*/ |
| #define PHFRINFC_LLCP_PTYPE_FRMR 0x08 /**< FRaMe Reject.*/ |
| #define PHFRINFC_LLCP_PTYPE_RESERVED1 0x09 /**< Reserved.*/ |
| #define PHFRINFC_LLCP_PTYPE_RESERVED2 0x0A /**< Reserved.*/ |
| #define PHFRINFC_LLCP_PTYPE_RESERVED3 0x0B /**< Reserved.*/ |
| #define PHFRINFC_LLCP_PTYPE_I 0x0C /**< Information.*/ |
| #define PHFRINFC_LLCP_PTYPE_RR 0x0D /**< Receive Ready.*/ |
| #define PHFRINFC_LLCP_PTYPE_RNR 0x0E /**< Receive Not Ready.*/ |
| #define PHFRINFC_LLCP_PTYPE_RESERVED4 0x0F /**< Reserved.*/ |
| /*@}*/ |
| |
| /** |
| * \name LLCP well-known SAPs. |
| * |
| */ |
| /*@{*/ |
| #define PHFRINFC_LLCP_SAP_LINK 0x00 /**< Link SAP.*/ |
| #define PHFRINFC_LLCP_SAP_SDP 0x01 /**< Service Discovery Protocol SAP.*/ |
| #define PHFRINFC_LLCP_SAP_SDP_ADVERTISED_FIRST 0x10 /**< First SAP number from SDP-avertised SAP range.*/ |
| #define PHFRINFC_LLCP_SAP_SDP_UNADVERTISED_FIRST 0x20 /**< First SAP number from SDP-unavertised SAP range.*/ |
| #define PHFRINFC_LLCP_SAP_NUMBER 0x40 /**< Number of possible SAP values (also first invalid value).*/ |
| #define PHFRINFC_LLCP_SAP_DEFAULT 0xFF /**< Default number when a socket is created or reset */ |
| /*@}*/ |
| |
| /** |
| * \name Length value for DM opCode |
| * |
| */ |
| /*@{*/ |
| #define PHFRINFC_LLCP_DM_LENGTH 0x01 /**< Length value for DM opCode */ |
| /*@}*/ |
| |
| |
| /** |
| * \internal |
| * \name Masks used with parameters value. |
| * |
| */ |
| /*@{*/ |
| #define PHFRINFC_LLCP_TLV_MIUX_MASK 0x07FF /**< \internal Mask to apply to MIUX TLV Value.*/ |
| #define PHFRINFC_LLCP_TLV_WKS_MASK 0x0001 /**< \internal Minimal bits to be set in WKS TLV Value.*/ |
| #define PHFRINFC_LLCP_TLV_RW_MASK 0x0F /**< \internal Mask to apply to RW TLV Value.*/ |
| #define PHFRINFC_LLCP_TLV_OPT_MASK 0x03 /**< \internal Mask to apply to OPT TLV Value.*/ |
| /*@}*/ |
| |
| /** |
| * \internal |
| * \name Type codes for parameters in TLV. |
| * |
| */ |
| /*@{*/ |
| #define PHFRINFC_LLCP_TLV_TYPE_VERSION 0x01 /**< \internal VERSION parameter Type code.*/ |
| #define PHFRINFC_LLCP_TLV_TYPE_MIUX 0x02 /**< \internal MIUX parameter Type code.*/ |
| #define PHFRINFC_LLCP_TLV_TYPE_WKS 0x03 /**< \internal WKS parameter Type code.*/ |
| #define PHFRINFC_LLCP_TLV_TYPE_LTO 0x04 /**< \internal LTO parameter Type code.*/ |
| #define PHFRINFC_LLCP_TLV_TYPE_RW 0x05 /**< \internal RW parameter Type code.*/ |
| #define PHFRINFC_LLCP_TLV_TYPE_SN 0x06 /**< \internal SN parameter Type code.*/ |
| #define PHFRINFC_LLCP_TLV_TYPE_OPT 0x07 /**< \internal OPT parameter Type code.*/ |
| /*@}*/ |
| |
| /** |
| * \internal |
| * \name Fixed Value length for parameters in TLV. |
| * |
| */ |
| /*@{*/ |
| #define PHFRINFC_LLCP_TLV_LENGTH_HEADER 2 /**< \internal Fixed length of Type and Length fields in TLV.*/ |
| #define PHFRINFC_LLCP_TLV_LENGTH_VERSION 1 /**< \internal Fixed length of VERSION parameter Value.*/ |
| #define PHFRINFC_LLCP_TLV_LENGTH_MIUX 2 /**< \internal Fixed length of MIUX parameter Value.*/ |
| #define PHFRINFC_LLCP_TLV_LENGTH_WKS 2 /**< \internal Fixed length of WKS parameter Value.*/ |
| #define PHFRINFC_LLCP_TLV_LENGTH_LTO 1 /**< \internal Fixed length of LTO parameter Value.*/ |
| #define PHFRINFC_LLCP_TLV_LENGTH_RW 1 /**< \internal Fixed length of RW parameter Value.*/ |
| #define PHFRINFC_LLCP_TLV_LENGTH_OPT 1 /**< \internal Fixed length of OPT parameter Value.*/ |
| /*@}*/ |
| |
| /** |
| * \name LLCP packet field sizes. |
| * |
| */ |
| /*@{*/ |
| #define PHFRINFC_LLCP_PACKET_HEADER_SIZE 2 /**< Size of the general packet header (DSAP+PTYPE+SSAP).*/ |
| #define PHFRINFC_LLCP_PACKET_SEQUENCE_SIZE 1 /**< Size of the sequence field, if present.*/ |
| #define PHFRINFC_LLCP_PACKET_MAX_SIZE (PHFRINFC_LLCP_PACKET_HEADER_SIZE + \ |
| PHFRINFC_LLCP_PACKET_SEQUENCE_SIZE + \ |
| PHFRINFC_LLCP_MIU_DEFAULT + \ |
| PHFRINFC_LLCP_TLV_MIUX_MASK) /**< Maximum size of a packet */ |
| /*@}*/ |
| |
| /*========== MACROS ===========*/ |
| |
| #define CHECK_SEND_RW(socket) ( (((socket)->socket_VS - (socket)->socket_VSA) % 16) < (socket)->remoteRW ) |
| |
| /*========== ENUMERATES ===========*/ |
| |
| typedef phFriNfc_LlcpMac_ePeerType_t phFriNfc_Llcp_eRole_t; |
| |
| typedef phFriNfc_LlcpMac_eLinkStatus_t phFriNfc_Llcp_eLinkStatus_t; |
| |
| /*========== CALLBACKS ===========*/ |
| |
| typedef void (*phFriNfc_Llcp_Check_CB_t) ( |
| void *pContext, |
| NFCSTATUS status |
| ); |
| |
| typedef void (*phFriNfc_Llcp_LinkStatus_CB_t) ( |
| void *pContext, |
| phFriNfc_Llcp_eLinkStatus_t eLinkStatus |
| ); |
| |
| typedef void (*phFriNfc_Llcp_Send_CB_t) ( |
| void *pContext, |
| NFCSTATUS status |
| ); |
| |
| typedef void (*phFriNfc_Llcp_Recv_CB_t) ( |
| void *pContext, |
| phNfc_sData_t *psData, |
| NFCSTATUS status |
| ); |
| |
| /*========== STRUCTURES ===========*/ |
| |
| typedef struct phFriNfc_Llcp_sPacketHeader |
| { |
| /**< The destination service access point*/ |
| unsigned dsap : 6; |
| |
| /**< The packet type*/ |
| unsigned ptype : 4; |
| |
| /**< The source service access point*/ |
| unsigned ssap : 6; |
| |
| } phFriNfc_Llcp_sPacketHeader_t; |
| |
| typedef struct phFriNfc_Llcp_sPacketSequence |
| { |
| /**< Sequence number for sending*/ |
| unsigned ns : 4; |
| |
| /**< Sequence number for reception*/ |
| unsigned nr : 4; |
| |
| } phFriNfc_Llcp_sPacketSequence_t; |
| |
| typedef struct phFriNfc_Llcp_sSendOperation |
| { |
| /**< Sequence number for sending*/ |
| phFriNfc_Llcp_sPacketHeader_t *psHeader; |
| |
| /**< Sequence number for sending*/ |
| phFriNfc_Llcp_sPacketSequence_t *psSequence; |
| |
| /**< Sequence number for sending*/ |
| phNfc_sData_t *psInfo; |
| |
| /**< Sequence number for sending*/ |
| phFriNfc_Llcp_Send_CB_t pfSend_CB; |
| |
| /**< Sequence number for sending*/ |
| void *pContext; |
| |
| } phFriNfc_Llcp_sSendOperation_t; |
| |
| typedef struct phFriNfc_Llcp_sRecvOperation |
| { |
| /**< Sequence number for sending*/ |
| uint8_t nSap; |
| |
| /**< Sequence number for sending*/ |
| phNfc_sData_t *psBuffer; |
| |
| /**< Sequence number for sending*/ |
| phFriNfc_Llcp_Recv_CB_t pfRecv_CB; |
| |
| /**< Sequence number for sending*/ |
| void *pContext; |
| |
| } phFriNfc_Llcp_sRecvOperation_t; |
| |
| typedef struct phFriNfc_Llcp |
| { |
| /**< The current state*/ |
| uint8_t state; |
| |
| /**< MAC mapping instance*/ |
| phFriNfc_LlcpMac_t MAC; |
| |
| /**< Local LLC role*/ |
| phFriNfc_LlcpMac_eType_t eRole; |
| |
| /**< Local link parameters*/ |
| phFriNfc_Llcp_sLinkParameters_t sLocalParams; |
| |
| /**< Remote link parameters*/ |
| phFriNfc_Llcp_sLinkParameters_t sRemoteParams; |
| |
| /**< Negociated protocol version (major number on MSB, minor on LSB)*/ |
| uint8_t version; |
| |
| /**< Internal reception buffer, its size may vary during time but not exceed nRxBufferSize*/ |
| phNfc_sData_t sRxBuffer; |
| |
| /**< Actual size of reception buffer*/ |
| uint16_t nRxBufferLength; |
| |
| /**< Internal emission buffer, its size may vary during time but not exceed nTxBufferSize*/ |
| phNfc_sData_t sTxBuffer; |
| |
| /**< Actual size of emission buffer*/ |
| uint16_t nTxBufferLength; |
| |
| /**< Callback function for link status notification*/ |
| phFriNfc_Llcp_LinkStatus_CB_t pfLink_CB; |
| |
| /**< Callback context for link status notification*/ |
| void *pLinkContext; |
| |
| /**< Callback function for compliance checking*/ |
| phFriNfc_Llcp_Check_CB_t pfChk_CB; |
| |
| /**< Callback context for compliance checking*/ |
| void *pChkContext; |
| |
| /**< Symmetry timer*/ |
| uint32_t hSymmTimer; |
| |
| /**< Control frames buffer*/ |
| uint8_t pCtrlTxBuffer[10]; |
| |
| /**< Control frames buffer size*/ |
| uint8_t pCtrlTxBufferLength; |
| |
| /**< DISC packet send pending flag*/ |
| bool_t bDiscPendingFlag; |
| |
| /**< FRMR packet send pending flag*/ |
| bool_t bFrmrPendingFlag; |
| |
| /**< Header of pending FRMR packet*/ |
| phFriNfc_Llcp_sPacketHeader_t sFrmrHeader; |
| |
| /**< Info field of pending FRMR packet*/ |
| uint8_t pFrmrInfo[4]; |
| |
| /**< Send callback*/ |
| phFriNfc_Llcp_Send_CB_t pfSendCB; |
| |
| /**< Send callback*/ |
| void *pSendContext; |
| |
| /**< Pending send header*/ |
| phFriNfc_Llcp_sPacketHeader_t *psSendHeader; |
| |
| /**< Pending send sequence*/ |
| phFriNfc_Llcp_sPacketSequence_t *psSendSequence; |
| |
| /**< Pending send info*/ |
| phNfc_sData_t *psSendInfo; |
| |
| /**< Receive callback*/ |
| phFriNfc_Llcp_Recv_CB_t pfRecvCB; |
| |
| /**< Receive callback*/ |
| void *pRecvContext; |
| |
| } phFriNfc_Llcp_t; |
| |
| /*========== UNIONS ===========*/ |
| |
| |
| /*========== FUNCTIONS ===========*/ |
| |
| /*! |
| * \brief TODO |
| */ |
| NFCSTATUS phFriNfc_Llcp_EncodeLinkParams( phNfc_sData_t *psRawBuffer, |
| phFriNfc_Llcp_sLinkParameters_t *psLinkParams, |
| uint8_t nVersion ); |
| |
| |
| /*! |
| * \brief TODO |
| */ |
| NFCSTATUS phFriNfc_Llcp_Reset( phFriNfc_Llcp_t *Llcp, |
| void *LowerDevice, |
| phFriNfc_Llcp_sLinkParameters_t *psLinkParams, |
| void *pRxBuffer, |
| uint16_t nRxBufferLength, |
| void *pTxBuffer, |
| uint16_t nTxBufferLength, |
| phFriNfc_Llcp_LinkStatus_CB_t pfLink_CB, |
| void *pContext ); |
| |
| /*! |
| * \brief TODO |
| */ |
| NFCSTATUS phFriNfc_Llcp_ChkLlcp( phFriNfc_Llcp_t *Llcp, |
| phHal_sRemoteDevInformation_t *psRemoteDevInfo, |
| phFriNfc_Llcp_Check_CB_t pfCheck_CB, |
| void *pContext ); |
| |
| /*! |
| * \brief TODO |
| */ |
| NFCSTATUS phFriNfc_Llcp_Activate( phFriNfc_Llcp_t *Llcp ); |
| |
| /*! |
| * \brief TODO |
| */ |
| NFCSTATUS phFriNfc_Llcp_Deactivate( phFriNfc_Llcp_t *Llcp ); |
| |
| /*! |
| * \brief TODO |
| */ |
| NFCSTATUS phFriNfc_Llcp_GetLocalInfo( phFriNfc_Llcp_t *Llcp, |
| phFriNfc_Llcp_sLinkParameters_t *pParams ); |
| |
| /*! |
| * \brief TODO |
| */ |
| NFCSTATUS phFriNfc_Llcp_GetRemoteInfo( phFriNfc_Llcp_t *Llcp, |
| phFriNfc_Llcp_sLinkParameters_t *pParams ); |
| |
| /*! |
| * \brief TODO |
| */ |
| NFCSTATUS phFriNfc_Llcp_Send( phFriNfc_Llcp_t *Llcp, |
| phFriNfc_Llcp_sPacketHeader_t *psHeader, |
| phFriNfc_Llcp_sPacketSequence_t *psSequence, |
| phNfc_sData_t *psInfo, |
| phFriNfc_Llcp_Send_CB_t pfSend_CB, |
| void *pContext ); |
| |
| /*! |
| * \brief TODO |
| */ |
| NFCSTATUS phFriNfc_Llcp_Recv( phFriNfc_Llcp_t *Llcp, |
| phFriNfc_Llcp_Recv_CB_t pfRecv_CB, |
| void *pContext ); |
| |
| |
| #endif /* PHFRINFC_LLCP_H */ |