/** * Registers notification handler to handle CE specific events */ NFCSTATUS phLibNfc_CE_NtfRegister ( pphLibNfc_CE_NotificationCb_t pCE_NotificationCb, void *pContext ) { NFCSTATUS Status = NFCSTATUS_SUCCESS; pphLibNfc_LibContext_t pLibContext=(pphLibNfc_LibContext_t)gpphLibContext; if((NULL == gpphLibContext) || (gpphLibContext->LibNfcState.cur_state == eLibNfcHalStateShutdown)) { Status = NFCSTATUS_NOT_INITIALISED; } else if((pCE_NotificationCb == NULL) ||(NULL == pContext)) { /*parameters sent by upper layer are not valid*/ Status = NFCSTATUS_INVALID_PARAMETER; } else if(gpphLibContext->LibNfcState.next_state == eLibNfcHalStateShutdown) { Status = NFCSTATUS_SHUTDOWN; } else { /*Register CE notification with lower layer. Any activity on Smx or UICC will be notified */ Status = phHal4Nfc_RegisterNotification( pLibContext->psHwReference, eRegisterHostCardEmulation, phLibNfc_CeNotification, (void*)pLibContext); if(Status == NFCSTATUS_SUCCESS) { pLibContext->sCeContext.pCeListenerNtfCb = pCE_NotificationCb; pLibContext->sCeContext.pCeListenerCtxt=pContext; } else { /* Registration failed */ Status = NFCSTATUS_FAILED; } } return Status; }
/* * This function called by the HAL4 when the initialization seq is completed. */ STATIC void phLibNfc_InitCb(void *pContext,NFCSTATUS status) { pphLibNfc_LibContext_t pLibContext=NULL; pphLibNfc_RspCb_t pClientCb=NULL; void *pUpperLayerContext=NULL; /* Initialize the local variable */ pLibContext = (pphLibNfc_LibContext_t)pContext; pClientCb =pLibContext->CBInfo.pClientInitCb; pUpperLayerContext=pLibContext->CBInfo.pClientInitCntx; if(status == NFCSTATUS_SUCCESS) { /* Get the Lib context */ pLibContext=(pphLibNfc_LibContext_t)gpphLibContext; gpphLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeOff; if(pLibContext->psHwReference->uicc_connected==TRUE) { /* populate state of the secured element */ gpphLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeDefault; sSecuredElementInfo[LIBNFC_SE_UICC_INDEX].eSE_CurrentState=phLibNfc_SE_Active; pLibContext->sSeContext.uUiccActivate=TRUE; } if(pLibContext->psHwReference->smx_connected==TRUE) { /* populate state of the secured element */ gpphLibContext->sSeContext.eActivatedMode = phLibNfc_SE_ActModeDefault; sSecuredElementInfo[LIBNFC_SE_SMARTMX_INDEX].eSE_CurrentState=phLibNfc_SE_Inactive; pLibContext->sSeContext.uSmxActivate =FALSE; } phLibNfc_UpdateCurState(status,pLibContext); (void)phHal4Nfc_RegisterNotification( pLibContext->psHwReference, eRegisterDefault, phLibNfc_DefaultHandler, (void*)pLibContext ); /* call the upper layer register function */ (*pClientCb)(pUpperLayerContext,status); } else { /*Change the status code failed*/ status = NFCSTATUS_FAILED; /* Get the Lib context */ pLibContext=(pphLibNfc_LibContext_t)gpphLibContext; phLibNfc_UpdateCurState(status,pLibContext); /* Allocate the Memory for the Transceive info */ if(pLibContext->psHwReference!= NULL) { phOsalNfc_FreeMemory(pLibContext->psHwReference); pLibContext->psHwReference = NULL; } (*pClientCb)(pUpperLayerContext, status); phOsalNfc_FreeMemory(pLibContext); pLibContext= NULL; gpphLibContext = NULL; } return; }