diff options
Diffstat (limited to 'src/phLibNfc_discovery.c')
-rw-r--r-- | src/phLibNfc_discovery.c | 361 |
1 files changed, 361 insertions, 0 deletions
diff --git a/src/phLibNfc_discovery.c b/src/phLibNfc_discovery.c new file mode 100644 index 0000000..ead278e --- /dev/null +++ b/src/phLibNfc_discovery.c @@ -0,0 +1,361 @@ +/* + * Copyright (C) 2010 NXP Semiconductors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*! + * \file phLibNfc_discovery.c + + * Project: NFC FRI 1.1 + * + * $Date: Mon Mar 1 19:02:41 2010 $ + * $Author: ing07385 $ + * $Revision: 1.36 $ + * $Aliases: NFC_FRI1.1_WK1008_SDK,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1007_SDK,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 $ + * + */ + +/* +************************* Header Files **************************************** +*/ + +#include <phLibNfcStatus.h> +#include <phLibNfc.h> +#include <phHal4Nfc.h> +#include <phOsalNfc.h> +#include <phLibNfc_Internal.h> +#include <phLibNfc_ndef_raw.h> +#include <phLibNfc_initiator.h> +#include <phLibNfc_discovery.h> + +/* +*************************** Macro's **************************************** +*/ + +#ifndef STATIC_DISABLE +#define STATIC static +#else +#define STATIC +#endif + +/* +*************************** Global Variables ********************************** +*/ + + + +/* +*************************** Static Function Declaration *********************** +*/ + + +/*Remote device Presence check callback*/ +STATIC void phLibNfc_RemoteDev_CheckPresence_Cb(void *context, + NFCSTATUS status); + +/**Used for presence chk incase of mifare std tags*/ +STATIC void phLibNfc_ChkPresence_Trcv_Cb( + void *context, + phHal_sRemoteDevInformation_t *psRemoteDevInfo, + phNfc_sData_t *response, + NFCSTATUS status + ); + +/* +*************************** Function Definitions ****************************** +*/ +void phLibNfc_config_discovery_cb(void *context, + NFCSTATUS status) +{ + + if((phLibNfc_LibContext_t *)context == gpphLibContext) + { /*check for same context*/ + + if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state) + { + /*If shutdown called in between allow shutdown to happen*/ + phLibNfc_Pending_Shutdown(); + status = NFCSTATUS_SHUTDOWN; + } + else + { + gpphLibContext->status.GenCb_pending_status = FALSE; + gpphLibContext->status.DiscEnbl_status = FALSE; + phLibNfc_UpdateCurState(status,gpphLibContext); +#ifdef RESTART_CFG + if(gpphLibContext->status.Discovery_pending_status == TRUE) + { + NFCSTATUS RetStatus = NFCSTATUS_FAILED; + /* Application has called discovery before receiving this callback, + so NO notification to the upper layer, instead lower layer + discovery is called */ + gpphLibContext->status.Discovery_pending_status = FALSE; + RetStatus = phHal4Nfc_ConfigureDiscovery( + gpphLibContext->psHwReference, + gpphLibContext->eLibNfcCfgMode, + &gpphLibContext->sADDconfig, + (pphLibNfc_RspCb_t) + phLibNfc_config_discovery_cb, + (void *)gpphLibContext); + if (NFCSTATUS_PENDING == RetStatus) + { + (void)phLibNfc_UpdateNextState(gpphLibContext, + eLibNfcHalStateConfigReady); + gpphLibContext->status.GenCb_pending_status = TRUE; + gpphLibContext->status.DiscEnbl_status = TRUE; + } + else + { + status = NFCSTATUS_FAILED; + } + } +#endif /* #ifdef RESTART_CFG */ + } + } /*End of if-context check*/ + else + { /*exception: wrong context pointer returned*/ + phOsalNfc_RaiseException(phOsalNfc_e_InternalErr,1); + status = NFCSTATUS_FAILED; + } + if(gpphLibContext->CBInfo.pClientDisConfigCb!=NULL) + { + gpphLibContext->CBInfo.pClientDisConfigCb(gpphLibContext->CBInfo.pClientDisCfgCntx,status); + gpphLibContext->CBInfo.pClientDisConfigCb=NULL; + } + return; +} +/** +* Configure Discovery Modes. +* This function is used to configure ,start and stop the discovery wheel. +*/ +NFCSTATUS phLibNfc_Mgt_ConfigureDiscovery ( + phLibNfc_eDiscoveryConfigMode_t DiscoveryMode, + phLibNfc_sADD_Cfg_t sADDSetup, + pphLibNfc_RspCb_t pConfigDiscovery_RspCb, + void* pContext + ) + { + NFCSTATUS RetVal = NFCSTATUS_FAILED; + phHal_sADD_Cfg_t *psADDConfig; + psADDConfig = (phHal_sADD_Cfg_t *)&(sADDSetup); + + + if((NULL == gpphLibContext) || + (gpphLibContext->LibNfcState.cur_state + == eLibNfcHalStateShutdown)) + { + /*Lib Nfc not initialized*/ + RetVal = NFCSTATUS_NOT_INITIALISED; + } + /* Check for Valid parameters*/ + else if((NULL == pContext) || (NULL == pConfigDiscovery_RspCb)) + { + RetVal= NFCSTATUS_INVALID_PARAMETER; + } + else if(gpphLibContext->LibNfcState.next_state + == eLibNfcHalStateShutdown) + { + RetVal= NFCSTATUS_SHUTDOWN; + } + else + { + gpphLibContext->eLibNfcCfgMode =DiscoveryMode; + gpphLibContext->sADDconfig = sADDSetup; + if(gpphLibContext->status.DiscEnbl_status != TRUE) + { + + /* call lower layer config API for the discovery + configuration sent by the application */ + RetVal = phHal4Nfc_ConfigureDiscovery ( gpphLibContext->psHwReference, + DiscoveryMode, + psADDConfig, + (pphLibNfc_RspCb_t) + phLibNfc_config_discovery_cb, + (void*)gpphLibContext); + if(PHNFCSTATUS(RetVal) == NFCSTATUS_PENDING) + { + gpphLibContext->status.DiscEnbl_status = TRUE; + /* Copy discovery callback and its context */ + gpphLibContext->CBInfo.pClientDisConfigCb = pConfigDiscovery_RspCb; + gpphLibContext->CBInfo.pClientDisCfgCntx = pContext; + gpphLibContext->status.GenCb_pending_status = TRUE; + gpphLibContext->LibNfcState.next_state = eLibNfcHalStateConfigReady; + } + else + { + RetVal=NFCSTATUS_FAILED; + } + + } + else + { + RetVal=NFCSTATUS_BUSY; + } + } + return RetVal; + } + +/** +* Check for target presence. +* Checks given target is present in RF filed or not +*/ +NFCSTATUS phLibNfc_RemoteDev_CheckPresence( phLibNfc_Handle hTargetDev, + pphLibNfc_RspCb_t pPresenceChk_RspCb, + void* pRspCbCtx + ) +{ + NFCSTATUS RetVal = NFCSTATUS_FAILED; + phHal_sRemoteDevInformation_t *ps_rem_dev_info = NULL; + /* Check for valid sate */ + if((NULL == gpphLibContext) || + (gpphLibContext->LibNfcState.cur_state + == eLibNfcHalStateShutdown)) + { + RetVal = NFCSTATUS_NOT_INITIALISED; + } + /* Check for valid parameters*/ + else if((NULL == pRspCbCtx) || (NULL == pPresenceChk_RspCb) + || (hTargetDev == 0) ) + { + RetVal= NFCSTATUS_INVALID_PARAMETER; + } + /* Check for DeInit call*/ + else if(gpphLibContext->LibNfcState.next_state + == eLibNfcHalStateShutdown) + { + RetVal = NFCSTATUS_SHUTDOWN; + } + /* Check target is connected or not */ + else if( gpphLibContext->Connected_handle == 0) + { + RetVal = NFCSTATUS_TARGET_NOT_CONNECTED; + } + /* Check given handle is valid or not*/ + else if(hTargetDev != gpphLibContext->Connected_handle) + { + RetVal = NFCSTATUS_INVALID_HANDLE; + } + else + { + ps_rem_dev_info = (phHal_sRemoteDevInformation_t *) + gpphLibContext->Connected_handle; + if((phHal_eMifare_PICC == ps_rem_dev_info->RemDevType) + &&(0 != ps_rem_dev_info->RemoteDevInfo.Iso14443A_Info.Sak) + &&(TRUE == gpphLibContext->LastTrancvSuccess)) + { + /* Call HAL4 API */ + RetVal = phHal4Nfc_Transceive( + gpphLibContext->psHwReference, + gpphLibContext->psBufferedAuth, + (phHal_sRemoteDevInformation_t *) + gpphLibContext->Connected_handle, + (pphHal4Nfc_TransceiveCallback_t ) + phLibNfc_ChkPresence_Trcv_Cb, + (void *)gpphLibContext + ); + + } + else + { + /* Call lower layer PresenceCheck function */ + RetVal = phHal4Nfc_PresenceCheck(gpphLibContext->psHwReference, + phLibNfc_RemoteDev_CheckPresence_Cb, + (void *)gpphLibContext); + } + if( NFCSTATUS_PENDING == PHNFCSTATUS(RetVal)) + { + gpphLibContext->CBInfo.pClientPresChkCb = pPresenceChk_RspCb; + gpphLibContext->CBInfo.pClientPresChkCntx = pRspCbCtx; + /* Mark General callback pending status as TRUE*/ + gpphLibContext->status.GenCb_pending_status = TRUE; + + /* Update the state machine*/ + gpphLibContext->LibNfcState.next_state = eLibNfcHalStatePresenceChk; + } + else /* If return value is internal error(other than pending ) return NFCSTATUS_FAILED*/ + { + RetVal = NFCSTATUS_FAILED; + } + } + return RetVal; +} + +/** +* Response Callback for Remote device Presence Check. +*/ +STATIC +void phLibNfc_RemoteDev_CheckPresence_Cb(void *context, + NFCSTATUS status) +{ + void *pUpperLayerContext=NULL; + pphLibNfc_RspCb_t pClientCb=NULL; + + /*check valid context is returned or not*/ + if((phLibNfc_LibContext_t *)context != gpphLibContext) + { + /*exception: wrong context pointer returned*/ + phOsalNfc_RaiseException(phOsalNfc_e_InternalErr,1); + } + /* Mark general callback pending status as FALSE*/ + gpphLibContext->status.GenCb_pending_status = FALSE; + pClientCb =gpphLibContext->CBInfo.pClientPresChkCb ; + pUpperLayerContext = gpphLibContext->CBInfo.pClientPresChkCntx; + gpphLibContext->CBInfo.pClientPresChkCntx = NULL; + gpphLibContext->CBInfo.pClientPresChkCb =NULL; + /* Check DeInit call is called, if yes call pending + shutdown and return NFCSTATUS_SHUTDOWN */ + if(eLibNfcHalStateShutdown == gpphLibContext->LibNfcState.next_state) + { + phLibNfc_Pending_Shutdown(); + status = NFCSTATUS_SHUTDOWN; + } + else + { + if (status != NFCSTATUS_SUCCESS) + { + /*If status is other than SUCCESS (Internal error) return + NFCSTATUS_TARGET_LOST */ + status= NFCSTATUS_TARGET_LOST; + } + else + { + status = NFCSTATUS_SUCCESS; + } + } + /* Update the current state */ + phLibNfc_UpdateCurState(status,gpphLibContext); + if(NULL != pClientCb) + { + /* call the upper layer callback */ + pClientCb(pUpperLayerContext,status); + } + return; +} + +/**Used for presence chk incase of mifare std tags*/ +STATIC void phLibNfc_ChkPresence_Trcv_Cb( + void *context, + phHal_sRemoteDevInformation_t *psRemoteDevInfo, + phNfc_sData_t *response, + NFCSTATUS status + ) +{ + PHNFC_UNUSED_VARIABLE(psRemoteDevInfo); + PHNFC_UNUSED_VARIABLE(response); + phLibNfc_RemoteDev_CheckPresence_Cb(context,status); + return; +} + + + |