/*
* 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;
}