/* * 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_RFReader.c * * \brief HCI RF Reader Management Gate Routines. * * * * * * Project: NFC-FRI-1.1 * * * * $Date: Wed Apr 21 12:21:15 2010 $ * * $Author: ing07385 $ * * $Revision: 1.53 $ * * $Aliases: NFC_FRI1.1_WK1007_R33_6 $ * * * * =========================================================================== * */ /* ***************************** Header File Inclusion **************************** */ #include <phNfcConfig.h> #include <phNfcCompId.h> #include <phHciNfc_Pipe.h> #include <phHciNfc_RFReader.h> #include <phHciNfc_RFReaderA.h> #ifdef TYPE_B #include <phHciNfc_RFReaderB.h> #endif #ifdef ENABLE_P2P #include <phHciNfc_NfcIPMgmt.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 TYPE_ISO15693 */ #include <phOsalNfc.h> /* ****************************** Macro Definitions ******************************* */ #define NFCIP_ACTIVATE_DELAY 0x05U uint8_t nxp_nfc_isoxchg_timeout = NXP_ISO_XCHG_TIMEOUT; /* *************************** Structure and Enumeration *************************** */ /** \defgroup grp_hci_nfc HCI Reader RF Management Component * * */ typedef enum phHciNfc_ReaderMgmt_Seq{ READERA_PIPE_OPEN = 0x00U, READERB_PIPE_OPEN, FELICA_PROP_PIPE_OPEN, JEWEL_PROP_PIPE_OPEN, ISO15693_PROP_PIPE_OPEN, NFCIP1_INITIATOR_PIPE_OPEN, NFCIP1_INITIATOR_MODE_CONFIG, NFCIP1_INITIATOR_PSL1_CONFIG, NFCIP1_INITIATOR_PSL2_CONFIG, READERA_DISABLE_AUTO_ACTIVATE, READERA_PIPE_CLOSE, READERB_PIPE_CLOSE, FELICA_PROP_PIPE_CLOSE, JEWEL_PROP_PIPE_CLOSE, ISO15693_PROP_PIPE_CLOSE, NFCIP1_INITIATOR_PIPE_CLOSE, END_READER_SEQUENCE } phHciNfc_ReaderMgmt_Seq_t; typedef struct phHciNfc_ReaderMgmt_Info{ phHciNfc_ReaderMgmt_Seq_t rf_gate_cur_seq; phHciNfc_ReaderMgmt_Seq_t rf_gate_next_seq; } phHciNfc_ReaderMgmt_Info_t; /* *************************** Static Function Declaration ************************** */ static NFCSTATUS phHciNfc_ReaderMgmt_End_Discovery( phHciNfc_sContext_t *psHciContext, void *pHwRef, uint8_t reader_pipe_id ); static NFCSTATUS phHciNfc_ReaderMgmt_Initiate_Discovery( phHciNfc_sContext_t *psHciContext, void *pHwRef, uint8_t reader_pipe_id ); /* *************************** Function Definitions *************************** */ #ifdef READER_INIT /*! * \brief Allocates the resources of RF Reader Managment Gate. * * This function Allocates the resources of the RF Reader Management * gate Information Structure. * */ NFCSTATUS phHciNfc_ReaderMgmt_Init_Resources( phHciNfc_sContext_t *psHciContext ) { NFCSTATUS status = NFCSTATUS_SUCCESS; phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL; if( NULL == psHciContext ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { if( ( NULL == psHciContext->p_reader_mgmt_info ) && (phHciNfc_Allocate_Resource((void **)(&p_reader_mgmt_info), sizeof(phHciNfc_ReaderMgmt_Info_t))== NFCSTATUS_SUCCESS) ) { psHciContext->p_reader_mgmt_info = p_reader_mgmt_info; p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_OPEN; p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE; } else { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES); } } return status; } #endif /*! * \brief Updates the Sequence of RF Reader Managment Gate. * * This function Resets/Updates the sequence of the RF Reader Management * gate. * */ NFCSTATUS phHciNfc_ReaderMgmt_Update_Sequence( phHciNfc_sContext_t *psHciContext, phHciNfc_eSeqType_t reader_seq ) { NFCSTATUS status = NFCSTATUS_SUCCESS; phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info = NULL; if( NULL == psHciContext ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { if( NULL == psHciContext->p_reader_mgmt_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); } else { p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *) psHciContext->p_reader_mgmt_info ; switch(reader_seq) { case RESET_SEQ: case INIT_SEQ: { p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_OPEN; p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE; break; } case UPDATE_SEQ: { p_reader_mgmt_info->rf_gate_cur_seq = p_reader_mgmt_info->rf_gate_next_seq; break; } case INFO_SEQ: { status = phHciNfc_ReaderA_Update_Info(psHciContext, HCI_READER_A_INFO_SEQ, NULL); #if defined( TYPE_B ) status = phHciNfc_ReaderB_Update_Info(psHciContext, HCI_READER_B_INFO_SEQ, NULL); #endif /* end of #if defined(TYPE_B) */ #if defined( TYPE_FELICA ) status = phHciNfc_Felica_Update_Info(psHciContext, HCI_FELICA_INFO_SEQ, NULL); #endif /* end of #if defined(TYPE_FELICA) */ #if defined( TYPE_JEWEL ) status = phHciNfc_Jewel_Update_Info(psHciContext, HCI_JEWEL_INFO_SEQ, NULL); #endif /* end of #if defined(TYPE_JEWEL) */ #if defined( TYPE_ISO15693 ) status = phHciNfc_ISO15693_Update_Info(psHciContext, HCI_ISO_15693_INFO_SEQ, NULL); #endif /* end of #if defined(TYPE_ISO15693) */ break; } case REL_SEQ: { p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_CLOSE; p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE; break; } default: { break; } } } } return status; } /*! * \brief Initialisation of RF Reader Managment Gate. * * This function initialses the RF Reader Management gate and * populates the Reader Management Information Structure * */ NFCSTATUS phHciNfc_ReaderMgmt_Initialise( phHciNfc_sContext_t *psHciContext, void *pHwRef ) { NFCSTATUS status = NFCSTATUS_SUCCESS; phHciNfc_Pipe_Info_t *p_pipe_info = NULL; phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL; if( NULL == psHciContext ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { if( ( NULL == psHciContext->p_reader_mgmt_info ) && (phHciNfc_Allocate_Resource((void **)(&p_reader_mgmt_info), sizeof(phHciNfc_ReaderMgmt_Info_t))== NFCSTATUS_SUCCESS) ) { psHciContext->p_reader_mgmt_info = p_reader_mgmt_info; p_reader_mgmt_info->rf_gate_cur_seq = READERA_PIPE_OPEN; p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE; } else { p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *) psHciContext->p_reader_mgmt_info ; } if( NULL == psHciContext->p_reader_mgmt_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INSUFFICIENT_RESOURCES); } #ifdef ESTABLISH_SESSION else if( hciMode_Session == psHciContext->hci_mode ) { status = NFCSTATUS_SUCCESS; } #endif else { switch(p_reader_mgmt_info->rf_gate_cur_seq ) { /* Reader A pipe open sequence */ case READERA_PIPE_OPEN: { p_pipe_info = ((phHciNfc_ReaderA_Info_t *) psHciContext->p_reader_a_info)->p_pipe_info; if(NULL == p_pipe_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); } else { status = phHciNfc_Open_Pipe( psHciContext, pHwRef, p_pipe_info ); if(status == NFCSTATUS_SUCCESS) { uint8_t rdr_enable = TRUE; status = phHciNfc_ReaderA_Update_Info( psHciContext, HCI_READER_A_ENABLE, &rdr_enable); #if defined( TYPE_B ) && defined ( ENABLE_AUTO_ACTIVATE ) p_reader_mgmt_info->rf_gate_next_seq = READERB_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #ifdef TYPE_B */ #elif !defined( ENABLE_AUTO_ACTIVATE ) p_reader_mgmt_info->rf_gate_next_seq = READERA_DISABLE_AUTO_ACTIVATE; status = NFCSTATUS_PENDING; /* #ifdef ENABLE_AUTO_ACTIVATE */ #elif defined( ENABLE_P2P ) p_reader_mgmt_info->rf_gate_next_seq = NFCIP1_INITIATOR_PIPE_OPEN; status = NFCSTATUS_PENDING; /* #ifdef ENABLE_P2P */ #else p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE; /* status = NFCSTATUS_PENDING; */ #endif } } break; } /* Reader A Auto Activate Disable */ case READERA_DISABLE_AUTO_ACTIVATE: { uint8_t activate_enable = FALSE; p_pipe_info = ((phHciNfc_ReaderA_Info_t *) psHciContext->p_reader_a_info)->p_pipe_info; if(NULL == p_pipe_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); } else { status = phHciNfc_ReaderA_Auto_Activate( psHciContext, pHwRef, activate_enable ); if(status == NFCSTATUS_SUCCESS) { #if defined (TYPE_B) p_reader_mgmt_info->rf_gate_next_seq = READERB_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #ifdef TYPE_B */ #elif defined(TYPE_FELICA) p_reader_mgmt_info->rf_gate_next_seq = FELICA_PROP_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #elif defined(TYPE_FELICA) */ #elif defined(TYPE_JEWEL) p_reader_mgmt_info->rf_gate_next_seq = JEWEL_PROP_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #elif defined(TYPE_JEWEL) */ #elif defined (TYPE_ISO15693) p_reader_mgmt_info->rf_gate_next_seq = ISO15693_PROP_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #elif defined(TYPE_ISO15693) */ #elif defined(ENABLE_P2P) p_reader_mgmt_info->rf_gate_next_seq = NFCIP1_INITIATOR_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #ifdef ENABLE_P2P */ #else p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE; /* status = NFCSTATUS_PENDING; */ #endif /* #if !defined(ENABLE_P2P) && !defined(TYPE_B)*/ } } break; } #ifdef TYPE_B /* Reader B pipe open sequence */ case READERB_PIPE_OPEN: { p_pipe_info = ((phHciNfc_ReaderB_Info_t *) psHciContext->p_reader_b_info)->p_pipe_info; if(NULL == p_pipe_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); } else { status = phHciNfc_Open_Pipe( psHciContext, pHwRef, p_pipe_info ); if(status == NFCSTATUS_SUCCESS) { #if defined(TYPE_FELICA) p_reader_mgmt_info->rf_gate_next_seq = FELICA_PROP_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #ifdef TYPE_FELICA */ #elif defined(TYPE_JEWEL) p_reader_mgmt_info->rf_gate_next_seq = JEWEL_PROP_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #elif defined(TYPE_JEWEL) */ #elif defined (TYPE_ISO15693) p_reader_mgmt_info->rf_gate_next_seq = ISO15693_PROP_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #elif defined(TYPE_ISO15693) */ #elif defined(ENABLE_P2P) p_reader_mgmt_info->rf_gate_next_seq = NFCIP1_INITIATOR_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #ifdef ENABLE_P2P */ #else p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE; /* status = NFCSTATUS_PENDING; */ #endif /* #if !defined(ENABLE_P2P) && !defined(TYPE_FELICA)*/ } } break; } #endif /* #ifdef TYPE_B */ #ifdef TYPE_FELICA /* Felica Reader pipe open sequence */ case FELICA_PROP_PIPE_OPEN: { p_pipe_info = ((phHciNfc_Felica_Info_t *) psHciContext->p_felica_info)->p_pipe_info; if(NULL == p_pipe_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); } else { status = phHciNfc_Open_Pipe( psHciContext, pHwRef, p_pipe_info ); if(status == NFCSTATUS_SUCCESS) { #if defined(TYPE_JEWEL) p_reader_mgmt_info->rf_gate_next_seq = JEWEL_PROP_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #if defined(TYPE_JEWEL) */ #elif defined (TYPE_ISO15693) p_reader_mgmt_info->rf_gate_next_seq = ISO15693_PROP_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #elif defined(TYPE_ISO15693) */ #elif defined(ENABLE_P2P) p_reader_mgmt_info->rf_gate_next_seq = NFCIP1_INITIATOR_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #ifdef ENABLE_P2P */ #else p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE; /* status = NFCSTATUS_PENDING; */ #endif /* #if !defined(ENABLE_P2P) */ } } break; } #endif #ifdef TYPE_JEWEL /* Jewel Reader pipe open sequence */ case JEWEL_PROP_PIPE_OPEN: { p_pipe_info = ((phHciNfc_Jewel_Info_t *) psHciContext->p_jewel_info)->p_pipe_info; if(NULL == p_pipe_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); } else { status = phHciNfc_Open_Pipe( psHciContext, pHwRef, p_pipe_info ); if(status == NFCSTATUS_SUCCESS) { #if defined (TYPE_ISO15693) p_reader_mgmt_info->rf_gate_next_seq = ISO15693_PROP_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #if defined(TYPE_ISO15693) */ #elif defined (ENABLE_P2P) p_reader_mgmt_info->rf_gate_next_seq = NFCIP1_INITIATOR_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #ifdef ENABLE_P2P */ #else p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE; /* status = NFCSTATUS_PENDING; */ #endif /* #if !defined(ENABLE_P2P) */ } } break; } #endif #ifdef TYPE_ISO15693 /* ISO15693 Reader pipe open sequence */ case ISO15693_PROP_PIPE_OPEN: { p_pipe_info = ((phHciNfc_ISO15693_Info_t *) psHciContext->p_iso_15693_info)->ps_15693_pipe_info; if(NULL == p_pipe_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); } else { status = phHciNfc_Open_Pipe( psHciContext, pHwRef, p_pipe_info ); if(status == NFCSTATUS_SUCCESS) { #ifdef ENABLE_P2P p_reader_mgmt_info->rf_gate_next_seq = NFCIP1_INITIATOR_PIPE_OPEN; status = NFCSTATUS_PENDING; /* end of #ifdef ENABLE_P2P */ #else p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE; /* status = NFCSTATUS_PENDING; */ #endif /* #if !defined(ENABLE_P2P) */ } } break; } #endif #ifdef ENABLE_P2P /* NFC-IP1 Initiator pipe open sequence */ case NFCIP1_INITIATOR_PIPE_OPEN: { p_pipe_info = ((phHciNfc_NfcIP_Info_t *)psHciContext-> p_nfcip_info)->p_init_pipe_info; if(NULL == p_pipe_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); } else { status = phHciNfc_Open_Pipe( psHciContext, pHwRef, p_pipe_info ); if(status == NFCSTATUS_SUCCESS) { p_reader_mgmt_info->rf_gate_next_seq = NFCIP1_INITIATOR_MODE_CONFIG; status = NFCSTATUS_PENDING; } } break; } case NFCIP1_INITIATOR_MODE_CONFIG: { uint8_t mode = DEFAULT_NFCIP_INITIATOR_MODE_SUPPORT; status = phHciNfc_NfcIP_SetMode( psHciContext, pHwRef, NFCIP_INITIATOR, mode); if(status == NFCSTATUS_PENDING ) { p_reader_mgmt_info->rf_gate_next_seq = NFCIP1_INITIATOR_PSL1_CONFIG; /* status = NFCSTATUS_SUCCESS; */ } break; } case NFCIP1_INITIATOR_PSL1_CONFIG: { uint8_t psl_config = NXP_NFCIP_PSL_BRS_DEFAULT; status = phHciNfc_NfcIP_SetPSL1( psHciContext, pHwRef, psl_config); if(status == NFCSTATUS_PENDING ) { p_reader_mgmt_info->rf_gate_next_seq = END_READER_SEQUENCE; status = NFCSTATUS_SUCCESS; } break; } #endif default: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); break; } }/* End of the Sequence Switch */ }/* End of the Reader Info Memory Check */ } /* End of Null Context Check */ return status; } /*! * \brief Initiate the Discovery for the RF Reader . * * This function starts the Polling Loop and initiates the discovery * of the Target. * */ static NFCSTATUS phHciNfc_ReaderMgmt_Initiate_Discovery( phHciNfc_sContext_t *psHciContext, void *pHwRef, uint8_t reader_pipe_id ) { NFCSTATUS status = NFCSTATUS_SUCCESS; if( ( NULL == psHciContext ) || ( NULL == pHwRef ) || ( HCI_UNKNOWN_PIPE_ID == reader_pipe_id) ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { status = phHciNfc_Send_RFReader_Event ( psHciContext, pHwRef, reader_pipe_id,(uint8_t) EVT_READER_REQUESTED ); status = ( (status == NFCSTATUS_PENDING)? NFCSTATUS_SUCCESS : status); } return status; } /*! * \brief End the Discovery of the RF Reader . * * This function stops the Polling Loop and ends the discovery * of the Target. * */ static NFCSTATUS phHciNfc_ReaderMgmt_End_Discovery( phHciNfc_sContext_t *psHciContext, void *pHwRef, uint8_t reader_pipe_id ) { NFCSTATUS status = NFCSTATUS_SUCCESS; if( ( NULL == psHciContext ) || ( NULL == pHwRef ) || ( HCI_UNKNOWN_PIPE_ID == reader_pipe_id) ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { status = phHciNfc_Send_RFReader_Event ( psHciContext, pHwRef, reader_pipe_id,(uint8_t) EVT_END_OPERATION ); status = ( (status == NFCSTATUS_PENDING)? NFCSTATUS_SUCCESS : status); } return status; } /*! * \brief Enable the Discovery of RF Reader Managment Gate. * * This function Enable the discovery of the RF Reader Management * gate. * */ NFCSTATUS phHciNfc_ReaderMgmt_Enable_Discovery( phHciNfc_sContext_t *psHciContext, void *pHwRef ) { NFCSTATUS status = NFCSTATUS_SUCCESS; phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL; uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; /* phHal_sADD_Cfg_t *p_poll_config = (phHal_sADD_Cfg_t * ) psHciContext->p_config_params; */ PHNFC_UNUSED_VARIABLE(p_reader_mgmt_info); if( NULL != psHciContext->p_reader_mgmt_info ) { uint8_t rdr_enable = FALSE; p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *) psHciContext->p_reader_mgmt_info ; #ifdef TYPE_B if ( (NULL != psHciContext->p_reader_b_info ) /* && (FALSE == rdr_enable) */ ) { /* Get the Reader B Pipe ID */ status = phHciNfc_ReaderB_Get_PipeID (psHciContext, &reader_pipe_id); if( NFCSTATUS_SUCCESS == status ) { rdr_enable = (uint8_t)TRUE; /* rdr_enable = (uint8_t) p_poll_config->PollDevInfo.PollCfgInfo.EnableIso14443B; */ status = phHciNfc_ReaderB_Update_Info(psHciContext, HCI_RDR_ENABLE_TYPE, &rdr_enable); } } #endif #ifdef TYPE_FELICA if ( (NULL != psHciContext->p_felica_info ) /* && (FALSE == rdr_enable) */ ) { /* Get the Reader F Pipe ID */ status = phHciNfc_Felica_Get_PipeID (psHciContext, &reader_pipe_id); if( NFCSTATUS_SUCCESS == status ) { rdr_enable = (uint8_t)TRUE; /* rdr_enable = (uint8_t) ( p_poll_config->PollDevInfo.PollCfgInfo.EnableFelica212 || p_poll_config->PollDevInfo.PollCfgInfo.EnableFelica424 ); */ status = phHciNfc_Felica_Update_Info(psHciContext, HCI_RDR_ENABLE_TYPE, &rdr_enable); } } #endif #ifdef TYPE_JEWEL if ( (NULL != psHciContext->p_jewel_info ) /* && (FALSE == rdr_enable) */ ) { /* Get the Reader F Pipe ID */ status = phHciNfc_Jewel_Get_PipeID (psHciContext, &reader_pipe_id); if( NFCSTATUS_SUCCESS == status ) { rdr_enable = (uint8_t)TRUE; status = phHciNfc_Jewel_Update_Info(psHciContext, HCI_RDR_ENABLE_TYPE, &rdr_enable); } } #endif /* #ifdef TYPE_JEWEL */ #if defined(TYPE_ISO15693) if ( (NULL != psHciContext->p_iso_15693_info ) /* && (FALSE == rdr_enable) */ ) { /* Get the Reader F Pipe ID */ status = phHciNfc_ISO15693_Get_PipeID (psHciContext, &reader_pipe_id); if( NFCSTATUS_SUCCESS == status ) { rdr_enable = (uint8_t)TRUE; status = phHciNfc_ISO15693_Update_Info(psHciContext, HCI_RDR_ENABLE_TYPE, &rdr_enable); } } /* end of #elif defined(TYPE_ISO15693) */ #endif if(NULL != psHciContext->p_reader_a_info) { /* Get the Reader A Pipe ID */ status = phHciNfc_ReaderA_Get_PipeID (psHciContext, &reader_pipe_id); if( NFCSTATUS_SUCCESS == status ) { rdr_enable = (uint8_t)TRUE; status = phHciNfc_ReaderA_Update_Info(psHciContext, HCI_RDR_ENABLE_TYPE, &rdr_enable); } } if( ( NFCSTATUS_SUCCESS == status ) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { status = phHciNfc_ReaderMgmt_Initiate_Discovery( psHciContext, pHwRef, reader_pipe_id); } }/* End of the Reader Info Memory Check */ return status; } /*! * \brief Disable the Discovery of RF Reader Managment Gate. * * This function Disable the discovery of the RF Reader Management * gate. * */ NFCSTATUS phHciNfc_ReaderMgmt_Disable_Discovery( phHciNfc_sContext_t *psHciContext, void *pHwRef ) { NFCSTATUS status = NFCSTATUS_FAILED; phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL; uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; /* phHal_sADD_Cfg_t *p_poll_config = (phHal_sADD_Cfg_t * ) psHciContext->p_config_params; */ PHNFC_UNUSED_VARIABLE(p_reader_mgmt_info); if( NULL != psHciContext->p_reader_mgmt_info ) { p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *) psHciContext->p_reader_mgmt_info ; if(NULL != psHciContext->p_reader_a_info) { /* Get the Reader A Pipe ID */ status = phHciNfc_ReaderA_Get_PipeID (psHciContext, &reader_pipe_id); #if 0 if( NFCSTATUS_SUCCESS == status ) { uint8_t rdr_enable = (uint8_t) FALSE; status = phHciNfc_ReaderA_Update_Info(psHciContext, HCI_RDR_ENABLE_TYPE, &rdr_enable); } #endif } #ifdef TYPE_B else if((NULL != psHciContext->p_reader_b_info ) /* && (NFCSTATUS_SUCCESS != status) */ ) { /* Get the Reader B Pipe ID */ status = phHciNfc_ReaderB_Get_PipeID (psHciContext, &reader_pipe_id); } #endif #ifdef TYPE_FELICA else if((NULL != psHciContext->p_felica_info ) /* && (NFCSTATUS_SUCCESS != status) */ ) { /* Get the Reader B Pipe ID */ status = phHciNfc_Felica_Get_PipeID (psHciContext, &reader_pipe_id); } #endif #ifdef TYPE_JEWEL else if((NULL != psHciContext->p_jewel_info ) /* && (NFCSTATUS_SUCCESS != status) */ ) { /* Get the Reader B Pipe ID */ status = phHciNfc_Jewel_Get_PipeID (psHciContext, &reader_pipe_id); } #endif /* #ifdef TYPE_JEWEL */ #ifdef TYPE_ISO15693 else if((NULL != psHciContext->p_iso_15693_info ) /* && (NFCSTATUS_SUCCESS != status) */ ) { /* Get the Reader B Pipe ID */ status = phHciNfc_ISO15693_Get_PipeID (psHciContext, &reader_pipe_id); } #endif /* #ifdef TYPE_ISO15693 */ else { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_NOT_ALLOWED); } if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { status = phHciNfc_ReaderMgmt_End_Discovery( psHciContext, pHwRef, reader_pipe_id); } }/* End of the Reader Info Memory Check */ return status; } /*! * \brief Updates the Sequence of RF Reader Managment Gate. * * This function Resets/Updates the sequence of the RF Reader Management * gate. * */ NFCSTATUS phHciNfc_ReaderMgmt_Info_Sequence( phHciNfc_sContext_t *psHciContext, void *pHwRef ) { #if defined(NXP_NFCIP_ACTIVATE_DELAY) static uint8_t nfc_atr_retry = 0; #endif NFCSTATUS status = NFCSTATUS_SUCCESS; phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL; #if 0 uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; phHal_eRemDevType_t target_type = phHal_eUnknown_DevType; #endif PHNFC_UNUSED_VARIABLE(p_reader_mgmt_info); if( NULL == psHciContext ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { if( NULL != psHciContext->p_reader_mgmt_info ) { p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *) psHciContext->p_reader_mgmt_info ; switch( psHciContext->host_rf_type ) { case phHal_eISO14443_A_PCD: { /* If the Target Info is updated then the Target * is connected. */ if(NULL == psHciContext->p_target_info) { #if defined(NXP_NFCIP_ACTIVATE_DELAY) nfc_atr_retry = 0; #endif status = phHciNfc_ReaderA_Info_Sequence( psHciContext, pHwRef ); } else { status = phHciNfc_ReaderA_App_Data( psHciContext, pHwRef ); status = ((NFCSTATUS_PENDING == status )? NFCSTATUS_SUCCESS : status); } break; } #ifdef ENABLE_P2P case phHal_eNfcIP1_Initiator: { /* If the Target Info is updated then the Target * is connected. */ #ifdef NFCIP_CHECK if(NULL == psHciContext->p_target_info) #endif { status = phHciNfc_NfcIP_Info_Sequence( psHciContext, pHwRef #ifdef NOTIFY_REQD ,(NULL == psHciContext->p_target_info) #endif /* #ifdef NOTIFY_REQD */ ); } #ifdef NFCIP_CHECK else { status = phHciNfc_NfcIP_GetATRInfo( psHciContext, pHwRef, NFCIP_INITIATOR ); #if defined(NXP_NFCIP_ACTIVATE_DELAY) if ( (NFCSTATUS_PENDING == status) && ( NFCIP_ACTIVATE_DELAY <= nfc_atr_retry) ) { nfc_atr_retry = 0; status = NFCSTATUS_SUCCESS; } else { nfc_atr_retry++; } #else status = ((NFCSTATUS_PENDING == status )? NFCSTATUS_SUCCESS : status); #endif } #endif break; } #endif #ifdef TYPE_B case phHal_eISO14443_B_PCD: { if(NULL == psHciContext->p_target_info) { status = phHciNfc_ReaderB_Info_Sequence( psHciContext, pHwRef ); } break; } #endif /* #ifdef TYPE_B */ #ifdef TYPE_FELICA case phHal_eFelica_PCD: { if(NULL == psHciContext->p_target_info) { #if defined(NXP_NFCIP_ACTIVATE_DELAY) nfc_atr_retry = 0; #endif status = phHciNfc_Felica_Info_Sequence( psHciContext, pHwRef ); } break; } #endif /* #ifdef TYPE_FELICA */ #ifdef TYPE_JEWEL case phHal_eJewel_PCD: { if(NULL == psHciContext->p_target_info) { status = phHciNfc_Jewel_Info_Sequence( psHciContext, pHwRef ); } break; } #endif /* #ifdef TYPE_JEWEL */ #if defined(TYPE_ISO15693) case phHal_eISO15693_PCD: { if(NULL == psHciContext->p_target_info) { status = phHciNfc_ISO15693_Info_Sequence( psHciContext, pHwRef ); } break; } #endif default: { break; } } }/* End of the Reader Info Memory Check */ } /* End of Null Context Check */ return status; } /*! * \brief Connects the the selected tag via RF Reader Gates. * * This function connects the selected tags via RF Reader Gate. * This function uses the RF Reader gate based on the type of the * tag specified. */ NFCSTATUS phHciNfc_ReaderMgmt_Select( phHciNfc_sContext_t *psHciContext, void *pHwRef, phHal_eRemDevType_t target_type ) { NFCSTATUS status = NFCSTATUS_SUCCESS; uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; if( (NULL == psHciContext) || (NULL == pHwRef) ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { switch (target_type) { case phHal_eMifare_PICC: case phHal_eISO14443_3A_PICC: { /* Get the Reader A Pipe ID */ status = phHciNfc_ReaderA_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { status = phHciNfc_ReaderMgmt_Reactivate( psHciContext, pHwRef, target_type ); } break; } case phHal_eISO14443_A_PICC: case phHal_eISO14443_4A_PICC: { #ifdef ENABLE_AUTO_ACTIVATE /* Get the Reader A Pipe ID */ status = phHciNfc_ReaderA_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { status = phHciNfc_Send_RFReader_Command (psHciContext, pHwRef, reader_pipe_id, NXP_WR_PRESCHECK ); } #else status = phHciNfc_ReaderA_Cont_Activate( psHciContext, pHwRef); #endif /* #ifdef ENABLE_AUTO_ACTIVATE */ break; } #ifdef TYPE_B case phHal_eISO14443_B_PICC: case phHal_eISO14443_4B_PICC: { /* Get the Reader B Pipe ID */ status = phHciNfc_ReaderB_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { status = phHciNfc_Send_RFReader_Command (psHciContext, pHwRef, reader_pipe_id, NXP_WR_PRESCHECK ); /* status = phHciNfc_ReaderA_Set_DataRateMax( psHciContext, pHwRef, DATA_RATE_MAX_DEFAULT_VALUE ); */ /* status = phHciNfc_ReaderMgmt_Reactivate( psHciContext, pHwRef, target_type ); */ } break; } #endif /* #ifdef TYPE_B */ #ifdef TYPE_FELICA case phHal_eFelica_PICC: { status = phHciNfc_Felica_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { /* Get the Reader Felica Pipe ID */ /* status = phHciNfc_ReaderA_Set_DataRateMax( psHciContext, pHwRef, DATA_RATE_MAX_DEFAULT_VALUE ); */ status = phHciNfc_ReaderMgmt_Reactivate( psHciContext, pHwRef, target_type ); } break; } #endif /* #ifdef TYPE_FELICA */ #ifdef TYPE_JEWEL case phHal_eJewel_PICC: { /* Get the Reader jewel Pipe ID */ status = phHciNfc_Jewel_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { status = phHciNfc_Jewel_GetRID( psHciContext, pHwRef); } break; } #endif /* #ifdef TYPE_JEWEL */ #ifdef TYPE_ISO15693 case phHal_eISO15693_PICC: { /* Get the Reader ISO 15693 Pipe ID */ status = phHciNfc_ISO15693_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { /* TODO */ status = phHciNfc_ReaderA_Set_DataRateMax( psHciContext, pHwRef, DATA_RATE_MAX_DEFAULT_VALUE ); } break; } #endif /* #ifdef TYPE_ISO15693 */ #ifdef ENABLE_P2P case phHal_eNfcIP1_Target: { if ( (phHal_eISO14443_A_PCD == psHciContext->host_rf_type ) || (phHal_eFelica_PCD == psHciContext->host_rf_type ) ) { status = phHciNfc_Initiator_Cont_Activate( psHciContext, pHwRef); } else { status = phHciNfc_NfcIP_Presence_Check (psHciContext, pHwRef); } break; } #endif #if 0 case phHal_eNfcIP1_Initiator: { break; } #endif default: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); break; } } /* End of the tag_type Switch */ } return status; } NFCSTATUS phHciNfc_ReaderMgmt_UICC_Dispatch( phHciNfc_sContext_t *psHciContext, void *pHwRef, phHal_eRemDevType_t target_type ) { NFCSTATUS status = NFCSTATUS_SUCCESS; uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; phHciNfc_Pipe_Info_t *p_pipe_info = NULL; if( (NULL == psHciContext) || (NULL == pHwRef) ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else if (NULL == psHciContext->p_target_info) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); } else { switch (target_type) { case phHal_eISO14443_A_PICC: case phHal_eISO14443_4A_PICC: { /* Get the Reader A Pipe ID */ status = phHciNfc_ReaderA_Get_PipeID( psHciContext, &reader_pipe_id); p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; p_pipe_info->param_info = &psHciContext->p_target_info-> RemoteDevInfo.Iso14443A_Info.Uid; p_pipe_info->param_length = psHciContext->p_target_info-> RemoteDevInfo.Iso14443A_Info.UidLength; break; } #ifdef TYPE_B case phHal_eISO14443_B_PICC: case phHal_eISO14443_4B_PICC: { /* Get the Reader B Pipe ID */ status = phHciNfc_ReaderB_Get_PipeID (psHciContext, &reader_pipe_id); p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; p_pipe_info->param_info = &psHciContext->p_target_info-> RemoteDevInfo.Iso14443B_Info.AtqB.AtqResInfo.Pupi; p_pipe_info->param_length = PHHAL_PUPI_LENGTH; break; } #endif /* #ifdef TYPE_B */ case phHal_eMifare_PICC: case phHal_eISO14443_3A_PICC: default: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); break; } } /* End of the tag_type Switch */ } if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { status = phHciNfc_Send_RFReader_Command (psHciContext, pHwRef, reader_pipe_id, NXP_WR_DISPATCH_TO_UICC ); } return status; } NFCSTATUS phHciNfc_ReaderMgmt_Reactivate( phHciNfc_sContext_t *psHciContext, void *pHwRef, phHal_eRemDevType_t target_type ) { NFCSTATUS status = NFCSTATUS_SUCCESS; uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; phHciNfc_Pipe_Info_t *p_pipe_info = NULL; if( (NULL == psHciContext) || (NULL == pHwRef) ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else if (NULL == psHciContext->p_target_info) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); } else { switch (target_type) { case phHal_eISO14443_A_PICC: case phHal_eMifare_PICC: case phHal_eISO14443_4A_PICC: case phHal_eISO14443_3A_PICC: { /* Get the Reader A Pipe ID */ status = phHciNfc_ReaderA_Get_PipeID( psHciContext, &reader_pipe_id); p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; p_pipe_info->param_info = &psHciContext->p_target_info-> RemoteDevInfo.Iso14443A_Info.Uid; p_pipe_info->param_length = psHciContext->p_target_info-> RemoteDevInfo.Iso14443A_Info.UidLength; break; } #ifdef TYPE_B case phHal_eISO14443_B_PICC: case phHal_eISO14443_4B_PICC: { /* Get the Reader B Pipe ID */ status = phHciNfc_ReaderB_Get_PipeID (psHciContext, &reader_pipe_id); p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; p_pipe_info->param_info = &psHciContext->p_target_info-> RemoteDevInfo.Iso14443B_Info.AtqB.AtqResInfo.Pupi; p_pipe_info->param_length = PHHAL_PUPI_LENGTH; break; } #endif /* #ifdef TYPE_B */ #ifdef TYPE_FELICA case phHal_eFelica_PICC: { /* Get the Felica Reader Pipe ID */ status = phHciNfc_Felica_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; p_pipe_info->param_info = &psHciContext->p_target_info-> RemoteDevInfo.Felica_Info.IDm; p_pipe_info->param_length = PHHAL_FEL_ID_LEN; } break; } #endif /* #ifdef TYPE_FELICA */ #ifdef ENABLE_P2P case phHal_eNfcIP1_Target: { /* Get the Initiator Pipe ID */ status = phHciNfc_Initiator_Get_PipeID( psHciContext, &reader_pipe_id); p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; p_pipe_info->param_info = &psHciContext->p_target_info-> RemoteDevInfo.NfcIP_Info.NFCID; p_pipe_info->param_length = psHciContext->p_target_info-> RemoteDevInfo.NfcIP_Info.NFCID_Length; break; } case phHal_eNfcIP1_Initiator: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); break; } #endif /* #ifdef ENABLE_P2P */ default: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); break; } } /* End of the tag_type Switch */ } if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { status = phHciNfc_Send_RFReader_Command (psHciContext, pHwRef, reader_pipe_id, NXP_WR_ACTIVATE_ID ); } return status; } /*! * \brief Activates the next Remote Target in the field. * * This function selects and activates the next tag present in the field. */ NFCSTATUS phHciNfc_ReaderMgmt_Activate_Next( phHciNfc_sContext_t *psHciContext, void *pHwRef ) { NFCSTATUS status = NFCSTATUS_SUCCESS; /* phHciNfc_Pipe_Info_t *p_pipe_info = NULL; */ uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; if( (NULL == psHciContext) || (NULL == pHwRef) ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { switch ( psHciContext->host_rf_type ) { case phHal_eISO14443_A_PCD: { /* Get the Reader A Pipe ID */ status = phHciNfc_ReaderA_Get_PipeID (psHciContext, &reader_pipe_id); break; } #ifdef TYPE_B case phHal_eISO14443_B_PCD: { /* Get the Reader B Pipe ID */ status = phHciNfc_ReaderB_Get_PipeID (psHciContext, &reader_pipe_id); break; } #endif /* #ifdef TYPE_B */ #ifdef TYPE_FELICA case phHal_eFelica_PCD: { /* Get the Felica Reader Pipe ID */ status = phHciNfc_Felica_Get_PipeID (psHciContext, &reader_pipe_id); break; } #endif /* #ifdef TYPE_FELICA */ #ifdef TYPE_ISO15693 case phHal_eISO15693_PCD: { /* Get the ISO 15693 Reader Pipe ID */ status = phHciNfc_ISO15693_Get_PipeID (psHciContext, &reader_pipe_id); break; } #endif /* #ifdef TYPE_ISO15693 */ default: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); break; } } /* End of the reader_type Switch */ if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { status = phHciNfc_Send_RFReader_Command (psHciContext, pHwRef, reader_pipe_id, NXP_WR_ACTIVATE_NEXT ); } } return status; } /*! * \brief Checks the presence of the Remote Target in the field. * * This function checks the presence of the tag present in the field. */ NFCSTATUS phHciNfc_ReaderMgmt_Presence_Check( phHciNfc_sContext_t *psHciContext, void *pHwRef ) { NFCSTATUS status = NFCSTATUS_SUCCESS; /* phHciNfc_Pipe_Info_t *p_pipe_info = NULL; */ uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; phHal_eRemDevType_t target_type = phHal_eUnknown_DevType; if( (NULL == psHciContext) || (NULL == pHwRef) ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { target_type = psHciContext->p_target_info->RemDevType; switch (target_type) { case phHal_eMifare_PICC: case phHal_eISO14443_3A_PICC: { /* Get the Reader A Pipe ID */ status = phHciNfc_ReaderA_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { status = phHciNfc_ReaderMgmt_Reactivate( psHciContext, pHwRef, target_type ); } break; } case phHal_eISO14443_A_PICC: case phHal_eISO14443_4A_PICC: { /* Get the Reader A Pipe ID */ status = phHciNfc_ReaderA_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { status = phHciNfc_Send_RFReader_Command (psHciContext, pHwRef, reader_pipe_id, NXP_WR_PRESCHECK ); } break; } #ifdef ENABLE_P2P case phHal_eNfcIP1_Target: { status = phHciNfc_NfcIP_Presence_Check (psHciContext, pHwRef); break; } #endif #ifdef TYPE_B case phHal_eISO14443_B_PICC: case phHal_eISO14443_4B_PICC: { /* Get the Reader B Pipe ID */ status = phHciNfc_ReaderB_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { status = phHciNfc_Send_RFReader_Command (psHciContext, pHwRef, reader_pipe_id, NXP_WR_PRESCHECK ); } break; } #endif /* #ifdef TYPE_B */ #ifdef TYPE_FELICA case phHal_eFelica_PICC: { /* Get the Felica Reader Pipe ID */ status = phHciNfc_Felica_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { status = phHciNfc_Felica_Request_Mode(psHciContext, pHwRef); } break; } #endif /* #ifdef TYPE_FELICA */ #ifdef TYPE_JEWEL case phHal_eJewel_PICC: { /* Get the Jewel Reader Pipe ID */ status = phHciNfc_Jewel_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { /* status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); */ status = phHciNfc_Jewel_GetRID( psHciContext, pHwRef); } break; } #endif /* #ifdef TYPE_JEWEL */ #ifdef TYPE_ISO15693 case phHal_eISO15693_PICC: { /* Get the Reader ISO 15693 Pipe ID */ status = phHciNfc_ISO15693_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { uint8_t cmd[11]; phHciNfc_Pipe_Info_t *p_pipe_info = NULL; p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; p_pipe_info->param_info = &cmd; p_pipe_info->param_length = 11; // masked inventory command: // set #slots to 1 to use mask without padding, // need to set inventory flag to enable setting #slots cmd[0] = 0x04 | 0x20; // FLAG_INVENTORY | FLAG_SLOTS cmd[1] = 0x01; // CMD_INVENTORY cmd[2] = 64; // mask bit-length memcpy(cmd + 3, &(psHciContext->p_target_info->RemoteDevInfo.Iso15693_Info.Uid), 8); status = phHciNfc_Send_ISO15693_Command( psHciContext, pHwRef ,reader_pipe_id, NXP_ISO15693_CMD ); } break; } #endif /* #ifdef TYPE_ISO15693 */ default: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); break; } } /* End of the tag_type Switch */ } return status; } /*! * \brief Disconnects the the selected tag. * * This function disconnects the selected tags via RF Reader Gate. * This function uses the RF Reader gate based on the type of the * tag specified. */ NFCSTATUS phHciNfc_ReaderMgmt_Deselect( phHciNfc_sContext_t *psHciContext, void *pHwRef, phHal_eRemDevType_t target_type, uint8_t re_poll ) { static uint8_t rls_param = FALSE; NFCSTATUS status = NFCSTATUS_SUCCESS; uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; phHciNfc_Pipe_Info_t *p_pipe_info = NULL; if( (NULL == psHciContext) || (NULL == pHwRef) ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { rls_param = re_poll; switch (target_type) { case phHal_eMifare_PICC: case phHal_eISO14443_A_PICC: case phHal_eISO14443_3A_PICC: case phHal_eISO14443_4A_PICC: { /* Get the Reader A Pipe ID */ status = phHciNfc_ReaderA_Get_PipeID (psHciContext, &reader_pipe_id); break; } #ifdef TYPE_B case phHal_eISO14443_B_PICC: case phHal_eISO14443_4B_PICC: { /* Get the Reader B Pipe ID */ status = phHciNfc_ReaderB_Get_PipeID (psHciContext, &reader_pipe_id); break; } #endif /* #ifdef TYPE_B */ #ifdef TYPE_FELICA case phHal_eFelica_PICC: { /* Get the Felica Pipe ID */ status = phHciNfc_Felica_Get_PipeID (psHciContext, &reader_pipe_id); break; } #endif /* #ifdef TYPE_FELICA */ #ifdef TYPE_JEWEL case phHal_eJewel_PICC: { /* Get the Jewel Pipe ID */ status = phHciNfc_Jewel_Get_PipeID (psHciContext, &reader_pipe_id); break; } #endif /* #ifdef TYPE_JEWEL */ #ifdef TYPE_ISO15693 case phHal_eISO15693_PICC: { /* Get the ISO 15693 Pipe ID */ status = phHciNfc_ISO15693_Get_PipeID (psHciContext, &reader_pipe_id); break; } #endif /* #ifdef TYPE_ISO15693 */ #ifdef ENABLE_P2P case phHal_eNfcIP1_Target: { /* Get the Reader A Pipe ID */ status = phHciNfc_Initiator_Get_PipeID (psHciContext, &reader_pipe_id); break; } #endif default: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); break; } } /* End of the tag_type Switch */ p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) && ( NULL != p_pipe_info ) ) { if (TRUE == rls_param) { p_pipe_info->param_info = &rls_param; p_pipe_info->param_length = sizeof(rls_param); } status = phHciNfc_Send_RFReader_Event ( psHciContext, pHwRef, reader_pipe_id,(uint8_t) NXP_EVT_RELEASE_TARGET ); } } return status; } /*! * \brief Exchanges the data to/from the selected tags via RF Reader Gates. * * This function Exchanges the data to/from the selected tags * via RF Reader Gates. This function uses the RF Reader gate based on the * type of the selected tag and the type of the Reader gate specified. */ NFCSTATUS phHciNfc_ReaderMgmt_Exchange_Data( phHciNfc_sContext_t *psHciContext, void *pHwRef, phHciNfc_XchgInfo_t *p_xchg_info ) { NFCSTATUS status = NFCSTATUS_SUCCESS; phHciNfc_Pipe_Info_t *p_pipe_info = NULL; uint8_t reader_pipe_id = (uint8_t) HCI_UNKNOWN_PIPE_ID; phHal_eRemDevType_t target_type = phHal_eUnknown_DevType; if( (NULL == psHciContext) || (NULL == pHwRef) ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else if (NULL == psHciContext->p_xchg_info) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_INFORMATION); } else { switch (psHciContext->host_rf_type) { case phHal_eISO14443_A_PCD: { /* Get the Reader A Pipe ID */ status = phHciNfc_ReaderA_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; p_pipe_info->param_info = p_xchg_info->tx_buffer; p_pipe_info->param_length = p_xchg_info->tx_length; target_type = psHciContext->p_target_info->RemDevType; switch (target_type) { case phHal_eMifare_PICC: case phHal_eISO14443_3A_PICC: { if ((uint8_t)phHal_eMifareRaw == p_xchg_info->params.tag_info.cmd_type) { status = phHciNfc_Send_ReaderA_Command( psHciContext, pHwRef ,reader_pipe_id, NXP_MIFARE_RAW ); } else { status = phHciNfc_Send_ReaderA_Command( psHciContext, pHwRef, reader_pipe_id, NXP_MIFARE_CMD ); } break; } case phHal_eISO14443_A_PICC: case phHal_eISO14443_4A_PICC: { status = phHciNfc_Send_RFReader_Command( psHciContext, pHwRef, reader_pipe_id, WR_XCHGDATA ); break; } default: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); break; } } /* End of the tag_type Switch */ } /* End of Pipe ID Check */ break; } #ifdef TYPE_B case phHal_eISO14443_B_PCD: { /* Get the Reader B Pipe ID */ status = phHciNfc_ReaderB_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; p_pipe_info->param_info = p_xchg_info->tx_buffer; p_pipe_info->param_length = p_xchg_info->tx_length; status = phHciNfc_Send_RFReader_Command( psHciContext, pHwRef, reader_pipe_id, WR_XCHGDATA ); } break; } #endif /* #ifdef TYPE_B */ #ifdef TYPE_FELICA case phHal_eFelica_PCD: { /* Get the Felica Reader Pipe ID */ status = phHciNfc_Felica_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; p_pipe_info->param_info = p_xchg_info->tx_buffer; p_pipe_info->param_length = p_xchg_info->tx_length; if ((uint8_t)phHal_eFelica_Raw == p_xchg_info->params.tag_info.cmd_type) { status = phHciNfc_Send_Felica_Command( psHciContext, pHwRef ,reader_pipe_id, NXP_FELICA_RAW ); } else { status = phHciNfc_Send_Felica_Command( psHciContext, pHwRef, reader_pipe_id, NXP_FELICA_CMD ); } } break; } #endif /* #ifdef TYPE_FELICA */ #if defined(TYPE_ISO15693) case phHal_eISO15693_PCD: { /* Get the ISO15693 Reader Pipe ID */ status = phHciNfc_ISO15693_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; p_pipe_info->param_info = p_xchg_info->tx_buffer; p_pipe_info->param_length = p_xchg_info->tx_length; if (((uint8_t)phHal_eIso15693_Cmd == p_xchg_info->params.tag_info.cmd_type) #if defined(SUPPORT_ISO15693_RAW) || ((uint8_t) phHal_eIso15693_Raw == p_xchg_info->params.tag_info.cmd_type) #endif ) { status = phHciNfc_Send_ISO15693_Command( psHciContext, pHwRef ,reader_pipe_id, NXP_ISO15693_CMD ); } else { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } } break; } #endif #ifdef TYPE_JEWEL case phHal_eJewel_PCD: { /* Get the Jewel Reader Pipe ID */ status = phHciNfc_Jewel_Get_PipeID (psHciContext, &reader_pipe_id); if( (NFCSTATUS_SUCCESS == status) && (reader_pipe_id != HCI_UNKNOWN_PIPE_ID ) ) { uint8_t transact_type = 0; p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; p_pipe_info->param_info = p_xchg_info->tx_buffer; p_pipe_info->param_length = p_xchg_info->tx_length; switch(p_xchg_info->params.tag_info.cmd_type) { case phHal_eJewel_Raw: { transact_type = NXP_JEWEL_RAW; break; } case phHal_eJewel_Invalid: default: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); break; } } if(0 != transact_type) { status = phHciNfc_Send_Jewel_Command( psHciContext, pHwRef, reader_pipe_id, transact_type ); } } break; } #endif /* #ifdef TYPE_JEWEL */ default: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED); break; } }/* End of Reader Type Switch */ } return status; } /*! * \brief Releases the resources allocated the RF Reader Management. * * This function Releases the resources allocated the RF Reader Management. */ NFCSTATUS phHciNfc_ReaderMgmt_Release( phHciNfc_sContext_t *psHciContext, void *pHwRef ) { NFCSTATUS status = NFCSTATUS_SUCCESS; phHciNfc_Pipe_Info_t *p_pipe_info = NULL; phHciNfc_ReaderMgmt_Info_t *p_reader_mgmt_info=NULL; if( (NULL == psHciContext) || (NULL == pHwRef) ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); } else { if( NULL != psHciContext->p_reader_mgmt_info ) { p_reader_mgmt_info = (phHciNfc_ReaderMgmt_Info_t *) psHciContext->p_reader_mgmt_info ; switch(p_reader_mgmt_info->rf_gate_cur_seq) { /* Reader A pipe close sequence */ case READERA_PIPE_CLOSE: { p_pipe_info = ((phHciNfc_ReaderA_Info_t *) psHciContext->p_reader_a_info)->p_pipe_info; status = phHciNfc_Close_Pipe( psHciContext, pHwRef, p_pipe_info ); if(status == NFCSTATUS_SUCCESS) { p_reader_mgmt_info->rf_gate_next_seq = READERB_PIPE_CLOSE; /* status = NFCSTATUS_PENDING; */ } break; } #ifdef TYPE_B /* Reader B pipe close sequence */ case READERB_PIPE_CLOSE: { p_pipe_info = ((phHciNfc_ReaderB_Info_t *) psHciContext->p_reader_b_info)->p_pipe_info; status = phHciNfc_Close_Pipe( psHciContext, pHwRef, p_pipe_info ); if(status == NFCSTATUS_SUCCESS) { p_reader_mgmt_info->rf_gate_next_seq = FELICA_PROP_PIPE_CLOSE; status = NFCSTATUS_PENDING; } break; } #endif /* #ifdef TYPE_B */ #ifdef TYPE_FELICA /* Felica Reader pipe close sequence */ case FELICA_PROP_PIPE_CLOSE: { p_pipe_info = ((phHciNfc_Felica_Info_t *) psHciContext->p_felica_info)->p_pipe_info; status = phHciNfc_Close_Pipe( psHciContext, pHwRef, p_pipe_info ); if(status == NFCSTATUS_SUCCESS) { p_reader_mgmt_info->rf_gate_next_seq = NFCIP1_INITIATOR_PIPE_CLOSE; /* status = NFCSTATUS_PENDING; */ } break; } #endif /* #ifdef TYPE_FELICA */ #ifdef ENABLE_P2P /* NFC-IP1 Initiator pipe Close sequence */ case NFCIP1_INITIATOR_PIPE_CLOSE: { p_pipe_info = ((phHciNfc_NfcIP_Info_t *)psHciContext-> p_nfcip_info)->p_init_pipe_info; if(NULL == p_pipe_info ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); } else { status = phHciNfc_Open_Pipe( psHciContext, pHwRef, p_pipe_info ); if(status == NFCSTATUS_SUCCESS) { p_reader_mgmt_info->rf_gate_next_seq = READERA_PIPE_CLOSE; status = NFCSTATUS_PENDING; } } break; } #endif /* #ifdef ENABLE_P2P */ default: { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_HCI_SEQUENCE); break; } }/* End of the Sequence Switch */ }/* End of the Reader Info Memory Check */ } /* End of Null Context Check */ return status; } /*! * \brief Sends the RF Reader HCI Events to the connected reader device. * * This function Sends the RF Reader HCI Event frames in the HCP packet format to the * connected reader device. */ NFCSTATUS phHciNfc_Send_RFReader_Event ( phHciNfc_sContext_t *psHciContext, void *pHwRef, uint8_t pipe_id, uint8_t event ) { phHciNfc_HCP_Packet_t *hcp_packet = NULL; phHciNfc_HCP_Message_t *hcp_message = NULL; phHciNfc_Pipe_Info_t *p_pipe_info = NULL; uint8_t length = 0; uint8_t i = 0; NFCSTATUS status = NFCSTATUS_SUCCESS; if( (NULL == psHciContext) || ( pipe_id > PHHCINFC_MAX_PIPE) ||(NULL == psHciContext->p_pipe_list[pipe_id]) ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); HCI_DEBUG("%s: Invalid Arguments passed \n", "phHciNfc_Send_RFReader_Event"); } else { p_pipe_info = (phHciNfc_Pipe_Info_t *) psHciContext->p_pipe_list[pipe_id]; psHciContext->tx_total = 0 ; length += HCP_HEADER_LEN ; switch( event ) { case EVT_READER_REQUESTED: case EVT_END_OPERATION: { hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; /* Construct the HCP Frame */ phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT, (uint8_t) pipe_id, HCP_MSG_TYPE_EVENT, event); break; } case NXP_EVT_RELEASE_TARGET: { hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; /* Construct the HCP Frame */ phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT, (uint8_t) pipe_id, HCP_MSG_TYPE_EVENT, event); hcp_message = &(hcp_packet->msg.message); phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload, i, p_pipe_info->param_info, p_pipe_info->param_length); length =(uint16_t)(length + i + p_pipe_info->param_length); break; } default: { status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED ); HCI_DEBUG("%s: Statement Should Not Occur \n", "phHciNfc_Send_RFReader_Event"); break; } } if( NFCSTATUS_SUCCESS == status ) { p_pipe_info->sent_msg_type = HCP_MSG_TYPE_EVENT ; p_pipe_info->prev_msg = event ; psHciContext->tx_total = length; /* Send the Constructed HCP packet to the lower layer */ status = phHciNfc_Send_HCP( psHciContext, pHwRef ); p_pipe_info->prev_status = NFCSTATUS_PENDING; } } return status; } /*! * \brief Sends the RF Reader HCI Additonal Commands to the connected * reader device. * * This function Sends the RF Reader HCI Command frames in the HCP packet * format to the connected reader device. */ NFCSTATUS phHciNfc_Send_RFReader_Command ( phHciNfc_sContext_t *psHciContext, void *pHwRef, uint8_t pipe_id, uint8_t cmd ) { phHciNfc_HCP_Packet_t *hcp_packet = NULL; phHciNfc_HCP_Message_t *hcp_message = NULL; phHciNfc_Pipe_Info_t *p_pipe_info = NULL; uint8_t i = 0; uint16_t length=0; NFCSTATUS status = NFCSTATUS_SUCCESS; if( (NULL == psHciContext) || ( pipe_id > PHHCINFC_MAX_PIPE) ||(NULL == psHciContext->p_pipe_list[pipe_id]) ) { status = PHNFCSTVAL(CID_NFC_HCI, NFCSTATUS_INVALID_PARAMETER); HCI_DEBUG("%s: Invalid Arguments passed \n", "phHciNfc_Send_RFReader_Command"); } else { p_pipe_info = (phHciNfc_Pipe_Info_t *) psHciContext->p_pipe_list[pipe_id]; psHciContext->tx_total = 0 ; length += HCP_HEADER_LEN ; switch( cmd ) { case WR_XCHGDATA: { hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; /* Construct the HCP Frame */ phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT, (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd); hcp_message = &(hcp_packet->msg.message); /* Frame Wait Timeout */ hcp_message->payload[i++] = nxp_nfc_isoxchg_timeout ; phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload, i, p_pipe_info->param_info, p_pipe_info->param_length); length =(uint16_t)(length + i + p_pipe_info->param_length); break; } case NXP_WR_PRESCHECK: case NXP_WR_ACTIVATE_NEXT: { hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; /* Construct the HCP Frame */ phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT, (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd); break; } case NXP_WR_DISPATCH_TO_UICC: case NXP_WR_ACTIVATE_ID: { hcp_packet = (phHciNfc_HCP_Packet_t *) psHciContext->send_buffer; /* Construct the HCP Frame */ phHciNfc_Build_HCPFrame(hcp_packet,HCP_CHAINBIT_DEFAULT, (uint8_t) pipe_id, HCP_MSG_TYPE_COMMAND, cmd); hcp_message = &(hcp_packet->msg.message); /* UID of the Card */ phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload, i, p_pipe_info->param_info, p_pipe_info->param_length); length =(uint16_t)(length + i + p_pipe_info->param_length); break; } default: { status = PHNFCSTVAL( CID_NFC_HCI, NFCSTATUS_FEATURE_NOT_SUPPORTED ); HCI_DEBUG("%s: Statement Should Not Occur \n", "phHciNfc_Send_RFReader_Command"); break; } } if( NFCSTATUS_SUCCESS == status ) { p_pipe_info->sent_msg_type = HCP_MSG_TYPE_COMMAND; p_pipe_info->prev_msg = cmd; psHciContext->tx_total = length; psHciContext->response_pending = TRUE ; /* Send the Constructed HCP packet to the lower layer */ status = phHciNfc_Send_HCP( psHciContext, pHwRef ); p_pipe_info->prev_status = NFCSTATUS_PENDING; } } return status; }