summaryrefslogtreecommitdiffstats
path: root/src/phFriNfc_Llcp.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/phFriNfc_Llcp.h')
-rw-r--r--src/phFriNfc_Llcp.h442
1 files changed, 442 insertions, 0 deletions
diff --git a/src/phFriNfc_Llcp.h b/src/phFriNfc_Llcp.h
new file mode 100644
index 0000000..ce68907
--- /dev/null
+++ b/src/phFriNfc_Llcp.h
@@ -0,0 +1,442 @@
+/*
+ * 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 0x30 /**< 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 */
+/*@}*/
+
+
+/*========== 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 */