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    {
4735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        switch(eActivation_mode)
4745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
4755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case phLibNfc_SE_ActModeVirtual:
4765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
4775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement)
4785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
4795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    eEmulationType = NFC_UICC_EMULATION;
4805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*Enable the UICC -External reader can see it*/
4815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    pLibContext->sCardEmulCfg.config.uiccEmuCfg.enableUicc = TRUE;
4825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
4835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement)
4845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
4855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    eEmulationType = NFC_SMARTMX_EMULATION;
4865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*Enable the SMX -External reader can see it*/
4875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    pLibContext->sCardEmulCfg.config.smartMxCfg.enableEmulation = TRUE;
4885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
4895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
4905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
4915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Status=NFCSTATUS_INVALID_HANDLE;
4925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
4935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if(Status==NFCSTATUS_SUCCESS)
4945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
49564b2569ec9b3f607a41640500387698b9dc91238daniel_tomas                    if(pLibContext->sSeContext.eActivatedMode != phLibNfc_SE_ActModeWired)
49664b2569ec9b3f607a41640500387698b9dc91238daniel_tomas                    {
49764b2569ec9b3f607a41640500387698b9dc91238daniel_tomas                        pLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeVirtual;
49864b2569ec9b3f607a41640500387698b9dc91238daniel_tomas                    }
4995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    pLibContext->sCardEmulCfg.emuType = eEmulationType;
5005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Status = phHal4Nfc_ConfigParameters(
5015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            pLibContext->psHwReference,
5025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            NFC_EMULATION_CONFIG,
5035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            (phHal_uConfig_t*)&pLibContext->sCardEmulCfg,
5045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            phLibNfc_SE_SetMode_cb,
5055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            pLibContext);
5065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
5085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            break;
509868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas            case phLibNfc_SE_ActModeVirtualVolatile:
510868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas            {
511868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement)
512868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                {
513868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                    eEmulationType = NFC_SMARTMX_EMULATION;
514868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                    /*Enable the SMX -External reader can see it*/
515868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                    pLibContext->sCardEmulCfg.config.smartMxCfg.enableEmulation = TRUE;
516868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                    pLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeVirtualVolatile;
517868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas
518868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                    Status = phHal4Nfc_Switch_SMX_Mode(
519868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        pLibContext->psHwReference,
520868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        eSmartMx_Virtual,
521868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        phLibNfc_SE_SetMode_cb,
522868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        pLibContext
523868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        );
524868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                }
525868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                else if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement)
526868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                {
527868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                    eEmulationType = NFC_UICC_EMULATION;
528868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                    /*Enable the UICC -External reader can see it*/
529868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                    pLibContext->sCardEmulCfg.config.uiccEmuCfg.enableUicc = TRUE;
530868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                    pLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeVirtualVolatile;
531868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas
532868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                    Status = phHal4Nfc_Switch_Swp_Mode(
533868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        pLibContext->psHwReference,
534868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        eSWP_Switch_On,
535868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        phLibNfc_SE_SetMode_cb,
536868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        pLibContext
537868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        );
538868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                }
539868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                else
540868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                {
541868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                    Status = NFCSTATUS_INVALID_HANDLE;
542868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                }
543868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas            }
544868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas            break;
545868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas            case phLibNfc_SE_ActModeDefault:
546868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas            {
547868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement)
548868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                {
549868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                    Status = phHal4Nfc_Switch_SMX_Mode(
550868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        pLibContext->psHwReference,
551868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        eSmartMx_Default,
552868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        phLibNfc_SE_SetMode_cb,
553868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        pLibContext
554868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        );
555868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                }
556868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                else if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement)
557868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                {
558868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                    Status = phHal4Nfc_Switch_Swp_Mode(
559868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        pLibContext->psHwReference,
560868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        eSWP_Switch_Default,
561868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        phLibNfc_SE_SetMode_cb,
562868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        pLibContext
563868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                                        );
564868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                }
565868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                else
566868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                {
567868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                    Status = NFCSTATUS_INVALID_HANDLE;
568868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas                }
569868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas            }
570868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas            break;
571868cc2d7e3a1efdf52ecc758bedffc5fd9c78e1eDaniel Tomas
5725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case phLibNfc_SE_ActModeWired:
5735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
5745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement)
5755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    if(pLibContext->CBInfo.pClientNtfRegRespCB!=NULL)
5775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    {
5785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        /*Disable the SMX -External reader can't see it anymore*/
5795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        pLibContext->sCardEmulCfg.config.smartMxCfg.enableEmulation = FALSE;
5805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        pLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeWired;
5815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
5825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        Status = phHal4Nfc_Switch_SMX_Mode(
5835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            pLibContext->psHwReference,
5845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            eSmartMx_Wired,
5855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            phLibNfc_SE_SetMode_cb,
5865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            pLibContext
5875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                            );
5885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    }
5895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement)
5915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*This mode is not applicable to UICC*/
5935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Status = NFCSTATUS_REJECTED;
5945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
5965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
5975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Status = NFCSTATUS_INVALID_HANDLE;
5985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
5995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            break;
6015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            case phLibNfc_SE_ActModeOff:
6035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
6045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                /*UICC emulation deactivate*/
6055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement)
6065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
6075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    eEmulationType = NFC_UICC_EMULATION;
6085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*Disable the UICC -External reader can't see it anymore*/
6095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    pLibContext->sCardEmulCfg.config.uiccEmuCfg.enableUicc = FALSE;
6105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
6125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else if(hSE_Handle == sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement)
6135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
6145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    eEmulationType = NFC_SMARTMX_EMULATION;
6155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    /*Disable the SMX -External reader can't see it anymore*/
6165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    pLibContext->sCardEmulCfg.config.smartMxCfg.enableEmulation=FALSE;
6175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
6195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
6205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
6215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Status = NFCSTATUS_INVALID_HANDLE;
6225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
6235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                if(Status==NFCSTATUS_SUCCESS)
6245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
6255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    pLibContext->sCardEmulCfg.emuType = eEmulationType;
62664b2569ec9b3f607a41640500387698b9dc91238daniel_tomas
62764b2569ec9b3f607a41640500387698b9dc91238daniel_tomas                    if(pLibContext->sSeContext.eActivatedMode != phLibNfc_SE_ActModeWired)
62864b2569ec9b3f607a41640500387698b9dc91238daniel_tomas                    {
62964b2569ec9b3f607a41640500387698b9dc91238daniel_tomas                         pLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeOff;
63064b2569ec9b3f607a41640500387698b9dc91238daniel_tomas                    }
63164b2569ec9b3f607a41640500387698b9dc91238daniel_tomas
6325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                    Status = phHal4Nfc_ConfigParameters(pLibContext->psHwReference,
6335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                            NFC_EMULATION_CONFIG,
6345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                            (phHal_uConfig_t*)&pLibContext->sCardEmulCfg,
6355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                            phLibNfc_SE_SetMode_cb,
6365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                                                            pLibContext);
6375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
6385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
6395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            break;
6405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            default:
6415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                Status=NFCSTATUS_INVALID_PARAMETER;
6425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                break;
6435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }/*End of eActivation_mode switch */
6455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        if(Status==NFCSTATUS_PENDING)
6465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            pLibContext->sSeContext.hSetemp=hSE_Handle;
6485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            pLibContext->status.GenCb_pending_status = TRUE;
6495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCb = pSE_SetMode_Rsp_cb;
6505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCtxt=pContext;
6515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
6525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else if(Status == NFCSTATUS_INVALID_HANDLE)
6535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Status= Status;
6555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
6565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
6575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            Status = NFCSTATUS_FAILED;
6595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
6605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
6615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return Status;
6625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
6635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/**
6645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Callback for Se Set mode
6655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
6665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellySTATIC void phLibNfc_SE_SetMode_cb(void  *context, NFCSTATUS status)
6675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
6683a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen    /* Note that we don't use the passed in context here;
6693a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen     * the reason is that there are race-conditions around
6703a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen     * the place where this context is stored (mostly in combination
6713a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen     * with LLCP), and we may actually get the wrong context.
6723a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen     * Since this callback always uses the global context
6733a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen     * we don't need the passed in context anyway.
6743a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen     */
6753a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen    pphLibNfc_LibContext_t pLibContext=gpphLibContext;
6765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    pphLibNfc_SE_SetModeRspCb_t  pUpperLayerCb=NULL;
6775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    void                         *pUpperContext=NULL;
6785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phLibNfc_Handle              hSeHandle=0;
6795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t                      TempState=FALSE;
6805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6813a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen    if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state)
6825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6833a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen        /*If shutdown is called in between allow shutdown to happen*/
6843a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen        phLibNfc_Pending_Shutdown();
6853a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen        status = NFCSTATUS_SHUTDOWN;
6865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
6875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    else
6885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6893a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen        if(status == NFCSTATUS_SUCCESS)
6905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
6913a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen            hSeHandle = pLibContext->sSeContext.hSetemp;
6925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6933a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen            if(hSeHandle == sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].hSecureElement)
6943a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen            {
6953a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                if(TRUE==pLibContext->sCardEmulCfg.config.uiccEmuCfg.enableUicc)
6965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
6973a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                    /*If  Activation mode was virtual allow external reader to see it*/
6983a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                    pLibContext->sSeContext.uUiccActivate = TRUE;
6993a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                    sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_CurrentState = phLibNfc_SE_Active;
7005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
7013a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                else
7025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
7033a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                    /*If  Activation mode was wired don't allow external reader to see it*/
7043a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                    pLibContext->sSeContext.uUiccActivate = FALSE;
7053a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                    sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_CurrentState =
7063a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                                                                phLibNfc_SE_Inactive;
7073a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                }
7083a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                status = NFCSTATUS_SUCCESS;
7093a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                TempState = pLibContext->sSeContext.uUiccActivate;
7103a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen            }
7113a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen            else if (hSeHandle==sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].hSecureElement)
7123a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen            {
7133a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                if(TRUE==pLibContext->sCardEmulCfg.config.smartMxCfg.enableEmulation)
7143a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                {
7153a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                    /*If  Activation mode was virtual allow external reader to see it*/
7163a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                    pLibContext->sSeContext.uSmxActivate = TRUE;
7173a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                    sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].eSE_CurrentState =
7183a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                                                                    phLibNfc_SE_Active;
7195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
7205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                else
7215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                {
7223a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                    /*If  Activation mode was wired don't allow external reader to see it*/
7233a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                    pLibContext->sSeContext.uSmxActivate = FALSE;
7243a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                    sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].eSE_CurrentState=
7253a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                                                                    phLibNfc_SE_Inactive;
7265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                }
7273a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                status = NFCSTATUS_SUCCESS;
7283a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen                TempState = pLibContext->sSeContext.uSmxActivate;
7295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
7305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            else
7315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
7325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                status = NFCSTATUS_FAILED;
7335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
7345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
7353a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen        else
7363a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen        {
7373a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen            status = NFCSTATUS_FAILED;
7383a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen        }
7393a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen        pLibContext->status.GenCb_pending_status = FALSE;
7405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7413a53a1e3754df0e5d77a6549a620d570acacbae4Martijn Coenen
7425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    pUpperLayerCb = pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCb;
7435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    pUpperContext = pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCtxt;
7445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCb = NULL;
7455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    pLibContext->sSeContext.sSeCallabackInfo.pSEsetModeCtxt = NULL;
7465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly	PHNFC_UNUSED_VARIABLE(TempState);
7475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Call the upper layer cb */
7485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if(pUpperLayerCb!= NULL )
7495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
7505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        (*pUpperLayerCb)(pUpperContext,
7515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                        hSeHandle,
7525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly						status);
7535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return;
7555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
7565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
759