summaryrefslogtreecommitdiffstats
path: root/src/phHciNfc_Sequence.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/phHciNfc_Sequence.c')
-rw-r--r--src/phHciNfc_Sequence.c2454
1 files changed, 2454 insertions, 0 deletions
diff --git a/src/phHciNfc_Sequence.c b/src/phHciNfc_Sequence.c
new file mode 100644
index 0000000..07a702a
--- /dev/null
+++ b/src/phHciNfc_Sequence.c
@@ -0,0 +1,2454 @@
+/*
+ * 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_Sequence.c *
+* \brief State Machine Implementation for the HCI Management and *
+* and the Function Sequence for a particular State *
+* *
+* *
+* Project: NFC-FRI-1.1 *
+* *
+* $Date: Tue Jun 8 09:33:46 2010 $ *
+* $Author: ing04880 $ *
+* $Revision: 1.85 $ *
+* $Aliases: NFC_FRI1.1_WK1023_R35_1 $
+* *
+* =========================================================================== *
+*/
+
+/*
+################################################################################
+***************************** Header File Inclusion ****************************
+################################################################################
+*/
+
+#include <phNfcCompId.h>
+#include <phNfcConfig.h>
+#include <phHciNfc.h>
+#include <phHciNfc_Sequence.h>
+#include <phHciNfc_AdminMgmt.h>
+#include <phHciNfc_IDMgmt.h>
+#include <phHciNfc_LinkMgmt.h>
+#include <phHciNfc_DevMgmt.h>
+#include <phHciNfc_PollingLoop.h>
+#include <phHciNfc_RFReader.h>
+#include <phHciNfc_RFReaderA.h>
+#include <phHciNfc_Emulation.h>
+#ifdef ENABLE_P2P
+#include <phHciNfc_NfcIPMgmt.h>
+#endif
+#include <phHciNfc_SWP.h>
+#include <phHciNfc_WI.h>
+#include <phOsalNfc.h>
+
+/*
+################################################################################
+****************************** Macro Definitions *******************************
+################################################################################
+*/
+
+/*
+################################################################################
+********************** Structure/Enumeration Definitions ***********************
+################################################################################
+*/
+
+
+#ifdef VALIDATE_FSM
+
+typedef struct phHciNfc_sFsm
+{
+ phHciNfc_eState_t from_state;
+ phHciNfc_eState_t to_state;
+ uint8_t valid;
+}phHciNfc_sFsm_t;
+
+static phHciNfc_sFsm_t phHciNfc_Valid_Fsm[] = {
+ {hciState_Reset, hciState_Initialise , TRUE},
+ /* {hciState_Reset, hciState_Config, FALSE}, */
+ {hciState_Initialise, hciState_Config, TRUE},
+ {hciState_Initialise, hciState_Release, TRUE},
+ {hciState_Config, hciState_Connect, TRUE},
+ {hciState_Config, hciState_Release, TRUE},
+ {hciState_Connect, hciState_Activate, TRUE},
+ {hciState_Connect, hciState_Transact, TRUE},
+ {hciState_Connect, hciState_Disconnect, TRUE},
+ {hciState_Disconnect, hciState_Config, TRUE},
+ /* {hciState_Disconnect, hciState_Release, TRUE}, */
+ {hciState_Reset, hciState_Initialise, TRUE},
+};
+
+#endif
+
+
+/*
+################################################################################
+************************* Function Prototype Declaration ***********************
+################################################################################
+*/
+
+
+static
+NFCSTATUS
+phHciNfc_Config_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ );
+
+
+/**
+ * \ingroup grp_hci_nfc
+ *
+ * The phHciNfc_Connect_Sequence function sequence selects the
+ * discovered target for performing the transaction.
+ *
+ * \param[in] psHciContext psHciContext is the context of
+ * the HCI Layer.
+ * \param[in] pHwRef pHwRef is the Information of
+ * the Device Interface Link .
+ *
+ * \retval NFCSTATUS_SUCCESS HCI target selection sequence successful.
+ * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
+ * could not be interpreted properly.
+ * \retval Other errors Other related errors
+ *
+ */
+
+static
+NFCSTATUS
+phHciNfc_Transact_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ );
+
+/**
+ * \ingroup grp_hci_nfc
+ *
+ * The phHciNfc_Info_Sequence function sequence selects the
+ * discovered target for performing the transaction.
+ *
+ * \param[in] psHciContext psHciContext is the context of
+ * the HCI Layer.
+ * \param[in] pHwRef pHwRef is the Information of
+ * the Device Interface Link .
+ *
+ * \retval NFCSTATUS_SUCCESS HCI target selection sequence successful.
+ * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
+ * could not be interpreted properly.
+ * \retval Other errors Other related errors
+ *
+ */
+
+static
+NFCSTATUS
+phHciNfc_Info_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ );
+
+static
+NFCSTATUS
+phHciNfc_Test_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef,
+ NFCSTATUS test_status,
+ uint8_t *pdata,
+ uint8_t length
+ );
+
+#ifdef HCI_FSM_RESET
+
+static
+void
+phHciNfc_FSM_Reset(
+ phHciNfc_sContext_t *psHciContext
+ );
+
+#endif
+
+static
+NFCSTATUS
+phHciNfc_IO_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef,
+ NFCSTATUS test_status,
+ uint8_t *pdata,
+ uint8_t length
+ );
+
+static
+NFCSTATUS
+phHciNfc_Pending_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ );
+
+
+/*
+################################################################################
+***************************** Function Definitions *****************************
+################################################################################
+*/
+
+NFCSTATUS
+phHciNfc_FSM_Validate(
+ phHciNfc_sContext_t *psHciContext,
+ phHciNfc_eState_t state,
+ uint8_t validate_type
+ )
+{
+ NFCSTATUS status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
+ phHciNfc_eState_t cur_state = (phHciNfc_eState_t)
+ psHciContext->hci_state.cur_state;
+
+ switch(validate_type)
+ {
+ case NFC_FSM_CURRENT:
+ {
+ if( cur_state == (uint8_t) state )
+ {
+ status = NFCSTATUS_SUCCESS;
+ }
+ break;
+ }
+ case NFC_FSM_NEXT:
+ {
+ phHciNfc_eState_t next_state = state;
+ switch (cur_state)
+ {
+ case hciState_Reset:
+ {
+ switch(next_state)
+ {
+ /* Specifies the Starting of the init Sequence */
+ case hciState_Initialise:
+ /* Initialise to Perform Test on
+ the Antenna/SWP Link */
+ case hciState_Test:
+ status = NFCSTATUS_SUCCESS;
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ case hciState_Initialise:
+ {
+ switch(next_state)
+ {
+ /* Discovery Resume after connect failure */
+ case hciState_Initialise:
+ /* Configuring the Discovery/Emulation */
+ case hciState_Config:
+ /* Configuring the Memory */
+ case hciState_IO:
+ /* Occurence of the Tag Discovered Event */
+ case hciState_Select:
+ /* Occurence of the Target Activated Event */
+ case hciState_Listen:
+ /* Specifies the Starting of the Release Sequence */
+ case hciState_Release:
+ status = NFCSTATUS_SUCCESS;
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ case hciState_Test:
+ {
+ if ((hciState_Test == next_state )
+ || (hciState_IO == next_state)
+ || (hciState_Release == next_state))
+ {
+ /* Next Test/Reset Sequence */
+ status = NFCSTATUS_SUCCESS;
+ }
+ break;
+ }
+ case hciState_Select:
+ {
+ switch(next_state)
+ {
+ /* Restart the Wheel */
+ case hciState_Initialise:
+ /* Select the next Tag in the Field or
+ * already Selected Tag Again
+ */
+ /* Configuring the Memory */
+ case hciState_IO:
+ case hciState_Select:
+ /* Configuring the Discovery/Emulation */
+ case hciState_Config:
+ /* Re-Activate the Target or
+ * Discover the next target
+ */
+ case hciState_Reactivate:
+ /* Connect the Discovered Target */
+ case hciState_Connect:
+ /* Specifies the Starting of the Release Sequence */
+ case hciState_Release:
+ status = NFCSTATUS_SUCCESS;
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ case hciState_Connect:
+ {
+ switch(next_state)
+ {
+ /* Disabling the Tag Discovery */
+ case hciState_Initialise:
+ /* Configuring the Discovery/Emulation */
+ /* This should not be allowed if the target
+ * is connected.
+ */
+ /* Configuring the Memory */
+ case hciState_IO:
+ case hciState_Config:
+ /* Re-Activate the Target or
+ * Discover the next target
+ */
+ case hciState_Reactivate:
+ /* Intermediate Transceive State */
+ case hciState_Transact:
+ /* Intermediate Presence Check State */
+ case hciState_Presence:
+ /* Disconnect the Target Connected */
+ case hciState_Disconnect:
+ /* Specifies the Starting of the Release Sequence */
+ case hciState_Release:
+ status = NFCSTATUS_SUCCESS;
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ case hciState_Listen:
+ {
+ switch(next_state)
+ {
+ /* Releasing from the Emulation/Target Mode */
+ case hciState_Initialise:
+ /* Occurence of the Tag Discovered Event
+ * after the Disconnect Operation
+ */
+ case hciState_Select:
+ /* Configuring the Memory */
+ case hciState_IO:
+ /* Configuring the Discovery/Emulation */
+ case hciState_Config:
+ /* Intermediate Transceive State */
+ case hciState_Transact:
+ /* Specifies the Starting of the Release Sequence */
+ case hciState_Release:
+ status = NFCSTATUS_SUCCESS;
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ case hciState_Reactivate:
+ {
+ switch(next_state)
+ {
+ /* Restart/Discovery after the Target is removed
+ * after Reactivation.
+ */
+ /* case hciState_Initialise: */
+ /* Re-Connect the Re-Activated Target */
+ case hciState_Connect:
+ /* Configuring the Memory */
+ case hciState_IO:
+ /* Configuring the Discovery/Emulation */
+ case hciState_Config:
+ /* Specifies the Starting of the Release Sequence */
+ case hciState_Release:
+ status = NFCSTATUS_SUCCESS;
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ case hciState_Disconnect:
+ {
+ switch(next_state)
+ {
+ /* Discovery Resume after connect failure
+ after the disconnect */
+ case hciState_Initialise:
+ /* Configuring the Memory */
+ case hciState_IO:
+ /* Configuring the Discovery/Emulation */
+ case hciState_Config:
+ /* Occurence of the Tag Discovered Event
+ * after the Disconnect Operation
+ */
+ case hciState_Select:
+ /* Occurence of the Target Activated Event */
+ case hciState_Listen:
+ /* Specifies the Starting of the Release Sequence */
+ case hciState_Release:
+ status = NFCSTATUS_SUCCESS;
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+#ifdef USE_M5
+ case hciState_Presence:
+ case hciState_Transact:
+ case hciState_Release:
+ {
+ break;
+ }
+#endif
+ /* case phHciNfc_Unknown: */
+ default:
+ {
+ /* status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE); */
+ break;
+ }
+ } /* End of State Validation Switch */
+ if( NFC_FSM_IN_PROGRESS == psHciContext->hci_state.transition )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
+ }
+ break;
+ }
+ default:
+ {
+ HCI_DEBUG("State Validate Type:%x is Unknown/Incorrect \n",
+ validate_type);
+ break;
+ }
+ }
+ return status;
+}
+
+NFCSTATUS
+phHciNfc_FSM_Update(
+ phHciNfc_sContext_t *psHciContext,
+ phHciNfc_eState_t next_state
+ )
+{
+ NFCSTATUS status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
+
+ HCI_DEBUG(" HCI: Current State --> %02u \n",
+ psHciContext->hci_state.cur_state );
+ HCI_DEBUG(" HCI: Transition Before FSM Update --> %02u \n",
+ psHciContext->hci_state.transition );
+ HCI_DEBUG(" HCI: Next State Before FSM Update --> %02u \n",
+ psHciContext->hci_state.next_state );
+
+ status = phHciNfc_FSM_Validate(psHciContext, next_state, NFC_FSM_NEXT );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_state.next_state = (uint8_t) next_state;
+ psHciContext->hci_state.transition = NFC_FSM_IN_PROGRESS;
+ psHciContext->response_pending = FALSE;
+ HCI_DEBUG(" HCI: Next State After FSM Update --> %02u \n",
+ psHciContext->hci_state.next_state );
+ }
+ else
+ {
+ HCI_DEBUG(" HCI: FSM - Invalid next state --> %02u \n",
+ next_state );
+ }
+
+ return status;
+}
+
+
+NFCSTATUS
+phHciNfc_FSM_Complete(
+ phHciNfc_sContext_t *psHciContext
+ )
+{
+ NFCSTATUS status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
+
+ HCI_DEBUG("HCI: In Function: %s \n", __FUNCTION__);
+
+ HCI_DEBUG(" HCI: Transition Before FSM Complete --> %02u \n",
+ psHciContext->hci_state.transition );
+
+ HCI_DEBUG(" HCI: Current State Before FSM Complete --> %02u \n",
+ psHciContext->hci_state.cur_state );
+
+ HCI_DEBUG(" HCI: Next State Before FSM Complete --> %02u \n",
+ psHciContext->hci_state.next_state );
+
+ if( (NFC_FSM_IN_PROGRESS == psHciContext->hci_state.transition)
+ )
+ {
+ psHciContext->hci_state.cur_state =
+ psHciContext->hci_state.next_state ;
+ psHciContext->hci_state.transition = NFC_FSM_COMPLETE ;
+ psHciContext->hci_state.next_state = (uint8_t) hciState_Unknown ;
+ /* Reset the HCI Sequence */
+ psHciContext->response_pending = FALSE;
+ psHciContext->hci_seq = HCI_INVALID_SEQ;
+ status = NFCSTATUS_SUCCESS;
+ }
+
+ HCI_DEBUG(" HCI: Current State After FSM Complete --> %02u \n",
+ psHciContext->hci_state.cur_state );
+
+ return status;
+}
+
+void
+phHciNfc_FSM_Rollback(
+ phHciNfc_sContext_t *psHciContext
+ )
+{
+
+ HCI_DEBUG("HCI: In Function: %s \n", __FUNCTION__);
+
+ HCI_DEBUG(" HCI: Transition Before FSM Rollback --> %02u \n",
+ psHciContext->hci_state.transition );
+
+ HCI_DEBUG(" HCI: Current State Before FSM Rollback --> %02u \n",
+ psHciContext->hci_state.cur_state );
+
+ HCI_DEBUG(" HCI: Next State Before FSM Rollback --> %02u \n",
+ psHciContext->hci_state.next_state );
+
+ if( (NFC_FSM_IN_PROGRESS == psHciContext->hci_state.transition)
+ )
+ {
+ psHciContext->hci_state.transition = NFC_FSM_COMPLETE ;
+ psHciContext->hci_state.next_state = (uint8_t) hciState_Unknown ;
+ /* Reset the HCI Sequence */
+ psHciContext->hci_seq = HCI_INVALID_SEQ;
+ psHciContext->response_pending = FALSE;
+ }
+}
+
+#ifdef HCI_FSM_RESET
+static
+void
+phHciNfc_FSM_Reset(
+ phHciNfc_sContext_t *psHciContext
+ )
+{
+
+ if( (hciState_Reset != psHciContext->hci_state.cur_state )
+ )
+ {
+ psHciContext->hci_state.cur_state = (uint8_t) hciState_Initialise ;
+ psHciContext->hci_state.transition = NFC_FSM_COMPLETE ;
+ psHciContext->hci_state.next_state = (uint8_t) hciState_Unknown ;
+ /* Reset the HCI Sequence */
+ psHciContext->hci_seq = HCI_INVALID_SEQ;
+ }
+
+}
+#endif
+
+
+
+static
+NFCSTATUS
+phHciNfc_Pending_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+ PHNFC_UNUSED_VARIABLE(status);
+
+ HCI_DEBUG("HCI: psHciContext->target_release --> %s \n",
+ (psHciContext->target_release)?"TRUE":"FALSE");
+ if(TRUE == psHciContext->target_release)
+ {
+#ifdef SW_RELEASE_TARGET
+ status = phHciNfc_ReaderMgmt_Deselect(
+ psHciContext, pHwRef, phHal_eISO14443_A_PICC, TRUE);
+ if(NFCSTATUS_PENDING == status )
+ {
+ psHciContext->target_release = FALSE ;
+ }
+ }
+ else
+ {
+ status = psHciContext->error_status;
+#else
+ psHciContext->target_release = FALSE ;
+#endif
+ }
+
+ return status;
+}
+
+
+void
+phHciNfc_Error_Sequence(
+ void *psContext,
+ void *pHwRef,
+ NFCSTATUS error_status,
+ void *pdata,
+ uint8_t length
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ phHciNfc_sContext_t *psHciContext = (phHciNfc_sContext_t *)psContext;
+
+ PHNFC_UNUSED_VARIABLE(status);
+
+ HCI_DEBUG("HCI: In Function: %s \n",
+ __FUNCTION__);
+
+ HCI_DEBUG ("HCI : Error Status : %04X\n", error_status);
+
+ HCI_DEBUG(" HCI: Current HCI State --> %02u \n",
+ psHciContext->hci_state.cur_state );
+ HCI_DEBUG(" HCI: Next HCI State --> %02u \n",
+ psHciContext->hci_state.next_state );
+
+
+ if ( NFC_FSM_IN_PROGRESS == psHciContext->hci_state.transition )
+ {
+ switch(psHciContext->hci_state.next_state)
+ {
+ case hciState_Initialise:
+ {
+ if (hciState_Reset == psHciContext->hci_state.cur_state)
+ {
+ phNfc_sCompletionInfo_t comp_info;
+
+ phHciNfc_Release_Lower( psHciContext, pHwRef );
+ /* Release all the resources and
+ * Notify the Receive Error Scenario to the Upper Layer
+ */
+ comp_info.status = error_status ;
+ phHciNfc_Release_Notify (psHciContext, pHwRef,
+ NFC_NOTIFY_INIT_FAILED, &comp_info);
+ }
+ else if (hciState_Config == psHciContext->hci_state.cur_state)
+ {
+ /* Notify the Poll/Emulation Configure failure to the upper layer */
+
+ phNfc_sCompletionInfo_t comp_info;
+
+ comp_info.status = error_status ;
+
+ psHciContext->error_status = error_status;
+ status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
+ /* Rollback the FSM as the Poll/Emulation configuration Failed */
+ phHciNfc_FSM_Rollback(psHciContext);
+ psHciContext->error_status = NFCSTATUS_SUCCESS;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_CONFIG_ERROR, &comp_info);
+ }
+ else
+ {
+
+ /* Notify the Poll Configure failure to the upper layer */
+ phNfc_sCompletionInfo_t comp_info;
+
+ psHciContext->error_status = error_status;
+ status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
+ /* Rollback the FSM as the Poll Disable Failed */
+ phHciNfc_FSM_Rollback(psHciContext);
+ comp_info.status = error_status ;
+ psHciContext->error_status = NFCSTATUS_SUCCESS;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_ERROR, &comp_info);
+ }
+ break;
+ }
+ case hciState_Test:
+ {
+ status = phHciNfc_Test_Sequence( psHciContext, pHwRef , error_status,
+ (uint8_t *)pdata, length );
+ break;
+ }
+ case hciState_IO:
+ {
+ status = phHciNfc_IO_Sequence( psHciContext, pHwRef , error_status,
+ (uint8_t *)pdata, length );
+ break;
+ }
+ case hciState_Config:
+ {
+ /* Notify the Configure failure to the upper layer */
+ phNfc_sCompletionInfo_t comp_info;
+
+ psHciContext->error_status = error_status;
+ status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
+ /* Rollback the FSM as the Poll Failed */
+ phHciNfc_FSM_Rollback(psHciContext);
+ comp_info.status = psHciContext->error_status ;
+ psHciContext->error_status = NFCSTATUS_SUCCESS;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_CONFIG_ERROR, &comp_info);
+ break;
+ }
+ case hciState_Select:
+ {
+ /* Notify the Configure failure to the upper layer */
+ phNfc_sCompletionInfo_t comp_info={FALSE};
+
+ /* Rollback the FSM as the Target Discovery Failed */
+ phHciNfc_FSM_Rollback(psHciContext);
+ status = phHciNfc_ReaderMgmt_Update_Sequence(
+ psHciContext, INFO_SEQ );
+ comp_info.status = error_status ;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_DISCOVERY_ERROR, &comp_info);
+
+#if 0
+ /* Polling Wheel will be restarted by the upper layer
+ * to Rediscover again */
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ status = phHciNfc_ReaderMgmt_Deselect(
+ psHciContext, pHwRef, phHal_eISO14443_A_PICC, FALSE);
+ }
+ phHciNfc_FSM_Rollback(psHciContext);
+#endif
+ break;
+ }
+ case hciState_Transact:
+ /* Notify the Transceive failure to the upper layer */
+ {
+ phNfc_sTransactionInfo_t transact_info;
+
+ /* Rollback the FSM as the Transceive Failed */
+ phHciNfc_FSM_Rollback(psHciContext);
+ transact_info.status = error_status;
+ transact_info.buffer = NULL;
+ transact_info.length = FALSE;
+ psHciContext->p_xchg_info = NULL ;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_TRANSCEIVE_ERROR, &transact_info);
+ break;
+
+ }
+ case hciState_Connect:
+ {
+ /* Notify the General failure to the upper layer */
+ phNfc_sCompletionInfo_t comp_info;
+
+ /* psHciContext->host_rf_type = phHal_eUnknown_DevType; */
+ status = phHciNfc_ReaderMgmt_Update_Sequence(
+ psHciContext, INFO_SEQ );
+ psHciContext->p_target_info = NULL;
+ psHciContext->hci_state.cur_state = hciState_Select;
+ phHciNfc_FSM_Rollback(psHciContext);
+ comp_info.status = error_status ;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_CONNECT_FAILED, &comp_info);
+ break;
+ }
+ case hciState_Reactivate:
+ {
+ /* Notify the General failure to the upper layer */
+ phNfc_sCompletionInfo_t comp_info={FALSE};
+
+ /* psHciContext->host_rf_type = phHal_eUnknown_DevType;
+ status = phHciNfc_ReaderMgmt_Update_Sequence(
+ psHciContext, INFO_SEQ );
+ psHciContext->p_target_info = NULL;
+ psHciContext->hci_state.cur_state = hciState_Select; */
+ phHciNfc_FSM_Rollback(psHciContext);
+ comp_info.status = error_status ;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_CONNECT_FAILED, &comp_info);
+ break;
+ }
+ case hciState_Presence:
+ {
+ phNfc_sCompletionInfo_t comp_info;
+
+ /* Roll Back to Connect State as Presence Check is Complete */
+ phHciNfc_FSM_Rollback(psHciContext);
+
+ /* Initialisation Complete Notification to the Upper Layer */
+ comp_info.status = error_status;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_ERROR, &comp_info);
+ HCI_PRINT(" HCI Remote Target Removed from the Field. \n");
+ break;
+ }
+ /* Notify the Connect or Disconnect failure to the upper layer */
+ case hciState_Disconnect:
+ {
+ /* Notify the General failure to the upper layer */
+ phNfc_sCompletionInfo_t comp_info;
+
+ phHciNfc_FSM_Rollback(psHciContext);
+ comp_info.status = error_status ;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_DISCONNECT_FAILED, &comp_info);
+ break;
+ }
+ case hciState_Release:
+ {
+#ifdef NXP_HCI_SHUTDOWN_OVERRIDE
+ status = phHciNfc_Release_Sequence(psHciContext ,pHwRef);
+#else
+ phNfc_sCompletionInfo_t comp_info;
+
+ phHciNfc_Release_Lower( psHciContext, pHwRef );
+ /* Release all the resources and
+ * Notify the Receive Error Scenario to the Upper Layer
+ */
+ comp_info.status = error_status ;
+ phHciNfc_Release_Notify (psHciContext, pHwRef,
+ NFC_NOTIFY_DEINIT_FAILED, &comp_info);
+#endif
+ break;
+ }
+ default:
+ {
+ /* Notify the General failure to the upper layer */
+ phNfc_sCompletionInfo_t comp_info;
+
+ phHciNfc_FSM_Rollback(psHciContext);
+ comp_info.status = error_status ;
+ psHciContext->error_status = error_status;
+ status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
+ if (NFCSTATUS_PENDING != status)
+ {
+ psHciContext->error_status = NFCSTATUS_SUCCESS;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_ERROR, &comp_info);
+ }
+ break;
+ }
+
+ } /* End of the Processing of HCI State*/
+ }
+ else
+ {
+ /* Notify the General failure to the upper layer */
+ phNfc_sCompletionInfo_t comp_info;
+
+ phHciNfc_FSM_Rollback(psHciContext);
+ comp_info.status = error_status ;
+ /* Disable the Notification to the Upper Layer */
+ if(NFCSTATUS_BOARD_COMMUNICATION_ERROR
+ == PHNFCSTATUS(error_status))
+ {
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_ERROR, &comp_info);
+ }
+ else
+ {
+ psHciContext->error_status = error_status;
+ status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
+ if (NFCSTATUS_PENDING != status)
+ {
+ psHciContext->error_status = NFCSTATUS_SUCCESS;
+ }
+ }
+ }
+ return;
+}
+
+
+
+NFCSTATUS
+phHciNfc_Resume_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+ HCI_DEBUG("HCI: In Function: %s \n",
+ __FUNCTION__);
+
+ HCI_DEBUG(" HCI: Current HCI State --> %02u \n",
+ psHciContext->hci_state.cur_state );
+ HCI_DEBUG(" HCI: Next HCI State --> %02u \n",
+ psHciContext->hci_state.next_state );
+
+ switch(psHciContext->hci_state.next_state)
+ {
+ /* Process the Admin Gate Response based on the HCI State */
+ case hciState_Initialise:
+ {
+ switch (psHciContext->hci_state.cur_state)
+ {
+ /* Initialise State after Power on */
+ case hciState_Reset:
+ {
+ status = phHciNfc_Initialise_Sequence(psHciContext ,pHwRef);
+ break;
+ }
+ /* Initialise State after Power on */
+ case hciState_Config:
+ {
+ status = phHciNfc_Config_Sequence(psHciContext ,pHwRef);
+ break;
+ }
+ /* Discovery Resume after connect failure */
+ case hciState_Initialise:
+ case hciState_Select:
+ case hciState_Connect:
+ {
+ phNfc_sCompletionInfo_t comp_info;
+
+ /* Update to the Intialise state as the discovery wheel is
+ * restarted.
+ */
+ status = phHciNfc_FSM_Complete(psHciContext);
+
+ psHciContext->host_rf_type = phHal_eUnknown_DevType;
+ psHciContext->p_target_info = NULL;
+ psHciContext->p_xchg_info = NULL;
+
+ /* Initialisation Complete Notification to the Upper Layer */
+ comp_info.status = status;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_POLL_RESTARTED , &comp_info);
+ HCI_PRINT(" HCI Remote Target Still Present in the Field. \n");
+ break;
+ }
+ default:
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
+ break;
+ }
+ }
+ break;
+ }
+ case hciState_Release:
+ {
+ status = phHciNfc_Release_Sequence(psHciContext ,pHwRef);
+ break;
+ }
+ case hciState_Config:
+ {
+ status = phHciNfc_Config_Sequence(psHciContext ,pHwRef);
+ break;
+ }
+ case hciState_Listen:
+ case hciState_Select:
+ {
+ status = phHciNfc_Info_Sequence( psHciContext, pHwRef );
+ break;
+ }
+ case hciState_Reactivate:
+ case hciState_Connect:
+ {
+ status = phHciNfc_Connect_Sequence( psHciContext, pHwRef );
+ break;
+ }
+ case hciState_Transact:
+ {
+ status = phHciNfc_Transact_Sequence(
+ psHciContext, pHwRef );
+ break;
+ }
+ case hciState_Presence:
+ {
+ phNfc_sCompletionInfo_t comp_info;
+
+ /* Roll Back to Connect State as Presence Check is Complete */
+ phHciNfc_FSM_Rollback(psHciContext);
+
+ /* Initialisation Complete Notification to the Upper Layer */
+ comp_info.status = NFCSTATUS_SUCCESS;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_TARGET_PRESENT , &comp_info);
+ HCI_PRINT(" HCI Remote Target Still Present in the Field. \n");
+ break;
+ }
+ case hciState_Disconnect:
+ {
+ status = phHciNfc_Disconnect_Sequence( psHciContext, pHwRef );
+ break;
+ }
+ case hciState_Test:
+ {
+ status = phHciNfc_Test_Sequence( psHciContext, pHwRef , status, NULL, 0 );
+ break;
+ }
+ case hciState_IO:
+ {
+ status = phHciNfc_IO_Sequence( psHciContext, pHwRef , status, NULL, 0 );
+ break;
+ }
+ case hciState_Unknown:
+ {
+ break;
+ }
+ default:
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_STATE);
+ break;
+ }
+ } /* End of the Processing of HCI State*/
+
+ return status;
+}
+
+
+NFCSTATUS
+phHciNfc_Initialise_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ static uint8_t config = 0;
+
+ PHNFC_UNUSED_VARIABLE(config);
+
+ switch(psHciContext->hci_seq)
+ {
+ case ADMIN_INIT_SEQ:
+ {
+ status = phHciNfc_Admin_Initialise( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+#ifdef ESTABLISH_SESSION
+ if( hciMode_Session == psHciContext->hci_mode)
+ {
+ /* TODO: Initialise Link Management
+ Gate Resources */
+ NFCSTATUS info_status = NFCSTATUS_SUCCESS;
+ PHNFC_UNUSED_VARIABLE(info_status);
+ info_status = phHciNfc_IDMgmt_Update_Sequence(
+ psHciContext, INFO_SEQ );
+
+ if(NFCSTATUS_SUCCESS == info_status)
+ {
+ psHciContext->hci_seq = PL_STOP_SEQ;
+ }
+ else
+ {
+ psHciContext->hci_seq = HCI_END_SEQ;
+ status = PHNFCSTVAL(CID_NFC_HCI,
+ NFCSTATUS_INVALID_HCI_SEQUENCE);
+ }
+ }
+ else
+#endif
+ {
+ psHciContext->hci_seq = LINK_MGMT_INIT_SEQ;
+ }
+ }
+ break;
+ }
+ case LINK_MGMT_INIT_SEQ:
+ {
+ status = phHciNfc_LinkMgmt_Initialise( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = IDENTITY_INIT_SEQ;
+ }
+ break;
+ }
+ case IDENTITY_INIT_SEQ:
+ {
+ status = phHciNfc_IDMgmt_Initialise( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = DEV_INIT_SEQ;
+ }
+ break;
+ }
+ case DEV_INIT_SEQ:
+ {
+ status = phHciNfc_DevMgmt_Initialise( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ if (HCI_SELF_TEST != psHciContext->init_mode)
+ {
+ psHciContext->hci_seq = PL_INIT_SEQ;
+ }
+ else
+ {
+#ifdef ESTABLISH_SESSION
+ NFCSTATUS info_status = NFCSTATUS_SUCCESS;
+ PHNFC_UNUSED_VARIABLE(info_status);
+ info_status = phHciNfc_IDMgmt_Update_Sequence(
+ psHciContext, INFO_SEQ );
+
+ if(NFCSTATUS_SUCCESS == info_status)
+ {
+ psHciContext->hci_seq = IDENTITY_INFO_SEQ;
+ }
+ else
+ {
+ psHciContext->hci_seq = HCI_END_SEQ;
+ status = PHNFCSTVAL(CID_NFC_HCI,
+ NFCSTATUS_INVALID_HCI_SEQUENCE);
+ }
+#else
+ psHciContext->hci_seq = HCI_END_SEQ;
+
+#endif
+ }
+
+ }
+ break;
+ }
+ case PL_INIT_SEQ:
+ {
+ status = phHciNfc_PollLoop_Initialise( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ NFCSTATUS reset_status = NFCSTATUS_SUCCESS;
+ PHNFC_UNUSED_VARIABLE(reset_status);
+ reset_status = phHciNfc_ReaderMgmt_Update_Sequence(
+ psHciContext, RESET_SEQ );
+ psHciContext->hci_seq = READER_MGMT_INIT_SEQ;
+ }
+ break;
+ }
+ case READER_MGMT_INIT_SEQ:
+ {
+ status = phHciNfc_ReaderMgmt_Initialise( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ NFCSTATUS reset_status = NFCSTATUS_SUCCESS;
+ PHNFC_UNUSED_VARIABLE(reset_status);
+ reset_status = phHciNfc_EmuMgmt_Update_Seq(
+ psHciContext, RESET_SEQ );
+ psHciContext->hci_seq = EMULATION_INIT_SEQ;
+ }
+ break;
+ }
+ case EMULATION_INIT_SEQ:
+ {
+ status = phHciNfc_EmuMgmt_Initialise( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+#ifdef ESTABLISH_SESSION
+ psHciContext->hci_seq = ADMIN_SESSION_SEQ;
+#else
+ psHciContext->hci_seq = HCI_END_SEQ;
+#endif
+ }
+ break;
+ }
+#ifdef ESTABLISH_SESSION
+ case ADMIN_SESSION_SEQ:
+ {
+ status = phHciNfc_Admin_Initialise( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = IDENTITY_INFO_SEQ;
+ }
+ break;
+ }
+ case PL_STOP_SEQ:
+ {
+ status = phHciNfc_ReaderMgmt_Disable_Discovery(
+ psHciContext, pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+#ifdef SW_AUTO_ACTIVATION
+ psHciContext->hci_seq = READER_SW_AUTO_SEQ;
+#else
+ psHciContext->hci_seq = IDENTITY_INFO_SEQ;
+#endif
+ }
+ break;
+ }
+#ifdef SW_AUTO_ACTIVATION
+ case READER_SW_AUTO_SEQ:
+ {
+ uint8_t activate_enable = FALSE;
+ uint8_t rdr_enable = TRUE;
+
+ status = phHciNfc_ReaderA_Update_Info(
+ psHciContext, HCI_READER_A_ENABLE,
+ &rdr_enable);
+ if(status == NFCSTATUS_SUCCESS)
+ {
+ status = phHciNfc_ReaderA_Auto_Activate( psHciContext,
+ pHwRef, activate_enable );
+ if(status == NFCSTATUS_SUCCESS)
+ {
+ psHciContext->hci_seq = IDENTITY_INFO_SEQ;
+ }
+ }
+ break;
+ }
+#endif
+ /* fall through */
+ case IDENTITY_INFO_SEQ:
+ {
+ status = phHciNfc_IDMgmt_Info_Sequence( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ if ((HCI_SELF_TEST != psHciContext->init_mode)
+ /* && ( TRUE == ((phHal_sHwReference_t *)pHwRef)->se_detect ) */
+ && (HCI_CUSTOM_INIT != psHciContext->init_mode))
+ {
+ NFCSTATUS info_status = NFCSTATUS_SUCCESS;
+ PHNFC_UNUSED_VARIABLE(info_status);
+ info_status = phHciNfc_EmuMgmt_Update_Seq(
+ psHciContext, INFO_SEQ );
+
+ if(NFCSTATUS_SUCCESS == info_status)
+ {
+ psHciContext->hci_seq = EMULATION_SWP_SEQ;
+ }
+ }
+ else
+ {
+ psHciContext->hci_seq = HCI_END_SEQ;
+ }
+ }
+ break;
+ }
+ case EMULATION_SWP_SEQ:
+ {
+ status = phHciNfc_EmuMgmt_Initialise( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = HCI_END_SEQ;
+ }
+ break;
+ }
+#endif
+ case HCI_END_SEQ:
+ {
+ if (HCI_SELF_TEST == psHciContext->init_mode )
+ {
+ psHciContext->hci_state.next_state
+ = (uint8_t) hciState_Test;
+ }
+ status = phHciNfc_FSM_Complete ( psHciContext );
+#ifdef UICC_CONNECTIVITY_PATCH
+ phHciNfc_Uicc_Connectivity( psHciContext, pHwRef );
+#endif /* #ifdef UICC_CONNECTIVITY_PATCH */
+
+ /* Initialisation Complete Notification to the Upper Layer */
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ phNfc_sCompletionInfo_t comp_info;
+
+ comp_info.status = status;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_INIT_COMPLETED, &comp_info);
+ HCI_PRINT("HCI Initialisation Completed \n");
+ }
+ else
+ {
+ pphNfcIF_Notification_CB_t p_upper_notify = psHciContext->p_upper_notify;
+ void *pcontext = psHciContext->p_upper_context;
+ phNfc_sCompletionInfo_t comp_info;
+
+
+ phHciNfc_Release_Lower( psHciContext, pHwRef );
+ phHciNfc_Release_Resources( &psHciContext );
+ /* Notify the Failure to the Upper Layer */
+ comp_info.status = status;
+ phHciNfc_Notify( p_upper_notify, pcontext, pHwRef,
+ NFC_NOTIFY_INIT_FAILED, &comp_info);
+ HCI_PRINT("HCI FSM Initialisation Error \n");
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ return status;
+}
+
+
+NFCSTATUS
+phHciNfc_Release_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+ switch(psHciContext->hci_seq)
+ {
+ case PL_STOP_SEQ:
+ {
+ status = phHciNfc_ReaderMgmt_Disable_Discovery(
+ psHciContext, pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ (void)phHciNfc_EmuMgmt_Update_Seq(
+ psHciContext, REL_SEQ );
+ psHciContext->hci_seq = EMULATION_REL_SEQ;
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ case EMULATION_REL_SEQ:
+ {
+ status = phHciNfc_EmuMgmt_Release( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ (void)phHciNfc_DevMgmt_Update_Sequence(
+ psHciContext, REL_SEQ );
+ psHciContext->hci_seq = ADMIN_REL_SEQ;
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ case DEV_REL_SEQ:
+ {
+ status = phHciNfc_DevMgmt_Release( psHciContext, pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = HCI_END_SEQ;
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ case READER_MGMT_REL_SEQ:
+ {
+ status = phHciNfc_ReaderMgmt_Release( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = PL_REL_SEQ;
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ case PL_REL_SEQ:
+ {
+ status = phHciNfc_PollLoop_Release( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = IDENTITY_REL_SEQ;
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ case IDENTITY_REL_SEQ:
+ {
+ status = phHciNfc_IDMgmt_Release( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = LINK_MGMT_REL_SEQ;
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ case LINK_MGMT_REL_SEQ:
+ {
+ status = phHciNfc_LinkMgmt_Release( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = ADMIN_REL_SEQ;
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ case ADMIN_REL_SEQ:
+ {
+ /* Admin Management Release Sequence */
+ status = phHciNfc_Admin_Release( psHciContext,pHwRef, phHciNfc_TerminalHostID );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = DEV_REL_SEQ;
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ case HCI_END_SEQ:
+ {
+ pphNfcIF_Notification_CB_t p_upper_notify =
+ psHciContext->p_upper_notify;
+ phNfc_sLowerIF_t *plower_if =
+ &(psHciContext->lower_interface);
+ void *pcontext =
+ psHciContext->p_upper_context;
+ phNfc_sCompletionInfo_t comp_info;
+
+
+ status = plower_if->release((void *)plower_if->pcontext,
+ (void *)pHwRef);
+
+ phHciNfc_Release_Resources( &psHciContext );
+ /* De-Initialisation Complete Notification to the Upper Layer */
+ comp_info.status = status;
+ phHciNfc_Notify(p_upper_notify, pcontext, pHwRef,
+ NFC_NOTIFY_DEINIT_COMPLETED, &comp_info);
+
+ HCI_PRINT("HCI Release Completed \n");
+ break;
+ }
+ default:
+ {
+ /* psHciContext->hci_seq = HCI_END_SEQ; */
+ break;
+ }
+ }
+
+ return status;
+}
+
+
+static
+NFCSTATUS
+phHciNfc_Config_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ phNfc_sCompletionInfo_t comp_info;
+
+ switch(psHciContext->config_type)
+ {
+ case POLL_LOOP_CFG:
+ {
+ status = phHciNfc_PollLoop_Sequence( psHciContext, pHwRef );
+ break;
+ }
+ case SMX_WI_MODE:
+ {
+ status = phHciNfc_SmartMx_Mode_Sequence( psHciContext, pHwRef );
+ break;
+ }
+#ifdef ENABLE_P2P
+ case NFC_GENERAL_CFG:
+ {
+ if(TARGET_GENERAL_SEQ == psHciContext->hci_seq)
+ {
+ status = phHciNfc_NfcIP_SetATRInfo( psHciContext,
+ pHwRef, NFCIP_TARGET,
+ psHciContext->p_config_params);
+ if( NFCSTATUS_PENDING != status )
+ {
+ /* Roll Back the State Machine to its Original State */
+ phHciNfc_FSM_Rollback ( psHciContext );
+ }
+ else
+ {
+ psHciContext->hci_seq = HCI_END_SEQ;
+ }
+ }
+ else
+ {
+ status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
+ if (NFCSTATUS_PENDING != status)
+ {
+ /* Roll Back to its Current State as Configuration is Complete */
+ phHciNfc_FSM_Rollback(psHciContext);
+
+ HCI_PRINT(" NFC-IP(P2P) Configuration Completed. \n");
+ comp_info.status = status;
+ psHciContext->error_status = NFCSTATUS_SUCCESS;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_CONFIG_SUCCESS , &comp_info);
+ }
+ }
+ break;
+ }
+#endif
+ case SWP_PROTECT_CFG:
+ case SWP_EVT_CFG:
+ case SMX_WI_CFG:
+ {
+ /* Roll Back to its Current State as Configuration is Complete */
+ phHciNfc_FSM_Rollback(psHciContext);
+
+ HCI_DEBUG(" %s Configuration Completed. \n",
+ ((SMX_WI_CFG == psHciContext->config_type)?
+ "SmartMX" : "SWP Event/Protection"));
+
+ comp_info.status = status;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_CONFIG_SUCCESS, &comp_info);
+ break;
+ }
+ case NFC_TARGET_CFG:
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
+ break;
+ }
+ case UICC_SWP_CFG:
+#if 0
+ {
+ phHal_sEmulationCfg_t *p_emulation_cfg =
+ (phHal_sEmulationCfg_t * )
+ psHciContext->p_config_params;
+ if (NULL != p_emulation_cfg)
+ {
+ phHal_sUiccEmuCfg_t *uicc_config =
+ &p_emulation_cfg->config.uiccEmuCfg;
+ if( TRUE == uicc_config->enableUicc )
+ {
+ status = phHciNfc_Uicc_Connect_Status(psHciContext,pHwRef);
+ if( NFCSTATUS_PENDING == status )
+ {
+ break;
+ } /* Or Else Fall through to notify the above layer */
+ }
+ }
+ }
+#endif
+ /* fall through */
+ case NFC_CE_A_CFG:
+ case NFC_CE_B_CFG:
+ {
+ status = phHciNfc_EmulationCfg_Sequence( psHciContext, pHwRef );
+ break;
+ }
+ default:
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
+ break;
+ }
+ }
+
+ return status;
+}
+
+
+NFCSTATUS
+phHciNfc_PollLoop_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ phHal_sADD_Cfg_t *p_poll_config = (phHal_sADD_Cfg_t * )
+ psHciContext->p_config_params;
+ if (NULL != p_poll_config)
+ {
+ uint8_t speed =
+ p_poll_config->NfcIP_Mode;
+ switch(psHciContext->hci_seq)
+ {
+ case PL_DURATION_SEQ:
+ {
+ status = phHciNfc_PollLoop_Cfg( psHciContext, pHwRef,
+ (uint8_t)PL_DURATION , NULL);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+#if defined (ENABLE_P2P) && defined (TARGET_SPEED)
+ psHciContext->hci_seq = TARGET_SPEED_SEQ;
+#elif defined (ENABLE_P2P) && defined (INITIATOR_SPEED)
+ psHciContext->hci_seq = INITIATOR_SPEED_SEQ;
+#elif defined (ENABLE_P2P) && defined (NFCIP_TGT_DISABLE_CFG)
+ psHciContext->hci_seq = PL_TGT_DISABLE_SEQ;
+#else
+ psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ;
+#endif
+
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+#if defined (ENABLE_P2P) && defined (TARGET_SPEED)
+ case TARGET_SPEED_SEQ:
+ {
+#define NFCIP_ACTIVE_SHIFT 0x03U
+#define NFCIP_PASSIVE_MASK 0x07U
+ uint8_t mode = ( NXP_NFCIP_ACTIVE_DEFAULT << NFCIP_ACTIVE_SHIFT ) |
+ ( DEFAULT_NFCIP_MODE_SUPPORT & NFCIP_PASSIVE_MASK );
+ status =
+ phHciNfc_NfcIP_SetMode( psHciContext, pHwRef, NFCIP_TARGET,
+ (uint8_t) mode );
+ if(NFCSTATUS_PENDING == status)
+ {
+#if defined (INITIATOR_SPEED)
+ psHciContext->hci_seq = INITIATOR_SPEED_SEQ;
+#elif defined (NFCIP_TGT_DISABLE_CFG)
+ psHciContext->hci_seq = PL_TGT_DISABLE_SEQ;
+#else
+ psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ;
+#endif
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+#endif
+#if defined (ENABLE_P2P) && defined (INITIATOR_SPEED)
+ case INITIATOR_SPEED_SEQ:
+ {
+ status =
+ phHciNfc_NfcIP_SetMode( psHciContext, pHwRef, NFCIP_INITIATOR,
+ (uint8_t) (speed & DEFAULT_NFCIP_MODE_SUPPORT));
+ if(NFCSTATUS_PENDING == status)
+ {
+#if defined (NFCIP_TGT_DISABLE_CFG)
+ psHciContext->hci_seq = PL_TGT_DISABLE_SEQ;
+#else
+ psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ;
+#endif
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+#endif
+#if defined (ENABLE_P2P) && defined (NFCIP_TGT_DISABLE_CFG)
+ case PL_TGT_DISABLE_SEQ:
+ {
+ /* Configure the Polling Loop Target Disable Parameter */
+ status = phHciNfc_PollLoop_Cfg( psHciContext, pHwRef,
+ (uint8_t)PL_DISABLE_TARGET, &p_poll_config->NfcIP_Tgt_Disable );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ;
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+#endif
+ case PL_CONFIG_PHASE_SEQ:
+ {
+ phHal_sPollDevInfo_t *p_poll_info =
+ &(p_poll_config->PollDevInfo.PollCfgInfo);
+
+ p_poll_info->EnableIso14443A =
+ ( (p_poll_info->EnableIso14443A)
+ || ( speed & (uint8_t)phHal_ePassive106 )
+ );
+ p_poll_info->EnableFelica212 =
+ ( (p_poll_info->EnableFelica212)
+ || ( speed & (uint8_t)phHal_ePassive212 )
+ );
+ p_poll_info->EnableFelica424 =
+ ( (p_poll_info->EnableFelica424)
+ || ( speed & (uint8_t)phHal_ePassive424 )
+ );
+ /* Configure the Polling Loop Gate Parameters */
+ status = phHciNfc_PollLoop_Cfg( psHciContext, pHwRef,
+ (uint8_t)PL_RD_PHASES, NULL );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ if(((~(PL_RD_PHASES_DISABLE)) &
+ p_poll_config->PollDevInfo.PollEnabled)!= 0)
+ {
+ psHciContext->hci_seq = READER_ENABLE_SEQ;
+ }
+ else
+ {
+ /* psHciContext->hci_seq = READER_DISABLE_SEQ; */
+ psHciContext->hci_seq = HCI_END_SEQ;
+ }
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ case READER_ENABLE_SEQ:
+ {
+ status =
+ phHciNfc_ReaderMgmt_Enable_Discovery(
+ psHciContext, pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ /* psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ; */
+ psHciContext->hci_seq = HCI_END_SEQ;
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ case READER_DISABLE_SEQ:
+ {
+ status = phHciNfc_ReaderMgmt_Disable_Discovery(
+ psHciContext, pHwRef );
+
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ if((~(PL_RD_PHASES_DISABLE) &
+ p_poll_config->PollDevInfo.PollEnabled)!= 0)
+ {
+ psHciContext->hci_seq = PL_DURATION_SEQ;
+ }
+ else
+ {
+#if defined (ENABLE_P2P) && defined (INITIATOR_SPEED)
+ psHciContext->hci_seq = INITIATOR_SPEED_SEQ;
+#elif defined (ENABLE_P2P) && defined (NFCIP_TGT_DISABLE_CFG)
+ psHciContext->hci_seq = PL_TGT_DISABLE_SEQ;
+#else
+ psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ;
+#endif
+ /* psHciContext->hci_seq = HCI_END_SEQ; */
+ }
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ case HCI_END_SEQ:
+ {
+ phNfc_sCompletionInfo_t comp_info;
+ status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
+ if (NFCSTATUS_PENDING != status)
+ {
+ /* status = phHciNfc_FSM_Complete ( psHciContext );*/
+ phHciNfc_FSM_Rollback ( psHciContext );
+ /* Poll Configuration Notification to the Upper Layer */
+ if((~(PL_RD_PHASES_DISABLE) &
+ p_poll_config->PollDevInfo.PollEnabled)!= 0)
+ {
+ comp_info.status = status;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_POLL_ENABLED, &comp_info);
+ }
+ else
+ {
+ comp_info.status = status;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_POLL_DISABLED, &comp_info);
+ }
+ HCI_PRINT("HCI Discovery Configuration Completed \n");
+ }
+ break;
+ }
+ default:
+ {
+ /* psHciContext->hci_seq = HCI_END_SEQ; */
+ break;
+ }
+ }/* End of the Poll Sequence Switch */
+ }/* End of the Poll Config info Check */
+
+ return status;
+}
+
+
+NFCSTATUS
+phHciNfc_EmulationCfg_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ static phNfc_sCompletionInfo_t comp_info;
+#if defined(HOST_EMULATION)
+ phHciNfc_GateID_t ce_gate = phHciNfc_UnknownGate;
+#endif /* #ifdef HOST_EMULATION */
+ phHal_sEmulationCfg_t *p_emulation_cfg = (phHal_sEmulationCfg_t * )
+ psHciContext->p_config_params;
+#ifdef UICC_SESSION_RESET
+ uint8_t uicc_clear_pipes = FALSE;
+#endif
+
+
+ if (NULL != p_emulation_cfg)
+ {
+#if defined(HOST_EMULATION)
+ if(NFC_HOST_CE_A_EMULATION == p_emulation_cfg->emuType)
+ {
+ psHciContext->config_type = NFC_CE_A_CFG;
+ if (NULL == psHciContext->p_ce_a_info)
+ {
+ ce_gate = phHciNfc_CETypeAGate;
+ }
+ }
+ else if (NFC_HOST_CE_B_EMULATION == p_emulation_cfg->emuType)
+ {
+ psHciContext->config_type = NFC_CE_B_CFG;
+ if (NULL == psHciContext->p_ce_b_info)
+ {
+ ce_gate = phHciNfc_CETypeBGate;
+ }
+ }
+#ifdef UICC_SESSION_RESET
+ else if ((NFC_UICC_EMULATION == p_emulation_cfg->emuType)
+ &&(FALSE == p_emulation_cfg->config.uiccEmuCfg.enableUicc)
+ )
+ {
+ uicc_clear_pipes = TRUE;
+ }
+#endif
+ else
+ {
+ ;
+ }
+#endif /* #ifdef HOST_EMULATION */
+
+ switch(psHciContext->hci_seq)
+ {
+#if defined(HOST_EMULATION)
+ case ADMIN_CE_SEQ:
+ {
+ if(phHciNfc_UnknownGate != ce_gate)
+ {
+ status = phHciNfc_Admin_CE_Init(psHciContext, pHwRef, ce_gate);
+ }
+ else
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_NOT_ALLOWED);
+ }
+
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = EMULATION_CONFIG_SEQ;
+ /* psHciContext->hci_seq = HCI_END_SEQ; */
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+#endif
+ case EMULATION_CONFIG_SEQ:
+ {
+ status = phHciNfc_Emulation_Cfg(psHciContext, pHwRef,
+ psHciContext->config_type);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ /* psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ; */
+#ifdef UICC_SESSION_RESET
+ if(UICC_SWP_CFG == psHciContext->config_type)
+ {
+ psHciContext->hci_seq = ADMIN_REL_SEQ;
+ }
+ else
+#endif /* UICC_SESSION_RESET */
+ {
+ psHciContext->hci_seq = HCI_END_SEQ;
+ }
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+#ifdef UICC_SESSION_RESET
+ case ADMIN_REL_SEQ:
+ {
+ if (TRUE == uicc_clear_pipes)
+ {
+ /* Admin Management UICC Release Sequence */
+ status = phHciNfc_Admin_Release( psHciContext,pHwRef, phHciNfc_UICCHostID );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = HCI_END_SEQ;
+ if (UICC_SWP_CFG == psHciContext->config_type)
+ {
+ (void)phHciNfc_SWP_Update_Sequence(psHciContext,
+ CONFIG_SEQ );
+ }
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ }
+#endif /* UICC_SESSION_RESET */
+ /* fall through */
+ case HCI_END_SEQ:
+ {
+ phHciNfc_FSM_Rollback(psHciContext);
+
+ HCI_PRINT(" Emulation Configuration Completed. \n");
+
+ comp_info.status = status;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_CONFIG_SUCCESS, &comp_info);
+ break;
+ }
+ default:
+ {
+ /* psHciContext->hci_seq = HCI_END_SEQ; */
+ break;
+ }
+ }
+ /*
+ NFC_CE_A_CFG;
+ NFC_CE_B_CFG; */
+
+ }/* End of the Emulation Config info Check */
+
+ return status;
+}
+
+
+NFCSTATUS
+phHciNfc_SmartMx_Mode_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ phHal_sADD_Cfg_t *p_poll_config = (phHal_sADD_Cfg_t * )
+ psHciContext->p_config_params;
+ phNfc_sCompletionInfo_t comp_info;
+
+ if (NULL != p_poll_config)
+ {
+ switch(psHciContext->hci_seq)
+ {
+ case READER_DISABLE_SEQ:
+ {
+ status = phHciNfc_ReaderMgmt_Disable_Discovery(
+ psHciContext, pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = EMULATION_CONFIG_SEQ;
+ /* psHciContext->hci_seq = HCI_END_SEQ; */
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ case EMULATION_CONFIG_SEQ:
+ {
+ status = phHciNfc_WI_Configure_Mode(
+ psHciContext, pHwRef,psHciContext->smx_mode );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ;
+ /* psHciContext->hci_seq = HCI_END_SEQ; */
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ case PL_CONFIG_PHASE_SEQ:
+ {
+ /* Configure the Polling Loop Gate Parameters */
+ status = phHciNfc_PollLoop_Cfg( psHciContext, pHwRef,
+ (uint8_t)PL_RD_PHASES, NULL );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = READER_ENABLE_SEQ;
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ case READER_ENABLE_SEQ:
+ {
+ status =
+ phHciNfc_ReaderMgmt_Enable_Discovery(
+ psHciContext, pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ /* psHciContext->hci_seq = PL_CONFIG_PHASE_SEQ; */
+ psHciContext->hci_seq = HCI_END_SEQ;
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ case HCI_END_SEQ:
+ {
+ status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
+ if (NFCSTATUS_PENDING != status)
+ {
+ /* status = phHciNfc_FSM_Complete ( psHciContext );*/
+ phHciNfc_FSM_Rollback ( psHciContext );
+ if( hciState_Disconnect == psHciContext->hci_state.cur_state)
+ {
+ psHciContext->host_rf_type = phHal_eUnknown_DevType;
+ psHciContext->p_target_info = NULL;
+ psHciContext->p_xchg_info = NULL;
+ }
+ /* Poll Configuration Notification to the Upper Layer */
+ if((~(PL_RD_PHASES_DISABLE) &
+ p_poll_config->PollDevInfo.PollEnabled)!= 0)
+ {
+ comp_info.status = status;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_POLL_ENABLED, &comp_info);
+ }
+ else
+ {
+ comp_info.status = status;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_POLL_DISABLED, &comp_info);
+ }
+ HCI_PRINT("HCI Discovery Configuration Completed \n");
+ }
+ break;
+ }
+ default:
+ {
+ /* psHciContext->hci_seq = HCI_END_SEQ; */
+ break;
+ }
+ }/* End of the Poll Sequence Switch */
+ }/* End of the Poll Config info Check */
+
+ return status;
+}
+
+
+NFCSTATUS
+phHciNfc_Connect_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ static phNfc_sCompletionInfo_t comp_info;
+ phHal_eRemDevType_t target_type = phHal_eUnknown_DevType;
+
+ if( NULL != psHciContext->p_target_info )
+ {
+
+ target_type = psHciContext->p_target_info->RemDevType;
+ switch(psHciContext->hci_seq)
+ {
+ case READER_REACTIVATE_SEQ:
+ {
+ /* Complete the Reactivate Sequence and notify the HAL */
+ status = phHciNfc_FSM_Complete ( psHciContext );
+ /* Reactivate Complete Notification to the Upper Layer */
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ comp_info.status = status;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_TARGET_REACTIVATED , &comp_info);
+ HCI_PRINT(" HCI Remote Target Reactivated. \n");
+ }
+ else
+ {
+ comp_info.status = status;
+ phHciNfc_FSM_Rollback ( psHciContext );
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_ERROR , &comp_info);
+ HCI_PRINT("HCI FSM Invalid Selection State \n");
+ HCI_PRINT("HCI Remote Target Reactivation Failed \n");
+ }
+ break;
+ }
+ case READER_SELECT_SEQ:
+ {
+ /* If the Target is Mifare then it should fall through */
+ if(( phHal_eMifare_PICC != target_type )
+ &&(phHal_eISO14443_3A_PICC != target_type)
+#ifdef TYPE_B
+ && ( phHal_eISO14443_B_PICC != target_type )
+ && ( phHal_eISO14443_4B_PICC != target_type )
+#endif
+#ifdef TYPE_FELICA
+ && ( phHal_eFelica_PICC != target_type )
+#endif
+#ifdef TYPE_JEWEL
+ && ( phHal_eJewel_PICC != target_type )
+#endif /* #ifdef TYPE_JEWEL */
+#ifdef TYPE_ISO15693
+ && ( phHal_eISO15693_PICC != target_type )
+#endif /* #ifdef TYPE_ISO15693 */
+
+ )
+ {
+ status = phHciNfc_ReaderMgmt_Info_Sequence( psHciContext, pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ psHciContext->hci_seq = HCI_END_SEQ;
+ status = NFCSTATUS_PENDING;
+ }
+ break;
+ }
+ }
+ /* fall through */
+ case HCI_END_SEQ:
+ {
+ /* Complete the Connect Sequence and notify the HAL */
+ status = phHciNfc_FSM_Complete ( psHciContext );
+ /* Connection Complete Notification to the Upper Layer */
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ /* Invalidate the previously polled RF Reader Type */
+ /* psHciContext->host_rf_type = phHal_eInvalidRFType;*/
+ comp_info.status = status;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_TARGET_CONNECTED , &comp_info);
+ HCI_PRINT(" HCI Remote Target Selected for Transaction. \n");
+ }
+ else
+ {
+ comp_info.status = status;
+ /* phHciNfc_FSM_Rollback ( psHciContext ); */
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_ERROR , &comp_info);
+ HCI_PRINT("HCI FSM Invalid Selection State \n");
+ HCI_PRINT("HCI Remote Target Selection Failed \n");
+ }
+ break;
+ }
+ default:
+ {
+ HCI_PRINT("\t Invalid HCI Connect Sequence \n");
+ /* psHciContext->hci_seq = HCI_END_SEQ; */
+ break;
+ }
+ }/* End of the Connect Sequence Switch */
+ }
+
+ return status;
+}
+
+
+NFCSTATUS
+phHciNfc_Disconnect_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ static phNfc_sCompletionInfo_t comp_info;
+ phHal_eRemDevType_t target_type = phHal_eUnknown_DevType;
+ uint8_t re_poll = 0;
+
+ if( NULL != psHciContext->p_target_info )
+ {
+
+ target_type = psHciContext->p_target_info->RemDevType;
+ switch(psHciContext->hci_seq)
+ {
+ case READER_UICC_DISPATCH_SEQ:
+ {
+ status = phHciNfc_ReaderMgmt_UICC_Dispatch(
+ psHciContext, pHwRef, target_type );
+ psHciContext->hci_seq = READER_DESELECT_SEQ;
+ if(NFCSTATUS_PENDING == status)
+ {
+ break;
+ }
+ }
+ /* fall through */
+ case READER_DESELECT_SEQ:
+ {
+ re_poll = (uint8_t) ( NULL != psHciContext->p_config_params )?
+ *((uint8_t *)psHciContext->p_config_params):FALSE;
+ status = phHciNfc_ReaderMgmt_Deselect(
+ psHciContext, pHwRef, target_type, re_poll);
+ if(NFCSTATUS_PENDING == status)
+ {
+ psHciContext->hci_seq = HCI_END_SEQ;
+ psHciContext->p_config_params = NULL;
+ }
+ break;
+ }
+ case HCI_END_SEQ:
+ {
+ /* Complete the Disconnect Sequence and notify the HAL */
+ status = phHciNfc_FSM_Complete ( psHciContext );
+ /* Disconnect Notification to the Upper Layer */
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ /* Invalidate the previously polled RF Reader Type */
+ psHciContext->host_rf_type = phHal_eUnknown_DevType;
+ psHciContext->p_target_info = NULL;
+ psHciContext->p_xchg_info = NULL;
+ comp_info.status = status;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_TARGET_DISCONNECTED , &comp_info);
+ HCI_PRINT(" HCI Remote Target De-Selected. \n");
+ }
+ else
+ {
+ comp_info.status = status;
+ /* phHciNfc_FSM_Rollback ( psHciContext ); */
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_ERROR , &comp_info);
+ HCI_PRINT("HCI FSM Invalid De-Selection State \n");
+ HCI_PRINT("HCI Remote Target De-Selection Failed \n");
+ }
+
+ break;
+ }
+ default:
+ {
+ HCI_PRINT("\t Invalid HCI Connect Sequence \n");
+ /* psHciContext->hci_seq = HCI_END_SEQ; */
+ break;
+ }
+ }/* End of the Connect Sequence Switch */
+ }
+
+ return status;
+}
+
+
+static
+NFCSTATUS
+phHciNfc_Transact_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ )
+{
+ static phNfc_sTransactionInfo_t transact_info;
+
+ pphNfcIF_Notification_CB_t p_upper_notify = psHciContext->p_upper_notify;
+ void *pcontext = psHciContext->p_upper_context;
+ uint8_t transact_result = NFC_NOTIFY_ERROR;
+
+ /* Roll Back to Connect State as Transceive is Complete */
+ phHciNfc_FSM_Rollback(psHciContext);
+
+ switch (psHciContext->host_rf_type)
+ {
+ case phHal_eISO14443_A_PCD:
+#ifdef TYPE_B
+ case phHal_eISO14443_B_PCD:
+#endif
+ case phHal_eISO14443_BPrime_PCD:
+#ifdef TYPE_FELICA
+ case phHal_eFelica_PCD:
+#endif
+#ifdef TYPE_ISO15693
+ case phHal_eISO15693_PCD:
+#endif
+ {
+ if(ZERO != psHciContext->rx_index)
+ {
+ transact_info.status = NFCSTATUS_SUCCESS;
+ transact_info.buffer =
+ &psHciContext->recv_buffer[psHciContext->rx_index];
+ transact_info.length =
+ psHciContext->rx_total - psHciContext->rx_index;
+ transact_result = NFC_NOTIFY_TRANSCEIVE_COMPLETED;
+ }
+ else
+ {
+ transact_info.status = NFCSTATUS_FAILED;
+ transact_result = NFC_NOTIFY_TRANSCEIVE_ERROR;
+ }
+ HCI_PRINT(" HCI Transceive operation Completed. \n");
+ psHciContext->p_xchg_info = NULL ;
+ break;
+ }
+#ifdef TYPE_JEWEL
+ /* fall through */
+ case phHal_eJewel_PCD:
+#endif
+ {
+ transact_info.status = NFCSTATUS_SUCCESS;
+ transact_info.buffer =
+ &psHciContext->recv_buffer[psHciContext->rx_index];
+ transact_info.length =
+ psHciContext->rx_total - psHciContext->rx_index;
+ transact_result = NFC_NOTIFY_TRANSCEIVE_COMPLETED;
+ HCI_PRINT(" HCI Transceive operation Completed. \n");
+ psHciContext->p_xchg_info = NULL ;
+ break;
+ }
+#if defined(ENABLE_P2P)
+ case phHal_eNfcIP1_Initiator:
+ case phHal_eNfcIP1_Target:
+#endif
+ {
+ HCI_PRINT(" HCI Send operation Completed. \n");
+ transact_info.status = NFCSTATUS_SUCCESS;
+ transact_result = NFC_NOTIFY_SEND_COMPLETED;
+ break;
+ }
+ case phHal_eUnknown_DevType:
+ default:
+ {
+ transact_info.status =
+ PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ break;
+ }
+
+ }
+ /* Notify the Transceive Completion to the Upper layer */
+ phHciNfc_Notify( p_upper_notify, pcontext , pHwRef,
+ transact_result, &transact_info);
+
+ return (NFCSTATUS)NFCSTATUS_SUCCESS;
+}
+
+static
+NFCSTATUS
+phHciNfc_Info_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+ HCI_DEBUG(" HCI: Info Sequence Entry --> Reader Type : %02X \n",
+ psHciContext->host_rf_type);
+ switch (psHciContext->host_rf_type)
+ {
+ case phHal_eISO14443_A_PCD:
+#ifdef TYPE_B
+ case phHal_eISO14443_B_PCD:
+#endif
+ case phHal_eISO14443_BPrime_PCD:
+#ifdef TYPE_FELICA
+ case phHal_eFelica_PCD:
+#endif
+#ifdef TYPE_JEWEL
+ case phHal_eJewel_PCD:
+#endif
+#ifdef TYPE_ISO15693
+ case phHal_eISO15693_PCD:
+#endif
+ {
+ /* To update the select sequence to retrieve
+ * the target information using the reader type.
+ */
+ status = phHciNfc_ReaderMgmt_Info_Sequence( psHciContext, pHwRef );
+ break;
+ }
+#if defined(ENABLE_P2P)
+ case phHal_eNfcIP1_Initiator:
+ case phHal_eNfcIP1_Target:
+ {
+ status = phHciNfc_NfcIP_Info_Sequence( psHciContext, pHwRef );
+ break;
+ }
+#endif
+ case phHal_eUnknown_DevType:
+ default:
+ {
+ status =
+ PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ break;
+ }
+
+ }
+ return status;
+}
+
+static
+NFCSTATUS
+phHciNfc_Test_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef,
+ NFCSTATUS test_status,
+ uint8_t *pdata,
+ uint8_t length
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ static phNfc_sCompletionInfo_t comp_info;
+ static phNfc_sData_t test_result;
+
+ /* Complete the Test Sequence and notify the HAL */
+ status = phHciNfc_FSM_Complete ( psHciContext );
+ /* Test Results to the Upper Layer */
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ comp_info.status = test_status;
+ if ( (NULL != pdata) && (length >= HCP_HEADER_LEN) )
+ {
+ test_result.buffer = ( pdata + HCP_HEADER_LEN);
+ test_result.length = length - HCP_HEADER_LEN;
+ }
+ else
+ {
+ status = phHciNfc_DevMgmt_Get_Test_Result(
+ psHciContext, &test_result );
+ }
+ comp_info.info = &test_result;
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_RESULT , &comp_info);
+ HCI_PRINT(" HCI System Test Completed. \n");
+ }
+ else
+ {
+ comp_info.status = status;
+ phHciNfc_FSM_Rollback ( psHciContext );
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_NOTIFY_ERROR , &comp_info);
+ HCI_PRINT("HCI FSM Invalid Test State \n");
+ }
+
+ return status;
+}
+
+static
+NFCSTATUS
+phHciNfc_IO_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef,
+ NFCSTATUS io_status,
+ uint8_t *pdata,
+ uint8_t length
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ static phNfc_sCompletionInfo_t comp_info;
+
+ /* To remove "warning (VS 4100) : unreferenced formal parameter" */
+ PHNFC_UNUSED_VARIABLE(pdata);
+ PHNFC_UNUSED_VARIABLE(length);
+ /* Complete the Test Sequence and notify the HAL */
+ phHciNfc_FSM_Rollback ( psHciContext );
+ /* Test Results to the Upper Layer */
+ comp_info.status = io_status;
+ status = phHciNfc_Pending_Sequence(psHciContext, pHwRef );
+ if(NFCSTATUS_SUCCESS == io_status)
+ {
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_IO_SUCCESS , &comp_info);
+ HCI_PRINT(" HCI System IO Successful. \n");
+ }
+ else
+ {
+ phHciNfc_Notify(psHciContext->p_upper_notify,
+ psHciContext->p_upper_context, pHwRef,
+ NFC_IO_ERROR , &comp_info);
+ HCI_PRINT("HCI IO Error \n");
+ }
+ return status;
+}
+
+
+
+#ifdef OTHER_TAGS
+
+NFCSTATUS
+phHciNfc_Activate_Sequence(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+ return status;
+}
+
+
+#endif
+
+