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