/* * 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 #include #include #include #include #include #include #include #include #include #include #ifdef TYPE_B #include #endif #ifdef TYPE_FELICA #include #endif #ifdef TYPE_JEWEL #include #endif #ifdef TYPE_ISO15693 #include #endif #ifdef ENABLE_P2P #include #endif #ifdef HOST_EMULATION #include #include #endif #include #include /* ****************************** 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); #ifndef HOST_EMULATION status = ((NFCSTATUS_PENDING == status )? NFCSTATUS_SUCCESS : status); #endif } break; } #ifdef HOST_EMULATION 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) #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_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) #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 //HOST_EMULATION /* 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) { #ifdef HOST_EMULATION *pPipeSeq = PIPE_CARD_A_CREATE; #else *pPipeSeq = PIPE_DELETE_ALL; #endif } 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; }