15d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
25d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Copyright (C) 2010 NXP Semiconductors
35d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
45d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Licensed under the Apache License, Version 2.0 (the "License");
55d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * you may not use this file except in compliance with the License.
65d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * You may obtain a copy of the License at
75d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
85d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *      http://www.apache.org/licenses/LICENSE-2.0
95d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Unless required by applicable law or agreed to in writing, software
115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * distributed under the License is distributed on an "AS IS" BASIS,
125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * See the License for the specific language governing permissions and
145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * limitations under the License.
155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/**
185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \file  phFriNfc_LlcpMac.c
195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief NFC LLCP MAC Mappings For Different RF Technologies.
205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Project: NFC-FRI
225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *
235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */
245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*include files*/
275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_LlcpMac.h>
285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_LlcpMacNfcip.h>
295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfcStatus.h>
305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc.h>
315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc_Internal.h>
325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_LlcpMac_Reset (phFriNfc_LlcpMac_t                 *LlcpMac,
345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                  void                               *LowerDevice,
355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                  phFriNfc_LlcpMac_LinkStatus_CB_t   LinkStatus_Cb,
365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                  void                               *pContext)
375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   NFCSTATUS status = NFCSTATUS_SUCCESS;
395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   /* Store the Linkstatus callback function of the upper layer */
405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->LinkStatus_Cb = LinkStatus_Cb;
415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   /* Store a pointer to the upper layer context */
435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->LinkStatus_Context = pContext;
445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   /* Set the LinkStatus variable to the default state */
465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->LinkState = phFriNfc_LlcpMac_eLinkDefault;
475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   /* Store a pointer to the lower layer */
495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->LowerDevice =  LowerDevice;
505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->psRemoteDevInfo         = NULL;
525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->PeerRemoteDevType       = 0;
535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->MacType                 = 0;
545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->MacReceive_Cb           = NULL;
555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->MacSend_Cb              = NULL;
565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->psSendBuffer            = NULL;
575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->RecvPending             = 0;
585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   LlcpMac->SendPending             = 0;
595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   return status;
615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_LlcpMac_ChkLlcp (phFriNfc_LlcpMac_t                  *LlcpMac,
645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    phHal_sRemoteDevInformation_t       *psRemoteDevInfo,
655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    phFriNfc_LlcpMac_Chk_CB_t           ChkLlcpMac_Cb,
665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    void                                *pContext)
675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   NFCSTATUS status = NFCSTATUS_SUCCESS;
695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if (NULL == LlcpMac || NULL == psRemoteDevInfo)
705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else
745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      /* Store the Remote Device info received from Device Discovery  */
765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      LlcpMac->psRemoteDevInfo = psRemoteDevInfo;
775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      if(LlcpMac->psRemoteDevInfo->RemDevType == phHal_eNfcIP1_Initiator)
795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      {
805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         /* Set the PeerRemoteDevType variable to the Target type */
815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         LlcpMac->PeerRemoteDevType = phFriNfc_LlcpMac_ePeerTypeTarget;
825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      }
835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      else if(LlcpMac->psRemoteDevInfo->RemDevType == phHal_eNfcIP1_Target)
845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      {
855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         /* Set the PeerRemoteDevType variable to the Initiator type */
865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         LlcpMac->PeerRemoteDevType = phFriNfc_LlcpMac_ePeerTypeInitiator;
875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      }
885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      switch(LlcpMac->psRemoteDevInfo->RemDevType)
905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      {
915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      case phHal_eNfcIP1_Initiator:
925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      case phHal_eNfcIP1_Target:
935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         {
945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Set the MAC mapping type detected */
955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            LlcpMac->MacType = phFriNfc_LlcpMac_eTypeNfcip;
965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Register the lower layer to the MAC mapping component */
985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = phFriNfc_LlcpMac_Nfcip_Register (LlcpMac);
995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            if(status == NFCSTATUS_SUCCESS)
1005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
1015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               status  = LlcpMac->LlcpMacInterface.chk(LlcpMac,ChkLlcpMac_Cb,pContext);
1025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
1035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
1045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
1055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly               status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_FAILED);
1065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         }break;
1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      default:
1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         {
1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_DEVICE);
1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         }break;
1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      }
1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   return status;
1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_LlcpMac_Activate (phFriNfc_LlcpMac_t   *LlcpMac)
1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   NFCSTATUS status = NFCSTATUS_SUCCESS;
1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if(LlcpMac->LlcpMacInterface.activate == NULL)
1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else
1275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
1285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = LlcpMac->LlcpMacInterface.activate(LlcpMac);
1295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
1305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   return status;
1315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_LlcpMac_Deactivate (phFriNfc_LlcpMac_t   *LlcpMac)
1345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   NFCSTATUS status = NFCSTATUS_SUCCESS;
1365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if(LlcpMac->LlcpMacInterface.deactivate == NULL)
1375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
1385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else
1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = LlcpMac->LlcpMacInterface.deactivate(LlcpMac);
1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
1445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   return status;
1455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_LlcpMac_Send (phFriNfc_LlcpMac_t               *LlcpMac,
1485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 phNfc_sData_t                    *psData,
1495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 phFriNfc_LlcpMac_Send_CB_t       LlcpMacSend_Cb,
1505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                 void                             *pContext)
1515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   NFCSTATUS status = NFCSTATUS_SUCCESS;
1535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if(NULL== LlcpMac->LlcpMacInterface.send || NULL==psData || NULL==LlcpMacSend_Cb || NULL==pContext)
1555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
1565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
1575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
1585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else
1595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
1605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = LlcpMac->LlcpMacInterface.send(LlcpMac,psData,LlcpMacSend_Cb,pContext);
1615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
1625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   return status;
1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_LlcpMac_Receive (phFriNfc_LlcpMac_t               *LlcpMac,
1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    phNfc_sData_t                    *psData,
1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    phFriNfc_LlcpMac_Reveive_CB_t    ReceiveLlcpMac_Cb,
1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                    void                             *pContext)
1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   NFCSTATUS status = NFCSTATUS_SUCCESS;
1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   if(LlcpMac->LlcpMacInterface.receive == NULL || NULL==psData || NULL==ReceiveLlcpMac_Cb || NULL==pContext)
1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
1755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
1765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   else
1775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   {
1785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly      status = LlcpMac->LlcpMacInterface.receive(LlcpMac,psData,ReceiveLlcpMac_Cb,pContext);
1795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   }
1805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly   return status;
1815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
185