diff options
author | Nick Pelly <npelly@google.com> | 2010-09-23 12:47:58 -0700 |
---|---|---|
committer | Nick Pelly <npelly@google.com> | 2010-09-23 13:53:18 -0700 |
commit | 5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a (patch) | |
tree | 190f9251c6db03d3550ec7f30b51a2561c01d9cf /src/phHciNfc_RFReader.c | |
parent | 4ff7c86a2c706b150078274455406f1b04966e1a (diff) | |
download | external_libnfc-nxp-5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a.zip external_libnfc-nxp-5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a.tar.gz external_libnfc-nxp-5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a.tar.bz2 |
Initial libnfc checkin
Source: Trusted_NFC_Device_Host_AA03.01e02_google.zip code drop (23-Sep-2010)
Change-Id: Ie47f18423f949a8d3e0815d13f55c814312add24
Signed-off-by: Nick Pelly <npelly@google.com>
Diffstat (limited to 'src/phHciNfc_RFReader.c')
-rw-r--r-- | src/phHciNfc_RFReader.c | 2376 |
1 files changed, 2376 insertions, 0 deletions
diff --git a/src/phHciNfc_RFReader.c b/src/phHciNfc_RFReader.c new file mode 100644 index 0000000..cf124f3 --- /dev/null +++ b/src/phHciNfc_RFReader.c @@ -0,0 +1,2376 @@ +/* + * 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,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 <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 + +/* +*************************** 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_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 */ + 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 ) + ) + { +#if 0 + p_pipe_info = psHciContext->p_pipe_list[reader_pipe_id]; + p_pipe_info->param_info = ; + p_pipe_info->param_length = ; + status = phHciNfc_Send_ISO15693_Command( + psHciContext, pHwRef + ,reader_pipe_id, NXP_ISO15693_CMD ); +#else + status = PHNFCSTVAL(CID_NFC_HCI, + NFCSTATUS_FEATURE_NOT_SUPPORTED); + +#endif + + } + 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 =(uint8_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; + uint8_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_ISO_XCHG_TIMEOUT ; + phHciNfc_Append_HCPFrame((uint8_t *)hcp_message->payload, + i, p_pipe_info->param_info, + p_pipe_info->param_length); + length =(uint8_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 =(uint8_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; +} + + + |