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