phFriNfc_LlcpMacNfcip.c revision c2c730a21faacadbb607bfa182795262d00a8ec7
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/** 195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \file phFriNfc_LlcpMacNfcip.c 205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \brief NFC LLCP MAC Mappings For Different RF Technologies. 215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Project: NFC-FRI 235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*include files*/ 285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_LlcpMac.h> 295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfcStatus.h> 305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc.h> 315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc_Internal.h> 325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <stdio.h> 335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <string.h> 345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Send(phFriNfc_LlcpMac_t *LlcpMac, 365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phNfc_sData_t *psData, 375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_LlcpMac_Send_CB_t LlcpMacSend_Cb, 385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pContext); 395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 41c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneaustatic void phFriNfc_LlcpMac_Nfcip_TriggerRecvCb(phFriNfc_LlcpMac_t *LlcpMac, 42c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau NFCSTATUS status) 43c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau{ 44c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau phFriNfc_LlcpMac_Reveive_CB_t pfReceiveCB; 45c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau void *pReceiveContext; 46c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau 47c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau if (LlcpMac->MacReceive_Cb != NULL) 48c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau { 49c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau /* Save callback params */ 50c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau pfReceiveCB = LlcpMac->MacReceive_Cb; 51c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau pReceiveContext = LlcpMac->MacReceive_Context; 52c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau 53c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau /* Reset the pointer to the Receive Callback and Context*/ 54c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau LlcpMac->MacReceive_Cb = NULL; 55c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau LlcpMac->MacReceive_Context = NULL; 56c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau 57c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau /* Call the receive callback */ 58c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau pfReceiveCB(pReceiveContext, status, LlcpMac->psReceiveBuffer); 59c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau } 60c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau} 61c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau 62c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneaustatic void phFriNfc_LlcpMac_Nfcip_TriggerSendCb(phFriNfc_LlcpMac_t *LlcpMac, 63c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau NFCSTATUS status) 64c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau{ 65c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau phFriNfc_LlcpMac_Send_CB_t pfSendCB; 66c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau void *pSendContext; 67c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau 68c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau if (LlcpMac->MacSend_Cb != NULL) 69c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau { 70c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau /* Save context in local variables */ 71c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau pfSendCB = LlcpMac->MacSend_Cb; 72c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau pSendContext = LlcpMac->MacSend_Context; 73c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau 74c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau /* Reset the pointer to the Send Callback */ 75c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau LlcpMac->MacSend_Cb = NULL; 76c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau LlcpMac->MacSend_Context = NULL; 77c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau 78c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau /* Call Send callback */ 79c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau pfSendCB(pSendContext, status); 80c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau } 81c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau} 82c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau 835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Chk(phFriNfc_LlcpMac_t *LlcpMac, 845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_LlcpMac_Chk_CB_t ChkLlcpMac_Cb, 855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pContext) 865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t Llcp_Magic_Number[] = {0x46,0x66,0x6D}; 895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL == LlcpMac || NULL == ChkLlcpMac_Cb || NULL == pContext) 915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER); 935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = (NFCSTATUS)memcmp(Llcp_Magic_Number,LlcpMac->psRemoteDevInfo->RemoteDevInfo.NfcIP_Info.ATRInfo,3); 975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(!status) 985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->sConfigParam.buffer = &LlcpMac->psRemoteDevInfo->RemoteDevInfo.NfcIP_Info.ATRInfo[3] ; 1005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->sConfigParam.length = (LlcpMac->psRemoteDevInfo->RemoteDevInfo.NfcIP_Info.ATRInfo_Length - 3); 1015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_SUCCESS; 1025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 1045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_FAILED); 1065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ChkLlcpMac_Cb(pContext,status); 1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Activate (phFriNfc_LlcpMac_t *LlcpMac) 1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(LlcpMac == NULL) 1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER); 1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LinkState = phFriNfc_LlcpMac_eLinkActivated; 1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LinkStatus_Cb(LlcpMac->LinkStatus_Context, 1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LinkState, 1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &LlcpMac->sConfigParam, 1275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->PeerRemoteDevType); 1285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 1315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 1325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Deactivate (phFriNfc_LlcpMac_t *LlcpMac) 1345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 1355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 1365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL == LlcpMac) 1385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER); 1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Set the flag of LinkStatus to deactivate */ 1445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LinkState = phFriNfc_LlcpMac_eLinkDeactivated; 1455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14735a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau if (LlcpMac->SendPending) 14835a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau { 14935a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau /* Reset Flag */ 15035a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau LlcpMac->SendPending = FALSE; 15135a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau 152c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau phFriNfc_LlcpMac_Nfcip_TriggerSendCb(LlcpMac, NFCSTATUS_FAILED); 15335a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau } 15435a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau 15535a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau if (LlcpMac->RecvPending) 15635a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau { 15735a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau /* Reset Flag */ 15835a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau LlcpMac->RecvPending = FALSE; 15935a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau 160c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau phFriNfc_LlcpMac_Nfcip_TriggerRecvCb(LlcpMac, NFCSTATUS_FAILED); 16135a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau } 16235a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau 1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LinkStatus_Cb(LlcpMac->LinkStatus_Context, 1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LinkState, 1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NULL, 1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->PeerRemoteDevType); 1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_LlcpMac_Nfcip_Send_Cb(void *pContext, 1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status) 1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_LlcpMac_t *LlcpMac = (phFriNfc_LlcpMac_t *)pContext; 1755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1766e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES 1776e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas if(gpphLibContext->LibNfcState.next_state 1786e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas == eLibNfcHalStateShutdown) 1796e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas { 1806e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas phLibNfc_Pending_Shutdown(); 1816e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas Status = NFCSTATUS_SHUTDOWN; 1826e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas } 1836e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */ 1846e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset Send and Receive Flag */ 1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->SendPending = FALSE; 1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->RecvPending = FALSE; 1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 189c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau phFriNfc_LlcpMac_Nfcip_TriggerSendCb(LlcpMac, Status); 1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_LlcpMac_Nfcip_Receive_Cb(void *pContext, 1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status) 1955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 1965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_LlcpMac_t *LlcpMac = (phFriNfc_LlcpMac_t *)pContext; 1976e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES 1986e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 1996e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas phFriNfc_LlcpMac_Send_CB_t pfSendCB; 2006e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas void *pSendContext; 2016e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2026e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2036e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas if(gpphLibContext->LibNfcState.next_state 2046e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas == eLibNfcHalStateShutdown) 2056e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas { 2066e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas phLibNfc_Pending_Shutdown(); 2076e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas Status = NFCSTATUS_SHUTDOWN; 2086e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas } 2096e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2106e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas if (NFCSTATUS_SHUTDOWN == Status) 2116e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas { 2126e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas /* Save context in local variables */ 2136e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas pfSendCB = LlcpMac->MacSend_Cb; 2146e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas pSendContext = LlcpMac->MacSend_Context; 2156e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2166e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas /* Reset the pointer to the Send Callback */ 2176e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas LlcpMac->MacSend_Cb = NULL; 2186e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas LlcpMac->MacSend_Context = NULL; 2196e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2206e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas /* Reset Send and Receive Flag */ 2216e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas LlcpMac->SendPending = FALSE; 2226e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas LlcpMac->RecvPending = FALSE; 2236e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas } 2246e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2256e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */ 2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 227c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau phFriNfc_LlcpMac_Nfcip_TriggerRecvCb(LlcpMac, Status); 2285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2296e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES 2306e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2316e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas if (NFCSTATUS_SHUTDOWN == Status) 2326e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas { 2336e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas if ((LlcpMac->SendPending) && (NULL != pfSendCB)) 2346e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas { 2356e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas pfSendCB(pSendContext, Status); 2366e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas } 2376e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas } 2386e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas else 2396e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2406e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */ 2416e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas { 2425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Test if a send is pending */ 2435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(LlcpMac->SendPending) 2445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_LlcpMac_Nfcip_Send(LlcpMac,LlcpMac->psSendBuffer,LlcpMac->MacSend_Cb,LlcpMac->MacReceive_Context); 2465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 2486e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas} 2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_LlcpMac_Nfcip_Transceive_Cb(void *pContext, 2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status) 2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_LlcpMac_t *LlcpMac = (phFriNfc_LlcpMac_t *)pContext; 2545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2556e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES 2566e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas if(gpphLibContext->LibNfcState.next_state 2576e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas == eLibNfcHalStateShutdown) 2586e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas { 2596e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas phLibNfc_Pending_Shutdown(); 2606e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas Status = NFCSTATUS_SHUTDOWN; 2616e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas } 2626e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */ 2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset Send and Receive Flag */ 2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->SendPending = FALSE; 2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->RecvPending = FALSE; 2675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Call the callbacks */ 269c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau phFriNfc_LlcpMac_Nfcip_TriggerSendCb(LlcpMac, Status); 270c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau phFriNfc_LlcpMac_Nfcip_TriggerRecvCb(LlcpMac, Status); 2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Send(phFriNfc_LlcpMac_t *LlcpMac, 2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phNfc_sData_t *psData, 2755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_LlcpMac_Send_CB_t LlcpMacSend_Cb, 2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pContext) 2775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 2785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 2795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL == LlcpMac || NULL == psData || NULL == LlcpMacSend_Cb || NULL == pContext) 2815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER); 2835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(LlcpMac->MacSend_Cb != NULL && LlcpMac->PeerRemoteDevType == phFriNfc_LlcpMac_ePeerTypeInitiator) 2855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Previous callback is pending */ 2875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_REJECTED; 2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Save the LlcpMacSend_Cb */ 2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacSend_Cb = LlcpMacSend_Cb; 2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacSend_Context = pContext; 2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(LlcpMac->PeerRemoteDevType) 2965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phFriNfc_LlcpMac_ePeerTypeInitiator: 2985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(LlcpMac->RecvPending) 3005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the completion routines for the LLCP Transceive function*/ 3025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Transceive_Cb; 3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.Context = LlcpMac; 3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the command type*/ 3065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->Cmd.NfcIP1Cmd = phHal_eNfcIP1_Raw; 3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the Additional Info*/ 3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psDepAdditionalInfo.DepFlags.MetaChaining = 0; 3105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psDepAdditionalInfo.DepFlags.NADPresent = 0; 3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->SendPending = TRUE; 3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_OvrHal_Transceive(LlcpMac->LowerDevice, 3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &LlcpMac->MacCompletionInfo, 3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psRemoteDevInfo, 3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->Cmd, 3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &LlcpMac->psDepAdditionalInfo, 3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psData->buffer, 3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint16_t)psData->length, 3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psReceiveBuffer->buffer, 3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint16_t*)&LlcpMac->psReceiveBuffer->length); 3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->SendPending = TRUE; 3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psSendBuffer = psData; 3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status = NFCSTATUS_PENDING; 3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }break; 3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phFriNfc_LlcpMac_ePeerTypeTarget: 3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(!LlcpMac->RecvPending) 3335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->SendPending = TRUE; 3355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psSendBuffer = psData; 3365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status = NFCSTATUS_PENDING; 3375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the completion routines for the LLCP Send function*/ 3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Send_Cb; 3425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.Context = LlcpMac; 3435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_OvrHal_Send(LlcpMac->LowerDevice, 3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &LlcpMac->MacCompletionInfo, 3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psRemoteDevInfo, 3465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psData->buffer, 3475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint16_t)psData->length); 3485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }break; 3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_DEVICE); 3535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }break; 3545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Receive(phFriNfc_LlcpMac_t *LlcpMac, 3605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phNfc_sData_t *psData, 3615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_LlcpMac_Reveive_CB_t LlcpMacReceive_Cb, 3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pContext) 3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 3655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL == LlcpMac || NULL==psData || NULL == LlcpMacReceive_Cb || NULL == pContext) 3665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER); 3685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(LlcpMac->MacReceive_Cb != NULL) 3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Previous callback is pending */ 3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_REJECTED; 3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Save the LlcpMacReceive_Cb */ 3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacReceive_Cb = LlcpMacReceive_Cb; 3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacReceive_Context = pContext; 3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Save the pointer to the receive buffer */ 3815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psReceiveBuffer= psData; 3825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(LlcpMac->PeerRemoteDevType) 3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phFriNfc_LlcpMac_ePeerTypeInitiator: 3865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(LlcpMac->SendPending) 3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the completion routines for the LLCP Transceive function*/ 3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Transceive_Cb; 3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.Context = LlcpMac; 3925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the command type*/ 3935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->Cmd.NfcIP1Cmd = phHal_eNfcIP1_Raw; 3945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the Additional Info*/ 3955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psDepAdditionalInfo.DepFlags.MetaChaining = 0; 3965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psDepAdditionalInfo.DepFlags.NADPresent = 0; 3975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->RecvPending = TRUE; 3985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_OvrHal_Transceive(LlcpMac->LowerDevice, 4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &LlcpMac->MacCompletionInfo, 4015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psRemoteDevInfo, 4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->Cmd, 4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &LlcpMac->psDepAdditionalInfo, 4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psSendBuffer->buffer, 4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint16_t)LlcpMac->psSendBuffer->length, 4065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psData->buffer, 4075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint16_t*)&psData->length); 4085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->RecvPending = TRUE; 4125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status = NFCSTATUS_PENDING; 4135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }break; 4155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phFriNfc_LlcpMac_ePeerTypeTarget: 4165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the completion routines for the LLCP Receive function*/ 4185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Receive_Cb; 4195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* save the context of LlcpMacNfcip */ 4205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.Context = LlcpMac; 4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->RecvPending = TRUE; 4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_OvrHal_Receive(LlcpMac->LowerDevice, 4245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &LlcpMac->MacCompletionInfo, 4255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psRemoteDevInfo, 4265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psReceiveBuffer->buffer, 4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint16_t*)&LlcpMac->psReceiveBuffer->length); 4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }break; 4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 4305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_DEVICE); 4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }break; 4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_LlcpMac_Nfcip_Register (phFriNfc_LlcpMac_t *LlcpMac) 4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL != LlcpMac) 4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LlcpMacInterface.chk = phFriNfc_LlcpMac_Nfcip_Chk; 4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LlcpMacInterface.activate = phFriNfc_LlcpMac_Nfcip_Activate; 4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LlcpMacInterface.deactivate = phFriNfc_LlcpMac_Nfcip_Deactivate; 4485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LlcpMacInterface.send = phFriNfc_LlcpMac_Nfcip_Send; 4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LlcpMacInterface.receive = phFriNfc_LlcpMac_Nfcip_Receive; 4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return NFCSTATUS_SUCCESS; 4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_FAILED); 4565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 458