| /* |
| * 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; |
| } |