summaryrefslogtreecommitdiffstats
path: root/src/phHciNfc_Pipe.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/phHciNfc_Pipe.c')
-rw-r--r--src/phHciNfc_Pipe.c1122
1 files changed, 1122 insertions, 0 deletions
diff --git a/src/phHciNfc_Pipe.c b/src/phHciNfc_Pipe.c
new file mode 100644
index 0000000..e7edc50
--- /dev/null
+++ b/src/phHciNfc_Pipe.c
@@ -0,0 +1,1122 @@
+/*
+ * 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 hHciNfc_PipeMgmt.c *
+* \brief HCI Pipe Management Routines. *
+* *
+* *
+* Project: NFC-FRI-1.1 *
+* *
+* $Date: Tue Aug 18 10:12:39 2009 $ *
+* $Author: ing04880 $ *
+* $Revision: 1.42 $ *
+* $Aliases: NFC_FRI1.1_WK934_R31_1,NFC_FRI1.1_WK941_PREP1,NFC_FRI1.1_WK941_PREP2,NFC_FRI1.1_WK941_1,NFC_FRI1.1_WK943_R32_1,NFC_FRI1.1_WK949_PREP1,NFC_FRI1.1_WK943_R32_10,NFC_FRI1.1_WK943_R32_13,NFC_FRI1.1_WK943_R32_14,NFC_FRI1.1_WK1007_R33_1,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 <phNfcConfig.h>
+#include <phNfcCompId.h>
+#include <phHciNfc_Pipe.h>
+#include <phOsalNfc.h>
+#include <phHciNfc_AdminMgmt.h>
+#include <phHciNfc_LinkMgmt.h>
+#include <phHciNfc_IDMgmt.h>
+#include <phHciNfc_DevMgmt.h>
+#include <phHciNfc_PollingLoop.h>
+#include <phHciNfc_RFReader.h>
+#include <phHciNfc_RFReaderA.h>
+#ifdef TYPE_B
+#include <phHciNfc_RFReaderB.h>
+#endif
+#ifdef TYPE_FELICA
+#include <phHciNfc_Felica.h>
+#endif
+#ifdef TYPE_JEWEL
+#include <phHciNfc_Jewel.h>
+#endif
+#ifdef TYPE_ISO15693
+#include <phHciNfc_ISO15693.h>
+#endif
+#ifdef ENABLE_P2P
+#include <phHciNfc_NfcIPMgmt.h>
+#endif
+#ifdef HOST_EMULATION
+#include <phHciNfc_CE_A.h>
+#include <phHciNfc_CE_B.h>
+#endif
+#include <phHciNfc_WI.h>
+#include <phHciNfc_SWP.h>
+
+/*
+****************************** Macro Definitions *******************************
+*/
+
+/*
+*************************** Structure and Enumeration ***************************
+*/
+static phHciNfc_GateID_t host_gate_list[] = {
+ phHciNfc_IdentityMgmtGate,
+ phHciNfc_PN544MgmtGate,
+ phHciNfc_PollingLoopGate,
+ phHciNfc_RFReaderAGate,
+#ifdef TYPE_B
+ phHciNfc_RFReaderBGate,
+#endif
+
+#ifdef TYPE_FELICA
+ phHciNfc_RFReaderFGate,
+#endif
+
+#ifdef TYPE_JEWEL
+ phHciNfc_JewelReaderGate,
+#endif
+
+#ifdef TYPE_ISO15693
+ phHciNfc_ISO15693Gate,
+#endif
+
+#ifdef ENABLE_P2P
+ phHciNfc_NFCIP1InitRFGate,
+ phHciNfc_NFCIP1TargetRFGate,
+#endif
+ phHciNfc_NfcWIMgmtGate,
+ phHciNfc_SwpMgmtGate,
+#if defined(HOST_EMULATION) && ( NXP_UICC_CE_RIGHTS < 0x01 )
+ phHciNfc_CETypeAGate,
+ phHciNfc_CETypeBGate,
+#endif
+ phHciNfc_UnknownGate
+};
+
+/*
+*************************** Static Function Declaration **************************
+*/
+
+static
+NFCSTATUS
+phHciNfc_Create_Pipe(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef,
+ phHciNfc_Gate_Info_t *destination,
+ phHciNfc_Pipe_Info_t **ppPipeHandle
+ );
+
+
+/*
+*************************** Function Definitions ***************************
+*/
+
+
+/*!
+ * \brief Creation of the Pipe
+ *
+ * This function creates the pipe between a source host's gate and destination
+ * host's gate
+ *
+ */
+
+static
+NFCSTATUS
+phHciNfc_Create_Pipe(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef,
+ phHciNfc_Gate_Info_t *destination,
+ phHciNfc_Pipe_Info_t **ppPipeHandle
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+ *ppPipeHandle = (phHciNfc_Pipe_Info_t *)
+ phOsalNfc_GetMemory( sizeof(phHciNfc_Pipe_Info_t) );
+
+ if(NULL != *ppPipeHandle)
+ {
+ /* The Source Host is the Terminal Host */
+ (*ppPipeHandle)->pipe.source.host_id = (uint8_t) phHciNfc_TerminalHostID;
+
+ /* The Source Gate is same as the Destination Gate */
+ (*ppPipeHandle)->pipe.source.gate_id =
+ ((phHciNfc_Gate_Info_t *)destination)->gate_id;
+ (*ppPipeHandle)->pipe.dest.host_id =
+ ((phHciNfc_Gate_Info_t *)destination)->host_id;
+ (*ppPipeHandle)->pipe.dest.gate_id =
+ ((phHciNfc_Gate_Info_t *)destination)->gate_id;
+
+ /* if( hciMode_Override == psHciContext->hci_mode ) */
+ {
+ /* The Pipe ID is unknown until it is assigned */
+ (*ppPipeHandle)->pipe.pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
+
+ status = phHciNfc_Send_Admin_Cmd( psHciContext, pHwRef,
+ ADM_CREATE_PIPE, (PIPEINFO_SIZE-1)
+ ,*ppPipeHandle );
+ }
+ }
+ else
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
+ }
+ return status;
+}
+
+
+NFCSTATUS
+phHciNfc_Update_Pipe(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef,
+ phHciNfc_PipeMgmt_Seq_t *p_pipe_seq
+ )
+{
+ static uint8_t pipe_index = HCI_DYNAMIC_PIPE_ID;
+ phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+
+ for (pipe_index = 0;
+ (pipe_index + HCI_DYNAMIC_PIPE_ID) <=
+ (uint8_t)(sizeof(host_gate_list)/sizeof(phHciNfc_GateID_t) );
+ pipe_index++)
+ {
+ status = phHciNfc_Allocate_Resource((void **)&p_pipe_info,
+ sizeof(phHciNfc_Pipe_Info_t));
+
+ if( (NFCSTATUS_SUCCESS == status)
+ && (NULL != p_pipe_info))
+ {
+ /* The Source Host is the Terminal Host */
+ p_pipe_info->pipe.source.host_id = (uint8_t) phHciNfc_TerminalHostID;
+
+ /* The Source Gate is same as the Destination Gate */
+ p_pipe_info->pipe.source.gate_id =
+ host_gate_list[pipe_index];
+ p_pipe_info->pipe.dest.host_id =
+ phHciNfc_HostControllerID;
+ p_pipe_info->pipe.dest.gate_id =
+ host_gate_list[pipe_index];
+ /* The Pipe ID is unknown until it is assigned */
+ p_pipe_info->pipe.pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
+
+ /* Initialise the Resources for the particular Gate */
+
+ status = phHciNfc_Create_All_Pipes(psHciContext,
+ pHwRef, p_pipe_seq );
+
+ if( NFCSTATUS_SUCCESS == status )
+ {
+ uint8_t pipe_id = (uint8_t)(pipe_index + HCI_DYNAMIC_PIPE_ID);
+ status = phHciNfc_Update_PipeInfo( psHciContext, p_pipe_seq ,
+ pipe_id, p_pipe_info );
+ if( NFCSTATUS_SUCCESS == status )
+ {
+ p_pipe_info->pipe.pipe_id = pipe_id;
+ psHciContext->p_pipe_list[pipe_id] = p_pipe_info;
+ }
+ else
+ {
+ phOsalNfc_FreeMemory(p_pipe_info);
+ }
+ p_pipe_info = NULL;
+ }
+ else
+ {
+ phOsalNfc_FreeMemory(p_pipe_info);
+ p_pipe_info = NULL;
+ }
+ }
+ else
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES);
+ }
+ }
+
+ if( NFCSTATUS_SUCCESS == status )
+ {
+ status = phHciNfc_LinkMgmt_Initialise( psHciContext,pHwRef );
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ status = phHciNfc_ReaderMgmt_Initialise( psHciContext,pHwRef );
+ }
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ status = phHciNfc_EmuMgmt_Initialise( psHciContext,pHwRef );
+ }
+ }
+
+ return status;
+}
+
+
+/*!
+ * \brief Deletion of the Pipe
+ *
+ * This function Deletes a pipe created between a terminal host's gate and
+ * destination host's gate
+ *
+ */
+
+NFCSTATUS
+phHciNfc_Delete_Pipe(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef,
+ phHciNfc_Pipe_Info_t *pPipeHandle
+ )
+{
+ NFCSTATUS status=NFCSTATUS_SUCCESS;
+ NFCSTATUS cmd_status = NFCSTATUS_SUCCESS;
+
+ if( (NULL == psHciContext)
+ || (NULL == pHwRef)
+ || (NULL == pPipeHandle)
+ )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ cmd_status = phHciNfc_Send_Admin_Cmd( psHciContext, pHwRef,
+ ADM_DELETE_PIPE, PIPEID_LEN, pPipeHandle );
+ status = ( (cmd_status == NFCSTATUS_PENDING)?
+ NFCSTATUS_SUCCESS : cmd_status);
+ }
+
+ return status;
+}
+
+#ifdef HOST_EMULATION
+
+NFCSTATUS
+phHciNfc_CE_Pipes_OP(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef,
+ phHciNfc_PipeMgmt_Seq_t *p_pipe_seq
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
+ /* uint8_t pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; */
+
+ if( (NULL == psHciContext) || (NULL == pHwRef) )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ switch( *p_pipe_seq )
+ {
+ case PIPE_CARD_A_CREATE:
+ {
+ phHciNfc_Gate_Info_t id_dest;
+
+ id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
+ id_dest.gate_id = (uint8_t)phHciNfc_CETypeAGate;
+
+ status = phHciNfc_CE_A_Init_Resources ( psHciContext );
+ if(status == NFCSTATUS_SUCCESS)
+ {
+ status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
+ &id_dest, &p_pipe_info);
+ status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status);
+ }
+ break;
+ }
+ case PIPE_CARD_B_CREATE:
+ {
+ phHciNfc_Gate_Info_t id_dest;
+
+ id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
+ id_dest.gate_id = (uint8_t)phHciNfc_CETypeBGate;
+
+ status = phHciNfc_CE_B_Init_Resources ( psHciContext );
+ if(status == NFCSTATUS_SUCCESS)
+ {
+ status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
+ &id_dest, &p_pipe_info);
+ status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status);
+ }
+ break;
+ }
+#if 0
+ case PIPE_CARD_F_CREATE:
+ {
+ phHciNfc_Gate_Info_t id_dest;
+
+ id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
+ id_dest.gate_id = (uint8_t)phHciNfc_CETypeFGate;
+
+ /* status = phHciNfc_Card_Emulation_Init (psHciContext , TYPE_F); */
+ if(status == NFCSTATUS_SUCCESS)
+ {
+ status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
+ &id_dest, &p_pipe_info);
+ /* status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status); */
+ }
+ break;
+ }
+ case PIPE_CARD_A_DELETE:
+ {
+ status = phHciNfc_CE_A_Get_PipeID( psHciContext, &pipe_id );
+ p_pipe_info = psHciContext->p_pipe_list[pipe_id];
+ if(status == NFCSTATUS_SUCCESS)
+ {
+ status = phHciNfc_Delete_Pipe( psHciContext, pHwRef,
+ p_pipe_info);
+ status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status);
+ }
+ break;
+ }
+ case PIPE_CARD_B_DELETE:
+ {
+ status = phHciNfc_CE_B_Get_PipeID( psHciContext, &pipe_id );
+ p_pipe_info = psHciContext->p_pipe_list[pipe_id];
+ if(status == NFCSTATUS_SUCCESS)
+ {
+ status = phHciNfc_Delete_Pipe( psHciContext, pHwRef,
+ p_pipe_info);
+ status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status);
+ }
+ break;
+ }
+#endif
+ /* case PIPE_MGMT_END : */
+ default:
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
+ break;
+ }
+ }
+ }
+
+ return status;
+}
+#endif
+
+
+/*!
+ * \brief Creates the Pipes of all the Supported Gates .
+ *
+ * This function Creates the pipes for all the supported gates
+ */
+
+NFCSTATUS
+phHciNfc_Create_All_Pipes(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef,
+ phHciNfc_PipeMgmt_Seq_t *p_pipe_seq
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
+
+ if( (NULL == psHciContext) || (NULL == pHwRef)
+ || (NULL == p_pipe_seq) )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+
+ switch( *p_pipe_seq )
+ {
+ /* Admin pipe close sequence */
+ case PIPE_IDMGMT_CREATE:
+ {
+ phHciNfc_Gate_Info_t id_dest;
+
+ id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
+ id_dest.gate_id = (uint8_t)phHciNfc_IdentityMgmtGate;
+
+ status = phHciNfc_IDMgmt_Init_Resources (psHciContext);
+ if((status == NFCSTATUS_SUCCESS)
+#ifdef ESTABLISH_SESSION
+ && (hciMode_Session != psHciContext->hci_mode)
+#endif
+ )
+ {
+ status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
+ &id_dest, &p_pipe_info);
+ /* status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status); */
+ }
+ break;
+ }
+ case PIPE_PN544MGMT_CREATE:
+ {
+ phHciNfc_Gate_Info_t id_dest;
+
+ id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
+ id_dest.gate_id = (uint8_t)phHciNfc_PN544MgmtGate;
+
+ status = phHciNfc_DevMgmt_Init_Resources (psHciContext);
+ if((status == NFCSTATUS_SUCCESS)
+#ifdef ESTABLISH_SESSION
+ && (hciMode_Session != psHciContext->hci_mode)
+#endif
+ )
+ {
+ status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
+ &id_dest, &p_pipe_info);
+ if(HCI_SELF_TEST == psHciContext->init_mode)
+ {
+ status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status);
+ }
+ }
+ break;
+ }
+ case PIPE_POLLINGLOOP_CREATE:
+ {
+ phHciNfc_Gate_Info_t id_dest;
+
+ id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
+ id_dest.gate_id = (uint8_t)phHciNfc_PollingLoopGate;
+
+ status = phHciNfc_PollLoop_Init_Resources (psHciContext);
+ if((status == NFCSTATUS_SUCCESS)
+#ifdef ESTABLISH_SESSION
+ && (hciMode_Session != psHciContext->hci_mode)
+#endif
+ )
+ {
+ status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
+ &id_dest, &p_pipe_info);
+ /* status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status); */
+ }
+ break;
+ }
+ case PIPE_READER_A_CREATE:
+ {
+ phHciNfc_Gate_Info_t id_dest;
+
+ id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
+ id_dest.gate_id = (uint8_t)phHciNfc_RFReaderAGate;
+
+ status = phHciNfc_ReaderA_Init_Resources (psHciContext);
+ if((status == NFCSTATUS_SUCCESS)
+#ifdef ESTABLISH_SESSION
+ && (hciMode_Session != psHciContext->hci_mode)
+#endif
+ )
+ {
+ status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
+ &id_dest, &p_pipe_info);
+ /* status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status); */
+ }
+ break;
+ }
+#ifdef TYPE_B
+ case PIPE_READER_B_CREATE:
+ {
+ phHciNfc_Gate_Info_t id_dest;
+
+ id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
+ id_dest.gate_id = (uint8_t)phHciNfc_RFReaderBGate;
+
+ status = phHciNfc_ReaderB_Init_Resources (psHciContext);
+ if((status == NFCSTATUS_SUCCESS)
+#ifdef ESTABLISH_SESSION
+ && (hciMode_Session != psHciContext->hci_mode)
+#endif
+ )
+ {
+ status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
+ &id_dest, &p_pipe_info);
+ /* status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status); */
+ }
+ break;
+ }
+/* #ifdef TYPE_B*/
+#endif
+#ifdef TYPE_FELICA
+ case PIPE_READER_F_CREATE:
+ {
+ phHciNfc_Gate_Info_t id_dest;
+
+ id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
+ id_dest.gate_id = (uint8_t)phHciNfc_RFReaderFGate;
+
+ status = phHciNfc_Felica_Init_Resources (psHciContext);
+ if((status == NFCSTATUS_SUCCESS)
+#ifdef ESTABLISH_SESSION
+ && (hciMode_Session != psHciContext->hci_mode)
+#endif
+ )
+ {
+ status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
+ &id_dest, &p_pipe_info);
+ /* status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status); */
+ }
+ break;
+ }
+#endif
+#ifdef TYPE_JEWEL
+ case PIPE_READER_JWL_CREATE:
+ {
+ phHciNfc_Gate_Info_t id_dest;
+
+ id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
+ id_dest.gate_id = (uint8_t)phHciNfc_JewelReaderGate;
+
+ status = phHciNfc_Jewel_Init_Resources (psHciContext);
+ if((status == NFCSTATUS_SUCCESS)
+#ifdef ESTABLISH_SESSION
+ && (hciMode_Session != psHciContext->hci_mode)
+#endif
+ )
+ {
+ status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
+ &id_dest, &p_pipe_info);
+ /* status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status); */
+ }
+ break;
+ }
+#endif /* #ifdef TYPE_JEWEL */
+#ifdef TYPE_ISO15693
+ case PIPE_READER_ISO15693_CREATE:
+ {
+ phHciNfc_Gate_Info_t id_dest;
+
+ id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
+ id_dest.gate_id = (uint8_t)phHciNfc_ISO15693Gate;
+
+ status = phHciNfc_ISO15693_Init_Resources (psHciContext);
+ if((status == NFCSTATUS_SUCCESS)
+#ifdef ESTABLISH_SESSION
+ && (hciMode_Session != psHciContext->hci_mode)
+#endif
+ )
+ {
+ status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
+ &id_dest, &p_pipe_info);
+ /* status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status); */
+ }
+ break;
+ }
+#endif /* #ifdef TYPE_ISO15693 */
+ case PIPE_NFC_INITIATOR_CREATE:
+ {
+ phHciNfc_Gate_Info_t id_dest;
+
+ id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
+ id_dest.gate_id = (uint8_t)phHciNfc_NFCIP1InitRFGate;
+#ifdef ENABLE_P2P
+ status = phHciNfc_Initiator_Init_Resources (psHciContext);
+ if((status == NFCSTATUS_SUCCESS)
+#ifdef ESTABLISH_SESSION
+ && (hciMode_Session != psHciContext->hci_mode)
+#endif
+ )
+ {
+ status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
+ &id_dest, &p_pipe_info);
+ /* status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status); */
+ }
+#endif
+ break;
+ }
+ case PIPE_NFC_TARGET_CREATE:
+ {
+ phHciNfc_Gate_Info_t id_dest;
+
+ id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
+ id_dest.gate_id = (uint8_t)phHciNfc_NFCIP1TargetRFGate;
+
+#ifdef ENABLE_P2P
+ status = phHciNfc_Target_Init_Resources (psHciContext);
+ if((status == NFCSTATUS_SUCCESS)
+#ifdef ESTABLISH_SESSION
+ && (hciMode_Session != psHciContext->hci_mode)
+#endif
+ )
+ {
+ status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
+ &id_dest, &p_pipe_info);
+ /* status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status); */
+ }
+#endif
+ break;
+ }
+ case PIPE_WI_CREATE:
+ {
+ phHciNfc_Gate_Info_t id_dest;
+
+ id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
+ id_dest.gate_id = (uint8_t)phHciNfc_NfcWIMgmtGate;
+
+ status = phHciNfc_WI_Init_Resources ( psHciContext );
+ if((status == NFCSTATUS_SUCCESS)
+#ifdef ESTABLISH_SESSION
+ && (hciMode_Session != psHciContext->hci_mode)
+#endif
+ )
+ {
+ status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
+ &id_dest, &p_pipe_info);
+ /* status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status); */
+ }
+ break;
+ }
+ case PIPE_SWP_CREATE:
+ {
+ phHciNfc_Gate_Info_t id_dest;
+
+ id_dest.host_id = (uint8_t)phHciNfc_HostControllerID;
+ id_dest.gate_id = (uint8_t)phHciNfc_SwpMgmtGate;
+
+ status = phHciNfc_SWP_Init_Resources ( psHciContext );
+
+ if((status == NFCSTATUS_SUCCESS)
+#ifdef ESTABLISH_SESSION
+ && (hciMode_Session != psHciContext->hci_mode)
+#endif
+ )
+ {
+ status = phHciNfc_Create_Pipe( psHciContext, pHwRef,
+ &id_dest, &p_pipe_info);
+ status = ((NFCSTATUS_PENDING == status )?
+ NFCSTATUS_SUCCESS : status);
+ }
+ break;
+ }
+ /* case PIPE_MGMT_END : */
+ default:
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
+ break;
+ }
+
+ } /* End of Pipe Seq Switch */
+
+ } /* End of Null Check for the Context */
+
+ return status;
+}
+
+/*!
+ * \brief Deletes the Pipes of all the Supported Gates .
+ *
+ * This function Deletes the pipes for all the supported gates
+ */
+
+NFCSTATUS
+phHciNfc_Delete_All_Pipes(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef,
+ phHciNfc_PipeMgmt_Seq_t pipeSeq
+ )
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ phHciNfc_Pipe_Info_t *p_pipe_info = NULL;
+ uint8_t length = 0;
+
+ if( (NULL == psHciContext) || (NULL == pHwRef) )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ /* pipeSeq = PIPE_DELETE_ALL; */
+
+ if ( PIPE_DELETE_ALL == pipeSeq )
+ {
+ /* Admin pipe close sequence */
+ p_pipe_info = psHciContext->p_pipe_list[PIPETYPE_STATIC_ADMIN];
+ status = phHciNfc_Send_Admin_Cmd( psHciContext,
+ pHwRef, ADM_CLEAR_ALL_PIPE,
+ length, p_pipe_info);
+ status = ((NFCSTATUS_PENDING == status)?
+ NFCSTATUS_SUCCESS : status);
+ }
+ else
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE);
+ }
+
+
+ } /* End of Null Check for the Context */
+
+ return status;
+}
+
+
+
+NFCSTATUS
+phHciNfc_Update_PipeInfo(
+ phHciNfc_sContext_t *psHciContext,
+ phHciNfc_PipeMgmt_Seq_t *pPipeSeq,
+ uint8_t pipe_id,
+ phHciNfc_Pipe_Info_t *pPipeInfo
+ )
+{
+ phHciNfc_GateID_t gate_id = phHciNfc_UnknownGate;
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+ if(
+ (NULL == psHciContext) || (NULL == pPipeSeq)
+ || ( NULL == pPipeInfo )
+ )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ gate_id = (phHciNfc_GateID_t )pPipeInfo->pipe.dest.gate_id ;
+ switch( gate_id )
+ {
+ /* Identity Management Pipe Creation */
+ case phHciNfc_IdentityMgmtGate:
+ {
+ status = phHciNfc_IDMgmt_Update_PipeInfo(psHciContext,
+ pipe_id, pPipeInfo);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ *pPipeSeq = PIPE_PN544MGMT_CREATE;
+ }
+ break;
+ }
+ case phHciNfc_PN544MgmtGate:
+ {
+ status = phHciNfc_DevMgmt_Update_PipeInfo(psHciContext,
+ pipe_id, pPipeInfo);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ *pPipeSeq = ( HCI_SELF_TEST != psHciContext->init_mode )?
+ PIPE_POLLINGLOOP_CREATE:PIPE_DELETE_ALL;
+ }
+ break;
+ }
+ case phHciNfc_PollingLoopGate:
+ {
+ status = phHciNfc_PollLoop_Update_PipeInfo(psHciContext,
+ pipe_id, pPipeInfo);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ *pPipeSeq = PIPE_READER_A_CREATE;
+ }
+ break;
+ }
+ case phHciNfc_RFReaderAGate:
+ {
+ status = phHciNfc_ReaderA_Update_PipeInfo(psHciContext,
+ pipe_id, pPipeInfo);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+
+#if defined (TYPE_B)
+ *pPipeSeq = PIPE_READER_B_CREATE;
+/* #if defined (TYPE_B) */
+#elif defined (TYPE_FELICA)
+ *pPipeSeq = PIPE_READER_F_CREATE;
+/* #if defined (TYPE_FELICA) */
+#elif defined (TYPE_JEWEL)
+ *pPipeSeq = PIPE_READER_JWL_CREATE;
+/* #if defined (TYPE_JEWEL) */
+#elif defined (TYPE_ISO15693)
+ *pPipeSeq = PIPE_READER_ISO15693_CREATE;
+/* #if defined (TYPE_ISO15693) */
+#elif defined(ENABLE_P2P)
+ *pPipeSeq = PIPE_NFC_INITIATOR_CREATE;
+/* #if defined(ENABLE_P2P) */
+ /*lint -e{91} suppress "Line exceeds"*/
+#elif !defined(TYPE_B) && !defined(TYPE_FELICA) && !defined(TYPE_JEWEL) && !defined(TYPE_ISO15693) && !defined(ENABLE_P2P)
+ *pPipeSeq = PIPE_WI_CREATE;
+#endif
+ }
+ break;
+ }
+#ifdef TYPE_B
+ case phHciNfc_RFReaderBGate:
+ {
+ status = phHciNfc_ReaderB_Update_PipeInfo(psHciContext,
+ pipe_id, pPipeInfo);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+#if defined (TYPE_FELICA)
+ *pPipeSeq = PIPE_READER_F_CREATE;
+/* #if defined (TYPE_FELICA) */
+#elif defined (TYPE_JEWEL)
+ *pPipeSeq = PIPE_READER_JWL_CREATE;
+/* #if defined (TYPE_JEWEL) */
+#elif defined (TYPE_ISO15693)
+ *pPipeSeq = PIPE_READER_ISO15693_CREATE;
+/* #if defined (TYPE_ISO15693) */
+#elif defined(ENABLE_P2P)
+ *pPipeSeq = PIPE_NFC_INITIATOR_CREATE;
+/* #if defined(ENABLE_P2P) */
+ /*lint -e{91} suppress "Line exceeds"*/
+#elif !defined(TYPE_FELICA) && !defined(TYPE_JEWEL) && !defined(TYPE_ISO15693) && !defined(ENABLE_P2P)
+ *pPipeSeq = PIPE_WI_CREATE;
+#endif
+ }
+ break;
+ }
+#endif
+#ifdef TYPE_FELICA
+ case phHciNfc_RFReaderFGate:
+ {
+ status = phHciNfc_Felica_Update_PipeInfo(psHciContext,
+ pipe_id, pPipeInfo);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+#if defined (TYPE_JEWEL)
+ *pPipeSeq = PIPE_READER_JWL_CREATE;
+/* #if defined (TYPE_JEWEL) */
+#elif defined (TYPE_ISO15693)
+ *pPipeSeq = PIPE_READER_ISO15693_CREATE;
+/* #if defined (TYPE_ISO15693) */
+#elif defined(ENABLE_P2P)
+ *pPipeSeq = PIPE_NFC_INITIATOR_CREATE;
+/* #if defined(ENABLE_P2P) */
+#elif !defined(TYPE_JEWEL) && !defined(TYPE_ISO15693) && !defined(ENABLE_P2P)
+ *pPipeSeq = PIPE_WI_CREATE;
+#endif
+ }
+ break;
+ }
+#endif
+#ifdef TYPE_JEWEL
+ case phHciNfc_JewelReaderGate:
+ {
+ status = phHciNfc_Jewel_Update_PipeInfo(psHciContext,
+ pipe_id, pPipeInfo);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+#if defined (TYPE_ISO15693)
+ *pPipeSeq = PIPE_READER_ISO15693_CREATE;
+/* #if defined (TYPE_ISO15693) */
+#elif defined(ENABLE_P2P)
+ *pPipeSeq = PIPE_NFC_INITIATOR_CREATE;
+/* #if defined(ENABLE_P2P) */
+#elif !defined(TYPE_ISO15693) && !defined(ENABLE_P2P)
+ *pPipeSeq = PIPE_WI_CREATE;
+#endif
+ }
+ break;
+ }
+#endif /* #ifdef TYPE_JEWEL */
+#if defined (TYPE_ISO15693)
+ case phHciNfc_ISO15693Gate:
+ {
+ status = phHciNfc_ISO15693_Update_PipeInfo(psHciContext,
+ pipe_id, pPipeInfo);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+
+#ifdef ENABLE_P2P
+ *pPipeSeq = PIPE_NFC_INITIATOR_CREATE;
+#else
+ *pPipeSeq = PIPE_WI_CREATE;
+#endif /* #ifdef ENABLE_P2P */
+ }
+ break;
+ }
+#endif /* #if defined (TYPE_ISO15693) */
+ case phHciNfc_NFCIP1InitRFGate:
+ {
+#ifdef ENABLE_P2P
+ status = phHciNfc_Initiator_Update_PipeInfo(psHciContext,
+ pipe_id, pPipeInfo);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ *pPipeSeq = PIPE_NFC_TARGET_CREATE;
+ }
+#endif
+ break;
+ }
+ case phHciNfc_NFCIP1TargetRFGate:
+ {
+#ifdef ENABLE_P2P
+ status = phHciNfc_Target_Update_PipeInfo(psHciContext,
+ pipe_id, pPipeInfo);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ *pPipeSeq = PIPE_WI_CREATE;
+ }
+#endif
+ break;
+ }
+ case phHciNfc_NfcWIMgmtGate:
+ {
+ status = phHciNfc_WI_Update_PipeInfo(psHciContext,
+ pipe_id, pPipeInfo);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ *pPipeSeq = PIPE_SWP_CREATE;
+ }
+ break;
+ }
+ case phHciNfc_SwpMgmtGate:
+ {
+ status = phHciNfc_SWP_Update_PipeInfo(psHciContext,
+ pipe_id, pPipeInfo);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ *pPipeSeq = PIPE_DELETE_ALL;
+ }
+ break;
+ }
+ case phHciNfc_ConnectivityGate:
+ {
+ status = phHciNfc_Uicc_Update_PipeInfo(psHciContext,
+ pipe_id, pPipeInfo);
+ break;
+ }
+#ifdef HOST_EMULATION
+ case phHciNfc_CETypeAGate:
+ {
+ status = phHciNfc_CE_A_Update_PipeInfo(psHciContext,
+ pipe_id, pPipeInfo);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ *pPipeSeq = PIPE_CARD_B_CREATE;
+ }
+ break;
+ }
+ case phHciNfc_CETypeBGate:
+ {
+ status = phHciNfc_CE_B_Update_PipeInfo(psHciContext,
+ pipe_id, pPipeInfo);
+ if(NFCSTATUS_SUCCESS == status)
+ {
+ *pPipeSeq = PIPE_DELETE_ALL;
+ }
+ break;
+ }
+#endif
+ case phHciNfc_UnknownGate:
+ default:
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_HCI_GATE_NOT_SUPPORTED );
+ break;
+ }
+ /*End of the default Switch Case */
+
+ } /*End of the Index Switch */
+ } /* End of Context and the Identity information validity check */
+
+ return status;
+}
+
+
+/*!
+ * \brief Opening the Pipe
+ *
+ * This function opens the the pipe created between a terminal host's gate and
+ * destination host's gate
+ *
+ */
+
+NFCSTATUS
+phHciNfc_Open_Pipe(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef,
+ phHciNfc_Pipe_Info_t *pPipeHandle
+ )
+{
+ uint8_t pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ NFCSTATUS cmd_status = NFCSTATUS_SUCCESS;
+
+ if( (NULL == psHciContext)
+ || ( NULL == pHwRef )
+ || ( NULL == pPipeHandle )
+ )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ /* Obtain the pipe_id from the pipe_handle */
+ pipe_id = pPipeHandle->pipe.pipe_id;
+
+ if ( pipe_id <= PHHCINFC_MAX_PIPE)
+ {
+ cmd_status = phHciNfc_Send_Generic_Cmd( psHciContext,pHwRef,
+ pipe_id, ANY_OPEN_PIPE);
+ status = ( (cmd_status == NFCSTATUS_PENDING)?
+ NFCSTATUS_SUCCESS : cmd_status);
+ }
+ }
+ return status;
+}
+
+
+/*!
+ * \brief Closing the Pipe
+ *
+ * This function Closes the the pipe created between a terminal host's gate and
+ * destination host's gate
+ *
+ */
+
+NFCSTATUS
+phHciNfc_Close_Pipe(
+ phHciNfc_sContext_t *psHciContext,
+ void *pHwRef,
+ phHciNfc_Pipe_Info_t *pPipeHandle
+ )
+{
+ uint8_t pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID;
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ NFCSTATUS cmd_status = NFCSTATUS_SUCCESS;
+
+ if( (NULL == psHciContext)
+ || ( NULL == pHwRef )
+ || ( NULL == pPipeHandle )
+ )
+ {
+ status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ /* Obtain the pipe_id from the pipe_handle */
+ pipe_id = pPipeHandle->pipe.pipe_id;
+
+ if( (uint8_t)HCI_UNKNOWN_PIPE_ID > pipe_id)
+ {
+ cmd_status = phHciNfc_Send_Generic_Cmd(
+ psHciContext, pHwRef, pipe_id,
+ ANY_CLOSE_PIPE );
+
+ status = ((cmd_status == NFCSTATUS_PENDING)?
+ NFCSTATUS_SUCCESS : cmd_status);
+ }
+ }
+ return status;
+}