/* * 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_LlcpMac.c * \brief NFC LLCP MAC Mappings For Different RF Technologies. * * Project: NFC-FRI * */ /*include files*/ #include <phFriNfc_LlcpMac.h> #include <phFriNfc_LlcpMacNfcip.h> #include <phLibNfcStatus.h> #include <phLibNfc.h> #include <phLibNfc_Internal.h> NFCSTATUS phFriNfc_LlcpMac_Reset (phFriNfc_LlcpMac_t *LlcpMac, void *LowerDevice, phFriNfc_LlcpMac_LinkStatus_CB_t LinkStatus_Cb, void *pContext) { NFCSTATUS status = NFCSTATUS_SUCCESS; /* Store the Linkstatus callback function of the upper layer */ LlcpMac->LinkStatus_Cb = LinkStatus_Cb; /* Store a pointer to the upper layer context */ LlcpMac->LinkStatus_Context = pContext; /* Set the LinkStatus variable to the default state */ LlcpMac->LinkState = phFriNfc_LlcpMac_eLinkDefault; /* Store a pointer to the lower layer */ LlcpMac->LowerDevice = LowerDevice; LlcpMac->psRemoteDevInfo = NULL; LlcpMac->PeerRemoteDevType = 0; LlcpMac->MacType = 0; LlcpMac->MacReceive_Cb = NULL; LlcpMac->MacSend_Cb = NULL; LlcpMac->psSendBuffer = NULL; LlcpMac->RecvPending = 0; LlcpMac->SendPending = 0; return status; } NFCSTATUS phFriNfc_LlcpMac_ChkLlcp (phFriNfc_LlcpMac_t *LlcpMac, phHal_sRemoteDevInformation_t *psRemoteDevInfo, phFriNfc_LlcpMac_Chk_CB_t ChkLlcpMac_Cb, void *pContext) { NFCSTATUS status = NFCSTATUS_SUCCESS; if (NULL == LlcpMac || NULL == psRemoteDevInfo) { status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER); } else { /* Store the Remote Device info received from Device Discovery */ LlcpMac->psRemoteDevInfo = psRemoteDevInfo; if(LlcpMac->psRemoteDevInfo->RemDevType == phHal_eNfcIP1_Initiator) { /* Set the PeerRemoteDevType variable to the Target type */ LlcpMac->PeerRemoteDevType = phFriNfc_LlcpMac_ePeerTypeTarget; } else if(LlcpMac->psRemoteDevInfo->RemDevType == phHal_eNfcIP1_Target) { /* Set the PeerRemoteDevType variable to the Initiator type */ LlcpMac->PeerRemoteDevType = phFriNfc_LlcpMac_ePeerTypeInitiator; } switch(LlcpMac->psRemoteDevInfo->RemDevType) { case phHal_eNfcIP1_Initiator: case phHal_eNfcIP1_Target: { /* Set the MAC mapping type detected */ LlcpMac->MacType = phFriNfc_LlcpMac_eTypeNfcip; /* Register the lower layer to the MAC mapping component */ status = phFriNfc_LlcpMac_Nfcip_Register (LlcpMac); if(status == NFCSTATUS_SUCCESS) { status = LlcpMac->LlcpMacInterface.chk(LlcpMac,ChkLlcpMac_Cb,pContext); } else { status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_FAILED); } }break; default: { status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_DEVICE); }break; } } return status; } NFCSTATUS phFriNfc_LlcpMac_Activate (phFriNfc_LlcpMac_t *LlcpMac) { NFCSTATUS status = NFCSTATUS_SUCCESS; if(LlcpMac->LlcpMacInterface.activate == NULL) { status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER); } else { status = LlcpMac->LlcpMacInterface.activate(LlcpMac); } return status; } NFCSTATUS phFriNfc_LlcpMac_Deactivate (phFriNfc_LlcpMac_t *LlcpMac) { NFCSTATUS status = NFCSTATUS_SUCCESS; if(LlcpMac->LlcpMacInterface.deactivate == NULL) { status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER); } else { status = LlcpMac->LlcpMacInterface.deactivate(LlcpMac); } return status; } NFCSTATUS phFriNfc_LlcpMac_Send (phFriNfc_LlcpMac_t *LlcpMac, phNfc_sData_t *psData, phFriNfc_LlcpMac_Send_CB_t LlcpMacSend_Cb, void *pContext) { NFCSTATUS status = NFCSTATUS_SUCCESS; if(NULL== LlcpMac->LlcpMacInterface.send || NULL==psData || NULL==LlcpMacSend_Cb || NULL==pContext) { status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER); } else { status = LlcpMac->LlcpMacInterface.send(LlcpMac,psData,LlcpMacSend_Cb,pContext); } return status; } NFCSTATUS phFriNfc_LlcpMac_Receive (phFriNfc_LlcpMac_t *LlcpMac, phNfc_sData_t *psData, phFriNfc_LlcpMac_Reveive_CB_t ReceiveLlcpMac_Cb, void *pContext) { NFCSTATUS status = NFCSTATUS_SUCCESS; if(LlcpMac->LlcpMacInterface.receive == NULL || NULL==psData || NULL==ReceiveLlcpMac_Cb || NULL==pContext) { status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER); } else { status = LlcpMac->LlcpMacInterface.receive(LlcpMac,psData,ReceiveLlcpMac_Cb,pContext); } return status; }