blob: d6990c133f9a90bc2e6da1c0c903bfd6f6851d64 [file] [log] [blame]
/*
* 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 phHciNfc.c *
* \brief HCI Interface Source for the HCI Management. *
* *
* *
* Project: NFC-FRI-1.1 *
* *
* $Date: Thu Apr 22 17:49:47 2010 $ *
* $Author: ing04880 $ *
* $Revision: 1.90 $ *
* $Aliases: NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $
* *
* =========================================================================== *
*/
/*
################################################################################
***************************** Header File Inclusion ****************************
################################################################################
*/
#include <phNfcConfig.h>
#include <phNfcCompId.h>
#include <phNfcIoctlCode.h>
#include <phHciNfc.h>
#include <phHciNfc_Sequence.h>
#include <phHciNfc_RFReader.h>
#include <phHciNfc_LinkMgmt.h>
#ifdef ENABLE_P2P
#include <phHciNfc_NfcIPMgmt.h>
#endif
#include <phHciNfc_Emulation.h>
#include <phHciNfc_SWP.h>
#include <phHciNfc_DevMgmt.h>
#include <phOsalNfc.h>
/**/
/*
*************************** Static Function Declaration **************************
*/
static
NFCSTATUS
phHciNfc_Config_Emulation (
void *psHciHandle,
void *pHwRef,
phHal_sEmulationCfg_t *pEmulationConfig
);
/*
*************************** Function Definitions **************************
*/
/*!
* \brief Initialises the HCI Interface
*
* This function initialises the resources for the HCI Command and
* Response Mechanism
*/
NFCSTATUS
phHciNfc_Initialise (
void *psHciHandle,
void *pHwRef,
phHciNfc_Init_t init_mode,
phHal_sHwConfig_t *pHwConfig,
pphNfcIF_Notification_CB_t pHalNotify,
void *psContext,
phNfcLayer_sCfg_t *psHciLayerCfg
)
{
phHciNfc_sContext_t *psHciContext = NULL;
phNfcIF_sReference_t hciReference = { NULL, 0, 0 };
phNfcIF_sCallBack_t if_callback = { NULL, NULL, NULL, NULL };
phNfc_sLowerIF_t *plower_if = NULL;
NFCSTATUS status = NFCSTATUS_SUCCESS;
uint8_t lower_index=0;
if( (NULL == psHciHandle) || (NULL == pHwRef) || (NULL == pHalNotify)
|| (NULL== psContext) || (NULL == psHciLayerCfg) || (NULL == pHwConfig)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else if ( NULL != *(phHciNfc_sContext_t **)psHciHandle )
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_ALREADY_INITIALISED );
}
else
{
/* Create the memory for HCI Context */
psHciContext = (phHciNfc_sContext_t *)
phOsalNfc_GetMemory(sizeof(phHciNfc_sContext_t));
if(psHciContext != NULL)
{
(void)memset((void *)psHciContext,0,
sizeof(phHciNfc_sContext_t));
psHciContext->hci_state.cur_state = hciState_Reset;
psHciContext->hci_mode = hciMode_Reset;
psHciContext->p_hw_ref = pHwRef;
psHciContext->host_rf_type = phHal_eUnknown_DevType;
HCI_PRINT("HCI Initialisation in Progress.... \n");
#ifdef ESTABLISH_SESSION
/*(void)memcpy(((phHal_sHwReference_t *)pHwRef)->session_id,
DEFAULT_SESSION, (sizeof(DEFAULT_SESSION) > 0x01) ?
sizeof(DEFAULT_SESSION):
sizeof(((phHal_sHwReference_t *)pHwRef)->session_id));*/
(void)memcpy(pHwConfig->session_id,
DEFAULT_SESSION, ((sizeof(DEFAULT_SESSION) > 0x01)
&& (sizeof(DEFAULT_SESSION) <= 0x08 )) ?
sizeof(DEFAULT_SESSION):
sizeof(pHwConfig->session_id));
#endif
HCI_DEBUG("Sizeof Default Session %u\n",sizeof(DEFAULT_SESSION));
psHciContext->p_upper_notify = pHalNotify;
psHciContext->p_upper_context = psContext;
if_callback.pif_ctxt = psHciContext ;
if_callback.send_complete = &phHciNfc_Send_Complete;
if_callback.receive_complete= &phHciNfc_Receive_Complete;
if_callback.notify = &phHciNfc_Notify_Event;
plower_if = hciReference.plower_if = &(psHciContext->lower_interface);
*((phHciNfc_sContext_t **)psHciHandle) = psHciContext;
psHciContext->init_mode = init_mode;
psHciContext->p_hci_layer = psHciLayerCfg ;
lower_index = psHciLayerCfg->layer_index - 1;
if(NULL != psHciLayerCfg->layer_next->layer_registry)
{
status = psHciLayerCfg->layer_next->layer_registry(
&hciReference, if_callback,
(void *)&psHciLayerCfg[lower_index]);
HCI_DEBUG("HCI Lower Layer Register, Status = %02X\n",status);
}
if( (NFCSTATUS_SUCCESS == status) && (NULL != plower_if->init) )
{
status = phHciNfc_FSM_Update ( psHciContext,
hciState_Initialise
);
if(NFCSTATUS_SUCCESS == status)
{
psHciContext->hci_seq = ADMIN_INIT_SEQ;
psHciContext->target_release = FALSE;
psHciContext->config_type = POLL_LOOP_CFG;
psHciContext->p_config_params = pHwConfig ;
status = plower_if->init((void *)plower_if->pcontext,
(void *)psHciContext->p_hw_ref);
HCI_DEBUG("HCI Lower Layer Initialisation, Status = %02X\n",status);
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
else
{
/* TODO: Handle Initialisation in the Invalid State */
}
}/* End of Lower Layer Init */
} /* End of Status Check for Memory */
else
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
HCI_PRINT("HCI Context Memory Allocation Failed\n");
}
}
return status;
}
/*!
* \brief Release of the HCI Interface .
*
* This function Closes all the open pipes and frees all the resources used by
* HCI Layer
*/
NFCSTATUS
phHciNfc_Release (
void *psHciHandle,
void *pHwRef,
pphNfcIF_Notification_CB_t pHalReleaseCB,
void *psContext
)
{
phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
NFCSTATUS status = NFCSTATUS_SUCCESS;
if( (NULL == psHciHandle)
|| (NULL == pHwRef)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
/* This Scenario Forces the HCI and the lower layers
* to release its Resources
*/
else if ( NULL == pHalReleaseCB )
{
/* Release the lower layer Resources */
phHciNfc_Release_Lower( psHciContext, pHwRef );
/* Release the HCI layer Resources */
phHciNfc_Release_Resources( &psHciContext );
}
else if ( NULL == psContext )
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
HCI_PRINT("HCI Release in Progress.... \n");
psHciContext->p_hw_ref = pHwRef;
status = phHciNfc_FSM_Update ( psHciContext, hciState_Release );
if ((NFCSTATUS_SUCCESS == status)
#ifdef NXP_HCI_SHUTDOWN_OVERRIDE
|| (NFCSTATUS_INVALID_STATE == PHNFCSTATUS(status))
#endif
)
{
psHciContext->p_upper_notify = pHalReleaseCB;
psHciContext->p_upper_context = psContext;
/* psHciContext->hci_seq = EMULATION_REL_SEQ;*/
/* psHciContext->hci_seq = READER_MGMT_REL_SEQ; */
if (HCI_SELF_TEST != psHciContext->init_mode)
{
psHciContext->hci_seq = PL_STOP_SEQ;
}
else
{
psHciContext->hci_seq = ADMIN_REL_SEQ;
}
#ifdef NXP_HCI_SHUTDOWN_OVERRIDE
if (NFCSTATUS_SUCCESS != status)
{
psHciContext->hci_state.next_state = (uint8_t) hciState_Release;
status = NFCSTATUS_PENDING;
}
else
#endif
{
status = phHciNfc_Release_Sequence(psHciContext,pHwRef);
}
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
else
{
/* TODO: Return appropriate Error */
}
}
return status;
}
#if 0
/*!
* \brief Interface to Starts the RF Device Discovery.
*
* This function Starts the Discovery Wheel.
*/
NFCSTATUS
phHciNfc_Start_Discovery (
void *psHciHandle,
void *pHwRef
)
{
phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
NFCSTATUS status = NFCSTATUS_SUCCESS;
if ( (NULL == psHciHandle)
|| (NULL == pHwRef)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
status = phHciNfc_ReaderMgmt_Enable_Discovery( psHciContext, pHwRef );
}
return status;
}
/*!
* \brief Interface to Stop the RF Device Discovery.
*
* This function Stops the Discovery Wheel.
*/
NFCSTATUS
phHciNfc_Stop_Discovery (
void *psHciHandle,
void *pHwRef
)
{
phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
NFCSTATUS status = NFCSTATUS_SUCCESS;
if ( (NULL == psHciHandle)
|| (NULL == pHwRef)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
status = phHciNfc_ReaderMgmt_Disable_Discovery( psHciContext, pHwRef );
}
return status;
}
#endif
/*!
* \brief Interface to Configure the Device With the appropriate
* Configuration Parameters .
*
* This function configures the Devices with the provided
* configuration attributes.
*/
NFCSTATUS
phHciNfc_Configure (
void *psHciHandle,
void *pHwRef,
phHal_eConfigType_t config_type,
phHal_uConfig_t *pConfig
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
if( (NULL == psHciHandle)
|| (NULL == pHwRef)
|| (NULL == pConfig)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
switch(config_type)
{
case NFC_P2P_CONFIG:
{
#ifdef ENABLE_P2P
phHciNfc_sContext_t *psHciContext =
((phHciNfc_sContext_t *)psHciHandle);
status = phHciNfc_FSM_Update ( psHciContext, hciState_Config );
if (NFCSTATUS_SUCCESS == status)
{
psHciContext->config_type = NFC_GENERAL_CFG;
psHciContext->p_config_params = &(pConfig->nfcIPConfig);
psHciContext->hci_seq = INITIATOR_GENERAL_SEQ;
status = phHciNfc_NfcIP_SetATRInfo( psHciHandle,
pHwRef, NFCIP_INITIATOR,
&(pConfig->nfcIPConfig));
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
else
{
psHciContext->hci_seq = TARGET_GENERAL_SEQ;
}
}
#else
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
#endif
break;
}
case NFC_EMULATION_CONFIG:
{
status = phHciNfc_Config_Emulation( psHciHandle,
pHwRef, &(pConfig->emuConfig));
break;
}
case NFC_SE_PROTECTION_CONFIG:
{
phHciNfc_sContext_t *psHciContext =
((phHciNfc_sContext_t *)psHciHandle);
status = phHciNfc_FSM_Update ( psHciContext, hciState_Config );
if (NFCSTATUS_SUCCESS == status)
{
psHciContext->config_type = SWP_PROTECT_CFG;
psHciContext->p_config_params = &(pConfig->protectionConfig);
psHciContext->hci_seq = HCI_END_SEQ;
status = phHciNfc_SWP_Protection( psHciHandle,
pHwRef, pConfig->protectionConfig.mode);
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
break;
}
default:
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
break;
}
}/* End of the Configuration Switch */
}
return status;
}
/*!
* \brief Interface to Configure the RF Device Discovery using
* HCI Polling Loop Gate .
*
* This function configures the HCI Polling Loop Gate with the provided
* configuration attributes.
*/
NFCSTATUS
phHciNfc_Config_Discovery (
void *psHciHandle,
void *pHwRef,
phHal_sADD_Cfg_t *pPollConfig
)
{
phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
NFCSTATUS status = NFCSTATUS_SUCCESS;
if( (NULL == psHciHandle)
|| (NULL == pHwRef)
|| (NULL == pPollConfig)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
HCI_PRINT("HCI Poll Configuration .... \n");
status = phHciNfc_FSM_Update ( psHciContext, hciState_Config );
if (NFCSTATUS_SUCCESS == status)
{
#if 0
if(pPollConfig->PollDevInfo.PollEnabled)
{
psHciContext->hci_seq = PL_DURATION_SEQ;
}
else
{
psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ;
/* psHciContext->hci_seq = (pPollConfig->NfcIP_Mode != 0 )?
PL_CONFIG_PHASE_SEQ:
READER_DISABLE_SEQ; */
}
#endif
psHciContext->hci_seq = PL_DURATION_SEQ;
psHciContext->config_type = POLL_LOOP_CFG;
psHciContext->p_config_params = pPollConfig;
status = phHciNfc_PollLoop_Sequence( psHciContext, pHwRef );
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
else
{
/* TODO: Return appropriate Error */
}
}
return status;
}
/*!
* \brief Interface to Restart the RF Device Discovery.
*
* This function restarts the Discovery Wheel.
*/
NFCSTATUS
phHciNfc_Restart_Discovery (
void *psHciHandle,
void *pHwRef,
uint8_t re_poll
)
{
phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
NFCSTATUS status = NFCSTATUS_SUCCESS;
phHal_eRemDevType_t target_type = phHal_eUnknown_DevType;
if ( (NULL == psHciHandle)
|| (NULL == pHwRef)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
/* To be back in the Poll State to Re-Poll the Target */
status = phHciNfc_FSM_Update ( psHciContext, hciState_Initialise );
if (NFCSTATUS_SUCCESS == status)
{
switch (psHciContext->host_rf_type)
{
case phHal_eISO14443_A_PCD:
{
target_type = phHal_eISO14443_A_PICC;
break;
}
case phHal_eNfcIP1_Initiator:
{
target_type = phHal_eNfcIP1_Target;
break;
}
#ifdef TYPE_B
case phHal_eISO14443_B_PCD:
{
target_type = phHal_eISO14443_B_PICC;
break;
}
#endif
#ifdef TYPE_FELICA
case phHal_eFelica_PCD:
{
target_type = phHal_eFelica_PICC;
break;
}
#endif
#ifdef TYPE_JEWEL
case phHal_eJewel_PCD:
{
target_type = phHal_eJewel_PICC;
break;
}
#endif
#ifdef TYPE_ISO15693
case phHal_eISO15693_PCD:
{
target_type = phHal_eISO15693_PICC;
break;
}
#endif /* #ifdef TYPE_ISO15693 */
#ifndef TYPE_B
case phHal_eISO14443_B_PCD:
#endif
#ifndef TYPE_FELICA
case phHal_eFelica_PCD:
#endif
#ifndef TYPE_JEWEL
case phHal_eJewel_PCD:
#endif
#ifndef TYPE_B_PRIME
case phHal_eISO14443_BPrime_PCD:
#endif
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
break;
}
case phHal_eUnknown_DevType:
default:
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
break;
}
}/* End of the Remote Target Type Switch */
if( NFCSTATUS_SUCCESS == status )
{
status = phHciNfc_ReaderMgmt_Deselect(
psHciContext, pHwRef, target_type, re_poll);
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
else
{
psHciContext->host_rf_type = phHal_eUnknown_DevType;
}
}
}
else
{
/* TODO: Return appropriate Error */
}
}
return status;
}
/*!
* \brief Interface to Configure the device to emulation as
* the tag, smart tag or p2p target .
*
* This function configures the HCI Polling Loop Gate with the provided
* configuration attributes.
*/
static
NFCSTATUS
phHciNfc_Config_Emulation (
void *psHciHandle,
void *pHwRef,
phHal_sEmulationCfg_t *pEmulationCfg
)
{
phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
NFCSTATUS status = NFCSTATUS_SUCCESS;
if( (NULL == psHciHandle)
|| (NULL == pHwRef)
|| (NULL == pEmulationCfg)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
HCI_PRINT("HCI Configure Emulation .... \n");
status = phHciNfc_FSM_Update ( psHciContext, hciState_Config );
if (NFCSTATUS_SUCCESS == status)
{
psHciContext->hci_seq = EMULATION_CONFIG_SEQ;
psHciContext->p_config_params = pEmulationCfg;
switch( pEmulationCfg->emuType )
{
case NFC_SMARTMX_EMULATION:
{
psHciContext->config_type = SMX_WI_CFG;
status = phHciNfc_Emulation_Cfg(psHciContext,
pHwRef, SMX_WI_CFG);
break;
}
case NFC_UICC_EMULATION:
{
psHciContext->config_type = UICC_SWP_CFG;
psHciContext->hci_seq = EMULATION_CONFIG_SEQ;
(void)phHciNfc_SWP_Update_Sequence(
psHciContext, CONFIG_SEQ );
status = phHciNfc_EmulationCfg_Sequence(
psHciContext, pHwRef);
break;
}
case NFC_HOST_CE_A_EMULATION:
case NFC_HOST_CE_B_EMULATION:
#if defined(HOST_EMULATION)
{
if(TRUE == pEmulationCfg->config.
hostEmuCfg_A.enableEmulation)
{
psHciContext->hci_seq = ADMIN_CE_SEQ;
}
status = phHciNfc_EmulationCfg_Sequence(
psHciContext, pHwRef);
break;
}
#endif
default:
{
break;
}
} /* End of Config Switch */
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
else
{
/* TODO: Return appropriate Error */
}
}
return status;
}
NFCSTATUS
phHciNfc_Switch_SwpMode (
void *psHciHandle,
void *pHwRef,
phHal_eSWP_Mode_t swp_mode /* ,
void *pSwpCfg */
)
{
phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
NFCSTATUS status = NFCSTATUS_SUCCESS;
if( (NULL == psHciHandle)
|| (NULL == pHwRef)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
HCI_PRINT("HCI SWP Switch .... ");
status = phHciNfc_FSM_Update ( psHciContext, hciState_Config );
if (NFCSTATUS_SUCCESS == status)
{
psHciContext->config_type = SWP_EVT_CFG;
status = phHciNfc_SWP_Configure_Mode( psHciContext, pHwRef ,
(uint8_t) swp_mode );
/* Send the Success Status as this is an event */
status = ((status == NFCSTATUS_SUCCESS)?
NFCSTATUS_PENDING : status);
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
HCI_PRINT(" Execution Error \n");
}
else
{
HCI_PRINT(" Successful \n");
}
}
else
{
HCI_PRINT(" Not allowed - Invalid State \n");
/* TODO: Return appropriate Error */
}
}
return status;
}
/*!
* \brief Interface to Switch the Mode of the SmartMx from Virtual/Wired
* to the other mode.
*
* This function switches the mode of the SmartMX connected through WI(S2C)
* Interface to virtual/wired mode.
*/
NFCSTATUS
phHciNfc_Switch_SmxMode (
void *psHciHandle,
void *pHwRef,
phHal_eSmartMX_Mode_t smx_mode,
phHal_sADD_Cfg_t *pPollConfig
)
{
phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
NFCSTATUS status = NFCSTATUS_SUCCESS;
if( (NULL == psHciHandle)
|| (NULL == pHwRef)
|| (NULL == pPollConfig)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
HCI_PRINT("HCI Smart MX Mode Switch .... \n");
status = phHciNfc_FSM_Update ( psHciContext, hciState_Config );
if (NFCSTATUS_SUCCESS == status)
{
psHciContext->hci_seq = READER_DISABLE_SEQ;
if ( (eSmartMx_Wired == psHciContext->smx_mode)
&& ( hciState_Connect == psHciContext->hci_state.cur_state)
&&( eSmartMx_Wired != smx_mode)
)
{
/* Workaround: For Wired Mode Disconnect
All the statemachine updates should be done only with the
Statemachine API and should not be overridden.
*/
psHciContext->hci_state.cur_state = hciState_Disconnect;
}
psHciContext->config_type = SMX_WI_MODE;
psHciContext->smx_mode = smx_mode;
psHciContext->p_config_params = pPollConfig;
status = phHciNfc_SmartMx_Mode_Sequence( psHciContext, pHwRef );
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
else
{
/* TODO: Return appropriate Error */
}
}
return status;
}
/*!
* \brief Interface to Select the Next Remote Target Discovered during the
* discovery sequence using the particular HCI Reader Gate .
*
*
* This function Selects and Activates the next Remote Target
* Detected using the particular HCI Reader Gate.
*/
NFCSTATUS
phHciNfc_Select_Next_Target (
void *psHciHandle,
void *pHwRef
)
{
phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
NFCSTATUS status = NFCSTATUS_SUCCESS;
if( (NULL == psHciHandle)
|| (NULL == pHwRef)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
status = phHciNfc_FSM_Update ( psHciContext, hciState_Select );
if (NFCSTATUS_SUCCESS == status)
{
psHciContext->hci_seq = READER_SELECT_SEQ;
status = phHciNfc_ReaderMgmt_Activate_Next( psHciContext, pHwRef );
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
else
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
}
}
return status;
}
/*!
* \brief Interface to Connect the Remote Target Discovered during the
* discovery sequence using the particular HCI Reader Gate .
*
*
* This function connects the Remote Target Detected using the particular
* HCI Reader Gate with the appropriate configuration setup.
*/
NFCSTATUS
phHciNfc_Connect (
void *psHciHandle,
void *pHwRef,
phHal_sRemoteDevInformation_t *p_target_info
)
{
phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
NFCSTATUS status = NFCSTATUS_SUCCESS;
/* phHal_eRemDevType_t target_type = phHal_eUnknown_DevType; */
if( (NULL == psHciHandle)
|| (NULL == pHwRef)
|| (NULL == p_target_info)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
status = phHciNfc_FSM_Update ( psHciContext, hciState_Connect );
if (NFCSTATUS_SUCCESS == status)
{
psHciContext->hci_seq = READER_SELECT_SEQ;
switch (p_target_info->RemDevType)
{
case phHal_eISO14443_A_PICC:
case phHal_eISO14443_4A_PICC:
case phHal_eMifare_PICC:
case phHal_eISO14443_3A_PICC:
#ifdef ENABLE_P2P
case phHal_eNfcIP1_Target:
#endif
#ifdef TYPE_B
case phHal_eISO14443_B_PICC:
case phHal_eISO14443_4B_PICC:
#endif
#ifdef TYPE_FELICA
case phHal_eFelica_PICC:
#endif
#ifdef TYPE_JEWEL
case phHal_eJewel_PICC:
#endif
#ifdef TYPE_ISO15693
case phHal_eISO15693_PICC:
#endif /* #ifdef TYPE_ISO15693 */
{
psHciContext->p_target_info = p_target_info;
status = phHciNfc_ReaderMgmt_Select(
psHciContext, pHwRef,
p_target_info->RemDevType );
break;
}
#ifndef TYPE_B_PRIME
case phHal_eISO14443_BPrime_PICC:
#endif
case phHal_eUnknown_DevType:
default:
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
break;
}
}/* End of the Remote Target Type Switch */
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
else
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
}
} /* End of the HCI Handle Validation */
return status;
}
/*!
* \brief Interface to Reactivate the Remote Targets Discovered during the
* discovery sequence using the particular HCI Reader Gate .
*
*
* This function reactivates the Remote Target Detected using the particular
* HCI Reader Gate with the appropriate configuration setup.
*/
NFCSTATUS
phHciNfc_Reactivate (
void *psHciHandle,
void *pHwRef,
phHal_sRemoteDevInformation_t *p_target_info
)
{
phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
NFCSTATUS status = NFCSTATUS_SUCCESS;
/* phHal_eRemDevType_t target_type = phHal_eUnknown_DevType; */
if( (NULL == psHciHandle)
|| (NULL == pHwRef)
|| (NULL == p_target_info)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
status = phHciNfc_FSM_Update ( psHciContext, hciState_Reactivate );
if (NFCSTATUS_SUCCESS == status)
{
psHciContext->hci_seq = READER_REACTIVATE_SEQ;
switch (p_target_info->RemDevType)
{
case phHal_eISO14443_A_PICC:
case phHal_eISO14443_4A_PICC:
case phHal_eMifare_PICC:
case phHal_eISO14443_3A_PICC:
{
psHciContext->host_rf_type = phHal_eISO14443_A_PCD;
break;
}
case phHal_eNfcIP1_Target:
{
psHciContext->host_rf_type = phHal_eNfcIP1_Initiator;
break;
}
#ifdef TYPE_B
case phHal_eISO14443_4B_PICC:
case phHal_eISO14443_B_PICC:
{
psHciContext->host_rf_type = phHal_eISO14443_B_PCD;
break;
}
#endif
#ifdef TYPE_FELICA
case phHal_eFelica_PICC:
{
psHciContext->host_rf_type = phHal_eFelica_PCD;
break;
}
#endif
#ifdef TYPE_B_PRIME
case phHal_eISO14443_BPrime_PICC:
#endif
/* Reactivate for Jewel is not Supported */
case phHal_eJewel_PICC:
case phHal_eUnknown_DevType:
default:
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
break;
}
}/* End of the Remote Target Type Switch */
}
else
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
}
if(NFCSTATUS_SUCCESS == status )
{
psHciContext->p_target_info = p_target_info;
status = phHciNfc_ReaderMgmt_Reactivate(
psHciContext, pHwRef, p_target_info->RemDevType );
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
} /* End of the HCI Handle Validation */
return status;
}
/*!
* \brief Interface to Disconnect the selected target.
*
* This function disconnects the remote target selected.
*/
NFCSTATUS
phHciNfc_Disconnect (
void *psHciHandle,
void *pHwRef,
uint8_t re_poll
)
{
phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
NFCSTATUS status = NFCSTATUS_SUCCESS;
phHal_eRemDevType_t target_type = phHal_eUnknown_DevType;
/* phHal_eSmartMX_Mode_t smx_mode = (phHal_eSmartMX_Mode_t)type; */
static uint8_t repoll=0;
if( (NULL == psHciHandle)
|| (NULL == pHwRef)
|| ( NULL == psHciContext->p_target_info)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
repoll = re_poll;
psHciContext->p_config_params = &repoll;
/* psHciContext->hci_seq = HCI_END_SEQ; */
/* To be back in the Poll State to Re-Poll the Target */
status = phHciNfc_FSM_Update ( psHciContext, hciState_Disconnect );
if (NFCSTATUS_SUCCESS == status)
{
psHciContext->hci_seq = READER_UICC_DISPATCH_SEQ;
target_type = psHciContext->p_target_info->RemDevType;
switch (target_type)
{
case phHal_eMifare_PICC:
case phHal_eISO14443_A_PICC:
case phHal_eISO14443_4A_PICC:
case phHal_eISO14443_3A_PICC:
case phHal_eNfcIP1_Target:
#ifdef TYPE_B
case phHal_eISO14443_B_PICC:
case phHal_eISO14443_4B_PICC:
#endif
#ifdef TYPE_FELICA
case phHal_eFelica_PICC:
#endif
#ifdef TYPE_JEWEL
case phHal_eJewel_PICC:
#endif
#ifdef TYPE_ISO15693
case phHal_eISO15693_PICC:
#endif /* #ifdef TYPE_ISO15693 */
{
status = phHciNfc_Disconnect_Sequence(
psHciContext, pHwRef );
break;
}
#ifndef TYPE_B
case phHal_eISO14443_B_PICC:
case phHal_eISO14443_4B_PICC:
#endif
#ifndef TYPE_FELICA
case phHal_eFelica_PICC:
#endif
#ifndef TYPE_JEWEL
case phHal_eJewel_PICC:
#endif
#ifndef TYPE_B_PRIME
case phHal_eISO14443_BPrime_PICC:
#endif
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
break;
}
case phHal_eUnknown_DevType:
default:
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
break;
}
}/* End of the Remote Target Type Switch */
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
else
{
/* TODO: Return appropriate Error */
}
} /* End of the HCI Handle Validation */
return status;
}
/*!
* \brief Interface to exchange the data to/from
* the selected target.
*
* This function sends and receives the data to/from
* the selected remote target.
*/
NFCSTATUS
phHciNfc_Exchange_Data (
void *psHciHandle,
void *pHwRef,
phHal_sRemoteDevInformation_t *p_target_info,
phHciNfc_XchgInfo_t *p_xchg_info
)
{
phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
NFCSTATUS status = NFCSTATUS_SUCCESS;
if( (NULL == psHciHandle)
|| (NULL == pHwRef)
|| (NULL == p_target_info)
|| (NULL == p_xchg_info)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else if (p_target_info != psHciContext->p_target_info )
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_REMOTE_DEVICE);
}
else
{
psHciContext->p_hw_ref = pHwRef;
status = phHciNfc_FSM_Update ( psHciContext, hciState_Transact );
if (NFCSTATUS_SUCCESS == status)
{
switch (p_target_info->RemDevType)
{
case phHal_eMifare_PICC:
case phHal_eISO14443_A_PICC:
case phHal_eISO14443_4A_PICC:
case phHal_eISO14443_3A_PICC:
#ifdef TYPE_B
case phHal_eISO14443_B_PICC:
case phHal_eISO14443_4B_PICC:
#endif
#ifdef TYPE_FELICA
case phHal_eFelica_PICC:
#endif
#ifdef TYPE_JEWEL
case phHal_eJewel_PICC:
#endif
#ifdef TYPE_ISO15693
case phHal_eISO15693_PICC:
#endif /* #ifdef TYPE_ISO15693 */
{
psHciContext->p_xchg_info = p_xchg_info;
status = phHciNfc_ReaderMgmt_Exchange_Data(
psHciContext, pHwRef, p_xchg_info );
break;
}
#ifndef TYPE_B
case phHal_eISO14443_B_PICC:
case phHal_eISO14443_4B_PICC:
#endif
#ifndef TYPE_FELICA
case phHal_eFelica_PICC:
#endif
#ifndef TYPE_JEWEL
case phHal_eJewel_PICC:
#endif
case phHal_eNfcIP1_Target:
#ifndef TYPE_B_PRIME
case phHal_eISO14443_BPrime_PICC:
#endif
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
break;
}
case phHal_eUnknown_DevType:
default:
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
break;
}
}/* End of the Remote Target Type Switch */
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
else
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
}
} /* End of the HCI Handle Validation */
return status;
}
/*!
* \brief Interface to Send the data to/from
* the selected NfcIP.
*
* This function sends and receives the data to/from
* the selected remote target.
*/
NFCSTATUS
phHciNfc_Send_Data (
void *psHciHandle,
void *pHwRef,
phHal_sRemoteDevInformation_t *p_remote_dev_info,
phHciNfc_XchgInfo_t *p_send_param
)
{
phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
NFCSTATUS status = NFCSTATUS_SUCCESS;
if( (NULL == psHciHandle)
|| (NULL == pHwRef)
|| (NULL == p_send_param)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
status = phHciNfc_FSM_Update ( psHciContext, hciState_Transact );
if (NFCSTATUS_SUCCESS == status)
{
switch (psHciContext->host_rf_type)
{
case phHal_eISO14443_A_PICC:
case phHal_eISO14443_B_PICC:
case phHal_eISO14443_4A_PICC:
case phHal_eISO14443_4B_PICC:
{
break;
}
#ifdef ENABLE_P2P
case phHal_eNfcIP1_Initiator:
{
if (p_remote_dev_info !=
psHciContext->p_target_info )
{
status = PHNFCSTVAL(CID_NFC_HCI,
NFCSTATUS_INVALID_REMOTE_DEVICE);
}
else
{
psHciContext->p_xchg_info = p_send_param;
status = phHciNfc_NfcIP_Send_Data( psHciContext,
pHwRef, p_send_param );
}
break;
}
case phHal_eNfcIP1_Target:
{
psHciContext->p_xchg_info = p_send_param;
status = phHciNfc_NfcIP_Send_Data( psHciContext,
pHwRef, p_send_param );
break;
}
#endif
#ifdef TYPE_B_PRIME
case phHal_eISO14443_BPrime_PCD:
case phHal_eFelica_PCD:
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
break;
}
#endif
case phHal_eUnknown_DevType:
default:
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
break;
}
}/* End of the Remote Target Type Switch */
#if defined( ENABLE_P2P ) || defined (TYPE_B_PRIME)
if( NFCSTATUS_PENDING != status )
#endif
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
else
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
}
} /* End of the HCI Handle Validation */
return status;
}
#if 0
/*!
* \brief Interface to Send the data from
* the selected NfcIP.
*
* This function sends and receives the data to/from
* the selected remote target.
*/
NFCSTATUS
phHciNfc_Receive_Data (
void *psHciHandle,
void *pHwRef,
uint8_t *p_data,
uint8_t length
)
{
phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
NFCSTATUS status = NFCSTATUS_SUCCESS;
if( (NULL == psHciHandle)
|| (NULL == pHwRef)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
if (NFCSTATUS_SUCCESS == status)
{
status = phHciNfc_Receive(psHciHandle, pHwRef, p_data, length);
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
}
return status;
}
#endif
/*!
* \brief Interface to Check for the presence of
* the selected target in the field .
*
* This function checks the presence of the
* the selected remote target in the field .
*/
NFCSTATUS
phHciNfc_Presence_Check (
void *psHciHandle,
void *pHwRef
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
phHciNfc_sContext_t *psHciContext =
((phHciNfc_sContext_t *)psHciHandle);
phHal_eRemDevType_t target_type = phHal_eUnknown_DevType;
if( (NULL == psHciContext)
|| (NULL == pHwRef)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
status = phHciNfc_FSM_Update ( psHciContext, hciState_Presence );
if (NFCSTATUS_SUCCESS == status)
{
target_type = psHciContext->p_target_info->RemDevType;
switch (target_type)
{
case phHal_eISO14443_A_PICC:
case phHal_eMifare_PICC:
case phHal_eISO14443_4A_PICC:
case phHal_eISO14443_3A_PICC:
#ifdef TYPE_B
case phHal_eISO14443_B_PICC:
case phHal_eISO14443_4B_PICC:
#endif
#ifdef TYPE_FELICA
case phHal_eFelica_PICC:
#endif
#ifdef TYPE_JEWEL
case phHal_eJewel_PICC:
#endif
#ifdef TYPE_ISO15693
case phHal_eISO15693_PICC:
#endif /* #ifdef TYPE_ISO15693 */
#ifdef ENABLE_P2P
case phHal_eNfcIP1_Target:
#endif
{
status = phHciNfc_ReaderMgmt_Presence_Check(
psHciContext, pHwRef );
break;
}
#ifdef TYPE_B_PRIME
case phHal_eISO14443_BPrime_PICC:
#endif
#ifndef TYPE_B
case phHal_eISO14443_B_PICC:
case phHal_eISO14443_4B_PICC:
#endif
#ifndef TYPE_FELICA
case phHal_eFelica_PICC:
#endif
#ifndef TYPE_JEWEL
case phHal_eJewel_PICC:
#endif
case phHal_eUnknown_DevType:
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
break;
}
default:
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
break;
}
}/* End of the Remote Target Type Switch */
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
else
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
}
} /* End of the HCI Handle Validation */
return status;
}
NFCSTATUS
phHciNfc_PRBS_Test (
void *psHciHandle,
void *pHwRef,
uint32_t test_type,
phNfc_sData_t *test_param
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
phHciNfc_sContext_t *psHciContext =
((phHciNfc_sContext_t *)psHciHandle);
if( (NULL == psHciContext)
|| (NULL == pHwRef)
|| (test_type != DEVMGMT_PRBS_TEST)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
status = phHciNfc_FSM_Update ( psHciContext, hciState_IO );
if (NFCSTATUS_SUCCESS == status)
{
status = phHciNfc_DevMgmt_Test(psHciContext, pHwRef,
(uint8_t)(test_type & DEVMGMT_TEST_MASK), test_param);
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
}
return status;
}
NFCSTATUS
phHciNfc_System_Test (
void *psHciHandle,
void *pHwRef,
uint32_t test_type,
phNfc_sData_t *test_param
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
phHciNfc_sContext_t *psHciContext =
((phHciNfc_sContext_t *)psHciHandle);
static phNfc_sData_t test_result;
static uint8_t gpio_status = 0;
if( (NULL == psHciContext)
|| (NULL == pHwRef)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
status = phHciNfc_FSM_Update ( psHciContext, hciState_Test );
if (NFCSTATUS_SUCCESS == status)
{
if (test_type != NFC_GPIO_READ)
{
status = phHciNfc_DevMgmt_Test(psHciContext, pHwRef,
(uint8_t)(test_type & DEVMGMT_TEST_MASK), test_param);
}
else
{
test_result.buffer = &gpio_status;
status = phHciNfc_DevMgmt_Get_Info(psHciContext, pHwRef,
(uint16_t)NFC_GPIO_READ, test_result.buffer);
}
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
}
return status;
}
NFCSTATUS
phHciNfc_System_Configure (
void *psHciHandle,
void *pHwRef,
uint32_t config_type,
uint8_t config_value
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
phHciNfc_sContext_t *psHciContext =
((phHciNfc_sContext_t *)psHciHandle);
if( (NULL == psHciContext)
|| (NULL == pHwRef)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
status = phHciNfc_FSM_Update ( psHciContext, hciState_IO );
if (NFCSTATUS_SUCCESS == status)
{
status = phHciNfc_DevMgmt_Configure(psHciContext, pHwRef,
(uint16_t)config_type, config_value);
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
}
return status;
}
NFCSTATUS
phHciNfc_System_Get_Info(
void *psHciHandle,
void *pHwRef,
uint32_t config_type,
uint8_t *p_config_value
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
phHciNfc_sContext_t *psHciContext =
((phHciNfc_sContext_t *)psHciHandle);
if( (NULL == psHciContext)
|| (NULL == pHwRef)
|| (NULL == p_config_value)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
status = phHciNfc_FSM_Update ( psHciContext, hciState_IO );
if (NFCSTATUS_SUCCESS == status)
{
status = phHciNfc_DevMgmt_Get_Info(psHciContext, pHwRef,
(uint16_t)config_type, p_config_value);
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
}
return status;
}
NFCSTATUS
phHciNfc_Get_Link_Status(
void *psHciHandle,
void *pHwRef
)
{
NFCSTATUS status = NFCSTATUS_SUCCESS;
phHciNfc_sContext_t *psHciContext =
((phHciNfc_sContext_t *)psHciHandle);
if( (NULL == psHciContext)
|| (NULL == pHwRef)
)
{
status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
}
else
{
psHciContext->p_hw_ref = pHwRef;
status = phHciNfc_FSM_Update ( psHciContext, hciState_IO );
if (NFCSTATUS_SUCCESS == status)
{
status = phHciNfc_LinkMgmt_Open(psHciContext, pHwRef);
if( NFCSTATUS_PENDING != status )
{
/* Roll Back the State Machine to its Original State */
phHciNfc_FSM_Rollback ( psHciContext );
}
}
}
return status;
}