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 } 1072ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi ChkLlcpMac_Cb(pContext,status); 1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 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; 14535a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau 1462ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi if (LlcpMac->SendPending) 1472ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi { 1482ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi /* Reset Flag */ 1492ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi LlcpMac->SendPending = FALSE; 1502ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi phFriNfc_LlcpMac_Nfcip_TriggerSendCb(LlcpMac, NFCSTATUS_FAILED); 1512ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi } 15235a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau 1532ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi if (LlcpMac->RecvPending) 1542ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi { 1552ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi /* Reset Flag */ 1562ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi LlcpMac->RecvPending = FALSE; 1572ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi phFriNfc_LlcpMac_Nfcip_TriggerRecvCb(LlcpMac, NFCSTATUS_FAILED); 1582ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi } 15935a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau 1602ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi LlcpMac->LinkStatus_Cb(LlcpMac->LinkStatus_Context, 1612ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi LlcpMac->LinkState, 1622ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi NULL, 1632ee71571ead17d435e9d9e8be300edd5d45333b7Sunil Jogi LlcpMac->PeerRemoteDevType); 16435a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau } 16535a9f321a9cb5db0e65b9579d11bee2ac9bb1c54Sylvain Fonteneau 1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_LlcpMac_Nfcip_Send_Cb(void *pContext, 1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status) 1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_LlcpMac_t *LlcpMac = (phFriNfc_LlcpMac_t *)pContext; 1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1746e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES 1756e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas if(gpphLibContext->LibNfcState.next_state 1766e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas == eLibNfcHalStateShutdown) 1776e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas { 1786e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas phLibNfc_Pending_Shutdown(); 1796e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas Status = NFCSTATUS_SHUTDOWN; 1806e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas } 1816e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */ 1826e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset Send and Receive Flag */ 1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->SendPending = FALSE; 1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->RecvPending = FALSE; 1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 187c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau phFriNfc_LlcpMac_Nfcip_TriggerSendCb(LlcpMac, Status); 1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_LlcpMac_Nfcip_Receive_Cb(void *pContext, 1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status) 1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_LlcpMac_t *LlcpMac = (phFriNfc_LlcpMac_t *)pContext; 1956e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES 1966e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 1976e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas phFriNfc_LlcpMac_Send_CB_t pfSendCB; 1986e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas void *pSendContext; 1996e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2006e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2016e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas if(gpphLibContext->LibNfcState.next_state 2026e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas == eLibNfcHalStateShutdown) 2036e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas { 2046e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas phLibNfc_Pending_Shutdown(); 2056e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas Status = NFCSTATUS_SHUTDOWN; 2066e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas } 2076e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2086e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas if (NFCSTATUS_SHUTDOWN == Status) 2096e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas { 2106e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas /* Save context in local variables */ 2116e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas pfSendCB = LlcpMac->MacSend_Cb; 2126e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas pSendContext = LlcpMac->MacSend_Context; 2136e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2146e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas /* Reset the pointer to the Send Callback */ 2156e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas LlcpMac->MacSend_Cb = NULL; 2166e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas LlcpMac->MacSend_Context = NULL; 2176e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2186e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas /* Reset Send and Receive Flag */ 2196e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas LlcpMac->SendPending = FALSE; 2206e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas LlcpMac->RecvPending = FALSE; 2216e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas } 2226e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2236e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */ 2245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 225c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau phFriNfc_LlcpMac_Nfcip_TriggerRecvCb(LlcpMac, Status); 2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2276e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES 2286e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2296e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas if (NFCSTATUS_SHUTDOWN == Status) 2306e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas { 2316e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas if ((LlcpMac->SendPending) && (NULL != pfSendCB)) 2326e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas { 2336e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas pfSendCB(pSendContext, Status); 2346e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas } 2356e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas } 2366e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas else 2376e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas 2386e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */ 2396e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas { 2405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Test if a send is pending */ 2415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(LlcpMac->SendPending) 2425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 243de9450aac004d93771d610c98588ff34a6749d10Sylvain Fonteneau Status = phFriNfc_LlcpMac_Nfcip_Send(LlcpMac,LlcpMac->psSendBuffer,LlcpMac->MacSend_Cb,LlcpMac->MacSend_Context); 2445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 2466e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas} 2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_LlcpMac_Nfcip_Transceive_Cb(void *pContext, 2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status) 2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_LlcpMac_t *LlcpMac = (phFriNfc_LlcpMac_t *)pContext; 2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2536e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#ifdef LLCP_CHANGES 2546e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas if(gpphLibContext->LibNfcState.next_state 2556e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas == eLibNfcHalStateShutdown) 2566e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas { 2576e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas phLibNfc_Pending_Shutdown(); 2586e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas Status = NFCSTATUS_SHUTDOWN; 2596e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas } 2606e286043593b281d161dad4969e05ba9c53ef6d1daniel_Tomas#endif /* #ifdef LLCP_CHANGES */ 2615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset Send and Receive Flag */ 2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->SendPending = FALSE; 2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->RecvPending = FALSE; 2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Call the callbacks */ 267c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau phFriNfc_LlcpMac_Nfcip_TriggerSendCb(LlcpMac, Status); 268c2c730a21faacadbb607bfa182795262d00a8ec7Sylvain Fonteneau phFriNfc_LlcpMac_Nfcip_TriggerRecvCb(LlcpMac, Status); 2695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 2705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Send(phFriNfc_LlcpMac_t *LlcpMac, 2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phNfc_sData_t *psData, 2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_LlcpMac_Send_CB_t LlcpMacSend_Cb, 2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pContext) 2755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 2775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL == LlcpMac || NULL == psData || NULL == LlcpMacSend_Cb || NULL == pContext) 2795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER); 2815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(LlcpMac->MacSend_Cb != NULL && LlcpMac->PeerRemoteDevType == phFriNfc_LlcpMac_ePeerTypeInitiator) 2835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Previous callback is pending */ 2855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_REJECTED; 2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Save the LlcpMacSend_Cb */ 2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacSend_Cb = LlcpMacSend_Cb; 2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacSend_Context = pContext; 2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(LlcpMac->PeerRemoteDevType) 2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phFriNfc_LlcpMac_ePeerTypeInitiator: 2965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(LlcpMac->RecvPending) 2985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the completion routines for the LLCP Transceive function*/ 3005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Transceive_Cb; 3015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.Context = LlcpMac; 3025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the command type*/ 3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->Cmd.NfcIP1Cmd = phHal_eNfcIP1_Raw; 3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the Additional Info*/ 3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psDepAdditionalInfo.DepFlags.MetaChaining = 0; 3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psDepAdditionalInfo.DepFlags.NADPresent = 0; 3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->SendPending = TRUE; 3105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_OvrHal_Transceive(LlcpMac->LowerDevice, 3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &LlcpMac->MacCompletionInfo, 3135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psRemoteDevInfo, 3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->Cmd, 3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &LlcpMac->psDepAdditionalInfo, 3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psData->buffer, 3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint16_t)psData->length, 3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psReceiveBuffer->buffer, 3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint16_t*)&LlcpMac->psReceiveBuffer->length); 3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->SendPending = TRUE; 3245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psSendBuffer = psData; 3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status = NFCSTATUS_PENDING; 3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }break; 3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phFriNfc_LlcpMac_ePeerTypeTarget: 3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(!LlcpMac->RecvPending) 3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->SendPending = TRUE; 3335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psSendBuffer = psData; 3345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status = NFCSTATUS_PENDING; 3355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the completion routines for the LLCP Send function*/ 3395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Send_Cb; 3405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.Context = LlcpMac; 3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_OvrHal_Send(LlcpMac->LowerDevice, 3425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &LlcpMac->MacCompletionInfo, 3435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psRemoteDevInfo, 3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psData->buffer, 3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint16_t)psData->length); 3465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }break; 3485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_DEVICE); 3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }break; 3525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 3555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_LlcpMac_Nfcip_Receive(phFriNfc_LlcpMac_t *LlcpMac, 3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phNfc_sData_t *psData, 3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_LlcpMac_Reveive_CB_t LlcpMacReceive_Cb, 3605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pContext) 3615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL == LlcpMac || NULL==psData || NULL == LlcpMacReceive_Cb || NULL == pContext) 3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_PARAMETER); 3665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(LlcpMac->MacReceive_Cb != NULL) 3685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Previous callback is pending */ 3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_REJECTED; 3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Save the LlcpMacReceive_Cb */ 3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacReceive_Cb = LlcpMacReceive_Cb; 3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacReceive_Context = pContext; 3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Save the pointer to the receive buffer */ 3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psReceiveBuffer= psData; 3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(LlcpMac->PeerRemoteDevType) 3825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phFriNfc_LlcpMac_ePeerTypeInitiator: 3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(LlcpMac->SendPending) 3865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the completion routines for the LLCP Transceive function*/ 3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Transceive_Cb; 3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.Context = LlcpMac; 3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the command type*/ 3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->Cmd.NfcIP1Cmd = phHal_eNfcIP1_Raw; 3925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the Additional Info*/ 3935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psDepAdditionalInfo.DepFlags.MetaChaining = 0; 3945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psDepAdditionalInfo.DepFlags.NADPresent = 0; 3955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->RecvPending = TRUE; 3965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_OvrHal_Transceive(LlcpMac->LowerDevice, 3985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &LlcpMac->MacCompletionInfo, 3995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psRemoteDevInfo, 4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->Cmd, 4015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &LlcpMac->psDepAdditionalInfo, 4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psSendBuffer->buffer, 4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint16_t)LlcpMac->psSendBuffer->length, 4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly psData->buffer, 4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint16_t*)&psData->length); 4065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->RecvPending = TRUE; 4105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status = NFCSTATUS_PENDING; 4115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }break; 4135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phFriNfc_LlcpMac_ePeerTypeTarget: 4145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the completion routines for the LLCP Receive function*/ 4165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.CompletionRoutine = phFriNfc_LlcpMac_Nfcip_Receive_Cb; 4175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* save the context of LlcpMacNfcip */ 4185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->MacCompletionInfo.Context = LlcpMac; 4195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->RecvPending = TRUE; 4205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_OvrHal_Receive(LlcpMac->LowerDevice, 4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &LlcpMac->MacCompletionInfo, 4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psRemoteDevInfo, 4245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->psReceiveBuffer->buffer, 4255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint16_t*)&LlcpMac->psReceiveBuffer->length); 4265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }break; 4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_INVALID_DEVICE); 4305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }break; 4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_LlcpMac_Nfcip_Register (phFriNfc_LlcpMac_t *LlcpMac) 4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(NULL != LlcpMac) 4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LlcpMacInterface.chk = phFriNfc_LlcpMac_Nfcip_Chk; 4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LlcpMacInterface.activate = phFriNfc_LlcpMac_Nfcip_Activate; 4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LlcpMacInterface.deactivate = phFriNfc_LlcpMac_Nfcip_Deactivate; 4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LlcpMacInterface.send = phFriNfc_LlcpMac_Nfcip_Send; 4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly LlcpMac->LlcpMacInterface.receive = phFriNfc_LlcpMac_Nfcip_Receive; 4485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return NFCSTATUS_SUCCESS; 4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status = PHNFCSTVAL(CID_FRI_NFC_LLCP_MAC, NFCSTATUS_FAILED); 4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 456