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