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 * \file phLibNfc_SE.c 195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Project: NFC FRI / HALDL 215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Date: Thu Apr 22 13:59:50 2010 $ 235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Author: ing07385 $ 245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Revision: 1.65 $ 255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * $Aliases: NFC_FRI1.1_WK1014_SDK,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1019_SDK,NFC_FRI1.1_WK1024_SDK $ 265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* 305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly************************* Header Files *************************************** 315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phNfcStatus.h> 345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc.h> 355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phHal4Nfc.h> 365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phOsalNfc.h> 375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc_Internal.h> 385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc_SE.h> 395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc_ndef_raw.h> 405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc_initiator.h> 415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phLibNfc_discovery.h> 425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* 445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Macro's **************************************** 455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef STATIC_DISABLE 485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define STATIC static 495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#define STATIC 515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* 545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Global Variables ********************************** 555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*This Structure contains the Secure Element information*/ 585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyphLibNfc_SE_List_t sSecuredElementInfo[PHLIBNFC_MAXNO_OF_SE]; 595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* 615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Static Function Declaration *********************** 625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Response callback for SE Set Mode*/ 655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellySTATIC 665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phLibNfc_SE_SetMode_cb(void *context, NFCSTATUS status); 675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* SE register listner response notification */ 705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellySTATIC 715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phLibNfc_SeNotification(void *context, 725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHal_eNotificationType_t type, 735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHal4Nfc_NotificationInfo_t info, 745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status 755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ); 765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* 775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*************************** Function Definitions ****************************** 785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/** 815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Registers notification handler to handle secure element specific events 825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phLibNfc_SE_NtfRegister ( 845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pphLibNfc_SE_NotificationCb_t pSE_NotificationCb, 855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pContext 865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status = NFCSTATUS_SUCCESS; 895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pphLibNfc_LibContext_t pLibContext=(pphLibNfc_LibContext_t)gpphLibContext; 905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NULL == gpphLibContext) || 925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (gpphLibContext->LibNfcState.cur_state == eLibNfcHalStateShutdown)) 935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = NFCSTATUS_NOT_INITIALISED; 955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if((pSE_NotificationCb == NULL) 975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ||(NULL == pContext)) 985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*parameters sent by upper layer are not valid*/ 1005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = NFCSTATUS_INVALID_PARAMETER; 1015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(gpphLibContext->LibNfcState.next_state == eLibNfcHalStateShutdown) 1035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = NFCSTATUS_SHUTDOWN; 1055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Register SE notification with lower layer. 1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Any activity on Smx or UICC will be notified */ 1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phHal4Nfc_RegisterNotification( 1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->psHwReference, 1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly eRegisterSecureElement, 1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phLibNfc_SeNotification, 1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (void*)pLibContext); 1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(Status == NFCSTATUS_SUCCESS) 1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sSeContext.sSeCallabackInfo.pSeListenerNtfCb = pSE_NotificationCb; 1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sSeContext.sSeCallabackInfo.pSeListenerCtxt=pContext; 1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Registration failed */ 1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = NFCSTATUS_FAILED; 1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Status; 1275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 1285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/** 1295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* SE Notification events are notified with this callback 1305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 1315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellySTATIC void phLibNfc_SeNotification(void *context, 1325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHal_eNotificationType_t type, 1335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHal4Nfc_NotificationInfo_t info, 1345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status) 1355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 1365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pphLibNfc_LibContext_t pLibContext=(pphLibNfc_LibContext_t)context; 1375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHal_sEventInfo_t *pEvtInfo = NULL; 13834ff48f6cd6595a899e05fbd56f4c84891840d3fNick Pelly phLibNfc_uSeEvtInfo_t Se_Trans_Info={{{0,0},{0,0}}}; 1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phLibNfc_SE_List_t *pSeInfo=NULL; 1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(pLibContext != gpphLibContext) 1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*wrong context returned*/ 1445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phOsalNfc_RaiseException(phOsalNfc_e_InternalErr,1); 1455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 1475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((status == NFCSTATUS_SUCCESS) && (type == NFC_EVENT_NOTIFICATION)) 1495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pEvtInfo = info.psEventInfo; 1515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_SUCCESS; 1525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((pEvtInfo->eventSource == phHal_ePICC_DevType ) 1535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly && (pEvtInfo->eventHost == phHal_eHostController) ) 1545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].eSE_Type = phLibNfc_SE_Type_SmartMX; 1565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Smartx Mx is Activated */ 1575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pSeInfo = &sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX]; 1585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(pEvtInfo->eventHost == phHal_eUICCHost) 1605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* UICC is Activate */ 1625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_Type = phLibNfc_SE_Type_UICC; 1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pSeInfo = &sSecuredElementInfo[LIBNFC_SE_UICC_INDEX]; 1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*presently Smx event source is not supported */ 1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(pSeInfo!=NULL) 1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(pEvtInfo->eventType) 1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case NFC_EVT_TRANSACTION: 1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 17578f4485d27a7630534b2b28f24ab9d0190a2e642Nick Pelly if((pEvtInfo->eventInfo.aid.length != 0) && ((pEvtInfo->eventInfo.aid.length <= 16))) // PLG 1765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*copy the Application id on which transaction happened*/ 1785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Se_Trans_Info.UiccEvtInfo.aid.buffer =pEvtInfo->eventInfo.aid.buffer; 1795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Se_Trans_Info.UiccEvtInfo.aid.length =pEvtInfo->eventInfo.aid.length; 1805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 18178f4485d27a7630534b2b28f24ab9d0190a2e642Nick Pelly else 18278f4485d27a7630534b2b28f24ab9d0190a2e642Nick Pelly { 18378f4485d27a7630534b2b28f24ab9d0190a2e642Nick Pelly // PLG patch 18478f4485d27a7630534b2b28f24ab9d0190a2e642Nick Pelly Se_Trans_Info.UiccEvtInfo.aid.buffer = NULL; 18578f4485d27a7630534b2b28f24ab9d0190a2e642Nick Pelly Se_Trans_Info.UiccEvtInfo.aid.length = 0; 18678f4485d27a7630534b2b28f24ab9d0190a2e642Nick Pelly } 1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((pEvtInfo->eventHost == phHal_eUICCHost) 1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly && (info.psEventInfo->eventInfo.uicc_info.param.length 1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly != 0)) 1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*copy the parameters info on which transaction happened*/ 1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Se_Trans_Info.UiccEvtInfo.param.buffer = 1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly info.psEventInfo->eventInfo.uicc_info.param.buffer; 1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Se_Trans_Info.UiccEvtInfo.param.length = 1955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly info.psEventInfo->eventInfo.uicc_info.param.length; 1965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Notify to upper layer that transaction had happened on the 1985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly one of the application stored in UICC or Smx*/ 1995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*pLibContext->sSeContext.sSeCallabackInfo.pSeListenerNtfCb)( 2005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sSeContext.sSeCallabackInfo.pSeListenerCtxt, 2015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phLibNfc_eSE_EvtStartTransaction, 2025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pSeInfo->hSecureElement, 2035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &Se_Trans_Info, 2045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status); 2055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 2065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 207967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas 208967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas case NFC_EVT_APDU_RECEIVED: 209967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas { 210967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas if ((pEvtInfo->eventInfo.aid.length != 0) && ((pEvtInfo->eventInfo.aid.length <= 16))) 211967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas { 212967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas /* Copy received APDU to aid buffer. */ 213967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas Se_Trans_Info.UiccEvtInfo.aid.buffer = pEvtInfo->eventInfo.aid.buffer; 214967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas Se_Trans_Info.UiccEvtInfo.aid.length = pEvtInfo->eventInfo.aid.length; 215967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas } 216967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas 217967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas (*pLibContext->sSeContext.sSeCallabackInfo.pSeListenerNtfCb)( 218967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas pLibContext->sSeContext.sSeCallabackInfo.pSeListenerCtxt, 219967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas phLibNfc_eSE_EvtApduReceived, 220967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas pSeInfo->hSecureElement, 221967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas &Se_Trans_Info, 222967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas status); 223967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas break; 224967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas } 225967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas 226967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas case NFC_EVT_MIFARE_ACCESS: 227967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas { 228967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas /* copy the Block MIFARE accessed */ 229967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas Se_Trans_Info.UiccEvtInfo.aid.buffer = pEvtInfo->eventInfo.aid.buffer; 230967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas Se_Trans_Info.UiccEvtInfo.aid.length = pEvtInfo->eventInfo.aid.length; 231967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas 232967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas (*pLibContext->sSeContext.sSeCallabackInfo.pSeListenerNtfCb)( 233967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas pLibContext->sSeContext.sSeCallabackInfo.pSeListenerCtxt, 234967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas phLibNfc_eSE_EvtMifareAccess, 235967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas pSeInfo->hSecureElement, 236967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas &Se_Trans_Info, 237967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas status); 238967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas break; 239967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas } 240967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas 241967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas case NFC_EVT_EMV_CARD_REMOVAL: 242967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas { 243967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas (*pLibContext->sSeContext.sSeCallabackInfo.pSeListenerNtfCb)( 244967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas pLibContext->sSeContext.sSeCallabackInfo.pSeListenerCtxt, 245967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas phLibNfc_eSE_EvtCardRemoval, 246967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas pSeInfo->hSecureElement, 247967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas &Se_Trans_Info, 248967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas status); 249967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas break; 250967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas } 251967359c892ff74962b4f4243d989f447ffe4ae11Daniel Tomas 2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case NFC_EVT_END_OF_TRANSACTION: 2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*pLibContext->sSeContext.sSeCallabackInfo.pSeListenerNtfCb)( 2555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sSeContext.sSeCallabackInfo.pSeListenerCtxt, 2565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phLibNfc_eSE_EvtEndTransaction, 2575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pSeInfo->hSecureElement, 2585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &Se_Trans_Info, 2595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status); 2605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 261434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas } 262434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas case NFC_EVT_CONNECTIVITY: 2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*pLibContext->sSeContext.sSeCallabackInfo.pSeListenerNtfCb)( 2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sSeContext.sSeCallabackInfo.pSeListenerCtxt, 2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phLibNfc_eSE_EvtConnectivity, 2675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pSeInfo->hSecureElement, 2685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &Se_Trans_Info, 2695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status); 2705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 271434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas } 272434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas case NFC_EVT_START_OF_TRANSACTION: 273434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas { 274434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas (*pLibContext->sSeContext.sSeCallabackInfo.pSeListenerNtfCb)( 27578f4485d27a7630534b2b28f24ab9d0190a2e642Nick Pelly pLibContext->sSeContext.sSeCallabackInfo.pSeListenerCtxt, 27678f4485d27a7630534b2b28f24ab9d0190a2e642Nick Pelly phLibNfc_eSE_EvtTypeTransaction, 27778f4485d27a7630534b2b28f24ab9d0190a2e642Nick Pelly pSeInfo->hSecureElement, 27878f4485d27a7630534b2b28f24ab9d0190a2e642Nick Pelly &Se_Trans_Info, 27978f4485d27a7630534b2b28f24ab9d0190a2e642Nick Pelly status); 280434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas break; 281434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas } 282434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas case NFC_EVT_FIELD_ON: 283434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas { 284434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas (*pLibContext->sSeContext.sSeCallabackInfo.pSeListenerNtfCb)( 285434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas pLibContext->sSeContext.sSeCallabackInfo.pSeListenerCtxt, 286434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas phLibNfc_eSE_EvtFieldOn, 287434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas pSeInfo->hSecureElement, 288434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas &Se_Trans_Info, 289434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas status); 290434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas break; 291434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas } 292434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas case NFC_EVT_FIELD_OFF: 293434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas { 294434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas (*pLibContext->sSeContext.sSeCallabackInfo.pSeListenerNtfCb)( 295434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas pLibContext->sSeContext.sSeCallabackInfo.pSeListenerCtxt, 296434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas phLibNfc_eSE_EvtFieldOff, 297434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas pSeInfo->hSecureElement, 298434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas &Se_Trans_Info, 299434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas status); 300434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas break; 301434eb43979d170509b9b28c0598e5f44e31aa348daniel_tomas } 3025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return; 3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/** 3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Unregister the Secured Element Notification. 3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phLibNfc_SE_NtfUnregister(void) 3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status = NFCSTATUS_SUCCESS; 3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pphLibNfc_LibContext_t pLibContext=(pphLibNfc_LibContext_t)gpphLibContext; 3245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NULL == gpphLibContext) || 3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (gpphLibContext->LibNfcState.cur_state == eLibNfcHalStateShutdown)) 3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Lib Nfc is not initialized*/ 3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = NFCSTATUS_NOT_INITIALISED; 3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(gpphLibContext->LibNfcState.next_state == eLibNfcHalStateShutdown) 3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = NFCSTATUS_SHUTDOWN; 3345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Unregister SE event notification with lower layer. 3385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly even some transaction happens on UICC or Smx will not 3395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly be notified afterworlds */ 3405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phHal4Nfc_UnregisterNotification( 3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->psHwReference, 3425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly eRegisterSecureElement, 3435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext); 3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(Status != NFCSTATUS_SUCCESS) 3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Unregister failed*/ 3475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status=NFCSTATUS_FAILED; 3485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sSeContext.sSeCallabackInfo.pSeListenerNtfCb=NULL; 3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sSeContext.sSeCallabackInfo.pSeListenerCtxt=NULL; 3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Status; 3535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 3545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/** 3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Get list of available Secure Elements 3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phLibNfc_SE_GetSecureElementList( 3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phLibNfc_SE_List_t* pSE_List, 3605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t* uSE_count 3615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status = NFCSTATUS_SUCCESS; 3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t uNo_Of_SE = 0; 3655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NULL == gpphLibContext) || 3675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (gpphLibContext->LibNfcState.cur_state == eLibNfcHalStateShutdown)) 3685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = NFCSTATUS_NOT_INITIALISED; 3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if((NULL ==pSE_List) || (NULL ==uSE_count)) 3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = NFCSTATUS_INVALID_PARAMETER; 3745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(gpphLibContext->LibNfcState.next_state == eLibNfcHalStateShutdown) 3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = NFCSTATUS_SHUTDOWN; 3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Check for which type of Secure Element is available*/ 3825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(gpphLibContext->psHwReference->uicc_connected==TRUE) 3835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Populate the UICC type */ 3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_Type = phLibNfc_SE_Type_UICC; 3865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Populate the UICC handle */ 3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement =(phLibNfc_Handle) 3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (LIBNFC_SE_UICC_INDEX + LIBNFC_SE_BASE_HANDLE); 3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef NXP_HAL_ENABLE_SMX 3925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pSE_List[LIBNFC_SE_UICC_INDEX].eSE_Type = 3945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_Type; 3955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pSE_List[LIBNFC_SE_UICC_INDEX].hSecureElement = (phLibNfc_Handle) 3965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (LIBNFC_SE_UICC_INDEX + LIBNFC_SE_BASE_HANDLE); 3975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pSE_List[LIBNFC_SE_UICC_INDEX].eSE_CurrentState = 3985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_CurrentState; 3995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pSE_List->eSE_Type = 4015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_Type; 4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pSE_List->hSecureElement = (phLibNfc_Handle) 4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (LIBNFC_SE_UICC_INDEX + LIBNFC_SE_BASE_HANDLE); 4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pSE_List->eSE_CurrentState = 4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_CurrentState; 4065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 4075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* update the No of SE retrieved */ 4085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uNo_Of_SE ++; 4095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (gpphLibContext->psHwReference->smx_connected ==TRUE) 4125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* if the Smx is also connected to the PN544 */ 4145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Populate the SMX type */ 4155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].eSE_Type = phLibNfc_SE_Type_SmartMX; 4165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Populate the SMX handle */ 4185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement =(phLibNfc_Handle) 4195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (LIBNFC_SE_SMARTMX_INDEX + LIBNFC_SE_BASE_HANDLE); 4205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pSE_List[LIBNFC_SE_SMARTMX_INDEX].eSE_Type = 4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].eSE_Type; 4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pSE_List[LIBNFC_SE_SMARTMX_INDEX].hSecureElement = (phLibNfc_Handle) 4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (LIBNFC_SE_SMARTMX_INDEX + LIBNFC_SE_BASE_HANDLE); 4245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pSE_List[LIBNFC_SE_SMARTMX_INDEX].eSE_CurrentState = 4255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].eSE_CurrentState; 4265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* update the No of SE retrieved */ 4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uNo_Of_SE ++; 4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *uSE_count = uNo_Of_SE; 4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Status; 4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/** 4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Sets secure element mode. 4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* This function configures SE to specific mode based on activation mode type 4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phLibNfc_SE_SetMode ( phLibNfc_Handle hSE_Handle, 4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phLibNfc_eSE_ActivationMode eActivation_mode, 4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pphLibNfc_SE_SetModeRspCb_t pSE_SetMode_Rsp_cb, 4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void * pContext 4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status = NFCSTATUS_SUCCESS; 4485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHal_eEmulationType_t eEmulationType = NFC_SMARTMX_EMULATION; 4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pphLibNfc_LibContext_t pLibContext=(pphLibNfc_LibContext_t)gpphLibContext; 4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NULL == gpphLibContext) || 4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (gpphLibContext->LibNfcState.cur_state == eLibNfcHalStateShutdown)) 4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = NFCSTATUS_NOT_INITIALISED; 4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if((pSE_SetMode_Rsp_cb ==NULL) 4575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ||(NULL == pContext)||(NULL==(void *)hSE_Handle)) 4585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status=NFCSTATUS_INVALID_PARAMETER; 4605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(gpphLibContext->LibNfcState.next_state == eLibNfcHalStateShutdown) 4625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = NFCSTATUS_SHUTDOWN; 4645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if((pLibContext->status.GenCb_pending_status == TRUE) 4665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ||(NULL!=pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCb)) 4675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*previous callback is pending still*/ 4695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status =NFCSTATUS_REJECTED; 4705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 473d508d9900a7d318073bd7b308d094755df316527Martijn Coenen phLibNfc_eSE_ActivationMode originalMode = pLibContext->sSeContext.eActivatedMode; 4745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(eActivation_mode) 4755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phLibNfc_SE_ActModeVirtual: 4775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement) 4795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly eEmulationType = NFC_UICC_EMULATION; 4815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Enable the UICC -External reader can see it*/ 4825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sCardEmulCfg.config.uiccEmuCfg.enableUicc = TRUE; 4835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement) 4855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly eEmulationType = NFC_SMARTMX_EMULATION; 4875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Enable the SMX -External reader can see it*/ 4885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sCardEmulCfg.config.smartMxCfg.enableEmulation = TRUE; 4895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status=NFCSTATUS_INVALID_HANDLE; 4935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(Status==NFCSTATUS_SUCCESS) 4955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 49664b2569ec9b3f607a41640500387698b9dc91238daniel_tomas if(pLibContext->sSeContext.eActivatedMode != phLibNfc_SE_ActModeWired) 49764b2569ec9b3f607a41640500387698b9dc91238daniel_tomas { 49864b2569ec9b3f607a41640500387698b9dc91238daniel_tomas pLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeVirtual; 49964b2569ec9b3f607a41640500387698b9dc91238daniel_tomas } 5005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sCardEmulCfg.emuType = eEmulationType; 5015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phHal4Nfc_ConfigParameters( 5025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->psHwReference, 5035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFC_EMULATION_CONFIG, 5045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (phHal_uConfig_t*)&pLibContext->sCardEmulCfg, 5055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phLibNfc_SE_SetMode_cb, 5065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext); 5075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 510868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas case phLibNfc_SE_ActModeVirtualVolatile: 511868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas { 512868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement) 513868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas { 514868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas eEmulationType = NFC_SMARTMX_EMULATION; 515868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas /*Enable the SMX -External reader can see it*/ 516868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas pLibContext->sCardEmulCfg.config.smartMxCfg.enableEmulation = TRUE; 517868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas pLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeVirtualVolatile; 518868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas 519868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas Status = phHal4Nfc_Switch_SMX_Mode( 520868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas pLibContext->psHwReference, 521868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas eSmartMx_Virtual, 522868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas phLibNfc_SE_SetMode_cb, 523868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas pLibContext 524868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas ); 525868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas } 526868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas else if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement) 527868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas { 528868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas eEmulationType = NFC_UICC_EMULATION; 529868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas /*Enable the UICC -External reader can see it*/ 530868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas pLibContext->sCardEmulCfg.config.uiccEmuCfg.enableUicc = TRUE; 531868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas pLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeVirtualVolatile; 532868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas 533868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas Status = phHal4Nfc_Switch_Swp_Mode( 534868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas pLibContext->psHwReference, 535868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas eSWP_Switch_On, 536868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas phLibNfc_SE_SetMode_cb, 537868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas pLibContext 538868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas ); 539868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas } 540868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas else 541868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas { 542868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas Status = NFCSTATUS_INVALID_HANDLE; 543868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas } 544868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas } 545868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas break; 546868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas case phLibNfc_SE_ActModeDefault: 547868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas { 548868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement) 549868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas { 550868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas Status = phHal4Nfc_Switch_SMX_Mode( 551868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas pLibContext->psHwReference, 552868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas eSmartMx_Default, 553868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas phLibNfc_SE_SetMode_cb, 554868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas pLibContext 555868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas ); 556868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas } 557868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas else if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement) 558868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas { 559868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas Status = phHal4Nfc_Switch_Swp_Mode( 560868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas pLibContext->psHwReference, 561868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas eSWP_Switch_Default, 562868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas phLibNfc_SE_SetMode_cb, 563868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas pLibContext 564868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas ); 565868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas } 566868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas else 567868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas { 568868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas Status = NFCSTATUS_INVALID_HANDLE; 569868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas } 570868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas } 571868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas break; 572868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas 5735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phLibNfc_SE_ActModeWired: 5745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement) 5765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(pLibContext->CBInfo.pClientNtfRegRespCB!=NULL) 5785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Disable the SMX -External reader can't see it anymore*/ 5805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sCardEmulCfg.config.smartMxCfg.enableEmulation = FALSE; 5815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeWired; 5825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phHal4Nfc_Switch_SMX_Mode( 5845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->psHwReference, 5855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly eSmartMx_Wired, 5865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phLibNfc_SE_SetMode_cb, 5875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext 5885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ); 5895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement) 5925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*This mode is not applicable to UICC*/ 5945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = NFCSTATUS_REJECTED; 5955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 5975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = NFCSTATUS_INVALID_HANDLE; 5995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phLibNfc_SE_ActModeOff: 6045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*UICC emulation deactivate*/ 6065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement) 6075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly eEmulationType = NFC_UICC_EMULATION; 6095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Disable the UICC -External reader can't see it anymore*/ 6105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sCardEmulCfg.config.uiccEmuCfg.enableUicc = FALSE; 6115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement) 6145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly eEmulationType = NFC_SMARTMX_EMULATION; 6165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Disable the SMX -External reader can't see it anymore*/ 6175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sCardEmulCfg.config.smartMxCfg.enableEmulation=FALSE; 6185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 6215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = NFCSTATUS_INVALID_HANDLE; 6235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(Status==NFCSTATUS_SUCCESS) 6255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sCardEmulCfg.emuType = eEmulationType; 62764b2569ec9b3f607a41640500387698b9dc91238daniel_tomas 62864b2569ec9b3f607a41640500387698b9dc91238daniel_tomas if(pLibContext->sSeContext.eActivatedMode != phLibNfc_SE_ActModeWired) 62964b2569ec9b3f607a41640500387698b9dc91238daniel_tomas { 63064b2569ec9b3f607a41640500387698b9dc91238daniel_tomas pLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeOff; 63164b2569ec9b3f607a41640500387698b9dc91238daniel_tomas } 63264b2569ec9b3f607a41640500387698b9dc91238daniel_tomas 6335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phHal4Nfc_ConfigParameters(pLibContext->psHwReference, 6345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFC_EMULATION_CONFIG, 6355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (phHal_uConfig_t*)&pLibContext->sCardEmulCfg, 6365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phLibNfc_SE_SetMode_cb, 6375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext); 6385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default: 6425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status=NFCSTATUS_INVALID_PARAMETER; 6435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }/*End of eActivation_mode switch */ 6465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(Status==NFCSTATUS_PENDING) 6475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sSeContext.hSetemp=hSE_Handle; 6495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->status.GenCb_pending_status = TRUE; 6505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCb = pSE_SetMode_Rsp_cb; 6515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCtxt=pContext; 6525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(Status == NFCSTATUS_INVALID_HANDLE) 6545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status= Status; 6565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 6585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 659d508d9900a7d318073bd7b308d094755df316527Martijn Coenen // Restore original mode 660d508d9900a7d318073bd7b308d094755df316527Martijn Coenen pLibContext->sSeContext.eActivatedMode = originalMode; 6615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = NFCSTATUS_FAILED; 6625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Status; 6655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 6665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/** 6675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Callback for Se Set mode 6685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 6695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellySTATIC void phLibNfc_SE_SetMode_cb(void *context, NFCSTATUS status) 6705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 6713a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen /* Note that we don't use the passed in context here; 6723a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen * the reason is that there are race-conditions around 6733a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen * the place where this context is stored (mostly in combination 6743a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen * with LLCP), and we may actually get the wrong context. 6753a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen * Since this callback always uses the global context 6763a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen * we don't need the passed in context anyway. 6773a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen */ 6783a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen pphLibNfc_LibContext_t pLibContext=gpphLibContext; 6795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pphLibNfc_SE_SetModeRspCb_t pUpperLayerCb=NULL; 6805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *pUpperContext=NULL; 6815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phLibNfc_Handle hSeHandle=0; 6825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t TempState=FALSE; 6835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6843a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state) 6855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6863a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen /*If shutdown is called in between allow shutdown to happen*/ 6873a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen phLibNfc_Pending_Shutdown(); 6883a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen status = NFCSTATUS_SHUTDOWN; 6895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 6915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6923a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen if(status == NFCSTATUS_SUCCESS) 6935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6943a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen hSeHandle = pLibContext->sSeContext.hSetemp; 6955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6963a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen if(hSeHandle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement) 6973a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen { 6983a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen if(TRUE==pLibContext->sCardEmulCfg.config.uiccEmuCfg.enableUicc) 6995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7003a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen /*If Activation mode was virtual allow external reader to see it*/ 7013a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen pLibContext->sSeContext.uUiccActivate = TRUE; 7023a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_CurrentState = phLibNfc_SE_Active; 7035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7043a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen else 7055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7063a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen /*If Activation mode was wired don't allow external reader to see it*/ 7073a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen pLibContext->sSeContext.uUiccActivate = FALSE; 7083a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_CurrentState = 7093a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen phLibNfc_SE_Inactive; 7103a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen } 7113a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen status = NFCSTATUS_SUCCESS; 7123a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen TempState = pLibContext->sSeContext.uUiccActivate; 7133a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen } 7143a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen else if (hSeHandle==sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement) 7153a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen { 7163a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen if(TRUE==pLibContext->sCardEmulCfg.config.smartMxCfg.enableEmulation) 7173a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen { 7183a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen /*If Activation mode was virtual allow external reader to see it*/ 7193a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen pLibContext->sSeContext.uSmxActivate = TRUE; 7203a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].eSE_CurrentState = 7213a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen phLibNfc_SE_Active; 7225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 7245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7253a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen /*If Activation mode was wired don't allow external reader to see it*/ 7263a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen pLibContext->sSeContext.uSmxActivate = FALSE; 7273a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].eSE_CurrentState= 7283a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen phLibNfc_SE_Inactive; 7295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7303a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen status = NFCSTATUS_SUCCESS; 7313a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen TempState = pLibContext->sSeContext.uSmxActivate; 7325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 7345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_FAILED; 7365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7383a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen else 7393a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen { 7403a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen status = NFCSTATUS_FAILED; 7413a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen } 7423a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen pLibContext->status.GenCb_pending_status = FALSE; 7435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7443a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen 7455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pUpperLayerCb = pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCb; 7465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pUpperContext = pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCtxt; 7475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCb = NULL; 7485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCtxt = NULL; 7495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PHNFC_UNUSED_VARIABLE(TempState); 7505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Call the upper layer cb */ 7515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(pUpperLayerCb!= NULL ) 7525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*pUpperLayerCb)(pUpperContext, 7545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly hSeHandle, 7555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status); 7565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return; 7585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 7595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 762