Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2010 NXP Semiconductors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /**
     18  * \file  phFriNfc_LlcpMac.c
     19  * \brief NFC LLCP MAC Mappings For Different RF Technologies.
     20  *
     21  * Project: NFC-FRI
     22  *
     23  */
     24 
     25 
     26 /*include files*/
     27 #include <phFriNfc_LlcpMac.h>
     28 #include <phFriNfc_LlcpMacNfcip.h>
     29 #include <phLibNfcStatus.h>
     30 #include <phLibNfc.h>
     31 #include <phLibNfc_Internal.h>
     32 
     33 NFCSTATUS phFriNfc_LlcpMac_Reset (phFriNfc_LlcpMac_t                 *LlcpMac,
     34                                   void                               *LowerDevice,
     35                                   phFriNfc_LlcpMac_LinkStatus_CB_t   LinkStatus_Cb,
     36                                   void                               *pContext)
     37 {
     38    NFCSTATUS status = NFCSTATUS_SUCCESS;
     39    /* Store the Linkstatus callback function of the upper layer */
     40    LlcpMac->LinkStatus_Cb = LinkStatus_Cb;
     41 
     42    /* Store a pointer to the upper layer context */
     43    LlcpMac->LinkStatus_Context = pContext;
     44 
     45    /* Set the LinkStatus variable to the default state */
     46    LlcpMac->LinkState = phFriNfc_LlcpMac_eLinkDefault;
     47 
     48    /* Store a pointer to the lower layer */
     49    LlcpMac->LowerDevice =  LowerDevice;
     50 
     51    LlcpMac->psRemoteDevInfo         = NULL;
     52    LlcpMac->PeerRemoteDevType       = 0;
     53    LlcpMac->MacType                 = 0;
     54    LlcpMac->MacReceive_Cb           = NULL;
     55    LlcpMac->MacSend_Cb              = NULL;
     56    LlcpMac->psSendBuffer            = NULL;
     57    LlcpMac->RecvPending             = 0;
     58    LlcpMac->SendPending             = 0;
     59 
     60    return status;
     61 }
     62 
     63 NFCSTATUS phFriNfc_LlcpMac_ChkLlcp (phFriNfc_LlcpMac_t                  *LlcpMac,
     64                                     phHal_sRemoteDevInformation_t       *psRemoteDevInfo,
     65                                     phFriNfc_LlcpMac_Chk_CB_t           ChkLlcpMac_Cb,
     66                                     void                                *pContext)
     67 {
     68    NFCSTATUS status = NFCSTATUS_SUCCESS;
     69    if (NULL == LlcpMac || NULL == psRemoteDevInfo)
     70    {
     71       status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
     72    }
     73    else
     74    {
     75       /* Store the Remote Device info received from Device Discovery  */
     76       LlcpMac->psRemoteDevInfo = psRemoteDevInfo;
     77 
     78       if(LlcpMac->psRemoteDevInfo->RemDevType == phHal_eNfcIP1_Initiator)
     79       {
     80          /* Set the PeerRemoteDevType variable to the Target type */
     81          LlcpMac->PeerRemoteDevType = phFriNfc_LlcpMac_ePeerTypeTarget;
     82       }
     83       else if(LlcpMac->psRemoteDevInfo->RemDevType == phHal_eNfcIP1_Target)
     84       {
     85          /* Set the PeerRemoteDevType variable to the Initiator type */
     86          LlcpMac->PeerRemoteDevType = phFriNfc_LlcpMac_ePeerTypeInitiator;
     87       }
     88 
     89       switch(LlcpMac->psRemoteDevInfo->RemDevType)
     90       {
     91       case phHal_eNfcIP1_Initiator:
     92       case phHal_eNfcIP1_Target:
     93          {
     94             /* Set the MAC mapping type detected */
     95             LlcpMac->MacType = phFriNfc_LlcpMac_eTypeNfcip;
     96 
     97             /* Register the lower layer to the MAC mapping component */
     98             status = phFriNfc_LlcpMac_Nfcip_Register (LlcpMac);
     99             if(status == NFCSTATUS_SUCCESS)
    100             {
    101                status  = LlcpMac->LlcpMacInterface.chk(LlcpMac,ChkLlcpMac_Cb,pContext);
    102             }
    103             else
    104             {
    105                status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_FAILED);
    106             }
    107          }break;
    108       default:
    109          {
    110             status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_DEVICE);
    111          }break;
    112       }
    113    }
    114 
    115    return status;
    116 }
    117 
    118 NFCSTATUS phFriNfc_LlcpMac_Activate (phFriNfc_LlcpMac_t   *LlcpMac)
    119 {
    120    NFCSTATUS status = NFCSTATUS_SUCCESS;
    121 
    122    if(LlcpMac->LlcpMacInterface.activate == NULL)
    123    {
    124       status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
    125    }
    126    else
    127    {
    128       status = LlcpMac->LlcpMacInterface.activate(LlcpMac);
    129    }
    130    return status;
    131 }
    132 
    133 NFCSTATUS phFriNfc_LlcpMac_Deactivate (phFriNfc_LlcpMac_t   *LlcpMac)
    134 {
    135    NFCSTATUS status = NFCSTATUS_SUCCESS;
    136    if(LlcpMac->LlcpMacInterface.deactivate == NULL)
    137    {
    138       status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
    139    }
    140    else
    141    {
    142       status = LlcpMac->LlcpMacInterface.deactivate(LlcpMac);
    143    }
    144    return status;
    145 }
    146 
    147 NFCSTATUS phFriNfc_LlcpMac_Send (phFriNfc_LlcpMac_t               *LlcpMac,
    148                                  phNfc_sData_t                    *psData,
    149                                  phFriNfc_LlcpMac_Send_CB_t       LlcpMacSend_Cb,
    150                                  void                             *pContext)
    151 {
    152    NFCSTATUS status = NFCSTATUS_SUCCESS;
    153 
    154    if(NULL== LlcpMac->LlcpMacInterface.send || NULL==psData || NULL==LlcpMacSend_Cb || NULL==pContext)
    155    {
    156       status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
    157    }
    158    else
    159    {
    160       status = LlcpMac->LlcpMacInterface.send(LlcpMac,psData,LlcpMacSend_Cb,pContext);
    161    }
    162    return status;
    163 }
    164 
    165 NFCSTATUS phFriNfc_LlcpMac_Receive (phFriNfc_LlcpMac_t               *LlcpMac,
    166                                     phNfc_sData_t                    *psData,
    167                                     phFriNfc_LlcpMac_Reveive_CB_t    ReceiveLlcpMac_Cb,
    168                                     void                             *pContext)
    169 {
    170    NFCSTATUS status = NFCSTATUS_SUCCESS;
    171 
    172    if(LlcpMac->LlcpMacInterface.receive == NULL || NULL==psData || NULL==ReceiveLlcpMac_Cb || NULL==pContext)
    173    {
    174       status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER);
    175    }
    176    else
    177    {
    178       status = LlcpMac->LlcpMacInterface.receive(LlcpMac,psData,ReceiveLlcpMac_Cb,pContext);
    179    }
    180    return status;
    181 
    182 }
    183 
    184 
    185