summaryrefslogtreecommitdiffstats
path: root/src/phHciNfc_PollingLoop.c
diff options
context:
space:
mode:
authorNick Pelly <npelly@google.com>2010-09-23 12:47:58 -0700
committerNick Pelly <npelly@google.com>2010-09-23 13:53:18 -0700
commit5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a (patch)
tree190f9251c6db03d3550ec7f30b51a2561c01d9cf /src/phHciNfc_PollingLoop.c
parent4ff7c86a2c706b150078274455406f1b04966e1a (diff)
downloadexternal_libnfc-nxp-5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a.zip
external_libnfc-nxp-5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a.tar.gz
external_libnfc-nxp-5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a.tar.bz2
Initial libnfc checkin
Source: Trusted_NFC_Device_Host_AA03.01e02_google.zip code drop (23-Sep-2010) Change-Id: Ie47f18423f949a8d3e0815d13f55c814312add24 Signed-off-by: Nick Pelly <npelly@google.com>
Diffstat (limited to 'src/phHciNfc_PollingLoop.c')
-rw-r--r--src/phHciNfc_PollingLoop.c807
1 files changed, 807 insertions, 0 deletions
diff --git a/src/phHciNfc_PollingLoop.c b/src/phHciNfc_PollingLoop.c
new file mode 100644
index 0000000..2142122
--- /dev/null
+++ b/src/phHciNfc_PollingLoop.c
@@ -0,0 +1,807 @@
+/*
+ * 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_PollingLoop.c *
+* \brief HCI polling loop Management Routines. *
+* *
+* *
+* Project: NFC-FRI-1.1 *
+* *
+* $Date: Mon Mar 29 17:34:48 2010 $ *
+* $Author: ing04880 $ *
+* $Revision: 1.35 $ *
+* $Aliases: NFC_FRI1.1_WK1007_R33_4,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 <phNfcCompId.h>
+#include <phNfcHalTypes.h>
+#include <phHciNfc_Pipe.h>
+#include <phHciNfc_PollingLoop.h>
+#include <phOsalNfc.h>
+/*
+****************************** Macro Definitions *******************************
+*/
+
+/* Registry index to which command has to be sent */
+#define PL_PAUSE_INDEX 0x08U
+#define PL_EMULATION_INDEX 0x07U
+#define PL_RD_PHASES_INDEX 0x06U
+#define PL_DISABLE_TARGET_INDEX 0x09U
+
+/* Events */
+#define NXP_EVT_CLK_ACK 0x01U
+#define NXP_EVT_CLK_REQUEST 0x02U
+#define NXP_EVT_ACTIVATE_RDPHASES 0x03U
+#define NXP_EVT_DEACTIVATE_RDPHASES 0x04U
+
+/* Command length */
+#define PL_DURATION_LENGTH 0x02U
+#define PL_BYTE_LEN_1 0x01U
+
+#define PL_BIT_FIELD_ENABLED 0x01U
+
+
+#define PL_EMULATION_FACTOR 0x0AU
+/* Default duration (100 ms * 1000) micro seconds,
+ always duration shall be less then 3145680
+ micro seconds */
+#define PL_DEFAULT_DURATION 100000U
+/* Maximum duration */
+#define PL_MAX_DURATION 3145000U
+#define PL_DURATION_MIN_VALUE 48U
+#define PL_DURATION_CALC(duration) \
+ ((uint16_t)((duration)/PL_DURATION_MIN_VALUE))
+
+/*
+*************************** Structure and Enumeration ***************************
+*/
+
+typedef enum phHciNfc_Poll_Seq{
+ PL_PIPE_OPEN = 0x00U,
+ PL_PIPE_CLOSE,
+ PL_SET_DURATION,
+ PL_GET_DURATION,
+ PL_GET_RD_PHASES,
+ PL_SET_RD_PHASES,
+ PL_GET_DISABLE_TARGET,
+ PL_SET_DISABLE_TARGET,
+ PL_END_SEQUENCE
+} phHciNfc_Poll_Seq_t;
+
+/* Information structure for the polling loop Gate */
+typedef struct phHciNfc_PollLoop_Info{
+ /* Current running Sequence of the polling loop Management */
+ phHciNfc_Poll_Seq_t current_seq;
+ /* Next running Sequence of the polling loop Management */
+ phHciNfc_Poll_Seq_t next_seq;
+ /* Pointer to the polling loop pipe information */
+ phHciNfc_Pipe_Info_t *p_pipe_info;
+ uint8_t pipe_id;
+} phHciNfc_PollLoop_Info_t;
+
+/*
+*************************** Static Function Declaration **************************
+*/
+
+static
+NFCSTATUS
+phHciNfc_PollLoop_InfoUpdate(
+ phHciNfc_sContext_t *psHciContext,
+ uint8_t index,
+ uint8_t *reg_value,
+ uint8_t reg_length
+ );
+/**
+ * \ingroup grp_hci_nfc
+ *
+ * The phHciNfc_Recv_Pl_Response function interprets the received polling loop
+ * response from the Host Controller Gate.
+ *
+ * \param[in] psHciContext psHciContext is the pointer to HCI Layer
+ * context Structure.
+ * \param[in] pHwRef pHwRef is the Information of
+ * the Device Interface Link .
+ * \param[in,out] pResponse Response received from the Host Cotroller
+ * polling loop gate.
+ * \param[in] length length contains the length of the
+ * response received from the Host Controller.
+ *
+ * \retval NFCSTATUS_PENDING Polling loop gate Response to be received
+ * is pending.
+ * \retval NFCSTATUS_SUCCESS Polling loop gate Response received
+ * Successfully.
+ * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
+ * could not be interpreted properly.
+ * \retval Other errors Errors related to the other layers
+ *
+ */
+
+static
+NFCSTATUS
+phHciNfc_Recv_PollLoop_Response(
+ void *psContext,
+ void *pHwRef,
+ uint8_t *pResponse,
+#ifdef ONE_BYTE_LEN
+ uint8_t length
+#else
+ uint16_t length
+#endif
+ );
+
+static
+NFCSTATUS
+phHciNfc_Recv_PollLoop_Event(
+ void *psContext,
+ void *pHwRef,
+ uint8_t *pEvent,
+#ifdef ONE_BYTE_LEN
+ uint8_t length
+#else
+ uint16_t length
+#endif
+ );
+/*
+*************************** Function Definitions ***************************
+*/
+
+NFCSTATUS
+phHciNfc_PollLoop_Get_PipeID(
+ phHciNfc_sContext_t *psHciContext,
+ uint8_t *ppipe_id
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+ if( (NULL != psHciContext)
+ && ( NULL != ppipe_id )
+ && ( NULL != psHciContext->p_poll_loop_info )
+ )
+ {
+ phHciNfc_PollLoop_Info_t *p_poll_info=NULL;
+ p_poll_info = (phHciNfc_PollLoop_Info_t *)
+ psHciContext->p_poll_loop_info ;
+ *ppipe_id = p_poll_info->pipe_id ;
+ }
+ else
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ return status;
+}
+
+NFCSTATUS
+phHciNfc_PollLoop_Init_Resources(
+ phHciNfc_sContext_t *psHciContext
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ phHciNfc_PollLoop_Info_t *p_poll_info=NULL;
+ if( NULL == psHciContext )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ if(
+ ( NULL == psHciContext->p_poll_loop_info )
+ && (phHciNfc_Allocate_Resource((void **)(&p_poll_info),
+ sizeof(phHciNfc_PollLoop_Info_t))== NFCSTATUS_SUCCESS)
+ )
+ {
+ psHciContext->p_poll_loop_info = p_poll_info;
+ p_poll_info->current_seq = PL_PIPE_OPEN;
+ p_poll_info->next_seq = PL_PIPE_CLOSE;
+ p_poll_info->pipe_id = (uint8_t)HCI_UNKNOWN_PIPE_ID;
+ }
+ else
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
+ }
+
+ }
+ return status;
+}
+
+/*!
+ * \brief Initialisation of polling loop Gate and Establish the Session .
+ *
+ * This function initialses the polling loop Gates and
+ * all the required pipes and sets the Session ID
+ *
+ */
+NFCSTATUS
+phHciNfc_PollLoop_Initialise(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+ if( NULL == psHciContext )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ if( NULL == psHciContext->p_poll_loop_info )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI,
+ NFCSTATUS_INVALID_HCI_INFORMATION);
+ }
+ else
+ {
+ phHciNfc_PollLoop_Info_t *p_poll_info=NULL;
+ phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
+ p_poll_info = (phHciNfc_PollLoop_Info_t *)
+ psHciContext->p_poll_loop_info ;
+ p_pipe_info = p_poll_info->p_pipe_info;
+ if(NULL == p_pipe_info )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI,
+ NFCSTATUS_INVALID_HCI_SEQUENCE);
+ }
+ else
+ {
+ HCI_PRINT("Polling loop open pipe in progress ...\n");
+ status = phHciNfc_Open_Pipe( psHciContext,
+ pHwRef, p_pipe_info );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ p_poll_info->next_seq = PL_PIPE_CLOSE;
+ }
+ }
+ }
+ }
+ return status;
+}
+
+NFCSTATUS
+phHciNfc_PollLoop_Release(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ if( (NULL == psHciContext) || (NULL == pHwRef) )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ if( NULL != psHciContext->p_poll_loop_info )
+ {
+ phHciNfc_PollLoop_Info_t *p_poll_info=NULL;
+ p_poll_info = (phHciNfc_PollLoop_Info_t *)
+ psHciContext->p_poll_loop_info ;
+ if (PL_PIPE_CLOSE == p_poll_info->current_seq)
+ {
+ phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
+ p_pipe_info = p_poll_info->p_pipe_info;
+ if(NULL == p_pipe_info )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI,
+ NFCSTATUS_INVALID_HCI_SEQUENCE);
+ }
+ else
+ {
+ HCI_PRINT("Polling loop close pipe in progress ...\n");
+ status = phHciNfc_Close_Pipe( psHciContext,
+ pHwRef, p_pipe_info );
+ if(status == NFCSTATUS_SUCCESS)
+ {
+ p_poll_info->next_seq = PL_PIPE_OPEN;
+ }
+ }
+ }
+ else
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
+ } /* End of if (PL_PIPE_CLOSE == p_pl_info->cur_seq) */
+ }
+ else
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
+ } /* End of if( NULL != psHciContext->p_poll_loop_info ) */
+ } /* End of if( (NULL == psHciContext) || (NULL == pHwRef) ) */
+ return status;
+}
+
+NFCSTATUS
+phHciNfc_PollLoop_Cfg (
+ void *psHciHandle,
+ void *pHwRef,
+ uint8_t cfg_type,
+ void *pcfg_info
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ phHciNfc_sContext_t *psHciContext = ((phHciNfc_sContext_t *)psHciHandle);
+ uint8_t poll_cfg;
+ static uint16_t pl_duration = 0;
+
+ /* To remove "warning (VS C4100) : unreferenced formal parameter" */
+ PHNFC_UNUSED_VARIABLE(pcfg_info);
+
+ if( (NULL == psHciContext)
+ || (NULL == pHwRef)
+ )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else if(NULL == psHciContext->p_poll_loop_info)
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
+ }
+ else
+ {
+ phHciNfc_PollLoop_Info_t *p_poll_info=NULL;
+ phHciNfc_Pipe_Info_t *p_pipe_info=NULL;
+ phHal_sADD_Cfg_t *p_poll_cfg = NULL;
+ uint8_t pipeid = 0;
+
+ p_poll_cfg = (phHal_sADD_Cfg_t*)psHciContext->p_config_params;
+ p_poll_info = (phHciNfc_PollLoop_Info_t *)
+ psHciContext->p_poll_loop_info ;
+ p_pipe_info = p_poll_info->p_pipe_info;
+ if((NULL == p_pipe_info) || (NULL == p_poll_cfg))
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI,
+ NFCSTATUS_INVALID_HCI_SEQUENCE);
+ }
+ else
+ {
+ switch(cfg_type)
+ {
+ case PL_DURATION:
+ {
+ /*
+ Data memory has to be copied to
+ param_info and also depending on the
+ CARD_EMULATION or PAUSE, change the
+ p_pipe_info->reg_index
+ */
+ if(p_poll_cfg->Duration > PL_MAX_DURATION)
+ {
+ p_poll_cfg->Duration = PL_MAX_DURATION;
+ }
+
+
+ if (FALSE ==
+ p_poll_cfg->PollDevInfo.PollCfgInfo.DisableCardEmulation)
+ {
+ p_poll_cfg->Duration = ((p_poll_cfg->Duration <
+ PL_DURATION_MIN_VALUE)?
+ (PL_DEFAULT_DURATION *
+ PL_EMULATION_FACTOR):
+ p_poll_cfg->Duration );
+ p_pipe_info->reg_index = PL_EMULATION_INDEX;
+ }
+ else
+ {
+ p_poll_cfg->Duration = ((p_poll_cfg->Duration <
+ PL_DURATION_MIN_VALUE)?
+ PL_DEFAULT_DURATION :
+ p_poll_cfg->Duration);
+ p_pipe_info->reg_index = PL_PAUSE_INDEX;
+ }
+ p_pipe_info->param_length = PL_DURATION_LENGTH;
+
+ /* Calculate duration */
+ pl_duration = (uint16_t)
+ PL_DURATION_CALC(p_poll_cfg->Duration);
+
+ /* Swap the 2 byte value */
+ pl_duration = (uint16_t)((pl_duration << BYTE_SIZE) |
+ ((uint8_t)(pl_duration >> BYTE_SIZE)));
+ /* Copy the duration from poll config structure,
+ provided by the upper layer */
+ p_pipe_info->param_info = (void *)&(pl_duration);
+
+ pipeid = p_poll_info->pipe_id ;
+ if (PL_GET_DURATION == p_poll_info->current_seq)
+ {
+ status =
+ phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
+ pipeid, (uint8_t)ANY_GET_PARAMETER);
+ if (NFCSTATUS_PENDING == status)
+ {
+ p_poll_info->next_seq = PL_PIPE_CLOSE;
+ status = NFCSTATUS_SUCCESS;
+ }
+ }
+ else
+ {
+ status =
+ phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
+ pipeid, (uint8_t)ANY_SET_PARAMETER);
+ if(NFCSTATUS_PENDING == status )
+ {
+#ifdef ENABLE_VERIFY_PARAM
+ p_poll_info->next_seq = PL_GET_DURATION;
+#else
+ status = NFCSTATUS_SUCCESS;
+#endif /* #ifdef ENABLE_VERIFY_PARAM */
+ }
+ }
+ break;
+ }
+ case PL_RD_PHASES:
+ {
+ poll_cfg = (uint8_t) p_poll_cfg->PollDevInfo.PollEnabled;
+ p_pipe_info->param_length = PL_BYTE_LEN_1;
+ p_pipe_info->reg_index = PL_RD_PHASES_INDEX;
+
+ /* Data memory has to be copied to
+ param_info */
+ p_pipe_info->param_info = (void *)&(poll_cfg);
+ pipeid = p_poll_info->pipe_id ;
+ if (PL_GET_RD_PHASES == p_poll_info->current_seq)
+ {
+ status =
+ phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
+ pipeid, (uint8_t)ANY_GET_PARAMETER);
+ if (NFCSTATUS_PENDING == status)
+ {
+ status = NFCSTATUS_SUCCESS;
+ }
+ }
+ else
+ {
+ status =
+ phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
+ pipeid, (uint8_t)ANY_SET_PARAMETER);
+ if(NFCSTATUS_PENDING == status )
+ {
+#ifdef ENABLE_VERIFY_PARAM
+ p_poll_info->next_seq = PL_GET_RD_PHASES;
+#else
+ status = NFCSTATUS_SUCCESS;
+#endif /* #ifdef ENABLE_VERIFY_PARAM */
+ }
+ }
+ break;
+ }
+ case PL_DISABLE_TARGET:
+ {
+ if (NULL == pcfg_info)
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ /* poll_cfg = (uint8_t) p_poll_cfg->NfcIP_Tgt_Disable; */
+ p_pipe_info->param_length = PL_BYTE_LEN_1;
+ p_pipe_info->reg_index = PL_DISABLE_TARGET_INDEX;
+
+ /* Data memory has to be copied to
+ param_info */
+ p_pipe_info->param_info = pcfg_info;
+ pipeid = p_poll_info->pipe_id ;
+ if (PL_GET_DISABLE_TARGET == p_poll_info->current_seq)
+ {
+ status =
+ phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
+ pipeid, (uint8_t)ANY_GET_PARAMETER);
+ if (NFCSTATUS_PENDING == status)
+ {
+ status = NFCSTATUS_SUCCESS;
+ }
+ }
+ else
+ {
+ status =
+ phHciNfc_Send_Generic_Cmd( psHciContext, pHwRef,
+ pipeid, (uint8_t)ANY_SET_PARAMETER);
+ if( NFCSTATUS_PENDING == status )
+ {
+#ifdef ENABLE_VERIFY_PARAM
+ /* p_poll_info->current_seq = PL_GET_DISABLE_TARGET; */
+ p_poll_info->next_seq = PL_GET_DISABLE_TARGET;
+#else
+ status = NFCSTATUS_SUCCESS;
+#endif /* #ifdef ENABLE_VERIFY_PARAM */
+ }
+ }
+ }
+ break;
+ }
+ default:
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI,
+ NFCSTATUS_INVALID_PARAMETER);
+ break;
+ }
+ }
+ }
+ }
+ return status;
+}
+
+/* Function to assign pipe ID */
+NFCSTATUS
+phHciNfc_PollLoop_Update_PipeInfo(
+ phHciNfc_sContext_t *psHciContext,
+ uint8_t pipeID,
+ phHciNfc_Pipe_Info_t *pPipeInfo
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+ if( NULL == psHciContext )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else if ( NULL == psHciContext->p_poll_loop_info )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
+ }
+ else
+ {
+ phHciNfc_PollLoop_Info_t *p_poll_info=NULL;
+ p_poll_info = (phHciNfc_PollLoop_Info_t *)
+ psHciContext->p_poll_loop_info ;
+ /* Update the pipe_id of the ID Mgmt Gate obtained from the HCI Response */
+ p_poll_info->pipe_id = pipeID;
+ p_poll_info->p_pipe_info = pPipeInfo;
+ if (NULL != pPipeInfo)
+ {
+ /* Update the Response Receive routine of the IDMgmt Gate */
+ pPipeInfo->recv_resp = &phHciNfc_Recv_PollLoop_Response;
+ /* Update the event Receive routine of the IDMgmt Gate */
+ pPipeInfo->recv_event = &phHciNfc_Recv_PollLoop_Event;
+ }
+ }
+
+ return status;
+}
+
+static
+NFCSTATUS
+phHciNfc_Recv_PollLoop_Response(
+ void *psContext,
+ void *pHwRef,
+ uint8_t *pResponse,
+#ifdef ONE_BYTE_LEN
+ uint8_t length
+#else
+ uint16_t length
+#endif
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ phHciNfc_sContext_t *psHciContext =
+ (phHciNfc_sContext_t *)psContext ;
+
+
+ if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pResponse)
+ || (length == 0))
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else if( NULL == psHciContext->p_poll_loop_info )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
+ }
+ else
+ {
+ phHciNfc_PollLoop_Info_t *p_poll_info=NULL;
+ uint8_t prev_cmd = ANY_GET_PARAMETER;
+ p_poll_info = (phHciNfc_PollLoop_Info_t *)
+ psHciContext->p_poll_loop_info ;
+ if( NULL == p_poll_info->p_pipe_info)
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI,
+ NFCSTATUS_INVALID_HCI_SEQUENCE);
+ }
+ else
+ {
+ prev_cmd = p_poll_info->p_pipe_info->prev_msg ;
+ switch(prev_cmd)
+ {
+ case ANY_SET_PARAMETER:
+ {
+ HCI_PRINT("Polling loop Set Param complete\n");
+ break;
+ }
+ case ANY_GET_PARAMETER:
+ {
+ status = phHciNfc_PollLoop_InfoUpdate(psHciContext,
+ p_poll_info->p_pipe_info->reg_index,
+ &pResponse[HCP_HEADER_LEN],
+ (uint8_t)(length - HCP_HEADER_LEN));
+ break;
+ }
+ case ANY_OPEN_PIPE:
+ {
+ HCI_PRINT("Polling loop open pipe complete\n");
+ break;
+ }
+ case ANY_CLOSE_PIPE:
+ {
+ HCI_PRINT("Polling loop close pipe complete\n");
+ break;
+ }
+ default:
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
+ break;
+ }
+ }
+ if( NFCSTATUS_SUCCESS == status )
+ {
+ p_poll_info->p_pipe_info->prev_status = NFCSTATUS_SUCCESS;
+ p_poll_info->current_seq = p_poll_info->next_seq;
+ }
+ }
+ }
+ return status;
+}
+
+static
+NFCSTATUS
+phHciNfc_Recv_PollLoop_Event(
+ void *psContext,
+ void *pHwRef,
+ uint8_t *pEvent,
+#ifdef ONE_BYTE_LEN
+ uint8_t length
+#else
+ uint16_t length
+#endif
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ phHciNfc_sContext_t *psHciContext =
+ (phHciNfc_sContext_t *)psContext ;
+ if( (NULL == psHciContext) || (NULL == pHwRef) || (NULL == pEvent)
+ || (length <= HCP_HEADER_LEN))
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else if( NULL == psHciContext->p_poll_loop_info )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED);
+ }
+ else
+ {
+ phHciNfc_HCP_Packet_t *p_packet = NULL;
+ phHciNfc_PollLoop_Info_t *p_poll_info=NULL;
+ phHciNfc_HCP_Message_t *message = NULL;
+ static phHal_sEventInfo_t event_info;
+ uint8_t instruction=0;
+
+ p_poll_info = (phHciNfc_PollLoop_Info_t *)
+ psHciContext->p_poll_loop_info ;
+
+ PHNFC_UNUSED_VARIABLE(p_poll_info);
+ p_packet = (phHciNfc_HCP_Packet_t *)pEvent;
+ message = &p_packet->msg.message;
+ /* Get the instruction bits from the Message Header */
+ instruction = (uint8_t) GET_BITS8( message->msg_header,
+ HCP_MSG_INSTRUCTION_OFFSET, HCP_MSG_INSTRUCTION_LEN);
+
+ switch(instruction)
+ {
+ case NXP_EVT_CLK_ACK:
+ {
+ break;
+ }
+ case NXP_EVT_CLK_REQUEST:
+ {
+ break;
+ }
+ case NXP_EVT_ACTIVATE_RDPHASES:
+ {
+ HCI_PRINT("Polling loop activate read phase complete\n");
+ event_info.eventHost = phHal_eHostController;
+ event_info.eventType = NFC_UICC_RDPHASES_ACTIVATE_REQ;
+ event_info.eventInfo.rd_phases = pEvent[HCP_HEADER_LEN];
+ ((phHal_sHwReference_t *)pHwRef)->uicc_rdr_active = TRUE;
+ phHciNfc_Notify_Event((void *)psHciContext,
+ pHwRef,
+ NFC_NOTIFY_EVENT,
+ &(event_info));
+ break;
+ }
+ case NXP_EVT_DEACTIVATE_RDPHASES:
+ {
+ HCI_PRINT("Polling loop deactivate read phase complete\n");
+ event_info.eventHost = phHal_eHostController;
+ event_info.eventType = NFC_UICC_RDPHASES_DEACTIVATE_REQ;
+ event_info.eventInfo.rd_phases = pEvent[HCP_HEADER_LEN];
+ ((phHal_sHwReference_t *)pHwRef)->uicc_rdr_active = FALSE;
+ phHciNfc_Notify_Event((void *)psHciContext,
+ pHwRef,
+ NFC_NOTIFY_EVENT,
+ &(event_info));
+ break;
+ }
+ default:
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
+ break;
+ }
+ }
+ }
+ return status;
+}
+
+
+static
+NFCSTATUS
+phHciNfc_PollLoop_InfoUpdate(
+ phHciNfc_sContext_t *psHciContext,
+ uint8_t index,
+ uint8_t *reg_value,
+ uint8_t reg_length
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ phHciNfc_PollLoop_Info_t *p_poll_info=NULL;
+ p_poll_info = (phHciNfc_PollLoop_Info_t *)
+ (psHciContext->p_poll_loop_info );
+ /* To remove "warning (VS 4100) : unreferenced formal parameter" */
+ PHNFC_UNUSED_VARIABLE(reg_value);
+ PHNFC_UNUSED_VARIABLE(reg_length);
+ /* Variable was set but never used (ARM warning) */
+ PHNFC_UNUSED_VARIABLE(p_poll_info);
+ switch(index)
+ {
+ case PL_EMULATION_INDEX:
+ case PL_PAUSE_INDEX:
+ {
+ HCI_PRINT_BUFFER("\tPoll duration", reg_value, reg_length);
+ break;
+ }
+ case PL_RD_PHASES_INDEX:
+ {
+ HCI_PRINT_BUFFER("\tPoll read phase", reg_value, reg_length);
+ break;
+ }
+#if defined (CLK_REQUEST)
+ case PL_CLK_REQUEST_INDEX:
+ {
+ HCI_PRINT_BUFFER("\tPoll clock request", reg_value, reg_length);
+ break;
+ }
+#endif /* #if defined (CLK_REQUEST) */
+#if defined (INPUT_CLK)
+ case PL_INPUT_CLK_INDEX:
+ {
+ HCI_PRINT_BUFFER("\tPoll input clock", reg_value, reg_length);
+ break;
+ }
+#endif/* #if defined (INPUT_CLK) */
+ default:
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_RESPONSE);
+ break;
+ }
+ }
+ return status;
+}
+
+